270 lines
32 KiB
JavaScript
270 lines
32 KiB
JavaScript
/*
|
|
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+IHtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVzYWN0aXZhdGVsaW5rcyA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdFbXB0eSBsaW5lcycpXG5cdFx0LnNldERlc2MoJ1JlbG9hZCB5b3VyIFZhdWx0IHRvIHByb2Nlc3NcdTIwMjYnKVxuXHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiB7XG5cdFx0XHRkcm9wZG93bi5hZGRPcHRpb25zKHtcblx0XHRcdFx0J25vcm1hbCc6ICdOb3JtYWwnLFxuXHRcdFx0XHQnc21hbGwnOiAnU21hbGwnLFxuXHRcdFx0XHQnaW52aXNpYmxlJzogJ0ludmlzaWJsZSdcblx0XHRcdH0pO1xuXHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW1wdHl0bGluZXMpO1xuXHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVtcHR5dGxpbmVzID0gdmFsdWU7XG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC5zZXROYW1lKCdIeXBoZW5hdGUgRnJlbmNoIHJ1bGVzJylcblx0XHQuc2V0RGVzYygnT25seSBpbiBSZWFkaW5nIHZpZXcgKHJlbG9hZCB5b3VyIFZhdWx0IHRvIHByb2Nlc3MpJylcblx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5oeXBoZW5hdGUpXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmh5cGhlbmF0ZSA9IHZhbHVlO1xuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pKTtcblxuXHR9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFvRjtBQVlwRixJQUFNLG1CQUF3QztBQUFBLEVBQzdDLFlBQVk7QUFBQSxFQUNaLGdCQUFnQjtBQUFBLEVBQ2hCLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGtCQUFrQjtBQUFBLEVBQ2xCLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFDZDtBQUVBLElBQXFCLGNBQXJCLGNBQXlDLHVCQUFPO0FBQUEsRUFBaEQ7QUFBQTtBQUVDLFNBQVEsWUFBcUI7QUFBQTtBQUFBO0FBQUEsRUFFN0IsTUFBTSxTQUFTO0FBQ2QsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFFekUsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFFNUQsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixnQkFBZ0IsQ0FBQyxRQUFnQixTQUF1QjtBQUN2RCxhQUFLLGtCQUFrQixNQUFNO0FBQUEsTUFDOUI7QUFBQSxJQUNELENBQUM7QUFFRCxTQUFLLGlCQUFpQixVQUFVLFdBQVcsQ0FBQyxVQUF5QjtBQUNwRSxZQUFNLGNBQWMsS0FBSyxJQUFJLFVBQVUsUUFBUSxFQUFFLGFBQWEsRUFBRTtBQUNoRSxZQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsb0JBQW9CLDRCQUFZO0FBQ3RFLFVBQUksY0FBYyxXQUFXLFFBQVEsTUFBTSxZQUFZLFlBQVksUUFBUSxNQUFNLE9BQU87QUFDdkYsY0FBTSxTQUFTLFdBQVc7QUFDMUIsY0FBTSxTQUFTLE9BQU8sVUFBVTtBQUVoQyxZQUFJLE1BQU0sUUFBUSxPQUFPLEtBQUssU0FBUyxZQUFZO0FBQ2xELGdCQUFNLGVBQWU7QUFDckIsZ0JBQU0sWUFBWSxPQUFPLGFBQWE7QUFFdEMsY0FBSSxVQUFVLFNBQVMsR0FBRztBQUV6QixtQkFBTyxpQkFBaUIsUUFBRztBQUFBLFVBQzVCLE9BQU87QUFFTixtQkFBTyxhQUFhLFVBQUssTUFBTTtBQUMvQixtQkFBTyxVQUFVLEVBQUUsTUFBTSxPQUFPLE1BQU0sSUFBSSxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQUEsVUFDMUQ7QUFBQSxRQUVELFdBQVcsTUFBTSxRQUFRLE9BQU8sS0FBSyxTQUFTLGdCQUFnQjtBQUM3RCxnQkFBTSxlQUFlO0FBQ3JCLGNBQUksS0FBSyxXQUFXO0FBQ25CLG1CQUFPLGFBQWEsWUFBTSxNQUFNO0FBQUEsVUFDakMsT0FBTztBQUNOLG1CQUFPLGFBQWEsWUFBTSxNQUFNO0FBQUEsVUFDakM7QUFDQSxpQkFBTyxVQUFVLEVBQUUsTUFBTSxPQUFPLE1BQU0sSUFBSSxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQ3pELGVBQUssWUFBWSxDQUFDLEtBQUs7QUFBQSxRQUV4QixXQUFXLE1BQU0sUUFBUSxPQUFPLE9BQU8sU0FBUyxFQUFFLE1BQU0sT0FBTyxNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sUUFBUSxLQUFLLFNBQVMsVUFBVTtBQUNySSxnQkFBTSxlQUFlO0FBQ3JCLGlCQUFPLGFBQWEsY0FBTSxFQUFFLE1BQU0sT0FBTyxNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxNQUFNLElBQUksT0FBTyxHQUFHLENBQUM7QUFBQSxRQUV6RyxXQUFXLE1BQU0sUUFBUSxXQUFZLEtBQUssU0FBUyxXQUFXO0FBQzdELGdCQUFNLGVBQWU7QUFDckIsaUJBQU8sYUFBYSxRQUFRLE1BQU07QUFDbEMsaUJBQU8sVUFBVSxFQUFFLE1BQU0sT0FBTyxPQUFPLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUFBLFFBQzFEO0FBQUEsTUFDRDtBQUFBLElBQ0QsQ0FBQztBQUVELFNBQUssaUJBQWlCLFVBQVUsU0FBUyxDQUFDLFVBQXNCO0FBakZsRTtBQWtGRyxZQUFNLFNBQVMsTUFBTTtBQUNyQixZQUFNLFNBQVMsT0FBTztBQUN0QixZQUFNLFdBQVcsT0FBTztBQUN4QixZQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsb0JBQW9CLDRCQUFZO0FBQ3RFLFlBQU0sY0FBYyxLQUFLLElBQUksVUFBVSxRQUFRLEVBQUUsYUFBYSxFQUFFO0FBR2hFLFVBQUksY0FBYyxXQUFXLFFBQVEsTUFBTSxZQUFZLFlBQVksUUFBUSxNQUFNLFNBQVMsT0FBTyxVQUFVLFNBQVMsU0FBUyxLQUFLLEtBQUssU0FBUyxrQkFBa0I7QUFDakssY0FBTSxlQUFlO0FBQ3JCLGNBQU0sZ0JBQWdCO0FBQ3RCLGNBQU0sU0FBUyxXQUFXO0FBQzFCLGNBQU0sWUFBVyxZQUFPLGdCQUFQLFlBQXNCO0FBQ3ZDLGNBQU0sWUFBVywwQ0FBVSxnQkFBVixZQUF5QjtBQUMxQyxhQUFLLFdBQVcsUUFBUSxVQUFVLFFBQVE7QUFBQSxNQUMzQztBQUFBLElBRUQsR0FBRyxJQUFJO0FBRVAsUUFBSSxLQUFLLFNBQVMsZUFBZSxhQUFhO0FBQzdDLFlBQU0sS0FBSyxVQUFVLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDcEMsV0FBVSxLQUFLLFNBQVMsZUFBZSxTQUFRO0FBQzlDLFlBQU0sS0FBSyxVQUFVLEtBQUssZ0JBQWdCLENBQUM7QUFBQSxJQUM1QztBQUdBLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsWUFBTSxLQUFLLFlBQVk7QUFDdkIsWUFBTSxLQUFLLFVBQVUsS0FBSyxXQUFXLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBRUQ7QUFBQSxFQUVBLGtCQUFrQixRQUFnQjtBQUNqQyxVQUFNLFNBQVMsT0FBTyxVQUFVO0FBQ2hDLFVBQU0sT0FBTyxPQUFPLFNBQVM7QUFDN0IsVUFBTSxjQUFjLEtBQUssUUFBUSxNQUFNLFFBQUc7QUFDMUMsV0FBTyxTQUFTLFdBQVc7QUFDM0IsV0FBTyxVQUFVLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsV0FBVyxRQUFnQixVQUFrQixVQUFrQjtBQUM5RCxVQUFNLGtCQUFrQixPQUFPLFNBQVM7QUFDeEMsVUFBTSxRQUFRLGdCQUFnQixNQUFNLElBQUk7QUFJeEMsYUFBUyxZQUFZLEdBQUcsWUFBWSxNQUFNLFFBQVEsYUFBYTtBQUM5RCxZQUFNLFNBQVMsS0FBSyxRQUFRLE1BQU0sU0FBUyxDQUFDO0FBQzVDLFlBQU0sU0FBUyxPQUFPLFFBQVEsS0FBSyxRQUFRLFFBQVEsQ0FBQztBQUVwRCxVQUFJLFdBQVcsSUFBSTtBQUdsQixjQUFNLFNBQVMsTUFBSSxXQUFTO0FBRTVCLFlBQUksYUFBYSxNQUFNLFNBQVMsRUFBRSxRQUFRLE1BQU07QUFDaEQsWUFBSSxlQUFlLElBQUk7QUFDdEIsZ0JBQU0sU0FBUyxFQUFFLE1BQU0sV0FBVyxJQUFJLFdBQVc7QUFFakQsaUJBQU8sVUFBVSxNQUFNO0FBQUEsUUFDeEI7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUVBLFFBQVEsU0FBZ0I7QUFDdkIsV0FBTyxRQUFRLFFBQVEscUJBQXFCLElBQUk7QUFBQSxFQUNqRDtBQUFBLEVBRUEsTUFBTSxjQUFjO0FBQ2IsYUFBUyxnQkFBZ0IsYUFBYSxRQUFRLElBQUk7QUFBQSxFQUN0RDtBQUFBLEVBRUgsTUFBTSxlQUFlO0FBQ3BCLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDMUU7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNsQztBQUFBO0FBQUEsRUFHQSxNQUFNLFVBQVUsS0FBYTtBQUM1QixVQUFNLFVBQVUsU0FBUyxjQUFjLE9BQU87QUFDOUMsWUFBUSxZQUFZO0FBQ3BCLGFBQVMsS0FBSyxZQUFZLE9BQU87QUFBQSxFQUMvQjtBQUFBLEVBRUgsVUFBVTtBQUNULFdBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFpQ1I7QUFBQSxFQUVBLGFBQWE7QUFDWixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVI7QUFBQSxFQUVBLGtCQUFrQjtBQUNqQixXQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhUjtBQUVEO0FBRUEsSUFBTSx3QkFBTixjQUFvQyxpQ0FBaUI7QUFBQSxFQUdwRCxZQUFZLEtBQVUsUUFBcUI7QUFDMUMsVUFBTSxLQUFLLE1BQU07QUFDakIsU0FBSyxTQUFTO0FBQUEsRUFDZjtBQUFBLEVBRUEsVUFBZ0I7QUFDZixVQUFNLEVBQUMsWUFBVyxJQUFJO0FBRXRCLGdCQUFZLE1BQU07QUFFbEIsVUFBTSxVQUFVLFlBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RSxVQUFNLFFBQVEsWUFBWSxTQUFTLEtBQUssRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXRGLFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLFlBQVksRUFDcEIsUUFBUSxpQ0FBaUMsRUFDekMsVUFBVSxZQUFVLE9BQ25CLFNBQVMsS0FBSyxPQUFPLFNBQVMsVUFBVSxFQUN4QyxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxhQUFhO0FBQ2xDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNoQyxDQUFDLENBQUM7QUFFSixRQUFJLHdCQUFRLFdBQVcsRUFDdEIsUUFBUSx3Q0FBd0MsRUFDaEQsUUFBUSxrQ0FBa0MsRUFDMUMsVUFBVSxZQUFVLE9BQ25CLFNBQVMsS0FBSyxPQUFPLFNBQVMsY0FBYyxFQUM1QyxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxpQkFBaUI7QUFDdEMsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUVILFFBQUksd0JBQVEsV0FBVyxFQUN0QixRQUFRLFdBQVcsRUFDbkIsUUFBUSw4QkFBOEIsRUFDdEMsVUFBVSxZQUFVLE9BQ25CLFNBQVMsS0FBSyxPQUFPLFNBQVMsUUFBUSxFQUN0QyxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxXQUFXO0FBQ2hDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNoQyxDQUFDLENBQUM7QUFFSCxRQUFJLHdCQUFRLFdBQVcsRUFDdEIsUUFBUSxvQkFBb0IsRUFDNUIsUUFBUSx1Q0FBdUMsRUFDL0MsVUFBVSxZQUFVLE9BQ25CLFNBQVMsS0FBSyxPQUFPLFNBQVMsU0FBUyxFQUN2QyxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxZQUFZO0FBQ2pDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNoQyxDQUFDLENBQUM7QUFFSCxRQUFJLHdCQUFRLFdBQVcsRUFDdEIsUUFBUSw4QkFBOEIsRUFDdEMsUUFBUSxvQ0FBb0MsRUFDNUMsVUFBVSxZQUFVLE9BQ25CLFNBQVMsS0FBSyxPQUFPLFNBQVMsZ0JBQWdCLEVBQzlDLFNBQVMsT0FBTyxVQUFVO0FBQzFCLFdBQUssT0FBTyxTQUFTLG1CQUFtQjtBQUN4QyxZQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDaEMsQ0FBQyxDQUFDO0FBRUgsUUFBSSx3QkFBUSxXQUFXLEVBQ3RCLFFBQVEsYUFBYSxFQUNyQixRQUFRLG9DQUErQixFQUN2QyxZQUFZLGNBQVk7QUFDeEIsZUFBUyxXQUFXO0FBQUEsUUFDbkIsVUFBVTtBQUFBLFFBQ1YsU0FBUztBQUFBLFFBQ1QsYUFBYTtBQUFBLE1BQ2QsQ0FBQztBQUNELGVBQVMsU0FBUyxLQUFLLE9BQU8sU0FBUyxXQUFXO0FBQ2xELGVBQVMsU0FBUyxPQUFPLFVBQVU7QUFDbEMsYUFBSyxPQUFPLFNBQVMsY0FBYztBQUNuQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksd0JBQVEsV0FBVyxFQUN0QixRQUFRLHdCQUF3QixFQUNoQyxRQUFRLHFEQUFxRCxFQUM3RCxVQUFVLFlBQVUsT0FDbkIsU0FBUyxLQUFLLE9BQU8sU0FBUyxTQUFTLEVBQ3ZDLFNBQVMsT0FBTyxVQUFVO0FBQzFCLFdBQUssT0FBTyxTQUFTLFlBQVk7QUFDakMsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUFBLEVBRUo7QUFDRDsiLAogICJuYW1lcyI6IFtdCn0K
|