From fb76016bbb7a7d75cd3b94e46f733be5e70716ec Mon Sep 17 00:00:00 2001 From: zigholding Date: Sat, 14 Dec 2024 13:17:19 +0800 Subject: [PATCH] update --- data.json | 4 +- main.js | 185 +++++++++++++++++++++++++++++++++--------------- main.ts | 167 ++++++------------------------------------- src/commands.ts | 92 ++++++++++++++++++++++++ src/fseditor.ts | 73 ++++++++++++++++--- src/setting.ts | 67 ++++++++++++++++++ src/strings.ts | 2 +- 7 files changed, 375 insertions(+), 215 deletions(-) create mode 100644 src/commands.ts create mode 100644 src/setting.ts diff --git a/data.json b/data.json index ceef3b8..fedefc7 100644 --- a/data.json +++ b/data.json @@ -1,4 +1,4 @@ { - "pluginDirExporter": "D:\\iLanix\\Obsidian\\.obsidian\\plugins\nD:\\iLanix\\Obsidian\\.mobile\\plugins\nD:\\DataSync\\BaiduSyncdisk\\ZigHoldingShare\\ObsidianBaiduDisk\\.obsidian\\plugins\nD:\\github\\ObsidianZ-final\\.obsidian\\plugins", - "vaultDir": "D:\\iLanix\\isync\\Obsidian\nD:\\github\\ObsidianZ-final\nD:\\iLanix\\Obsidian" + "pluginDirExporter": "D:\\iLanix\\Obsidian\\.obsidian\\plugins\nD:\\iLanix\\Obsidian\\.mobile\\plugins\nD:\\DataSync\\BaiduSyncdisk\\ZigHoldingShare\\ObsidianBaiduDisk\\.obsidian\\plugins\nD:\\github\\ObsidianZ-final\\.obsidian\\plugins\nD:\\github\\ObsidianZY\\.obsidian\\plugins", + "vaultDir": "\n" } \ No newline at end of file diff --git a/main.js b/main.js index 1ed8016..2df9aac 100644 --- a/main.js +++ b/main.js @@ -27,7 +27,7 @@ __export(main_exports, { default: () => VaultExpoterPlugin }); module.exports = __toCommonJS(main_exports); -var import_obsidian2 = require("obsidian"); +var import_obsidian3 = require("obsidian"); // src/fseditor.ts var import_obsidian = require("obsidian"); @@ -41,9 +41,13 @@ var FsEditor = class { let a = this.plugin.app.vault.adapter; return a.basePath.replace(/\\/g, "/"); } + get notechain() { + let nc = this.plugin.app.plugins.getPlugin("note-chain"); + return nc; + } abspath(tfile) { if (tfile) { - return this.root + "/" + tfile.path; + return (this.root + "/" + tfile.path).replace(/\\/g, "/"); } else { return null; } @@ -54,7 +58,28 @@ var FsEditor = class { isdir(path) { return this.fs.existsSync(path) && this.fs.statSync(path).isDirectory(); } + list_dir(path, as_fullpath = true) { + if (!this.isdir(path)) { + return []; + } + let items = this.fs.readdirSync(path); + if (as_fullpath) { + items = items.map( + (x) => { + return path + "/" + x; + } + ); + } + return items; + } first_valid_dir(paths) { + if (typeof paths == "string") { + if (this.isdir(paths)) { + return paths; + } else { + return null; + } + } for (let path of paths) { if (this.isdir(path)) { return path; @@ -82,7 +107,7 @@ var FsEditor = class { if (this.isdir(path)) { return true; } - const parent = this.path.dirname(path); + let parent = this.path.dirname(path); if (!this.isdir(parent)) { this.mkdir_recursive(parent); } @@ -93,7 +118,7 @@ var FsEditor = class { * overwrite,复盖;mtime,新文件; */ copy_file(src, dst, mode = "pass>overwrite>mtime") { - const fs = this.fs; + let fs = this.fs; mode = mode.split(">")[0]; if (!fs.existsSync(src)) { return false; @@ -134,14 +159,12 @@ var FsEditor = class { this.mkdir_recursive(this.path.dirname(dst)); this.copy_file(src, dst, mode); if (attachment) { - console.log("attachment"); - let nc = this.plugin.app.plugins.getPlugin("note-chain"); + let nc = this.notechain; if (!nc) { return; } let tfiles = nc.chain.get_outlinks(tfile, false); for (let t of tfiles) { - console.log(t.name); if (!(t.extension === "md")) { this.mirror_tfile(t, vault_root, mode, false); } else if (outlink) { @@ -151,7 +174,7 @@ var FsEditor = class { } } } - mirror_tfolder(tfolder, vault_root, mode = "mtime", attachment = true, outlink = false) { + mirror_tfolder(tfolder, vault_root, mode = "mtime", attachment = true, outlink = false, strict = false) { if (tfolder) { for (let t of tfolder.children) { if (t instanceof import_obsidian.TFolder) { @@ -160,10 +183,38 @@ var FsEditor = class { this.mirror_tfile(t, vault_root, mode, attachment, outlink); } } + if (strict) { + let dst = vault_root + "/" + tfolder.path; + let src = this.abspath(tfolder); + if (src && dst) { + this.remove_files_not_in_src(src, dst); + } + } + } + } + remove_files_not_in_src(src, dst) { + console.log(src, dst); + if (!this.isdir(src) || !this.isdir(dst)) { + return; + } + let items = this.list_dir(dst, false); + for (let item of items) { + console.log(item); + let adst = dst + "/" + item; + let asrc = src + "/" + item; + if (this.isfile(adst)) { + if (!this.isfile(asrc)) { + this.fs.unlinkSync(adst); + } + } else if (this.isdir(adst)) { + if (!this.isdir(asrc)) { + this.fs.rmdirSync(dst); + } + } } } modify(path, callback, encoding = "utf8") { - const fs = this.fs; + let fs = this.fs; if (!fs.existsSync(path)) { return; } @@ -174,7 +225,6 @@ var FsEditor = class { (err, data) => { if (err) { console.error("Error reading file:", err); - ; } let rs = callback(path, data); fs.writeFile(path, rs, encoding, (err2) => { @@ -258,14 +308,49 @@ var Strings = class { }; var strings = new Strings(); -// main.ts +// src/setting.ts +var import_obsidian2 = require("obsidian"); var DEFAULT_SETTINGS = { pluginDirExporter: "", vaultDir: "" }; +var VExporterSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + getSettingValue(field) { + return this.plugin.settings[field]; + } + add_toggle(name, desc, field) { + let { containerEl } = this; + let value = this.plugin.settings[field]; + let item = new import_obsidian2.Setting(containerEl).setName(name).setDesc(desc).addToggle( + (text) => text.setValue(value).onChange(async (value2) => { + this.plugin.settings[field] = value2; + await this.plugin.saveSettings(); + }) + ); + return item; + } + display() { + const { containerEl } = this; + containerEl.empty(); + new import_obsidian2.Setting(containerEl).setName(this.plugin.strings.setting_plugin_dir).addTextArea((text) => text.setValue(this.plugin.settings.pluginDirExporter).onChange(async (value) => { + this.plugin.settings.pluginDirExporter = value; + await this.plugin.saveSettings(); + })); + new import_obsidian2.Setting(containerEl).setName(this.plugin.strings.setting_vault_dir).addTextArea((text) => text.setValue(this.plugin.settings.vaultDir).onChange(async (value) => { + this.plugin.settings.vaultDir = value; + await this.plugin.saveSettings(); + })); + } +}; + +// src/commands.ts var cmd_export_current_note = (plugin) => ({ id: "cmd_export_current_note", - name: strings.cmd_export_current_note, + name: plugin.strings.cmd_export_current_note, callback: async () => { const nc = plugin.notechain; let tfile = nc.chain.current_note; @@ -274,10 +359,10 @@ var cmd_export_current_note = (plugin) => ({ }); var cmd_set_vexporter = (plugin) => ({ id: "cmd_set_vexporter", - name: strings.cmd_set_vexporter, + name: plugin.strings.cmd_set_vexporter, callback: async () => { const nc = plugin.notechain; - let dir = await nc.chain.tp_prompt(strings.prompt_path_of_folder); + let dir = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); let item = {}; if (plugin.fsEditor.fs.existsSync(dir)) { item["Dir"] = dir; @@ -295,7 +380,7 @@ var cmd_set_vexporter = (plugin) => ({ }); var cmd_export_plugin = (plugin) => ({ id: "cmd_export_plugin", - name: strings.cmd_export_plugin, + name: plugin.strings.cmd_export_plugin, callback: async () => { const nc = plugin.notechain; let plugins = Object.keys(plugin.app.plugins.plugins); @@ -306,7 +391,7 @@ var cmd_export_plugin = (plugin) => ({ plugin.settings.pluginDirExporter.split("\n") ); if (!plugin.fsEditor.fs.existsSync(target)) { - target = await nc.chain.tp_prompt(strings.prompt_path_of_folder); + target = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); } target = target.replace(/\\/g, "/"); if (!target.endsWith("/" + p)) { @@ -324,7 +409,8 @@ var cmd_export_plugin = (plugin) => ({ } } }); -var commandBuilders = [ +var commandBuilders = []; +var commandBuildersDesktop = [ cmd_export_current_note, cmd_set_vexporter, cmd_export_plugin @@ -333,9 +419,28 @@ function addCommands(plugin) { commandBuilders.forEach((c) => { plugin.addCommand(c(plugin)); }); + if (plugin.app.isMobile == false) { + commandBuildersDesktop.forEach((c) => { + plugin.addCommand(c(plugin)); + }); + } } -var VaultExpoterPlugin = class extends import_obsidian2.Plugin { + +// main.ts +var VaultExpoterPlugin = class extends import_obsidian3.Plugin { async onload() { + if (this.app.workspace.layoutReady) { + await this._onload_(); + } else { + this.app.workspace.onLayoutReady( + async () => { + await this._onload_(); + } + ); + } + } + async _onload_() { + this.strings = new Strings(); await this.loadSettings(); this.fsEditor = new FsEditor(this); this.addSettingTab(new VExporterSettingTab(this.app, this)); @@ -350,18 +455,18 @@ var VaultExpoterPlugin = class extends import_obsidian2.Plugin { if (!dst) { let nc = this.app.plugins.getPlugin("note-chain"); if (!nc) { - new import_obsidian2.Notice("Plugin note-chain is needed!"); + new import_obsidian3.Notice("Plugin note-chain is needed!"); return; } dst = await nc.chain.tp_prompt("Root of vault"); if (!this.fsEditor.isdir(dst)) { - new import_obsidian2.Notice("Invalid root: " + dst); + new import_obsidian3.Notice("Invalid root: " + dst); return; } } - if (file instanceof import_obsidian2.TFile) { + if (file instanceof import_obsidian3.TFile) { this.fsEditor.mirror_tfile(file, dst, "mtime", true, false); - } else if (file instanceof import_obsidian2.TFolder) { + } else if (file instanceof import_obsidian3.TFolder) { this.fsEditor.mirror_tfolder(file, dst, "mtime", true, false); } }); @@ -393,7 +498,7 @@ var VaultExpoterPlugin = class extends import_obsidian2.Plugin { } } if (!dst || !this.fsEditor.fs.existsSync(dst)) { - new import_obsidian2.Notice(strings.notice_nosuchdir, 3e3); + new import_obsidian3.Notice(this.strings.notice_nosuchdir, 3e3); return; } dst = dst.replace(/\\/g, "/"); @@ -441,36 +546,4 @@ var VaultExpoterPlugin = class extends import_obsidian2.Plugin { } } }; -var VExporterSettingTab = class extends import_obsidian2.PluginSettingTab { - constructor(app, plugin) { - super(app, plugin); - this.plugin = plugin; - } - getSettingValue(field) { - return this.plugin.settings[field]; - } - add_toggle(name, desc, field) { - const { containerEl } = this; - let value = this.plugin.settings[field]; - let item = new import_obsidian2.Setting(containerEl).setName(name).setDesc(desc).addToggle( - (text) => text.setValue(value).onChange(async (value2) => { - this.plugin.settings[field] = value2; - await this.plugin.saveSettings(); - }) - ); - return item; - } - display() { - const { containerEl } = this; - containerEl.empty(); - new import_obsidian2.Setting(containerEl).setName(strings.setting_plugin_dir).addTextArea((text) => text.setValue(this.plugin.settings.pluginDirExporter).onChange(async (value) => { - this.plugin.settings.pluginDirExporter = value; - await this.plugin.saveSettings(); - })); - new import_obsidian2.Setting(containerEl).setName(strings.setting_vault_dir).addTextArea((text) => text.setValue(this.plugin.settings.vaultDir).onChange(async (value) => { - this.plugin.settings.vaultDir = value; - await this.plugin.saveSettings(); - })); - } -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIE1vZHVsZSBmcm9tICdtb2R1bGUnO1xyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IHsgRnNFZGl0b3IgfSBmcm9tICdzcmMvZnNlZGl0b3InO1xyXG5pbXBvcnQgeyBzdHJpbmdzIH0gZnJvbSAnc3JjL3N0cmluZ3MnO1xyXG5cclxuaW50ZXJmYWNlIFZFeHBvcnRlclNldHRpbmdzIHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjpzdHJpbmc7XHJcblx0dmF1bHREaXI6c3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBWRXhwb3J0ZXJTZXR0aW5ncyA9IHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjonJyxcclxuXHR2YXVsdERpcjonJ1xyXG59XHJcblxyXG5cclxuY29uc3QgY21kX2V4cG9ydF9jdXJyZW50X25vdGUgPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfY3VycmVudF9ub3RlJyxcclxuXHRuYW1lOiBzdHJpbmdzLmNtZF9leHBvcnRfY3VycmVudF9ub3RlLFxyXG5cdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRjb25zdCBuYyA9IHBsdWdpbi5ub3RlY2hhaW47XHJcblx0XHRsZXQgdGZpbGUgPSBuYy5jaGFpbi5jdXJyZW50X25vdGU7XHJcblx0XHRhd2FpdCBwbHVnaW4uZXhwb3J0X3JlYWRtZSh0ZmlsZSxudWxsKTtcclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY21kX3NldF92ZXhwb3J0ZXIgPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9zZXRfdmV4cG9ydGVyJyxcclxuXHRuYW1lOiBzdHJpbmdzLmNtZF9zZXRfdmV4cG9ydGVyLFxyXG5cdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRjb25zdCBuYyA9IHBsdWdpbi5ub3RlY2hhaW47XHJcblx0XHRsZXQgZGlyID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHN0cmluZ3MucHJvbXB0X3BhdGhfb2ZfZm9sZGVyKTtcclxuXHRcdGxldCBpdGVtOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblx0XHRpZihwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyhkaXIpKXtcclxuXHRcdFx0aXRlbVsnRGlyJ10gPSBkaXI7XHJcblx0XHR9XHJcblx0XHRpdGVtWydOYW1lJ10gPSAncmVhZE1lJztcclxuXHRcdGl0ZW1bJ0Fzc2V0cyddID0gJy4vYXNzZXRzJztcclxuXHRcdGl0ZW1bJ1JlbW92ZU1ldGEnXSA9IHRydWU7XHJcblx0XHRpdGVtWydVc2VHaXRMaW5rJ10gPSB0cnVlO1xyXG5cclxuXHRcdGF3YWl0IG5jLmVkaXRvci5zZXRfZnJvbnRtYXR0ZXIoXHJcblx0XHRcdG5jLmNoYWluLmN1cnJlbnRfbm90ZSxcclxuXHRcdFx0J3ZleHBvcnRlcicsXHJcblx0XHRcdGl0ZW1cclxuXHRcdClcclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY21kX2V4cG9ydF9wbHVnaW4gPSAocGx1Z2luOlZhdWx0RXhwb3RlclBsdWdpbikgPT4gKHtcclxuXHRpZDogJ2NtZF9leHBvcnRfcGx1Z2luJyxcclxuXHRuYW1lOiBzdHJpbmdzLmNtZF9leHBvcnRfcGx1Z2luLFxyXG5cdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRjb25zdCBuYyA9IHBsdWdpbi5ub3RlY2hhaW47XHJcblx0XHRcclxuXHRcdGxldCBwbHVnaW5zID0gT2JqZWN0LmtleXMoKHBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLnBsdWdpbnMpO1xyXG5cdFx0bGV0IHAgPSBhd2FpdCBuYy5jaGFpbi50cF9zdWdnZXN0ZXIocGx1Z2lucyxwbHVnaW5zKTtcclxuXHRcdGxldCBlcGx1Z2luID0gKHBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbihwKTtcclxuXHRcdGlmKGVwbHVnaW4pe1xyXG5cdFx0XHRsZXQgdGFyZ2V0ID0gYXdhaXQgcGx1Z2luLmZzRWRpdG9yLnNlbGVjdF92YWxpZF9kaXIoXHJcblx0XHRcdFx0cGx1Z2luLnNldHRpbmdzLnBsdWdpbkRpckV4cG9ydGVyLnNwbGl0KFwiXFxuXCIpXHJcblx0XHRcdClcclxuXHRcdFx0aWYoIXBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKHRhcmdldCkpe1xyXG5cdFx0XHRcdHRhcmdldCA9IGF3YWl0IG5jLmNoYWluLnRwX3Byb21wdChzdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0dGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG5cdFx0XHRpZighdGFyZ2V0LmVuZHNXaXRoKCcvJyArIHApKXtcclxuXHRcdFx0XHR0YXJnZXQgPSB0YXJnZXQgKyAnLycgKyBwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHRwbHVnaW4uZnNFZGl0b3IuZnMubWtkaXJTeW5jKHRhcmdldCk7XHJcblx0XHRcdH1cclxuXHRcdFx0bGV0IGl0ZW1zID0gWydtYWluLmpzJywnbWFuaWZlc3QuanNvbicsJ3N0eWxlcy5jc3MnXTtcclxuXHRcdFx0Zm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuXHRcdFx0XHRsZXQgc3JjID0gYCR7cGx1Z2luLmZzRWRpdG9yLnJvb3R9LyR7ZXBsdWdpbi5tYW5pZmVzdC5kaXJ9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdGxldCBkc3QgPSBgJHt0YXJnZXR9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5jb3B5X2ZpbGUoc3JjLGRzdCwnb3ZlcndyaXRlJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzID0gW1xyXG5cdGNtZF9leHBvcnRfY3VycmVudF9ub3RlLFxyXG5cdGNtZF9zZXRfdmV4cG9ydGVyLFxyXG5cdGNtZF9leHBvcnRfcGx1Z2luXHJcbl07XHJcblxyXG5mdW5jdGlvbiBhZGRDb21tYW5kcyhwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSB7XHJcbiAgICBjb21tYW5kQnVpbGRlcnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKGMocGx1Z2luKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5mc0VkaXRvciA9IG5ldyBGc0VkaXRvcih0aGlzKTtcclxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFZFeHBvcnRlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHRcdGFkZENvbW1hbmRzKHRoaXMpO1xyXG5cclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKFwiZmlsZS1tZW51XCIsIChtZW51LCBmaWxlKSA9PiB7XHJcblx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XHJcblx0XHRcdFx0XHRpdGVtXHJcblx0XHRcdFx0XHQuc2V0VGl0bGUoXCJNaXJyb3IgdG8gb3RoZXIgdmF1bHRcIilcclxuXHRcdFx0XHRcdC5zZXRJY29uKFwiZG9jdW1lbnRcIilcclxuXHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0bGV0IGRzdCA9IGF3YWl0IHRoaXMuZnNFZGl0b3Iuc2VsZWN0X3ZhbGlkX2RpcihcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLnZhdWx0RGlyLnNwbGl0KFwiXFxuXCIpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGlmKCFkc3Qpe1xyXG5cdFx0XHRcdFx0XHRcdGxldCBuYz0gKHRoaXMuYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4oXCJub3RlLWNoYWluXCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCFuYyl7XHJcblx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKFwiUGx1Z2luIG5vdGUtY2hhaW4gaXMgbmVlZGVkIVwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KFwiUm9vdCBvZiB2YXVsdFwiKTtcclxuXHRcdFx0XHRcdFx0XHRpZighdGhpcy5mc0VkaXRvci5pc2Rpcihkc3QpKXtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJJbnZhbGlkIHJvb3Q6IFwiICsgZHN0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKXtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZzRWRpdG9yLm1pcnJvcl90ZmlsZShmaWxlLGRzdCwnbXRpbWUnLHRydWUsZmFsc2UpO1xyXG5cclxuXHRcdFx0XHRcdFx0fWVsc2UgaWYoZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpe1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IubWlycm9yX3Rmb2xkZXIoZmlsZSxkc3QsJ210aW1lJyx0cnVlLGZhbHNlKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2Uoc3RyaW5ncy5ub3RpY2Vfbm9zdWNoZGlyLDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRkc3QgPSBkc3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcclxuXHRcdFxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU1RjUzXHU1MjREXHU3QjE0XHU4QkIwXHJcblx0XHRsZXQgdG1wO1xyXG5cdFx0bGV0IG5hbWUgPSBuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uTmFtZTtcclxuXHRcdGlmKG5hbWUgJiYgIShuYW1lPT09JycpKXtcclxuXHRcdFx0dG1wID0gZHN0KycvJytuYW1lKycubWQnO1xyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRtcCA9IGRzdCsnLycrdGZpbGUuYmFzZW5hbWUrJy5tZCc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5mc0VkaXRvci5jb3B5X3RmaWxlKHRmaWxlLHRtcCkpe1xyXG5cdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uUmVtb3ZlTWV0YSl7XHJcblx0XHRcdFx0Y29uc3QgdWZ1bmMgPSAocGF0aDpzdHJpbmcsZGF0YTpzdHJpbmcpPT57XHJcblx0XHRcdFx0XHRsZXQgcmVzID0gZGF0YTtcclxuXHRcdFx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRcdFx0cmVzID0gcmVzLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdFx0Ly0tLVtcXG4oXFxyXFxuKV1bXFxzXFxTXSo/LS0tW1xcbihcXHJcXG4pXS8sXHJcblx0XHRcdFx0XHRcdFx0JydcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlVzZUdpdExpbmsgJiYgYXNzZXRzKXtcclxuXHRcdFx0XHRcdFx0cmVzID0gcmVzLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdFx0L1xcIVxcW1xcWyguKj8pXFxdXFxdL2csXHJcblx0XHRcdFx0XHRcdFx0KG1hdGNoOmFueSwgbmFtZTpzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBgIVske25hbWV9XSgke2Fzc2V0c30vJHtuYW1lLnJlcGxhY2UoLyAvZywnJTIwJyl9KWA7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gcmVzXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuZnNFZGl0b3IubW9kaWZ5KHRtcCx1ZnVuYyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIFx1NUJGQ1x1NTFGQVx1OTY0NFx1NEVGNlxyXG5cdFx0bGV0IGFzc2V0cyA9IG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5Bc3NldHM7XHJcblx0XHRpZihhc3NldHMpe1xyXG5cdFx0XHRsZXQgb2xpbmtzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlKTtcclxuXHRcdFx0bGV0IGFkaXIgPSBkc3QrJy8nK2Fzc2V0cztcclxuXHRcdFx0dGhpcy5mc0VkaXRvci5ta2Rpcl9yZWN1cnNpdmUoYWRpcik7XHJcblx0XHRcdGZvcihsZXQgZiBvZiBvbGlua3Mpe1xyXG5cdFx0XHRcdGlmKCEoZi5leHRlbnNpb249PT0nbWQnKSl7XHJcblx0XHRcdFx0XHR0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUoZixhZGlyKycvJytmLmJhc2VuYW1lKycuJytmLmV4dGVuc2lvbik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5jbGFzcyBWRXhwb3J0ZXJTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBWYXVsdEV4cG90ZXJQbHVnaW47XHJcblx0XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRnZXRTZXR0aW5nVmFsdWUoZmllbGQ6IGtleW9mIFZFeHBvcnRlclNldHRpbmdzKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdO1xyXG5cdH1cclxuXHJcblx0YWRkX3RvZ2dsZShuYW1lOnN0cmluZyxkZXNjOnN0cmluZyxmaWVsZDprZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncyl7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHRcdGxldCB2YWx1ZSA9ICh0aGlzLnBsdWdpbi5zZXR0aW5ncyBhcyBhbnkpW2ZpZWxkXSBhcyBib29sZWFuO1xyXG5cdFx0bGV0IGl0ZW0gPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCkgIFxyXG5cdFx0XHQuc2V0TmFtZShuYW1lKVxyXG5cdFx0XHQuc2V0RGVzYyhkZXNjKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh2YWx1ZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOm5ldmVyKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5nc1tmaWVsZF0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHRyZXR1cm4gaXRlbTtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoc3RyaW5ncy5zZXR0aW5nX3BsdWdpbl9kaXIpXHJcblx0XHRcdC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoc3RyaW5ncy5zZXR0aW5nX3ZhdWx0X2RpcilcclxuXHRcdFx0XHQuYWRkVGV4dEFyZWEodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudmF1bHREaXIpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnZhdWx0RGlyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdH1cclxufVxyXG4iLCAiXHJcbmltcG9ydCB7IEFwcCwgRWRpdG9yLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgVEZpbGUsIFRGb2xkZXIgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRnNFZGl0b3J7XHJcbiAgICBmcztcclxuICAgIHBhdGg7XHJcbiAgICBwbHVnaW4gOlBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46UGx1Z2luKXtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgICAgICB0aGlzLmZzID0gcmVxdWlyZSgnZnMnKTtcclxuICAgICAgICB0aGlzLnBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKXtcclxuICAgICAgICBsZXQgYSA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyIGFzIGFueTtcclxuICAgICAgICByZXR1cm4gYS5iYXNlUGF0aC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuICAgIH1cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlKXtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMucm9vdCsnLycrdGZpbGUucGF0aDtcclxuXHRcdH1lbHNle1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgaXNmaWxlKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNGaWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNkaXIocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmMocGF0aCkgJiYgdGhpcy5mcy5zdGF0U3luYyhwYXRoKS5pc0RpcmVjdG9yeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcnN0X3ZhbGlkX2RpcihwYXRoczpBcnJheTxzdHJpbmc+fHN0cmluZyl7XHJcbiAgICAgICAgZm9yKGxldCBwYXRoIG9mIHBhdGhzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGxldCB4cGF0aHMgPSBwYXRocy5maWx0ZXIoKHA6c3RyaW5nKT0+dGhpcy5pc2RpcihwKSk7XHJcbiAgICAgICAgaWYoeHBhdGhzLmxlbmd0aD09PTApe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9ZWxzZSBpZih4cGF0aHMubGVuZ3RoPT0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIHhwYXRoc1swXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgIGlmKG5jKXtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHhwYXRocyx4cGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBta2Rpcl9yZWN1cnNpdmUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe3JldHVybiB0cnVlO31cclxuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhdGguZGlybmFtZShwYXRoKTtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihwYXJlbnQpKXtcclxuICAgICAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mcy5ta2RpclN5bmMocGF0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0KiBcdTk2NDRcdTRFRjYgc3JjIFx1NTIzMCBkc3RcdUZGMENcdTRFMERcdTU3MjggdmF1bHQgXHU0RTJEXHVGRjBDXHU5NzAwXHU4OTgxXHU3RUREXHU1QkY5XHU4REVGXHU1Rjg0XHJcblx0KiBvdmVyd3JpdGVcdUZGMENcdTU5MERcdTc2RDZcdUZGMUJtdGltZVx1RkYwQ1x1NjVCMFx1NjU4N1x1NEVGNlx1RkYxQlxyXG5cdCovXHJcbiAgICBjb3B5X2ZpbGUoc3JjOnN0cmluZyxkc3Q6c3RyaW5nLG1vZGU9J3Bhc3M+b3ZlcndyaXRlPm10aW1lJykge1xyXG4gICAgICAgIGNvbnN0IGZzID0gdGhpcy5mcztcclxuXHJcbiAgICAgICAgbW9kZSA9IG1vZGUuc3BsaXQoJz4nKVswXVxyXG4gICAgICAgIGlmKCFmcy5leGlzdHNTeW5jKHNyYykpe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcbiAgICAgICAgICAgIGlmKG1vZGU9PT0nb3ZlcndyaXRlJyl7XHJcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGRzdCk7XHJcbiAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDb3B5OiR7c3JjfS0tPiR7ZHN0fWAsNTAwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYobW9kZT09PSdtdGltZScpe1xyXG4gICAgICAgICAgICAgICAgLy8gZHN0IFx1NjZGNFx1NjVCMFx1NjVGNlx1OTVGNFx1NUMwRlx1NEU4RSBzcmNcclxuICAgICAgICAgICAgICAgIGlmKGZzLnN0YXRTeW5jKGRzdCkubXRpbWVNczxmcy5zdGF0U3luYyhzcmMpLm10aW1lTXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShgQ29weToke3NyY30tLT4ke2RzdH1gLDUwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgbmV3IE5vdGljZShgQ29weToke3NyY30tLT4ke2RzdH1gLDUwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcHlfdGZpbGUodGZpbGU6VEZpbGUsIGRzdDpzdHJpbmcsbW9kZT0nbXRpbWUnKSB7XHJcblx0XHRpZih0ZmlsZSl7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLmFic3BhdGgodGZpbGUpO1xyXG5cdFx0XHRyZXR1cm4gc3JjICYmIHRoaXMuY29weV9maWxlKHNyYyxkc3QsbW9kZSk7XHJcblx0XHR9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcbiAgICBtaXJyb3JfdGZpbGUodGZpbGU6VEZpbGUsdmF1bHRfcm9vdDpzdHJpbmcsbW9kZT0nbXRpbWUnLGF0dGFjaG1lbnQ9dHJ1ZSxvdXRsaW5rPWZhbHNlKXtcclxuICAgICAgICAvLyBcdTVDMDZcdTdCMTRcdThCQjBcdTk1NUNcdTUwQ0ZcdTc5RkJcdTUyQThcdTUyMzBcdTUyMkJcdTc2ODRcdTVFOTNcdTRFMkRcdUZGMENcdTY1ODdcdTRFRjZcdTdFRDNcdTY3ODRcdTRFMEVcdTVGNTNcdTUyNERcdTVFOTNcdTc2RjhcdTU0MENcclxuICAgICAgICBpZih0ZmlsZSl7XHJcbiAgICAgICAgICAgIHZhdWx0X3Jvb3QgPSB2YXVsdF9yb290LnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG5cdFx0XHRsZXQgc3JjID0gdGhpcy5yb290ICsgJy8nICsgdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3RmaWxlLnBhdGg7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJfcmVjdXJzaXZlKHRoaXMucGF0aC5kaXJuYW1lKGRzdCkpO1xyXG5cdFx0XHR0aGlzLmNvcHlfZmlsZShzcmMsZHN0LG1vZGUpO1xyXG4gICAgICAgICAgICBpZihhdHRhY2htZW50KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdhdHRhY2htZW50JylcclxuICAgICAgICAgICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgICAgICAgICAgaWYoIW5jKXtyZXR1cm47fVxyXG4gICAgICAgICAgICAgICAgbGV0IHRmaWxlcyA9IG5jLmNoYWluLmdldF9vdXRsaW5rcyh0ZmlsZSxmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IHQgb2YgdGZpbGVzKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0Lm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoISh0LmV4dGVuc2lvbj09PSdtZCcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG91dGxpbmspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvcl90ZmlsZSh0LHZhdWx0X3Jvb3QsbW9kZSxmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgbWlycm9yX3Rmb2xkZXIodGZvbGRlcjpURm9sZGVyLHZhdWx0X3Jvb3Q6c3RyaW5nLG1vZGU9J210aW1lJyxhdHRhY2htZW50PXRydWUsb3V0bGluaz1mYWxzZSl7XHJcbiAgICAgICAgaWYodGZvbGRlcil7XHJcbiAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0Zm9sZGVyLmNoaWxkcmVuKXtcclxuICAgICAgICAgICAgICAgIGlmKHQgaW5zdGFuY2VvZiBURm9sZGVyKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvcl90Zm9sZGVyKHQsdmF1bHRfcm9vdCxtb2RlLGF0dGFjaG1lbnQsb3V0bGluayk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0IGluc3RhbmNlb2YgVEZpbGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGF0dGFjaG1lbnQsb3V0bGluayk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnkocGF0aDpzdHJpbmcsY2FsbGJhY2s6RnVuY3Rpb24sZW5jb2Rpbmc9J3V0ZjgnKXtcclxuICAgICAgICBjb25zdCBmcyA9IHRoaXMuZnM7XHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMocGF0aCkpe3JldHVybn07XHJcblxyXG4gICAgICAgIGZzLnJlYWRGaWxlKHBhdGgsIGVuY29kaW5nLCAoZXJyOkVycm9yLCBkYXRhOnN0cmluZykgPT4ge1xyXG5cdFx0XHRpZihlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmaWxlOicsIGVycik7O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBycyA9IGNhbGxiYWNrKHBhdGgsZGF0YSk7XHJcblx0XHRcdGZzLndyaXRlRmlsZShwYXRoLCBycywgZW5jb2RpbmcsIChlcnI6RXJyb3IpID0+IHtcclxuXHRcdFx0ICBpZiAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3Igd3JpdGluZyBmaWxlOicsIGVycik7XHJcblx0XHRcdCAgfSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnRmlsZSBjb250ZW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG5cdFx0XHQgIH1cclxuXHRcdFx0fSk7XHJcblx0XHQgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsICJcclxuY2xhc3MgU3RyaW5nc3tcclxuICAgIGxhbmd1YWdlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgbGV0IGxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XHJcbiAgICAgICAgaWYobGFuZyl7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJztcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NUY1M1x1NTI0RFx1N0IxNFx1OEJCMCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgY3VycmVudCBub3RlJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNtZF9zZXRfdmV4cG9ydGVyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU4QkJFXHU3RjZFXHU1QkZDXHU1MUZBXHU3QjE0XHU4QkIwXHU5MDA5XHU5ODc5J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1NldCBjb25maWcgdG8gZXhwb3J0IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX2V4cG9ydF9wbHVnaW4oKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTVCRkNcdTUxRkFcdTYzRDJcdTRFRjYnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnRXhwb3J0IHBsdWdpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9tcHRfcGF0aF9vZl9mb2xkZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThGOTNcdTUxNjVcdTY1ODdcdTRFRjZcdTU5MzlcdThERUZcdTVGODQnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnSW5wdXQgcGF0aCBvZiBmb2xkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90aWNlX291dHB1dCgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1RkYxQSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdPdXRwdXQ6JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgbm90aWNlX25vc3VjaGRpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NjVFMFx1NjU0OFx1NzZFRVx1NUY1NSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnZhaWQgcGF0aC4nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ19wbHVnaW5fZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2M0QyXHU0RUY2XHU1QkZDXHU1MUZBXHU3NkVFXHU1RjU1JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdQbHVnaW4gZGlyIHRvIGV4cG9ydCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3ZhdWx0X2Rpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUU5M1x1NzZFRVx1NUY1NSc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnUm9vdCBkaXIgb2YgdmF1bHQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGxldCBzdHJpbmdzID0gbmV3IFN0cmluZ3MoKTsiXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsSUFBQUEsbUJBQTRHOzs7QUNBNUcsc0JBQTRHO0FBRXJHLElBQU0sV0FBTixNQUFjO0FBQUEsRUFLakIsWUFBWSxRQUFjO0FBQ3RCLFNBQUssU0FBUztBQUNkLFNBQUssS0FBSyxRQUFRLElBQUk7QUFDdEIsU0FBSyxPQUFPLFFBQVEsTUFBTTtBQUFBLEVBQzlCO0FBQUEsRUFFQSxJQUFJLE9BQU07QUFDTixRQUFJLElBQUksS0FBSyxPQUFPLElBQUksTUFBTTtBQUM5QixXQUFPLEVBQUUsU0FBUyxRQUFRLE9BQU0sR0FBRztBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxRQUFRLE9BQVk7QUFDdEIsUUFBRyxPQUFNO0FBQ1IsYUFBTyxLQUFLLE9BQUssTUFBSSxNQUFNO0FBQUEsSUFDNUIsT0FBSztBQUNK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QyxVQUFJLE9BQU8sTUFBSSxNQUFJO0FBQ25CLFdBQUssU0FBUyxnQkFBZ0IsSUFBSTtBQUNsQyxlQUFRLEtBQUssUUFBTztBQUNuQixZQUFHLEVBQUUsRUFBRSxjQUFZLE9BQU07QUFDeEIsZUFBSyxTQUFTLFdBQVcsR0FBRSxPQUFLLE1BQUksRUFBRSxXQUFTLE1BQUksRUFBRSxTQUFTO0FBQUEsUUFDL0Q7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDtBQUVBLElBQU0sc0JBQU4sY0FBa0Msa0NBQWlCO0FBQUEsRUFJbEQsWUFBWSxLQUFVLFFBQTRCO0FBQ2pELFVBQU0sS0FBSyxNQUFNO0FBQ2pCLFNBQUssU0FBUztBQUFBLEVBQ2Y7QUFBQSxFQUVBLGdCQUFnQixPQUFnQztBQUMvQyxXQUFPLEtBQUssT0FBTyxTQUFTLEtBQUs7QUFBQSxFQUNsQztBQUFBLEVBRUEsV0FBVyxNQUFZLE1BQVksT0FBOEI7QUFDaEUsVUFBTSxFQUFDLFlBQVcsSUFBSTtBQUN0QixRQUFJLFFBQVMsS0FBSyxPQUFPLFNBQWlCLEtBQUs7QUFDL0MsUUFBSSxPQUFPLElBQUkseUJBQVEsV0FBVyxFQUNoQyxRQUFRLElBQUksRUFDWixRQUFRLElBQUksRUFDWjtBQUFBLE1BQVUsVUFBUSxLQUNqQixTQUFTLEtBQUssRUFDZCxTQUFTLE9BQU9DLFdBQWdCO0FBQ2hDLGFBQUssT0FBTyxTQUFTLEtBQUssSUFBSUE7QUFDOUIsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNGO0FBQ0QsV0FBTztBQUFBLEVBQ1I7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsVUFBTSxFQUFDLFlBQVcsSUFBSTtBQUV0QixnQkFBWSxNQUFNO0FBRWxCLFFBQUkseUJBQVEsV0FBVyxFQUNyQixRQUFRLFFBQVEsa0JBQWtCLEVBQ2xDLFlBQVksVUFBUSxLQUNuQixTQUFTLEtBQUssT0FBTyxTQUFTLGlCQUFpQixFQUMvQyxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxvQkFBb0I7QUFDekMsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUVKLFFBQUkseUJBQVEsV0FBVyxFQUNwQixRQUFRLFFBQVEsaUJBQWlCLEVBQ2pDLFlBQVksVUFBUSxLQUNuQixTQUFTLEtBQUssT0FBTyxTQUFTLFFBQVEsRUFDdEMsU0FBUyxPQUFPLFVBQVU7QUFDMUIsV0FBSyxPQUFPLFNBQVMsV0FBVztBQUNoQyxZQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDaEMsQ0FBQyxDQUFDO0FBQUEsRUFDTjtBQUNEOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiZXJyIiwgIl9hIiwgIl9iIiwgIm5hbWUiLCAidmFsdWUiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiLCAic3JjL3NldHRpbmcudHMiLCAic3JjL2NvbW1hbmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBNb2R1bGUgZnJvbSAnbW9kdWxlJztcclxuaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBURmlsZSwgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCB7IEZzRWRpdG9yIH0gZnJvbSAnc3JjL2ZzZWRpdG9yJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJ3NyYy9zdHJpbmdzJztcclxuaW1wb3J0IHtWRXhwb3J0ZXJTZXR0aW5ncyxWRXhwb3J0ZXJTZXR0aW5nVGFiLERFRkFVTFRfU0VUVElOR1N9IGZyb20gJ3NyYy9zZXR0aW5nJ1xyXG5cclxuaW1wb3J0IHsgYWRkQ29tbWFuZHMgfSBmcm9tICdzcmMvY29tbWFuZHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzdHJpbmdzIDogU3RyaW5ncztcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGlmKHRoaXMuYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSl7XHJcblx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KFxyXG5cdFx0XHRcdGFzeW5jKCk9PntcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX29ubG9hZF8oKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgX29ubG9hZF8oKSB7XHJcblx0XHR0aGlzLnN0cmluZ3MgPSBuZXcgU3RyaW5ncygpO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmZzRWRpdG9yID0gbmV3IEZzRWRpdG9yKHRoaXMpO1xyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgVkV4cG9ydGVyU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0YWRkQ29tbWFuZHModGhpcyk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGUpID0+IHtcclxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcclxuXHRcdFx0XHRcdGl0ZW1cclxuXHRcdFx0XHRcdC5zZXRUaXRsZShcIk1pcnJvciB0byBvdGhlciB2YXVsdFwiKVxyXG5cdFx0XHRcdFx0LnNldEljb24oXCJkb2N1bWVudFwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRsZXQgZHN0ID0gYXdhaXQgdGhpcy5mc0VkaXRvci5zZWxlY3RfdmFsaWRfZGlyKFxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0dGluZ3MudmF1bHREaXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG5jPSAodGhpcy5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbihcIm5vdGUtY2hhaW5cIik7XHJcblx0XHRcdFx0XHRcdFx0aWYoIW5jKXtcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJQbHVnaW4gbm90ZS1jaGFpbiBpcyBuZWVkZWQhXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRkc3QgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoXCJSb290IG9mIHZhdWx0XCIpO1xyXG5cdFx0XHRcdFx0XHRcdGlmKCF0aGlzLmZzRWRpdG9yLmlzZGlyKGRzdCkpe1xyXG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIkludmFsaWQgcm9vdDogXCIgKyBkc3QpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZihmaWxlIGluc3RhbmNlb2YgVEZpbGUpe1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IubWlycm9yX3RmaWxlKGZpbGUsZHN0LCdtdGltZScsdHJ1ZSxmYWxzZSk7XHJcblxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihmaWxlIGluc3RhbmNlb2YgVEZvbGRlcil7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5mc0VkaXRvci5taXJyb3JfdGZvbGRlcihmaWxlLGRzdCwnbXRpbWUnLHRydWUsZmFsc2UpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdFxyXG5cdH1cclxuXHJcblx0Z2V0IG5vdGVjaGFpbigpe1xyXG5cdFx0cmV0dXJuICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cdFxyXG5cdGFzeW5jIGV4cG9ydF9yZWFkbWUodGZpbGU6VEZpbGUsZHN0OnN0cmluZ3xudWxsKXtcclxuXHRcdGxldCBuYyA9ICh0aGlzLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcblx0XHRpZighdGZpbGUpe3RmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO31cclxuXHRcdFxyXG5cdFx0Ly8gXHU4QkJFXHU3RjZFXHU4RjkzXHU1MUZBXHU3NkVFXHU1RjU1XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkRpcjtcclxuXHRcdFx0aWYoIWRzdCl7XHJcblx0XHRcdFx0ZHN0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KCdQYXRoIG9mIExvY2FsR2l0UHJvamVjdCcpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZighZHN0IHx8ICF0aGlzLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZHN0KSl7XHJcblx0XHRcdG5ldyBOb3RpY2UodGhpcy5zdHJpbmdzLm5vdGljZV9ub3N1Y2hkaXIsMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGRzdCA9IGRzdC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuXHRcdFxyXG5cdFx0XHJcblx0XHQvLyBcdTVCRkNcdTUxRkFcdTVGNTNcdTUyNERcdTdCMTRcdThCQjBcclxuXHRcdGxldCB0bXA7XHJcblx0XHRsZXQgbmFtZSA9IG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5OYW1lO1xyXG5cdFx0aWYobmFtZSAmJiAhKG5hbWU9PT0nJykpe1xyXG5cdFx0XHR0bXAgPSBkc3QrJy8nK25hbWUrJy5tZCc7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0dG1wID0gZHN0KycvJyt0ZmlsZS5iYXNlbmFtZSsnLm1kJztcclxuXHRcdH1cclxuXHJcblx0XHRpZih0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUodGZpbGUsdG1wKSl7XHJcblx0XHRcdGlmKG5jLmVkaXRvci5nZXRfZnJvbnRtYXR0ZXIodGZpbGUsJ3ZleHBvcnRlcicpPy5SZW1vdmVNZXRhKXtcclxuXHRcdFx0XHRjb25zdCB1ZnVuYyA9IChwYXRoOnN0cmluZyxkYXRhOnN0cmluZyk9PntcclxuXHRcdFx0XHRcdGxldCByZXMgPSBkYXRhO1xyXG5cdFx0XHRcdFx0aWYobmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LlJlbW92ZU1ldGEpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvLS0tW1xcbihcXHJcXG4pXVtcXHNcXFNdKj8tLS1bXFxuKFxcclxcbildLyxcclxuXHRcdFx0XHRcdFx0XHQnJ1xyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihuYy5lZGl0b3IuZ2V0X2Zyb250bWF0dGVyKHRmaWxlLCd2ZXhwb3J0ZXInKT8uVXNlR2l0TGluayAmJiBhc3NldHMpe1xyXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMucmVwbGFjZShcclxuXHRcdFx0XHRcdFx0XHQvXFwhXFxbXFxbKC4qPylcXF1cXF0vZyxcclxuXHRcdFx0XHRcdFx0XHQobWF0Y2g6YW55LCBuYW1lOnN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGAhWyR7bmFtZX1dKCR7YXNzZXRzfS8ke25hbWUucmVwbGFjZSgvIC9nLCclMjAnKX0pYDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiByZXNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mc0VkaXRvci5tb2RpZnkodG1wLHVmdW5jKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gXHU1QkZDXHU1MUZBXHU5NjQ0XHU0RUY2XHJcblx0XHRsZXQgYXNzZXRzID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSwndmV4cG9ydGVyJyk/LkFzc2V0cztcclxuXHRcdGlmKGFzc2V0cyl7XHJcblx0XHRcdGxldCBvbGlua3MgPSBuYy5jaGFpbi5nZXRfb3V0bGlua3ModGZpbGUpO1xyXG5cdFx0XHRsZXQgYWRpciA9IGRzdCsnLycrYXNzZXRzO1xyXG5cdFx0XHR0aGlzLmZzRWRpdG9yLm1rZGlyX3JlY3Vyc2l2ZShhZGlyKTtcclxuXHRcdFx0Zm9yKGxldCBmIG9mIG9saW5rcyl7XHJcblx0XHRcdFx0aWYoIShmLmV4dGVuc2lvbj09PSdtZCcpKXtcclxuXHRcdFx0XHRcdHRoaXMuZnNFZGl0b3IuY29weV90ZmlsZShmLGFkaXIrJy8nK2YuYmFzZW5hbWUrJy4nK2YuZXh0ZW5zaW9uKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIlxyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZzRWRpdG9ye1xyXG4gICAgZnM7XHJcbiAgICBwYXRoO1xyXG4gICAgcGx1Z2luIDpQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOlBsdWdpbil7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XHJcbiAgICAgICAgdGhpcy5wYXRoID0gcmVxdWlyZSgncGF0aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCl7XHJcbiAgICAgICAgbGV0IGEgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlciBhcyBhbnk7XHJcbiAgICAgICAgcmV0dXJuIGEuYmFzZVBhdGgucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdGVjaGFpbigpe1xyXG4gICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgIHJldHVybiBuY1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlfFRGb2xkZXIpe1xyXG5cdFx0aWYodGZpbGUpe1xyXG5cdFx0XHRyZXR1cm4gKHRoaXMucm9vdCsnLycrdGZpbGUucGF0aCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIGlzZmlsZShwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyhwYXRoKSAmJiB0aGlzLmZzLnN0YXRTeW5jKHBhdGgpLmlzRmlsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzZGlyKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0X2RpcihwYXRoOnN0cmluZyxhc19mdWxscGF0aD10cnVlKXtcclxuICAgICAgICBpZighdGhpcy5pc2RpcihwYXRoKSl7cmV0dXJuIFtdfVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZnMucmVhZGRpclN5bmMocGF0aClcclxuICAgICAgICBpZihhc19mdWxscGF0aCl7XHJcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKFxyXG4gICAgICAgICAgICAgICAgKHg6c3RyaW5nKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoKycvJyt4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9ICAgXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz58c3RyaW5nKXtcclxuICAgICAgICBpZih0eXBlb2YocGF0aHMpPT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aHMpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoc1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKGxldCBwYXRoIG9mIHBhdGhzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RfdmFsaWRfZGlyKHBhdGhzOkFycmF5PHN0cmluZz4pe1xyXG4gICAgICAgIGxldCB4cGF0aHMgPSBwYXRocy5maWx0ZXIoKHA6c3RyaW5nKT0+dGhpcy5pc2RpcihwKSk7XHJcbiAgICAgICAgaWYoeHBhdGhzLmxlbmd0aD09PTApe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9ZWxzZSBpZih4cGF0aHMubGVuZ3RoPT0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIHhwYXRoc1swXTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgbGV0IG5jID0gKHRoaXMucGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKCdub3RlLWNoYWluJyk7XHJcbiAgICAgICAgICAgIGlmKG5jKXtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHhwYXRocyx4cGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBta2Rpcl9yZWN1cnNpdmUocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNkaXIocGF0aCkpe3JldHVybiB0cnVlO31cclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXRoLmRpcm5hbWUocGF0aCk7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNkaXIocGFyZW50KSl7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJfcmVjdXJzaXZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnMubWtkaXJTeW5jKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCogXHU5NjQ0XHU0RUY2IHNyYyBcdTUyMzAgZHN0XHVGRjBDXHU0RTBEXHU1NzI4IHZhdWx0IFx1NEUyRFx1RkYwQ1x1OTcwMFx1ODk4MVx1N0VERFx1NUJGOVx1OERFRlx1NUY4NFxyXG5cdCogb3ZlcndyaXRlXHVGRjBDXHU1OTBEXHU3NkQ2XHVGRjFCbXRpbWVcdUZGMENcdTY1QjBcdTY1ODdcdTRFRjZcdUZGMUJcclxuXHQqL1xyXG4gICAgY29weV9maWxlKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdwYXNzPm92ZXJ3cml0ZT5tdGltZScpIHtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG5cclxuICAgICAgICBtb2RlID0gbW9kZS5zcGxpdCgnPicpWzBdXHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMoc3JjKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoZnMuZXhpc3RzU3luYyhkc3QpKXtcclxuICAgICAgICAgICAgaWYobW9kZT09PSdvdmVyd3JpdGUnKXtcclxuICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZHN0KTtcclxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoYENvcHk6JHtzcmN9LS0+JHtkc3R9YCw1MDAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihtb2RlPT09J210aW1lJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBkc3QgXHU2NkY0XHU2NUIwXHU2NUY2XHU5NUY0XHU1QzBGXHU0RThFIHNyY1xyXG4gICAgICAgICAgICAgICAgaWYoZnMuc3RhdFN5bmMoZHN0KS5tdGltZU1zPGZzLnN0YXRTeW5jKHNyYykubXRpbWVNcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKGBDb3B5OiR7c3JjfS0tPiR7ZHN0fWAsNTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyYyxkc3QpO1xyXG4gICAgICAgICAgICBuZXcgTm90aWNlKGBDb3B5OiR7c3JjfS0tPiR7ZHN0fWAsNTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29weV90ZmlsZSh0ZmlsZTpURmlsZSwgZHN0OnN0cmluZyxtb2RlPSdtdGltZScpIHtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0bGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0ZmlsZSk7XHJcblx0XHRcdHJldHVybiBzcmMgJiYgdGhpcy5jb3B5X2ZpbGUoc3JjLGRzdCxtb2RlKTtcclxuXHRcdH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuICAgIG1pcnJvcl90ZmlsZSh0ZmlsZTpURmlsZSx2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Upe1xyXG4gICAgICAgIC8vIFx1NUMwNlx1N0IxNFx1OEJCMFx1OTU1Q1x1NTBDRlx1NzlGQlx1NTJBOFx1NTIzMFx1NTIyQlx1NzY4NFx1NUU5M1x1NEUyRFx1RkYwQ1x1NjU4N1x1NEVGNlx1N0VEM1x1Njc4NFx1NEUwRVx1NUY1M1x1NTI0RFx1NUU5M1x1NzZGOFx1NTQwQ1xyXG4gICAgICAgIGlmKHRmaWxlKXtcclxuICAgICAgICAgICAgdmF1bHRfcm9vdCA9IHZhdWx0X3Jvb3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLnJvb3QgKyAnLycgKyB0ZmlsZS5wYXRoO1xyXG4gICAgICAgICAgICBsZXQgZHN0ID0gdmF1bHRfcm9vdCsnLycrdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgdGhpcy5ta2Rpcl9yZWN1cnNpdmUodGhpcy5wYXRoLmRpcm5hbWUoZHN0KSk7XHJcblx0XHRcdHRoaXMuY29weV9maWxlKHNyYyxkc3QsbW9kZSk7XHJcbiAgICAgICAgICAgIGlmKGF0dGFjaG1lbnQpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5jID0gdGhpcy5ub3RlY2hhaW47XHJcbiAgICAgICAgICAgICAgICBpZighbmMpe3JldHVybjt9XHJcbiAgICAgICAgICAgICAgICBsZXQgdGZpbGVzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdCBvZiB0ZmlsZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEodC5leHRlbnNpb249PT0nbWQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvdXRsaW5rKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIG1pcnJvcl90Zm9sZGVyKHRmb2xkZXI6VEZvbGRlcix2YXVsdF9yb290OnN0cmluZyxtb2RlPSdtdGltZScsYXR0YWNobWVudD10cnVlLG91dGxpbms9ZmFsc2Usc3RyaWN0PWZhbHNlKXtcclxuICAgICAgICBpZih0Zm9sZGVyKXtcclxuICAgICAgICAgICAgZm9yKGxldCB0IG9mIHRmb2xkZXIuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgaWYodCBpbnN0YW5jZW9mIFRGb2xkZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3Rmb2xkZXIodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHQgaW5zdGFuY2VvZiBURmlsZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JfdGZpbGUodCx2YXVsdF9yb290LG1vZGUsYXR0YWNobWVudCxvdXRsaW5rKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihzdHJpY3Qpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3Rmb2xkZXIucGF0aFxyXG4gICAgICAgICAgICAgICAgbGV0IHNyYyA9IHRoaXMuYWJzcGF0aCh0Zm9sZGVyKVxyXG4gICAgICAgICAgICAgICAgaWYoc3JjICYmIGRzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVfZmlsZXNfbm90X2luX3NyYyhzcmMsZHN0KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlX2ZpbGVzX25vdF9pbl9zcmMoc3JjOnN0cmluZyxkc3Q6c3RyaW5nKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhzcmMsZHN0KVxyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKHNyYykgfHwgIXRoaXMuaXNkaXIoZHN0KSl7cmV0dXJufVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMubGlzdF9kaXIoZHN0LGZhbHNlKVxyXG4gICAgICAgIGZvcihsZXQgaXRlbSBvZiBpdGVtcyl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXHJcbiAgICAgICAgICAgIGxldCBhZHN0ID0gZHN0KycvJytpdGVtXHJcbiAgICAgICAgICAgIGxldCBhc3JjID0gc3JjKycvJytpdGVtXHJcbiAgICAgICAgICAgIGlmKHRoaXMuaXNmaWxlKGFkc3QpKXtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGlzLmlzZmlsZShhc3JjKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcy51bmxpbmtTeW5jKGFkc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuaXNkaXIoYWRzdCkpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNkaXIoYXNyYykpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnMucm1kaXJTeW5jKGRzdClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnkocGF0aDpzdHJpbmcsY2FsbGJhY2s6RnVuY3Rpb24sZW5jb2Rpbmc9J3V0ZjgnKXtcclxuICAgICAgICBsZXQgZnMgPSB0aGlzLmZzO1xyXG4gICAgICAgIGlmKCFmcy5leGlzdHNTeW5jKHBhdGgpKXtyZXR1cm59O1xyXG5cclxuICAgICAgICBmcy5yZWFkRmlsZShwYXRoLCBlbmNvZGluZywgKGVycjpFcnJvciwgZGF0YTpzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYoZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgZmlsZTonLCBlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBycyA9IGNhbGxiYWNrKHBhdGgsZGF0YSk7XHJcblx0XHRcdGZzLndyaXRlRmlsZShwYXRoLCBycywgZW5jb2RpbmcsIChlcnI6RXJyb3IpID0+IHtcclxuXHRcdFx0ICBpZiAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3Igd3JpdGluZyBmaWxlOicsIGVycik7XHJcblx0XHRcdCAgfSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnRmlsZSBjb250ZW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG5cdFx0XHQgIH1cclxuXHRcdFx0fSk7XHJcblx0XHQgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwgIlxyXG5leHBvcnQgY2xhc3MgU3RyaW5nc3tcclxuICAgIGxhbmd1YWdlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgbGV0IGxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XHJcbiAgICAgICAgaWYobGFuZyl7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJztcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZSgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1NUY1M1x1NTI0RFx1N0IxNFx1OEJCMCdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdFeHBvcnQgY3VycmVudCBub3RlJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNtZF9zZXRfdmV4cG9ydGVyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU4QkJFXHU3RjZFXHU1QkZDXHU1MUZBXHU3QjE0XHU4QkIwXHU5MDA5XHU5ODc5J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1NldCBjb25maWcgdG8gZXhwb3J0IG5vdGUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX2V4cG9ydF9wbHVnaW4oKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTVCRkNcdTUxRkFcdTYzRDJcdTRFRjYnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnRXhwb3J0IHBsdWdpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9tcHRfcGF0aF9vZl9mb2xkZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThGOTNcdTUxNjVcdTY1ODdcdTRFRjZcdTU5MzlcdThERUZcdTVGODQnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnSW5wdXQgcGF0aCBvZiBmb2xkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90aWNlX291dHB1dCgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1RkYxQSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdPdXRwdXQ6JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgbm90aWNlX25vc3VjaGRpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NjVFMFx1NjU0OFx1NzZFRVx1NUY1NSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdJbnZhaWQgcGF0aC4nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ19wbHVnaW5fZGlyKCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU2M0QyXHU0RUY2XHU1QkZDXHU1MUZBXHU3NkVFXHU1RjU1JztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdQbHVnaW4gZGlyIHRvIGV4cG9ydCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nX3ZhdWx0X2Rpcigpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUU5M1x1NzZFRVx1NUY1NSc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnUm9vdCBkaXIgb2YgdmF1bHQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGxldCBzdHJpbmdzID0gbmV3IFN0cmluZ3MoKTsiLCAiaW1wb3J0IHsgXHJcblx0QXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLFBsdWdpblxyXG59IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCBWYXVsdEV4cG90ZXJQbHVnaW4gZnJvbSAnLi4vbWFpbic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZFeHBvcnRlclNldHRpbmdzIHtcclxuXHRwbHVnaW5EaXJFeHBvcnRlcjpzdHJpbmc7XHJcblx0dmF1bHREaXI6c3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogVkV4cG9ydGVyU2V0dGluZ3MgPSB7XHJcblx0cGx1Z2luRGlyRXhwb3J0ZXI6JycsXHJcblx0dmF1bHREaXI6JydcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZFeHBvcnRlclNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbjtcclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBWYXVsdEV4cG90ZXJQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0Z2V0U2V0dGluZ1ZhbHVlKGZpZWxkOiBrZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncykge1xyXG5cdFx0cmV0dXJuIHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXTtcclxuXHR9XHJcblxyXG5cdGFkZF90b2dnbGUobmFtZTpzdHJpbmcsZGVzYzpzdHJpbmcsZmllbGQ6a2V5b2YgVkV4cG9ydGVyU2V0dGluZ3Mpe1xyXG5cdFx0bGV0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cdFx0bGV0IHZhbHVlID0gKHRoaXMucGx1Z2luLnNldHRpbmdzIGFzIGFueSlbZmllbGRdIGFzIGJvb2xlYW47XHJcblx0XHRsZXQgaXRlbSA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKSAgXHJcblx0XHRcdC5zZXROYW1lKG5hbWUpXHJcblx0XHRcdC5zZXREZXNjKGRlc2MpXHJcblx0XHRcdC5hZGRUb2dnbGUodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHZhbHVlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6bmV2ZXIpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdHJldHVybiBpdGVtO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblx0XHRcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSh0aGlzLnBsdWdpbi5zdHJpbmdzLnNldHRpbmdfcGx1Z2luX2RpcilcclxuXHRcdFx0LmFkZFRleHRBcmVhKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlcilcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHQuc2V0TmFtZSh0aGlzLnBsdWdpbi5zdHJpbmdzLnNldHRpbmdfdmF1bHRfZGlyKVxyXG5cdFx0XHRcdC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy52YXVsdERpcilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudmF1bHREaXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR9KSk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBcclxuXHROb3RpY2UsIFRGaWxlXHJcbn0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IFZhdWx0RXhwb3RlclBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuXHJcbmNvbnN0IGNtZF9leHBvcnRfY3VycmVudF9ub3RlID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfZXhwb3J0X2N1cnJlbnRfbm90ZScsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX2V4cG9ydF9jdXJyZW50X25vdGUsXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdGxldCB0ZmlsZSA9IG5jLmNoYWluLmN1cnJlbnRfbm90ZTtcclxuXHRcdGF3YWl0IHBsdWdpbi5leHBvcnRfcmVhZG1lKHRmaWxlLG51bGwpO1xyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjbWRfc2V0X3ZleHBvcnRlciA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnY21kX3NldF92ZXhwb3J0ZXInLFxyXG5cdG5hbWU6IHBsdWdpbi5zdHJpbmdzLmNtZF9zZXRfdmV4cG9ydGVyLFxyXG5cdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRjb25zdCBuYyA9IHBsdWdpbi5ub3RlY2hhaW47XHJcblx0XHRsZXQgZGlyID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHBsdWdpbi5zdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRsZXQgaXRlbTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cdFx0aWYocGx1Z2luLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmMoZGlyKSl7XHJcblx0XHRcdGl0ZW1bJ0RpciddID0gZGlyO1xyXG5cdFx0fVxyXG5cdFx0aXRlbVsnTmFtZSddID0gJ3JlYWRNZSc7XHJcblx0XHRpdGVtWydBc3NldHMnXSA9ICcuL2Fzc2V0cyc7XHJcblx0XHRpdGVtWydSZW1vdmVNZXRhJ10gPSB0cnVlO1xyXG5cdFx0aXRlbVsnVXNlR2l0TGluayddID0gdHJ1ZTtcclxuXHJcblx0XHRhd2FpdCBuYy5lZGl0b3Iuc2V0X2Zyb250bWF0dGVyKFxyXG5cdFx0XHRuYy5jaGFpbi5jdXJyZW50X25vdGUsXHJcblx0XHRcdCd2ZXhwb3J0ZXInLFxyXG5cdFx0XHRpdGVtXHJcblx0XHQpXHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNtZF9leHBvcnRfcGx1Z2luID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfZXhwb3J0X3BsdWdpbicsXHJcblx0bmFtZTogcGx1Z2luLnN0cmluZ3MuY21kX2V4cG9ydF9wbHVnaW4sXHJcblx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdGNvbnN0IG5jID0gcGx1Z2luLm5vdGVjaGFpbjtcclxuXHRcdFxyXG5cdFx0bGV0IHBsdWdpbnMgPSBPYmplY3Qua2V5cygocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMucGx1Z2lucyk7XHJcblx0XHRsZXQgcCA9IGF3YWl0IG5jLmNoYWluLnRwX3N1Z2dlc3RlcihwbHVnaW5zLHBsdWdpbnMpO1xyXG5cdFx0bGV0IGVwbHVnaW4gPSAocGx1Z2luLmFwcCBhcyBhbnkpLnBsdWdpbnMuZ2V0UGx1Z2luKHApO1xyXG5cdFx0aWYoZXBsdWdpbil7XHJcblx0XHRcdGxldCB0YXJnZXQgPSBhd2FpdCBwbHVnaW4uZnNFZGl0b3Iuc2VsZWN0X3ZhbGlkX2RpcihcclxuXHRcdFx0XHRwbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIuc3BsaXQoXCJcXG5cIilcclxuXHRcdFx0KVxyXG5cdFx0XHRpZighcGx1Z2luLmZzRWRpdG9yLmZzLmV4aXN0c1N5bmModGFyZ2V0KSl7XHJcblx0XHRcdFx0dGFyZ2V0ID0gYXdhaXQgbmMuY2hhaW4udHBfcHJvbXB0KHBsdWdpbi5zdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0dGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG5cdFx0XHRpZighdGFyZ2V0LmVuZHNXaXRoKCcvJyArIHApKXtcclxuXHRcdFx0XHR0YXJnZXQgPSB0YXJnZXQgKyAnLycgKyBwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHRwbHVnaW4uZnNFZGl0b3IuZnMubWtkaXJTeW5jKHRhcmdldCk7XHJcblx0XHRcdH1cclxuXHRcdFx0bGV0IGl0ZW1zID0gWydtYWluLmpzJywnbWFuaWZlc3QuanNvbicsJ3N0eWxlcy5jc3MnXTtcclxuXHRcdFx0Zm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuXHRcdFx0XHRsZXQgc3JjID0gYCR7cGx1Z2luLmZzRWRpdG9yLnJvb3R9LyR7ZXBsdWdpbi5tYW5pZmVzdC5kaXJ9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdGxldCBkc3QgPSBgJHt0YXJnZXR9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5jb3B5X2ZpbGUoc3JjLGRzdCwnb3ZlcndyaXRlJyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzOkFycmF5PEZ1bmN0aW9uPiA9IFtcclxuICAgIFxyXG5dO1xyXG5cclxuY29uc3QgY29tbWFuZEJ1aWxkZXJzRGVza3RvcDpBcnJheTxGdW5jdGlvbj4gPSBbXHJcblx0Y21kX2V4cG9ydF9jdXJyZW50X25vdGUsXHJcblx0Y21kX3NldF92ZXhwb3J0ZXIsXHJcblx0Y21kX2V4cG9ydF9wbHVnaW5cclxuXTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21tYW5kcyhwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSB7XHJcbiAgICBjb21tYW5kQnVpbGRlcnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKGMocGx1Z2luKSk7XHJcbiAgICB9KTtcclxuXHRpZigocGx1Z2luLmFwcCBhcyBhbnkpLmlzTW9iaWxlPT1mYWxzZSl7XHJcblx0XHRjb21tYW5kQnVpbGRlcnNEZXNrdG9wLmZvckVhY2goKGMpID0+IHtcclxuXHRcdFx0cGx1Z2luLmFkZENvbW1hbmQoYyhwbHVnaW4pKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxJQUFBQSxtQkFBNEc7OztBQ0E1RyxzQkFBNEc7QUFFckcsSUFBTSxXQUFOLE1BQWM7QUFBQSxFQUtqQixZQUFZLFFBQWM7QUFDdEIsU0FBSyxTQUFTO0FBQ2QsU0FBSyxLQUFLLFFBQVEsSUFBSTtBQUN0QixTQUFLLE9BQU8sUUFBUSxNQUFNO0FBQUEsRUFDOUI7QUFBQSxFQUVBLElBQUksT0FBTTtBQUNOLFFBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNO0FBQzlCLFdBQU8sRUFBRSxTQUFTLFFBQVEsT0FBTSxHQUFHO0FBQUEsRUFDdkM7QUFBQSxFQUVBLElBQUksWUFBVztBQUNYLFFBQUksS0FBTSxLQUFLLE9BQU8sSUFBWSxRQUFRLFVBQVUsWUFBWTtBQUNoRSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBR0EsUUFBUSxPQUFvQjtBQUM5QixRQUFHLE9BQU07QUFDUixjQUFRLEtBQUssT0FBSyxNQUFJLE1BQU0sTUFBTSxRQUFRLE9BQU0s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TUFBTTtBQUNWLGVBQUdELE1BQUEsR0FBRyxPQUFPLGdCQUFnQixPQUFNLFdBQVcsTUFBM0MsZ0JBQUFBLElBQThDLFlBQVc7QUFDM0Qsa0JBQU0sSUFBSTtBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxnQkFBR0MsTUFBQSxHQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxnQkFBQUEsSUFBOEMsZUFBYyxRQUFPO0FBQ3JFLGtCQUFNLElBQUk7QUFBQSxjQUNUO0FBQUEsY0FDQSxDQUFDLE9BQVdDLFVBQWdCO0FBQzNCLHVCQUFPLEtBQUtBLFVBQVMsVUFBVUEsTUFBSyxRQUFRLE1BQUssS0FBSztBQUFBLGNBQ3ZEO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFDQSxpQkFBTztBQUFBLFFBQ1I7QUFDQSxjQUFNLEtBQUssU0FBUyxPQUFPLEtBQUksS0FBSztBQUFBLE1BQ3JDO0FBQUEsSUFDRDtBQUVBLFFBQUksVUFBUyxRQUFHLE9BQU8sZ0JBQWdCLE9BQU0sV0FBVyxNQUEzQyxtQkFBOEM7QUFDM0QsUUFBRyxRQUFPO0FBQ1QsVUFBSSxTQUFTLEdBQUcsTUFBTSxhQUFhLEtBQUs7QUFDeEMsVUFBSSxPQUFPLE1BQUksTUFBSTtBQUNuQixXQUFLLFNBQVMsZ0JBQWdCLElBQUk7QUFDbEMsZUFBUSxLQUFLLFFBQU87QUFDbkIsWUFBRyxFQUFFLEVBQUUsY0FBWSxPQUFNO0FBQ3hCLGVBQUssU0FBUyxXQUFXLEdBQUUsT0FBSyxNQUFJLEVBQUUsV0FBUyxNQUFJLEVBQUUsU0FBUztBQUFBLFFBQy9EO0FBQUEsTUFDRDtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJlcnIiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIl9hIiwgIl9iIiwgIm5hbWUiXQp9Cg== diff --git a/main.ts b/main.ts index a81a6b4..79a1161 100644 --- a/main.ts +++ b/main.ts @@ -2,101 +2,32 @@ import * as Module from 'module'; import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting, TFile, TFolder } from 'obsidian'; import { FsEditor } from 'src/fseditor'; -import { strings } from 'src/strings'; +import { Strings } from 'src/strings'; +import {VExporterSettings,VExporterSettingTab,DEFAULT_SETTINGS} from 'src/setting' -interface VExporterSettings { - pluginDirExporter:string; - vaultDir:string; -} - -const DEFAULT_SETTINGS: VExporterSettings = { - pluginDirExporter:'', - vaultDir:'' -} - - -const cmd_export_current_note = (plugin:VaultExpoterPlugin) => ({ - id: 'cmd_export_current_note', - name: strings.cmd_export_current_note, - callback: async () => { - const nc = plugin.notechain; - let tfile = nc.chain.current_note; - await plugin.export_readme(tfile,null); - } -}); - -const cmd_set_vexporter = (plugin:VaultExpoterPlugin) => ({ - id: 'cmd_set_vexporter', - name: strings.cmd_set_vexporter, - callback: async () => { - const nc = plugin.notechain; - let dir = await nc.chain.tp_prompt(strings.prompt_path_of_folder); - let item: { [key: string]: any } = {}; - if(plugin.fsEditor.fs.existsSync(dir)){ - item['Dir'] = dir; - } - item['Name'] = 'readMe'; - item['Assets'] = './assets'; - item['RemoveMeta'] = true; - item['UseGitLink'] = true; - - await nc.editor.set_frontmatter( - nc.chain.current_note, - 'vexporter', - item - ) - } -}); - -const cmd_export_plugin = (plugin:VaultExpoterPlugin) => ({ - id: 'cmd_export_plugin', - name: strings.cmd_export_plugin, - callback: async () => { - const nc = plugin.notechain; - - let plugins = Object.keys((plugin.app as any).plugins.plugins); - let p = await nc.chain.tp_suggester(plugins,plugins); - let eplugin = (plugin.app as any).plugins.getPlugin(p); - if(eplugin){ - let target = await plugin.fsEditor.select_valid_dir( - plugin.settings.pluginDirExporter.split("\n") - ) - if(!plugin.fsEditor.fs.existsSync(target)){ - target = await nc.chain.tp_prompt(strings.prompt_path_of_folder); - } - target = target.replace(/\\/g,'/'); - if(!target.endsWith('/' + p)){ - target = target + '/' + p; - } - if(!plugin.fsEditor.fs.existsSync(target)){ - plugin.fsEditor.fs.mkdirSync(target); - } - let items = ['main.js','manifest.json','styles.css']; - for(let item of items){ - let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`; - let dst = `${target}/${item}`; - plugin.fsEditor.copy_file(src,dst,'overwrite'); - } - } - } -}); - -const commandBuilders = [ - cmd_export_current_note, - cmd_set_vexporter, - cmd_export_plugin -]; - -function addCommands(plugin:VaultExpoterPlugin) { - commandBuilders.forEach((c) => { - plugin.addCommand(c(plugin)); - }); -} +import { addCommands } from 'src/commands'; export default class VaultExpoterPlugin extends Plugin { + strings : Strings; settings: VExporterSettings; fsEditor : FsEditor; + + async onload() { + if(this.app.workspace.layoutReady){ + await this._onload_() + }else{ + this.app.workspace.onLayoutReady( + async()=>{ + await this._onload_() + } + ) + } + } + + async _onload_() { + this.strings = new Strings(); + await this.loadSettings(); this.fsEditor = new FsEditor(this); // This adds a settings tab so the user can configure various aspects of the plugin @@ -138,7 +69,7 @@ export default class VaultExpoterPlugin extends Plugin { } onunload() { - + } get notechain(){ @@ -165,7 +96,7 @@ export default class VaultExpoterPlugin extends Plugin { } } if(!dst || !this.fsEditor.fs.existsSync(dst)){ - new Notice(strings.notice_nosuchdir,3000); + new Notice(this.strings.notice_nosuchdir,3000); return; } dst = dst.replace(/\\/g,'/'); @@ -217,57 +148,3 @@ export default class VaultExpoterPlugin extends Plugin { } } } - -class VExporterSettingTab extends PluginSettingTab { - plugin: VaultExpoterPlugin; - - - constructor(app: App, plugin: VaultExpoterPlugin) { - super(app, plugin); - this.plugin = plugin; - } - - getSettingValue(field: keyof VExporterSettings) { - return this.plugin.settings[field]; - } - - add_toggle(name:string,desc:string,field:keyof VExporterSettings){ - const {containerEl} = this; - let value = (this.plugin.settings as any)[field] as boolean; - let item = new Setting(containerEl) - .setName(name) - .setDesc(desc) - .addToggle(text => text - .setValue(value) - .onChange(async (value:never) => { - this.plugin.settings[field] = value; - await this.plugin.saveSettings(); - }) - ); - return item; - } - - display(): void { - const {containerEl} = this; - - containerEl.empty(); - - new Setting(containerEl) - .setName(strings.setting_plugin_dir) - .addTextArea(text => text - .setValue(this.plugin.settings.pluginDirExporter) - .onChange(async (value) => { - this.plugin.settings.pluginDirExporter = value; - await this.plugin.saveSettings(); - })); - - new Setting(containerEl) - .setName(strings.setting_vault_dir) - .addTextArea(text => text - .setValue(this.plugin.settings.vaultDir) - .onChange(async (value) => { - this.plugin.settings.vaultDir = value; - await this.plugin.saveSettings(); - })); - } -} diff --git a/src/commands.ts b/src/commands.ts new file mode 100644 index 0000000..ad52b84 --- /dev/null +++ b/src/commands.ts @@ -0,0 +1,92 @@ +import { + Notice, TFile +} from 'obsidian'; + +import VaultExpoterPlugin from '../main'; + +const cmd_export_current_note = (plugin:VaultExpoterPlugin) => ({ + id: 'cmd_export_current_note', + name: plugin.strings.cmd_export_current_note, + callback: async () => { + const nc = plugin.notechain; + let tfile = nc.chain.current_note; + await plugin.export_readme(tfile,null); + } +}); + +const cmd_set_vexporter = (plugin:VaultExpoterPlugin) => ({ + id: 'cmd_set_vexporter', + name: plugin.strings.cmd_set_vexporter, + callback: async () => { + const nc = plugin.notechain; + let dir = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); + let item: { [key: string]: any } = {}; + if(plugin.fsEditor.fs.existsSync(dir)){ + item['Dir'] = dir; + } + item['Name'] = 'readMe'; + item['Assets'] = './assets'; + item['RemoveMeta'] = true; + item['UseGitLink'] = true; + + await nc.editor.set_frontmatter( + nc.chain.current_note, + 'vexporter', + item + ) + } +}); + +const cmd_export_plugin = (plugin:VaultExpoterPlugin) => ({ + id: 'cmd_export_plugin', + name: plugin.strings.cmd_export_plugin, + callback: async () => { + const nc = plugin.notechain; + + let plugins = Object.keys((plugin.app as any).plugins.plugins); + let p = await nc.chain.tp_suggester(plugins,plugins); + let eplugin = (plugin.app as any).plugins.getPlugin(p); + if(eplugin){ + let target = await plugin.fsEditor.select_valid_dir( + plugin.settings.pluginDirExporter.split("\n") + ) + if(!plugin.fsEditor.fs.existsSync(target)){ + target = await nc.chain.tp_prompt(plugin.strings.prompt_path_of_folder); + } + target = target.replace(/\\/g,'/'); + if(!target.endsWith('/' + p)){ + target = target + '/' + p; + } + if(!plugin.fsEditor.fs.existsSync(target)){ + plugin.fsEditor.fs.mkdirSync(target); + } + let items = ['main.js','manifest.json','styles.css']; + for(let item of items){ + let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`; + let dst = `${target}/${item}`; + plugin.fsEditor.copy_file(src,dst,'overwrite'); + } + } + } +}); + +const commandBuilders:Array = [ + +]; + +const commandBuildersDesktop:Array = [ + cmd_export_current_note, + cmd_set_vexporter, + cmd_export_plugin +]; + +export function addCommands(plugin:VaultExpoterPlugin) { + commandBuilders.forEach((c) => { + plugin.addCommand(c(plugin)); + }); + if((plugin.app as any).isMobile==false){ + commandBuildersDesktop.forEach((c) => { + plugin.addCommand(c(plugin)); + }); + } +} \ No newline at end of file diff --git a/src/fseditor.ts b/src/fseditor.ts index 35dd407..5a59fcb 100644 --- a/src/fseditor.ts +++ b/src/fseditor.ts @@ -17,9 +17,15 @@ export class FsEditor{ return a.basePath.replace(/\\/g,'/'); } - abspath(tfile:TFile){ + get notechain(){ + let nc = (this.plugin.app as any).plugins.getPlugin('note-chain'); + return nc + } + + + abspath(tfile:TFile|TFolder){ if(tfile){ - return this.root+'/'+tfile.path; + return (this.root+'/'+tfile.path).replace(/\\/g,'/'); }else{ return null; } @@ -33,7 +39,27 @@ export class FsEditor{ return this.fs.existsSync(path) && this.fs.statSync(path).isDirectory(); } + list_dir(path:string,as_fullpath=true){ + if(!this.isdir(path)){return []} + let items = this.fs.readdirSync(path) + if(as_fullpath){ + items = items.map( + (x:string)=>{ + return path+'/'+x + } + ) + } + return items + } + first_valid_dir(paths:Array|string){ + if(typeof(paths)=='string'){ + if(this.isdir(paths)){ + return paths + }else{ + return null + } + } for(let path of paths){ if(this.isdir(path)){ return path; @@ -62,7 +88,7 @@ export class FsEditor{ mkdir_recursive(path:string){ if(this.isdir(path)){return true;} - const parent = this.path.dirname(path); + let parent = this.path.dirname(path); if(!this.isdir(parent)){ this.mkdir_recursive(parent); } @@ -74,7 +100,7 @@ export class FsEditor{ * overwrite,复盖;mtime,新文件; */ copy_file(src:string,dst:string,mode='pass>overwrite>mtime') { - const fs = this.fs; + let fs = this.fs; mode = mode.split('>')[0] if(!fs.existsSync(src)){ @@ -120,12 +146,10 @@ export class FsEditor{ this.mkdir_recursive(this.path.dirname(dst)); this.copy_file(src,dst,mode); if(attachment){ - console.log('attachment') - let nc = (this.plugin.app as any).plugins.getPlugin('note-chain'); + let nc = this.notechain; if(!nc){return;} let tfiles = nc.chain.get_outlinks(tfile,false); for(let t of tfiles){ - console.log(t.name) if(!(t.extension==='md')){ this.mirror_tfile(t,vault_root,mode,false); }else if(outlink){ @@ -136,7 +160,7 @@ export class FsEditor{ } } - mirror_tfolder(tfolder:TFolder,vault_root:string,mode='mtime',attachment=true,outlink=false){ + mirror_tfolder(tfolder:TFolder,vault_root:string,mode='mtime',attachment=true,outlink=false,strict=false){ if(tfolder){ for(let t of tfolder.children){ if(t instanceof TFolder){ @@ -144,17 +168,44 @@ export class FsEditor{ }else if(t instanceof TFile){ this.mirror_tfile(t,vault_root,mode,attachment,outlink); } + } + if(strict){ + let dst = vault_root+'/'+tfolder.path + let src = this.abspath(tfolder) + if(src && dst){ + this.remove_files_not_in_src(src,dst) + } } } } + remove_files_not_in_src(src:string,dst:string){ + console.log(src,dst) + if(!this.isdir(src) || !this.isdir(dst)){return} + let items = this.list_dir(dst,false) + for(let item of items){ + console.log(item) + let adst = dst+'/'+item + let asrc = src+'/'+item + if(this.isfile(adst)){ + if(!this.isfile(asrc)){ + this.fs.unlinkSync(adst) + } + }else if(this.isdir(adst)){ + if(!this.isdir(asrc)){ + this.fs.rmdirSync(dst) + } + } + } + } + modify(path:string,callback:Function,encoding='utf8'){ - const fs = this.fs; + let fs = this.fs; if(!fs.existsSync(path)){return}; fs.readFile(path, encoding, (err:Error, data:string) => { if(err){ - console.error('Error reading file:', err);; + console.error('Error reading file:', err); } let rs = callback(path,data); fs.writeFile(path, rs, encoding, (err:Error) => { @@ -167,4 +218,4 @@ export class FsEditor{ } ); } -} +} \ No newline at end of file diff --git a/src/setting.ts b/src/setting.ts new file mode 100644 index 0000000..2ffa4db --- /dev/null +++ b/src/setting.ts @@ -0,0 +1,67 @@ +import { + App, PluginSettingTab, Setting,Plugin +} from 'obsidian'; + +import VaultExpoterPlugin from '../main'; + +export interface VExporterSettings { + pluginDirExporter:string; + vaultDir:string; +} + +export const DEFAULT_SETTINGS: VExporterSettings = { + pluginDirExporter:'', + vaultDir:'' +} + +export class VExporterSettingTab extends PluginSettingTab { + plugin: VaultExpoterPlugin; + constructor(app: App, plugin: VaultExpoterPlugin) { + super(app, plugin); + this.plugin = plugin; + } + + getSettingValue(field: keyof VExporterSettings) { + return this.plugin.settings[field]; + } + + add_toggle(name:string,desc:string,field:keyof VExporterSettings){ + let {containerEl} = this; + let value = (this.plugin.settings as any)[field] as boolean; + let item = new Setting(containerEl) + .setName(name) + .setDesc(desc) + .addToggle(text => text + .setValue(value) + .onChange(async (value:never) => { + this.plugin.settings[field] = value; + await this.plugin.saveSettings(); + }) + ); + return item; + } + + display(): void { + const {containerEl} = this; + + containerEl.empty(); + + new Setting(containerEl) + .setName(this.plugin.strings.setting_plugin_dir) + .addTextArea(text => text + .setValue(this.plugin.settings.pluginDirExporter) + .onChange(async (value) => { + this.plugin.settings.pluginDirExporter = value; + await this.plugin.saveSettings(); + })); + + new Setting(containerEl) + .setName(this.plugin.strings.setting_vault_dir) + .addTextArea(text => text + .setValue(this.plugin.settings.vaultDir) + .onChange(async (value) => { + this.plugin.settings.vaultDir = value; + await this.plugin.saveSettings(); + })); + } +} diff --git a/src/strings.ts b/src/strings.ts index b3f10b9..6edc970 100644 --- a/src/strings.ts +++ b/src/strings.ts @@ -1,5 +1,5 @@ -class Strings{ +export class Strings{ language:string; constructor(){ let lang = window.localStorage.getItem('language');