/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/main.ts var main_exports = {}; __export(main_exports, { DEFAULT_SETTINGS: () => DEFAULT_SETTINGS, default: () => DNPlugin }); module.exports = __toCommonJS(main_exports); var import_obsidian4 = require("obsidian"); // src/settings.ts var import_obsidian = require("obsidian"); var DNSettingTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); new import_obsidian.Setting(containerEl).setName("Open dashboard navigator").addButton((btn) => { btn.setButtonText("Open").setTooltip("Open dashboard navigator").onClick((evt) => { this.plugin._DN_MODAL.open(); }); }); new import_obsidian.Setting(containerEl).setName("Default view").setDesc("Select view when opening window").addDropdown((sel) => { this.dropdownDefaultView = sel; sel.addOption("1", "Dashboard"); sel.addOption("2", "Navigator"); sel.onChange(async (val) => { this.plugin.settings.default_view = parseInt(val); this.plugin._DN_MODAL.default_view = this.plugin.settings.default_view; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.default_view.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownDefaultView.setValue(DEFAULT_SETTINGS.default_view.toString()); this.plugin.settings.default_view = DEFAULT_SETTINGS.default_view; this.plugin._DN_MODAL.default_view = this.plugin.settings.default_view; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Navigator table layout").setDesc("Select table results layout").addDropdown((sel) => { this.dropdownTableLayout = sel; sel.addOption("dn-tbl-default", "Default"); sel.addOption("dn-tbl-row", "Row striped"); sel.addOption("dn-tbl-column", "Column striped"); sel.addOption("dn-tbl-bordered", "Bordered"); sel.onChange(async (val) => { this.plugin.settings.selected_table_layout = val; this.plugin._DN_MODAL.selected_table_layout = this.plugin.settings.selected_table_layout; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.selected_table_layout.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownTableLayout.setValue(DEFAULT_SETTINGS.selected_table_layout.toString()); this.plugin.settings.selected_table_layout = DEFAULT_SETTINGS.selected_table_layout; this.plugin._DN_MODAL.selected_table_layout = this.plugin.settings.selected_table_layout; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Date format").setDesc("Select date format").addDropdown((sel) => { this.dropdownDateFormat = sel; sel.addOption("YYYY-MM-DD HH:mm:ss", "YYYY-MM-DD HH:mm:ss"); sel.addOption("YYYY-MM-DD HH:mm", "YYYY-MM-DD HH:mm"); sel.addOption("YYYY-MM-DD", "YYYY-MM-DD"); sel.addOption("DD/MM/YYYY HH:mm:ss", "DD/MM/YYYY HH:mm:ss"); sel.addOption("DD/MM/YYYY HH:mm", "DD/MM/YYYY HH:mm"); sel.addOption("DD/MM/YYYY", "DD/MM/YYYY"); sel.onChange(async (val) => { this.plugin.settings.date_format = val; this.plugin._DN_MODAL.date_format = this.plugin.settings.date_format; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.date_format.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownDateFormat.setValue(DEFAULT_SETTINGS.date_format.toString()); this.plugin.settings.date_format = DEFAULT_SETTINGS.date_format; this.plugin._DN_MODAL.date_format = this.plugin.settings.date_format; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Font size").setDesc("Select font size in pixels for results and links").addSlider((sli) => { this.sliderFontSize = sli; let slider_val; if (this.plugin.settings.font_size) { slider_val = this.plugin.settings.font_size; } else { slider_val = DEFAULT_SETTINGS.font_size; } sli.setDynamicTooltip(); sli.setLimits(12, 24, 1); sli.setValue(slider_val); sli.onChange((val) => { this.plugin.settings.font_size = val; this.plugin.dnSetFontSize(val); this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.sliderFontSize.setValue(DEFAULT_SETTINGS.font_size); this.plugin.settings.font_size = DEFAULT_SETTINGS.font_size; this.plugin.dnSetFontSize(this.plugin.settings.font_size); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Files per page").setDesc("Number of results per page").addDropdown((sel) => { this.dropdownFilesPerPage = sel; sel.addOption("10", "10"); sel.addOption("20", "20"); sel.addOption("30", "30"); sel.addOption("50", "50"); sel.addOption("100", "100"); sel.onChange(async (val) => { this.plugin.settings.files_per_page = parseInt(val); this.plugin._DN_MODAL.files_per_page = this.plugin.settings.files_per_page; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.files_per_page.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownFilesPerPage.setValue(DEFAULT_SETTINGS.files_per_page.toString()); this.plugin.settings.files_per_page = DEFAULT_SETTINGS.files_per_page; this.plugin._DN_MODAL.files_per_page = this.plugin.settings.files_per_page; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Recent files").setDesc("Number of recent files per category").addDropdown((sel) => { this.dropdownRecentFiles = sel; sel.addOption("3", "3"); sel.addOption("4", "4"); sel.addOption("5", "5"); sel.addOption("10", "10"); sel.onChange(async (val) => { this.plugin.settings.num_recent_files = parseInt(val); this.plugin._DN_MODAL.num_recent_files = this.plugin.settings.num_recent_files; await this.plugin.saveSettings(); }), sel.setValue(this.plugin.settings.num_recent_files.toString()); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.dropdownRecentFiles.setValue(DEFAULT_SETTINGS.num_recent_files.toString()); this.plugin.settings.num_recent_files = DEFAULT_SETTINGS.num_recent_files; this.plugin._DN_MODAL.num_recent_files = this.plugin.settings.num_recent_files; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Excluded file extensions").setDesc("File extensions to exclude, separated by commas").addText((text) => { this.textExcludedExtensions = text; text.setPlaceholder("File extensions to exclude").setValue(this.plugin.settings.excluded_ext).onChange(async (val) => { this.plugin.settings.excluded_ext = val; this.plugin._DN_MODAL.excluded_extensions = this.plugin.dnGetExcludedExtensions(val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.textExcludedExtensions.setValue(""); this.plugin.settings.excluded_ext = ""; this.plugin._DN_MODAL.excluded_extensions = []; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Excluded folders").setDesc("List of folder paths to exclude, separated by commas").addText((text) => { this.textExcludedFolders = text; text.setPlaceholder("Folder paths to exclude").setValue(this.plugin.settings.excluded_path).onChange(async (val) => { this.plugin.settings.excluded_path = val; this.plugin._DN_MODAL.excluded_folders = this.plugin.dnGetExcludedFolders(val); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.textExcludedFolders.setValue(""); this.plugin.settings.excluded_path = ""; this.plugin._DN_MODAL.excluded_folders = []; this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Toggle colored files").setDesc("Turn on/off colored files").addToggle((toggle) => { this.toggleColoredFiles = toggle; toggle.setValue(this.plugin.settings.colored_files).onChange(async (val) => { this.plugin.settings.colored_files = val; this.plugin._DN_MODAL.colored_files = val; this.plugin._DN_MODAL.dnToggleColoredFiles(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.toggleColoredFiles.setValue(DEFAULT_SETTINGS.colored_files); this.plugin.settings.colored_files = DEFAULT_SETTINGS.colored_files; this.plugin._DN_MODAL.colored_files = DEFAULT_SETTINGS.colored_files; this.plugin._DN_MODAL.dnToggleColoredFiles(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Notes").setDesc("Color of notes").addColorPicker((color) => { this.colorCompNotes = color; color.setValue(this.plugin.settings.color_notes).onChange(async (val) => { this.plugin.settings.color_notes = val; this.plugin._DN_MODAL.color_notes = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompNotes.setValue(DEFAULT_SETTINGS.color_notes); this.plugin.settings.color_notes = DEFAULT_SETTINGS.color_notes; this.plugin._DN_MODAL.color_notes = DEFAULT_SETTINGS.color_notes; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Canvas").setDesc("Color of canvas").addColorPicker((color) => { this.colorCompCanvas = color; color.setValue(this.plugin.settings.color_canvas).onChange(async (val) => { this.plugin.settings.color_canvas = val; this.plugin._DN_MODAL.color_canvas = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompCanvas.setValue(DEFAULT_SETTINGS.color_canvas); this.plugin.settings.color_canvas = DEFAULT_SETTINGS.color_canvas; this.plugin._DN_MODAL.color_canvas = DEFAULT_SETTINGS.color_canvas; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Images").setDesc("Color of images").addColorPicker((color) => { this.colorCompImages = color; color.setValue(this.plugin.settings.color_images).onChange(async (val) => { this.plugin.settings.color_images = val; this.plugin._DN_MODAL.color_images = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompImages.setValue(DEFAULT_SETTINGS.color_images); this.plugin.settings.color_images = DEFAULT_SETTINGS.color_images; this.plugin._DN_MODAL.color_images = DEFAULT_SETTINGS.color_images; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Videos").setDesc("Color of videos").addColorPicker((color) => { this.colorCompVideos = color; color.setValue(this.plugin.settings.color_videos).onChange(async (val) => { this.plugin.settings.color_videos = val; this.plugin._DN_MODAL.color_videos = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompVideos.setValue(DEFAULT_SETTINGS.color_videos); this.plugin.settings.color_videos = DEFAULT_SETTINGS.color_videos; this.plugin._DN_MODAL.color_videos = DEFAULT_SETTINGS.color_videos; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Audios").setDesc("Color of audios").addColorPicker((color) => { this.colorCompAudios = color; color.setValue(this.plugin.settings.color_audios).onChange(async (val) => { this.plugin.settings.color_audios = val; this.plugin._DN_MODAL.color_audios = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompAudios.setValue(DEFAULT_SETTINGS.color_audios); this.plugin.settings.color_audios = DEFAULT_SETTINGS.color_audios; this.plugin._DN_MODAL.color_audios = DEFAULT_SETTINGS.color_audios; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: PDF").setDesc("Color of PDF files").addColorPicker((color) => { this.colorCompPdf = color; color.setValue(this.plugin.settings.color_pdf).onChange(async (val) => { this.plugin.settings.color_pdf = val; this.plugin._DN_MODAL.color_pdf = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompPdf.setValue(DEFAULT_SETTINGS.color_pdf); this.plugin.settings.color_pdf = DEFAULT_SETTINGS.color_pdf; this.plugin._DN_MODAL.color_pdf = DEFAULT_SETTINGS.color_pdf; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Color: Other files").setDesc("Color of other files").addColorPicker((color) => { this.colorCompOther = color; color.setValue(this.plugin.settings.color_other).onChange(async (val) => { this.plugin.settings.color_other = val; this.plugin._DN_MODAL.color_other = val; this.plugin._DN_MODAL.dnSetCustomColors(); await this.plugin.saveSettings(); }); }).addExtraButton((btn) => { btn.setIcon("rotate-ccw"); btn.setTooltip("Restore default"); btn.onClick(() => { this.colorCompOther.setValue(DEFAULT_SETTINGS.color_other); this.plugin.settings.color_other = DEFAULT_SETTINGS.color_other; this.plugin._DN_MODAL.color_other = DEFAULT_SETTINGS.color_other; this.plugin._DN_MODAL.dnSetCustomColors(); this.plugin.saveSettings(); }); }); } }; // src/dn.ts var import_obsidian2 = require("obsidian"); // src/utils/format.ts function formatFileSize(fileSize) { if (fileSize === 0) { return "0"; } const formattedSize = fileSize.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ","); return formattedSize; } function getFolderStructure(folder) { const folders = folder.split("/").slice(0, -1); if (folders.length === 0) { return "/"; } return "/" + folders.join("/"); } // src/utils/piechart.ts var DNPieChart = class { constructor(canvas, margin = 10, fontSize = 12, legendWidth = 50, labelColor = "#828282") { this._canvas = canvas; this._ctx = canvas.getContext("2d"); this._data = []; this._margin = margin; this._fontSize = fontSize; this._legendWidth = legendWidth; this._labelColor = labelColor; } addData(value, color, label) { this._data.push({ value, color, label }); } draw() { const { width, height } = this._canvas; const availWidth = width - 2 * this._margin; const availHeight = height - 2 * this._margin; const scale = Math.min(availWidth / width, availHeight / height); const radius = Math.min(availWidth, availHeight) / 2 * scale; this._cX = width / 2; this._cY = height / 2; this._ctx.clearRect(0, 0, width, height); const totalValue = this._data.reduce((acc, curr) => acc + curr.value, 0); let currentAngle = -Math.PI / 2; this._data.forEach((slice) => { const sliceAngle = slice.value / totalValue * 2 * Math.PI; this.drawSlice(radius, sliceAngle, slice.color, currentAngle); currentAngle += sliceAngle; }); this.drawLegend(2, 20); } drawSlice(radius, sliceAngle, color, startAngle) { this._ctx.beginPath(); this._ctx.arc(this._cX, this._cY, radius, startAngle, startAngle + sliceAngle); this._ctx.lineTo(this._cX, this._cY); this._ctx.fillStyle = color; this._ctx.closePath(); this._ctx.fill(); } drawLegend(x, y) { const lineHeight = this._fontSize + 5; this._data.forEach((slice, index) => { const textX = x + this._legendWidth / 5; const textY = y + index * lineHeight - 10; this._ctx.fillStyle = slice.color; this._ctx.fillRect(textX - 10, textY, 5, 5); this._ctx.fillStyle = this._labelColor; this._ctx.font = `${this._fontSize}px sans-serif`; this._ctx.fillText(`${slice.label} (${slice.value})`, textX, textY + 8); }); } }; // src/dn.ts var import_obsidian3 = require("obsidian"); var DNModal = class extends import_obsidian2.Modal { constructor(app) { super(app); this._sort_order = "desc"; this._sort_column = "modified"; this._selected_category = ""; this._TABLE_LAYOUTS = ["dn-tbl-default", "dn-tbl-row", "dn-tbl-column", "dn-tbl-bordered"]; this.selected_table_layout = "dn-tbl-default"; this.selected_sort_value = "modified-desc"; this.num_recent_files = 5; this.files_per_page = 20; this.date_format = "YYYY-MM-DD HH:mm"; this.default_view = 1; this.excluded_extensions = []; this.excluded_folders = []; // File colors this.color_notes = "#bf48ff"; this.color_images = "#007fff"; this.color_canvas = "#ff7f28"; this.color_videos = "#d34848"; this.color_audios = "#bfbf00"; this.color_pdf = "#00a300"; this.color_other = "#828282"; this.colored_files = false; this.dnHandleIntersection = (entries) => { entries.forEach((entry) => { if (!entry.isIntersecting) { entry.target.removeEventListener("contextmenu", this.dnHandleClick); entry.target.removeEventListener("click", this.dnHandleClick); entry.target.removeEventListener("dblclick", this.dnHandleDblClick); } }); }; this.intersectionObserver = new IntersectionObserver(this.dnHandleIntersection); } async onOpen() { var _a; const { contentEl } = this; this._files = []; this._folders = []; this._notes = []; this._recent = []; this._images = []; this._canvas = []; this._audios = []; this._videos = []; this._pdf = []; this._other = []; const leaf = (_a = this.app.workspace) == null ? void 0 : _a.getMostRecentLeaf(); if (leaf !== null) { this._leaf = leaf; } const dnFilesAndFolders = this.app.vault.getAllLoadedFiles(); for (const absF of dnFilesAndFolders) { if (absF instanceof import_obsidian2.TFile) { this._files.push(absF); } else if (absF instanceof import_obsidian2.TFolder && !absF.isRoot()) { this._folders.push(absF); } } this._filtered_files = this._files.filter( (file) => { return !this.excluded_extensions.includes(file.extension.toLowerCase()) && !this.excluded_folders.some((folder) => file.path.startsWith(folder)); } ); this._files = this._filtered_files; await this.dnOrganizeFiles({ arr: this._filtered_files }); this._recent = await this.dnGetRecentFiles(this._filtered_files); this.dnCreateMainUI(contentEl); this.dnSetView(this.default_view); this.dnSetSelectLayoutValue(this.selected_table_layout); this.dnSetSelectSortValue(this.selected_sort_value); this.dnToggleColoredFiles(); } dnSetCustomColors() { document.body.style.setProperty("--dn-notes-color", this.color_notes); document.body.style.setProperty("--dn-images-color", this.color_images); document.body.style.setProperty("--dn-canvas-color", this.color_canvas); document.body.style.setProperty("--dn-videos-color", this.color_videos); document.body.style.setProperty("--dn-audios-color", this.color_audios); document.body.style.setProperty("--dn-pdfs-color", this.color_pdf); document.body.style.setProperty("--dn-other-color", this.color_other); } dnToggleColoredFiles() { const dnMainContainer = document.getElementById("dn-container"); if (this.colored_files) { dnMainContainer == null ? void 0 : dnMainContainer.classList.add("dn-colored-files"); } else { dnMainContainer == null ? void 0 : dnMainContainer.classList.remove("dn-colored-files"); } this.dnSetCustomColors(); } async dnCreateMainUI(el) { const mainContainer = el.createEl("div", { cls: "dn-container" }); mainContainer.setAttribute("id", "dn-container"); this.dnCreateInputSearch(mainContainer); const topNav = mainContainer.createEl("div", { cls: "dn-top-nav" }); const leftTopNav = topNav.createEl("div"); const rightTopNav = topNav.createEl("div"); this._BTN_DASHBOARD = leftTopNav.createEl("button", { text: "Dashboard", cls: "mod-cta" }); this._BTN_DASHBOARD.onClickEvent((evt) => { this.dnSetView(1); }); this._BTN_NAVIGATOR = leftTopNav.createEl("button", { text: "Navigator" }); this._BTN_NAVIGATOR.onClickEvent((evt) => { this.dnSearchVault(this._INPUT_SEARCH.value); this.dnSetView(2); }); this.labelLayout = rightTopNav.createEl("span", { text: "Layout:", cls: "dn-tbl-label" }); this.labelLayout.setAttribute("id", "dn-label-layout"); this._SELECT_TABLE_LAYOUT = rightTopNav.createEl("select", { cls: "dropdown tbl-select" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Default", value: "dn-tbl-default" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Row striped", value: "dn-tbl-row" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Column striped", value: "dn-tbl-column" }); this._SELECT_TABLE_LAYOUT.createEl("option", { text: "Bordered", value: "dn-tbl-bordered" }); this._SELECT_TABLE_LAYOUT.addEventListener("change", () => { this.dnSelectTableLayout(); }); this.labelSort = rightTopNav.createEl("span", { text: "Sort by:", cls: "dn-tbl-label" }); this.labelSort.setAttribute("id", "dn-label-sort"); this._SELECT_SORT = rightTopNav.createEl("select", { cls: "dropdown" }); this._SELECT_SORT.setAttribute("id", "dn-select-sort"); this._SELECT_SORT.addEventListener("change", () => { this.dnSortColumnWithSelect(); }); const option1 = this._SELECT_SORT.createEl("option", { text: "File name (A to Z)", value: "name-asc" }); const option2 = this._SELECT_SORT.createEl("option", { text: "File name (Z to A)", value: "name-desc" }); const option3 = this._SELECT_SORT.createEl("option", { text: "Path (A to Z)", value: "path-asc" }); const option4 = this._SELECT_SORT.createEl("option", { text: "Path (Z to A)", value: "path-desc" }); const option5 = this._SELECT_SORT.createEl("option", { text: "File size (smallest to largest)", value: "size-asc" }); const option6 = this._SELECT_SORT.createEl("option", { text: "File size (largest to smallest)", value: "size-desc" }); const option7 = this._SELECT_SORT.createEl("option", { text: "Date/time (oldest to newest)", value: "modified-asc" }); const option8 = this._SELECT_SORT.createEl("option", { text: "Date/time (newest to oldest)", value: "modified-desc" }); this._VIEW_DASHBOARD = mainContainer.createEl("div", { cls: "dn-flex" }); this._VIEW_NAVIGATOR = mainContainer.createEl("div", { cls: "dn-display-none" }); this._divSearchResults = this._VIEW_NAVIGATOR.createEl("div", { cls: "dn-div-table" }); this.dnShowSearchResults({ f: this._filtered_files, el: this._divSearchResults, leaf: this._leaf }); const divVaultStats = this._VIEW_DASHBOARD.createEl("div"); divVaultStats.setAttribute("id", "dn-vault-stats"); const divVaultGraph = this._VIEW_DASHBOARD.createEl("div"); divVaultGraph.setAttribute("id", "dn-vault-graph"); const divRecentFiles = this._VIEW_DASHBOARD.createEl("div"); divRecentFiles.setAttribute("id", "dn-recent-files"); const divRecentNotes = this._VIEW_DASHBOARD.createEl("div"); divRecentNotes.setAttribute("id", "dn-recent-notes"); ; const divCanvas = this._VIEW_DASHBOARD.createEl("div"); divCanvas.setAttribute("id", "dn-canvas"); const divImages = this._VIEW_DASHBOARD.createEl("div"); divImages.setAttribute("id", "dn-images"); const divAudios = this._VIEW_DASHBOARD.createEl("div"); divAudios.setAttribute("id", "dn-audios"); const divVideos = this._VIEW_DASHBOARD.createEl("div"); divVideos.setAttribute("id", "dn-videos"); const divPDFs = this._VIEW_DASHBOARD.createEl("div"); divPDFs.setAttribute("id", "dn-pdfs"); const divOther = this._VIEW_DASHBOARD.createEl("div"); divOther.setAttribute("id", "dn-other"); const btnNotes = await this.dnCreateBtn( divVaultStats, "dn-btn-notes", "Notes", this._notes, this._divSearchResults, this._leaf ); const btnCanvas = await this.dnCreateBtn( divVaultStats, "dn-btn-canvas", "Canvas", this._canvas, this._divSearchResults, this._leaf ); const btnImages = await this.dnCreateBtn( divVaultStats, "dn-btn-images", "Images", this._images, this._divSearchResults, this._leaf ); const btnAudios = await this.dnCreateBtn( divVaultStats, "dn-btn-audios", "Audios", this._audios, this._divSearchResults, this._leaf ); const btnVideos = await this.dnCreateBtn( divVaultStats, "dn-btn-videos", "Videos", this._videos, this._divSearchResults, this._leaf ); const btnPDF = await this.dnCreateBtn( divVaultStats, "dn-btn-pdf", "PDF", this._pdf, this._divSearchResults, this._leaf ); const btnOther = await this.dnCreateBtn( divVaultStats, "dn-btn-other", "Other", this._other, this._divSearchResults, this._leaf ); const canvasPieChart1 = divVaultGraph.createEl("canvas"); canvasPieChart1.setAttribute("id", "dashboard-canvas"); const styles = getComputedStyle(document.body); const labelColor = styles.getPropertyValue("--text-muted"); const pieChart1 = new DNPieChart(canvasPieChart1, 10, 12, 50, labelColor); pieChart1.addData(this._notes.length, this.color_notes, "Notes"); pieChart1.addData(this._images.length, this.color_images, "Images"); pieChart1.addData(this._canvas.length, this.color_canvas, "Canvas"); pieChart1.addData(this._videos.length, this.color_videos, "Videos"); pieChart1.addData(this._audios.length, this.color_audios, "Audios"); pieChart1.addData(this._pdf.length, this.color_pdf, "PDF"); pieChart1.addData(this._other.length, this.color_other, "Other"); pieChart1.draw(); const divStatsFrame = divVaultGraph.createEl("div", { cls: "dn-stats-files-folders" }); divStatsFrame.createEl("div", { cls: "dn-stats-files", text: "Files: " + this._filtered_files.length }); divStatsFrame.createEl("div", { cls: "dn-stats-folders", text: "Folders: " + this._folders.length }); await this.dnCreateRecentFiles("Recent files", divRecentFiles, this._recent, this.num_recent_files); await this.dnCreateRecentFiles("Recent notes", divRecentNotes, this._notes, this.num_recent_files); await this.dnCreateRecentFiles("Recent canvas", divCanvas, this._canvas, this.num_recent_files); await this.dnCreateRecentFiles("Recent images", divImages, this._images, this.num_recent_files); await this.dnCreateRecentFiles("Recent audios", divAudios, this._audios, this.num_recent_files); await this.dnCreateRecentFiles("Recent videos", divVideos, this._videos, this.num_recent_files); await this.dnCreateRecentFiles("Recent PDFs", divPDFs, this._pdf, this.num_recent_files); await this.dnCreateRecentFiles("Recent other files", divOther, this._other, this.num_recent_files); } async dnCreateBtn(elDiv, btnId, btnTitle, btnCategoryFiles, displayEl, leaf) { let btn = elDiv.createEl("div", { cls: "dn-btn-stats" }); btn.setAttribute("id", btnId); btn.createEl("span", { cls: "dn-btn-stats-label", text: btnTitle }); btn.createEl("span", { cls: "dn-btn-stats-icon" }); btn.createEl("span", { cls: "dn-btn-stats-number", text: btnCategoryFiles.length.toString() }); btn.onClickEvent((evt) => { this._filtered_files = btnCategoryFiles; this._selected_category = " (" + btnTitle + ")"; this.dnSortFilteredFiles(false); this.dnShowSearchResults({ f: btnCategoryFiles, el: displayEl, leaf }); this.dnSetView(2); }); return btn; } async dnCreateRecentFiles(title, divF, files, num_files) { if (files.length === 0) { divF.createEl("h3", { cls: "dn-subtitles", text: title }); divF.createEl("p", { cls: "dn-no-results-found", text: "No files found." }); divF.classList.add("dn-display-none"); } else { divF.createEl("h3", { cls: "dn-subtitles", text: title }); const sortedFiles = await this.dnGetRecentFiles(files); sortedFiles.forEach((sfile) => { divF.createEl("a", { cls: this.dnSetFileIconClass(sfile.extension), text: sfile.basename, title: sfile.path }).onClickEvent((evt) => { if (sfile !== null) { this.dnOpenFileAlt(sfile, evt); } }); if (sfile.extension !== "md") { divF.createEl("span", { cls: "nav-file-tag", text: sfile.extension }); } divF.createEl("br"); }); } } dnCreateInputSearch(el) { const searchContainer = el.createEl("div", { cls: "dn-search-input-container" }); this._INPUT_SEARCH = searchContainer.createEl("input", { type: "search", placeholder: "Search..." }); this._INPUT_SEARCH.setAttribute("id", "dn-input-filter"); this._INPUT_SEARCH.spellcheck = false; this._INPUT_SEARCH.focus(); const clearInputSearch = searchContainer.createEl("div", { cls: "search-input-clear-button" }).onClickEvent((evt) => { this._INPUT_SEARCH.value = ""; this._INPUT_SEARCH.focus(); this.dnSearchVault(this._INPUT_SEARCH.value); }); this._INPUT_SEARCH.addEventListener("input", (0, import_obsidian2.debounce)(() => this.dnSearchVault(this._INPUT_SEARCH.value), 300, true)); } async dnSearchVault(val) { let rExp; try { rExp = new RegExp(val.toLowerCase(), "iu"); } catch (error) { return; } this.dnSetView(2); const isDateSearch = val.startsWith("@"); if (isDateSearch) { this._INPUT_SEARCH.classList.add("dn-input-datesearch"); } else { this._INPUT_SEARCH.classList.remove("dn-input-datesearch"); } this._filtered_files = this._files.filter( (file) => { if (isDateSearch) { let mtime = (0, import_obsidian3.moment)(file.stat.mtime); const dateSearch = val.slice(1).toLowerCase().split(" "); switch (dateSearch[0]) { case "day": case "today": return mtime.isSame((0, import_obsidian3.moment)(), "day"); case "day-1": case "yesterday": return mtime.isSame((0, import_obsidian3.moment)().subtract(1, "days"), "day"); case "day-2": return mtime.isSame((0, import_obsidian3.moment)().subtract(2, "days"), "day"); case "day-3": return mtime.isSame((0, import_obsidian3.moment)().subtract(3, "days"), "day"); case "day-4": return mtime.isSame((0, import_obsidian3.moment)().subtract(4, "days"), "day"); case "day-5": return mtime.isSame((0, import_obsidian3.moment)().subtract(5, "days"), "day"); case "day-6": return mtime.isSame((0, import_obsidian3.moment)().subtract(6, "days"), "day"); case "day-7": return mtime.isSame((0, import_obsidian3.moment)().subtract(7, "days"), "day"); case "week": return mtime.isBetween((0, import_obsidian3.moment)().subtract(7, "days"), (0, import_obsidian3.moment)(), "day", "[]"); case "month": return mtime.isSame((0, import_obsidian3.moment)(), "month"); case "year": return mtime.isSame((0, import_obsidian3.moment)(), "year"); default: return false; } } else { return rExp.test(file.name.toLowerCase()) || rExp.test(getFolderStructure(file.path).toLowerCase()) || rExp.test((0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format)) || rExp.test(this.dnGetTagsPerFile(file).toLowerCase()); } } ); this._selected_category = ""; this.dnSortFilteredFiles(false); await this.dnShowSearchResults({ f: this._filtered_files, el: this._divSearchResults, leaf: this._leaf }); const tbody = document.getElementById("dn-table-results"); if (tbody !== null) { const tr = tbody.getElementsByTagName("tr"); for (let i = 0, len = tr.length; i < len; i++) { const allTds = tr[i].querySelectorAll("td"); let isResult = false; for (let j = 0; j < allTds.length; j++) { const td = allTds[j]; const tdVal = td.innerText.toLowerCase(); if (rExp.test(tdVal) || isDateSearch) { isResult = true; break; } } if (isResult) { tr[i].classList.remove("dn-display-none"); } else { tr[i].classList.add("dn-display-none"); } } } } async dnSortFilteredFiles(toggle) { switch (this._sort_column) { case "name": case "path": this.dnSortColumnString(this._sort_column, this._sort_order, toggle); break; case "size": case "modified": this.dnSortColumnNumber(this._sort_column, this._sort_order, toggle); break; } } dnSortColumnWithSelect() { const val = this._SELECT_SORT.value; if (this.dnIsValidSort(val)) { const selSort = val.split("-"); this._sort_column = selSort[0]; this._sort_order = selSort[1]; switch (this._sort_column) { case "name": case "path": this.dnSortColumnString(this._sort_column, this._sort_order, false); break; case "size": case "modified": this.dnSortColumnNumber(this._sort_column, this._sort_order, false); break; } this.dnShowSearchResults({ f: this._filtered_files, el: this._divSearchResults, leaf: this._leaf }); } } dnIsValidSort(val) { if ([ "name-asc", "name-desc", "path-asc", "path-desc", "size-asc", "size-desc", "modified-asc", "modified-desc" ].includes(val)) { return true; } else { return false; } } dnIsValidLayout(val) { if (this._TABLE_LAYOUTS.includes(val)) { return true; } else { return false; } } async dnShowSearchResults({ f, el, leaf, currentPage = 1 }) { el.empty(); const paginationContainer = this._divSearchResults.createEl("div", { cls: "dn-pagination" }); const table = el.createEl("table", { cls: this.selected_table_layout }); table.setAttribute("id", "dn-table"); const thead = table.createEl("thead"); const tr = thead.createEl("tr"); this._th1 = tr.createEl("th", { text: "Name" }); this._th2 = tr.createEl("th", { text: "Path" }); this._th3 = tr.createEl("th", { text: "Size" }); this._th4 = tr.createEl("th", { text: "Date" }); this._th5 = tr.createEl("th", { text: "Tags" }); this._th1.addEventListener("dblclick", () => this.dnAlternateSortColumn("name")); this._th2.addEventListener("dblclick", () => this.dnAlternateSortColumn("path")); this._th3.addEventListener("dblclick", () => this.dnAlternateSortColumn("size")); this._th4.addEventListener("dblclick", () => this.dnAlternateSortColumn("modified")); const tbody = table.createEl("tbody"); tbody.setAttribute("id", "dn-table-results"); if (f.length > 0) { if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } this._total_pages = Math.ceil(f.length / this.files_per_page); const paginatedData = f.slice((currentPage - 1) * this.files_per_page, currentPage * this.files_per_page); paginatedData.forEach(async (file) => { let tr2 = tbody.createEl("tr"); tr2.addEventListener("contextmenu", (evt) => { this.dnHandleClick(evt, file); }); tr2.addEventListener("click", (evt) => { this.dnHandleClick(evt, file); }); tr2.addEventListener("dblclick", (evt) => { this.dnHandleDblClick(evt, file); }); this.intersectionObserver.observe(tr2); let td1 = tr2.createEl("td"); let td1Link = td1.createEl("a", { cls: this.dnSetFileIconClass(file.extension), text: file.name }).onClickEvent((evt) => { if (leaf !== null && file !== null) { this.dnOpenFileAlt(file, evt); } }); let fSize = formatFileSize(file.stat.size); let fMTime = (0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format); let td2 = tr2.createEl("td"); let folder_path = getFolderStructure(file.path); let td2_path = td2.createEl("a", { cls: "dn-folder-path", text: folder_path, title: file.path }).onClickEvent((evt) => { this._INPUT_SEARCH.value = folder_path; this.dnSearchVault(this._INPUT_SEARCH.value + "$"); }); let td3 = tr2.createEl("td", { text: fSize, title: fSize + " bytes" }); let td4 = tr2.createEl("td", { text: fMTime, title: fMTime }); let tags_per_file = this.dnGetTagsPerFile(file); let td5 = tr2.createEl("td", { title: tags_per_file }); let fTags = tags_per_file.split(" "); fTags.forEach((tag) => { td5.createEl("a", { cls: "dn-tag", text: tag }).onClickEvent((evt) => { this._INPUT_SEARCH.value = tag; this.dnSearchVault(this._INPUT_SEARCH.value); }); }); }); paginationContainer.empty(); const resultsCount = paginationContainer.createEl("span", { cls: "dn-pagination-total-results", text: `File(s): ${f.length}` + this._selected_category }); const currentPageIndicator = paginationContainer.createEl("span", { cls: "dn-pagination-current-page", text: `Page ${currentPage} of ${this._total_pages}` }); const btnPrev = paginationContainer.createEl("button", { cls: "dn-btn-prev", text: "\u25C0", title: "Previous" }); if (currentPage === 1) { btnPrev.disabled = true; } else { btnPrev.disabled = false; } btnPrev.addEventListener("click", () => { if (currentPage > 1) { this.dnShowSearchResults({ f, el, leaf, currentPage: currentPage - 1 }); } }); const btnNext = paginationContainer.createEl("button", { cls: "dn-btn-next", text: "\u25B6", title: "Next" }); if (currentPage === this._total_pages) { btnNext.disabled = true; } else { btnNext.disabled = false; } btnNext.addEventListener("click", () => { if (currentPage < this._total_pages) { this.dnShowSearchResults({ f, el, leaf, currentPage: currentPage + 1 }); } }); this.dnUpdateSortIndicators( this._sort_column, this._sort_order, this._th1, this._th2, this._th3, this._th4 ); } else { tr.empty(); this._divSearchResults.createEl("p", { cls: "dn-no-results-found", text: "No files found." }); } } dnAlternateSortColumn(colName) { switch (colName) { case "name": this.dnSortColumnString("name", this._sort_order, true); break; case "path": this.dnSortColumnString("path", this._sort_order, true); break; case "size": this.dnSortColumnNumber("size", this._sort_order, true); break; case "modified": this.dnSortColumnNumber("modified", this._sort_order, true); break; } this.dnShowSearchResults({ f: this._filtered_files, el: this._divSearchResults, leaf: this._leaf }); } dnGetTagsPerFile(file) { var _a, _b; const cur_file = this.app.vault.getAbstractFileByPath(file.path); if (cur_file !== null) { const tags = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.tags; const frontmatter_tags = (_b = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _b.frontmatter; const arrTags = []; if (tags) { for (let i = 0, len = tags.length; i < len; i++) { if (arrTags.indexOf(tags[i].tag) < 0) { arrTags.push(tags[i].tag); } } } if (frontmatter_tags !== void 0 && frontmatter_tags.tags) { for (let i = 0, len = frontmatter_tags.tags.length; i < len; i++) { if (arrTags.indexOf(frontmatter_tags.tags[i]) < 0) { arrTags.push("#" + frontmatter_tags.tags[i]); } } } return arrTags.join(" "); } else { return ""; } } dnUpdateSortIndicators(activeColumn, sortOrder, col1, col2, col3, col4) { col1.classList.remove("sort-active", "sort-asc", "sort-desc"); col2.classList.remove("sort-active", "sort-asc", "sort-desc"); col3.classList.remove("sort-active", "sort-asc", "sort-desc"); col4.classList.remove("sort-active", "sort-asc", "sort-desc"); let activeThCell = col4; switch (activeColumn) { case "name": activeThCell = col1; break; case "path": activeThCell = col2; break; case "size": activeThCell = col3; break; case "modified": activeThCell = col4; break; } activeThCell.classList.add("sort-active"); activeThCell.classList.add(sortOrder === "asc" ? "sort-asc" : "sort-desc"); } dnSortColumnString(sortColumn, sortOrder, toggleSortOrder) { const supportedColumns = ["name", "path"]; if (!supportedColumns.includes(sortColumn)) { return; } if (toggleSortOrder) { if (this._sort_column === sortColumn) { sortOrder = sortOrder === "asc" ? "desc" : "asc"; } else { this._sort_column = sortColumn; sortOrder = "desc"; } this._sort_order = sortOrder; } const sortValue = sortColumn + "-" + this._sort_order; this.dnSetSelectSortValue(sortValue); this._filtered_files.sort((fileA, fileB) => { let sortA; let sortB; switch (sortColumn) { case "name": sortA = fileA.name.toLowerCase(); sortB = fileB.name.toLowerCase(); break; case "path": const folderStructureA = getFolderStructure(fileA.path); const folderStructureB = getFolderStructure(fileB.path); sortA = folderStructureA.toLowerCase(); sortB = folderStructureB.toLowerCase(); break; default: sortA = fileA.name.toLowerCase(); sortB = fileB.name.toLowerCase(); } if (sortOrder === "asc") { return sortA.localeCompare(sortB); } else if (sortOrder === "desc") { return sortB.localeCompare(sortA); } else { return sortA.localeCompare(sortB); } }); } dnSortColumnNumber(sortColumn, sortOrder, toggleSortOrder) { const supportedColumns = ["size", "modified"]; if (!supportedColumns.includes(sortColumn)) { return; } if (toggleSortOrder) { if (this._sort_column === sortColumn) { sortOrder = sortOrder === "asc" ? "desc" : "asc"; } else { this._sort_column = sortColumn; sortOrder = "desc"; } this._sort_order = sortOrder; } const sortValue = sortColumn + "-" + this._sort_order; this.dnSetSelectSortValue(sortValue); this._filtered_files.sort((fileA, fileB) => { let sortA = 0; let sortB = 0; switch (sortColumn) { case "size": sortA = fileA.stat.size; sortB = fileB.stat.size; break; case "modified": sortA = fileA.stat.mtime; sortB = fileB.stat.mtime; break; } if (sortOrder === "asc") { return sortA - sortB; } else if (sortOrder === "desc") { return sortB - sortA; } else { return sortA - sortB; } }); } async dnGetRecentFiles(files) { const arrRecentFiles = files; return arrRecentFiles.sort((a, b) => b.stat.mtime - a.stat.mtime).slice(0, this.num_recent_files); } async dnOrganizeFiles({ arr }) { const arrNotes = []; const arrImages = []; const arrAudios = []; const arrCanvas = []; const arrVideos = []; const arrPDFs = []; const arrOther = []; const extensions = { "md": arrNotes, "png": arrImages, "jpg": arrImages, "webp": arrImages, "ico": arrImages, "bmp": arrImages, "gif": arrImages, "tif": arrImages, "tiff": arrImages, "raw": arrImages, "mp3": arrAudios, "wav": arrAudios, "ogg": arrAudios, "webm": arrAudios, "mp4": arrVideos, "avi": arrVideos, "pdf": arrPDFs, "canvas": arrCanvas }; for (let i = 0, len = arr.length; i < len; i++) { const f = arr[i].extension.toLowerCase(); const targetArr = extensions[f]; if (targetArr) { targetArr.push(arr[i]); } else { arrOther.push(arr[i]); } } this._notes = arrNotes; this._images = arrImages; this._audios = arrAudios; this._videos = arrVideos; this._pdf = arrPDFs; this._canvas = arrCanvas; this._other = arrOther; } dnSetFileIconClass(ext) { const file_extension = ext.toLowerCase(); const extensions = { "md": "note", "png": "image", "jpg": "image", "webp": "image", "ico": "image", "bmp": "image", "gif": "image", "tif": "image", "tiff": "image", "raw": "image", "mp3": "audio", "wav": "audio", "ogg": "audio", "webm": "audio", "mp4": "video", "avi": "video", "pdf": "pdf", "canvas": "canvas" }; if (file_extension in extensions) { return "dn-f-" + extensions[file_extension]; } else { return "dn-f-other"; } } dnSetView(view) { const divElements = [this._VIEW_DASHBOARD, this._VIEW_NAVIGATOR]; const topNavBtns = [this._BTN_DASHBOARD, this._BTN_NAVIGATOR]; divElements.forEach((el) => { el.classList.add("dn-display-none"); el.classList.remove("dn-flex"); }); topNavBtns.forEach((btn) => btn.classList.remove("mod-cta")); switch (view) { case 1: this._VIEW_DASHBOARD.classList.remove("dn-display-none"); this._VIEW_DASHBOARD.classList.add("dn-flex"); this._BTN_DASHBOARD.classList.add("mod-cta"); this.dnHideTopRightNav(); break; case 2: this._VIEW_NAVIGATOR.classList.remove("dn-display-none"); this._VIEW_NAVIGATOR.classList.add("dn-flex"); this._BTN_NAVIGATOR.classList.add("mod-cta"); this.dnShowTopRightNav(); break; default: this._VIEW_DASHBOARD.classList.remove("dn-display-none"); this._VIEW_DASHBOARD.classList.add("dn-flex"); this._BTN_DASHBOARD.classList.add("mod-cta"); this.dnHideTopRightNav(); } } dnShowTopRightNav() { this._SELECT_SORT.classList.remove("dn-display-none"); this._SELECT_TABLE_LAYOUT.classList.remove("dn-display-none"); this.labelLayout.classList.remove("dn-display-none"); this.labelSort.classList.remove("dn-display-none"); } dnHideTopRightNav() { this._SELECT_SORT.classList.add("dn-display-none"); this._SELECT_TABLE_LAYOUT.classList.add("dn-display-none"); this.labelLayout.classList.add("dn-display-none"); this.labelSort.classList.add("dn-display-none"); } dnSetSelectSortValue(val) { if (this.dnIsValidSort(val)) { this.selected_sort_value = val; this._SELECT_SORT.value = this.selected_sort_value; } } dnSetSelectLayoutValue(val) { if (this.dnIsValidLayout(val)) { this._SELECT_TABLE_LAYOUT.value = val; this.dnSelectTableLayout(); } } dnOpenFileAlt(f, evt) { if (!evt || typeof evt !== "object" || !(f instanceof import_obsidian2.TFile)) { return; } try { if (evt.button === 0 && (evt.ctrlKey || evt.metaKey)) { this.app.workspace.getLeaf("tab").openFile(f); } else if (evt.button === 1) { this.app.workspace.getLeaf("tab").openFile(f); } else if (evt.button === 0) { this.dnOpenFile(f); } else if (evt.button === 2 && !(evt.target instanceof HTMLTableCellElement)) { evt.preventDefault(); this.dnGenerateContextMenu(evt, f); } } catch (er) { return; } } dnOpenFile(file) { this.app.workspace.getLeaf(false).openFile(file); this.close(); } dnHandleClick(evt, file) { if (!evt || typeof evt !== "object" || !(file instanceof import_obsidian2.TFile)) { return; } this.dnSelectTableRow(evt); if (evt.button === 2) { evt.preventDefault(); this.dnGenerateContextMenu(evt, file); } } dnHandleDblClick(evt, file) { if (!evt || typeof evt !== "object" || !(file instanceof import_obsidian2.TFile)) { return; } evt.preventDefault(); this.dnSelectTableRow(evt); this.dnOpenFile(file); } dnSelectTableLayout() { const val = this._SELECT_TABLE_LAYOUT.value; if (this._TABLE_LAYOUTS.includes(val)) { const tbl = document.getElementById("dn-table"); this._TABLE_LAYOUTS.forEach((layout) => tbl == null ? void 0 : tbl.classList.remove(layout)); tbl == null ? void 0 : tbl.classList.add(val); this.selected_table_layout = val; } } dnSelectTableRow(evt) { if (!evt || typeof evt !== "object") { return; } if (evt.target instanceof HTMLTableCellElement) { const allTr = document.querySelectorAll("#dn-table tr"); allTr.forEach((row) => row.classList.remove("tbl-selected")); const clickedTr = evt.target.parentElement; clickedTr.classList.add("tbl-selected"); } } dnGenerateContextMenu(evt, file) { this._DN_CTX_MENU = new import_obsidian2.Menu(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open").setIcon("mouse-pointer-2").onClick(() => { this.app.workspace.getLeaf(false).openFile(file); this.close(); }) ); this._DN_CTX_MENU.addSeparator(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open in new tab").setIcon("file-plus").onClick(() => { this.app.workspace.getLeaf("tab").openFile(file); this.close(); }) ); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open to the right").setIcon("separator-vertical").onClick(() => { this.app.workspace.getLeaf("split").openFile(file); this.close(); }) ); this._DN_CTX_MENU.addItem( (item) => item.setTitle("Open in new window").setIcon("picture-in-picture-2").onClick(() => { this.app.workspace.getLeaf("window").openFile(file); }) ); this._DN_CTX_MENU.addSeparator(); this._DN_CTX_MENU.addItem( (item) => item.setTitle("File properties").setIcon("file-cog").onClick(() => { const mdFileProps = new import_obsidian2.Modal(this.app); mdFileProps.contentEl.createEl("h4", { text: "Properties" }); const propFileName = mdFileProps.contentEl.createEl("div"); propFileName.createEl("span", { text: "File name: ", cls: "dn-properties" }); propFileName.createEl("span", { text: file.basename }); mdFileProps.contentEl.createEl("br"); const propFileExt = mdFileProps.contentEl.createEl("div"); propFileExt.createEl("span", { text: "Extension: ", cls: "dn-properties" }); propFileExt.createEl("span", { text: file.extension, cls: "nav-file-tag" }); mdFileProps.contentEl.createEl("br"); const propFilePath = mdFileProps.contentEl.createEl("div"); propFilePath.createEl("span", { text: "Path: ", cls: "dn-properties" }); propFilePath.createEl("span", { text: getFolderStructure(file.path) }); mdFileProps.contentEl.createEl("br"); const propFileSize = mdFileProps.contentEl.createEl("div"); propFileSize.createEl("span", { text: "Size: ", cls: "dn-properties" }); propFileSize.createEl("span", { text: formatFileSize(file.stat.size) + " bytes" }); mdFileProps.contentEl.createEl("br"); const propDateCreated = mdFileProps.contentEl.createEl("div"); propDateCreated.createEl("span", { text: "Created: ", cls: "dn-properties" }); propDateCreated.createEl("span", { text: (0, import_obsidian3.moment)(file.stat.ctime).format(this.date_format) }); mdFileProps.contentEl.createEl("br"); const propDateModified = mdFileProps.contentEl.createEl("div"); propDateModified.createEl("span", { text: "Modified: ", cls: "dn-properties" }); propDateModified.createEl("span", { text: (0, import_obsidian3.moment)(file.stat.mtime).format(this.date_format) }); mdFileProps.contentEl.createEl("br"); const propTags = mdFileProps.contentEl.createEl("div"); const curTags = this.dnGetTagsPerFile(file); propTags.createEl("span", { text: "Tag(s): ", cls: "dn-properties" }); if (curTags) { const tags = curTags.split(" "); for (let i = 0, len = tags.length; i < len; i++) { propTags.createEl("a", { text: tags[i], cls: "dn-tag" }).onClickEvent((evt2) => { mdFileProps.close(); this._INPUT_SEARCH.value = tags[i]; this.dnSearchVault(this._INPUT_SEARCH.value); }); } ; } else { propTags.createEl("span", { text: "No tags" }); } mdFileProps.contentEl.createEl("br"); mdFileProps.contentEl.createEl("hr"); const divBottom = mdFileProps.contentEl.createEl("div", { cls: "dn-div-bottom-properties" }); const btnCloseProps = divBottom.createEl("button", { text: "Ok", cls: "dn-btn-close-properties" }); btnCloseProps.onClickEvent(() => { mdFileProps.close(); }); mdFileProps.open(); }) ); this._DN_CTX_MENU.showAtMouseEvent(evt); } onClose() { const { contentEl } = this; contentEl.empty(); if (this._INPUT_SEARCH && this._INPUT_SEARCH.removeEventListener) { this._INPUT_SEARCH.removeEventListener("input", (0, import_obsidian2.debounce)(() => this.dnSearchVault(this._INPUT_SEARCH.value), 300, true)); } this._th1.removeEventListener("dblclick", () => this.dnAlternateSortColumn("name")); this._th2.removeEventListener("dblclick", () => this.dnAlternateSortColumn("path")); this._th3.removeEventListener("dblclick", () => this.dnAlternateSortColumn("size")); this._th4.removeEventListener("dblclick", () => this.dnAlternateSortColumn("modified")); this._SELECT_SORT.removeEventListener("change", () => { this.dnSortColumnWithSelect(); }); if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } } }; // src/main.ts var DEFAULT_SETTINGS = { default_view: 1, font_size: 16, selected_table_layout: "dn-tbl-default", date_format: "YYYY-MM-DD HH:mm", files_per_page: 20, num_recent_files: 5, excluded_ext: "", excluded_path: "", color_notes: "#bf48ff", color_images: "#007fff", color_canvas: "#ff7f28", color_videos: "#d34848", color_audios: "#bfbf00", color_pdf: "#00a300", color_other: "#828282", colored_files: false }; var DNPlugin = class extends import_obsidian4.Plugin { async onload() { await this.loadSettings(); this._DN_MODAL = new DNModal(this.app); this._DN_MODAL.default_view = this.settings.default_view; this._DN_MODAL.date_format = this.settings.date_format; this._DN_MODAL.num_recent_files = this.settings.num_recent_files; this._DN_MODAL.files_per_page = this.settings.files_per_page; this._DN_MODAL.selected_table_layout = this.settings.selected_table_layout; this._DN_MODAL.excluded_extensions = this.dnGetExcludedExtensions(this.settings.excluded_ext); this._DN_MODAL.excluded_folders = this.dnGetExcludedFolders(this.settings.excluded_path); this.dnSetFontSize(this.settings.font_size); this._DN_MODAL.colored_files = this.settings.colored_files; this._DN_MODAL.color_notes = this.settings.color_notes; this._DN_MODAL.color_canvas = this.settings.color_canvas; this._DN_MODAL.color_images = this.settings.color_images; this._DN_MODAL.color_videos = this.settings.color_videos; this._DN_MODAL.color_audios = this.settings.color_audios; this._DN_MODAL.color_pdf = this.settings.color_pdf; this._DN_MODAL.color_other = this.settings.color_other; this.addRibbonIcon("gauge", "Open dashboard navigator", (evt) => { this._DN_MODAL.default_view = this.settings.default_view; this._DN_MODAL.open(); }); this.addCommand({ id: "activate", name: "Open", callback: () => { this._DN_MODAL.default_view = this.settings.default_view; this._DN_MODAL.open(); } }); this.addCommand({ id: "dashboard", name: "Open dashboard", callback: () => { this._DN_MODAL.default_view = 1; this._DN_MODAL.open(); } }); this.addCommand({ id: "navigator", name: "Open navigator", callback: () => { this._DN_MODAL.default_view = 2; this._DN_MODAL.open(); } }); this.addSettingTab(new DNSettingTab(this.app, this)); } dnGetExcludedFolders(foldersString) { if (foldersString === "") { return []; } const folders = foldersString.split(",").map((folder) => folder.trim()); return folders.map((folder) => folder.replace(/^\/|\/$|\.\./g, "")).filter((folder) => folder !== ""); } dnSetFontSize(val) { if (val >= 12 || val <= 24) { const styles = getComputedStyle(document.body); const fontSize = styles.getPropertyValue("--dn-font-size"); document.body.style.setProperty("--dn-font-size", val.toString() + "px"); } } dnGetExcludedExtensions(excluded_ext) { if (excluded_ext === "") { return []; } return excluded_ext.split(",").map((extension) => extension.trim()); } onunload() { } async loadSettings() { this.settings = Object.assign( {}, DEFAULT_SETTINGS, await this.loadData() ); } async saveSettings() { await this.saveData(this.settings); } }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9kbi50cyIsICJzcmMvdXRpbHMvZm9ybWF0LnRzIiwgInNyYy91dGlscy9waWVjaGFydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgRE5TZXR0aW5nVGFiIH0gZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgeyBETk1vZGFsIH0gZnJvbSAnLi9kbic7XG5cbmludGVyZmFjZSBETlNldHRpbmdzIHtcblx0ZGVmYXVsdF92aWV3OiBudW1iZXI7XG5cdGZvbnRfc2l6ZTogbnVtYmVyO1xuXHRzZWxlY3RlZF90YWJsZV9sYXlvdXQ6IHN0cmluZztcblx0ZGF0ZV9mb3JtYXQ6IHN0cmluZztcblx0ZmlsZXNfcGVyX3BhZ2U6IG51bWJlcjtcblx0bnVtX3JlY2VudF9maWxlczogbnVtYmVyO1xuXHRleGNsdWRlZF9leHQ6IHN0cmluZztcblx0ZXhjbHVkZWRfcGF0aDogc3RyaW5nO1xuXHRjb2xvcl9ub3Rlczogc3RyaW5nO1xuXHRjb2xvcl9jYW52YXM6IHN0cmluZztcblx0Y29sb3JfaW1hZ2VzOiBzdHJpbmc7XG5cdGNvbG9yX3ZpZGVvczogc3RyaW5nO1xuXHRjb2xvcl9hdWRpb3M6IHN0cmluZztcblx0Y29sb3JfcGRmOiBzdHJpbmc7XG5cdGNvbG9yX290aGVyOiBzdHJpbmc7XG5cdGNvbG9yZWRfZmlsZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBETlNldHRpbmdzID0ge1xuXHRkZWZhdWx0X3ZpZXc6IDEsXG5cdGZvbnRfc2l6ZTogMTYsXG5cdHNlbGVjdGVkX3RhYmxlX2xheW91dDogJ2RuLXRibC1kZWZhdWx0Jyxcblx0ZGF0ZV9mb3JtYXQ6ICdZWVlZLU1NLUREIEhIOm1tJyxcblx0ZmlsZXNfcGVyX3BhZ2U6IDIwLFxuXHRudW1fcmVjZW50X2ZpbGVzOiA1LFxuXHRleGNsdWRlZF9leHQ6ICcnLFxuXHRleGNsdWRlZF9wYXRoOiAnJyxcblx0Y29sb3Jfbm90ZXM6ICcjYmY0OGZmJyxcblx0Y29sb3JfaW1hZ2VzOiAnIzAwN2ZmZicsXG5cdGNvbG9yX2NhbnZhczogJyNmZjdmMjgnLFxuXHRjb2xvcl92aWRlb3M6ICcjZDM0ODQ4Jyxcblx0Y29sb3JfYXVkaW9zOiAnI2JmYmYwMCcsXG5cdGNvbG9yX3BkZjogJyMwMGEzMDAnLFxuXHRjb2xvcl9vdGhlcjogJyM4MjgyODInLFxuXHRjb2xvcmVkX2ZpbGVzOiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBETlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cblx0X0ROX01PREFMOiBETk1vZGFsO1xuXG5cdHNldHRpbmdzOiBETlNldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cblx0XHR0aGlzLl9ETl9NT0RBTCA9IG5ldyBETk1vZGFsKHRoaXMuYXBwKTtcblxuXHRcdC8vIFNldCBtb2RhbCBzZXR0aW5nc1xuXHRcdHRoaXMuX0ROX01PREFMLmRlZmF1bHRfdmlldyA9IHRoaXMuc2V0dGluZ3MuZGVmYXVsdF92aWV3O1xuXHRcdHRoaXMuX0ROX01PREFMLmRhdGVfZm9ybWF0ID0gdGhpcy5zZXR0aW5ncy5kYXRlX2Zvcm1hdDtcblx0XHR0aGlzLl9ETl9NT0RBTC5udW1fcmVjZW50X2ZpbGVzID0gdGhpcy5zZXR0aW5ncy5udW1fcmVjZW50X2ZpbGVzO1xuXHRcdHRoaXMuX0ROX01PREFMLmZpbGVzX3Blcl9wYWdlID0gdGhpcy5zZXR0aW5ncy5maWxlc19wZXJfcGFnZTtcblx0XHR0aGlzLl9ETl9NT0RBTC5zZWxlY3RlZF90YWJsZV9sYXlvdXQgPSB0aGlzLnNldHRpbmdzLnNlbGVjdGVkX3RhYmxlX2xheW91dDtcblx0XHR0aGlzLl9ETl9NT0RBTC5leGNsdWRlZF9leHRlbnNpb25zID0gdGhpcy5kbkdldEV4Y2x1ZGVkRXh0ZW5zaW9ucyh0aGlzLnNldHRpbmdzLmV4Y2x1ZGVkX2V4dCk7XG5cdFx0dGhpcy5fRE5fTU9EQUwuZXhjbHVkZWRfZm9sZGVycyA9IHRoaXMuZG5HZXRFeGNsdWRlZEZvbGRlcnModGhpcy5zZXR0aW5ncy5leGNsdWRlZF9wYXRoKTtcblx0XHR0aGlzLmRuU2V0Rm9udFNpemUodGhpcy5zZXR0aW5ncy5mb250X3NpemUpO1xuXHRcdC8vIFNldCBjb2xvcnNcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcmVkX2ZpbGVzID0gdGhpcy5zZXR0aW5ncy5jb2xvcmVkX2ZpbGVzO1xuXHRcdHRoaXMuX0ROX01PREFMLmNvbG9yX25vdGVzID0gdGhpcy5zZXR0aW5ncy5jb2xvcl9ub3Rlcztcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl9jYW52YXMgPSB0aGlzLnNldHRpbmdzLmNvbG9yX2NhbnZhcztcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl9pbWFnZXMgPSB0aGlzLnNldHRpbmdzLmNvbG9yX2ltYWdlcztcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl92aWRlb3MgPSB0aGlzLnNldHRpbmdzLmNvbG9yX3ZpZGVvcztcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl9hdWRpb3MgPSB0aGlzLnNldHRpbmdzLmNvbG9yX2F1ZGlvcztcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl9wZGYgPSB0aGlzLnNldHRpbmdzLmNvbG9yX3BkZjtcblx0XHR0aGlzLl9ETl9NT0RBTC5jb2xvcl9vdGhlciA9IHRoaXMuc2V0dGluZ3MuY29sb3Jfb3RoZXI7XG5cblx0XHR0aGlzLmFkZFJpYmJvbkljb24oJ2dhdWdlJywgJ09wZW4gZGFzaGJvYXJkIG5hdmlnYXRvcicsIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuX0ROX01PREFMLmRlZmF1bHRfdmlldyA9IHRoaXMuc2V0dGluZ3MuZGVmYXVsdF92aWV3O1xuXHRcdFx0dGhpcy5fRE5fTU9EQUwub3BlbigpO1xuXHRcdH0pO1xuXG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICdhY3RpdmF0ZScsXG5cdFx0XHRuYW1lOiAnT3BlbicsXG5cdFx0XHRjYWxsYmFjazogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9ETl9NT0RBTC5kZWZhdWx0X3ZpZXcgPSB0aGlzLnNldHRpbmdzLmRlZmF1bHRfdmlldztcblx0XHRcdFx0dGhpcy5fRE5fTU9EQUwub3BlbigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiAnZGFzaGJvYXJkJyxcblx0XHRcdG5hbWU6ICdPcGVuIGRhc2hib2FyZCcsXG5cdFx0XHRjYWxsYmFjazogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9ETl9NT0RBTC5kZWZhdWx0X3ZpZXcgPSAxO1xuXHRcdFx0XHR0aGlzLl9ETl9NT0RBTC5vcGVuKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICduYXZpZ2F0b3InLFxuXHRcdFx0bmFtZTogJ09wZW4gbmF2aWdhdG9yJyxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuX0ROX01PREFMLmRlZmF1bHRfdmlldyA9IDI7XG5cdFx0XHRcdHRoaXMuX0ROX01PREFMLm9wZW4oKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgRE5TZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0fVxuXG5cdGRuR2V0RXhjbHVkZWRGb2xkZXJzKGZvbGRlcnNTdHJpbmc6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRpZiAoZm9sZGVyc1N0cmluZyA9PT0gJycpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBmb2xkZXJzID0gZm9sZGVyc1N0cmluZy5zcGxpdCgnLCcpLm1hcChmb2xkZXIgPT4gZm9sZGVyLnRyaW0oKSk7XG5cblx0XHRyZXR1cm4gZm9sZGVycy5tYXAoZm9sZGVyID0+IGZvbGRlci5yZXBsYWNlKC9eXFwvfFxcLyR8XFwuXFwuL2csICcnKSkuZmlsdGVyKGZvbGRlciA9PiBmb2xkZXIgIT09ICcnKTtcblx0fVxuXG5cdGRuU2V0Rm9udFNpemUodmFsOiBudW1iZXIpIHtcblx0XHRpZiAodmFsID49IDEyIHx8IHZhbCA8PSAyNCkge1xuXHRcdFx0Y29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcblx0XHRcdGNvbnN0IGZvbnRTaXplID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJy0tZG4tZm9udC1zaXplJyk7XG5cdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLWZvbnQtc2l6ZScsIHZhbC50b1N0cmluZygpICsgJ3B4Jyk7XG5cdFx0fVxuXHR9XG5cblx0ZG5HZXRFeGNsdWRlZEV4dGVuc2lvbnMoZXhjbHVkZWRfZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKGV4Y2x1ZGVkX2V4dCA9PT0gJycpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXhjbHVkZWRfZXh0LnNwbGl0KCcsJykubWFwKGV4dGVuc2lvbiA9PiBleHRlbnNpb24udHJpbSgpKTtcblx0fVxuXG5cdG9udW5sb2FkKCkge1xuXG5cdH1cblxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7fSxcblx0XHRcdERFRkFVTFRfU0VUVElOR1MsXG5cdFx0XHRhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn1cblxuXG5cbiIsICJpbXBvcnQgeyBBcHAsIENvbG9yQ29tcG9uZW50LCBEcm9wZG93bkNvbXBvbmVudCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgU2xpZGVyQ29tcG9uZW50LCBUZXh0Q29tcG9uZW50LCBUb2dnbGVDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgRE5QbHVnaW4gZnJvbSAnLi9tYWluJztcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL21haW4nO1xuXG5leHBvcnQgY2xhc3MgRE5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cbiAgICBwbHVnaW46IEROUGx1Z2luO1xuICAgIGRyb3Bkb3duRGF0ZUZvcm1hdDogRHJvcGRvd25Db21wb25lbnQ7XG4gICAgZHJvcGRvd25GaWxlc1BlclBhZ2U6IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIGRyb3Bkb3duRGVmYXVsdFZpZXc6IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIGRyb3Bkb3duVGFibGVMYXlvdXQ6IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIGRyb3Bkb3duUmVjZW50RmlsZXM6IERyb3Bkb3duQ29tcG9uZW50O1xuICAgIHNsaWRlckZvbnRTaXplOiBTbGlkZXJDb21wb25lbnQ7XG4gICAgdGV4dEV4Y2x1ZGVkRXh0ZW5zaW9uczogVGV4dENvbXBvbmVudDtcbiAgICB0ZXh0RXhjbHVkZWRGb2xkZXJzOiBUZXh0Q29tcG9uZW50O1xuICAgIGNvbG9yQ29tcE5vdGVzOiBDb2xvckNvbXBvbmVudDtcbiAgICBjb2xvckNvbXBDYW52YXM6IENvbG9yQ29tcG9uZW50O1xuICAgIGNvbG9yQ29tcEltYWdlczogQ29sb3JDb21wb25lbnQ7XG4gICAgY29sb3JDb21wVmlkZW9zOiBDb2xvckNvbXBvbmVudDtcbiAgICBjb2xvckNvbXBBdWRpb3M6IENvbG9yQ29tcG9uZW50O1xuICAgIGNvbG9yQ29tcFBkZjogQ29sb3JDb21wb25lbnQ7XG4gICAgY29sb3JDb21wT3RoZXI6IENvbG9yQ29tcG9uZW50O1xuICAgIHRvZ2dsZUNvbG9yZWRGaWxlczogVG9nZ2xlQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRE5QbHVnaW4pIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnT3BlbiBkYXNoYm9hcmQgbmF2aWdhdG9yJylcbiAgICAgICAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRCdXR0b25UZXh0KCdPcGVuJylcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAoJ09wZW4gZGFzaGJvYXJkIG5hdmlnYXRvcicpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKChldnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZhdWx0IEROIHZpZXc6IERhc2hib2FyZCBvciBOYXZpZ2F0b3JcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGVmYXVsdCB2aWV3JylcbiAgICAgICAgICAgIC5zZXREZXNjKCdTZWxlY3QgdmlldyB3aGVuIG9wZW5pbmcgd2luZG93JylcbiAgICAgICAgICAgIC5hZGREcm9wZG93bihzZWwgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25EZWZhdWx0VmlldyA9IHNlbDtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCcxJywgJ0Rhc2hib2FyZCcpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzInLCAnTmF2aWdhdG9yJyk7XG4gICAgICAgICAgICAgICAgc2VsLm9uQ2hhbmdlKGFzeW5jICh2YWw6IHN0cmluZykgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRfdmlldyA9IHBhcnNlSW50KHZhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRlZmF1bHRfdmlldyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRfdmlldztcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgc2VsLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRfdmlldy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pLmFkZEV4dHJhQnV0dG9uKChidG4pID0+IHtcbiAgICAgICAgICAgICAgICBidG4uc2V0SWNvbigncm90YXRlLWNjdycpO1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRUb29sdGlwKCdSZXN0b3JlIGRlZmF1bHQnKVxuICAgICAgICAgICAgICAgIGJ0bi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkRlZmF1bHRWaWV3LnNldFZhbHVlKERFRkFVTFRfU0VUVElOR1MuZGVmYXVsdF92aWV3LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0X3ZpZXcgPSBERUZBVUxUX1NFVFRJTkdTLmRlZmF1bHRfdmlldztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRlZmF1bHRfdmlldyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRfdmlldztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBUYWJsZSBsYXlvdXRcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnTmF2aWdhdG9yIHRhYmxlIGxheW91dCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2VsZWN0IHRhYmxlIHJlc3VsdHMgbGF5b3V0JylcbiAgICAgICAgICAgIC5hZGREcm9wZG93bihzZWwgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25UYWJsZUxheW91dCA9IHNlbDtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdkbi10YmwtZGVmYXVsdCcsICdEZWZhdWx0Jyk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZE9wdGlvbignZG4tdGJsLXJvdycsICdSb3cgc3RyaXBlZCcpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJ2RuLXRibC1jb2x1bW4nLCAnQ29sdW1uIHN0cmlwZWQnKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdkbi10YmwtYm9yZGVyZWQnLCAnQm9yZGVyZWQnKTtcbiAgICAgICAgICAgICAgICBzZWwub25DaGFuZ2UoYXN5bmMgKHZhbDogc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc2VsZWN0ZWRfdGFibGVfbGF5b3V0ID0gdmFsO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5zZWxlY3RlZF90YWJsZV9sYXlvdXQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RlZF90YWJsZV9sYXlvdXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHNlbC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RlZF90YWJsZV9sYXlvdXQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25UYWJsZUxheW91dC5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLnNlbGVjdGVkX3RhYmxlX2xheW91dC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc2VsZWN0ZWRfdGFibGVfbGF5b3V0ID0gREVGQVVMVF9TRVRUSU5HUy5zZWxlY3RlZF90YWJsZV9sYXlvdXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5zZWxlY3RlZF90YWJsZV9sYXlvdXQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RlZF90YWJsZV9sYXlvdXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGF0ZSBmb3JtYXRcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRGF0ZSBmb3JtYXQnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1NlbGVjdCBkYXRlIGZvcm1hdCcpXG4gICAgICAgICAgICAuYWRkRHJvcGRvd24oc2VsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duRGF0ZUZvcm1hdCA9IHNlbDtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdZWVlZLU1NLUREIEhIOm1tOnNzJywgJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdZWVlZLU1NLUREIEhIOm1tJywgJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdZWVlZLU1NLUREJywgJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdERC9NTS9ZWVlZIEhIOm1tOnNzJywgJ0REL01NL1lZWVkgSEg6bW06c3MnKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdERC9NTS9ZWVlZIEhIOm1tJywgJ0REL01NL1lZWVkgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCdERC9NTS9ZWVlZJywgJ0REL01NL1lZWVknKTtcbiAgICAgICAgICAgICAgICBzZWwub25DaGFuZ2UoYXN5bmMgKHZhbDogc3RyaW5nKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0ZV9mb3JtYXQgPSB2YWw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRhdGVfZm9ybWF0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0ZV9mb3JtYXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHNlbC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRlX2Zvcm1hdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pLmFkZEV4dHJhQnV0dG9uKChidG4pID0+IHtcbiAgICAgICAgICAgICAgICBidG4uc2V0SWNvbigncm90YXRlLWNjdycpO1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRUb29sdGlwKCdSZXN0b3JlIGRlZmF1bHQnKVxuICAgICAgICAgICAgICAgIGJ0bi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkRhdGVGb3JtYXQuc2V0VmFsdWUoREVGQVVMVF9TRVRUSU5HUy5kYXRlX2Zvcm1hdC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGF0ZV9mb3JtYXQgPSBERUZBVUxUX1NFVFRJTkdTLmRhdGVfZm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZGF0ZV9mb3JtYXQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kYXRlX2Zvcm1hdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBGb250IHNpemVcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRm9udCBzaXplJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdTZWxlY3QgZm9udCBzaXplIGluIHBpeGVscyBmb3IgcmVzdWx0cyBhbmQgbGlua3MnKVxuICAgICAgICAgICAgLmFkZFNsaWRlcigoc2xpKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJGb250U2l6ZSA9IHNsaTtcbiAgICAgICAgICAgICAgICBsZXQgc2xpZGVyX3ZhbDogbnVtYmVyO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb250X3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVyX3ZhbCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbnRfc2l6ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzbGlkZXJfdmFsID0gREVGQVVMVF9TRVRUSU5HUy5mb250X3NpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNsaS5zZXREeW5hbWljVG9vbHRpcCgpO1xuICAgICAgICAgICAgICAgIHNsaS5zZXRMaW1pdHMoMTIsIDI0LCAxKTtcbiAgICAgICAgICAgICAgICBzbGkuc2V0VmFsdWUoc2xpZGVyX3ZhbCk7XG4gICAgICAgICAgICAgICAgc2xpLm9uQ2hhbmdlKCh2YWw6IG51bWJlcikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbnRfc2l6ZSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZG5TZXRGb250U2l6ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckZvbnRTaXplLnNldFZhbHVlKERFRkFVTFRfU0VUVElOR1MuZm9udF9zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9udF9zaXplID0gREVGQVVMVF9TRVRUSU5HUy5mb250X3NpemU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRuU2V0Rm9udFNpemUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9udF9zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXN1bHRzL2ZpbGVzIHBlciBwYWdlXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0ZpbGVzIHBlciBwYWdlJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdOdW1iZXIgb2YgcmVzdWx0cyBwZXIgcGFnZScpXG4gICAgICAgICAgICAuYWRkRHJvcGRvd24oc2VsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duRmlsZXNQZXJQYWdlID0gc2VsO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzEwJywgJzEwJyk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZE9wdGlvbignMjAnLCAnMjAnKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkT3B0aW9uKCczMCcsICczMCcpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzUwJywgJzUwJyk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZE9wdGlvbignMTAwJywgJzEwMCcpO1xuICAgICAgICAgICAgICAgIHNlbC5vbkNoYW5nZShhc3luYyAodmFsOiBzdHJpbmcpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlc19wZXJfcGFnZSA9IHBhcnNlSW50KHZhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmZpbGVzX3Blcl9wYWdlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuZmlsZXNfcGVyX3BhZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHNlbC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlc19wZXJfcGFnZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pLmFkZEV4dHJhQnV0dG9uKChidG4pID0+IHtcbiAgICAgICAgICAgICAgICBidG4uc2V0SWNvbigncm90YXRlLWNjdycpO1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRUb29sdGlwKCdSZXN0b3JlIGRlZmF1bHQnKVxuICAgICAgICAgICAgICAgIGJ0bi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkZpbGVzUGVyUGFnZS5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmZpbGVzX3Blcl9wYWdlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maWxlc19wZXJfcGFnZSA9IERFRkFVTFRfU0VUVElOR1MuZmlsZXNfcGVyX3BhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5maWxlc19wZXJfcGFnZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmZpbGVzX3Blcl9wYWdlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY2VudCBmaWxlcyBieSB0eXBlXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ1JlY2VudCBmaWxlcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnTnVtYmVyIG9mIHJlY2VudCBmaWxlcyBwZXIgY2F0ZWdvcnknKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKHNlbCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93blJlY2VudEZpbGVzID0gc2VsO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzMnLCAnMycpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzQnLCAnNCcpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzUnLCAnNScpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRPcHRpb24oJzEwJywgJzEwJyk7XG4gICAgICAgICAgICAgICAgc2VsLm9uQ2hhbmdlKGFzeW5jICh2YWw6IHN0cmluZykgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm51bV9yZWNlbnRfZmlsZXMgPSBwYXJzZUludCh2YWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5udW1fcmVjZW50X2ZpbGVzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MubnVtX3JlY2VudF9maWxlcztcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgc2VsLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm51bV9yZWNlbnRfZmlsZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25SZWNlbnRGaWxlcy5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLm51bV9yZWNlbnRfZmlsZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm51bV9yZWNlbnRfZmlsZXMgPSBERUZBVUxUX1NFVFRJTkdTLm51bV9yZWNlbnRfZmlsZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5udW1fcmVjZW50X2ZpbGVzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MubnVtX3JlY2VudF9maWxlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeGNsdWRlZCBmaWxlIGV4dGVuc2lvbnNcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZWQgZmlsZSBleHRlbnNpb25zJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdGaWxlIGV4dGVuc2lvbnMgdG8gZXhjbHVkZSwgc2VwYXJhdGVkIGJ5IGNvbW1hcycpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dEV4Y2x1ZGVkRXh0ZW5zaW9ucyA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJGaWxlIGV4dGVuc2lvbnMgdG8gZXhjbHVkZVwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRfZXh0KVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRfZXh0ID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmV4Y2x1ZGVkX2V4dGVuc2lvbnMgPSB0aGlzLnBsdWdpbi5kbkdldEV4Y2x1ZGVkRXh0ZW5zaW9ucyh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dEV4Y2x1ZGVkRXh0ZW5zaW9ucy5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVkX2V4dCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZXhjbHVkZWRfZXh0ZW5zaW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4Y2x1ZGVkIGZvbGRlcnNcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZWQgZm9sZGVycycpXG4gICAgICAgICAgICAuc2V0RGVzYygnTGlzdCBvZiBmb2xkZXIgcGF0aHMgdG8gZXhjbHVkZSwgc2VwYXJhdGVkIGJ5IGNvbW1hcycpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dEV4Y2x1ZGVkRm9sZGVycyA9IHRleHQ7XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJGb2xkZXIgcGF0aHMgdG8gZXhjbHVkZVwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRfcGF0aClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVkX3BhdGggPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZXhjbHVkZWRfZm9sZGVycyA9IHRoaXMucGx1Z2luLmRuR2V0RXhjbHVkZWRGb2xkZXJzKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLmFkZEV4dHJhQnV0dG9uKChidG4pID0+IHtcbiAgICAgICAgICAgICAgICBidG4uc2V0SWNvbigncm90YXRlLWNjdycpO1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRUb29sdGlwKCdSZXN0b3JlIGRlZmF1bHQnKVxuICAgICAgICAgICAgICAgIGJ0bi5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0RXhjbHVkZWRGb2xkZXJzLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRfcGF0aCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZXhjbHVkZWRfZm9sZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRvZ2dsZSBjb2xvcmVkIGZpbGVzXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ1RvZ2dsZSBjb2xvcmVkIGZpbGVzJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdUdXJuIG9uL29mZiBjb2xvcmVkIGZpbGVzJylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29sb3JlZEZpbGVzID0gdG9nZ2xlO1xuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29sb3JlZF9maWxlcylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yZWRfZmlsZXMgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JlZF9maWxlcyA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblRvZ2dsZUNvbG9yZWRGaWxlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29sb3JlZEZpbGVzLnNldFZhbHVlKERFRkFVTFRfU0VUVElOR1MuY29sb3JlZF9maWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yZWRfZmlsZXMgPSBERUZBVUxUX1NFVFRJTkdTLmNvbG9yZWRfZmlsZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5jb2xvcmVkX2ZpbGVzID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcmVkX2ZpbGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZG5Ub2dnbGVDb2xvcmVkRmlsZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyAxIENvbG9yIC0+IE5vdGVzXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0NvbG9yOiBOb3RlcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2Ygbm90ZXMnKVxuICAgICAgICAgICAgLmFkZENvbG9yUGlja2VyKChjb2xvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JDb21wTm90ZXMgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICBjb2xvclxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuY29sb3Jfbm90ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9ub3RlcyA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5jb2xvcl9ub3RlcyA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sb3JDb21wTm90ZXMuc2V0VmFsdWUoREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9ub3Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX25vdGVzID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9ub3RlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmNvbG9yX25vdGVzID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9ub3RlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMiBDb2xvciAtPiBDYW52YXNcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ29sb3I6IENhbnZhcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2YgY2FudmFzJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcENhbnZhcyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9jYW52YXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9jYW52YXMgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfY2FudmFzID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcENhbnZhcy5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmNvbG9yX2NhbnZhcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX2NhbnZhcyA9IERFRkFVTFRfU0VUVElOR1MuY29sb3JfY2FudmFzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfY2FudmFzID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9jYW52YXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMyBDb2xvciAtPiBJbWFnZXNcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ29sb3I6IEltYWdlcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2YgaW1hZ2VzJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcEltYWdlcyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9pbWFnZXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9pbWFnZXMgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfaW1hZ2VzID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcEltYWdlcy5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmNvbG9yX2ltYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX2ltYWdlcyA9IERFRkFVTFRfU0VUVElOR1MuY29sb3JfaW1hZ2VzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfaW1hZ2VzID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9pbWFnZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNCBDb2xvciAtPiBWaWRlb3NcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ29sb3I6IFZpZGVvcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2YgdmlkZW9zJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcFZpZGVvcyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl92aWRlb3MpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl92aWRlb3MgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfdmlkZW9zID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcFZpZGVvcy5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmNvbG9yX3ZpZGVvcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX3ZpZGVvcyA9IERFRkFVTFRfU0VUVElOR1MuY29sb3JfdmlkZW9zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfdmlkZW9zID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl92aWRlb3M7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNSBDb2xvciAtPiBBdWRpb3NcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ29sb3I6IEF1ZGlvcycpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2YgYXVkaW9zJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcEF1ZGlvcyA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9hdWRpb3MpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9hdWRpb3MgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfYXVkaW9zID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcEF1ZGlvcy5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmNvbG9yX2F1ZGlvcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX2F1ZGlvcyA9IERFRkFVTFRfU0VUVElOR1MuY29sb3JfYXVkaW9zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfYXVkaW9zID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9hdWRpb3M7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNiBDb2xvciAtPiBQREZcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQ29sb3I6IFBERicpXG4gICAgICAgICAgICAuc2V0RGVzYygnQ29sb3Igb2YgUERGIGZpbGVzJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcFBkZiA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9wZGYpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb2xvcl9wZGYgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfcGRmID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXh0cmFCdXR0b24oKGJ0bikgPT4ge1xuICAgICAgICAgICAgICAgIGJ0bi5zZXRJY29uKCdyb3RhdGUtY2N3Jyk7XG4gICAgICAgICAgICAgICAgYnRuLnNldFRvb2x0aXAoJ1Jlc3RvcmUgZGVmYXVsdCcpXG4gICAgICAgICAgICAgICAgYnRuLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcFBkZi5zZXRWYWx1ZShERUZBVUxUX1NFVFRJTkdTLmNvbG9yX3BkZik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX3BkZiA9IERFRkFVTFRfU0VUVElOR1MuY29sb3JfcGRmO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3JfcGRmID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9wZGY7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLl9ETl9NT0RBTC5kblNldEN1c3RvbUNvbG9ycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNyBDb2xvciAtPiBPdGhlciBmaWxlc1xuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdDb2xvcjogT3RoZXIgZmlsZXMnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0NvbG9yIG9mIG90aGVyIGZpbGVzJylcbiAgICAgICAgICAgIC5hZGRDb2xvclBpY2tlcigoY29sb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yQ29tcE90aGVyID0gY29sb3I7XG4gICAgICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX290aGVyKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuY29sb3Jfb3RoZXIgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuY29sb3Jfb3RoZXIgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5fRE5fTU9EQUwuZG5TZXRDdXN0b21Db2xvcnMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS5hZGRFeHRyYUJ1dHRvbigoYnRuKSA9PiB7XG4gICAgICAgICAgICAgICAgYnRuLnNldEljb24oJ3JvdGF0ZS1jY3cnKTtcbiAgICAgICAgICAgICAgICBidG4uc2V0VG9vbHRpcCgnUmVzdG9yZSBkZWZhdWx0JylcbiAgICAgICAgICAgICAgICBidG4ub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sb3JDb21wT3RoZXIuc2V0VmFsdWUoREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9vdGhlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbG9yX290aGVyID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9vdGhlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmNvbG9yX290aGVyID0gREVGQVVMVF9TRVRUSU5HUy5jb2xvcl9vdGhlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uX0ROX01PREFMLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBcHAsIGRlYm91bmNlLCBNZW51LCBNb2RhbCwgVEFic3RyYWN0RmlsZSwgVEZpbGUsIFRGb2xkZXIsIFdvcmtzcGFjZUxlYWYgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBmb3JtYXRGaWxlU2l6ZSwgZ2V0Rm9sZGVyU3RydWN0dXJlIH0gZnJvbSAnLi91dGlscy9mb3JtYXQnO1xuaW1wb3J0IHsgRE5QaWVDaGFydCB9IGZyb20gJy4vdXRpbHMvcGllY2hhcnQnO1xuaW1wb3J0IHsgbW9tZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgY2xhc3MgRE5Nb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0cHJpdmF0ZSBfZmlsZXM6IFRGaWxlW107XG5cdHByaXZhdGUgX2ZvbGRlcnM6IFRGb2xkZXJbXTtcblx0cHJpdmF0ZSBfbm90ZXM6IFRGaWxlW107XG5cdHByaXZhdGUgX3JlY2VudDogVEZpbGVbXTtcblx0cHJpdmF0ZSBfaW1hZ2VzOiBURmlsZVtdO1xuXHRwcml2YXRlIF9jYW52YXM6IFRGaWxlW107XG5cdHByaXZhdGUgX2F1ZGlvczogVEZpbGVbXTtcblx0cHJpdmF0ZSBfdmlkZW9zOiBURmlsZVtdO1xuXHRwcml2YXRlIF9wZGY6IFRGaWxlW107XG5cdHByaXZhdGUgX290aGVyOiBURmlsZVtdO1xuXHRwcml2YXRlIF9CVE5fREFTSEJPQVJEOiBIVE1MQnV0dG9uRWxlbWVudDtcblx0cHJpdmF0ZSBfQlROX05BVklHQVRPUjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cdHByaXZhdGUgX1ZJRVdfREFTSEJPQVJEOiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBfVklFV19OQVZJR0FUT1I6IEhUTUxFbGVtZW50O1xuXHRwcml2YXRlIF9JTlBVVF9TRUFSQ0g6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdHByaXZhdGUgX2RpdlNlYXJjaFJlc3VsdHM6IEhUTUxEaXZFbGVtZW50O1xuXHRwcml2YXRlIF9sZWFmOiBXb3Jrc3BhY2VMZWFmO1xuXHRwcml2YXRlIF9maWx0ZXJlZF9maWxlczogVEZpbGVbXTtcblx0cHJpdmF0ZSBfc29ydF9vcmRlcjogc3RyaW5nID0gJ2Rlc2MnO1xuXHRwcml2YXRlIF9zb3J0X2NvbHVtbjogc3RyaW5nID0gJ21vZGlmaWVkJztcblx0cHJpdmF0ZSBfdGgxOiBIVE1MVGFibGVDZWxsRWxlbWVudDtcblx0cHJpdmF0ZSBfdGgyOiBIVE1MVGFibGVDZWxsRWxlbWVudDtcblx0cHJpdmF0ZSBfdGgzOiBIVE1MVGFibGVDZWxsRWxlbWVudDtcblx0cHJpdmF0ZSBfdGg0OiBIVE1MVGFibGVDZWxsRWxlbWVudDtcblx0cHJpdmF0ZSBfdGg1OiBIVE1MVGFibGVDZWxsRWxlbWVudDtcblx0cHJpdmF0ZSBfdG90YWxfcGFnZXM6IG51bWJlcjtcblxuXHRwcml2YXRlIF9TRUxFQ1RfU09SVDogSFRNTFNlbGVjdEVsZW1lbnQ7XG5cdHByaXZhdGUgX1NFTEVDVF9UQUJMRV9MQVlPVVQ6IEhUTUxTZWxlY3RFbGVtZW50O1xuXG5cdHByaXZhdGUgX3NlbGVjdGVkX2NhdGVnb3J5OiBzdHJpbmcgPSAnJztcblx0cHJpdmF0ZSBfVEFCTEVfTEFZT1VUUzogc3RyaW5nW10gPSBbJ2RuLXRibC1kZWZhdWx0JywgJ2RuLXRibC1yb3cnLCAnZG4tdGJsLWNvbHVtbicsICdkbi10YmwtYm9yZGVyZWQnXTtcblx0c2VsZWN0ZWRfdGFibGVfbGF5b3V0OiBzdHJpbmcgPSAnZG4tdGJsLWRlZmF1bHQnO1xuXHRzZWxlY3RlZF9zb3J0X3ZhbHVlOiBzdHJpbmcgPSAnbW9kaWZpZWQtZGVzYyc7XG5cblx0bnVtX3JlY2VudF9maWxlczogbnVtYmVyID0gNTtcblx0ZmlsZXNfcGVyX3BhZ2U6IG51bWJlciA9IDIwO1xuXHRkYXRlX2Zvcm1hdDogc3RyaW5nID0gJ1lZWVktTU0tREQgSEg6bW0nO1xuXHRkZWZhdWx0X3ZpZXc6IG51bWJlciA9IDE7XG5cdGV4Y2x1ZGVkX2V4dGVuc2lvbnM6IHN0cmluZ1tdID0gW107XG5cdGV4Y2x1ZGVkX2ZvbGRlcnM6IHN0cmluZ1tdID0gW107XG5cdC8vIEZpbGUgY29sb3JzXG5cdGNvbG9yX25vdGVzOiBzdHJpbmcgPSAnI2JmNDhmZic7XG5cdGNvbG9yX2ltYWdlczogc3RyaW5nID0gJyMwMDdmZmYnO1xuXHRjb2xvcl9jYW52YXM6IHN0cmluZyA9ICcjZmY3ZjI4Jztcblx0Y29sb3JfdmlkZW9zOiBzdHJpbmcgPSAnI2QzNDg0OCc7XG5cdGNvbG9yX2F1ZGlvczogc3RyaW5nID0gJyNiZmJmMDAnO1xuXHRjb2xvcl9wZGY6IHN0cmluZyA9ICcjMDBhMzAwJztcblx0Y29sb3Jfb3RoZXI6IHN0cmluZyA9ICcjODI4MjgyJztcblx0Y29sb3JlZF9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdGxhYmVsTGF5b3V0OiBIVE1MU3BhbkVsZW1lbnQ7XG5cdGxhYmVsU29ydDogSFRNTFNwYW5FbGVtZW50O1xuXHRwcml2YXRlIHJlYWRvbmx5IGludGVyc2VjdGlvbk9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlcjtcblx0cHJpdmF0ZSBfRE5fQ1RYX01FTlU6IE1lbnU7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHApIHtcblx0XHRzdXBlcihhcHApO1xuXHRcdHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5kbkhhbmRsZUludGVyc2VjdGlvbik7XG5cdH1cblxuXHRhc3luYyBvbk9wZW4oKSB7XG5cblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblxuXHRcdHRoaXMuX2ZpbGVzID0gW107XG5cdFx0dGhpcy5fZm9sZGVycyA9IFtdO1xuXHRcdHRoaXMuX25vdGVzID0gW107XG5cdFx0dGhpcy5fcmVjZW50ID0gW107XG5cdFx0dGhpcy5faW1hZ2VzID0gW107XG5cdFx0dGhpcy5fY2FudmFzID0gW107XG5cdFx0dGhpcy5fYXVkaW9zID0gW107XG5cdFx0dGhpcy5fdmlkZW9zID0gW107XG5cdFx0dGhpcy5fcGRmID0gW107XG5cdFx0dGhpcy5fb3RoZXIgPSBbXTtcblxuXHRcdGNvbnN0IGxlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2U/LmdldE1vc3RSZWNlbnRMZWFmKCk7XG5cdFx0aWYgKGxlYWYgIT09IG51bGwpIHtcblx0XHRcdHRoaXMuX2xlYWYgPSBsZWFmO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRuRmlsZXNBbmRGb2xkZXJzOiBUQWJzdHJhY3RGaWxlW10gPSB0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpO1xuXHRcdGZvciAoY29uc3QgYWJzRiBvZiBkbkZpbGVzQW5kRm9sZGVycykge1xuXHRcdFx0aWYgKGFic0YgaW5zdGFuY2VvZiBURmlsZSkge1xuXHRcdFx0XHR0aGlzLl9maWxlcy5wdXNoKGFic0YpO1xuXHRcdFx0fSBlbHNlIGlmICgoYWJzRiBpbnN0YW5jZW9mIFRGb2xkZXIpICYmICghYWJzRi5pc1Jvb3QoKSkpIHtcblx0XHRcdFx0dGhpcy5fZm9sZGVycy5wdXNoKGFic0YpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX2ZpbHRlcmVkX2ZpbGVzID0gdGhpcy5fZmlsZXMuZmlsdGVyKFxuXHRcdFx0KGZpbGUpID0+IHtcblx0XHRcdFx0cmV0dXJuICF0aGlzLmV4Y2x1ZGVkX2V4dGVuc2lvbnMuaW5jbHVkZXMoZmlsZS5leHRlbnNpb24udG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0XHQmJiAhdGhpcy5leGNsdWRlZF9mb2xkZXJzLnNvbWUoZm9sZGVyID0+IGZpbGUucGF0aC5zdGFydHNXaXRoKGZvbGRlcikpO1xuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHR0aGlzLl9maWxlcyA9IHRoaXMuX2ZpbHRlcmVkX2ZpbGVzO1xuXG5cdFx0YXdhaXQgdGhpcy5kbk9yZ2FuaXplRmlsZXMoeyBhcnI6IHRoaXMuX2ZpbHRlcmVkX2ZpbGVzIH0pO1xuXG5cdFx0dGhpcy5fcmVjZW50ID0gYXdhaXQgdGhpcy5kbkdldFJlY2VudEZpbGVzKHRoaXMuX2ZpbHRlcmVkX2ZpbGVzKTtcblxuXHRcdHRoaXMuZG5DcmVhdGVNYWluVUkoY29udGVudEVsKTtcblxuXHRcdHRoaXMuZG5TZXRWaWV3KHRoaXMuZGVmYXVsdF92aWV3KTtcblx0XHR0aGlzLmRuU2V0U2VsZWN0TGF5b3V0VmFsdWUodGhpcy5zZWxlY3RlZF90YWJsZV9sYXlvdXQpO1xuXHRcdHRoaXMuZG5TZXRTZWxlY3RTb3J0VmFsdWUodGhpcy5zZWxlY3RlZF9zb3J0X3ZhbHVlKTtcblxuXHRcdHRoaXMuZG5Ub2dnbGVDb2xvcmVkRmlsZXMoKTtcblx0fVxuXG5cdGRuU2V0Q3VzdG9tQ29sb3JzKCk6IHZvaWQge1xuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoJy0tZG4tbm90ZXMtY29sb3InLCB0aGlzLmNvbG9yX25vdGVzKTtcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLWltYWdlcy1jb2xvcicsIHRoaXMuY29sb3JfaW1hZ2VzKTtcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLWNhbnZhcy1jb2xvcicsIHRoaXMuY29sb3JfY2FudmFzKTtcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLXZpZGVvcy1jb2xvcicsIHRoaXMuY29sb3JfdmlkZW9zKTtcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLWF1ZGlvcy1jb2xvcicsIHRoaXMuY29sb3JfYXVkaW9zKTtcblx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCctLWRuLXBkZnMtY29sb3InLCB0aGlzLmNvbG9yX3BkZik7XG5cdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kbi1vdGhlci1jb2xvcicsIHRoaXMuY29sb3Jfb3RoZXIpO1xuXHR9XG5cblx0ZG5Ub2dnbGVDb2xvcmVkRmlsZXMoKTogdm9pZCB7XG5cdFx0Y29uc3QgZG5NYWluQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkbi1jb250YWluZXJcIik7XG5cdFx0aWYgKHRoaXMuY29sb3JlZF9maWxlcykge1xuXHRcdFx0ZG5NYWluQ29udGFpbmVyPy5jbGFzc0xpc3QuYWRkKCdkbi1jb2xvcmVkLWZpbGVzJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRuTWFpbkNvbnRhaW5lcj8uY2xhc3NMaXN0LnJlbW92ZSgnZG4tY29sb3JlZC1maWxlcycpO1xuXHRcdH1cblx0XHR0aGlzLmRuU2V0Q3VzdG9tQ29sb3JzKCk7XG5cdH1cblxuXHRhc3luYyBkbkNyZWF0ZU1haW5VSShlbDogSFRNTEVsZW1lbnQpIHtcblxuXHRcdGNvbnN0IG1haW5Db250YWluZXIgPSBlbC5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkbi1jb250YWluZXInIH0pO1xuXHRcdG1haW5Db250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsICdkbi1jb250YWluZXInKTtcblx0XHQvLyBUb3AgTmF2aWdhdGlvblxuXHRcdHRoaXMuZG5DcmVhdGVJbnB1dFNlYXJjaChtYWluQ29udGFpbmVyKTtcblxuXHRcdGNvbnN0IHRvcE5hdiA9IG1haW5Db250YWluZXIuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnZG4tdG9wLW5hdicgfSk7XG5cblx0XHRjb25zdCBsZWZ0VG9wTmF2ID0gdG9wTmF2LmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRjb25zdCByaWdodFRvcE5hdiA9IHRvcE5hdi5jcmVhdGVFbCgnZGl2Jyk7XG5cblx0XHR0aGlzLl9CVE5fREFTSEJPQVJEID0gbGVmdFRvcE5hdi5jcmVhdGVFbCgnYnV0dG9uJywgeyB0ZXh0OiAnRGFzaGJvYXJkJywgY2xzOiAnbW9kLWN0YScgfSk7XG5cdFx0dGhpcy5fQlROX0RBU0hCT0FSRC5vbkNsaWNrRXZlbnQoKGV2dDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0dGhpcy5kblNldFZpZXcoMSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLl9CVE5fTkFWSUdBVE9SID0gbGVmdFRvcE5hdi5jcmVhdGVFbCgnYnV0dG9uJywgeyB0ZXh0OiAnTmF2aWdhdG9yJyB9KTtcblx0XHR0aGlzLl9CVE5fTkFWSUdBVE9SLm9uQ2xpY2tFdmVudCgoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLmRuU2VhcmNoVmF1bHQodGhpcy5fSU5QVVRfU0VBUkNILnZhbHVlKTtcblx0XHRcdHRoaXMuZG5TZXRWaWV3KDIpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gU2VsZWN0IHRhYmxlIGxheW91dFxuXG5cdFx0dGhpcy5sYWJlbExheW91dCA9IHJpZ2h0VG9wTmF2LmNyZWF0ZUVsKCdzcGFuJywge1xuXHRcdFx0dGV4dDogJ0xheW91dDonLCBjbHM6ICdkbi10YmwtbGFiZWwnXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxhYmVsTGF5b3V0LnNldEF0dHJpYnV0ZSgnaWQnLCAnZG4tbGFiZWwtbGF5b3V0Jyk7XG5cblx0XHR0aGlzLl9TRUxFQ1RfVEFCTEVfTEFZT1VUID0gcmlnaHRUb3BOYXYuY3JlYXRlRWwoJ3NlbGVjdCcsIHtcblx0XHRcdGNsczogJ2Ryb3Bkb3duIHRibC1zZWxlY3QnXG5cdFx0fSk7XG5cdFx0dGhpcy5fU0VMRUNUX1RBQkxFX0xBWU9VVC5jcmVhdGVFbCgnb3B0aW9uJywgeyB0ZXh0OiAnRGVmYXVsdCcsIHZhbHVlOiAnZG4tdGJsLWRlZmF1bHQnIH0pO1xuXHRcdHRoaXMuX1NFTEVDVF9UQUJMRV9MQVlPVVQuY3JlYXRlRWwoJ29wdGlvbicsIHsgdGV4dDogJ1JvdyBzdHJpcGVkJywgdmFsdWU6ICdkbi10Ymwtcm93JyB9KTtcblx0XHR0aGlzLl9TRUxFQ1RfVEFCTEVfTEFZT1VULmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6ICdDb2x1bW4gc3RyaXBlZCcsIHZhbHVlOiAnZG4tdGJsLWNvbHVtbicgfSk7XG5cdFx0dGhpcy5fU0VMRUNUX1RBQkxFX0xBWU9VVC5jcmVhdGVFbCgnb3B0aW9uJywgeyB0ZXh0OiAnQm9yZGVyZWQnLCB2YWx1ZTogJ2RuLXRibC1ib3JkZXJlZCcgfSk7XG5cdFx0dGhpcy5fU0VMRUNUX1RBQkxFX0xBWU9VVC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IHRoaXMuZG5TZWxlY3RUYWJsZUxheW91dCgpOyB9KTtcblxuXHRcdC8vIFNlbGVjdCBzb3J0XG5cblx0XHR0aGlzLmxhYmVsU29ydCA9IHJpZ2h0VG9wTmF2LmNyZWF0ZUVsKCdzcGFuJywge1xuXHRcdFx0dGV4dDogJ1NvcnQgYnk6JywgY2xzOiAnZG4tdGJsLWxhYmVsJ1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5sYWJlbFNvcnQuc2V0QXR0cmlidXRlKCdpZCcsICdkbi1sYWJlbC1zb3J0Jyk7XG5cblx0XHR0aGlzLl9TRUxFQ1RfU09SVCA9IHJpZ2h0VG9wTmF2LmNyZWF0ZUVsKCdzZWxlY3QnLCB7XG5cdFx0XHRjbHM6ICdkcm9wZG93bidcblx0XHR9KTtcblx0XHR0aGlzLl9TRUxFQ1RfU09SVC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLXNlbGVjdC1zb3J0Jyk7XG5cblx0XHR0aGlzLl9TRUxFQ1RfU09SVC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IHRoaXMuZG5Tb3J0Q29sdW1uV2l0aFNlbGVjdCgpOyB9KTtcblxuXHRcdGNvbnN0IG9wdGlvbjEgPSB0aGlzLl9TRUxFQ1RfU09SVC5jcmVhdGVFbCgnb3B0aW9uJywgeyB0ZXh0OiAnRmlsZSBuYW1lIChBIHRvIFopJywgdmFsdWU6ICduYW1lLWFzYycgfSk7XG5cdFx0Y29uc3Qgb3B0aW9uMiA9IHRoaXMuX1NFTEVDVF9TT1JULmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6ICdGaWxlIG5hbWUgKFogdG8gQSknLCB2YWx1ZTogJ25hbWUtZGVzYycgfSk7XG5cdFx0Y29uc3Qgb3B0aW9uMyA9IHRoaXMuX1NFTEVDVF9TT1JULmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6ICdQYXRoIChBIHRvIFopJywgdmFsdWU6ICdwYXRoLWFzYycgfSk7XG5cdFx0Y29uc3Qgb3B0aW9uNCA9IHRoaXMuX1NFTEVDVF9TT1JULmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6ICdQYXRoIChaIHRvIEEpJywgdmFsdWU6ICdwYXRoLWRlc2MnIH0pO1xuXHRcdGNvbnN0IG9wdGlvbjUgPSB0aGlzLl9TRUxFQ1RfU09SVC5jcmVhdGVFbCgnb3B0aW9uJywgeyB0ZXh0OiAnRmlsZSBzaXplIChzbWFsbGVzdCB0byBsYXJnZXN0KScsIHZhbHVlOiAnc2l6ZS1hc2MnIH0pO1xuXHRcdGNvbnN0IG9wdGlvbjYgPSB0aGlzLl9TRUxFQ1RfU09SVC5jcmVhdGVFbCgnb3B0aW9uJywgeyB0ZXh0OiAnRmlsZSBzaXplIChsYXJnZXN0IHRvIHNtYWxsZXN0KScsIHZhbHVlOiAnc2l6ZS1kZXNjJyB9KTtcblx0XHRjb25zdCBvcHRpb243ID0gdGhpcy5fU0VMRUNUX1NPUlQuY3JlYXRlRWwoJ29wdGlvbicsIHsgdGV4dDogJ0RhdGUvdGltZSAob2xkZXN0IHRvIG5ld2VzdCknLCB2YWx1ZTogJ21vZGlmaWVkLWFzYycgfSk7XG5cdFx0Y29uc3Qgb3B0aW9uOCA9IHRoaXMuX1NFTEVDVF9TT1JULmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6ICdEYXRlL3RpbWUgKG5ld2VzdCB0byBvbGRlc3QpJywgdmFsdWU6ICdtb2RpZmllZC1kZXNjJyB9KTtcblxuXG5cdFx0Ly8gQ29udGFpbmVyc1xuXHRcdHRoaXMuX1ZJRVdfREFTSEJPQVJEID0gbWFpbkNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkbi1mbGV4JyB9KTtcblxuXHRcdHRoaXMuX1ZJRVdfTkFWSUdBVE9SID0gbWFpbkNvbnRhaW5lci5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkbi1kaXNwbGF5LW5vbmUnIH0pO1xuXG5cdFx0dGhpcy5fZGl2U2VhcmNoUmVzdWx0cyA9IHRoaXMuX1ZJRVdfTkFWSUdBVE9SLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ2RuLWRpdi10YWJsZScgfSk7XG5cblx0XHR0aGlzLmRuU2hvd1NlYXJjaFJlc3VsdHMoeyBmOiB0aGlzLl9maWx0ZXJlZF9maWxlcywgZWw6IHRoaXMuX2RpdlNlYXJjaFJlc3VsdHMsIGxlYWY6IHRoaXMuX2xlYWYgfSlcblxuXHRcdC8vIFZhdWx0IFN0YXRzIGNvbnRhaW5lclxuXHRcdGNvbnN0IGRpdlZhdWx0U3RhdHMgPSB0aGlzLl9WSUVXX0RBU0hCT0FSRC5jcmVhdGVFbCgnZGl2Jyk7XG5cdFx0ZGl2VmF1bHRTdGF0cy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLXZhdWx0LXN0YXRzJyk7XG5cblx0XHRjb25zdCBkaXZWYXVsdEdyYXBoID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdlZhdWx0R3JhcGguc2V0QXR0cmlidXRlKCdpZCcsICdkbi12YXVsdC1ncmFwaCcpO1xuXG5cdFx0Y29uc3QgZGl2UmVjZW50RmlsZXMgPSB0aGlzLl9WSUVXX0RBU0hCT0FSRC5jcmVhdGVFbCgnZGl2Jyk7XG5cdFx0ZGl2UmVjZW50RmlsZXMuc2V0QXR0cmlidXRlKCdpZCcsICdkbi1yZWNlbnQtZmlsZXMnKTtcblxuXHRcdGNvbnN0IGRpdlJlY2VudE5vdGVzID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdlJlY2VudE5vdGVzLnNldEF0dHJpYnV0ZSgnaWQnLCAnZG4tcmVjZW50LW5vdGVzJyk7O1xuXG5cdFx0Y29uc3QgZGl2Q2FudmFzID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdkNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLWNhbnZhcycpO1xuXG5cdFx0Y29uc3QgZGl2SW1hZ2VzID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdkltYWdlcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLWltYWdlcycpO1xuXG5cdFx0Y29uc3QgZGl2QXVkaW9zID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdkF1ZGlvcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLWF1ZGlvcycpO1xuXG5cdFx0Y29uc3QgZGl2VmlkZW9zID0gdGhpcy5fVklFV19EQVNIQk9BUkQuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdGRpdlZpZGVvcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2RuLXZpZGVvcycpO1xuXG5cdFx0Y29uc3QgZGl2UERGcyA9IHRoaXMuX1ZJRVdfREFTSEJPQVJELmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRkaXZQREZzLnNldEF0dHJpYnV0ZSgnaWQnLCAnZG4tcGRmcycpO1xuXG5cdFx0Y29uc3QgZGl2T3RoZXIgPSB0aGlzLl9WSUVXX0RBU0hCT0FSRC5jcmVhdGVFbCgnZGl2Jyk7XG5cdFx0ZGl2T3RoZXIuc2V0QXR0cmlidXRlKCdpZCcsICdkbi1vdGhlcicpO1xuXG5cdFx0Ly8gVmF1bHQgU3RhdHNcblxuXHRcdGNvbnN0IGJ0bk5vdGVzID0gYXdhaXQgdGhpcy5kbkNyZWF0ZUJ0bihkaXZWYXVsdFN0YXRzLFxuXHRcdFx0J2RuLWJ0bi1ub3RlcycsXG5cdFx0XHQnTm90ZXMnLFxuXHRcdFx0dGhpcy5fbm90ZXMsXG5cdFx0XHR0aGlzLl9kaXZTZWFyY2hSZXN1bHRzLFxuXHRcdFx0dGhpcy5fbGVhZik7XG5cblxuXHRcdGNvbnN0IGJ0bkNhbnZhcyA9IGF3YWl0IHRoaXMuZG5DcmVhdGVCdG4oZGl2VmF1bHRTdGF0cyxcblx0XHRcdCdkbi1idG4tY2FudmFzJyxcblx0XHRcdCdDYW52YXMnLFxuXHRcdFx0dGhpcy5fY2FudmFzLFxuXHRcdFx0dGhpcy5fZGl2U2VhcmNoUmVzdWx0cyxcblx0XHRcdHRoaXMuX2xlYWYpO1xuXG5cdFx0Y29uc3QgYnRuSW1hZ2VzID0gYXdhaXQgdGhpcy5kbkNyZWF0ZUJ0bihkaXZWYXVsdFN0YXRzLFxuXHRcdFx0J2RuLWJ0bi1pbWFnZXMnLFxuXHRcdFx0J0ltYWdlcycsXG5cdFx0XHR0aGlzLl9pbWFnZXMsXG5cdFx0XHR0aGlzLl9kaXZTZWFyY2hSZXN1bHRzLFxuXHRcdFx0dGhpcy5fbGVhZik7XG5cblx0XHRjb25zdCBidG5BdWRpb3MgPSBhd2FpdCB0aGlzLmRuQ3JlYXRlQnRuKGRpdlZhdWx0U3RhdHMsXG5cdFx0XHQnZG4tYnRuLWF1ZGlvcycsXG5cdFx0XHQnQXVkaW9zJyxcblx0XHRcdHRoaXMuX2F1ZGlvcyxcblx0XHRcdHRoaXMuX2RpdlNlYXJjaFJlc3VsdHMsXG5cdFx0XHR0aGlzLl9sZWFmKTtcblxuXHRcdGNvbnN0IGJ0blZpZGVvcyA9IGF3YWl0IHRoaXMuZG5DcmVhdGVCdG4oZGl2VmF1bHRTdGF0cyxcblx0XHRcdCdkbi1idG4tdmlkZW9zJyxcblx0XHRcdCdWaWRlb3MnLFxuXHRcdFx0dGhpcy5fdmlkZW9zLFxuXHRcdFx0dGhpcy5fZGl2U2VhcmNoUmVzdWx0cyxcblx0XHRcdHRoaXMuX2xlYWYpO1xuXG5cdFx0Y29uc3QgYnRuUERGID0gYXdhaXQgdGhpcy5kbkNyZWF0ZUJ0bihkaXZWYXVsdFN0YXRzLFxuXHRcdFx0J2RuLWJ0bi1wZGYnLFxuXHRcdFx0J1BERicsXG5cdFx0XHR0aGlzLl9wZGYsXG5cdFx0XHR0aGlzLl9kaXZTZWFyY2hSZXN1bHRzLFxuXHRcdFx0dGhpcy5fbGVhZik7XG5cblx0XHRjb25zdCBidG5PdGhlciA9IGF3YWl0IHRoaXMuZG5DcmVhdGVCdG4oZGl2VmF1bHRTdGF0cyxcblx0XHRcdCdkbi1idG4tb3RoZXInLFxuXHRcdFx0J090aGVyJyxcblx0XHRcdHRoaXMuX290aGVyLFxuXHRcdFx0dGhpcy5fZGl2U2VhcmNoUmVzdWx0cyxcblx0XHRcdHRoaXMuX2xlYWYpO1xuXG5cdFx0Ly8gUGllIGNoYXJ0XG5cdFx0Y29uc3QgY2FudmFzUGllQ2hhcnQxID0gZGl2VmF1bHRHcmFwaC5jcmVhdGVFbCgnY2FudmFzJyk7XG5cdFx0Y2FudmFzUGllQ2hhcnQxLnNldEF0dHJpYnV0ZSgnaWQnLCAnZGFzaGJvYXJkLWNhbnZhcycpO1xuXG5cdFx0Y29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcblxuXHRcdGNvbnN0IGxhYmVsQ29sb3IgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnLS10ZXh0LW11dGVkJyk7XG5cblx0XHRjb25zdCBwaWVDaGFydDEgPSBuZXcgRE5QaWVDaGFydChjYW52YXNQaWVDaGFydDEsIDEwLCAxMiwgNTAsIGxhYmVsQ29sb3IpO1xuXG5cdFx0cGllQ2hhcnQxLmFkZERhdGEodGhpcy5fbm90ZXMubGVuZ3RoLCB0aGlzLmNvbG9yX25vdGVzLCAnTm90ZXMnKTtcblx0XHRwaWVDaGFydDEuYWRkRGF0YSh0aGlzLl9pbWFnZXMubGVuZ3RoLCB0aGlzLmNvbG9yX2ltYWdlcywgJ0ltYWdlcycpO1xuXHRcdHBpZUNoYXJ0MS5hZGREYXRhKHRoaXMuX2NhbnZhcy5sZW5ndGgsIHRoaXMuY29sb3JfY2FudmFzLCAnQ2FudmFzJyk7XG5cdFx0cGllQ2hhcnQxLmFkZERhdGEodGhpcy5fdmlkZW9zLmxlbmd0aCwgdGhpcy5jb2xvcl92aWRlb3MsICdWaWRlb3MnKTtcblx0XHRwaWVDaGFydDEuYWRkRGF0YSh0aGlzLl9hdWRpb3MubGVuZ3RoLCB0aGlzLmNvbG9yX2F1ZGlvcywgJ0F1ZGlvcycpO1xuXHRcdHBpZUNoYXJ0MS5hZGREYXRhKHRoaXMuX3BkZi5sZW5ndGgsIHRoaXMuY29sb3JfcGRmLCAnUERGJyk7XG5cdFx0cGllQ2hhcnQxLmFkZERhdGEodGhpcy5fb3RoZXIubGVuZ3RoLCB0aGlzLmNvbG9yX290aGVyLCAnT3RoZXInKTtcblx0XHRwaWVDaGFydDEuZHJhdygpO1xuXG5cdFx0Ly8gVG90YWwgZmlsZXNcblx0XHRjb25zdCBkaXZTdGF0c0ZyYW1lID0gZGl2VmF1bHRHcmFwaC5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkbi1zdGF0cy1maWxlcy1mb2xkZXJzJyB9KTtcblxuXHRcdGRpdlN0YXRzRnJhbWUuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnZG4tc3RhdHMtZmlsZXMnLCB0ZXh0OiAnRmlsZXM6ICcgKyB0aGlzLl9maWx0ZXJlZF9maWxlcy5sZW5ndGggfSk7XG5cblx0XHQvLyBUb3RhbCBmb2xkZXJzXG5cblx0XHRkaXZTdGF0c0ZyYW1lLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ2RuLXN0YXRzLWZvbGRlcnMnLCB0ZXh0OiAnRm9sZGVyczogJyArIHRoaXMuX2ZvbGRlcnMubGVuZ3RoIH0pO1xuXG5cdFx0Ly8gUmVjZW50IGZpbGVzIGJ5IHR5cGUvY2F0ZWdvcnlcblxuXHRcdGF3YWl0IHRoaXMuZG5DcmVhdGVSZWNlbnRGaWxlcygnUmVjZW50IGZpbGVzJywgZGl2UmVjZW50RmlsZXMsIHRoaXMuX3JlY2VudCwgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCBub3RlcycsIGRpdlJlY2VudE5vdGVzLCB0aGlzLl9ub3RlcywgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCBjYW52YXMnLCBkaXZDYW52YXMsIHRoaXMuX2NhbnZhcywgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCBpbWFnZXMnLCBkaXZJbWFnZXMsIHRoaXMuX2ltYWdlcywgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCBhdWRpb3MnLCBkaXZBdWRpb3MsIHRoaXMuX2F1ZGlvcywgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCB2aWRlb3MnLCBkaXZWaWRlb3MsIHRoaXMuX3ZpZGVvcywgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0XHRhd2FpdCB0aGlzLmRuQ3JlYXRlUmVjZW50RmlsZXMoJ1JlY2VudCBQREZzJywgZGl2UERGcywgdGhpcy5fcGRmLCB0aGlzLm51bV9yZWNlbnRfZmlsZXMpO1xuXHRcdGF3YWl0IHRoaXMuZG5DcmVhdGVSZWNlbnRGaWxlcygnUmVjZW50IG90aGVyIGZpbGVzJywgZGl2T3RoZXIsIHRoaXMuX290aGVyLCB0aGlzLm51bV9yZWNlbnRfZmlsZXMpO1xuXHR9XG5cblx0YXN5bmMgZG5DcmVhdGVCdG4oZWxEaXY6IEhUTUxFbGVtZW50LFxuXHRcdGJ0bklkOiBzdHJpbmcsXG5cdFx0YnRuVGl0bGU6IHN0cmluZyxcblx0XHRidG5DYXRlZ29yeUZpbGVzOiBURmlsZVtdLFxuXHRcdGRpc3BsYXlFbDogSFRNTEVsZW1lbnQsXG5cdFx0bGVhZjogV29ya3NwYWNlTGVhZikge1xuXG5cdFx0bGV0IGJ0biA9IGVsRGl2LmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ2RuLWJ0bi1zdGF0cycgfSk7XG5cblx0XHRidG4uc2V0QXR0cmlidXRlKCdpZCcsIGJ0bklkKVxuXHRcdGJ0bi5jcmVhdGVFbCgnc3BhbicsIHsgY2xzOiAnZG4tYnRuLXN0YXRzLWxhYmVsJywgdGV4dDogYnRuVGl0bGUgfSk7XG5cdFx0YnRuLmNyZWF0ZUVsKCdzcGFuJywgeyBjbHM6ICdkbi1idG4tc3RhdHMtaWNvbicgfSk7XG5cdFx0YnRuLmNyZWF0ZUVsKCdzcGFuJywgeyBjbHM6ICdkbi1idG4tc3RhdHMtbnVtYmVyJywgdGV4dDogYnRuQ2F0ZWdvcnlGaWxlcy5sZW5ndGgudG9TdHJpbmcoKSB9KTtcblx0XHRidG4ub25DbGlja0V2ZW50KChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdHRoaXMuX2ZpbHRlcmVkX2ZpbGVzID0gYnRuQ2F0ZWdvcnlGaWxlcztcblx0XHRcdHRoaXMuX3NlbGVjdGVkX2NhdGVnb3J5ID0gJyAoJyArIGJ0blRpdGxlICsgJyknO1xuXHRcdFx0dGhpcy5kblNvcnRGaWx0ZXJlZEZpbGVzKGZhbHNlKTtcblx0XHRcdHRoaXMuZG5TaG93U2VhcmNoUmVzdWx0cyh7IGY6IGJ0bkNhdGVnb3J5RmlsZXMsIGVsOiBkaXNwbGF5RWwsIGxlYWYgfSk7XG5cdFx0XHR0aGlzLmRuU2V0VmlldygyKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBidG47XG5cdH1cblxuXHRhc3luYyBkbkNyZWF0ZVJlY2VudEZpbGVzKHRpdGxlOiBzdHJpbmcsIGRpdkY6IEhUTUxEaXZFbGVtZW50LCBmaWxlczogVEZpbGVbXSwgbnVtX2ZpbGVzOiBudW1iZXIpIHtcblx0XHRpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRkaXZGLmNyZWF0ZUVsKCdoMycsIHsgY2xzOiAnZG4tc3VidGl0bGVzJywgdGV4dDogdGl0bGUgfSk7XG5cdFx0XHRkaXZGLmNyZWF0ZUVsKCdwJywgeyBjbHM6ICdkbi1uby1yZXN1bHRzLWZvdW5kJywgdGV4dDogJ05vIGZpbGVzIGZvdW5kLicgfSk7XG5cdFx0XHRkaXZGLmNsYXNzTGlzdC5hZGQoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXZGLmNyZWF0ZUVsKCdoMycsIHsgY2xzOiAnZG4tc3VidGl0bGVzJywgdGV4dDogdGl0bGUgfSk7XG5cdFx0XHRjb25zdCBzb3J0ZWRGaWxlcyA9IGF3YWl0IHRoaXMuZG5HZXRSZWNlbnRGaWxlcyhmaWxlcyk7XG5cdFx0XHRzb3J0ZWRGaWxlcy5mb3JFYWNoKHNmaWxlID0+IHtcblx0XHRcdFx0ZGl2Ri5jcmVhdGVFbCgnYScsIHsgY2xzOiB0aGlzLmRuU2V0RmlsZUljb25DbGFzcyhzZmlsZS5leHRlbnNpb24pLCB0ZXh0OiBzZmlsZS5iYXNlbmFtZSwgdGl0bGU6IHNmaWxlLnBhdGggfSkub25DbGlja0V2ZW50KChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0XHRpZiAoc2ZpbGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdHRoaXMuZG5PcGVuRmlsZUFsdChzZmlsZSwgZXZ0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoc2ZpbGUuZXh0ZW5zaW9uICE9PSAnbWQnKSB7XG5cdFx0XHRcdFx0ZGl2Ri5jcmVhdGVFbCgnc3BhbicsIHsgY2xzOiAnbmF2LWZpbGUtdGFnJywgdGV4dDogc2ZpbGUuZXh0ZW5zaW9uIH0pXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaXZGLmNyZWF0ZUVsKCdicicpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblxuXHRkbkNyZWF0ZUlucHV0U2VhcmNoKGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXHRcdGNvbnN0IHNlYXJjaENvbnRhaW5lciA9IGVsLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ2RuLXNlYXJjaC1pbnB1dC1jb250YWluZXInIH0pO1xuXHRcdHRoaXMuX0lOUFVUX1NFQVJDSCA9IHNlYXJjaENvbnRhaW5lci5jcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdzZWFyY2gnLCBwbGFjZWhvbGRlcjogJ1NlYXJjaC4uLicgfSk7XG5cdFx0dGhpcy5fSU5QVVRfU0VBUkNILnNldEF0dHJpYnV0ZSgnaWQnLCAnZG4taW5wdXQtZmlsdGVyJyk7XG5cdFx0dGhpcy5fSU5QVVRfU0VBUkNILnNwZWxsY2hlY2sgPSBmYWxzZTtcblx0XHR0aGlzLl9JTlBVVF9TRUFSQ0guZm9jdXMoKTtcblx0XHRjb25zdCBjbGVhcklucHV0U2VhcmNoID0gc2VhcmNoQ29udGFpbmVyLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ3NlYXJjaC1pbnB1dC1jbGVhci1idXR0b24nIH0pLm9uQ2xpY2tFdmVudCgoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUgPSAnJztcblx0XHRcdHRoaXMuX0lOUFVUX1NFQVJDSC5mb2N1cygpO1xuXHRcdFx0dGhpcy5kblNlYXJjaFZhdWx0KHRoaXMuX0lOUFVUX1NFQVJDSC52YWx1ZSk7XG5cdFx0fSk7XG5cdFx0Ly8gS2V5dXAgZXZlbnQgbGlzdGVuZXIgd2l0aCBkZWJvdW5jZVxuXHRcdHRoaXMuX0lOUFVUX1NFQVJDSC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKCgpID0+IHRoaXMuZG5TZWFyY2hWYXVsdCh0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUpLCAzMDAsIHRydWUpKTtcblx0fVxuXG5cdGFzeW5jIGRuU2VhcmNoVmF1bHQodmFsOiBzdHJpbmcpIHtcblx0XHRsZXQgckV4cDtcblx0XHR0cnkge1xuXHRcdFx0ckV4cCA9IG5ldyBSZWdFeHAodmFsLnRvTG93ZXJDYXNlKCksICdpdScpO1xuXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmRuU2V0VmlldygyKTtcblxuXHRcdGNvbnN0IGlzRGF0ZVNlYXJjaCA9IHZhbC5zdGFydHNXaXRoKCdAJyk7XG5cblx0XHRpZiAoaXNEYXRlU2VhcmNoKSB7XG5cdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0guY2xhc3NMaXN0LmFkZCgnZG4taW5wdXQtZGF0ZXNlYXJjaCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0guY2xhc3NMaXN0LnJlbW92ZSgnZG4taW5wdXQtZGF0ZXNlYXJjaCcpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2ZpbHRlcmVkX2ZpbGVzID0gdGhpcy5fZmlsZXMuZmlsdGVyKFxuXHRcdFx0ZmlsZSA9PiB7XG5cdFx0XHRcdGlmIChpc0RhdGVTZWFyY2gpIHtcblxuXHRcdFx0XHRcdGxldCBtdGltZSA9IG1vbWVudChmaWxlLnN0YXQubXRpbWUpO1xuXHRcdFx0XHRcdGNvbnN0IGRhdGVTZWFyY2ggPSB2YWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKS5zcGxpdCgnICcpO1xuXG5cdFx0XHRcdFx0c3dpdGNoIChkYXRlU2VhcmNoWzBdKSB7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXknOlxuXHRcdFx0XHRcdFx0Y2FzZSAndG9kYXknOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXRpbWUuaXNTYW1lKG1vbWVudCgpLCAnZGF5Jyk7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXktMSc6XG5cdFx0XHRcdFx0XHRjYXNlICd5ZXN0ZXJkYXknOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXRpbWUuaXNTYW1lKG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyksICdkYXknKTtcblx0XHRcdFx0XHRcdGNhc2UgJ2RheS0yJzpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG10aW1lLmlzU2FtZShtb21lbnQoKS5zdWJ0cmFjdCgyLCAnZGF5cycpLCAnZGF5Jyk7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXktMyc6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtdGltZS5pc1NhbWUobW9tZW50KCkuc3VidHJhY3QoMywgJ2RheXMnKSwgJ2RheScpO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZGF5LTQnOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXRpbWUuaXNTYW1lKG1vbWVudCgpLnN1YnRyYWN0KDQsICdkYXlzJyksICdkYXknKTtcblx0XHRcdFx0XHRcdGNhc2UgJ2RheS01Jzpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG10aW1lLmlzU2FtZShtb21lbnQoKS5zdWJ0cmFjdCg1LCAnZGF5cycpLCAnZGF5Jyk7XG5cdFx0XHRcdFx0XHRjYXNlICdkYXktNic6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtdGltZS5pc1NhbWUobW9tZW50KCkuc3VidHJhY3QoNiwgJ2RheXMnKSwgJ2RheScpO1xuXHRcdFx0XHRcdFx0Y2FzZSAnZGF5LTcnOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXRpbWUuaXNTYW1lKG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJyksICdkYXknKTtcblx0XHRcdFx0XHRcdGNhc2UgJ3dlZWsnOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXRpbWUuaXNCZXR3ZWVuKG1vbWVudCgpLnN1YnRyYWN0KDcsICdkYXlzJyksIG1vbWVudCgpLCAnZGF5JywgJ1tdJyk7XG5cdFx0XHRcdFx0XHRjYXNlICdtb250aCc6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtdGltZS5pc1NhbWUobW9tZW50KCksICdtb250aCcpO1xuXHRcdFx0XHRcdFx0Y2FzZSAneWVhcic6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBtdGltZS5pc1NhbWUobW9tZW50KCksICd5ZWFyJyk7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiByRXhwLnRlc3QoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHRcdFx0XHR8fCByRXhwLnRlc3QoZ2V0Rm9sZGVyU3RydWN0dXJlKGZpbGUucGF0aCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0XHRcdHx8IHJFeHAudGVzdChtb21lbnQoZmlsZS5zdGF0Lm10aW1lKS5mb3JtYXQodGhpcy5kYXRlX2Zvcm1hdCkpXG5cdFx0XHRcdFx0XHR8fCByRXhwLnRlc3QodGhpcy5kbkdldFRhZ3NQZXJGaWxlKGZpbGUpLnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdHRoaXMuX3NlbGVjdGVkX2NhdGVnb3J5ID0gJyc7XG5cblx0XHR0aGlzLmRuU29ydEZpbHRlcmVkRmlsZXMoZmFsc2UpO1xuXG5cdFx0YXdhaXQgdGhpcy5kblNob3dTZWFyY2hSZXN1bHRzKHsgZjogdGhpcy5fZmlsdGVyZWRfZmlsZXMsIGVsOiB0aGlzLl9kaXZTZWFyY2hSZXN1bHRzLCBsZWFmOiB0aGlzLl9sZWFmIH0pO1xuXG5cdFx0Y29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG4tdGFibGUtcmVzdWx0cycpIGFzIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50O1xuXG5cdFx0aWYgKHRib2R5ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCB0ciA9IHRib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpIGFzIEhUTUxDb2xsZWN0aW9uT2Y8SFRNTFRhYmxlUm93RWxlbWVudD47XG5cblx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRjb25zdCBhbGxUZHMgPSB0cltpXS5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpIGFzIE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+O1xuXG5cdFx0XHRcdGxldCBpc1Jlc3VsdCA9IGZhbHNlO1xuXG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYWxsVGRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGQgPSBhbGxUZHNbal07XG5cdFx0XHRcdFx0Y29uc3QgdGRWYWwgPSB0ZC5pbm5lclRleHQudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAockV4cC50ZXN0KHRkVmFsKSB8fCBpc0RhdGVTZWFyY2gpIHtcblx0XHRcdFx0XHRcdGlzUmVzdWx0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc1Jlc3VsdCkge1xuXHRcdFx0XHRcdHRyW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRyW2ldLmNsYXNzTGlzdC5hZGQoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZG5Tb3J0RmlsdGVyZWRGaWxlcyh0b2dnbGU6IGJvb2xlYW4pIHtcblx0XHRzd2l0Y2ggKHRoaXMuX3NvcnRfY29sdW1uKSB7XG5cdFx0XHRjYXNlICduYW1lJzpcblx0XHRcdGNhc2UgJ3BhdGgnOlxuXHRcdFx0XHR0aGlzLmRuU29ydENvbHVtblN0cmluZyh0aGlzLl9zb3J0X2NvbHVtbiwgdGhpcy5fc29ydF9vcmRlciwgdG9nZ2xlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzaXplJzpcblx0XHRcdGNhc2UgJ21vZGlmaWVkJzpcblx0XHRcdFx0dGhpcy5kblNvcnRDb2x1bW5OdW1iZXIodGhpcy5fc29ydF9jb2x1bW4sIHRoaXMuX3NvcnRfb3JkZXIsIHRvZ2dsZSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdGRuU29ydENvbHVtbldpdGhTZWxlY3QoKTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsID0gdGhpcy5fU0VMRUNUX1NPUlQudmFsdWU7XG5cdFx0aWYgKHRoaXMuZG5Jc1ZhbGlkU29ydCh2YWwpKSB7XG5cdFx0XHRjb25zdCBzZWxTb3J0ID0gdmFsLnNwbGl0KCctJyk7XG5cdFx0XHR0aGlzLl9zb3J0X2NvbHVtbiA9IHNlbFNvcnRbMF07XG5cdFx0XHR0aGlzLl9zb3J0X29yZGVyID0gc2VsU29ydFsxXTtcblxuXHRcdFx0c3dpdGNoICh0aGlzLl9zb3J0X2NvbHVtbikge1xuXHRcdFx0XHRjYXNlICduYW1lJzpcblx0XHRcdFx0Y2FzZSAncGF0aCc6XG5cdFx0XHRcdFx0dGhpcy5kblNvcnRDb2x1bW5TdHJpbmcodGhpcy5fc29ydF9jb2x1bW4sIHRoaXMuX3NvcnRfb3JkZXIsIGZhbHNlKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnc2l6ZSc6XG5cdFx0XHRcdGNhc2UgJ21vZGlmaWVkJzpcblx0XHRcdFx0XHR0aGlzLmRuU29ydENvbHVtbk51bWJlcih0aGlzLl9zb3J0X2NvbHVtbiwgdGhpcy5fc29ydF9vcmRlciwgZmFsc2UpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRuU2hvd1NlYXJjaFJlc3VsdHMoeyBmOiB0aGlzLl9maWx0ZXJlZF9maWxlcywgZWw6IHRoaXMuX2RpdlNlYXJjaFJlc3VsdHMsIGxlYWY6IHRoaXMuX2xlYWYgfSk7XG5cblx0XHR9XG5cdH1cblxuXHRkbklzVmFsaWRTb3J0KHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKFsnbmFtZS1hc2MnLCAnbmFtZS1kZXNjJywgJ3BhdGgtYXNjJywgJ3BhdGgtZGVzYycsXG5cdFx0XHQnc2l6ZS1hc2MnLCAnc2l6ZS1kZXNjJywgJ21vZGlmaWVkLWFzYycsICdtb2RpZmllZC1kZXNjJ10uaW5jbHVkZXModmFsKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRkbklzVmFsaWRMYXlvdXQodmFsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5fVEFCTEVfTEFZT1VUUy5pbmNsdWRlcyh2YWwpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRuU2hvd1NlYXJjaFJlc3VsdHMoeyBmLCBlbCwgbGVhZiwgY3VycmVudFBhZ2UgPSAxIH06IHsgZjogVEZpbGVbXTsgZWw6IEhUTUxFbGVtZW50OyBsZWFmOiBXb3Jrc3BhY2VMZWFmOyBjdXJyZW50UGFnZT86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG5cblx0XHRlbC5lbXB0eSgpO1xuXG5cdFx0Y29uc3QgcGFnaW5hdGlvbkNvbnRhaW5lciA9IHRoaXMuX2RpdlNlYXJjaFJlc3VsdHMuY3JlYXRlRWwoJ2RpdicsIHsgY2xzOiAnZG4tcGFnaW5hdGlvbicgfSk7XG5cdFx0Y29uc3QgdGFibGUgPSBlbC5jcmVhdGVFbCgndGFibGUnLCB7IGNsczogdGhpcy5zZWxlY3RlZF90YWJsZV9sYXlvdXQgfSk7XG5cdFx0dGFibGUuc2V0QXR0cmlidXRlKCdpZCcsICdkbi10YWJsZScpO1xuXG5cdFx0Y29uc3QgdGhlYWQgPSB0YWJsZS5jcmVhdGVFbCgndGhlYWQnKTtcblx0XHRjb25zdCB0ciA9IHRoZWFkLmNyZWF0ZUVsKCd0cicpO1xuXHRcdHRoaXMuX3RoMSA9IHRyLmNyZWF0ZUVsKCd0aCcsIHsgdGV4dDogJ05hbWUnIH0pO1xuXHRcdHRoaXMuX3RoMiA9IHRyLmNyZWF0ZUVsKCd0aCcsIHsgdGV4dDogJ1BhdGgnIH0pO1xuXHRcdHRoaXMuX3RoMyA9IHRyLmNyZWF0ZUVsKCd0aCcsIHsgdGV4dDogJ1NpemUnIH0pO1xuXHRcdHRoaXMuX3RoNCA9IHRyLmNyZWF0ZUVsKCd0aCcsIHsgdGV4dDogJ0RhdGUnIH0pO1xuXHRcdHRoaXMuX3RoNSA9IHRyLmNyZWF0ZUVsKCd0aCcsIHsgdGV4dDogJ1RhZ3MnIH0pO1xuXG5cdFx0dGhpcy5fdGgxLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4gdGhpcy5kbkFsdGVybmF0ZVNvcnRDb2x1bW4oJ25hbWUnKSk7XG5cdFx0dGhpcy5fdGgyLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4gdGhpcy5kbkFsdGVybmF0ZVNvcnRDb2x1bW4oJ3BhdGgnKSk7XG5cdFx0dGhpcy5fdGgzLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4gdGhpcy5kbkFsdGVybmF0ZVNvcnRDb2x1bW4oJ3NpemUnKSk7XG5cdFx0dGhpcy5fdGg0LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4gdGhpcy5kbkFsdGVybmF0ZVNvcnRDb2x1bW4oJ21vZGlmaWVkJykpO1xuXHRcdGNvbnN0IHRib2R5ID0gdGFibGUuY3JlYXRlRWwoJ3Rib2R5Jyk7XG5cdFx0dGJvZHkuc2V0QXR0cmlidXRlKCdpZCcsICdkbi10YWJsZS1yZXN1bHRzJyk7XG5cblx0XHRpZiAoZi5sZW5ndGggPiAwKSB7XG5cblx0XHRcdGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG5cdFx0XHRcdHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gUGFnaW5hdGlvblxuXHRcdFx0dGhpcy5fdG90YWxfcGFnZXMgPSBNYXRoLmNlaWwoZi5sZW5ndGggLyB0aGlzLmZpbGVzX3Blcl9wYWdlKTtcblx0XHRcdGNvbnN0IHBhZ2luYXRlZERhdGEgPSBmLnNsaWNlKChjdXJyZW50UGFnZSAtIDEpICogdGhpcy5maWxlc19wZXJfcGFnZSwgY3VycmVudFBhZ2UgKiB0aGlzLmZpbGVzX3Blcl9wYWdlKTtcblxuXHRcdFx0cGFnaW5hdGVkRGF0YS5mb3JFYWNoKGFzeW5jIGZpbGUgPT4ge1xuXHRcdFx0XHRsZXQgdHIgPSB0Ym9keS5jcmVhdGVFbCgndHInKTtcblx0XHRcdFx0Ly8gRXZlbnRzXG5cdFx0XHRcdHRyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2dDogTW91c2VFdmVudCkgPT4geyB0aGlzLmRuSGFuZGxlQ2xpY2soZXZ0LCBmaWxlKSB9KTtcblx0XHRcdFx0dHIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7IHRoaXMuZG5IYW5kbGVDbGljayhldnQsIGZpbGUpIH0pO1xuXHRcdFx0XHR0ci5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIChldnQ6IE1vdXNlRXZlbnQpID0+IHsgdGhpcy5kbkhhbmRsZURibENsaWNrKGV2dCwgZmlsZSkgfSk7XG5cblx0XHRcdFx0dGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKHRyKTtcblxuXHRcdFx0XHRsZXQgdGQxID0gdHIuY3JlYXRlRWwoJ3RkJyk7XG5cdFx0XHRcdGxldCB0ZDFMaW5rID0gdGQxLmNyZWF0ZUVsKCdhJywgeyBjbHM6IHRoaXMuZG5TZXRGaWxlSWNvbkNsYXNzKGZpbGUuZXh0ZW5zaW9uKSwgdGV4dDogZmlsZS5uYW1lIH0pLm9uQ2xpY2tFdmVudCgoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxlYWYgIT09IG51bGwgJiYgZmlsZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy5kbk9wZW5GaWxlQWx0KGZpbGUsIGV2dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgZlNpemUgPSBmb3JtYXRGaWxlU2l6ZShmaWxlLnN0YXQuc2l6ZSk7XG5cdFx0XHRcdGxldCBmTVRpbWUgPSBtb21lbnQoZmlsZS5zdGF0Lm10aW1lKS5mb3JtYXQodGhpcy5kYXRlX2Zvcm1hdCk7XG5cdFx0XHRcdGxldCB0ZDIgPSB0ci5jcmVhdGVFbCgndGQnKTtcblx0XHRcdFx0bGV0IGZvbGRlcl9wYXRoID0gZ2V0Rm9sZGVyU3RydWN0dXJlKGZpbGUucGF0aCk7XG5cdFx0XHRcdGxldCB0ZDJfcGF0aCA9IHRkMi5jcmVhdGVFbCgnYScsIHsgY2xzOiAnZG4tZm9sZGVyLXBhdGgnLCB0ZXh0OiBmb2xkZXJfcGF0aCwgdGl0bGU6IGZpbGUucGF0aCB9KS5vbkNsaWNrRXZlbnQoKGV2dDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX0lOUFVUX1NFQVJDSC52YWx1ZSA9IGZvbGRlcl9wYXRoO1xuXHRcdFx0XHRcdHRoaXMuZG5TZWFyY2hWYXVsdCh0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUgKyAnJCcpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRsZXQgdGQzID0gdHIuY3JlYXRlRWwoJ3RkJywgeyB0ZXh0OiBmU2l6ZSwgdGl0bGU6IGZTaXplICsgJyBieXRlcycgfSk7XG5cdFx0XHRcdGxldCB0ZDQgPSB0ci5jcmVhdGVFbCgndGQnLCB7IHRleHQ6IGZNVGltZSwgdGl0bGU6IGZNVGltZSB9KTtcblx0XHRcdFx0bGV0IHRhZ3NfcGVyX2ZpbGUgPSB0aGlzLmRuR2V0VGFnc1BlckZpbGUoZmlsZSk7XG5cdFx0XHRcdGxldCB0ZDUgPSB0ci5jcmVhdGVFbCgndGQnLCB7IHRpdGxlOiB0YWdzX3Blcl9maWxlIH0pO1xuXHRcdFx0XHRsZXQgZlRhZ3MgPSB0YWdzX3Blcl9maWxlLnNwbGl0KCcgJyk7XG5cdFx0XHRcdGZUYWdzLmZvckVhY2goKHRhZykgPT4ge1xuXHRcdFx0XHRcdHRkNS5jcmVhdGVFbCgnYScsIHsgY2xzOiAnZG4tdGFnJywgdGV4dDogdGFnIH0pLm9uQ2xpY2tFdmVudCgoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUgPSB0YWc7XG5cdFx0XHRcdFx0XHR0aGlzLmRuU2VhcmNoVmF1bHQodGhpcy5fSU5QVVRfU0VBUkNILnZhbHVlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBZGQgcGFnaW5hdGlvblxuXHRcdFx0cGFnaW5hdGlvbkNvbnRhaW5lci5lbXB0eSgpO1xuXHRcdFx0Y29uc3QgcmVzdWx0c0NvdW50ID0gcGFnaW5hdGlvbkNvbnRhaW5lci5jcmVhdGVFbCgnc3BhbicsIHsgY2xzOiAnZG4tcGFnaW5hdGlvbi10b3RhbC1yZXN1bHRzJywgdGV4dDogYEZpbGUocyk6ICR7Zi5sZW5ndGh9YCArIHRoaXMuX3NlbGVjdGVkX2NhdGVnb3J5IH0pO1xuXHRcdFx0Y29uc3QgY3VycmVudFBhZ2VJbmRpY2F0b3IgPSBwYWdpbmF0aW9uQ29udGFpbmVyLmNyZWF0ZUVsKCdzcGFuJywgeyBjbHM6ICdkbi1wYWdpbmF0aW9uLWN1cnJlbnQtcGFnZScsIHRleHQ6IGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dGhpcy5fdG90YWxfcGFnZXN9YCB9KTtcblxuXHRcdFx0Y29uc3QgYnRuUHJldiA9IHBhZ2luYXRpb25Db250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiAnZG4tYnRuLXByZXYnLCB0ZXh0OiAnXHUyNUMwJywgdGl0bGU6ICdQcmV2aW91cycgfSk7XG5cdFx0XHRpZiAoY3VycmVudFBhZ2UgPT09IDEpIHtcblx0XHRcdFx0YnRuUHJldi5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidG5QcmV2LmRpc2FibGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRidG5QcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHRpZiAoY3VycmVudFBhZ2UgPiAxKSB7XG5cdFx0XHRcdFx0dGhpcy5kblNob3dTZWFyY2hSZXN1bHRzKHsgZiwgZWwsIGxlYWYsIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZSAtIDEgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYnRuTmV4dCA9IHBhZ2luYXRpb25Db250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiAnZG4tYnRuLW5leHQnLCB0ZXh0OiAnXHUyNUI2JywgdGl0bGU6ICdOZXh0JyB9KTtcblx0XHRcdGlmIChjdXJyZW50UGFnZSA9PT0gdGhpcy5fdG90YWxfcGFnZXMpIHtcblx0XHRcdFx0YnRuTmV4dC5kaXNhYmxlZCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidG5OZXh0LmRpc2FibGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGJ0bk5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cdFx0XHRcdGlmIChjdXJyZW50UGFnZSA8IHRoaXMuX3RvdGFsX3BhZ2VzKSB7XG5cdFx0XHRcdFx0dGhpcy5kblNob3dTZWFyY2hSZXN1bHRzKHsgZiwgZWwsIGxlYWYsIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZSArIDEgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmRuVXBkYXRlU29ydEluZGljYXRvcnModGhpcy5fc29ydF9jb2x1bW4sXG5cdFx0XHRcdHRoaXMuX3NvcnRfb3JkZXIsXG5cdFx0XHRcdHRoaXMuX3RoMSxcblx0XHRcdFx0dGhpcy5fdGgyLFxuXHRcdFx0XHR0aGlzLl90aDMsXG5cdFx0XHRcdHRoaXMuX3RoNCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dHIuZW1wdHkoKTtcblx0XHRcdHRoaXMuX2RpdlNlYXJjaFJlc3VsdHMuY3JlYXRlRWwoJ3AnLCB7IGNsczogJ2RuLW5vLXJlc3VsdHMtZm91bmQnLCB0ZXh0OiAnTm8gZmlsZXMgZm91bmQuJyB9KTtcblx0XHR9XG5cdH1cblxuXHRkbkFsdGVybmF0ZVNvcnRDb2x1bW4oY29sTmFtZTogc3RyaW5nKSB7XG5cdFx0c3dpdGNoIChjb2xOYW1lKSB7XG5cdFx0XHRjYXNlICduYW1lJzpcblx0XHRcdFx0dGhpcy5kblNvcnRDb2x1bW5TdHJpbmcoJ25hbWUnLCB0aGlzLl9zb3J0X29yZGVyLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXRoJzpcblx0XHRcdFx0dGhpcy5kblNvcnRDb2x1bW5TdHJpbmcoJ3BhdGgnLCB0aGlzLl9zb3J0X29yZGVyLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzaXplJzpcblx0XHRcdFx0dGhpcy5kblNvcnRDb2x1bW5OdW1iZXIoJ3NpemUnLCB0aGlzLl9zb3J0X29yZGVyLCB0cnVlKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdtb2RpZmllZCc6XG5cdFx0XHRcdHRoaXMuZG5Tb3J0Q29sdW1uTnVtYmVyKCdtb2RpZmllZCcsIHRoaXMuX3NvcnRfb3JkZXIsIHRydWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdFx0dGhpcy5kblNob3dTZWFyY2hSZXN1bHRzKHsgZjogdGhpcy5fZmlsdGVyZWRfZmlsZXMsIGVsOiB0aGlzLl9kaXZTZWFyY2hSZXN1bHRzLCBsZWFmOiB0aGlzLl9sZWFmIH0pO1xuXHR9XG5cblx0ZG5HZXRUYWdzUGVyRmlsZShmaWxlOiBURmlsZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgY3VyX2ZpbGUgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZS5wYXRoKTtcblx0XHRpZiAoY3VyX2ZpbGUgIT09IG51bGwpIHtcblxuXHRcdFx0Y29uc3QgdGFncyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpPy50YWdzO1xuXHRcdFx0Y29uc3QgZnJvbnRtYXR0ZXJfdGFncyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpPy5mcm9udG1hdHRlcjtcblx0XHRcdGNvbnN0IGFyclRhZ3M6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdGlmICh0YWdzKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cblx0XHRcdFx0XHRpZiAoYXJyVGFncy5pbmRleE9mKHRhZ3NbaV0udGFnKSA8IDApIHtcblx0XHRcdFx0XHRcdGFyclRhZ3MucHVzaCh0YWdzW2ldLnRhZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChmcm9udG1hdHRlcl90YWdzICE9PSB1bmRlZmluZWQgJiYgZnJvbnRtYXR0ZXJfdGFncy50YWdzKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBmcm9udG1hdHRlcl90YWdzLnRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblxuXHRcdFx0XHRcdGlmIChhcnJUYWdzLmluZGV4T2YoZnJvbnRtYXR0ZXJfdGFncy50YWdzW2ldKSA8IDApIHtcblx0XHRcdFx0XHRcdGFyclRhZ3MucHVzaCgnIycgKyBmcm9udG1hdHRlcl90YWdzLnRhZ3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYXJyVGFncy5qb2luKCcgJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0fVxuXG5cdGRuVXBkYXRlU29ydEluZGljYXRvcnMoYWN0aXZlQ29sdW1uOiBzdHJpbmcsIHNvcnRPcmRlcjogc3RyaW5nLCBjb2wxOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgY29sMjogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsIGNvbDM6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCBjb2w0OiBIVE1MVGFibGVDZWxsRWxlbWVudCkge1xuXHRcdGNvbDEuY2xhc3NMaXN0LnJlbW92ZSgnc29ydC1hY3RpdmUnLCAnc29ydC1hc2MnLCAnc29ydC1kZXNjJyk7XG5cdFx0Y29sMi5jbGFzc0xpc3QucmVtb3ZlKCdzb3J0LWFjdGl2ZScsICdzb3J0LWFzYycsICdzb3J0LWRlc2MnKTtcblx0XHRjb2wzLmNsYXNzTGlzdC5yZW1vdmUoJ3NvcnQtYWN0aXZlJywgJ3NvcnQtYXNjJywgJ3NvcnQtZGVzYycpO1xuXHRcdGNvbDQuY2xhc3NMaXN0LnJlbW92ZSgnc29ydC1hY3RpdmUnLCAnc29ydC1hc2MnLCAnc29ydC1kZXNjJyk7XG5cdFx0bGV0IGFjdGl2ZVRoQ2VsbCA9IGNvbDQ7XG5cdFx0c3dpdGNoIChhY3RpdmVDb2x1bW4pIHtcblx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRhY3RpdmVUaENlbGwgPSBjb2wxO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BhdGgnOlxuXHRcdFx0XHRhY3RpdmVUaENlbGwgPSBjb2wyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3NpemUnOlxuXHRcdFx0XHRhY3RpdmVUaENlbGwgPSBjb2wzO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ21vZGlmaWVkJzpcblx0XHRcdFx0YWN0aXZlVGhDZWxsID0gY29sNDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGFjdGl2ZVRoQ2VsbC5jbGFzc0xpc3QuYWRkKCdzb3J0LWFjdGl2ZScpO1xuXHRcdGFjdGl2ZVRoQ2VsbC5jbGFzc0xpc3QuYWRkKHNvcnRPcmRlciA9PT0gJ2FzYycgPyAnc29ydC1hc2MnIDogJ3NvcnQtZGVzYycpO1xuXHR9XG5cblx0ZG5Tb3J0Q29sdW1uU3RyaW5nKHNvcnRDb2x1bW46IHN0cmluZywgc29ydE9yZGVyOiBzdHJpbmcsIHRvZ2dsZVNvcnRPcmRlcjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHN1cHBvcnRlZENvbHVtbnMgPSBbJ25hbWUnLCAncGF0aCddO1xuXG5cdFx0aWYgKCFzdXBwb3J0ZWRDb2x1bW5zLmluY2x1ZGVzKHNvcnRDb2x1bW4pKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRvZ2dsZVNvcnRPcmRlcikge1xuXHRcdFx0aWYgKHRoaXMuX3NvcnRfY29sdW1uID09PSBzb3J0Q29sdW1uKSB7XG5cdFx0XHRcdHNvcnRPcmRlciA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3NvcnRfY29sdW1uID0gc29ydENvbHVtbjtcblx0XHRcdFx0c29ydE9yZGVyID0gJ2Rlc2MnO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc29ydF9vcmRlciA9IHNvcnRPcmRlcjtcblx0XHR9XG5cblx0XHRjb25zdCBzb3J0VmFsdWUgPSBzb3J0Q29sdW1uICsgJy0nICsgdGhpcy5fc29ydF9vcmRlcjtcblxuXHRcdHRoaXMuZG5TZXRTZWxlY3RTb3J0VmFsdWUoc29ydFZhbHVlKTtcblxuXHRcdHRoaXMuX2ZpbHRlcmVkX2ZpbGVzLnNvcnQoKGZpbGVBOiBURmlsZSwgZmlsZUI6IFRGaWxlKSA9PiB7XG5cdFx0XHRsZXQgc29ydEE6IHN0cmluZztcblx0XHRcdGxldCBzb3J0Qjogc3RyaW5nO1xuXHRcdFx0c3dpdGNoIChzb3J0Q29sdW1uKSB7XG5cdFx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRcdHNvcnRBID0gZmlsZUEubmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHNvcnRCID0gZmlsZUIubmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwYXRoJzpcblx0XHRcdFx0XHRjb25zdCBmb2xkZXJTdHJ1Y3R1cmVBID0gZ2V0Rm9sZGVyU3RydWN0dXJlKGZpbGVBLnBhdGgpO1xuXHRcdFx0XHRcdGNvbnN0IGZvbGRlclN0cnVjdHVyZUIgPSBnZXRGb2xkZXJTdHJ1Y3R1cmUoZmlsZUIucGF0aCk7XG5cdFx0XHRcdFx0c29ydEEgPSBmb2xkZXJTdHJ1Y3R1cmVBLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0c29ydEIgPSBmb2xkZXJTdHJ1Y3R1cmVCLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0c29ydEEgPSBmaWxlQS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0c29ydEIgPSBmaWxlQi5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzb3J0T3JkZXIgPT09ICdhc2MnKSB7XG5cdFx0XHRcdHJldHVybiBzb3J0QS5sb2NhbGVDb21wYXJlKHNvcnRCKTtcblx0XHRcdH0gZWxzZSBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcblx0XHRcdFx0cmV0dXJuIHNvcnRCLmxvY2FsZUNvbXBhcmUoc29ydEEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHNvcnRBLmxvY2FsZUNvbXBhcmUoc29ydEIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0ZG5Tb3J0Q29sdW1uTnVtYmVyKHNvcnRDb2x1bW46IHN0cmluZywgc29ydE9yZGVyOiBzdHJpbmcsIHRvZ2dsZVNvcnRPcmRlcjogYm9vbGVhbikge1xuXHRcdGNvbnN0IHN1cHBvcnRlZENvbHVtbnMgPSBbJ3NpemUnLCAnbW9kaWZpZWQnXTtcblxuXHRcdGlmICghc3VwcG9ydGVkQ29sdW1ucy5pbmNsdWRlcyhzb3J0Q29sdW1uKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0b2dnbGVTb3J0T3JkZXIpIHtcblx0XHRcdGlmICh0aGlzLl9zb3J0X2NvbHVtbiA9PT0gc29ydENvbHVtbikge1xuXHRcdFx0XHRzb3J0T3JkZXIgPSBzb3J0T3JkZXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zb3J0X2NvbHVtbiA9IHNvcnRDb2x1bW47XG5cdFx0XHRcdHNvcnRPcmRlciA9ICdkZXNjJztcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NvcnRfb3JkZXIgPSBzb3J0T3JkZXI7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc29ydFZhbHVlID0gc29ydENvbHVtbiArICctJyArIHRoaXMuX3NvcnRfb3JkZXI7XG5cblx0XHR0aGlzLmRuU2V0U2VsZWN0U29ydFZhbHVlKHNvcnRWYWx1ZSk7XG5cblx0XHR0aGlzLl9maWx0ZXJlZF9maWxlcy5zb3J0KChmaWxlQTogVEZpbGUsIGZpbGVCOiBURmlsZSkgPT4ge1xuXHRcdFx0bGV0IHNvcnRBOiBudW1iZXIgPSAwO1xuXHRcdFx0bGV0IHNvcnRCOiBudW1iZXIgPSAwO1xuXG5cdFx0XHRzd2l0Y2ggKHNvcnRDb2x1bW4pIHtcblx0XHRcdFx0Y2FzZSAnc2l6ZSc6XG5cdFx0XHRcdFx0c29ydEEgPSBmaWxlQS5zdGF0LnNpemU7XG5cdFx0XHRcdFx0c29ydEIgPSBmaWxlQi5zdGF0LnNpemU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ21vZGlmaWVkJzpcblx0XHRcdFx0XHRzb3J0QSA9IGZpbGVBLnN0YXQubXRpbWU7XG5cdFx0XHRcdFx0c29ydEIgPSBmaWxlQi5zdGF0Lm10aW1lO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc29ydE9yZGVyID09PSAnYXNjJykge1xuXHRcdFx0XHRyZXR1cm4gc29ydEEgLSBzb3J0Qjtcblx0XHRcdH0gZWxzZSBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcblx0XHRcdFx0cmV0dXJuIHNvcnRCIC0gc29ydEE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gc29ydEEgLSBzb3J0Qjtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cblx0YXN5bmMgZG5HZXRSZWNlbnRGaWxlcyhmaWxlczogVEZpbGVbXSk6IFByb21pc2U8VEZpbGVbXT4ge1xuXHRcdGNvbnN0IGFyclJlY2VudEZpbGVzID0gZmlsZXM7XG5cdFx0cmV0dXJuIGFyclJlY2VudEZpbGVzLnNvcnQoKGEsIGIpID0+IGIuc3RhdC5tdGltZSAtIGEuc3RhdC5tdGltZSkuc2xpY2UoMCwgdGhpcy5udW1fcmVjZW50X2ZpbGVzKTtcblx0fVxuXG5cdGFzeW5jIGRuT3JnYW5pemVGaWxlcyh7IGFyciB9OiB7IGFycjogVEZpbGVbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYXJyTm90ZXM6IFRGaWxlW10gPSBbXTtcblx0XHRjb25zdCBhcnJJbWFnZXM6IFRGaWxlW10gPSBbXTtcblx0XHRjb25zdCBhcnJBdWRpb3M6IFRGaWxlW10gPSBbXTtcblx0XHRjb25zdCBhcnJDYW52YXM6IFRGaWxlW10gPSBbXTtcblx0XHRjb25zdCBhcnJWaWRlb3M6IFRGaWxlW10gPSBbXTtcblx0XHRjb25zdCBhcnJQREZzOiBURmlsZVtdID0gW107XG5cdFx0Y29uc3QgYXJyT3RoZXI6IFRGaWxlW10gPSBbXTtcblxuXHRcdC8vIGZvcm1hdHNcblx0XHRjb25zdCBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBURmlsZVtdPiA9IHtcblx0XHRcdCdtZCc6IGFyck5vdGVzLFxuXHRcdFx0J3BuZyc6IGFyckltYWdlcyxcblx0XHRcdCdqcGcnOiBhcnJJbWFnZXMsXG5cdFx0XHQnd2VicCc6IGFyckltYWdlcyxcblx0XHRcdCdpY28nOiBhcnJJbWFnZXMsXG5cdFx0XHQnYm1wJzogYXJySW1hZ2VzLFxuXHRcdFx0J2dpZic6IGFyckltYWdlcyxcblx0XHRcdCd0aWYnOiBhcnJJbWFnZXMsXG5cdFx0XHQndGlmZic6IGFyckltYWdlcyxcblx0XHRcdCdyYXcnOiBhcnJJbWFnZXMsXG5cdFx0XHQnbXAzJzogYXJyQXVkaW9zLFxuXHRcdFx0J3dhdic6IGFyckF1ZGlvcyxcblx0XHRcdCdvZ2cnOiBhcnJBdWRpb3MsXG5cdFx0XHQnd2VibSc6IGFyckF1ZGlvcyxcblx0XHRcdCdtcDQnOiBhcnJWaWRlb3MsXG5cdFx0XHQnYXZpJzogYXJyVmlkZW9zLFxuXHRcdFx0J3BkZic6IGFyclBERnMsXG5cdFx0XHQnY2FudmFzJzogYXJyQ2FudmFzXG5cdFx0fTtcblxuXHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGYgPSBhcnJbaV0uZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRjb25zdCB0YXJnZXRBcnIgPSBleHRlbnNpb25zW2ZdO1xuXHRcdFx0aWYgKHRhcmdldEFycikge1xuXHRcdFx0XHR0YXJnZXRBcnIucHVzaChhcnJbaV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXJyT3RoZXIucHVzaChhcnJbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX25vdGVzID0gYXJyTm90ZXM7XG5cdFx0dGhpcy5faW1hZ2VzID0gYXJySW1hZ2VzO1xuXHRcdHRoaXMuX2F1ZGlvcyA9IGFyckF1ZGlvcztcblx0XHR0aGlzLl92aWRlb3MgPSBhcnJWaWRlb3M7XG5cdFx0dGhpcy5fcGRmID0gYXJyUERGcztcblx0XHR0aGlzLl9jYW52YXMgPSBhcnJDYW52YXM7XG5cdFx0dGhpcy5fb3RoZXIgPSBhcnJPdGhlcjtcblx0fVxuXG5cdGRuU2V0RmlsZUljb25DbGFzcyhleHQ6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVfZXh0ZW5zaW9uID0gZXh0LnRvTG93ZXJDYXNlKCk7XG5cblx0XHRjb25zdCBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0J21kJzogJ25vdGUnLFxuXHRcdFx0J3BuZyc6ICdpbWFnZScsXG5cdFx0XHQnanBnJzogJ2ltYWdlJyxcblx0XHRcdCd3ZWJwJzogJ2ltYWdlJyxcblx0XHRcdCdpY28nOiAnaW1hZ2UnLFxuXHRcdFx0J2JtcCc6ICdpbWFnZScsXG5cdFx0XHQnZ2lmJzogJ2ltYWdlJyxcblx0XHRcdCd0aWYnOiAnaW1hZ2UnLFxuXHRcdFx0J3RpZmYnOiAnaW1hZ2UnLFxuXHRcdFx0J3Jhdyc6ICdpbWFnZScsXG5cdFx0XHQnbXAzJzogJ2F1ZGlvJyxcblx0XHRcdCd3YXYnOiAnYXVkaW8nLFxuXHRcdFx0J29nZyc6ICdhdWRpbycsXG5cdFx0XHQnd2VibSc6ICdhdWRpbycsXG5cdFx0XHQnbXA0JzogJ3ZpZGVvJyxcblx0XHRcdCdhdmknOiAndmlkZW8nLFxuXHRcdFx0J3BkZic6ICdwZGYnLFxuXHRcdFx0J2NhbnZhcyc6ICdjYW52YXMnXG5cdFx0fTtcblxuXHRcdGlmIChmaWxlX2V4dGVuc2lvbiBpbiBleHRlbnNpb25zKSB7XG5cdFx0XHRyZXR1cm4gJ2RuLWYtJyArIGV4dGVuc2lvbnNbZmlsZV9leHRlbnNpb25dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gJ2RuLWYtb3RoZXInO1xuXHRcdH1cblx0fVxuXG5cdGRuU2V0Vmlldyh2aWV3OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBkaXZFbGVtZW50cyA9IFt0aGlzLl9WSUVXX0RBU0hCT0FSRCwgdGhpcy5fVklFV19OQVZJR0FUT1JdO1xuXHRcdGNvbnN0IHRvcE5hdkJ0bnMgPSBbdGhpcy5fQlROX0RBU0hCT0FSRCwgdGhpcy5fQlROX05BVklHQVRPUl07XG5cblx0XHRkaXZFbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcblx0XHRcdGVsLmNsYXNzTGlzdC5hZGQoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdFx0ZWwuY2xhc3NMaXN0LnJlbW92ZSgnZG4tZmxleCcpO1xuXHRcdH0pO1xuXHRcdHRvcE5hdkJ0bnMuZm9yRWFjaChidG4gPT4gYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ21vZC1jdGEnKSk7XG5cblx0XHRzd2l0Y2ggKHZpZXcpIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dGhpcy5fVklFV19EQVNIQk9BUkQuY2xhc3NMaXN0LnJlbW92ZSgnZG4tZGlzcGxheS1ub25lJyk7XG5cdFx0XHRcdHRoaXMuX1ZJRVdfREFTSEJPQVJELmNsYXNzTGlzdC5hZGQoJ2RuLWZsZXgnKTtcblx0XHRcdFx0dGhpcy5fQlROX0RBU0hCT0FSRC5jbGFzc0xpc3QuYWRkKCdtb2QtY3RhJyk7XG5cdFx0XHRcdHRoaXMuZG5IaWRlVG9wUmlnaHROYXYoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRoaXMuX1ZJRVdfTkFWSUdBVE9SLmNsYXNzTGlzdC5yZW1vdmUoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdFx0XHR0aGlzLl9WSUVXX05BVklHQVRPUi5jbGFzc0xpc3QuYWRkKCdkbi1mbGV4Jyk7XG5cdFx0XHRcdHRoaXMuX0JUTl9OQVZJR0FUT1IuY2xhc3NMaXN0LmFkZCgnbW9kLWN0YScpO1xuXHRcdFx0XHR0aGlzLmRuU2hvd1RvcFJpZ2h0TmF2KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5fVklFV19EQVNIQk9BUkQuY2xhc3NMaXN0LnJlbW92ZSgnZG4tZGlzcGxheS1ub25lJyk7XG5cdFx0XHRcdHRoaXMuX1ZJRVdfREFTSEJPQVJELmNsYXNzTGlzdC5hZGQoJ2RuLWZsZXgnKTtcblx0XHRcdFx0dGhpcy5fQlROX0RBU0hCT0FSRC5jbGFzc0xpc3QuYWRkKCdtb2QtY3RhJyk7XG5cdFx0XHRcdHRoaXMuZG5IaWRlVG9wUmlnaHROYXYoKTtcblx0XHR9XG5cdH1cblxuXHRkblNob3dUb3BSaWdodE5hdigpOiB2b2lkIHtcblx0XHR0aGlzLl9TRUxFQ1RfU09SVC5jbGFzc0xpc3QucmVtb3ZlKCdkbi1kaXNwbGF5LW5vbmUnKTtcblx0XHR0aGlzLl9TRUxFQ1RfVEFCTEVfTEFZT1VULmNsYXNzTGlzdC5yZW1vdmUoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdHRoaXMubGFiZWxMYXlvdXQuY2xhc3NMaXN0LnJlbW92ZSgnZG4tZGlzcGxheS1ub25lJyk7XG5cdFx0dGhpcy5sYWJlbFNvcnQuY2xhc3NMaXN0LnJlbW92ZSgnZG4tZGlzcGxheS1ub25lJyk7XG5cdH1cblxuXHRkbkhpZGVUb3BSaWdodE5hdigpOiB2b2lkIHtcblx0XHR0aGlzLl9TRUxFQ1RfU09SVC5jbGFzc0xpc3QuYWRkKCdkbi1kaXNwbGF5LW5vbmUnKTtcblx0XHR0aGlzLl9TRUxFQ1RfVEFCTEVfTEFZT1VULmNsYXNzTGlzdC5hZGQoJ2RuLWRpc3BsYXktbm9uZScpO1xuXHRcdHRoaXMubGFiZWxMYXlvdXQuY2xhc3NMaXN0LmFkZCgnZG4tZGlzcGxheS1ub25lJyk7XG5cdFx0dGhpcy5sYWJlbFNvcnQuY2xhc3NMaXN0LmFkZCgnZG4tZGlzcGxheS1ub25lJyk7XG5cdH1cblxuXHRkblNldFNlbGVjdFNvcnRWYWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmRuSXNWYWxpZFNvcnQodmFsKSkge1xuXG5cdFx0XHR0aGlzLnNlbGVjdGVkX3NvcnRfdmFsdWUgPSB2YWw7XG5cdFx0XHR0aGlzLl9TRUxFQ1RfU09SVC52YWx1ZSA9IHRoaXMuc2VsZWN0ZWRfc29ydF92YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRkblNldFNlbGVjdExheW91dFZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZG5Jc1ZhbGlkTGF5b3V0KHZhbCkpIHtcblxuXHRcdFx0dGhpcy5fU0VMRUNUX1RBQkxFX0xBWU9VVC52YWx1ZSA9IHZhbDtcblx0XHRcdHRoaXMuZG5TZWxlY3RUYWJsZUxheW91dCgpO1xuXHRcdH1cblx0fVxuXG5cdGRuT3BlbkZpbGVBbHQoZjogVEZpbGUsIGV2dDogTW91c2VFdmVudCkge1xuXHRcdGlmICghZXZ0IHx8IHR5cGVvZiBldnQgIT09ICdvYmplY3QnIHx8ICEoZiBpbnN0YW5jZW9mIFRGaWxlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKGV2dC5idXR0b24gPT09IDApICYmIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSkpIHtcblx0XHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoJ3RhYicpLm9wZW5GaWxlKGYpO1xuXHRcdFx0fSBlbHNlIGlmIChldnQuYnV0dG9uID09PSAxKSB7XG5cdFx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCd0YWInKS5vcGVuRmlsZShmKTtcblxuXHRcdFx0fSBlbHNlIGlmIChldnQuYnV0dG9uID09PSAwKSB7XG5cdFx0XHRcdHRoaXMuZG5PcGVuRmlsZShmKTtcblx0XHRcdH0gZWxzZSBpZiAoZXZ0LmJ1dHRvbiA9PT0gMiAmJiAhKGV2dC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGFibGVDZWxsRWxlbWVudCkpIHtcblx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdHRoaXMuZG5HZW5lcmF0ZUNvbnRleHRNZW51KGV2dCwgZik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRkbk9wZW5GaWxlKGZpbGU6IFRGaWxlKSB7XG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLm9wZW5GaWxlKGZpbGUpO1xuXHRcdHRoaXMuY2xvc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZG5IYW5kbGVDbGljayhldnQ6IE1vdXNlRXZlbnQsIGZpbGU/OiBURmlsZSkge1xuXHRcdGlmICghZXZ0IHx8IHR5cGVvZiBldnQgIT09ICdvYmplY3QnIHx8ICEoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZG5TZWxlY3RUYWJsZVJvdyhldnQpO1xuXHRcdGlmIChldnQuYnV0dG9uID09PSAyKSB7XG5cdFx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuZG5HZW5lcmF0ZUNvbnRleHRNZW51KGV2dCwgZmlsZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkbkhhbmRsZURibENsaWNrKGV2dDogTW91c2VFdmVudCwgZmlsZT86IFRGaWxlKSB7XG5cdFx0aWYgKCFldnQgfHwgdHlwZW9mIGV2dCAhPT0gJ29iamVjdCcgfHwgIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5kblNlbGVjdFRhYmxlUm93KGV2dCk7XG5cdFx0dGhpcy5kbk9wZW5GaWxlKGZpbGUpO1xuXHR9XG5cblx0ZG5TZWxlY3RUYWJsZUxheW91dCgpOiB2b2lkIHtcblx0XHRjb25zdCB2YWwgPSB0aGlzLl9TRUxFQ1RfVEFCTEVfTEFZT1VULnZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuX1RBQkxFX0xBWU9VVFMuaW5jbHVkZXModmFsKSkge1xuXHRcdFx0Y29uc3QgdGJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RuLXRhYmxlJyk7XG5cdFx0XHR0aGlzLl9UQUJMRV9MQVlPVVRTLmZvckVhY2gobGF5b3V0ID0+IHRibD8uY2xhc3NMaXN0LnJlbW92ZShsYXlvdXQpKTtcblx0XHRcdHRibD8uY2xhc3NMaXN0LmFkZCh2YWwpO1xuXHRcdFx0dGhpcy5zZWxlY3RlZF90YWJsZV9sYXlvdXQgPSB2YWw7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkblNlbGVjdFRhYmxlUm93KGV2dDogTW91c2VFdmVudCkge1xuXHRcdGlmICghZXZ0IHx8IHR5cGVvZiBldnQgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChldnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpIHtcblx0XHRcdGNvbnN0IGFsbFRyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RuLXRhYmxlIHRyJyk7XG5cdFx0XHRhbGxUci5mb3JFYWNoKHJvdyA9PiByb3cuY2xhc3NMaXN0LnJlbW92ZSgndGJsLXNlbGVjdGVkJykpO1xuXHRcdFx0Y29uc3QgY2xpY2tlZFRyID0gZXZ0LnRhcmdldC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XG5cdFx0XHRjbGlja2VkVHIuY2xhc3NMaXN0LmFkZCgndGJsLXNlbGVjdGVkJyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkbkdlbmVyYXRlQ29udGV4dE1lbnUoZXZ0OiBNb3VzZUV2ZW50LCBmaWxlOiBURmlsZSkge1xuXHRcdHRoaXMuX0ROX0NUWF9NRU5VID0gbmV3IE1lbnUoKTtcblxuXHRcdHRoaXMuX0ROX0NUWF9NRU5VLmFkZEl0ZW0oKGl0ZW0pID0+XG5cdFx0XHRpdGVtXG5cdFx0XHRcdC5zZXRUaXRsZSgnT3BlbicpXG5cdFx0XHRcdC5zZXRJY29uKCdtb3VzZS1wb2ludGVyLTInKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLm9wZW5GaWxlKGZpbGUpO1xuXHRcdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0dGhpcy5fRE5fQ1RYX01FTlUuYWRkU2VwYXJhdG9yKCk7XG5cblx0XHR0aGlzLl9ETl9DVFhfTUVOVS5hZGRJdGVtKChpdGVtKSA9PlxuXHRcdFx0aXRlbVxuXHRcdFx0XHQuc2V0VGl0bGUoJ09wZW4gaW4gbmV3IHRhYicpXG5cdFx0XHRcdC5zZXRJY29uKCdmaWxlLXBsdXMnKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoJ3RhYicpLm9wZW5GaWxlKGZpbGUpO1xuXHRcdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0dGhpcy5fRE5fQ1RYX01FTlUuYWRkSXRlbSgoaXRlbSkgPT5cblx0XHRcdGl0ZW1cblx0XHRcdFx0LnNldFRpdGxlKCdPcGVuIHRvIHRoZSByaWdodCcpXG5cdFx0XHRcdC5zZXRJY29uKCdzZXBhcmF0b3ItdmVydGljYWwnKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoJ3NwbGl0Jykub3BlbkZpbGUoZmlsZSk7XG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHR9KVxuXHRcdCk7XG5cblx0XHR0aGlzLl9ETl9DVFhfTUVOVS5hZGRJdGVtKChpdGVtKSA9PlxuXHRcdFx0aXRlbVxuXHRcdFx0XHQuc2V0VGl0bGUoJ09wZW4gaW4gbmV3IHdpbmRvdycpXG5cdFx0XHRcdC5zZXRJY29uKCdwaWN0dXJlLWluLXBpY3R1cmUtMicpXG5cdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZignd2luZG93Jykub3BlbkZpbGUoZmlsZSk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdHRoaXMuX0ROX0NUWF9NRU5VLmFkZFNlcGFyYXRvcigpO1xuXG5cdFx0dGhpcy5fRE5fQ1RYX01FTlUuYWRkSXRlbSgoaXRlbSkgPT5cblx0XHRcdGl0ZW1cblx0XHRcdFx0LnNldFRpdGxlKCdGaWxlIHByb3BlcnRpZXMnKVxuXHRcdFx0XHQuc2V0SWNvbignZmlsZS1jb2cnKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbWRGaWxlUHJvcHMgPSBuZXcgTW9kYWwodGhpcy5hcHApO1xuXHRcdFx0XHRcdG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnaDQnLCB7IHRleHQ6ICdQcm9wZXJ0aWVzJyB9KTtcblxuXHRcdFx0XHRcdGNvbnN0IHByb3BGaWxlTmFtZSA9IG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2Jyk7XG5cdFx0XHRcdFx0cHJvcEZpbGVOYW1lLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnRmlsZSBuYW1lOiAnLCBjbHM6ICdkbi1wcm9wZXJ0aWVzJyB9KTtcblx0XHRcdFx0XHRwcm9wRmlsZU5hbWUuY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6IGZpbGUuYmFzZW5hbWUgfSk7XG5cdFx0XHRcdFx0bWRGaWxlUHJvcHMuY29udGVudEVsLmNyZWF0ZUVsKCdicicpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcHJvcEZpbGVFeHQgPSBtZEZpbGVQcm9wcy5jb250ZW50RWwuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdFx0XHRcdHByb3BGaWxlRXh0LmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnRXh0ZW5zaW9uOiAnLCBjbHM6ICdkbi1wcm9wZXJ0aWVzJyB9KTtcblx0XHRcdFx0XHRwcm9wRmlsZUV4dC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogZmlsZS5leHRlbnNpb24sIGNsczogJ25hdi1maWxlLXRhZycgfSk7XG5cdFx0XHRcdFx0bWRGaWxlUHJvcHMuY29udGVudEVsLmNyZWF0ZUVsKCdicicpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcHJvcEZpbGVQYXRoID0gbWRGaWxlUHJvcHMuY29udGVudEVsLmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRcdFx0XHRwcm9wRmlsZVBhdGguY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6ICdQYXRoOiAnLCBjbHM6ICdkbi1wcm9wZXJ0aWVzJyB9KTtcblx0XHRcdFx0XHRwcm9wRmlsZVBhdGguY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6IGdldEZvbGRlclN0cnVjdHVyZShmaWxlLnBhdGgpIH0pO1xuXHRcdFx0XHRcdG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnYnInKTtcblxuXHRcdFx0XHRcdGNvbnN0IHByb3BGaWxlU2l6ZSA9IG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2Jyk7XG5cdFx0XHRcdFx0cHJvcEZpbGVTaXplLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnU2l6ZTogJywgY2xzOiAnZG4tcHJvcGVydGllcycgfSk7XG5cdFx0XHRcdFx0cHJvcEZpbGVTaXplLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiBmb3JtYXRGaWxlU2l6ZShmaWxlLnN0YXQuc2l6ZSkgKyAnIGJ5dGVzJyB9KTtcblx0XHRcdFx0XHRtZEZpbGVQcm9wcy5jb250ZW50RWwuY3JlYXRlRWwoJ2JyJyk7XG5cblx0XHRcdFx0XHRjb25zdCBwcm9wRGF0ZUNyZWF0ZWQgPSBtZEZpbGVQcm9wcy5jb250ZW50RWwuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdFx0XHRcdHByb3BEYXRlQ3JlYXRlZC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogJ0NyZWF0ZWQ6ICcsIGNsczogJ2RuLXByb3BlcnRpZXMnIH0pO1xuXHRcdFx0XHRcdHByb3BEYXRlQ3JlYXRlZC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogbW9tZW50KGZpbGUuc3RhdC5jdGltZSkuZm9ybWF0KHRoaXMuZGF0ZV9mb3JtYXQpIH0pO1xuXHRcdFx0XHRcdG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnYnInKTtcblxuXHRcdFx0XHRcdGNvbnN0IHByb3BEYXRlTW9kaWZpZWQgPSBtZEZpbGVQcm9wcy5jb250ZW50RWwuY3JlYXRlRWwoJ2RpdicpO1xuXHRcdFx0XHRcdHByb3BEYXRlTW9kaWZpZWQuY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6ICdNb2RpZmllZDogJywgY2xzOiAnZG4tcHJvcGVydGllcycgfSk7XG5cdFx0XHRcdFx0cHJvcERhdGVNb2RpZmllZC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogbW9tZW50KGZpbGUuc3RhdC5tdGltZSkuZm9ybWF0KHRoaXMuZGF0ZV9mb3JtYXQpIH0pO1xuXHRcdFx0XHRcdG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnYnInKTtcblxuXHRcdFx0XHRcdGNvbnN0IHByb3BUYWdzID0gbWRGaWxlUHJvcHMuY29udGVudEVsLmNyZWF0ZUVsKCdkaXYnKTtcblx0XHRcdFx0XHRjb25zdCBjdXJUYWdzID0gdGhpcy5kbkdldFRhZ3NQZXJGaWxlKGZpbGUpO1xuXHRcdFx0XHRcdHByb3BUYWdzLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnVGFnKHMpOiAnLCBjbHM6ICdkbi1wcm9wZXJ0aWVzJyB9KTtcblx0XHRcdFx0XHRpZiAoY3VyVGFncykge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFncyA9IGN1clRhZ3Muc3BsaXQoJyAnKTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BUYWdzLmNyZWF0ZUVsKCdhJywgeyB0ZXh0OiB0YWdzW2ldLCBjbHM6ICdkbi10YWcnIH0pLm9uQ2xpY2tFdmVudCgoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bWRGaWxlUHJvcHMuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUgPSB0YWdzW2ldO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZG5TZWFyY2hWYXVsdCh0aGlzLl9JTlBVVF9TRUFSQ0gudmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHByb3BUYWdzLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnTm8gdGFncycgfSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWRGaWxlUHJvcHMuY29udGVudEVsLmNyZWF0ZUVsKCdicicpO1xuXG5cblxuXHRcdFx0XHRcdG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnaHInKTtcblxuXHRcdFx0XHRcdGNvbnN0IGRpdkJvdHRvbSA9IG1kRmlsZVByb3BzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2JywgeyBjbHM6ICdkbi1kaXYtYm90dG9tLXByb3BlcnRpZXMnIH0pO1xuXHRcdFx0XHRcdGNvbnN0IGJ0bkNsb3NlUHJvcHMgPSBkaXZCb3R0b20uY3JlYXRlRWwoJ2J1dHRvbicsIHsgdGV4dDogJ09rJywgY2xzOiAnZG4tYnRuLWNsb3NlLXByb3BlcnRpZXMnIH0pO1xuXHRcdFx0XHRcdGJ0bkNsb3NlUHJvcHMub25DbGlja0V2ZW50KCgpID0+IHtcblx0XHRcdFx0XHRcdG1kRmlsZVByb3BzLmNsb3NlKCk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRtZEZpbGVQcm9wcy5vcGVuKCk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdHRoaXMuX0ROX0NUWF9NRU5VLnNob3dBdE1vdXNlRXZlbnQoZXZ0KTtcblx0fVxuXG5cdHByaXZhdGUgZG5IYW5kbGVJbnRlcnNlY3Rpb24gPSAoZW50cmllczogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdKSA9PiB7XG5cdFx0ZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcblx0XHRcdGlmICghZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcblx0XHRcdFx0ZW50cnkudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5kbkhhbmRsZUNsaWNrKTtcblx0XHRcdFx0ZW50cnkudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kbkhhbmRsZUNsaWNrKTtcblx0XHRcdFx0ZW50cnkudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5kbkhhbmRsZURibENsaWNrKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XG5cblx0XHRpZiAodGhpcy5fSU5QVVRfU0VBUkNIICYmIHRoaXMuX0lOUFVUX1NFQVJDSC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG5cdFx0XHR0aGlzLl9JTlBVVF9TRUFSQ0gucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBkZWJvdW5jZSgoKSA9PiB0aGlzLmRuU2VhcmNoVmF1bHQodGhpcy5fSU5QVVRfU0VBUkNILnZhbHVlKSwgMzAwLCB0cnVlKSk7XG5cdFx0fVxuXHRcdHRoaXMuX3RoMS5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHRoaXMuZG5BbHRlcm5hdGVTb3J0Q29sdW1uKCduYW1lJykpO1xuXHRcdHRoaXMuX3RoMi5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHRoaXMuZG5BbHRlcm5hdGVTb3J0Q29sdW1uKCdwYXRoJykpO1xuXHRcdHRoaXMuX3RoMy5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHRoaXMuZG5BbHRlcm5hdGVTb3J0Q29sdW1uKCdzaXplJykpO1xuXHRcdHRoaXMuX3RoNC5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHRoaXMuZG5BbHRlcm5hdGVTb3J0Q29sdW1uKCdtb2RpZmllZCcpKTtcblx0XHR0aGlzLl9TRUxFQ1RfU09SVC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7IHRoaXMuZG5Tb3J0Q29sdW1uV2l0aFNlbGVjdCgpOyB9KTtcblxuXHRcdGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG5cdFx0XHR0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHR9XG5cdH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoZmlsZVNpemU6IG51bWJlcik6IHN0cmluZyB7XG5cdGlmIChmaWxlU2l6ZSA9PT0gMCkge1xuXHRcdHJldHVybiBcIjBcIjtcblx0fVxuXHRjb25zdCBmb3JtYXR0ZWRTaXplID0gZmlsZVNpemUudG9GaXhlZCgwKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCBcIixcIik7XG5cblx0cmV0dXJuIGZvcm1hdHRlZFNpemU7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbGRlclN0cnVjdHVyZShmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGZvbGRlcnMgPSBmb2xkZXIuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKTtcblx0aWYgKGZvbGRlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIFwiL1wiO1xuXHR9XG5cblx0cmV0dXJuIFwiL1wiICsgZm9sZGVycy5qb2luKFwiL1wiKTtcbn0iLCAiZXhwb3J0IGNsYXNzIEROUGllQ2hhcnQge1xuXHRwcml2YXRlIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuXHRwcml2YXRlIF9jdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblx0cHJpdmF0ZSBfZGF0YTogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXTtcblx0cHJpdmF0ZSBfbWFyZ2luOiBudW1iZXI7XG5cdHByaXZhdGUgX2ZvbnRTaXplOiBudW1iZXI7XG5cdHByaXZhdGUgX2xlZ2VuZFdpZHRoOiBudW1iZXI7XG5cdHByaXZhdGUgX2xhYmVsQ29sb3I6IHN0cmluZztcblx0cHJpdmF0ZSBfY1g6IG51bWJlcjtcblx0cHJpdmF0ZSBfY1k6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcihjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBtYXJnaW4gPSAxMCwgZm9udFNpemUgPSAxMiwgbGVnZW5kV2lkdGggPSA1MCwgbGFiZWxDb2xvcjogc3RyaW5nID0gXCIjODI4MjgyXCIpIHtcblx0XHR0aGlzLl9jYW52YXMgPSBjYW52YXM7XG5cdFx0dGhpcy5fY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuXHRcdHRoaXMuX2RhdGEgPSBbXTtcblx0XHR0aGlzLl9tYXJnaW4gPSBtYXJnaW47XG5cdFx0dGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcblx0XHR0aGlzLl9sZWdlbmRXaWR0aCA9IGxlZ2VuZFdpZHRoO1xuXHRcdHRoaXMuX2xhYmVsQ29sb3IgPSBsYWJlbENvbG9yO1xuXHR9XG5cblx0YWRkRGF0YSh2YWx1ZTogbnVtYmVyLCBjb2xvcjogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5fZGF0YS5wdXNoKHsgdmFsdWUsIGNvbG9yLCBsYWJlbCB9KTtcblx0fVxuXG5cdGRyYXcoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLl9jYW52YXM7XG5cdFx0Y29uc3QgYXZhaWxXaWR0aCA9IHdpZHRoIC0gMiAqIHRoaXMuX21hcmdpbjtcblx0XHRjb25zdCBhdmFpbEhlaWdodCA9IGhlaWdodCAtIDIgKiB0aGlzLl9tYXJnaW47XG5cblx0XHRjb25zdCBzY2FsZSA9IE1hdGgubWluKGF2YWlsV2lkdGggLyB3aWR0aCwgYXZhaWxIZWlnaHQgLyBoZWlnaHQpO1xuXHRcdGNvbnN0IHJhZGl1cyA9IE1hdGgubWluKGF2YWlsV2lkdGgsIGF2YWlsSGVpZ2h0KSAvIDIgKiBzY2FsZTtcblxuXHRcdC8vIENlbnRlciBjb29yZGluYXRlc1xuXHRcdHRoaXMuX2NYID0gd2lkdGggLyAyO1xuXHRcdHRoaXMuX2NZID0gaGVpZ2h0IC8gMjtcblxuXHRcdHRoaXMuX2N0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cblx0XHRjb25zdCB0b3RhbFZhbHVlID0gdGhpcy5fZGF0YS5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci52YWx1ZSwgMCk7XG5cdFx0bGV0IGN1cnJlbnRBbmdsZSA9IC1NYXRoLlBJIC8gMjtcblx0XHR0aGlzLl9kYXRhLmZvckVhY2goKHNsaWNlKSA9PiB7XG5cdFx0XHRjb25zdCBzbGljZUFuZ2xlID0gKHNsaWNlLnZhbHVlIC8gdG90YWxWYWx1ZSkgKiAyICogTWF0aC5QSTtcblx0XHRcdHRoaXMuZHJhd1NsaWNlKHJhZGl1cywgc2xpY2VBbmdsZSwgc2xpY2UuY29sb3IsIGN1cnJlbnRBbmdsZSk7XG5cdFx0XHRjdXJyZW50QW5nbGUgKz0gc2xpY2VBbmdsZTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZHJhd0xlZ2VuZCgyLCAyMCk7XG5cdH1cblxuXHRwcml2YXRlIGRyYXdTbGljZShyYWRpdXM6IG51bWJlciwgc2xpY2VBbmdsZTogbnVtYmVyLCBjb2xvcjogc3RyaW5nLCBzdGFydEFuZ2xlOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLl9jdHguYmVnaW5QYXRoKCk7XG5cdFx0dGhpcy5fY3R4LmFyYyh0aGlzLl9jWCwgdGhpcy5fY1ksIHJhZGl1cywgc3RhcnRBbmdsZSwgc3RhcnRBbmdsZSArIHNsaWNlQW5nbGUpO1xuXHRcdHRoaXMuX2N0eC5saW5lVG8odGhpcy5fY1gsIHRoaXMuX2NZKTtcblx0XHR0aGlzLl9jdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdFx0dGhpcy5fY3R4LmNsb3NlUGF0aCgpO1xuXHRcdHRoaXMuX2N0eC5maWxsKCk7XG5cdH1cblxuXHRwcml2YXRlIGRyYXdMZWdlbmQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBsaW5lSGVpZ2h0ID0gdGhpcy5fZm9udFNpemUgKyA1O1xuXG5cdFx0dGhpcy5fZGF0YS5mb3JFYWNoKChzbGljZSwgaW5kZXgpID0+IHtcblx0XHRcdGNvbnN0IHRleHRYID0geCArIHRoaXMuX2xlZ2VuZFdpZHRoIC8gNTtcblx0XHRcdGNvbnN0IHRleHRZID0geSArIGluZGV4ICogbGluZUhlaWdodCAtIDEwO1xuXG5cdFx0XHQvLyBEcmF3IGxlZ2VuZCBzcXVhcmVcblx0XHRcdHRoaXMuX2N0eC5maWxsU3R5bGUgPSBzbGljZS5jb2xvcjtcblx0XHRcdHRoaXMuX2N0eC5maWxsUmVjdCh0ZXh0WCAtIDEwLCB0ZXh0WSwgNSwgNSk7XG5cblx0XHRcdC8vIERyYXcgbGFiZWxcblx0XHRcdHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLl9sYWJlbENvbG9yO1xuXHRcdFx0dGhpcy5fY3R4LmZvbnQgPSBgJHt0aGlzLl9mb250U2l6ZX1weCBzYW5zLXNlcmlmYDtcblx0XHRcdHRoaXMuX2N0eC5maWxsVGV4dChgJHtzbGljZS5sYWJlbH0gKCR7c2xpY2UudmFsdWV9KWAsIHRleHRYLCB0ZXh0WSArIDgpO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBdUI7OztBQ0F2QixzQkFBbUk7QUFJNUgsSUFBTSxlQUFOLGNBQTJCLGlDQUFpQjtBQUFBLEVBb0IvQyxZQUFZLEtBQVUsUUFBa0I7QUFDcEMsVUFBTSxLQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQSxFQUVBLFVBQWdCO0FBQ1osVUFBTSxFQUFFLFlBQVksSUFBSTtBQUV4QixnQkFBWSxNQUFNO0FBRWxCLFFBQUksd0JBQVEsV0FBVyxFQUNsQixRQUFRLDBCQUEwQixFQUNsQyxVQUFVLENBQUMsUUFBUTtBQUNoQixVQUFJLGNBQWMsTUFBTSxFQUNuQixXQUFXLDBCQUEwQixFQUNyQyxRQUFRLENBQUMsUUFBb0I7QUFDMUIsYUFBSyxPQUFPLFVBQVUsS0FBSztBQUFBLE1BQy9CLENBQUM7QUFBQSxJQUNULENBQUM7QUFHTCxRQUFJLHdCQUFRLFdBQVcsRUFDbEIsUUFBUSxjQUFjLEVBQ3RCLFFBQVEsaUNBQWlDLEVBQ3pDLFlBQVksU0FBTztBQUNoQixXQUFLLHNCQUFzQjtBQUMzQixVQUFJLFVBQVUsS0FBSyxXQUFXO0FBQzlCLFVBQUksVUFBVSxLQUFLLFdBQVc7QUFDOUIsVUFBSSxTQUFTLE9BQU8sUUFBZ0I7QUFFaEMsYUFBSyxPQUFPLFNBQVMsZUFBZSxTQUFTLEdBQUc7QUFFaEQsYUFBSyxPQUFPLFVBQVUsZUFBZSxLQUFLLE9BQU8sU0FBUztBQUUxRCxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDbkMsQ0FBQyxHQUNHLElBQUksU0FBUyxL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QUNmLGFBQUssVUFBVSxlQUFlO0FBQzlCLGFBQUssVUFBVSxLQUFLO0FBQUEsTUFDckI7QUFBQSxJQUNELENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNmLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsTUFBTTtBQUNmLGFBQUssVUFBVSxlQUFlO0FBQzlCLGFBQUssVUFBVSxLQUFLO0FBQUEsTUFDckI7QUFBQSxJQUNELENBQUM7QUFFRCxTQUFLLGNBQWMsSUFBSSxhQUFhLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxFQUVwRDtBQUFBLEVBRUEscUJBQXFCLGVBQWlDO0FBQ3JELFFBQUksa0JBQWtCLElBQUk7QUFDekIsYUFBTyxDQUFDO0FBQUEsSUFDVDtBQUVBLFVBQU0sVUFBVSxjQUFjLE1BQU0sR0FBRyxFQUFFLElBQUksWUFBVSxPQUFPLEtBQUssQ0FBQztBQUVwRSxXQUFPLFFBQVEsSUFBSSxZQUFVLE9BQU8sUUFBUSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsT0FBTyxZQUFVLFdBQVcsRUFBRTtBQUFBLEVBQ2pHO0FBQUEsRUFFQSxjQUFjLEtBQWE7QUFDMUIsUUFBSSxPQUFPLE1BQU0sT0FBTyxJQUFJO0FBQzNCLFlBQU0sU0FBUyxpQkFBaUIsU0FBUyxJQUFJO0FBQzdDLFlBQU0sV0FBVyxPQUFPLGlCQUFpQixnQkFBZ0I7QUFDekQsZUFBUyxLQUFLLE1BQU0sWUFBWSxrQkFBa0IsSUFBSSxTQUFTLElBQUksSUFBSTtBQUFBLElBQ3hFO0FBQUEsRUFDRDtBQUFBLEVBRUEsd0JBQXdCLGNBQWdDO0FBQ3ZELFFBQUksaUJBQWlCLElBQUk7QUFDeEIsYUFBTyxDQUFDO0FBQUEsSUFDVDtBQUVBLFdBQU8sYUFBYSxNQUFNLEdBQUcsRUFBRSxJQUFJLGVBQWEsVUFBVSxLQUFLLENBQUM7QUFBQSxFQUNqRTtBQUFBLEVBRUEsV0FBVztBQUFBLEVBRVg7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTztBQUFBLE1BQ3RCLENBQUM7QUFBQSxNQUNEO0FBQUEsTUFDQSxNQUFNLEtBQUssU0FBUztBQUFBLElBQUM7QUFBQSxFQUN2QjtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgInRyIiwgImV2dCJdCn0K