/* 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); // main.ts var main_exports = {}; __export(main_exports, { FileSuggest: () => FileSuggest, default: () => PinnedNotesPlugin, trimFile: () => trimFile }); module.exports = __toCommonJS(main_exports); var import_obsidian = require("obsidian"); // node_modules/uuid/dist/esm-browser/rng.js var getRandomValues; var rnds8 = new Uint8Array(16); function rng() { if (!getRandomValues) { getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto); if (!getRandomValues) { throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported"); } } return getRandomValues(rnds8); } // node_modules/uuid/dist/esm-browser/stringify.js var byteToHex = []; for (let i = 0; i < 256; ++i) { byteToHex.push((i + 256).toString(16).slice(1)); } function unsafeStringify(arr, offset = 0) { return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]; } // node_modules/uuid/dist/esm-browser/native.js var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto); var native_default = { randomUUID }; // node_modules/uuid/dist/esm-browser/v4.js function v4(options, buf, offset) { if (native_default.randomUUID && !buf && !options) { return native_default.randomUUID(); } options = options || {}; const rnds = options.random || (options.rng || rng)(); rnds[6] = rnds[6] & 15 | 64; rnds[8] = rnds[8] & 63 | 128; if (buf) { offset = offset || 0; for (let i = 0; i < 16; ++i) { buf[offset + i] = rnds[i]; } return buf; } return unsafeStringify(rnds); } var v4_default = v4; // main.ts var PinnedNote = class { constructor(title, path, icon) { this.id = v4_default(); this.icon = icon; this.path = path; this.title = title; } }; var DEFAULT_SETTINGS = { pinnedNotes: [] }; var PinnedNotesPlugin = class extends import_obsidian.Plugin { async onload() { await this.loadSettings(); this.addSettingTab(new SettingTab(this.app, this)); } async addPinnedNote(note) { this.settings.pinnedNotes.push(note); await this.saveSettings(); await this.loadSettings(); } async removePinnedNote(noteId) { const noteIndex = this.settings.pinnedNotes.findIndex((note) => note.id === noteId); delete this.settings.pinnedNotes[noteIndex]; this.settings.pinnedNotes.splice(noteIndex, 1); await this.saveSettings(); await this.loadSettings(); } async loadSettings() { var _a; this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); (_a = this.ribbonIcons) == null ? void 0 : _a.forEach((ribbonIcon, index) => { ribbonIcon.remove(); delete this.ribbonIcons[index]; }); this.ribbonIcons = this.settings.pinnedNotes.map( (note) => this.addRibbonIcon( note.icon === "" ? "file" : note.icon, note.title, async (e) => { await this.app.workspace.openLinkText(note.path, ""); } ) ); } async saveSettings() { await this.saveData(this.settings); } }; var SettingTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); let isCanBeAddedNewNote = true; let title = ""; let path = ""; let icon = ""; let changedTitle; let changedPath; let changedIcon; const addNoteButton = new import_obsidian.Setting(containerEl).setName("Add pinned note").setDesc(`Provide: 1) file's name that will be displayed on hover 2) path to this file, e.g Folder1/File1 3) Icon name from lucide.dev; if icon won't be provided, default icon "file" will be placed instead. RESTART OBSIDIAN AFTER CHANGES`); isCanBeAddedNewNote && addNoteButton.addButton((button) => { button.setIcon("plus").onClick( () => { isCanBeAddedNewNote = false; this.display(); new import_obsidian.Setting(containerEl).setName("File").addText( (text) => text.setPlaceholder("Title").onChange((value) => title = value) ).addText( (text) => { new FileSuggest(this.app, text.inputEl); text.setPlaceholder("Path").onChange((value) => path = value); } ).addText( (text) => text.setPlaceholder("Icon(optional)").onChange((value) => icon = value) ).addButton((button2) => button2.setIcon("save").onClick( async () => { if (title.length !== 0 && path.length !== 0) { await this.plugin.addPinnedNote(new PinnedNote(title, path, icon)); isCanBeAddedNewNote = true; this.display(); } else { new import_obsidian.Notice("Provide title and path"); } } )); } ); }); this.plugin.settings.pinnedNotes.forEach((note, index) => { new import_obsidian.Setting(containerEl).setName("File " + (index + 1)).addText( (text) => text.setPlaceholder("Title").setValue(note.title).onChange(async (value) => { changedTitle = value; }) ).addText( (text) => { new FileSuggest(this.app, text.inputEl); text.setPlaceholder("Path").setValue(note.path).onChange(async (value) => { changedPath = value; }); } ).addText( (text) => text.setPlaceholder("Icon(optional)").setValue(note.icon).onChange(async (value) => { changedIcon = value; }) ).addButton( (button) => button.setIcon("save").onClick( async () => { if ((changedTitle === void 0 || changedTitle === note.title) && (changedPath === void 0 || changedPath === note.path) && (changedIcon === void 0 || changedIcon === note.icon)) { new import_obsidian.Notice("Provide any data"); return; } if (changedTitle !== void 0) { if (changedTitle.length !== 0) { note.title = changedTitle; changedTitle = void 0; } else new import_obsidian.Notice("Provide title"); } if (changedPath !== void 0) { if (changedPath.length !== 0) { note.path = changedPath; changedPath = void 0; } else new import_obsidian.Notice("Provide path"); } if (changedIcon !== void 0) { note.icon = changedIcon; changedIcon = void 0; } await this.plugin.saveSettings(); await this.plugin.loadSettings(); this.display(); } ) ).addButton((button) => button.setIcon("trash-2").setWarning().onClick( async () => { await this.plugin.removePinnedNote(note.id); this.display(); } )); }); } }; var FileSuggest = class extends import_obsidian.AbstractInputSuggest { getSuggestions(inputStr) { const abstractFiles = this.app.vault.getAllLoadedFiles(); const files = []; const inputLower = inputStr.toLowerCase(); abstractFiles.forEach((file) => { if (file instanceof import_obsidian.TFile && ["md", "canvas"].contains(file.extension) && file.path.toLowerCase().contains(inputLower)) { files.push(file); } }); return files; } renderSuggestion(file, el) { if (file.extension == "md") { el.setText(trimFile(file)); } else { el.setText(file.path.slice(0, -7)); el.insertAdjacentHTML( "beforeend", `
` ); } } selectSuggestion(file) { this.textInputEl.value = trimFile(file); this.textInputEl.trigger("input"); this.close(); } }; function trimFile(file) { if (!file) return ""; return file.extension == "md" ? file.path.slice(0, -3) : file.path; } //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xyXG5cdEFic3RyYWN0SW5wdXRTdWdnZXN0LFxyXG5cdEFwcCxcclxuXHRJY29uTmFtZSxcclxuXHROb3RpY2UsXHJcblx0UGx1Z2luLFxyXG5cdFBsdWdpblNldHRpbmdUYWIsXHJcblx0U2V0dGluZyxcclxuXHRUQWJzdHJhY3RGaWxlLFxyXG5cdFRGaWxlXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7djQgYXMgdXVpZHY0fSBmcm9tIFwidXVpZFwiO1xyXG5cclxuY2xhc3MgUGlubmVkTm90ZSB7XHJcblx0aWQ6IG51bWJlcjtcclxuXHRpY29uOiBJY29uTmFtZTtcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0dGl0bGU6IHN0cmluZztcclxuXHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dGl0bGU6IHN0cmluZyxcclxuXHRcdHBhdGg6IHN0cmluZyxcclxuXHRcdGljb246IEljb25OYW1lXHJcblx0KSB7XHJcblx0XHR0aGlzLmlkID0gdXVpZHY0KClcclxuXHRcdHRoaXMuaWNvbiA9IGljb247XHJcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xyXG5cdFx0dGhpcy50aXRsZSA9IHRpdGxlO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5ncyB7XHJcblx0cGlubmVkTm90ZXM6IFBpbm5lZE5vdGVbXVxyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5ncyA9IHtcclxuXHRwaW5uZWROb3RlczogW11cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlubmVkTm90ZXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHNldHRpbmdzOiBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5nc1xyXG5cdHJpYmJvbkljb25zOiBIVE1MRWxlbWVudFtdXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKVxyXG5cdH1cclxuXHJcblx0YXN5bmMgYWRkUGlubmVkTm90ZShub3RlOiBQaW5uZWROb3RlKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLnB1c2gobm90ZSlcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKClcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKClcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlbW92ZVBpbm5lZE5vdGUobm90ZUlkOiBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG5vdGVJbmRleCA9IHRoaXMuc2V0dGluZ3MucGlubmVkTm90ZXMuZmluZEluZGV4KChub3RlKSA9PiBub3RlLmlkID09PSBub3RlSWQpXHJcblx0XHRkZWxldGUgdGhpcy5zZXR0aW5ncy5waW5uZWROb3Rlc1tub3RlSW5kZXhdXHJcblx0XHR0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLnNwbGljZShub3RlSW5kZXgsIDEpXHJcblx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpXHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0XHR0aGlzLnJpYmJvbkljb25zPy5mb3JFYWNoKChyaWJib25JY29uLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRyaWJib25JY29uLnJlbW92ZSgpXHJcblx0XHRcdGRlbGV0ZSB0aGlzLnJpYmJvbkljb25zW2luZGV4XVxyXG5cdFx0fSlcclxuXHRcdHRoaXMucmliYm9uSWNvbnMgPSB0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLm1hcCgobm90ZSkgPT5cclxuXHRcdFx0dGhpcy5hZGRSaWJib25JY29uKFxyXG5cdFx0XHRcdG5vdGUuaWNvbiA9PT0gXCJcIiA/IFwiZmlsZVwiIDogbm90ZS5pY29uLFxyXG5cdFx0XHRcdG5vdGUudGl0bGUsXHJcblx0XHRcdFx0YXN5bmMgKGUpID0+IHtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZS5wYXRoLCBcIlwiKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuXHJcbmNsYXNzIFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFBpbm5lZE5vdGVzUGx1Z2luXHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBpbm5lZE5vdGVzUGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKSB7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KClcclxuXHRcdGxldCBpc0NhbkJlQWRkZWROZXdOb3RlID0gdHJ1ZVxyXG5cdFx0bGV0IHRpdGxlID0gXCJcIlxyXG5cdFx0bGV0IHBhdGggPSBcIlwiXHJcblx0XHRsZXQgaWNvbjogSWNvbk5hbWUgPSBcIlwiXHJcblx0XHRsZXQgY2hhbmdlZFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblx0XHRsZXQgY2hhbmdlZFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHRcdGxldCBjaGFuZ2VkSWNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cdFx0Y29uc3QgYWRkTm90ZUJ1dHRvbiA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIkFkZCBwaW5uZWQgbm90ZVwiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIlByb3ZpZGU6IDEpIGZpbGUncyBuYW1lIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gaG92ZXIgMikgcGF0aCB0byB0aGlzIGZpbGUsIGUuZyBGb2xkZXIxL0ZpbGUxIDMpIEljb24gbmFtZSBmcm9tIGx1Y2lkZS5kZXY7IGlmIGljb24gd29uJ3QgYmUgcHJvdmlkZWQsIGRlZmF1bHQgaWNvbiBcXFwiZmlsZVxcXCIgd2lsbCBiZSBwbGFjZWQgaW5zdGVhZC4gUkVTVEFSVCBPQlNJRElBTiBBRlRFUiBDSEFOR0VTXCIpXHJcblx0XHRpc0NhbkJlQWRkZWROZXdOb3RlICYmIGFkZE5vdGVCdXR0b25cclxuXHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XHJcblx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJwbHVzXCIpLm9uQ2xpY2soXHJcblx0XHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlzQ2FuQmVBZGRlZE5ld05vdGUgPSBmYWxzZVxyXG5cdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKVxyXG5cdFx0XHRcdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHRcdFx0XHQuc2V0TmFtZShcIkZpbGVcIilcclxuXHRcdFx0XHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiVGl0bGVcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHRpdGxlID0gdmFsdWUpXHJcblx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRuZXcgRmlsZVN1Z2dlc3QodGhpcy5hcHAsIHRleHQuaW5wdXRFbCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJQYXRoXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4gcGF0aCA9IHZhbHVlKVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiSWNvbihvcHRpb25hbClcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IGljb24gPSB2YWx1ZSlcclxuXHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiBidXR0b24uc2V0SWNvbihcInNhdmVcIikub25DbGljayhcclxuXHRcdFx0XHRcdFx0XHRcdGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRpdGxlLmxlbmd0aCAhPT0gMCAmJiBwYXRoLmxlbmd0aCAhPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmFkZFBpbm5lZE5vdGUobmV3IFBpbm5lZE5vdGUodGl0bGUsIHBhdGgsIGljb24pKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzQ2FuQmVBZGRlZE5ld05vdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KClcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKFwiUHJvdmlkZSB0aXRsZSBhbmQgcGF0aFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0KSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpXHJcblx0XHRcdH0pXHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGlubmVkTm90ZXMuZm9yRWFjaCgobm90ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJGaWxlIFwiICsgKGluZGV4ICsgMSkpXHJcblx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlRpdGxlXCIpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUobm90ZS50aXRsZSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Y2hhbmdlZFRpdGxlID0gdmFsdWU7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG5cdFx0XHRcdFx0bmV3IEZpbGVTdWdnZXN0KHRoaXMuYXBwLCB0ZXh0LmlucHV0RWwpXHJcblx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlBhdGhcIilcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKG5vdGUucGF0aClcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGNoYW5nZWRQYXRoID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJJY29uKG9wdGlvbmFsKVwiKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKG5vdGUuaWNvbilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Y2hhbmdlZEljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ1dHRvbikgPT4gYnV0dG9uLnNldEljb24oXCJzYXZlXCIpLm9uQ2xpY2soXHJcblx0XHRcdFx0XHRhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQoY2hhbmdlZFRpdGxlID09PSB1bmRlZmluZWQgfHwgY2hhbmdlZFRpdGxlID09PSBub3RlLnRpdGxlKSAmJlxyXG5cdFx0XHRcdFx0XHRcdChjaGFuZ2VkUGF0aCA9PT0gdW5kZWZpbmVkIHx8IGNoYW5nZWRQYXRoID09PSBub3RlLnBhdGgpICYmXHJcblx0XHRcdFx0XHRcdFx0KGNoYW5nZWRJY29uID09PSB1bmRlZmluZWQgfHwgY2hhbmdlZEljb24gPT09IG5vdGUuaWNvbilcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIlByb3ZpZGUgYW55IGRhdGFcIilcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRUaXRsZS5sZW5ndGggIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5vdGUudGl0bGUgPSBjaGFuZ2VkVGl0bGVcclxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZWRUaXRsZSA9IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbHNlIG5ldyBOb3RpY2UoXCJQcm92aWRlIHRpdGxlXCIpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRQYXRoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoY2hhbmdlZFBhdGgubGVuZ3RoICE9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRub3RlLnBhdGggPSBjaGFuZ2VkUGF0aFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlZFBhdGggPSB1bmRlZmluZWRcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBuZXcgTm90aWNlKFwiUHJvdmlkZSBwYXRoXCIpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRJY29uICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRub3RlLmljb24gPSBjaGFuZ2VkSWNvblxyXG5cdFx0XHRcdFx0XHRcdGNoYW5nZWRJY29uID0gdW5kZWZpbmVkXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmxvYWRTZXR0aW5ncygpXHJcblx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IGJ1dHRvbi5zZXRJY29uKFwidHJhc2gtMlwiKS5zZXRXYXJuaW5nKCkub25DbGljayhcclxuXHRcdFx0XHRcdGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4ucmVtb3ZlUGlubmVkTm90ZShub3RlLmlkKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpKVxyXG5cdFx0fSlcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlU3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PFRGaWxlPiB7XHJcblx0dGV4dElucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG5cdGdldFN1Z2dlc3Rpb25zKGlucHV0U3RyOiBzdHJpbmcpOiBURmlsZVtdIHtcclxuXHRcdGNvbnN0IGFic3RyYWN0RmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpO1xyXG5cdFx0Y29uc3QgZmlsZXM6IFRGaWxlW10gPSBbXTtcclxuXHRcdGNvbnN0IGlucHV0TG93ZXIgPSBpbnB1dFN0ci50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdGFic3RyYWN0RmlsZXMuZm9yRWFjaCgoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0ZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIFtcIm1kXCIsIFwiY2FudmFzXCJdLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSAmJlxyXG5cdFx0XHRcdGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGlucHV0TG93ZXIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGZpbGVzLnB1c2goZmlsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGZpbGVzO1xyXG5cdH1cclxuXHJcblx0cmVuZGVyU3VnZ2VzdGlvbihmaWxlOiBURmlsZSwgZWw6IEhUTUxFbGVtZW50KSB7XHJcblx0XHRpZiAoZmlsZS5leHRlbnNpb24gPT0gXCJtZFwiKSB7XHJcblx0XHRcdGVsLnNldFRleHQodHJpbUZpbGUoZmlsZSkpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdC8vd2UgZG9uJ3QgdXNlIHRyaW1GaWxlIGhlcmUgYXMgdGhlIGV4dGVuc2lvbiBpc24ndCBkaXNwbGF5ZWQgaGVyZVxyXG5cdFx0XHRlbC5zZXRUZXh0KGZpbGUucGF0aC5zbGljZSgwLCAtNykpXHJcblx0XHRcdGVsLmluc2VydEFkamFjZW50SFRNTChcclxuXHRcdFx0XHRcImJlZm9yZWVuZFwiLFxyXG5cdFx0XHRcdGA8ZGl2IGNsYXNzPVwibmF2LWZpbGUtdGFnXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGVcIj5jYW52YXM8L2Rpdj5gXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZWxlY3RTdWdnZXN0aW9uKGZpbGU6IFRGaWxlKSB7XHJcblx0XHR0aGlzLnRleHRJbnB1dEVsLnZhbHVlID0gdHJpbUZpbGUoZmlsZSk7XHJcblx0XHR0aGlzLnRleHRJbnB1dEVsLnRyaWdnZXIoXCJpbnB1dFwiKTtcclxuXHRcdHRoaXMuY2xvc2UoKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmltRmlsZShmaWxlOiBURmlsZSk6IHN0cmluZyB7XHJcblx0aWYgKCFmaWxlKSByZXR1cm4gXCJcIjtcclxuXHRyZXR1cm4gZmlsZS5leHRlbnNpb24gPT0gXCJtZFwiID8gZmlsZS5wYXRoLnNsaWNlKDAsIC0zKTogZmlsZS5wYXRoO1xyXG59XHJcbiIsICIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsICJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxuY29uc3QgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHJldHVybiBieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICBjb25zdCB1dWlkID0gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0KTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCAiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmFuZG9tVVVJRFxufTsiLCAiaW1wb3J0IG5hdGl2ZSBmcm9tICcuL25hdGl2ZS5qcyc7XG5pbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCB7IHVuc2FmZVN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgaWYgKG5hdGl2ZS5yYW5kb21VVUlEICYmICFidWYgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmF0aXZlLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHVuc2FmZVN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFVTzs7O0FDUFAsSUFBSTtBQUNKLElBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtBQUNoQixTQUFSLE1BQXVCO0FBRTVCLE1BQUksQ0FBQyxpQkFBaUI7QUFFcEIsc0JBQWtCLE9BQU8sV0FBVyxlQUFlLE9BQU8sbUJBQW1CLE9BQU8sZ0JBQWdCLEtBQUssTUFBTTtBQUUvRyxRQUFJLENBQUMsaUJBQWlCO0FBQ3BCLFlBQU0sSUFBSSxNQUFNLDBHQUEwRztBQUFBLElBQzVIO0FBQUEsRUFDRjtBQUVBLFNBQU8sZ0JBQWdCLEtBQUs7QUFDOUI7OztBQ1hBLElBQU0sWUFBWSxDQUFDO0FBRW5CLFNBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDNUIsWUFBVSxNQUFNLElBQUksS0FBTyxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRDtBQUVPLFNBQVMsZ0JBQWdCLEtBQUssU0FBUyxHQUFHO0FBRy9DLFNBQU8sVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksTUFBTSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLFVBQVUsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLE1BQU0sVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFD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