/* 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, { default: () => FrenchTypos }); module.exports = __toCommonJS(main_exports); var import_obsidian = require("obsidian"); var DEFAULT_SETTINGS = { apostrophe: true, quotationmarks: true, emdashes: true, twoenters: true, desactivatelinks: true, hyphenate: true, emptytlines: "normal" }; var FrenchTypos = class extends import_obsidian.Plugin { constructor() { super(...arguments); this.openQuote = true; } // Variable pour suivre l'état des guillemets async onload() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); this.addSettingTab(new FrenchTyposSettingTab(this.app, this)); this.addCommand({ id: "Apostrophes", name: "Apostrophes", editorCallback: (editor, view) => { this.updateApostrophes(editor); } }); this.registerDomEvent(document, "keydown", (event) => { const activeState = this.app.workspace.getLeaf().getViewState().state; const activeView = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); if (activeView && activeView.getMode() === "source" && activeState["source"] === false) { const editor = activeView.editor; const cursor = editor.getCursor(); if (event.key === "'" && this.settings.apostrophe) { event.preventDefault(); const selection = editor.getSelection(); if (selection.length > 0) { editor.replaceSelection("\u2019"); } else { editor.replaceRange("\u2019", cursor); editor.setCursor({ line: cursor.line, ch: cursor.ch + 1 }); } } else if (event.key === '"' && this.settings.quotationmarks) { event.preventDefault(); if (this.openQuote) { editor.replaceRange("\xAB\xA0", cursor); } else { editor.replaceRange("\xA0\xBB", cursor); } editor.setCursor({ line: cursor.line, ch: cursor.ch + 2 }); this.openQuote = !this.openQuote; } else if (event.key === " " && editor.getRange({ line: cursor.line, ch: cursor.ch - 2 }, cursor) === "--" && this.settings.emdashes) { event.preventDefault(); editor.replaceRange("\u2014\xA0", { line: cursor.line, ch: cursor.ch - 2 }, { line: cursor.line, ch: cursor.ch }); } else if (event.key === "Enter" && this.settings.twoenters) { event.preventDefault(); editor.replaceRange("\n\n", cursor); editor.setCursor({ line: cursor.line + 2, ch: cursor.ch }); } } }); this.registerDomEvent(document, "click", (event) => { var _a, _b; const target = event.target; const parent = target.parentNode; const ancertor = parent.parentNode; const activeView = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); const activeState = this.app.workspace.getLeaf().getViewState().state; if (activeView && activeView.getMode() === "source" && activeState["source"] === false && parent.classList.contains("cm-link") && this.settings.desactivatelinks) { event.preventDefault(); event.stopPropagation(); const editor = activeView.editor; const linktext = (_a = target.textContent) != null ? _a : ""; const longtext = (_b = ancertor == null ? void 0 : ancertor.textContent) != null ? _b : ""; this.MoveCursor(editor, longtext, linktext); } }, true); if (this.settings.emptytlines == "invisible") { await this.injectCSS(this.nobrcss()); } else if (this.settings.emptytlines == "small") { await this.injectCSS(this.small_interline()); } if (this.settings.hyphenate) { await this.setLanguage(); await this.injectCSS(this.hyphenscss()); } } updateApostrophes(editor) { const cursor = editor.getCursor(); const text = editor.getValue(); const updatedText = text.replace(/'/g, "\u2019"); editor.setValue(updatedText); editor.setCursor(cursor); } MoveCursor(editor, longtext, linktext) { const markdownContent = editor.getValue(); const lines = markdownContent.split("\n"); for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) { const nolink = this.noLinks(lines[lineIndex]); const lIndex = nolink.indexOf(this.noLinks(longtext)); if (lIndex !== -1) { const search = "[" + linktext + "]"; let localIndex = lines[lineIndex].indexOf(search); if (localIndex !== -1) { const coords = { line: lineIndex, ch: localIndex }; editor.setCursor(coords); } } } } noLinks(makdown) { return makdown.replace(/\[(.*?)\]\(.*?\)/g, "$1"); } async setLanguage() { document.documentElement.setAttribute("lang", "fr"); } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } async saveSettings() { await this.saveData(this.settings); } // /Users/thierrycrouzet/Documents/ObsidianDev/.obsidian/plugins/obsidian-french-typos/nobr.css async injectCSS(css) { const styleEl = document.createElement("style"); styleEl.innerHTML = css; document.head.appendChild(styleEl); } nobrcss() { return ` .markdown-source-view.mod-cm6.is-live-preview .HyperMD-header{ text-indent: 0rem !important; } .markdown-source-view.mod-cm6.is-live-preview .cm-line { text-indent: 2rem; } .markdown-source-view.mod-cm6.is-live-preview .HyperMD-header-1{ margin-bottom: 2rem !important; } .markdown-source-view.mod-cm6.is-live-preview .HyperMD-header-2{ margin-top: 1rem !important; } .markdown-source-view.mod-cm6.is-live-preview .HyperMD-header-3{ margin-top: 1rem !important; } .markdown-source-view.mod-cm6.is-live-preview .cm-line:has(> br) { display: none; } .markdown-source-view.mod-cm6.is-live-preview .cm-active:has(> br) { display: inline !important; } .markdown-source-view.mod-cm6.is-live-preview .cm-line.HyperMD-list-line { margin: 0.25rem 0; } `; } hyphenscss() { return ` .markdown-preview-view p { text-indent: 3rem; text-align: justify; margin-top: 0; margin-bottom: 0; hyphens: auto; word-wrap: break-word; hyphenate-character: auto; hyphenate-limit-chars: 6 3 3; } `; } small_interline() { return ` .markdown-source-view.mod-cm6.is-live-preview .HyperMD-header{ text-indent: 0rem !important; } .markdown-source-view.mod-cm6.is-live-preview .cm-line { text-indent: 2rem; } .markdown-source-view.mod-cm6.is-live-preview .cm-line:has(> br) { height: 0.7rem;text-indent: 2rem; } `; } }; var FrenchTyposSettingTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); const titleEl = containerEl.createEl("h2", { text: "French Typos settings" }); const desEl = containerEl.createEl("p", { text: "Works mainly in Live Preview mode." }); new import_obsidian.Setting(containerEl).setName("Apostrophe").setDesc("Activate typographic apostrophe").addToggle((toggle) => toggle.setValue(this.plugin.settings.apostrophe).onChange(async (value) => { this.plugin.settings.apostrophe = value; await this.plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("French quotation marks and hard spaces").setDesc("Convert standard quotation marks").addToggle((toggle) => toggle.setValue(this.plugin.settings.quotationmarks).onChange(async (value) => { this.plugin.settings.quotationmarks = value; await this.plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Em dashes").setDesc('Convert "-- " into em dashes').addToggle((toggle) => toggle.setValue(this.plugin.settings.emdashes).onChange(async (value) => { this.plugin.settings.emdashes = value; await this.plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Two Enters for one").setDesc("One Enter create a Markdown paragraph").addToggle((toggle) => toggle.setValue(this.plugin.settings.twoenters).onChange(async (value) => { this.plugin.settings.twoenters = value; await this.plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Simulate Shift+Clic on links").setDesc("Display the URL instead of opening").addToggle((toggle) => toggle.setValue(this.plugin.settings.desactivatelinks).onChange(async (value) => { this.plugin.settings.desactivatelinks = value; await this.plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Empty lines").setDesc("Reload your Vault to process\u2026").addDropdown((dropdown) => { dropdown.addOptions({ "normal": "Normal", "small": "Small", "invisible": "Invisible" }); dropdown.setValue(this.plugin.settings.emptytlines); dropdown.onChange(async (value) => { this.plugin.settings.emptytlines = value; await this.plugin.saveSettings(); }); }); new import_obsidian.Setting(containerEl).setName("Hyphenate French rules").setDesc("Only in Reading view (reload your Vault to process)").addToggle((toggle) => toggle.setValue(this.plugin.settings.hyphenate).onChange(async (value) => { this.plugin.settings.hyphenate = value; await this.plugin.saveSettings(); })); } }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBFZGl0b3IsIE1hcmtkb3duVmlldywgUGx1Z2luU2V0dGluZ1RhYiwgUGx1Z2luLCBTZXR0aW5nLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW50ZXJmYWNlIEZyZW5jaFR5cG9zU2V0dGluZ3Mge1xuXHRhcG9zdHJvcGhlOiBib29sZWFuO1xuXHRxdW90YXRpb25tYXJrczogYm9vbGVhbjtcblx0ZW1kYXNoZXM6IGJvb2xlYW47XG5cdHR3b2VudGVyczogYm9vbGVhbjtcblx0ZGVzYWN0aXZhdGVsaW5rczogYm9vbGVhbjtcblx0aHlwaGVuYXRlOiBib29sZWFuO1xuXHRlbXB0eXRsaW5lczogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBGcmVuY2hUeXBvc1NldHRpbmdzID0ge1xuXHRhcG9zdHJvcGhlOiB0cnVlLFxuXHRxdW90YXRpb25tYXJrczogdHJ1ZSxcblx0ZW1kYXNoZXM6IHRydWUsXG5cdHR3b2VudGVyczogdHJ1ZSxcblx0ZGVzYWN0aXZhdGVsaW5rczogdHJ1ZSxcblx0aHlwaGVuYXRlOiB0cnVlLFxuXHRlbXB0eXRsaW5lczogJ25vcm1hbCdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJlbmNoVHlwb3MgZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogRnJlbmNoVHlwb3NTZXR0aW5ncztcblx0cHJpdmF0ZSBvcGVuUXVvdGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBWYXJpYWJsZSBwb3VyIHN1aXZyZSBsJ1x1MDBFOXRhdCBkZXMgZ3VpbGxlbWV0c1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcblxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgRnJlbmNoVHlwb3NTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICdBcG9zdHJvcGhlcycsXG5cdFx0XHRuYW1lOiAnQXBvc3Ryb3BoZXMnLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMudXBkYXRlQXBvc3Ryb3BoZXMoZWRpdG9yKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMucmVnaXN0ZXJEb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcblx0XHRcdGNvbnN0IGFjdGl2ZVN0YXRlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoKS5nZXRWaWV3U3RhdGUoKS5zdGF0ZVxuXHRcdFx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG5cdFx0XHRpZiAoYWN0aXZlVmlldyAmJiBhY3RpdmVWaWV3LmdldE1vZGUoKSA9PT0gJ3NvdXJjZScgJiYgYWN0aXZlU3RhdGVbXCJzb3VyY2VcIl0gPT09IGZhbHNlKSB7XG5cdFx0XHRcdGNvbnN0IGVkaXRvciA9IGFjdGl2ZVZpZXcuZWRpdG9yO1xuXHRcdFx0XHRjb25zdCBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cblx0XHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gXCInXCIgJiYgdGhpcy5zZXR0aW5ncy5hcG9zdHJvcGhlKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRjb25zdCBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRcdGlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gUmVtcGxhY2UgbGUgdGV4dGUgc1x1MDBFOWxlY3Rpb25uXHUwMEU5IHBhciBsXHUyMDE5YXBvc3Ryb3BoZVxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJcdTIwMTlcIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIEluc1x1MDBFOHJlIGxcdTIwMTlhcG9zdHJvcGhlIFx1MDBFMCBsYSBwb3NpdGlvbiBkdSBjdXJzZXVyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXHUyMDE5XCIsIGN1cnNvcik7XG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogY3Vyc29yLmxpbmUsIGNoOiBjdXJzb3IuY2ggKyAxIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnXCInICYmIHRoaXMuc2V0dGluZ3MucXVvdGF0aW9ubWFya3MpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdGlmICh0aGlzLm9wZW5RdW90ZSkge1xuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcIlx1MDBBQlx1MDBBMFwiLCBjdXJzb3IpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXHUwMEEwXHUwMEJCXCIsIGN1cnNvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBjdXJzb3IubGluZSwgY2g6IGN1cnNvci5jaCArIDIgfSk7XG5cdFx0XHRcdFx0dGhpcy5vcGVuUXVvdGUgPSAhdGhpcy5vcGVuUXVvdGU7XG5cblx0XHRcdFx0fSBlbHNlIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiBlZGl0b3IuZ2V0UmFuZ2UoeyBsaW5lOiBjdXJzb3IubGluZSwgY2g6IGN1cnNvci5jaCAtIDIgfSwgY3Vyc29yKSA9PT0gJy0tJyAmJiB0aGlzLnNldHRpbmdzLmVtZGFzaGVzKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXHUyMDE0XHUwMEEwXCIsIHsgbGluZTogY3Vyc29yLmxpbmUsIGNoOiBjdXJzb3IuY2ggLSAyIH0sIHsgbGluZTogY3Vyc29yLmxpbmUsIGNoOiBjdXJzb3IuY2ggfSk7XG5cdFx0XHRcdFxuXHRcdFx0XHR9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAgJiYgdGhpcy5zZXR0aW5ncy50d29lbnRlcnMpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJcXG5cXG5cIiwgY3Vyc29yKTtcblx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogY3Vyc29yLmxpbmUgKyAyLCBjaDogY3Vyc29yLmNoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLnJlZ2lzdGVyRG9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRjb25zdCBhbmNlcnRvciA9IHBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG5cdFx0XHRjb25zdCBhY3RpdmVTdGF0ZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCkuZ2V0Vmlld1N0YXRlKCkuc3RhdGVcblxuXHRcdFx0Ly8gRW1wXHUwMEVBY2hlciBsJ291dmVydHVyZSBkZXMgbGllbnMgY20tbGlua1xuXHRcdFx0aWYgKGFjdGl2ZVZpZXcgJiYgYWN0aXZlVmlldy5nZXRNb2RlKCkgPT09ICdzb3VyY2UnICYmIGFjdGl2ZVN0YXRlW1wic291cmNlXCJdID09PSBmYWxzZSAmJiBwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbS1saW5rJykgJiYgdGhpcy5zZXR0aW5ncy5kZXNhY3RpdmF0ZWxpbmtzKSB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRjb25zdCBlZGl0b3IgPSBhY3RpdmVWaWV3LmVkaXRvcjtcblx0XHRcdFx0Y29uc3QgbGlua3RleHQgPSB0YXJnZXQudGV4dENvbnRlbnQgPz8gJyc7XG5cdFx0XHRcdGNvbnN0IGxvbmd0ZXh0ID0gYW5jZXJ0b3I/LnRleHRDb250ZW50ID8/ICcnO1xuXHRcdFx0XHR0aGlzLk1vdmVDdXJzb3IoZWRpdG9yLCBsb25ndGV4dCwgbGlua3RleHQpO1xuXHRcdFx0fVxuXG5cdFx0fSwgdHJ1ZSk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5lbXB0eXRsaW5lcyA9PSBcImludmlzaWJsZVwiKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmluamVjdENTUyh0aGlzLm5vYnJjc3MoKSk7XG5cdFx0fWVsc2UgaWYgKHRoaXMuc2V0dGluZ3MuZW1wdHl0bGluZXMgPT0gXCJzbWFsbFwiKXtcblx0XHRcdGF3YWl0IHRoaXMuaW5qZWN0Q1NTKHRoaXMuc21hbGxfaW50ZXJsaW5lKCkpO1xuXHRcdH1cblxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuaHlwaGVuYXRlKSB7XG5cdFx0XHRhd2FpdCB0aGlzLnNldExhbmd1YWdlKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmluamVjdENTUyh0aGlzLmh5cGhlbnNjc3MoKSk7XG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGVBcG9zdHJvcGhlcyhlZGl0b3I6IEVkaXRvcikge1xuXHRcdGNvbnN0IGN1cnNvciA9IGVkaXRvci5nZXRDdXJzb3IoKTtcblx0XHRjb25zdCB0ZXh0ID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cdFx0Y29uc3QgdXBkYXRlZFRleHQgPSB0ZXh0LnJlcGxhY2UoLycvZywgXCJcdTIwMTlcIik7XG5cdFx0ZWRpdG9yLnNldFZhbHVlKHVwZGF0ZWRUZXh0KTtcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKGN1cnNvcik7XG5cdH1cblxuXHRNb3ZlQ3Vyc29yKGVkaXRvcjogRWRpdG9yLCBsb25ndGV4dDogc3RyaW5nLCBsaW5rdGV4dDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbWFya2Rvd25Db250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cdFx0Y29uc3QgbGluZXMgPSBtYXJrZG93bkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXHRcdC8vY29uc29sZS5sb2cobG9uZ3RleHQpO1xuXHRcdC8vY29uc29sZS5sb2cobGlua3RleHQpXG5cblx0XHRmb3IgKGxldCBsaW5lSW5kZXggPSAwOyBsaW5lSW5kZXggPCBsaW5lcy5sZW5ndGg7IGxpbmVJbmRleCsrKSB7XG5cdFx0XHRjb25zdCBub2xpbmsgPSB0aGlzLm5vTGlua3MobGluZXNbbGluZUluZGV4XSk7XG5cdFx0XHRjb25zdCBsSW5kZXggPSBub2xpbmsuaW5kZXhPZih0aGlzLm5vTGlua3MobG9uZ3RleHQpKTtcblx0XG5cdFx0XHRpZiAobEluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHQvL2NvbnNvbGUubG9nKFwiTGluZTogXCIrbEluZGV4KTtcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhsaW5lc1tsaW5lSW5kZXhdKTtcblx0XHRcdFx0Y29uc3Qgc2VhcmNoID0gXCJbXCIrbGlua3RleHQrXCJdXCI7XG5cdFx0XHRcdC8vY29uc29sZS5sb2coc2VhcmNoKTtcblx0XHRcdFx0bGV0IGxvY2FsSW5kZXggPSBsaW5lc1tsaW5lSW5kZXhdLmluZGV4T2Yoc2VhcmNoKTtcblx0XHRcdFx0aWYgKGxvY2FsSW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29vcmRzID0geyBsaW5lOiBsaW5lSW5kZXgsIGNoOiBsb2NhbEluZGV4IH1cblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKGNvb3Jkcylcblx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKGNvb3Jkcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRub0xpbmtzKG1ha2Rvd246IHN0cmluZyl7XG5cdFx0cmV0dXJuIG1ha2Rvd24ucmVwbGFjZSgvXFxbKC4qPylcXF1cXCguKj9cXCkvZywgJyQxJyk7XG5cdH1cblxuXHRhc3luYyBzZXRMYW5ndWFnZSgpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnbGFuZycsICdmcicpO1xuICAgIH1cblxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxuXG5cdC8vIC9Vc2Vycy90aGllcnJ5Y3JvdXpldC9Eb2N1bWVudHMvT2JzaWRpYW5EZXYvLm9ic2lkaWFuL3BsdWdpbnMvb2JzaWRpYW4tZnJlbmNoLXR5cG9zL25vYnIuY3NzXG5cdGFzeW5jIGluamVjdENTUyhjc3M6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXHRcdHN0eWxlRWwuaW5uZXJIVE1MID0gY3NzO1xuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gICAgfVxuXG5cdG5vYnJjc3MoKSB7XG5cdFx0cmV0dXJuIGBcblx0XHQubWFya2Rvd24tc291cmNlLXZpZXcubW9kLWNtNi5pcy1saXZlLXByZXZpZXcgLkh5cGVyTUQtaGVhZGVye1xuXHRcdFx0dGV4dC1pbmRlbnQ6IDByZW0gIWltcG9ydGFudDtcblx0XHR9XG5cdFx0XG5cdFx0Lm1hcmtkb3duLXNvdXJjZS12aWV3Lm1vZC1jbTYuaXMtbGl2ZS1wcmV2aWV3IC5jbS1saW5lIHtcblx0XHRcdHRleHQtaW5kZW50OiAycmVtO1xuXHRcdH1cblx0XHRcblx0XHQubWFya2Rvd24tc291cmNlLXZpZXcubW9kLWNtNi5pcy1saXZlLXByZXZpZXcgLkh5cGVyTUQtaGVhZGVyLTF7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAycmVtICFpbXBvcnRhbnQ7XG5cdFx0fVxuXHRcdFxuXHRcdC5tYXJrZG93bi1zb3VyY2Utdmlldy5tb2QtY202LmlzLWxpdmUtcHJldmlldyAuSHlwZXJNRC1oZWFkZXItMntcblx0XHRcdG1hcmdpbi10b3A6IDFyZW0gIWltcG9ydGFudDtcblx0XHR9XG5cdFx0XG5cdFx0Lm1hcmtkb3duLXNvdXJjZS12aWV3Lm1vZC1jbTYuaXMtbGl2ZS1wcmV2aWV3IC5IeXBlck1ELWhlYWRlci0ze1xuXHRcdFx0bWFyZ2luLXRvcDogMXJlbSAhaW1wb3J0YW50O1xuXHRcdH1cblx0XHRcblx0XHQubWFya2Rvd24tc291cmNlLXZpZXcubW9kLWNtNi5pcy1saXZlLXByZXZpZXcgLmNtLWxpbmU6aGFzKD4gYnIpIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHRcdFxuXHRcdC5tYXJrZG93bi1zb3VyY2Utdmlldy5tb2QtY202LmlzLWxpdmUtcHJldmlldyAuY20tYWN0aXZlOmhhcyg+IGJyKSB7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcblx0XHR9XG5cdFx0XG5cdFx0Lm1hcmtkb3duLXNvdXJjZS12aWV3Lm1vZC1jbTYuaXMtbGl2ZS1wcmV2aWV3IC5jbS1saW5lLkh5cGVyTUQtbGlzdC1saW5lIHtcblx0XHRcdG1hcmdpbjogMC4yNXJlbSAwO1xuXHRcdH1cblx0XHRgXG5cdH1cblxuXHRoeXBoZW5zY3NzKCkge1xuXHRcdHJldHVybiBgXG5cdFx0Lm1hcmtkb3duLXByZXZpZXctdmlldyBwIHtcblx0XHRcdHRleHQtaW5kZW50OiAzcmVtO1xuXHRcdFx0dGV4dC1hbGlnbjoganVzdGlmeTtcblx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0aHlwaGVuczogYXV0bztcblx0XHRcdHdvcmQtd3JhcDogYnJlYWstd29yZDtcblx0XHRcdGh5cGhlbmF0ZS1jaGFyYWN0ZXI6IGF1dG87XG5cdFx0ICAgIGh5cGhlbmF0ZS1saW1pdC1jaGFyczogNiAzIDM7XG5cdFx0fVxuXHRcdGBcblx0fVxuXG5cdHNtYWxsX2ludGVybGluZSgpIHtcblx0XHRyZXR1cm4gYFxuXHRcdC5tYXJrZG93bi1zb3VyY2Utdmlldy5tb2QtY202LmlzLWxpdmUtcHJldmlldyAuSHlwZXJNRC1oZWFkZXJ7XG5cdFx0XHR0ZXh0LWluZGVudDogMHJlbSAhaW1wb3J0YW50O1xuXHRcdH1cblxuXHRcdC5tYXJrZG93bi1zb3VyY2Utdmlldy5tb2QtY202LmlzLWxpdmUtcHJldmlldyAuY20tbGluZSB7XG5cdFx0XHR0ZXh0LWluZGVudDogMnJlbTtcblx0XHR9XG5cblx0XHQubWFya2Rvd24tc291cmNlLXZpZXcubW9kLWNtNi5pcy1saXZlLXByZXZpZXcgLmNtLWxpbmU6aGFzKD4gYnIpIHtcblx0XHRcdGhlaWdodDogMC43cmVtO3RleHQtaW5kZW50OiAycmVtO1xuXHRcdH1cblx0YFxuXHR9XG5cdFxufVxuXG5jbGFzcyBGcmVuY2hUeXBvc1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBGcmVuY2hUeXBvcztcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBGcmVuY2hUeXBvcykge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XG5cblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Y29uc3QgdGl0bGVFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0ZyZW5jaCBUeXBvcyBzZXR0aW5ncycgfSk7XG5cdFx0Y29uc3QgZGVzRWwgPSBjb250YWluZXJFbC5jcmVhdGVFbCgncCcsIHsgdGV4dDogJ1dvcmtzIG1haW5seSBpbiBMaXZlIFByZXZpZXcgbW9kZS4nIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnQXBvc3Ryb3BoZScpXG5cdFx0XHQuc2V0RGVzYygnQWN0aXZhdGUgdHlwb2dyYXBoaWMgYXBvc3Ryb3BoZScpXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFwb3N0cm9waGUpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcG9zdHJvcGhlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdGcmVuY2ggcXVvdGF0aW9uIG1hcmtzIGFuZCBoYXJkIHNwYWNlcycpXG5cdFx0LnNldERlc2MoJ0NvbnZlcnQgc3RhbmRhcmQgcXVvdGF0aW9uIG1hcmtzJylcblx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5xdW90YXRpb25tYXJrcylcblx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucXVvdGF0aW9ubWFya3MgPSB2YWx1ZTtcblx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHR9KSk7XG5cdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdFbSBkYXNoZXMnKVxuXHRcdC5zZXREZXNjKCdDb252ZXJ0IFwiLS0gXCIgaW50byBlbSBkYXNoZXMnKVxuXHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVtZGFzaGVzKVxuXHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbWRhc2hlcyA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdUd28gRW50ZXJzIGZvciBvbmUnKVxuXHRcdC5zZXREZXNjKCdPbmUgRW50ZXIgY3JlYXRlIGEgTWFya2Rvd24gcGFyYWdyYXBoJylcblx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy50d29lbnRlcnMpXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnR3b2VudGVycyA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdTaW11bGF0ZSBTaGlmdCtDbGljIG9uIGxpbmtzJylcblx0XHQuc2V0RGVzYygnRGlzcGxheSB0aGUgVVJMIGluc3RlYWQgb2Ygb3BlbmluZycpXG5cdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4gdG9nZ2xlXG5cdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVzYWN0aXZhdGVsaW5rcylcblx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVzYWN0aXZhdGVsaW5rcyA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdFbXB0eSBsaW5lcycpXG5cdFx0LnNldERlc2MoJ1JlbG9hZCB5b3VyIFZhdWx0IHRvIHByb2Nlc3NcdTIwMjYnKVxuXHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiB7XG5cdFx0XHRkcm9wZG93bi5hZGRPcHRpb25zKHtcblx0XHRcdFx0J25vcm1hbCc6ICdOb3JtYWwnLFxuXHRcdFx0XHQnc21hbGwnOiAnU21hbGwnLFxuXHRcdFx0XHQnaW52aXNpYmxlJzogJ0ludmlzaWJsZSdcblx0XHRcdH0pO1xuXHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW1wdHl0bGluZXMpO1xuXHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVtcHR5dGxpbmVzID0gdmFsdWU7XG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdIeXBoZW5hdGUgRnJlbmNoIHJ1bGVzJylcblx0XHQuc2V0RGVzYygnT25seSBpbiBSZWFkaW5nIHZpZXcgKHJlbG9hZCB5b3VyIFZhdWx0IHRvIHByb2Nlc3MpJylcblx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5oeXBoZW5hdGUpXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmh5cGhlbmF0ZSA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHR9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFvRjtBQVlwRixJQUFNLG1CQUF3QztBQUFBLEVBQzdDLFlBQVk7QUFBQSxFQUNaLGdCQUFnQjtBQUFBLEVBQ2hCLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGtCQUFrQjtBQUFBLEVBQ2xCLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFDZDtBQUVBLElBQXFCLGNBQXJCLGNBQXlDLHVCQUFPO0FBQUEsRUFBaEQ7QUFBQTtBQUVDLFNBQVEsWUFBcUI7QUFBQTtBQUFBO0FBQUEsRUFFN0IsTUFBTSxTQUFTO0FBQ2QsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFFekUsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFFNUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixnQkFBZ0IsQ0FBQyxRQUFnQixTQUF1QjtBQUN2RCxhQUFLLGtCQUFrQixNQUFNO0FBQUEsTUFDOUI7QUFBQSxJQUNELENBQUM7QUFFRCxTQUFLLGlCQUFpQixVQUFVLFdBQVcsQ0FBQyxVQUF5QjtBQUNwRSxZQUFNLGNBQWMsS0FBSyxJQUFJLFVBQVUsUUFBUSxFQUFFLGFBQWEsRUFBRTtBQUNoRSxZQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsb0JBQW9CLDRCQUFZO0FBQ3RFLFVBQUksY0FBYyxXQUFXLFFBQVEsTUFBTSxZQUFZLFlBQVksUUFBUSxNQUFNLE9BQU87QUFDdkYsY0FBTSxTQUFTLFdBQVc7QUFDMUIsY0FBTSxTQUFTLE9BQU8sVUFBVTtBQUVoQyxZQUFJLE1BQU0sUUFBUSxPQUFPLEtBQUss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