/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ 'use strict'; var obsidian = require('obsidian'); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; /* Privacy Glasses plugin for Obsidian Copyright 2021 Jill Alberts Licensed under the MIT License (http://opensource.org/licenses/MIT) */ function isMarkdownFileInfoView(x) { const anyX = x; return !!Object.getOwnPropertyDescriptor(anyX, "file"); } function isHooked(view) { const anyView = view; const ownProps = Object.getOwnPropertyNames(anyView); return (ownProps.contains("setState") && typeof anyView.setState === "function"); } function hookViewStateChanged(view, onBeforeStateChange, onAfterStateChange) { const anyView = view; const original = anyView.__proto__.setState; function wrapper() { onBeforeStateChange(view); const r = original.apply(this, arguments); if (typeof r.then === "function") { r.then(() => { onAfterStateChange(view); }); } else { onAfterStateChange(view); } return r; } anyView.setState = wrapper.bind(view); return anyView; } /** * Constants */ var Level; (function (Level) { Level["HideAll"] = "hide-all"; Level["HidePrivate"] = "hide-private"; Level["RevealAll"] = "reveal-all"; Level["RevealHeadlines"] = "reveal-headlines"; })(Level || (Level = {})); var CssClass; (function (CssClass) { CssClass["BlurAll"] = "privacy-glasses-blur-all"; CssClass["RevealOnHover"] = "privacy-glasses-reveal-on-hover"; CssClass["RevealAll"] = "privacy-glasses-reveal-all"; CssClass["RevealUnderCaret"] = "privacy-glasses-reveal-under-caret"; CssClass["RevealHeadlines"] = "privacy-glasses-reveal-headlines"; CssClass["Reveal"] = "privacy-glasses-reveal"; CssClass["IsMdView"] = "is-md-view"; CssClass["IsNonMdView"] = "is-non-md-view"; CssClass["IsMdViewHeadlinesOnly"] = "is-md-view-headlines-only"; CssClass["PrivacyGlassesReveal"] = "privacy-glasses-reveal"; })(CssClass || (CssClass = {})); /** * Main */ class PrivacyGlassesPlugin extends obsidian.Plugin { constructor() { super(...arguments); this.revealed = []; } onload() { return __awaiter(this, void 0, void 0, function* () { this.statusBar = this.addStatusBarItem(); yield this.loadSettings(); this.addSettingTab(new privacyGlassesSettingTab(this.app, this)); obsidian.addIcon("eye", eyeIcon); obsidian.addIcon("eye-closed", eyeClosedIcon); obsidian.addIcon("eye-slash", eyeSlashIcon); obsidian.addIcon("eye-glasses", eyeGlasses); this.addRibbonIcon("eye-closed", "Hide all", () => { this.currentLevel = Level.HideAll; this.updateLeavesAndGlobalReveals(); }); this.addRibbonIcon("eye-slash", "Reveal non-private", () => { this.currentLevel = Level.HidePrivate; this.updateLeavesAndGlobalReveals(); }); this.addRibbonIcon("eye-glasses", "Reveal headlines only", () => { this.currentLevel = Level.RevealHeadlines; this.updateLeavesAndGlobalReveals(); }); this.addRibbonIcon("eye", "Reveal all", () => { this.currentLevel = Level.RevealAll; this.updateLeavesAndGlobalReveals(); }); this.addCommand({ id: "privacy-glasses-hide-all", name: "Privacy Glasses - hide all", callback: () => { this.currentLevel = Level.HideAll; this.updateLeavesAndGlobalReveals(); }, }); this.addCommand({ id: "privacy-glasses-hide-private", name: "Privacy Glasses - hide files in folders marked as private", callback: () => { this.currentLevel = Level.HidePrivate; this.updateLeavesAndGlobalReveals(); }, }); this.addCommand({ id: "privacy-glasses-reveal-headlines", name: "Privacy Glasses - reveal headlines only, keeping body content hidden", callback: () => { this.currentLevel = Level.RevealHeadlines; this.updateLeavesAndGlobalReveals(); }, }); this.addCommand({ id: "privacy-glasses-reveal-all", name: "Privacy Glasses - do not hide anything", callback: () => { this.currentLevel = Level.RevealAll; this.updateLeavesAndGlobalReveals(); }, }); this.registerInterval(window.setInterval(() => { this.checkIdleTimeout(); }, 1000)); this.app.workspace.onLayoutReady(() => { this.registerDomActivityEvents(this.app.workspace.rootSplit.win); this.currentLevel = this.settings.blurOnStartup; this.updateLeavesAndGlobalReveals(); this.updatePrivateDirsEl(this.app.workspace.rootSplit.win.document); this.ensureLeavesHooked(); }); this.registerEvent(this.app.workspace.on("window-open", (win) => { this.registerDomActivityEvents(win.win); })); this.registerEvent(this.app.workspace.on("active-leaf-change", (e) => { this.ensureLeavesHooked(); this.updateLeafViewStyle(e.view); })); this.lastEventTime = performance.now(); }); } // we hook into setState function of the view, because it is synchronously called // before the content switch. this is to prevent private content from being accidentally briefly revealed onBeforeViewStateChange(l) { this.revealed.forEach((r) => { r.removeClass(CssClass.Reveal); }); } onAfterViewStateChange(l) { // some panels update using the same event, so it is important to update leaves after they are ready setTimeout(() => { this.updateLeavesStyle(); }, 200); this.ensureLeavesHooked(); } ensureLeavesHooked() { this.app.workspace.iterateAllLeaves((e) => { if (isHooked(e.view)) { return; } hookViewStateChanged(e.view, () => { this.onBeforeViewStateChange(e); }, () => { this.onAfterViewStateChange(e); }); }); } registerDomActivityEvents(win) { this.registerDomEvent(win, "mousedown", (e) => { this.lastEventTime = e.timeStamp; }); this.registerDomEvent(win, "keydown", (e) => { this.lastEventTime = e.timeStamp; }); this.addBlurLevelEl(win.document); } checkIdleTimeout() { if (this.settings.blurOnIdleTimeoutSeconds < 0) { return; } if (this.currentLevel === Level.HideAll) { return; } if (!this.lastEventTime) { return; } const now = performance.now(); if ((now - this.lastEventTime) / 1000 >= this.settings.blurOnIdleTimeoutSeconds) { this.currentLevel = Level.HideAll; this.updateLeavesAndGlobalReveals(); } } onunload() { return __awaiter(this, void 0, void 0, function* () { this.statusBar.remove(); yield this.saveSettings(); }); } loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign(DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __awaiter(this, void 0, void 0, function* () { yield this.saveData(this.settings); }); } shouldRevealLeaf(view) { var _a; if (this.currentLevel === Level.RevealAll) { return true; } if (this.currentLevel === Level.HideAll || this.currentLevel === Level.RevealHeadlines) { return false; } if (!isMarkdownFileInfoView(view)) { return true; } if (view.editor && this.settings.privateNoteMarker && this.settings.privateNoteMarker !== "") { let tags = []; // Get tags in the note body, if any if ('tags' in this.app.metadataCache.getFileCache(view.file)) { tags.push(...this.app.metadataCache.getFileCache(view.file).tags.filter(x => !!x.tag).map(x => x.tag)); } // Get tags in properties, if any if ('tags' in ((_a = this.app.metadataCache.getFileCache(view.file)) === null || _a === void 0 ? void 0 : _a.frontmatter)) { tags.push(...this.app.metadataCache.getFileCache(view.file).frontmatter.tags.filter((x) => !!x)); } if (tags && tags.length > 0) { return !tags.includes(this.settings.privateNoteMarker); } } if (view.file && !this.settings.privateDirs.contains(view.file.parent.path)) { return true; } return false; } updateLeafViewStyle(view) { const isMd = isMarkdownFileInfoView(view) && view.editor; view.containerEl.removeClass(CssClass.IsMdView, CssClass.IsNonMdView, CssClass.IsMdViewHeadlinesOnly); if (isMd && this.currentLevel === Level.RevealHeadlines) { view.containerEl.addClass(CssClass.IsMdViewHeadlinesOnly); } else if (isMd) { view.containerEl.addClass(CssClass.IsMdView); } else { view.containerEl.addClass(CssClass.IsNonMdView); } const shouldReveal = this.shouldRevealLeaf(view); if (shouldReveal) { view.containerEl.addClass(CssClass.PrivacyGlassesReveal); this.revealed.push(view.containerEl); } else { view.containerEl.removeClass(CssClass.PrivacyGlassesReveal); } } updateLeavesAndGlobalReveals() { this.updateLeavesStyle(); this.updateGlobalRevealStyle(); } updateLeavesStyle() { this.app.workspace.iterateAllLeaves((e) => { this.updateLeafViewStyle(e.view); }); } updateGlobalRevealStyle() { this.removeAllClasses(); this.setClassToDocumentBody(this.currentLevel); if (this.settings.hoverToReveal) { document.body.classList.add(CssClass.RevealOnHover); } if (this.settings.revealUnderCaret) { document.body.classList.add(CssClass.RevealUnderCaret); } } removeAllClasses() { document.body.removeClass(CssClass.BlurAll, CssClass.RevealOnHover, CssClass.RevealAll, CssClass.RevealUnderCaret, CssClass.RevealHeadlines); } setClassToDocumentBody(currentLevel) { switch (currentLevel) { case Level.HideAll: document.body.classList.add(CssClass.BlurAll); break; case Level.RevealAll: document.body.classList.add(CssClass.RevealAll); break; case Level.RevealHeadlines: document.body.classList.add(CssClass.RevealHeadlines); break; } } addBlurLevelEl(doc) { this.blurLevelStyleEl = doc.createElement("style"); this.blurLevelStyleEl.id = "privacyGlassesBlurLevel"; doc.head.appendChild(this.blurLevelStyleEl); this.updateBlurLevelEl(); } updateBlurLevelEl() { if (!this.blurLevelStyleEl) { return; } this.blurLevelStyleEl.textContent = `body {--blurLevel:${this.settings.blurLevel}em};`; } updatePrivateDirsEl(doc) { if (doc && !this.privateDirsStyleEl) { this.privateDirsStyleEl = doc.createElement("style"); this.privateDirsStyleEl.id = "privacyGlassesDirBlur"; doc.head.appendChild(this.privateDirsStyleEl); } const dirs = this.settings.privateDirs.split(","); this.privateDirsStyleEl.textContent = dirs .map((d) => ` :is(.nav-folder-title, .nav-file-title)[data-path^=${d}] {filter: blur(calc(var(--blurLevel) * 1))} :is(.nav-folder-title, .nav-file-title)[data-path^=${d}]:hover {filter: unset} .privacy-glasses-reveal-all :is(.nav-folder-title, .nav-file-title)[data-path^=${d}] {filter: unset} `) .join(""); } } const DEFAULT_SETTINGS = { blurOnStartup: Level.HidePrivate, blurLevel: 0.3, blurOnIdleTimeoutSeconds: -1, hoverToReveal: true, revealUnderCaret: false, privateDirs: "", privateNoteMarker: "#private", }; class privacyGlassesSettingTab extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { let { containerEl } = this; containerEl.empty(); containerEl.createEl("h3", { text: "Privacy Glasses v" + this.plugin.manifest.version, }); containerEl.createEl("a", { text: "https://github.com/jillalberts/privacy-glasses", href: "https://github.com/jillalberts/privacy-glasses", }); containerEl.createEl("span", { text: ": documentation, report issues, contact info", }); containerEl.createEl("p", { text: 'To activate/deactivate Privacy Glasses, click the glasses icon on the left-hand ribbon or run "Privacy Glasses" commands in the Command Palette (Ctrl-P). The command can also be bound to a keyboard shortcut if you wish.', }); new obsidian.Setting(containerEl) .setName("Activate Privacy Glasses on startup") .setDesc("Indicates whether the plugin is automatically activated when starting Obsidian.") .addDropdown((toggle) => { toggle.addOptions({ "hide-all": "Hide all", "hide-private": "Hide private (default)", "reveal-all": "Reveal all", "reveal-headlines": "Reveal headlines only" }); toggle.setValue(this.plugin.settings.blurOnStartup); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.blurOnStartup = value; yield this.plugin.saveSettings(); })); }); new obsidian.Setting(containerEl) .setName("Hide all after user inactivity (seconds)") .setDesc("Inactivity time after which Privacy Glasses will hide all. -1 to disable auto-hiding.") .addText((textfield) => { textfield.setPlaceholder("-1"); textfield.inputEl.type = "number"; textfield.inputEl.min = "-1"; textfield.setValue(String(this.plugin.settings.blurOnIdleTimeoutSeconds)); textfield.onChange((value) => __awaiter(this, void 0, void 0, function* () { let parsed = parseFloat(value); if (isNaN(parsed)) { parsed = -1; } this.plugin.settings.blurOnIdleTimeoutSeconds = parsed; yield this.plugin.saveSettings(); })); }); new obsidian.Setting(containerEl) .setName("Hover to reveal") .setDesc("Indicates whether or not to reveal content when hovering the cursor over it.") .addToggle((toggle) => { toggle.setValue(this.plugin.settings.hoverToReveal); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.hoverToReveal = value; this.plugin.updateLeavesAndGlobalReveals(); yield this.plugin.saveSettings(); })); }); new obsidian.Setting(containerEl) .setName("Reveal under caret") .setDesc("Indicates whether or not to reveal content when caret is on it.") .addToggle((toggle) => { toggle.setValue(this.plugin.settings.revealUnderCaret); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.revealUnderCaret = value; this.plugin.updateGlobalRevealStyle(); yield this.plugin.saveSettings(); })); }); var sliderEl = new obsidian.Setting(containerEl); let sliderElDesc = "Higher is blurrier. Default=60, current="; sliderEl .setName("Blur level") .setDesc(sliderElDesc + Math.round(this.plugin.settings.blurLevel * 100)) // ^ need rounding to not show values like '55.00000000000001' .addSlider((slider) => slider .setLimits(0.1, 1.5, 0.05) .setValue(this.plugin.settings.blurLevel) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.blurLevel = value; sliderEl.setDesc(sliderElDesc + Math.round(this.plugin.settings.blurLevel * 100)); this.plugin.updateBlurLevelEl(); this.plugin.saveSettings(); }))); new obsidian.Setting(containerEl) .setName("Private directories") .setDesc("Comma-separated list of directories, in which files are considered private") .addText((text) => text .setPlaceholder("finance,therapy") .setValue(this.plugin.settings.privateDirs) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.privateDirs = value; yield this.plugin.saveSettings(); this.plugin.updateLeavesAndGlobalReveals(); this.plugin.updatePrivateDirsEl(); }))); new obsidian.Setting(containerEl) .setName("Private note marker") .setDesc("Start a note with this text to mark note as private") .addText((text) => text .setPlaceholder("#private") .setValue(this.plugin.settings.privateNoteMarker) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.privateNoteMarker = value; yield this.plugin.saveSettings(); this.plugin.updateLeavesStyle(); }))); } } // https://icon-sets.iconify.design/ph/eye-slash/ const eyeSlashIcon = ``; // https://icon-sets.iconify.design/ph/eye-closed-bold/ const eyeClosedIcon = ``; // https://icon-sets.iconify.design/ph/eye/ const eyeIcon = ``; // https://icon-sets.iconify.design/ph/eyeglasses/ const eyeGlasses = ``; module.exports = PrivacyGlassesPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZTtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxufTtcclxuIiwiLyogXHRcclxuICBQcml2YWN5IEdsYXNzZXMgcGx1Z2luIGZvciBPYnNpZGlhblxyXG4gIENvcHlyaWdodCAyMDIxIEppbGwgQWxiZXJ0c1xyXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkgXHJcbiovXHJcblxyXG5pbXBvcnQge1xyXG4gIGFkZEljb24sXHJcbiAgQXBwLFxyXG4gIE1hcmtkb3duRmlsZUluZm8sXHJcbiAgTm90aWNlLFxyXG4gIFBsdWdpbixcclxuICBQbHVnaW5TZXR0aW5nVGFiLFxyXG4gIFNldHRpbmcsXHJcbiAgVmlldyxcclxuICBXb3Jrc3BhY2VMZWFmLFxyXG59IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuZnVuY3Rpb24gaXNNYXJrZG93bkZpbGVJbmZvVmlldyh4OiB1bmtub3duKTogeCBpcyBNYXJrZG93bkZpbGVJbmZvIHtcclxuICBjb25zdCBhbnlYID0geCBhcyBhbnk7XHJcbiAgcmV0dXJuICEhT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhbnlYLCBcImZpbGVcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSG9va2VkKHZpZXc6IFZpZXcpIHtcclxuICBjb25zdCBhbnlWaWV3ID0gdmlldyBhcyBhbnk7XHJcbiAgY29uc3Qgb3duUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbnlWaWV3KTtcclxuICByZXR1cm4gKFxyXG4gICAgb3duUHJvcHMuY29udGFpbnMoXCJzZXRTdGF0ZVwiKSAmJiB0eXBlb2YgYW55Vmlldy5zZXRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaG9va1ZpZXdTdGF0ZUNoYW5nZWQoXHJcbiAgdmlldzogVmlldyxcclxuICBvbkJlZm9yZVN0YXRlQ2hhbmdlOiAodmlldzogVmlldykgPT4gdm9pZCxcclxuICBvbkFmdGVyU3RhdGVDaGFuZ2U6ICh2aWV3OiBWaWV3KSA9PiB2b2lkXHJcbikge1xyXG4gIGNvbnN0IGFueVZpZXcgPSB2aWV3IGFzIGFueTtcclxuXHJcbiAgY29uc3Qgb3JpZ2luYWwgPSBhbnlWaWV3Ll9fcHJvdG9fXy5zZXRTdGF0ZTtcclxuXHJcbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcclxuICAgIG9uQmVmb3JlU3RhdGVDaGFuZ2Uodmlldyk7XHJcbiAgICBjb25zdCByID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIGlmICh0eXBlb2Ygci50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgci50aGVuKCgpID0+IHtcclxuICAgICAgICBvbkFmdGVyU3RhdGVDaGFuZ2Uodmlldyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb25BZnRlclN0YXRlQ2hhbmdlKHZpZXcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBhbnlWaWV3LnNldFN0YXRlID0gd3JhcHBlci5iaW5kKHZpZXcpO1xyXG5cclxuICByZXR1cm4gYW55VmlldztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0YW50c1xyXG4gKi9cclxuXHJcbmVudW0gTGV2ZWwge1xyXG4gIEhpZGVBbGwgPSBcImhpZGUtYWxsXCIsXHJcbiAgSGlkZVByaXZhdGUgPSBcImhpZGUtcHJpdmF0ZVwiLFxyXG4gIFJldmVhbEFsbCA9IFwicmV2ZWFsLWFsbFwiLFxyXG4gIFJldmVhbEhlYWRsaW5lcyA9IFwicmV2ZWFsLWhlYWRsaW5lc1wiXHJcbn1cclxuXHJcbmVudW0gQ3NzQ2xhc3Mge1xyXG4gIEJsdXJBbGwgPSBcInByaXZhY3ktZ2xhc3Nlcy1ibHVyLWFsbFwiLFxyXG4gIFJldmVhbE9uSG92ZXIgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtb24taG92ZXJcIixcclxuICBSZXZlYWxBbGwgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtYWxsXCIsXHJcbiAgUmV2ZWFsVW5kZXJDYXJldCA9IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC11bmRlci1jYXJldFwiLFxyXG4gIFJldmVhbEhlYWRsaW5lcyA9IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1oZWFkbGluZXNcIixcclxuICBSZXZlYWwgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWxcIixcclxuICBJc01kVmlldyA9IFwiaXMtbWQtdmlld1wiLFxyXG4gIElzTm9uTWRWaWV3ID0gXCJpcy1ub24tbWQtdmlld1wiLFxyXG4gIElzTWRWaWV3SGVhZGxpbmVzT25seSA9IFwiaXMtbWQtdmlldy1oZWFkbGluZXMtb25seVwiLFxyXG4gIFByaXZhY3lHbGFzc2VzUmV2ZWFsID0gXCJwcml2YWN5LWdsYXNzZXMtcmV2ZWFsXCJcclxufVxyXG5cclxuLyoqXHJcbiAqIE1haW5cclxuICovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcml2YWN5R2xhc3Nlc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3M6IFByaXZhY3lHbGFzc2VzU2V0dGluZ3M7XHJcbiAgc3RhdHVzQmFyOiBIVE1MRWxlbWVudDtcclxuICBub3RpY2VNc2c6IE5vdGljZTtcclxuICBibHVyTGV2ZWxTdHlsZUVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlRGlyc1N0eWxlRWw6IEhUTUxFbGVtZW50O1xyXG4gIGxhc3RFdmVudFRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBjdXJyZW50TGV2ZWw6IExldmVsO1xyXG4gIHJldmVhbGVkOiBIVE1MRWxlbWVudFtdID0gW107XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzQmFyID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IHByaXZhY3lHbGFzc2VzU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuICAgIGFkZEljb24oXCJleWVcIiwgZXllSWNvbik7XHJcbiAgICBhZGRJY29uKFwiZXllLWNsb3NlZFwiLCBleWVDbG9zZWRJY29uKTtcclxuICAgIGFkZEljb24oXCJleWUtc2xhc2hcIiwgZXllU2xhc2hJY29uKTtcclxuICAgIGFkZEljb24oXCJleWUtZ2xhc3Nlc1wiLCBleWVHbGFzc2VzKTtcclxuXHJcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oXCJleWUtY2xvc2VkXCIsIFwiSGlkZSBhbGxcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVBbGw7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oXCJleWUtc2xhc2hcIiwgXCJSZXZlYWwgbm9uLXByaXZhdGVcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVQcml2YXRlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFwiZXllLWdsYXNzZXNcIiwgXCJSZXZlYWwgaGVhZGxpbmVzIG9ubHlcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLlJldmVhbEhlYWRsaW5lcztcclxuICAgICAgdGhpcy51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImV5ZVwiLCBcIlJldmVhbCBhbGxcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLlJldmVhbEFsbDtcclxuICAgICAgdGhpcy51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJwcml2YWN5LWdsYXNzZXMtaGlkZS1hbGxcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBoaWRlIGFsbFwiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuSGlkZUFsbDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcInByaXZhY3ktZ2xhc3Nlcy1oaWRlLXByaXZhdGVcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBoaWRlIGZpbGVzIGluIGZvbGRlcnMgbWFya2VkIGFzIHByaXZhdGVcIixcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVQcml2YXRlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1oZWFkbGluZXNcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSByZXZlYWwgaGVhZGxpbmVzIG9ubHksIGtlZXBpbmcgYm9keSBjb250ZW50IGhpZGRlblwiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuUmV2ZWFsSGVhZGxpbmVzO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1hbGxcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBkbyBub3QgaGlkZSBhbnl0aGluZ1wiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuUmV2ZWFsQWxsO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckludGVydmFsKFxyXG4gICAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZGxlVGltZW91dCgpO1xyXG4gICAgICB9LCAxMDAwKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh0aGlzLmFwcC53b3Jrc3BhY2Uucm9vdFNwbGl0Lndpbik7XHJcbiAgICAgIHRoaXMuY3VycmVudExldmVsID0gdGhpcy5zZXR0aW5ncy5ibHVyT25TdGFydHVwO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgdGhpcy51cGRhdGVQcml2YXRlRGlyc0VsKHRoaXMuYXBwLndvcmtzcGFjZS5yb290U3BsaXQud2luLmRvY3VtZW50KTtcclxuICAgICAgdGhpcy5lbnN1cmVMZWF2ZXNIb29rZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcclxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKFwid2luZG93LW9wZW5cIiwgKHdpbikgPT4ge1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh3aW4ud2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxyXG4gICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJhY3RpdmUtbGVhZi1jaGFuZ2VcIiwgKGUpID0+IHtcclxuICAgICAgICB0aGlzLmVuc3VyZUxlYXZlc0hvb2tlZCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhZlZpZXdTdHlsZShlLnZpZXcpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmxhc3RFdmVudFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICB9XHJcblxyXG4gIC8vIHdlIGhvb2sgaW50byBzZXRTdGF0ZSBmdW5jdGlvbiBvZiB0aGUgdmlldywgYmVjYXVzZSBpdCBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZFxyXG4gIC8vIGJlZm9yZSB0aGUgY29udGVudCBzd2l0Y2guIHRoaXMgaXMgdG8gcHJldmVudCBwcml2YXRlIGNvbnRlbnQgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgYnJpZWZseSByZXZlYWxlZFxyXG4gIG9uQmVmb3JlVmlld1N0YXRlQ2hhbmdlKGw6IFdvcmtzcGFjZUxlYWYpIHtcclxuICAgIHRoaXMucmV2ZWFsZWQuZm9yRWFjaCgocikgPT4ge1xyXG4gICAgICByLnJlbW92ZUNsYXNzKENzc0NsYXNzLlJldmVhbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWZ0ZXJWaWV3U3RhdGVDaGFuZ2UobDogV29ya3NwYWNlTGVhZikge1xyXG4gICAgLy8gc29tZSBwYW5lbHMgdXBkYXRlIHVzaW5nIHRoZSBzYW1lIGV2ZW50LCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gdXBkYXRlIGxlYXZlcyBhZnRlciB0aGV5IGFyZSByZWFkeVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhdmVzU3R5bGUoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgICB0aGlzLmVuc3VyZUxlYXZlc0hvb2tlZCgpO1xyXG4gIH1cclxuXHJcbiAgZW5zdXJlTGVhdmVzSG9va2VkKCkge1xyXG4gICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGUpID0+IHtcclxuICAgICAgaWYgKGlzSG9va2VkKGUudmlldykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGhvb2tWaWV3U3RhdGVDaGFuZ2VkKFxyXG4gICAgICAgIGUudmlldyxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlVmlld1N0YXRlQ2hhbmdlKGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vbkFmdGVyVmlld1N0YXRlQ2hhbmdlKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh3aW46IFdpbmRvdykge1xyXG4gICAgdGhpcy5yZWdpc3RlckRvbUV2ZW50KHdpbiwgXCJtb3VzZWRvd25cIiwgKGUpID0+IHtcclxuICAgICAgdGhpcy5sYXN0RXZlbnRUaW1lID0gZS50aW1lU3RhbXA7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVnaXN0ZXJEb21FdmVudCh3aW4sIFwia2V5ZG93blwiLCAoZSkgPT4ge1xyXG4gICAgICB0aGlzLmxhc3RFdmVudFRpbWUgPSBlLnRpbWVTdGFtcDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRCbHVyTGV2ZWxFbCh3aW4uZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZGxlVGltZW91dCgpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJsdXJPbklkbGVUaW1lb3V0U2Vjb25kcyA8IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA9PT0gTGV2ZWwuSGlkZUFsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmxhc3RFdmVudFRpbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKG5vdyAtIHRoaXMubGFzdEV2ZW50VGltZSkgLyAxMDAwID49XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBMZXZlbC5IaWRlQWxsO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9udW5sb2FkKCkge1xyXG4gICAgdGhpcy5zdGF0dXNCYXIucmVtb3ZlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZXZlYWxMZWFmKHZpZXc6IFZpZXcpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA9PT0gTGV2ZWwuUmV2ZWFsQWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLkhpZGVBbGwgfHxcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLlJldmVhbEhlYWRsaW5lc1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzTWFya2Rvd25GaWxlSW5mb1ZpZXcodmlldykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB2aWV3LmVkaXRvciAmJlxyXG4gICAgICB0aGlzLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyICYmXHJcbiAgICAgIHRoaXMuc2V0dGluZ3MucHJpdmF0ZU5vdGVNYXJrZXIgIT09IFwiXCJcclxuICAgICkge1xyXG4gICAgICBsZXQgdGFnczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgLy8gR2V0IHRhZ3MgaW4gdGhlIG5vdGUgYm9keSwgaWYgYW55XHJcbiAgICAgIGlmICgndGFncycgaW4gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUodmlldy5maWxlKSkge1xyXG4gICAgICAgIHRhZ3MucHVzaCguLi50aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpLnRhZ3MuZmlsdGVyKHggPT4gISF4LnRhZykubWFwKHggPT4geC50YWcpKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBHZXQgdGFncyBpbiBwcm9wZXJ0aWVzLCBpZiBhbnlcclxuICAgICAgaWYgKCd0YWdzJyBpbiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpPy5mcm9udG1hdHRlcikge1xyXG4gICAgICAgIHRhZ3MucHVzaCguLi50aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpLmZyb250bWF0dGVyLnRhZ3MuZmlsdGVyKCh4OiBzdHJpbmcpID0+ICEheCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YWdzICYmIHRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiAhdGFncy5pbmNsdWRlcyh0aGlzLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdmlldy5maWxlICYmXHJcbiAgICAgICF0aGlzLnNldHRpbmdzLnByaXZhdGVEaXJzLmNvbnRhaW5zKHZpZXcuZmlsZS5wYXJlbnQucGF0aClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMZWFmVmlld1N0eWxlKHZpZXc6IFZpZXcpIHtcclxuICAgIGNvbnN0IGlzTWQgPSBpc01hcmtkb3duRmlsZUluZm9WaWV3KHZpZXcpICYmIHZpZXcuZWRpdG9yO1xyXG4gICAgdmlldy5jb250YWluZXJFbC5yZW1vdmVDbGFzcyhcclxuICAgICAgQ3NzQ2xhc3MuSXNNZFZpZXcsXHJcbiAgICAgIENzc0NsYXNzLklzTm9uTWRWaWV3LFxyXG4gICAgICBDc3NDbGFzcy5Jc01kVmlld0hlYWRsaW5lc09ubHkpO1xyXG4gICAgaWYgKGlzTWQgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLlJldmVhbEhlYWRsaW5lcykge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLklzTWRWaWV3SGVhZGxpbmVzT25seSk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTWQpIHtcclxuICAgICAgdmlldy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5Jc01kVmlldyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLklzTm9uTWRWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaG91bGRSZXZlYWwgPSB0aGlzLnNob3VsZFJldmVhbExlYWYodmlldyk7XHJcbiAgICBpZiAoc2hvdWxkUmV2ZWFsKSB7XHJcbiAgICAgIHZpZXcuY29udGFpbmVyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuUHJpdmFjeUdsYXNzZXNSZXZlYWwpO1xyXG4gICAgICB0aGlzLnJldmVhbGVkLnB1c2godmlldy5jb250YWluZXJFbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLlByaXZhY3lHbGFzc2VzUmV2ZWFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUxlYXZlc1N0eWxlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUdsb2JhbFJldmVhbFN0eWxlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMZWF2ZXNTdHlsZSgpIHtcclxuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChlKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhZlZpZXdTdHlsZShlLnZpZXcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHbG9iYWxSZXZlYWxTdHlsZSgpIHtcclxuICAgIHRoaXMucmVtb3ZlQWxsQ2xhc3NlcygpO1xyXG4gICAgdGhpcy5zZXRDbGFzc1RvRG9jdW1lbnRCb2R5KHRoaXMuY3VycmVudExldmVsKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5ob3ZlclRvUmV2ZWFsKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDc3NDbGFzcy5SZXZlYWxPbkhvdmVyKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnJldmVhbFVuZGVyQ2FyZXQpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLlJldmVhbFVuZGVyQ2FyZXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQWxsQ2xhc3NlcygpIHtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoXHJcbiAgICAgIENzc0NsYXNzLkJsdXJBbGwsXHJcbiAgICAgIENzc0NsYXNzLlJldmVhbE9uSG92ZXIsXHJcbiAgICAgIENzc0NsYXNzLlJldmVhbEFsbCxcclxuICAgICAgQ3NzQ2xhc3MuUmV2ZWFsVW5kZXJDYXJldCxcclxuICAgICAgQ3NzQ2xhc3MuUmV2ZWFsSGVhZGxpbmVzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2xhc3NUb0RvY3VtZW50Qm9keShjdXJyZW50TGV2ZWw6IExldmVsKSB7XHJcbiAgICBzd2l0Y2ggKGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICBjYXNlIExldmVsLkhpZGVBbGw6XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLkJsdXJBbGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExldmVsLlJldmVhbEFsbDpcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoQ3NzQ2xhc3MuUmV2ZWFsQWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMZXZlbC5SZXZlYWxIZWFkbGluZXM6XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLlJldmVhbEhlYWRsaW5lcyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRCbHVyTGV2ZWxFbChkb2M6IERvY3VtZW50KSB7XHJcbiAgICB0aGlzLmJsdXJMZXZlbFN0eWxlRWwgPSBkb2MuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgdGhpcy5ibHVyTGV2ZWxTdHlsZUVsLmlkID0gXCJwcml2YWN5R2xhc3Nlc0JsdXJMZXZlbFwiO1xyXG4gICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5ibHVyTGV2ZWxTdHlsZUVsKTtcclxuICAgIHRoaXMudXBkYXRlQmx1ckxldmVsRWwoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJsdXJMZXZlbEVsKCkge1xyXG4gICAgaWYgKCF0aGlzLmJsdXJMZXZlbFN0eWxlRWwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ibHVyTGV2ZWxTdHlsZUVsLnRleHRDb250ZW50ID0gYGJvZHkgey0tYmx1ckxldmVsOiR7dGhpcy5zZXR0aW5ncy5ibHVyTGV2ZWx9ZW19O2A7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcml2YXRlRGlyc0VsKGRvYz86IERvY3VtZW50KSB7XHJcbiAgICBpZiAoZG9jICYmICF0aGlzLnByaXZhdGVEaXJzU3R5bGVFbCkge1xyXG4gICAgICB0aGlzLnByaXZhdGVEaXJzU3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgICAgIHRoaXMucHJpdmF0ZURpcnNTdHlsZUVsLmlkID0gXCJwcml2YWN5R2xhc3Nlc0RpckJsdXJcIjtcclxuICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5wcml2YXRlRGlyc1N0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlycyA9IHRoaXMuc2V0dGluZ3MucHJpdmF0ZURpcnMuc3BsaXQoXCIsXCIpO1xyXG4gICAgdGhpcy5wcml2YXRlRGlyc1N0eWxlRWwudGV4dENvbnRlbnQgPSBkaXJzXHJcbiAgICAgIC5tYXAoXHJcbiAgICAgICAgKGQpID0+XHJcbiAgICAgICAgICBgXHJcblxyXG4gICAgICAgICAgOmlzKC5uYXYtZm9sZGVyLXRpdGxlLCAubmF2LWZpbGUtdGl0bGUpW2RhdGEtcGF0aF49JHtkfV0ge2ZpbHRlcjogYmx1cihjYWxjKHZhcigtLWJsdXJMZXZlbCkgKiAxKSl9XHJcblxyXG4gICAgICAgICAgOmlzKC5uYXYtZm9sZGVyLXRpdGxlLCAubmF2LWZpbGUtdGl0bGUpW2RhdGEtcGF0aF49JHtkfV06aG92ZXIge2ZpbHRlcjogdW5zZXR9XHJcblxyXG4gICAgICAgICAgLnByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtYWxsIDppcygubmF2LWZvbGRlci10aXRsZSwgLm5hdi1maWxlLXRpdGxlKVtkYXRhLXBhdGhePSR7ZH1dIHtmaWx0ZXI6IHVuc2V0fVxyXG5cclxuXHJcbiAgICAgICAgICBgXHJcbiAgICAgIClcclxuICAgICAgLmpvaW4oXCJcIik7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJpdmFjeUdsYXNzZXNTZXR0aW5ncyB7XHJcbiAgYmx1ck9uU3RhcnR1cDogTGV2ZWw7XHJcbiAgYmx1ckxldmVsOiBudW1iZXI7XHJcbiAgYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzOiBudW1iZXI7XHJcbiAgaG92ZXJUb1JldmVhbDogYm9vbGVhbjtcclxuICByZXZlYWxVbmRlckNhcmV0OiBib29sZWFuO1xyXG4gIHByaXZhdGVEaXJzOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZU5vdGVNYXJrZXI6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUHJpdmFjeUdsYXNzZXNTZXR0aW5ncyA9IHtcclxuICBibHVyT25TdGFydHVwOiBMZXZlbC5IaWRlUHJpdmF0ZSxcclxuICBibHVyTGV2ZWw6IDAuMyxcclxuICBibHVyT25JZGxlVGltZW91dFNlY29uZHM6IC0xLFxyXG4gIGhvdmVyVG9SZXZlYWw6IHRydWUsXHJcbiAgcmV2ZWFsVW5kZXJDYXJldDogZmFsc2UsXHJcbiAgcHJpdmF0ZURpcnM6IFwiXCIsXHJcbiAgcHJpdmF0ZU5vdGVNYXJrZXI6IFwiI3ByaXZhdGVcIixcclxufTtcclxuXHJcbmNsYXNzIHByaXZhY3lHbGFzc2VzU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG4gIHBsdWdpbjogUHJpdmFjeUdsYXNzZXNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogUHJpdmFjeUdsYXNzZXNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cclxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHtcclxuICAgICAgdGV4dDogXCJQcml2YWN5IEdsYXNzZXMgdlwiICsgdGhpcy5wbHVnaW4ubWFuaWZlc3QudmVyc2lvbixcclxuICAgIH0pO1xyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJhXCIsIHtcclxuICAgICAgdGV4dDogXCJodHRwczovL2dpdGh1Yi5jb20vamlsbGFsYmVydHMvcHJpdmFjeS1nbGFzc2VzXCIsXHJcbiAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2ppbGxhbGJlcnRzL3ByaXZhY3ktZ2xhc3Nlc1wiLFxyXG4gICAgfSk7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcInNwYW5cIiwge1xyXG4gICAgICB0ZXh0OiBcIjogZG9jdW1lbnRhdGlvbiwgcmVwb3J0IGlzc3VlcywgY29udGFjdCBpbmZvXCIsXHJcbiAgICB9KTtcclxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7XHJcbiAgICAgIHRleHQ6ICdUbyBhY3RpdmF0ZS9kZWFjdGl2YXRlIFByaXZhY3kgR2xhc3NlcywgY2xpY2sgdGhlIGdsYXNzZXMgaWNvbiBvbiB0aGUgbGVmdC1oYW5kIHJpYmJvbiBvciBydW4gXCJQcml2YWN5IEdsYXNzZXNcIiBjb21tYW5kcyBpbiB0aGUgQ29tbWFuZCBQYWxldHRlIChDdHJsLVApLiBUaGUgY29tbWFuZCBjYW4gYWxzbyBiZSBib3VuZCB0byBhIGtleWJvYXJkIHNob3J0Y3V0IGlmIHlvdSB3aXNoLicsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJBY3RpdmF0ZSBQcml2YWN5IEdsYXNzZXMgb24gc3RhcnR1cFwiKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICBcIkluZGljYXRlcyB3aGV0aGVyIHRoZSBwbHVnaW4gaXMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgd2hlbiBzdGFydGluZyBPYnNpZGlhbi5cIlxyXG4gICAgICApXHJcbiAgICAgIC5hZGREcm9wZG93bigodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlLmFkZE9wdGlvbnMoe1xyXG4gICAgICAgICAgXCJoaWRlLWFsbFwiOiBcIkhpZGUgYWxsXCIsXHJcbiAgICAgICAgICBcImhpZGUtcHJpdmF0ZVwiOiBcIkhpZGUgcHJpdmF0ZSAoZGVmYXVsdClcIixcclxuICAgICAgICAgIFwicmV2ZWFsLWFsbFwiOiBcIlJldmVhbCBhbGxcIixcclxuICAgICAgICAgIFwicmV2ZWFsLWhlYWRsaW5lc1wiOiBcIlJldmVhbCBoZWFkbGluZXMgb25seVwiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJPblN0YXJ0dXApO1xyXG4gICAgICAgIHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJPblN0YXJ0dXAgPSB2YWx1ZSBhcyBMZXZlbDtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJIaWRlIGFsbCBhZnRlciB1c2VyIGluYWN0aXZpdHkgKHNlY29uZHMpXCIpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIFwiSW5hY3Rpdml0eSB0aW1lIGFmdGVyIHdoaWNoIFByaXZhY3kgR2xhc3NlcyB3aWxsIGhpZGUgYWxsLiAtMSB0byBkaXNhYmxlIGF1dG8taGlkaW5nLlwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHRmaWVsZCkgPT4ge1xyXG4gICAgICAgIHRleHRmaWVsZC5zZXRQbGFjZWhvbGRlcihcIi0xXCIpO1xyXG4gICAgICAgIHRleHRmaWVsZC5pbnB1dEVsLnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgIHRleHRmaWVsZC5pbnB1dEVsLm1pbiA9IFwiLTFcIjtcclxuICAgICAgICB0ZXh0ZmllbGQuc2V0VmFsdWUoXHJcbiAgICAgICAgICBTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGV4dGZpZWxkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGlzTmFOKHBhcnNlZCkpIHtcclxuICAgICAgICAgICAgcGFyc2VkID0gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5ibHVyT25JZGxlVGltZW91dFNlY29uZHMgPSBwYXJzZWQ7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKFwiSG92ZXIgdG8gcmV2ZWFsXCIpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIFwiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHJldmVhbCBjb250ZW50IHdoZW4gaG92ZXJpbmcgdGhlIGN1cnNvciBvdmVyIGl0LlwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhvdmVyVG9SZXZlYWwpO1xyXG4gICAgICAgIHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmhvdmVyVG9SZXZlYWwgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJSZXZlYWwgdW5kZXIgY2FyZXRcIilcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgXCJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcmV2ZWFsIGNvbnRlbnQgd2hlbiBjYXJldCBpcyBvbiBpdC5cIlxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZXZlYWxVbmRlckNhcmV0KTtcclxuICAgICAgICB0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZXZlYWxVbmRlckNhcmV0ID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi51cGRhdGVHbG9iYWxSZXZlYWxTdHlsZSgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHZhciBzbGlkZXJFbCA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcclxuICAgIGxldCBzbGlkZXJFbERlc2MgPSBcIkhpZ2hlciBpcyBibHVycmllci4gRGVmYXVsdD02MCwgY3VycmVudD1cIjtcclxuICAgIHNsaWRlckVsXHJcbiAgICAgIC5zZXROYW1lKFwiQmx1ciBsZXZlbFwiKVxyXG4gICAgICAuc2V0RGVzYyhzbGlkZXJFbERlc2MgKyBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJMZXZlbCAqIDEwMCkpXHJcbiAgICAgIC8vIF4gbmVlZCByb3VuZGluZyB0byBub3Qgc2hvdyB2YWx1ZXMgbGlrZSAnNTUuMDAwMDAwMDAwMDAwMDEnXHJcbiAgICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT5cclxuICAgICAgICBzbGlkZXJcclxuICAgICAgICAgIC5zZXRMaW1pdHMoMC4xLCAxLjUsIDAuMDUpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmx1ckxldmVsKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5ibHVyTGV2ZWwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2xpZGVyRWwuc2V0RGVzYyhcclxuICAgICAgICAgICAgICBzbGlkZXJFbERlc2MgKyBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJMZXZlbCAqIDEwMClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4udXBkYXRlQmx1ckxldmVsRWwoKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZShcIlByaXZhdGUgZGlyZWN0b3JpZXNcIilcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgXCJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcywgaW4gd2hpY2ggZmlsZXMgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZVwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiZmluYW5jZSx0aGVyYXB5XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJpdmF0ZURpcnMpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnByaXZhdGVEaXJzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnVwZGF0ZVByaXZhdGVEaXJzRWwoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKFwiUHJpdmF0ZSBub3RlIG1hcmtlclwiKVxyXG4gICAgICAuc2V0RGVzYyhcIlN0YXJ0IGEgbm90ZSB3aXRoIHRoaXMgdGV4dCB0byBtYXJrIG5vdGUgYXMgcHJpdmF0ZVwiKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCIjcHJpdmF0ZVwiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcml2YXRlTm90ZU1hcmtlciA9IHZhbHVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4udXBkYXRlTGVhdmVzU3R5bGUoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBodHRwczovL2ljb24tc2V0cy5pY29uaWZ5LmRlc2lnbi9waC9leWUtc2xhc2gvXHJcbmNvbnN0IGV5ZVNsYXNoSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTUzLjkgMzQuNmE4IDggMCAwIDAtMTEuOCAxMC44bDE5LjIgMjEuMUMyNSA4OC44IDkuNCAxMjMuMiA4LjcgMTI0LjhhOC4yIDguMiAwIDAgMCAwIDYuNWMuMy43IDguOCAxOS41IDI3LjYgMzguNGMyNS4xIDI1IDU2LjggMzguMyA5MS43IDM4LjNhMTI4LjYgMTI4LjYgMCAwIDAgNTIuMS0xMC44bDIyIDI0LjJhOCA4IDAgMCAwIDUuOSAyLjZhOC4yIDguMiAwIDAgMCA1LjQtMi4xYTcuOSA3LjkgMCAwIDAgLjUtMTEuM1ptNDcuMyA3NS45bDQxLjcgNDUuOEEzMS42IDMxLjYgMCAwIDEgMTI4IDE2MGEzMiAzMiAwIDAgMS0yNi44LTQ5LjVaTTEyOCAxOTJjLTMwLjggMC01Ny43LTExLjItNzkuOS0zMy4zQTEyOC4zIDEyOC4zIDAgMCAxIDI1IDEyOGM0LjctOC44IDE5LjgtMzMuNSA0Ny4zLTQ5LjRsMTggMTkuOGE0OCA0OCAwIDAgMCA2My42IDcwbDE0LjcgMTYuMkExMTIuMSAxMTIuMSAwIDAgMSAxMjggMTkyWm0xMTkuMy02MC43Yy0uNC45LTEwLjUgMjMuMy0zMy40IDQzLjhhOC4xIDguMSAwIDAgMS01LjMgMmE3LjYgNy42IDAgMCAxLTUuOS0yLjdhOCA4IDAgMCAxIC42LTExLjNBMTMxIDEzMSAwIDAgMCAyMzEgMTI4YTEzMC4zIDEzMC4zIDAgMCAwLTIzLjEtMzAuOEMxODUuNyA3NS4yIDE1OC44IDY0IDEyOCA2NGExMTIuOSAxMTIuOSAwIDAgMC0xOS40IDEuNmE4LjEgOC4xIDAgMCAxLTkuMi02LjZhOCA4IDAgMCAxIDYuNi05LjJhMTMyLjQgMTMyLjQgMCAwIDEgMjItMS44YzM0LjkgMCA2Ni42IDEzLjMgOTEuNyAzOC4zYzE4LjggMTguOSAyNy4zIDM3LjcgMjcuNiAzOC41YTguMiA4LjIgMCAwIDEgMCA2LjVaTTEzNCA5Ni42YTggOCAwIDAgMSAzLTE1LjhhNDguMyA0OC4zIDAgMCAxIDM4LjggNDIuN2E4IDggMCAwIDEtNy4yIDguN2gtLjhhNy45IDcuOSAwIDAgMS03LjktNy4yQTMyLjIgMzIuMiAwIDAgMCAxMzQgOTYuNlpcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZS1jbG9zZWQtYm9sZC9cclxuY29uc3QgZXllQ2xvc2VkSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIzNC40IDE2MC44YTEyIDEyIDAgMCAxLTEwLjQgMThhMTEuOCAxMS44IDAgMCAxLTEwLjQtNmwtMTYuMy0yOC4yYTEyNiAxMjYgMCAwIDEtMjkuNCAxMy41bDUuMiAyOS40YTExLjkgMTEuOSAwIDAgMS05LjcgMTMuOWwtMi4xLjJhMTIgMTIgMCAwIDEtMTEuOC05LjlsLTUuMS0yOC43YTEyMy41IDEyMy41IDAgMCAxLTE2LjQgMWExNDYuMyAxNDYuMyAwIDAgMS0xNi41LTFsLTUuMSAyOC43YTEyIDEyIDAgMCAxLTExLjggOS45bC0yLjEtLjJhMTEuOSAxMS45IDAgMCAxLTkuNy0xMy45bDUuMi0yOS40YTEyNS4zIDEyNS4zIDAgMCAxLTI5LjMtMTMuNUw0Mi4zIDE3M2ExMi4xIDEyLjEgMCAwIDEtMTAuNCA2YTExLjcgMTEuNyAwIDAgMS02LTEuNmExMiAxMiAwIDAgMS00LjQtMTYuNGwxNy45LTMxYTE0Mi40IDE0Mi40IDAgMCAxLTE2LjctMTcuNmExMiAxMiAwIDEgMSAxOC42LTE1LjFDNTcuMSAxMTYuOCA4NC45IDE0MCAxMjggMTQwczcwLjktMjMuMiA4Ni43LTQyLjdhMTIgMTIgMCAxIDEgMTguNiAxNS4xYTE1MC4zIDE1MC4zIDAgMCAxLTE2LjcgMTcuN1pcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZS9cclxuY29uc3QgZXllSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTI0Ny4zIDEyNC44Yy0uMy0uOC04LjgtMTkuNi0yNy42LTM4LjVDMTk0LjYgNjEuMyAxNjIuOSA0OCAxMjggNDhTNjEuNCA2MS4zIDM2LjMgODYuM0MxNy41IDEwNS4yIDkgMTI0IDguNyAxMjQuOGE3LjkgNy45IDAgMCAwIDAgNi40Yy4zLjggOC44IDE5LjYgMjcuNiAzOC41YzI1LjEgMjUgNTYuOCAzOC4zIDkxLjcgMzguM3M2Ni42LTEzLjMgOTEuNy0zOC4zYzE4LjgtMTguOSAyNy4zLTM3LjcgMjcuNi0zOC41YTcuOSA3LjkgMCAwIDAgMC02LjRaTTEyOCAxOTJjLTMwLjggMC01Ny43LTExLjItNzkuOS0zMy4zQTEzMC4zIDEzMC4zIDAgMCAxIDI1IDEyOGExMzAuMyAxMzAuMyAwIDAgMSAyMy4xLTMwLjhDNzAuMyA3NS4yIDk3LjIgNjQgMTI4IDY0czU3LjcgMTEuMiA3OS45IDMzLjJBMTMwLjMgMTMwLjMgMCAwIDEgMjMxIDEyOGMtNy4yIDEzLjUtMzguNiA2NC0xMDMgNjRabTAtMTEyYTQ4IDQ4IDAgMSAwIDQ4IDQ4YTQ4IDQ4IDAgMCAwLTQ4LTQ4Wm0wIDgwYTMyIDMyIDAgMSAxIDMyLTMyYTMyLjEgMzIuMSAwIDAgMS0zMiAzMlpcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZWdsYXNzZXMvXHJcbmNvbnN0IGV5ZUdsYXNzZXMgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkIG1lZXRcIiB2aWV3Qm94PVwiMCAwIDI1NiAyNTZcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0yMDAgNDBhOCA4IDAgMCAwIDAgMTZhMTYgMTYgMCAwIDEgMTYgMTZ2NTguMDhBNDQgNDQgMCAwIDAgMTQ1LjY4IDE1MmgtMzUuMzZBNDQgNDQgMCAwIDAgNDAgMTMwLjA4VjcyYTE2IDE2IDAgMCAxIDE2LTE2YTggOCAwIDAgMCAwLTE2YTMyIDMyIDAgMCAwLTMyIDMydjkyYTQ0IDQ0IDAgMCAwIDg3LjgxIDRoMzIuMzhhNDQgNDQgMCAwIDAgODcuODEtNFY3MmEzMiAzMiAwIDAgMC0zMi0zMlpNNjggMTkyYTI4IDI4IDAgMSAxIDI4LTI4YTI4IDI4IDAgMCAxLTI4IDI4Wm0xMjAgMGEyOCAyOCAwIDEgMSAyOC0yOGEyOCAyOCAwIDAgMS0yOCAyOFpcIi8+PC9zdmc+YDsiXSwibmFtZXMiOlsiUGx1Z2luIiwiYWRkSWNvbiIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBb0dBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUs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