From 9f152a8bb372dfa9baae724691780e5287ed8051 Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Tue, 20 Feb 2024 21:31:52 +0800 Subject: [PATCH] vault backup: 2024-02-20 21:31:52 --- .../community-plugins-AWIN-DESKMEET.json | 14 + .obsidian/plugins/hk-code-block/data.json | 22 + .obsidian/plugins/hk-code-block/main.js | 627 ++++++++++++++++++ .obsidian/plugins/hk-code-block/manifest.json | 11 + .obsidian/plugins/hk-code-block/styles.css | 241 +++++++ .obsidian/workspace-AWIN-DESKMEET.json | 236 +++++++ 6 files changed, 1151 insertions(+) create mode 100644 .obsidian/community-plugins-AWIN-DESKMEET.json create mode 100644 .obsidian/plugins/hk-code-block/data.json create mode 100644 .obsidian/plugins/hk-code-block/main.js create mode 100644 .obsidian/plugins/hk-code-block/manifest.json create mode 100644 .obsidian/plugins/hk-code-block/styles.css create mode 100644 .obsidian/workspace-AWIN-DESKMEET.json diff --git a/.obsidian/community-plugins-AWIN-DESKMEET.json b/.obsidian/community-plugins-AWIN-DESKMEET.json new file mode 100644 index 0000000..4cdd5c2 --- /dev/null +++ b/.obsidian/community-plugins-AWIN-DESKMEET.json @@ -0,0 +1,14 @@ +[ + "table-editor-obsidian", + "dataview", + "obsidian-rollover-daily-todos", + "todoist-sync-plugin", + "obsidian-columns", + "obsidian-tasks-plugin", + "oz-image-plugin", + "periodic-notes", + "obsidian-git", + "obsidian-quiet-outline", + "obsidian-tracker", + "hk-code-block" +] \ No newline at end of file diff --git a/.obsidian/plugins/hk-code-block/data.json b/.obsidian/plugins/hk-code-block/data.json new file mode 100644 index 0000000..c7775d3 --- /dev/null +++ b/.obsidian/plugins/hk-code-block/data.json @@ -0,0 +1,22 @@ +{ + "useTitleGlobal": "default off, but on when specified", + "useCollapsibleGlobal": "default on, but off when specified", + "defaultCollapse": "expand", + "showCollapseBtn": true, + "useLinenosGlobal": "default on, but off when specified", + "defaultLinenosStart": 1, + "showLinenosSplitter": true, + "useHighlightGlobal": "default off, but on when specified", + "highlightColor": "#ff0000", + "useLanguageGlobal": "default on, but off when specified", + "defaultLanguage": "plain text", + "useCopyBtnGlobal": "default on, but off when specified", + "usePromptGlobal": "default on, but off when specified", + "promptingLanguages": [ + "bash" + ], + "defaultPrompt": "$", + "useResultGlobal": true, + "defaultResultPrompt": "Result", + "debugMode": false +} \ No newline at end of file diff --git a/.obsidian/plugins/hk-code-block/main.js b/.obsidian/plugins/hk-code-block/main.js new file mode 100644 index 0000000..b4b139a --- /dev/null +++ b/.obsidian/plugins/hk-code-block/main.js @@ -0,0 +1,627 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => HKCodeBlockPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian3 = require("obsidian"); + +// src/settings.ts +var DEFAULT_SETTINGS = { + useTitleGlobal: "default off, but on when specified", + useCollapsibleGlobal: "default on, but off when specified", + defaultCollapse: "expand", + showCollapseBtn: true, + useLinenosGlobal: "default off, but on when specified", + defaultLinenosStart: 1, + showLinenosSplitter: true, + useHighlightGlobal: "default off, but on when specified", + highlightColor: "#ff0000", + useLanguageGlobal: "default on, but off when specified", + defaultLanguage: "plain text", + useCopyBtnGlobal: "default on, but off when specified", + usePromptGlobal: "default on, but off when specified", + promptingLanguages: ["bash"], + defaultPrompt: "$", + useResultGlobal: true, + defaultResultPrompt: "Result", + debugMode: false +}; + +// src/settingTab.ts +var import_obsidian = require("obsidian"); +var fragWithHTML = (text) => { + return createFragment((frag) => { + frag.createDiv().innerHTML = text.split("\n").map((line) => line.trim()).join("
"); + }); +}; +var HKCodeBlockSettingTab = class extends import_obsidian.PluginSettingTab { + constructor(app2, plugin) { + super(app2, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Title" }); + new import_obsidian.Setting(containerEl).setName("Use Title").setDesc(fragWithHTML(`- default off, but on when specified : the title will only be shown if the title statement is specified + - always off : the title will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useTitleGlobal).onChange(async (value) => { + this.plugin.settings.useTitleGlobal = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Collapse" }); + new import_obsidian.Setting(containerEl).setName("Use Collapse").setDesc(fragWithHTML(`- always on : the code block will always be collapsible + - default on, but off when specified : the code block will always be collapsible, but will not be collapsed if collapse statement is specified as false + - default off, but on when specified : the code block will only be collapsible if the collapse statement is specified as true + - always off : the code block will never be collapsible`)).addDropdown( + (tc) => tc.addOptions({ + "always on": "always on", + "default on, but off when specified": "default on, but off when specified", + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useCollapsibleGlobal).onChange(async (value) => { + this.plugin.settings.useCollapsibleGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Default Collapse State").setDesc("The default collapse state of the code block.").addDropdown( + (tc) => tc.addOptions({ + "collapse": "collapse", + "expand": "expand" + }).setValue(this.plugin.settings.defaultCollapse).onChange(async (value) => { + this.plugin.settings.defaultCollapse = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Line Numbers" }); + new import_obsidian.Setting(containerEl).setName("Use Line Numbers").setDesc(fragWithHTML(`- always on : line numbers will always be shown + - default on, but off when specified : line numbers will always be shown, but will not be shown if linenos statement is specified as false + - default off, but on when specified : line numbers will only be shown if the linenos statement is specified as true + - always off : line numbers will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "always on": "always on", + "default on, but off when specified": "default on, but off when specified", + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useLinenosGlobal).onChange(async (value) => { + this.plugin.settings.useLinenosGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Default Line Number Start").setDesc("The default line number start of the code block.").addText( + (tc) => tc.setValue(this.plugin.settings.defaultLinenosStart.toString()).onChange(async (value) => { + const num = parseInt(value); + if (isNaN(num)) + return; + this.plugin.settings.defaultLinenosStart = num; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Show Line Number Splitter").addToggle( + (tc) => tc.setValue(this.plugin.settings.showLinenosSplitter).onChange(async (value) => { + this.plugin.settings.showLinenosSplitter = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Line Highlight" }); + new import_obsidian.Setting(containerEl).setName("Use Line Highlight").setDesc(fragWithHTML(`- default off, but on when specified : line highlight will only be shown if the line highlight statement is specified + - always off : line highlight will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useHighlightGlobal).onChange(async (value) => { + this.plugin.settings.useHighlightGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Line Highlight Color").setDesc("The background color of the highlighted line. Note that the given color will be applied with 0.2 opacity.").addText( + (tc) => tc.setValue(this.plugin.settings.highlightColor).onChange(async (value) => { + this.plugin.settings.highlightColor = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Language Indicator" }); + new import_obsidian.Setting(containerEl).setName("Use Language Indicator").setDesc(fragWithHTML(`- always on : language indicator will always be shown + - default on, but off when specified : language indicator will always be shown, but will not be shown if the language indicator statement is specified as false + - default off, but on when specified : language indicator will only be shown if the language indicator statement is specified as true + - always off : language indicator will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "always on": "always on", + "default on, but off when specified": "default on, but off when specified", + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useLanguageGlobal).onChange(async (value) => { + this.plugin.settings.useLanguageGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Default Language").setDesc("The default language name of the code block if the language is not specified.").addText( + (tc) => tc.setValue(this.plugin.settings.defaultLanguage).onChange(async (value) => { + this.plugin.settings.defaultLanguage = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Copy Button" }); + new import_obsidian.Setting(containerEl).setName("Use Copy Button").setDesc(fragWithHTML(`- always on : copy button will always be shown + - default on, but off when specified : copy button will always be shown, but will not be shown if the copy button statement is specified as false + - default off, but on when specified : copy button will only be shown if the copy button statement is specified as true + - always off : copy button will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "always on": "always on", + "default on, but off when specified": "default on, but off when specified", + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.useCopyBtnGlobal).onChange(async (value) => { + this.plugin.settings.useCopyBtnGlobal = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Prompt" }); + new import_obsidian.Setting(containerEl).setName("Use Prompt").setDesc(fragWithHTML(`- always on : prompt will always be shown + - default on, but off when specified : prompt will always be shown, but will not be shown if the prompt statement is specified as false + - default off, but on when specified : prompt will only be shown if the prompt statement is specified as true + - always off : prompt will never be shown`)).addDropdown( + (tc) => tc.addOptions({ + "always on": "always on", + "default on, but off when specified": "default on, but off when specified", + "default off, but on when specified": "default off, but on when specified", + "always off": "always off" + }).setValue(this.plugin.settings.usePromptGlobal).onChange(async (value) => { + this.plugin.settings.usePromptGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Prompting Languages").setDesc("The languages that will be prompted by default. You can specify multiple languages by separating them with enters.").addTextArea( + (tc) => tc.setValue(this.plugin.settings.promptingLanguages.join("\n")).onChange(async (value) => { + const lines = value.split("\n").filter((line) => line.trim() !== ""); + this.plugin.settings.promptingLanguages = lines; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Default Prompt").setDesc("The default prompt of the bash code block.").addText( + (tc) => tc.setValue(this.plugin.settings.defaultPrompt).onChange(async (value) => { + this.plugin.settings.defaultPrompt = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Result" }); + new import_obsidian.Setting(containerEl).setName("Use Result").setDesc(fragWithHTML(`- enable : treat the code block starts like \`\`\`\`result\` as the result of the adjacent previous code block + - disable : treat the code block with \`result\` as its language name as a normal code block`)).addToggle( + (tc) => tc.setValue(this.plugin.settings.useResultGlobal).onChange(async (value) => { + this.plugin.settings.useResultGlobal = value; + await this.plugin.saveSettings(); + }) + ); + new import_obsidian.Setting(containerEl).setName("Default Result Prompt").setDesc("The default prompt of the result code block.").addText( + (tc) => tc.setValue(this.plugin.settings.defaultResultPrompt).onChange(async (value) => { + this.plugin.settings.defaultResultPrompt = value; + await this.plugin.saveSettings(); + }) + ); + containerEl.createEl("h2", { text: "Developers" }); + new import_obsidian.Setting(containerEl).setName("Debug Mode").setDesc("Show logs in the console.").addToggle( + (tc) => tc.setValue(this.plugin.settings.debugMode).onChange(async (value) => { + this.plugin.settings.debugMode = value; + await this.plugin.saveSettings(); + }) + ); + } +}; + +// src/processor.ts +var import_obsidian2 = require("obsidian"); +var REGEX = { + TITLE: /\stitle:(?:'(.*?)'|"(.*?)")\s/, + COLLAPSIBLE_SIMPLE: /\scollapsible\s/, + COLLAPSIBLE_COMPLICATE: /\scollapsible:(true|false)\s/, + LINENOS_SIMPLE: /\slinenos\s/, + LINENOS_COMPLICATE: /\slinenos:(true|false|(-{0,1}\d+))\s/, + HIGHLIGHT: /\shighlight:(?:'(.*?)'|"(.*?)")\s/, + LANGUAGE_FROM_CLASS: /^language-(\w+)$/, + LANGUAGE_SIMPLE: /\slanguage\s/, + LANGUAGE_COMPLICATE: /\slanguage:(true|false|'(.*?)'|"(.*?)")\s/, + COPYBTN_SIMPLE: /\scopybtn\s/, + COPYBTN_COMPLICATE: /\scopybtn:(true|false)\s/, + RESULT: /^```result\s/, + PROMPT_SIMPLE: /\sprompt\s/, + PROMPT_COMPLICATE: /\sprompt:(true|false|'(.*?)'|"(.*?)")\s/, + NUMBER: /^-{0,1}\d+$/ +}; +function getMeta(view, elem_code, elem_code_idx, section_code, settings) { + const return_value = { + isError: false, + lineStartInSection: -1, + lineEndInSection: -1, + showTitle: void 0, + title: "", + isCollapsible: void 0, + showLinenos: void 0, + linenosStart: settings.defaultLinenosStart, + linenosNum: 0, + showHighlight: void 0, + highlightLines: [], + showLanguage: void 0, + language: settings.defaultLanguage, + showCopyBtn: void 0, + isResult: false, + resultPrompt: settings.defaultResultPrompt, + showPrompt: void 0, + prompt: settings.defaultPrompt + }; + let marker_count = 0; + for (let i = section_code.lineStart; i <= section_code.lineEnd; i++) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) + marker_count++; + if (return_value.lineStartInSection === -1 && marker_count === elem_code_idx * 2 + 1) { + return_value.lineStartInSection = i; + } + if (return_value.lineEndInSection === -1 && marker_count === elem_code_idx * 2 + 2) { + return_value.lineEndInSection = i; + break; + } + } + if (return_value.lineStartInSection < 0 || return_value.lineEndInSection < 0 || return_value.lineStartInSection >= return_value.lineEndInSection) { + return_value.isError = true; + return return_value; + } + const firstline = view.editor.getLine(return_value.lineStartInSection).trim() + " "; + const regexResult_title = REGEX.TITLE.exec(firstline); + if (regexResult_title) { + return_value.showTitle = true; + return_value.title = regexResult_title[1] || regexResult_title[2]; + } + const regexResult_collapsibleSimple = REGEX.COLLAPSIBLE_SIMPLE.exec(firstline); + const regexResult_collapsibleComplicate = REGEX.COLLAPSIBLE_COMPLICATE.exec(firstline); + if (regexResult_collapsibleSimple) { + return_value.isCollapsible = true; + } else if (regexResult_collapsibleComplicate) { + if (regexResult_collapsibleComplicate[1] === "true") { + return_value.isCollapsible = true; + } else if (regexResult_collapsibleComplicate[1] === "false") { + return_value.isCollapsible = false; + } + } + return_value.linenosNum = return_value.lineEndInSection - return_value.lineStartInSection - 1; + const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline); + const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline); + if (regexResult_linenosSimple) { + return_value.showLinenos = true; + } else if (regexResult_linenosComplicate) { + if (regexResult_linenosComplicate[1] === "true") { + return_value.showLinenos = true; + } else if (regexResult_linenosComplicate[1] === "false") { + return_value.showLinenos = false; + } else { + return_value.showLinenos = true; + return_value.linenosStart = parseInt(regexResult_linenosComplicate[2]) || 1; + } + } + const regexResult_highlight = REGEX.HIGHLIGHT.exec(firstline); + if (regexResult_highlight) { + return_value.showHighlight = true; + const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2]; + let highlightLines = highlightLines_str.split(",").map((item) => { + item = item.trim(); + if (REGEX.NUMBER.test(item)) + return parseInt(item); + const multiple_lines = item.split("-"); + if (multiple_lines.length === 2) { + const start = parseInt(multiple_lines[0].trim()); + const end = parseInt(multiple_lines[1].trim()); + if (!isNaN(start) && !isNaN(end)) { + return Array.from({ length: end - start + 1 }, (_, i) => i + start); + } + } + return NaN; + }).flat().filter((item) => !isNaN(item)); + if (highlightLines.some((line) => isNaN(line))) { + return_value.showHighlight = void 0; + return_value.highlightLines = []; + } else { + return_value.highlightLines = highlightLines.filter( + (line) => line >= return_value.linenosStart && line < return_value.linenosStart + return_value.linenosNum + ); + } + } + elem_code.classList.forEach((className) => { + const regexResult_languageFromClass = REGEX.LANGUAGE_FROM_CLASS.exec(className.trim()); + if (regexResult_languageFromClass) { + return_value.language = regexResult_languageFromClass[1]; + } + }); + const regexResult_languageSimple = REGEX.LANGUAGE_SIMPLE.exec(firstline); + const regexResult_languageComplicate = REGEX.LANGUAGE_COMPLICATE.exec(firstline); + if (regexResult_languageSimple) { + return_value.showLanguage = true; + } else if (regexResult_languageComplicate) { + if (regexResult_languageComplicate[1] === "true") { + return_value.showLanguage = true; + } else if (regexResult_languageComplicate[1] === "false") { + return_value.showLanguage = false; + } else { + return_value.showLanguage = true; + return_value.language = regexResult_languageComplicate[2] || regexResult_languageComplicate[3]; + } + } + const regexResult_copyBtnSimple = REGEX.COPYBTN_SIMPLE.exec(firstline); + const regexResult_copyBtnComplicate = REGEX.COPYBTN_COMPLICATE.exec(firstline); + if (regexResult_copyBtnSimple) { + return_value.showCopyBtn = true; + } else if (regexResult_copyBtnComplicate) { + if (regexResult_copyBtnComplicate[1] === "true") { + return_value.showCopyBtn = true; + } else if (regexResult_copyBtnComplicate[1] === "false") { + return_value.showCopyBtn = false; + } + } + const regexResult_promptSimple = REGEX.PROMPT_SIMPLE.exec(firstline); + const regexResult_promptComplicate = REGEX.PROMPT_COMPLICATE.exec(firstline); + if (regexResult_promptSimple) { + return_value.showPrompt = true; + } else if (regexResult_promptComplicate) { + if (regexResult_promptComplicate[1] === "true") { + return_value.showPrompt = true; + } else if (regexResult_promptComplicate[1] === "false") { + return_value.showPrompt = false; + } else { + return_value.showPrompt = true; + return_value.prompt = regexResult_promptComplicate[2] || regexResult_promptComplicate[3]; + } + } + const regexResult_result = REGEX.RESULT.exec(firstline); + const regexResultPrompt_result = REGEX.PROMPT_COMPLICATE.exec(firstline); + if (regexResult_result) { + return_value.isResult = true; + return_value.showTitle = false; + return_value.showLanguage = false; + return_value.showCopyBtn = false; + return_value.showPrompt = false; + if (regexResultPrompt_result) { + return_value.resultPrompt = regexResultPrompt_result[2] || regexResultPrompt_result[3]; + } + } + return return_value; +} +function HKCodeBlockProcessor(el, context, plugin) { + const settings = plugin.settings; + const view = app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); + if (!view) + return; + const elem_codes = el.querySelectorAll("pre:not(.frontmatter) > code"); + if (elem_codes.length === 0) + return; + elem_codes.forEach((elem_code, elem_code_idx) => { + const elem_pre = elem_code.parentElement; + if (!elem_pre) + return; + const elem_pre_parent = elem_pre.parentElement; + if (!elem_pre_parent) + return; + const elem_copyBtn = elem_pre.querySelector(".copy-code-button"); + if (!elem_copyBtn) + return; + const section_code = context.getSectionInfo(elem_code); + if (!section_code) + return; + const { + isError, + lineStartInSection, + lineEndInSection, + showTitle, + title, + isCollapsible, + showLinenos, + linenosStart, + linenosNum, + showHighlight, + highlightLines, + showLanguage, + language, + showCopyBtn, + isResult, + resultPrompt, + showPrompt, + prompt + } = getMeta(view, elem_code, elem_code_idx, section_code, settings); + if (isError) + return; + if (settings.debugMode) { + console.log({ + isError, + lineStartInSection, + lineEndInSection, + showTitle, + title, + isCollapsible, + showLinenos, + linenosStart, + linenosNum, + showHighlight, + highlightLines, + showLanguage, + language, + showCopyBtn, + isResult, + resultPrompt, + showPrompt, + prompt + }); + } + const elem_div = document.createElement("div"); + elem_pre_parent.replaceChild(elem_div, elem_pre); + elem_div.appendChild(elem_pre); + elem_div.classList.add("hk-codeblock"); + elem_code.classList.add("hk-codeblock-code"); + elem_copyBtn.remove(); + let elem_title = void 0; + if (settings.useTitleGlobal === "default off, but on when specified" && showTitle === true) { + elem_div.classList.add("hk-codeblock-show-title"); + elem_title = document.createElement("div"); + elem_title.classList.add("hk-codeblock-title"); + elem_title.innerHTML = title; + elem_div.insertBefore(elem_title, elem_pre); + } + if (settings.useCollapsibleGlobal === "always on" || settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === void 0 || isCollapsible === true) || settings.useCollapsibleGlobal === "default off, but on when specified" && isCollapsible === true) { + if (elem_title) { + elem_div.classList.add("hk-codeblock-collapsible"); + if (settings.defaultCollapse === "collapse") { + elem_div.classList.add("hk-codeblock-collapsed"); + } + elem_title.addEventListener("click", (ev) => { + ev.stopPropagation(); + ev.preventDefault(); + elem_div.classList.toggle("hk-codeblock-collapsed"); + }); + const elem_collapseBtns = document.createElement("div"); + elem_collapseBtns.classList.add("hk-codeblock-collapse-btns"); + const elem_collapseBtn = document.createElement("div"); + elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn"); + elem_collapseBtn.innerHTML = ` + + `; + elem_collapseBtns.appendChild(elem_collapseBtn); + const elem_expandBtn = document.createElement("div"); + elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn"); + elem_expandBtn.innerHTML = ` + + `; + elem_collapseBtns.appendChild(elem_expandBtn); + elem_title.prepend(elem_collapseBtns); + } + } + if (settings.useLinenosGlobal === "always on" || settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === void 0 || showLinenos === true) || settings.useLinenosGlobal === "default off, but on when specified" && showLinenos === true) { + elem_div.classList.add("hk-codeblock-show-linenos"); + const elem_linenos = document.createElement("div"); + elem_linenos.classList.add("hk-codeblock-linenos"); + elem_linenos.innerText = Array(linenosNum).fill(0).map((_, idx) => idx + linenosStart).join("\n"); + elem_pre.insertBefore(elem_linenos, elem_code); + if (settings.showLinenosSplitter) { + elem_linenos.classList.add("show-splitter"); + } + } + if (settings.useHighlightGlobal === "default off, but on when specified" && showHighlight === true) { + elem_div.classList.add("hk-codeblock-show-highlight"); + elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); + const elem_highlight = document.createElement("div"); + elem_highlight.classList.add("hk-codeblock-highlight"); + elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { + const classNames = []; + if (highlightLines.includes(idx + linenosStart)) + classNames.push("highlight"); + return ` `; + }).join("\n"); + elem_pre.insertBefore(elem_highlight, elem_code); + } + if (settings.useLanguageGlobal === "always on" || settings.useLanguageGlobal === "default on, but off when specified" && (showLanguage === void 0 || showLanguage === true) || settings.useLanguageGlobal === "default off, but on when specified" && showLanguage === true) { + elem_div.classList.add("hk-codeblock-show-language"); + const elem_language = document.createElement("div"); + elem_language.classList.add("hk-codeblock-language"); + elem_language.innerText = language; + elem_pre.prepend(elem_language); + } + if (settings.useCopyBtnGlobal === "always on" || settings.useCopyBtnGlobal === "default on, but off when specified" && (showCopyBtn === void 0 || showCopyBtn === true) || settings.useCopyBtnGlobal === "default off, but on when specified" && showCopyBtn === true) { + elem_div.classList.add("hk-codeblock-show-copybtn"); + elem_pre.appendChild(elem_copyBtn); + } + if (settings.usePromptGlobal === "always on" && settings.promptingLanguages.includes(language) || settings.usePromptGlobal === "default on, but off when specified" && settings.promptingLanguages.includes(language) && (showPrompt === void 0 || showPrompt === true) || settings.usePromptGlobal === "default off, but on when specified" && showPrompt === true) { + elem_div.classList.add("hk-codeblock-show-prompt"); + const elem_prompt = document.createElement("div"); + elem_prompt.classList.add("hk-codeblock-prompt"); + const lines = elem_code.innerText.split("\n"); + elem_prompt.innerText = Array(linenosNum).fill(0).map((_, idx) => { + if (idx < 0 || idx >= lines.length) + return null; + const line = lines[idx].trim(); + const prevLine = idx > 0 ? lines[idx - 1].trim() : ""; + if (line === "" || // check if the line is empty + line.startsWith("#") || // check if the line is a comment + prevLine.endsWith("\\")) { + return " ".repeat(prompt.length); + } + return prompt; + }).filter((line) => line !== null).join("\n"); + elem_pre.insertBefore(elem_prompt, elem_code); + } + if (settings.useResultGlobal === true && isResult === true) { + const isCodeBlockAdjacent = (() => { + let line_idx = lineStartInSection - 1; + while (line_idx >= 0) { + const line = view.editor.getLine(line_idx).trim(); + if (line.length === 0) { + line_idx--; + continue; + } else if (line === "```") { + return true; + } else { + return false; + } + } + return false; + })(); + if (isCodeBlockAdjacent) { + elem_div.classList.add("hk-codeblock-result"); + elem_code.classList.add("hk-codeblock-result-code"); + const elem_result_prompt = document.createElement("div"); + elem_result_prompt.classList.add("hk-codeblock-result-prompt"); + elem_result_prompt.innerText = resultPrompt; + elem_div.insertBefore(elem_result_prompt, elem_pre); + } + } + }); +} + +// src/main.ts +var HKCodeBlockPlugin = class extends import_obsidian3.Plugin { + async onload() { + await this.loadSettings(); + if (this.settings.debugMode) { + console.log("loading HK Code Block plugin"); + } + this.addSettingTab(new HKCodeBlockSettingTab(this.app, this)); + const processor = this.registerMarkdownPostProcessor((el, ctx) => { + HKCodeBlockProcessor(el, ctx, this); + }); + processor.sortOrder = 100; + } + onunload() { + if (this.settings.debugMode) { + console.log("unloading HKCodeBlock plugin"); + } + } + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + async saveSettings() { + await this.saveData(this.settings); + } +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3NldHRpbmdzLnRzIiwgIi4uL3NyYy9zZXR0aW5nVGFiLnRzIiwgIi4uL3NyYy9wcm9jZXNzb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIGFzIEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL3NldHRpbmdzJztcbmltcG9ydCB7IEhLQ29kZUJsb2NrU2V0dGluZ1RhYiB9IGZyb20gJy4vc2V0dGluZ1RhYic7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1Byb2Nlc3NvciB9IGZyb20gJy4vcHJvY2Vzc29yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSEtDb2RlQmxvY2tQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncztcblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Z01vZGUpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBISyBDb2RlIEJsb2NrIHBsdWdpblwiKTtcblx0XHR9XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogYm9vbGVhbjtcblx0cHJvbXB0aW5nTGFuZ3VhZ2VzOiBzdHJpbmdbXTtcblx0ZGVmYXVsdFJlc3VsdFByb21wdDogc3RyaW5nO1xuXG5cdGRlYnVnTW9kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IEhLQ29kZUJsb2NrU2V0dGluZ3MgPSB7XG5cdHVzZVRpdGxlR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGRlZmF1bHRDb2xsYXBzZTogXCJleHBhbmRcIixcblx0c2hvd0NvbGxhcHNlQnRuOiB0cnVlLFxuXG5cdHVzZUxpbmVub3NHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGluZW5vc1N0YXJ0OiAxLFxuXHRzaG93TGluZW5vc1NwbGl0dGVyOiB0cnVlLFxuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGhpZ2hsaWdodENvbG9yOiBcIiNmZjAwMDBcIixcblxuXHR1c2VMYW5ndWFnZUdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGRlZmF1bHRMYW5ndWFnZTogXCJwbGFpbiB0ZXh0XCIsXG5cblx0dXNlQ29weUJ0bkdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlUHJvbXB0R2xvYmFsOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0cHJvbXB0aW5nTGFuZ3VhZ2VzOiBbXCJiYXNoXCJdLFxuXHRkZWZhdWx0UHJvbXB0OiBcIiRcIixcblxuXHR1c2VSZXN1bHRHbG9iYWw6IHRydWUsXG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IFwiUmVzdWx0XCIsXG5cblx0ZGVidWdNb2RlOiBmYWxzZSxcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcblx0cmV0dXJuIGNyZWF0ZUZyYWdtZW50KChmcmFnKSA9PiB7XG5cdFx0ZnJhZy5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmpvaW4oXCI8YnI+XCIpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEhLQ29kZUJsb2NrU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHQvLyB0aXRsZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1RpdGxlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBUaXRsZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgdGl0bGUgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSB0aXRsZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiB0aGUgdGl0bGUgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gY29sbGFwc2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb2xsYXBzZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29sbGFwc2UnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBhbHdheXMgYmUgY29sbGFwc2libGUsIGJ1dCB3aWxsIG5vdCBiZSBjb2xsYXBzZWQgaWYgY29sbGFwc2Ugc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBvbmx5IGJlIGNvbGxhcHNpYmxlIGlmIHRoZSBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgbmV2ZXIgYmUgY29sbGFwc2libGVgKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIikpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGxpbmUgbnVtYmVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xpbmUgTnVtYmVycycgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBOdW1iZXJzJylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxpbmVub3Mgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGluZSBOdW1iZXIgU3RhcnQnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxpbmUgbnVtYmVyIHN0YXJ0IG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0LnRvU3RyaW5nKCkpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBudW0gPSBwYXJzZUludCh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNOYU4obnVtKSkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0ID0gbnVtO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdTaG93IExpbmUgTnVtYmVyIFNwbGl0dGVyJylcblx0XHRcdC5hZGRUb2dnbGUodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd0xpbmVub3NTcGxpdHRlcilcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGxpbmUgaGlnaGxpZ2h0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnTGluZSBIaWdobGlnaHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgSGlnaGxpZ2h0Jylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxpbmUgaGlnaGxpZ2h0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgbGluZSBoaWdobGlnaHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUhpZ2hsaWdodEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiAoXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIikpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUhpZ2hsaWdodEdsb2JhbCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMYW5ndWFnZScpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbmFtZSBvZiB0aGUgY29kZSBibG9jayBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHNwZWNpZmllZC4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcblx0XHQvLyBjb3B5IGJ1dHRvblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvcHkgQnV0dG9uJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb3B5IEJ1dHRvbicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGNvcHkgYnV0dG9uIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogY29weSBidXR0b24gd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIHByb21wdFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1Byb21wdCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgUHJvbXB0Jylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogcHJvbXB0IHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIHByb21wdCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IHByb21wdCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJhbHdheXMgb25cIjogXCJhbHdheXMgb25cIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VSZXN1bHRHbG9iYWwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkRlZmF1bHQgUmVzdWx0IFByb21wdFwiKVxuXHRcdFx0LnNldERlc2MoXCJUaGUgZGVmYXVsdCBwcm9tcHQgb2YgdGhlIHJlc3VsdCBjb2RlIGJsb2NrLlwiKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gZm9yIGRldmVsb3BlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdEZXZlbG9wZXJzJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlYnVnIE1vZGUnKVxuXHRcdFx0LnNldERlc2MoJ1Nob3cgbG9ncyBpbiB0aGUgY29uc29sZS4nKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0fVxufSIsICJpbXBvcnQgeyBNYXJrZG93blZpZXcgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gXCIuL21haW5cIjtcbmltcG9ydCB0eXBlIHsgSEtDb2RlQmxvY2tTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmNvbnN0IFJFR0VYID0ge1xuICBUSVRMRTogL1xcc3RpdGxlOig/OicoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIENPTExBUFNJQkxFX1NJTVBMRTogL1xcc2NvbGxhcHNpYmxlXFxzLyxcbiAgQ09MTEFQU0lCTEVfQ09NUExJQ0FURTogL1xcc2NvbGxhcHNpYmxlOih0cnVlfGZhbHNlKVxccy8sXG4gIExJTkVOT1NfU0lNUExFOiAvXFxzbGluZW5vc1xccy8sXG4gIExJTkVOT1NfQ09NUExJQ0FURTogL1xcc2xpbmVub3M6KHRydWV8ZmFsc2V8KC17MCwxfVxcZCspKVxccy8sXG4gIEhJR0hMSUdIVDogL1xcc2hpZ2hsaWdodDooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBMQU5HVUFHRV9GUk9NX0NMQVNTOiAvXmxhbmd1YWdlLShcXHcrKSQvLFxuICBMQU5HVUFHRV9TSU1QTEU6IC9cXHNsYW5ndWFnZVxccy8sXG4gIExBTkdVQUdFX0NPTVBMSUNBVEU6IC9cXHNsYW5ndWFnZToodHJ1ZXxmYWxzZXwnKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT1BZQlROX1NJTVBMRTogL1xcc2NvcHlidG5cXHMvLFxuICBDT1BZQlROX0NPTVBMSUNBVEU6IC9cXHNjb3B5YnRuOih0cnVlfGZhbHNlKVxccy8sXG4gIFJFU1VMVDogL15gYGByZXN1bHRcXHMvLFxuICBQUk9NUFRfU0lNUExFOiAvXFxzcHJvbXB0XFxzLyxcbiAgUFJPTVBUX0NPTVBMSUNBVEU6IC9cXHNwcm9tcHQ6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTlVNQkVSOiAvXi17MCwxfVxcZCskLyxcbn1cblxuZnVuY3Rpb24gZ2V0TWV0YShcbiAgdmlldzogTWFya2Rvd25WaWV3LFxuICBlbGVtX2NvZGU6IEhUTUxFbGVtZW50LFxuICBlbGVtX2NvZGVfaWR4OiBudW1iZXIsXG4gIHNlY3Rpb25fY29kZTogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24sXG4gIHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzXG4pOiB7XG4gIGlzRXJyb3I6IGJvb2xlYW4sXG4gIGxpbmVTdGFydEluU2VjdGlvbjogbnVtYmVyLFxuICBsaW5lRW5kSW5TZWN0aW9uOiBudW1iZXIsXG4gIHNob3dUaXRsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICB0aXRsZTogc3RyaW5nLFxuICBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIGxpbmVub3NTdGFydDogbnVtYmVyLFxuICBsaW5lbm9zTnVtOiBudW1iZXIsXG4gIHNob3dIaWdobGlnaHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgaGlnaGxpZ2h0TGluZXM6IG51bWJlcltdLFxuICBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgaXNSZXN1bHQ6IGJvb2xlYW4sXG4gIHJlc3VsdFByb21wdDogc3RyaW5nLFxuICBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHByb21wdDogc3RyaW5nXG59IHtcbiAgY29uc3QgcmV0dXJuX3ZhbHVlOiB7XG4gICAgaXNFcnJvcjogYm9vbGVhbixcbiAgICBsaW5lU3RhcnRJblNlY3Rpb246IG51bWJlcixcbiAgICBsaW5lRW5kSW5TZWN0aW9uOiBudW1iZXIsXG4gICAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsaW5lbm9zU3RhcnQ6IG51bWJlcixcbiAgICBsaW5lbm9zTnVtOiBudW1iZXIsXG4gICAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSxcbiAgICBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgIHNob3dDb3B5QnRuOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgaXNSZXN1bHQ6IGJvb2xlYW4sXG4gICAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gICAgc2hvd1Byb21wdDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIHByb21wdDogc3RyaW5nXG4gIH0gPSB7XG4gICAgaXNFcnJvcjogZmFsc2UsXG4gICAgbGluZVN0YXJ0SW5TZWN0aW9uOiAtMSxcbiAgICBsaW5lRW5kSW5TZWN0aW9uOiAtMSxcbiAgICBzaG93VGl0bGU6IHVuZGVmaW5lZCxcbiAgICB0aXRsZTogXCJcIixcbiAgICBpc0NvbGxhcHNpYmxlOiB1bmRlZmluZWQsXG4gICAgc2hvd0xpbmVub3M6IHVuZGVmaW5lZCxcbiAgICBsaW5lbm9zU3RhcnQ6IHNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQsXG4gICAgbGluZW5vc051bTogMCxcbiAgICBzaG93SGlnaGxpZ2h0OiB1bmRlZmluZWQsXG4gICAgaGlnaGxpZ2h0TGluZXM6IFtdLFxuICAgIHNob3dMYW5ndWFnZTogdW5kZWZpbmVkLFxuICAgIGxhbmd1YWdlOiBzZXR0aW5ncy5kZWZhdWx0TGFuZ3VhZ2UsXG4gICAgc2hvd0NvcHlCdG46IHVuZGVmaW5lZCxcbiAgICBpc1Jlc3VsdDogZmFsc2UsXG4gICAgcmVzdWx0UHJvbXB0OiBzZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0LFxuICAgIHNob3dQcm9tcHQ6IHVuZGVmaW5lZCxcbiAgICBwcm9tcHQ6IHNldHRpbmdzLmRlZmF1bHRQcm9tcHRcbiAgfVxuXG4gIGxldCBtYXJrZXJfY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gc2VjdGlvbl9jb2RlLmxpbmVTdGFydDsgaSA8PSBzZWN0aW9uX2NvZGUubGluZUVuZDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUoaSk7XG4gICAgaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoXCJgYGBcIikpIG1hcmtlcl9jb3VudCsrO1xuXG4gICAgaWYgKHJldHVybl92YWx1ZS5saW5lU3RhcnRJblNlY3Rpb24gPT09IC0xICYmIG1hcmtlcl9jb3VudCA9PT0gZWxlbV9jb2RlX2lkeCAqIDIgKyAxKSB7XG4gICAgICByZXR1cm5fdmFsdWUubGluZVN0YXJ0SW5TZWN0aW9uID0gaTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuX3ZhbHVlLmxpbmVFbmRJblNlY3Rpb24gPT09IC0xICYmIG1hcmtlcl9jb3VudCA9PT0gZWxlbV9jb2RlX2lkeCAqIDIgKyAyKSB7XG4gICAgICByZXR1cm5fdmFsdWUubGluZUVuZEluU2VjdGlvbiA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAocmV0dXJuX3ZhbHVlLmxpbmVTdGFydEluU2VjdGlvbiA8IDAgfHwgcmV0dXJuX3ZhbHVlLmxpbmVFbmRJblNlY3Rpb24gPCAwIHx8IHJldHVybl92YWx1ZS5saW5lU3RhcnRJblNlY3Rpb24gPj0gcmV0dXJuX3ZhbHVlLmxpbmVFbmRJblNlY3Rpb24pIHtcbiAgICByZXR1cm5fdmFsdWUuaXNFcnJvciA9IHRydWU7XG4gICAgcmV0dXJuIHJldHVybl92YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0bGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUocmV0dXJuX3ZhbHVlLmxpbmVTdGFydEluU2VjdGlvbikudHJpbSgpICsgXCIgXCI7IC8vIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgdG8gbWFrZSBzdXJlIHRoZSByZWdleCB3b3Jrc1xuXG4gIC8vIHRpdGxlXG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3RpdGxlID0gUkVHRVguVElUTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfdGl0bGUpIHtcbiAgICByZXR1cm5fdmFsdWUuc2hvd1RpdGxlID0gdHJ1ZTtcbiAgICByZXR1cm5fdmFsdWUudGl0bGUgPSByZWdleFJlc3VsdF90aXRsZVsxXSB8fCByZWdleFJlc3VsdF90aXRsZVsyXTtcbiAgfVxuXG4gIC8vIGNvbGxhcHNpYmxlXG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlU2ltcGxlID0gUkVHRVguQ09MTEFQU0lCTEVfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlID0gUkVHRVguQ09MTEFQU0lCTEVfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSkge1xuICAgIHJldHVybl92YWx1ZS5pc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLmlzQ29sbGFwc2libGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5pc0NvbGxhcHNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbGluZW5vc1xuICByZXR1cm5fdmFsdWUubGluZW5vc051bSA9IHJldHVybl92YWx1ZS5saW5lRW5kSW5TZWN0aW9uIC0gcmV0dXJuX3ZhbHVlLmxpbmVTdGFydEluU2VjdGlvbiAtIDE7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUgPSBSRUdFWC5MSU5FTk9TX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlID0gUkVHRVguTElORU5PU19DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUpIHtcbiAgICByZXR1cm5fdmFsdWUuc2hvd0xpbmVub3MgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93TGluZW5vcyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5fdmFsdWUuc2hvd0xpbmVub3MgPSB0cnVlO1xuICAgICAgcmV0dXJuX3ZhbHVlLmxpbmVub3NTdGFydCA9IHBhcnNlSW50KHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzJdKSB8fCAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhpZ2hsaWdodFxuICBjb25zdCByZWdleFJlc3VsdF9oaWdobGlnaHQgPSBSRUdFWC5ISUdITElHSFQuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfaGlnaGxpZ2h0KSB7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dIaWdobGlnaHQgPSB0cnVlO1xuICAgIGNvbnN0IGhpZ2hsaWdodExpbmVzX3N0ciA9IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodFsxXSB8fCByZWdleFJlc3VsdF9oaWdobGlnaHRbMl07XG4gICAgbGV0IGhpZ2hsaWdodExpbmVzID0gaGlnaGxpZ2h0TGluZXNfc3RyLnNwbGl0KFwiLFwiKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW0gPSBpdGVtLnRyaW0oKTtcblxuICAgICAgaWYgKFJFR0VYLk5VTUJFUi50ZXN0KGl0ZW0pKSByZXR1cm4gcGFyc2VJbnQoaXRlbSk7XG5cbiAgICAgIGNvbnN0IG11bHRpcGxlX2xpbmVzID0gaXRlbS5zcGxpdChcIi1cIik7XG4gICAgICBpZiAobXVsdGlwbGVfbGluZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VJbnQobXVsdGlwbGVfbGluZXNbMF0udHJpbSgpKTtcbiAgICAgICAgY29uc3QgZW5kID0gcGFyc2VJbnQobXVsdGlwbGVfbGluZXNbMV0udHJpbSgpKTtcblxuICAgICAgICBpZiAoIWlzTmFOKHN0YXJ0KSAmJiAhaXNOYU4oZW5kKSkge1xuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBlbmQgLSBzdGFydCArIDEgfSwgKF8sIGkpID0+IGkgKyBzdGFydCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9KS5mbGF0KCkuZmlsdGVyKChpdGVtKSA9PiAhaXNOYU4oaXRlbSkpO1xuXG4gICAgaWYgKGhpZ2hsaWdodExpbmVzLnNvbWUoKGxpbmUpID0+IGlzTmFOKGxpbmUpKSkge1xuICAgICAgLy8gaWYgYW55IGVsZW1lbnQgaXMgbmFuLCB0aGVuIHNldCBzaG93SGlnaGxpZ2h0IHRvIGZhbHNlXG4gICAgICByZXR1cm5fdmFsdWUuc2hvd0hpZ2hsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybl92YWx1ZS5oaWdobGlnaHRMaW5lcyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1c2Ugb25seSB2YWxpZCBsaW5lIG51bWJlcnNcbiAgICAgIHJldHVybl92YWx1ZS5oaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzLmZpbHRlcihcbiAgICAgICAgKGxpbmUpID0+IGxpbmUgPj0gcmV0dXJuX3ZhbHVlLmxpbmVub3NTdGFydCAmJiBsaW5lIDwgcmV0dXJuX3ZhbHVlLmxpbmVub3NTdGFydCArIHJldHVybl92YWx1ZS5saW5lbm9zTnVtXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxhbmd1YWdlXG4gIGVsZW1fY29kZS5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VGcm9tQ2xhc3MgPSBSRUdFWC5MQU5HVUFHRV9GUk9NX0NMQVNTLmV4ZWMoY2xhc3NOYW1lLnRyaW0oKSk7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzKSB7XG4gICAgICByZXR1cm5fdmFsdWUubGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzc1sxXTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZVNpbXBsZSA9IFJFR0VYLkxBTkdVQUdFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZSA9IFJFR0VYLkxBTkdVQUdFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUpIHtcbiAgICByZXR1cm5fdmFsdWUuc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dMYW5ndWFnZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5fdmFsdWUuc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICAgIHJldHVybl92YWx1ZS5sYW5ndWFnZSA9IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsyXSB8fCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbM107XG4gICAgfVxuICB9XG5cbiAgLy8gY29weSBidXR0b25cbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSA9IFJFR0VYLkNPUFlCVE5fU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUgPSBSRUdFWC5DT1BZQlROX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSkge1xuICAgIHJldHVybl92YWx1ZS5zaG93Q29weUJ0biA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICByZXR1cm5fdmFsdWUuc2hvd0NvcHlCdG4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJvbXB0XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSA9IFJFR0VYLlBST01QVF9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0U2ltcGxlKSB7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dQcm9tcHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHJldHVybl92YWx1ZS5zaG93UHJvbXB0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dQcm9tcHQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuX3ZhbHVlLnNob3dQcm9tcHQgPSB0cnVlO1xuICAgICAgcmV0dXJuX3ZhbHVlLnByb21wdCA9IHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbMl0gfHwgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVszXTtcbiAgICB9XG4gIH1cblxuICAvLyByZXN1bHRcbiAgY29uc3QgcmVnZXhSZXN1bHRfcmVzdWx0ID0gUkVHRVguUkVTVUxULmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0ID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcmVzdWx0KSB7XG4gICAgcmV0dXJuX3ZhbHVlLmlzUmVzdWx0ID0gdHJ1ZTtcblxuICAgIC8vIG92ZXJyaWRlIG90aGVyIG1ldGEgZGF0YSA6IG9ubHkgbGluZW5vcywgaGlnaGxpZ2h0IGFyZSBhdmFpbGFibGVcbiAgICByZXR1cm5fdmFsdWUuc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgcmV0dXJuX3ZhbHVlLnNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIHJldHVybl92YWx1ZS5zaG93Q29weUJ0biA9IGZhbHNlO1xuICAgIHJldHVybl92YWx1ZS5zaG93UHJvbXB0ID0gZmFsc2U7XG5cbiAgICBpZiAocmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0KSB7XG4gICAgICByZXR1cm5fdmFsdWUucmVzdWx0UHJvbXB0ID0gcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0WzJdIHx8IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFszXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuX3ZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSEtDb2RlQmxvY2tQcm9jZXNzb3IoXG4gIGVsOiBIVE1MRWxlbWVudCxcbiAgY29udGV4dDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCxcbiAgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpblxuKSB7XG4gIGNvbnN0IHNldHRpbmdzID0gcGx1Z2luLnNldHRpbmdzO1xuXG4gIGNvbnN0IHZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgaWYgKCF2aWV3KSByZXR1cm47XG5cbiAgLyogTm90ZTpcbiAgLy8gLSBnZXQgYWxsIGNvZGUgYmxvY2tzIDogb2JzaWRpYW4gbWFya2Rvd24gcGFyc2VyIHNvbWV0aW1lcyBwYXNzIG11bHRpcGxlIGNvZGUgYmxvY2tzXG4gIC8vIC0gc2tpcCBmcm9udCBtYXR0ZXJcbiAgKi9cbiAgY29uc3QgZWxlbV9jb2RlczogTm9kZUxpc3RPZjxFbGVtZW50PiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJwcmU6bm90KC5mcm9udG1hdHRlcikgPiBjb2RlXCIpO1xuICBpZiAoZWxlbV9jb2Rlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBlbGVtX2NvZGVzLmZvckVhY2goKGVsZW1fY29kZTogSFRNTEVsZW1lbnQsIGVsZW1fY29kZV9pZHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGVsZW1fcHJlOiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fY29kZS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlbV9wcmUpIHJldHVybjtcblxuICAgIGNvbnN0IGVsZW1fcHJlX3BhcmVudDogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX3ByZS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWxlbV9wcmVfcGFyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBlbGVtX2NvcHlCdG46IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9wcmUucXVlcnlTZWxlY3RvcihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xuICAgIGlmICghZWxlbV9jb3B5QnRuKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWN0aW9uX2NvZGU6IChNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB8IG51bGwpID0gY29udGV4dC5nZXRTZWN0aW9uSW5mbyhlbGVtX2NvZGUpO1xuICAgIGlmICghc2VjdGlvbl9jb2RlKSByZXR1cm47XG5cbiAgICAvLyBnZXQgbWV0YWRhdGFcbiAgICBjb25zdCB7XG4gICAgICBpc0Vycm9yLFxuICAgICAgbGluZVN0YXJ0SW5TZWN0aW9uLFxuICAgICAgbGluZUVuZEluU2VjdGlvbixcbiAgICAgIHNob3dUaXRsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgaXNDb2xsYXBzaWJsZSxcbiAgICAgIHNob3dMaW5lbm9zLFxuICAgICAgbGluZW5vc1N0YXJ0LFxuICAgICAgbGluZW5vc051bSxcbiAgICAgIHNob3dIaWdobGlnaHQsXG4gICAgICBoaWdobGlnaHRMaW5lcyxcbiAgICAgIHNob3dMYW5ndWFnZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdCxcbiAgICAgIHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQsXG4gICAgfToge1xuICAgICAgaXNFcnJvcjogYm9vbGVhbixcbiAgICAgIGxpbmVTdGFydEluU2VjdGlvbjogbnVtYmVyLFxuICAgICAgbGluZUVuZEluU2VjdGlvbjogbnVtYmVyLFxuICAgICAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgaXNDb2xsYXBzaWJsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgICAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICAgIGxpbmVub3NTdGFydDogbnVtYmVyLFxuICAgICAgbGluZW5vc051bTogbnVtYmVyLFxuICAgICAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IG51bWJlcltdLFxuICAgICAgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgICAgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICAgIGlzUmVzdWx0OiBib29sZWFuLFxuICAgICAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gICAgICBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgICBwcm9tcHQ6IHN0cmluZ1xuICAgIH0gPSBnZXRNZXRhKHZpZXcsIGVsZW1fY29kZSwgZWxlbV9jb2RlX2lkeCwgc2VjdGlvbl9jb2RlLCBzZXR0aW5ncyk7XG4gICAgaWYgKGlzRXJyb3IpIHJldHVybjtcbiAgICBpZiAoc2V0dGluZ3MuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIGlzRXJyb3I6IGlzRXJyb3IsXG4gICAgICAgIGxpbmVTdGFydEluU2VjdGlvbjogbGluZVN0YXJ0SW5TZWN0aW9uLFxuICAgICAgICBsaW5lRW5kSW5TZWN0aW9uOiBsaW5lRW5kSW5TZWN0aW9uLFxuICAgICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBpc0NvbGxhcHNpYmxlOiBpc0NvbGxhcHNpYmxlLFxuICAgICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICAgIGxpbmVub3NTdGFydDogbGluZW5vc1N0YXJ0LFxuICAgICAgICBsaW5lbm9zTnVtOiBsaW5lbm9zTnVtLFxuICAgICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgICBoaWdobGlnaHRMaW5lczogaGlnaGxpZ2h0TGluZXMsXG4gICAgICAgIHNob3dMYW5ndWFnZTogc2hvd0xhbmd1YWdlLFxuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICAgIHNob3dDb3B5QnRuOiBzaG93Q29weUJ0bixcbiAgICAgICAgaXNSZXN1bHQ6IGlzUmVzdWx0LFxuICAgICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgICAgc2hvd1Byb21wdDogc2hvd1Byb21wdCxcbiAgICAgICAgcHJvbXB0OiBwcm9tcHQsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBIVE1MIGVsZW1lbnRzXG4gICAgY29uc3QgZWxlbV9kaXY6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3ByZV9wYXJlbnQucmVwbGFjZUNoaWxkKGVsZW1fZGl2LCBlbGVtX3ByZSk7XG4gICAgZWxlbV9kaXYuYXBwZW5kQ2hpbGQoZWxlbV9wcmUpO1xuXG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9ja1wiKTtcbiAgICBlbGVtX2NvZGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2RlXCIpO1xuICAgIGVsZW1fY29weUJ0bi5yZW1vdmUoKTsgLy8gcmVtb3ZlIHRoZSBvcmlnaW5hbCBjb3B5IGJ1dHRvbiBhcyBkZWZhdWx0XG5cbiAgICBsZXQgZWxlbV90aXRsZTogKEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93VGl0bGUgPT09IHRydWUpKSB7XG4gICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctdGl0bGVcIik7XG5cbiAgICAgIGVsZW1fdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV90aXRsZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXRpdGxlXCIpO1xuICAgICAgZWxlbV90aXRsZS5pbm5lckhUTUwgPSB0aXRsZTtcbiAgICAgIGVsZW1fZGl2Lmluc2VydEJlZm9yZShlbGVtX3RpdGxlLCBlbGVtX3ByZSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoaXNDb2xsYXBzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IGlzQ29sbGFwc2libGUgPT09IHRydWUpKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoaXNDb2xsYXBzaWJsZSA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICBpZiAoZWxlbV90aXRsZSkge1xuICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNpYmxlXCIpO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5kZWZhdWx0Q29sbGFwc2UgPT09IFwiY29sbGFwc2VcIikge1xuICAgICAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2VkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbV90aXRsZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZWxlbV9jb2xsYXBzZUJ0bnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtX2NvbGxhcHNlQnRucy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0bnNcIik7XG5cbiAgICAgICAgY29uc3QgZWxlbV9jb2xsYXBzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsZW1fY29sbGFwc2VCdG4uY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5cIiwgXCJoay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0blwiKTtcbiAgICAgICAgZWxlbV9jb2xsYXBzZUJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEwIDE5YTEgMSAwIDAgMS0uNjQtLjIzIDEgMSAwIDAgMS0uMTMtMS40MUwxMy43MSAxMiA5LjM5IDYuNjNhMSAxIDAgMCAxIC4xNS0xLjQxIDEgMSAwIDAgMSAxLjQ2LjE1bDQuODMgNmExIDEgMCAwIDEgMCAxLjI3bC01IDZBMSAxIDAgMCAxIDEwIDE5elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmFwcGVuZENoaWxkKGVsZW1fY29sbGFwc2VCdG4pO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fZXhwYW5kQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWxlbV9leHBhbmRCdG4uY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5cIiwgXCJoay1jb2RlYmxvY2stZXhwYW5kZWQtYnRuXCIpO1xuICAgICAgICBlbGVtX2V4cGFuZEJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDE2YTEgMSAwIDAgMS0uNjQtLjIzbC02LTVhMSAxIDAgMSAxIDEuMjgtMS41NEwxMiAxMy43MWw1LjM2LTQuMzJhMSAxIDAgMCAxIDEuNDEuMTUgMSAxIDAgMCAxLS4xNCAxLjQ2bC02IDQuODNBMSAxIDAgMCAxIDEyIDE2elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmFwcGVuZENoaWxkKGVsZW1fZXhwYW5kQnRuKTtcblxuICAgICAgICBlbGVtX3RpdGxlLnByZXBlbmQoZWxlbV9jb2xsYXBzZUJ0bnMpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgaWYgKFxuICAgICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMaW5lbm9zID09PSB1bmRlZmluZWQgfHwgc2hvd0xpbmVub3MgPT09IHRydWUpKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdHJ1ZSkpXG4gICAgKSB7XG4gICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGluZW5vc1wiKTtcblxuICAgICAgY29uc3QgZWxlbV9saW5lbm9zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxpbmVub3NcIik7XG4gICAgICBlbGVtX2xpbmVub3MuaW5uZXJUZXh0ID0gQXJyYXkobGluZW5vc051bSkuZmlsbCgwKS5tYXAoKF8sIGlkeCkgPT4gaWR4ICsgbGluZW5vc1N0YXJ0KS5qb2luKFwiXFxuXCIpO1xuICAgICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fbGluZW5vcywgZWxlbV9jb2RlKTtcblxuICAgICAgaWYgKHNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpIHtcbiAgICAgICAgZWxlbV9saW5lbm9zLmNsYXNzTGlzdC5hZGQoXCJzaG93LXNwbGl0dGVyXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy51c2VIaWdobGlnaHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93SGlnaGxpZ2h0ID09PSB0cnVlKSkge1xuICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodFwiKTtcblxuICAgICAgZWxlbV9kaXYuc3R5bGUuc2V0UHJvcGVydHkoXCItLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvclwiLCBzZXR0aW5ncy5oaWdobGlnaHRDb2xvcik7XG5cbiAgICAgIGNvbnN0IGVsZW1faGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgICAgZWxlbV9oaWdobGlnaHQuaW5uZXJIVE1MID0gQXJyYXkobGluZW5vc051bSkuZmlsbCgwKS5tYXAoKF8sIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwibGluZSBsaW5lLSR7aWR4ICsgbGluZW5vc1N0YXJ0fSAke2NsYXNzTmFtZXMuam9pbihcIiBcIil9XCI+IDwvc3Bhbj5gO1xuICAgICAgfSkuam9pbihcIlxcblwiKTtcbiAgICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHVuZGVmaW5lZCB8fCBzaG93TGFuZ3VhZ2UgPT09IHRydWUpKSB8fFxuICAgICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB0cnVlKSlcbiAgICApIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZVwiKTtcblxuICAgICAgY29uc3QgZWxlbV9sYW5ndWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgICBlbGVtX2xhbmd1YWdlLmlubmVyVGV4dCA9IGxhbmd1YWdlO1xuICAgICAgZWxlbV9wcmUucHJlcGVuZChlbGVtX2xhbmd1YWdlKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgICAoc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dDb3B5QnRuID09PSB0cnVlKSlcbiAgICApIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgICBlbGVtX3ByZS5hcHBlbmRDaGlsZChlbGVtX2NvcHlCdG4pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSkgfHxcbiAgICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkgJiYgKHNob3dQcm9tcHQgPT09IHVuZGVmaW5lZCB8fCBzaG93UHJvbXB0ID09PSB0cnVlKSkgfHxcbiAgICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgICApIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1wcm9tcHRcIik7XG5cbiAgICAgIGNvbnN0IGVsZW1fcHJvbXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1fcHJvbXB0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcHJvbXB0XCIpO1xuXG4gICAgICBjb25zdCBsaW5lcyA9IGVsZW1fY29kZS5pbm5lclRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBlbGVtX3Byb21wdC5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBsaW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpZHhdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcHJldkxpbmUgPSBpZHggPiAwID8gbGluZXNbaWR4IC0gMV0udHJpbSgpIDogXCJcIjtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGxpbmUgPT09IFwiXCIpIHx8IC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGVtcHR5XG4gICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aChcIiNcIikpIHx8IC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGEgY29tbWVudFxuICAgICAgICAgIChwcmV2TGluZS5lbmRzV2l0aChcIlxcXFxcIikpIC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGEgY29udGludWF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvbXB0O1xuICAgICAgfSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSBudWxsKS5qb2luKFwiXFxuXCIpO1xuXG4gICAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9wcm9tcHQsIGVsZW1fY29kZSk7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9PT0gdHJ1ZSAmJiAoaXNSZXN1bHQgPT09IHRydWUpKSB7XG4gICAgICBjb25zdCBpc0NvZGVCbG9ja0FkamFjZW50ID0gKCgpOiBib29sZWFuID0+IHtcbiAgICAgICAgbGV0IGxpbmVfaWR4ID0gbGluZVN0YXJ0SW5TZWN0aW9uIC0gMTtcbiAgICAgICAgd2hpbGUgKGxpbmVfaWR4ID49IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lID0gdmlldy5lZGl0b3IuZ2V0TGluZShsaW5lX2lkeCkudHJpbSgpO1xuICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbGluZV9pZHgtLTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAobGluZSA9PT0gXCJgYGBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkoKTtcblxuICAgICAgaWYgKGlzQ29kZUJsb2NrQWRqYWNlbnQpIHtcbiAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHRcIik7XG4gICAgICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlXCIpO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fcmVzdWx0X3Byb21wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsZW1fcmVzdWx0X3Byb21wdC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdC1wcm9tcHRcIik7XG4gICAgICAgIGVsZW1fcmVzdWx0X3Byb21wdC5pbm5lclRleHQgPSByZXN1bHRQcm9tcHQ7XG4gICAgICAgIGVsZW1fZGl2Lmluc2VydEJlZm9yZShlbGVtX3Jlc3VsdF9wcm9tcHQsIGVsZW1fcHJlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBdUI7OztBQzZCaEIsSUFBTSxtQkFBd0M7QUFBQSxFQUNwRCxnQkFBZ0I7QUFBQSxFQUVoQixzQkFBc0I7QUFBQSxFQUN0QixpQkFBaUI7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QVMsb0JBQW9CLFFBQVMsYUFBYSxNQUFPO0FBQzVELFlBQU0sdUJBQXVCLE1BQWU7QUFDMUMsWUFBSSxXQUFXLHFCQUFxQjtBQUNwQyxlQUFPLFlBQVksR0FBRztBQUNwQixnQkFBTSxPQUFPLEtBQUssT0FBTyxRQUFRLFFBQVEsRUFBRSxLQUFLO0FBQ2hELGNBQUksS0FBSyxXQUFXLEdBQUc7QUFDckI7QUFDQTtBQUFBLFVBQ0YsV0FBVyxTQUFTLE9BQU87QUFDekIsbUJBQU87QUFBQSxVQUNULE9BQU87QUFDTCxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1QsR0FBRztBQUVILFVBQUkscUJBQXFCO0FBQ3ZCLGlCQUFTLFVBQVUsSUFBSSxxQkFBcUI7QUFDNUMsa0JBQVUsVUFBVSxJQUFJLDBCQUEwQjtBQUVsRCxjQUFNLHFCQUFxQixTQUFTLGNBQWMsS0FBSztBQUN2RCwyQkFBbUIsVUFBVSxJQUFJLDRCQUE0QjtBQUM3RCwyQkFBbUIsWUFBWTtBQUMvQixpQkFBUyxhQUFhLG9CQUFvQixRQUFRO0FBQUEsTUFDcEQ7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0g7OztBSG5nQkEsSUFBcUIsb0JBQXJCLGNBQStDLHdCQUFPO0FBQUEsRUFHckQsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFDeEIsUUFBSSxLQUFLLFNBQVMsV0FBVztBQUM1QixjQUFRLElBQUksOEJBQThCO0FBQUEsSUFDM0M7QUFHQSxTQUFLLGNBQWMsSUFBSSxzQkFBc0IsS0FBSyxLQUFLLElBQUksQ0FBQztBQUc1RCxVQUFNLFlBQVksS0FBSyw4QkFBOEIsQ0FBQyxJQUFJLFFBQVE7QUFDakUsMkJBQXFCLElBQUksS0FBSyxJQUFJO0FBQUEsSUFDbkMsQ0FBQztBQUVELGNBQVUsWUFBWTtBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxXQUFXO0FBQ1YsUUFBSSxLQUFLLFNBQVMsV0FBVztBQUM1QixjQUFRLElBQUksOEJBQThCO0FBQUEsSUFDM0M7QUFBQSxFQUNEO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFBQSxFQUMxRTtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJhcHAiLCAiaW1wb3J0X29ic2lkaWFuIl0KfQo= diff --git a/.obsidian/plugins/hk-code-block/manifest.json b/.obsidian/plugins/hk-code-block/manifest.json new file mode 100644 index 0000000..d05b742 --- /dev/null +++ b/.obsidian/plugins/hk-code-block/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "hk-code-block", + "name": "HK Code Block", + "version": "0.4.1", + "minAppVersion": "1.0.0", + "description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view", + "author": "Heekang Park", + "authorUrl": "https://github.com/HeekangPark", + "fundingUrl": "", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/.obsidian/plugins/hk-code-block/styles.css b/.obsidian/plugins/hk-code-block/styles.css new file mode 100644 index 0000000..6e81b18 --- /dev/null +++ b/.obsidian/plugins/hk-code-block/styles.css @@ -0,0 +1,241 @@ +/* src/styles.scss */ +.hk-codeblock { + position: relative; + margin-top: var(--hk-codeblock-margin); + margin-bottom: var(--hk-codeblock-margin); +} +.hk-codeblock { + --hk-codeblock-margin: 1em; + --hk-codeblock-horizontal-padding: 16px; + --hk-codeblock-vertical-padding: 8px; + --hk-codeblock-background-color: var(--code-background); + --hk-codeblock-border-color: var(--divider-color); + --hk-codeblock-font-family: var(--font-monospace); + --hk-codeblock-font-size: var(--code-size); + --hk-codeblock-text-color: var(--code-normal); + --hk-codeblock-title-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-title-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-title-text-size: var(--hk-codeblock-font-size); + --hk-codeblock-linenos-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-linenos-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-linenos-text-size: var(--hk-codeblock-font-size); + --hk-codeblock-language-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-language-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-language-text-size: calc(var(--hk-codeblock-font-size) * 0.9); + --hk-codeblock-copy-btn-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-copy-btn-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-copy-btn-text-size: calc(var(--hk-codeblock-font-size) * 0.9); + --hk-codeblock-prompt-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-prompt-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-prompt-text-size: var(--hk-codeblock-font-size); + --hk-codeblock-result-text-font: var(--hk-codeblock-font-family); + --hk-codeblock-result-text-color: var(--hk-codeblock-text-color); + --hk-codeblock-result-text-size: var(--hk-codeblock-font-size); +} +.hk-codeblock pre { + position: relative; + border-radius: initial; + display: flex; + flex-direction: row; + margin: 0; + min-height: 0; + padding-top: var(--hk-codeblock-vertical-padding); + padding-bottom: var(--hk-codeblock-vertical-padding); + padding-left: var(--hk-codeblock-horizontal-padding); + padding-right: var(--hk-codeblock-horizontal-padding); + background-color: var(--hk-codeblock-background-color); + font-family: var(--hk-codeblock-font-family); + color: var(--hk-codeblock-text-color); +} +.hk-codeblock pre code.hk-codeblock-code { + white-space: pre; + overflow-x: auto; + padding: 0; + background-color: var(--hk-codeblock-background-color); + font-family: var(--hk-codeblock-font-family); + color: var(--hk-codeblock-text-color); + font-size: var(--hk-codeblock-font-size); +} +.hk-codeblock.hk-codeblock-show-title .hk-codeblock-title { + padding-top: var(--hk-codeblock-vertical-padding); + padding-bottom: var(--hk-codeblock-vertical-padding); + padding-left: var(--hk-codeblock-horizontal-padding); + padding-right: var(--hk-codeblock-horizontal-padding); + background-color: var(--hk-codeblock-background-color); + border-bottom: 1px solid var(--hk-codeblock-border-color); + font-family: var(--hk-codeblock-title-text-font); + color: var(--hk-codeblock-title-text-color); + font-size: var(--hk-codeblock-title-text-size); + display: flex; + flex-direction: row; + align-items: center; +} +.hk-codeblock.hk-codeblock-show-title .hk-codeblock-title ~ pre { + margin-top: 0; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title { + cursor: pointer; + position: relative; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns { + display: inline-flex; + align-items: center; + justify-content: center; + margin-right: 2px; + position: relative; + top: -1px; + left: -3px; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn { + width: var(--hk-codeblock-title-text-size); + height: var(--hk-codeblock-title-text-size); + fill: var(--hk-codeblock-title-text-color); + stroke: var(--hk-codeblock-title-text-color); + stroke-width: 2; + opacity: 0.2; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-collapsed-btn { + display: none; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-expanded-btn { + display: inline-block; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title { + border-bottom: none; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-collapsed-btn { + display: inline-block; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-expanded-btn { + display: none; +} +.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed pre { + display: none; +} +.hk-codeblock.hk-codeblock-show-linenos pre .hk-codeblock-linenos { + flex-shrink: 0; + flex-grow: 0; + text-align: right; + padding: 0; + padding-right: 1em; + opacity: 0.6; + user-select: none; + white-space: pre; + font-family: var(--hk-codeblock-linenos-text-font); + color: var(--hk-codeblock-linenos-text-color); + font-size: var(--hk-codeblock-linenos-text-size); + background-color: transparent; +} +.hk-codeblock.hk-codeblock-show-linenos pre .hk-codeblock-linenos.show-splitter { + border-right: 1px solid var(--hk-codeblock-border-color); + margin-right: 1em; +} +.hk-codeblock.hk-codeblock-show-highlight pre .hk-codeblock-highlight { + display: flex; + flex-direction: column; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + user-select: none; + padding-top: var(--hk-codeblock-vertical-padding); + padding-bottom: var(--hk-codeblock-vertical-padding); + opacity: 0.2; + font-family: var(--hk-codeblock-linenos-text-font); + font-size: var(--hk-codeblock-linenos-text-font); + color: var(--hk-codeblock-linenos-text-color); + background-color: transparent; +} +.hk-codeblock.hk-codeblock-show-highlight pre .hk-codeblock-highlight .line.highlight { + background-color: var(--hk-codeblock-highlight-background-color); +} +.hk-codeblock.hk-codeblock-show-language pre .hk-codeblock-language { + opacity: 0.4; + user-select: none; + z-index: 1; + margin: 6px; + padding-top: 6px; + padding-bottom: 6px; + padding-left: 8px; + padding-right: 8px; + background-color: transparent; + box-shadow: none; + font-family: var(--hk-codeblock-language-text-font); + color: var(--hk-codeblock-language-text-color); + font-size: var(--hk-codeblock-language-text-size); + position: absolute; + top: 0; + right: 0; +} +.hk-codeblock.hk-codeblock-show-language pre:hover .hk-codeblock-language { + display: none; +} +.hk-codeblock.hk-codeblock-show-copybtn pre .copy-code-button { + cursor: pointer; + opacity: 0.4; + user-select: none; + z-index: 1; + margin: 6px; + padding-top: 6px; + padding-bottom: 6px; + padding-left: 8px; + padding-right: 8px; + background-color: transparent; + box-shadow: none; + font-family: var(--hk-codeblock-copy-btn-text-font); + color: var(--hk-codeblock-copy-btn-text-color); + font-size: var(--hk-codeblock-copy-btn-text-size); + position: absolute; + top: 0; + right: 0; +} +.hk-codeblock.hk-codeblock-show-copybtn pre .copy-code-button:hover { + opacity: 1; + background-color: rgba(255, 255, 255, 0.0745098039); +} +.hk-codeblock.hk-codeblock-show-copybtn pre .copy-code-button:active { + opacity: 1; + background-color: rgba(255, 255, 255, 0.1490196078); +} +.hk-codeblock.hk-codeblock-show-prompt pre .hk-codeblock-prompt { + flex-shrink: 0; + flex-grow: 0; + text-align: right; + padding-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0.8em; + opacity: 0.6; + user-select: none; + color: var(--hk-codeblock-prompt-text-color); + white-space: pre; + font-family: var(--hk-codeblock-prompt-text-font); + font-size: var(--hk-codeblock-prompt-text-size); + background-color: transparent; +} +.hk-codeblock.hk-codeblock-result { + margin-top: calc(var(--hk-codeblock-margin) * -1); + border-top: 1px solid var(--hk-codeblock-border-color); + background-color: var(--hk-codeblock-background-color); +} +.hk-codeblock.hk-codeblock-result .hk-codeblock-result-prompt { + color: var(--hk-codeblock-result-text-color); + opacity: 0.4; + font-size: 0.8em; + padding-top: var(--hk-codeblock-vertical-padding); + padding-left: var(--hk-codeblock-horizontal-padding); + padding-right: var(--hk-codeblock-horizontal-padding); + user-select: none; + pointer-events: none; +} +.hk-codeblock.hk-codeblock-result pre { + margin-top: 0; +} +.hk-codeblock.hk-codeblock-result pre .hk-codeblock-result-code { + color: var(--hk-codeblock-result-text-color); + font-family: var(--hk-codeblock-result-text-font); + font-size: var(--hk-codeblock-result-text-size); +} +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay1mb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vc3BhY2UpO1xuICAgIC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZTogdmFyKC0tY29kZS1zaXplKTtcbiAgICAtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG5cbiAgICAtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWZvbnQ6IHZhcigtLWhrLWNvZGVibG9jay1mb250LWZhbWlseSk7XG4gICAgLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXRleHQtY29sb3IpO1xuICAgIC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG5cbiAgICAtLWhrLWNvZGVibG9jay1saW5lbm9zLXRleHQtZm9udDogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtZmFtaWx5KTtcbiAgICAtLWhrLWNvZGVibG9jay1saW5lbm9zLXRleHQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTtcbiAgICAtLWhrLWNvZGVibG9jay1saW5lbm9zLXRleHQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG5cbiAgICAtLWhrLWNvZGVibG9jay1sYW5ndWFnZS10ZXh0LWZvbnQ6IHZhcigtLWhrLWNvZGVibG9jay1mb250LWZhbWlseSk7IFxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTsgXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpICogMC45KTtcblxuICAgIC0taGstY29kZWJsb2NrLWNvcHktYnRuLXRleHQtZm9udDogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtZmFtaWx5KTtcbiAgICAtLWhrLWNvZGVibG9jay1jb3B5LWJ0bi10ZXh0LWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stdGV4dC1jb2xvcik7XG4gICAgLS1oay1jb2RlYmxvY2stY29weS1idG4tdGV4dC1zaXplOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpICogMC45KTtcblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWZvbnQ6IHZhcigtLWhrLWNvZGVibG9jay1mb250LWZhbWlseSk7XG4gICAgLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTtcbiAgICAtLWhrLWNvZGVibG9jay1wcm9tcHQtdGV4dC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1zaXplKTtcblxuICAgIC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWZvbnQ6IHZhcigtLWhrLWNvZGVibG9jay1mb250LWZhbWlseSk7XG4gICAgLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTtcbiAgICAtLWhrLWNvZGVibG9jay1yZXN1bHQtdGV4dC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1zaXplKTtcbiAgfVxuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICBtYXJnaW46IHtcbiAgICB0b3A6IHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pO1xuICAgIGJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLW1hcmdpbik7XG4gIH1cblxuICBwcmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBib3JkZXItcmFkaXVzOiBpbml0aWFsO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDA7XG4gICAgbWluLWhlaWdodDogMDtcblxuICAgIHBhZGRpbmc6IHtcbiAgICAgIHRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICBsZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICAgIHJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICB9XG5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWhrLWNvZGVibG9jay1mb250LWZhbWlseSk7XG4gICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTtcbiAgICAvL2ZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7IC8vIGlmIHRoZSBzaXplIGlzIHByb3ZpZGVkIHdpdGggdGhlIGVtIHVuaXQsIHRoaXMgY2FuIGNhdXNlIHRleHQgYmVpbmcgdG9vIHNtYWxsXG5cbiAgICBjb2RlLmhrLWNvZGVibG9jay1jb2RlIHtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1mYW1pbHkpO1xuICAgICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10ZXh0LWNvbG9yKTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qIHRpdGxlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXRpdGxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgcGFkZGluZzoge1xuICAgICAgdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICBib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgIGxlZnQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgICAgcmlnaHQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIH1cblxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWZvbnQpO1xuICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcik7XG4gICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1zaXplKTtcblxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgLmhrLWNvZGVibG9jay10aXRsZX5wcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cbn1cblxuLyogY29sbGFwc2UgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctdGl0bGUuaGstY29kZWJsb2NrLWNvbGxhcHNpYmxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdG9wOiAtMXB4O1xuICAgICAgbGVmdDogLTNweDtcblxuICAgICAgLmhrLWNvZGVibG9jay1jb2xsYXBzZS1idG4ge1xuICAgICAgICB3aWR0aDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtc2l6ZSk7XG4gICAgICAgIGhlaWdodDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtc2l6ZSk7XG5cbiAgICAgICAgZmlsbDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuICAgICAgICBzdHJva2U6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyO1xuICAgICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkIHtcbiAgICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG5cbiAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRuIHtcbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLyogbGluZW5vcyAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1saW5lbm9zIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxpbmVub3Mge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250KTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yKTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1zaXplKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgICAmLnNob3ctc3BsaXR0ZXIge1xuICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxZW07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIGhpZ2hsaWdodCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1oaWdobGlnaHQge1xuICBwcmUge1xuICAgIC5oay1jb2RlYmxvY2staGlnaGxpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcblxuICAgICAgcGFkZGluZzoge1xuICAgICAgICB0b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgICAgYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICB9XG5cbiAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWZvbnQpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWZvbnQpO1xuICAgICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1saW5lbm9zLXRleHQtY29sb3IpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICAgIC5saW5lLmhpZ2hsaWdodCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIGxhbmd1YWdlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LWxhbmd1YWdlIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxhbmd1YWdlIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgei1pbmRleDogMTtcbiAgICAgIG1hcmdpbjogNnB4O1xuXG4gICAgICBwYWRkaW5nOiB7XG4gICAgICAgIHRvcDogNnB4O1xuICAgICAgICBib3R0b206IDZweDtcbiAgICAgICAgbGVmdDogOHB4O1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgfVxuXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtZm9udCk7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgei1pbmRleDogMTtcbiAgICAgIG1hcmdpbjogNnB4O1xuXG4gICAgICBwYWRkaW5nOiB7XG4gICAgICAgIHRvcDogNnB4O1xuICAgICAgICBib3R0b206IDZweDtcbiAgICAgICAgbGVmdDogOHB4O1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgfVxuXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWNvcHktYnRuLXRleHQtZm9udCk7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWNvcHktYnRuLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stY29weS1idG4tdGV4dC1zaXplKTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjEzO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmYyNjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogcHJvbXB0ICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXByb21wdCB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1wcm9tcHQge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcblxuICAgICAgcGFkZGluZzoge1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDAuOGVtO1xuICAgICAgfVxuXG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3IpO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1wcm9tcHQtdGV4dC1zaXplKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgfVxufVxuXG4vKiByZXN1bHQgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXJlc3VsdCB7XG4gIG1hcmdpbi10b3A6IGNhbGModmFyKC0taGstY29kZWJsb2NrLW1hcmdpbikgKiAoLTEpKTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWhrLWNvZGVibG9jay1ib3JkZXItY29sb3IpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG5cbiAgLmhrLWNvZGVibG9jay1yZXN1bHQtcHJvbXB0IHtcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yKTtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcblxuICAgIHBhZGRpbmc6IHtcbiAgICAgIHRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgICByaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgfVxuXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICBwcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAuaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWhrLWNvZGVibG9jay1yZXN1bHQtdGV4dC1mb250KTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LXNpemUpO1xuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQXFDRTtBQUdFO0FBQ0E7O0FBeENGO0FBRUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFVRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdFO0FBQ0E7QUFDQTtBQUNBO0FBR0Y7QUFDQTtBQUNBOztBQUdBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBT0o7QUFFSTtBQUNBO0FBQ0E7QUFDQTtBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFNRjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQUdGO0FBQ0U7O0FBT047QUFDRTs7QUFJSTtBQUNFOztBQUdGO0FBQ0U7O0FBTVI7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7O0FBU0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHRTtBQUNBO0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQVNKO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFHRTtBQUNBO0FBQ0E7QUFDQTtBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFRRjtBQUNFO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHRTtBQUNBO0FBQ0E7QUFDQTtBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTtBQUNBOztBQUdGO0FBQ0U7QUFDQTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUdFO0FBQ0E7QUFDQTtBQUNBO0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTU47QUFDRTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFHRTtBQUNBO0FBQ0E7QUFHRjtBQUNBOztBQUdGO0FBQ0U7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7OyIsCiAgIm5hbWVzIjogW10KfQo= */ diff --git a/.obsidian/workspace-AWIN-DESKMEET.json b/.obsidian/workspace-AWIN-DESKMEET.json new file mode 100644 index 0000000..a74d324 --- /dev/null +++ b/.obsidian/workspace-AWIN-DESKMEET.json @@ -0,0 +1,236 @@ +{ + "main": { + "id": "fd76501ab5551c59", + "type": "split", + "children": [ + { + "id": "88d942ffc79a2389", + "type": "tabs", + "children": [ + { + "id": "182a7e73c49d10ce", + "type": "leaf", + "state": { + "type": "empty", + "state": {} + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "c03b931709aac93a", + "type": "split", + "children": [ + { + "id": "262a6c92848bc73a", + "type": "tabs", + "children": [ + { + "id": "f69acad103e7f817", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "bad194a4534ef74b", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "e41d3ba9ac328959", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 267.49999618530273 + }, + "right": { + "id": "bb4f1f6a5dddbb12", + "type": "split", + "children": [ + { + "id": "e04f7f5c2b67b828", + "type": "tabs", + "children": [ + { + "id": "71679272f2e33a87", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "e7f5fe3d8a7d256b", + "type": "leaf", + "state": { + "type": "outline", + "state": {} + } + }, + { + "id": "bac9d59fdcd09bd8", + "type": "leaf", + "state": { + "type": "advanced-tables-toolbar", + "state": {} + } + }, + { + "id": "61119a6658ef61a6", + "type": "leaf", + "state": { + "type": "all-properties", + "state": { + "sortOrder": "frequency", + "showSearch": false, + "searchQuery": "" + } + } + }, + { + "id": "d24e22dd36a5a962", + "type": "leaf", + "state": { + "type": "file-properties", + "state": {} + } + }, + { + "id": "4a0bb3cb0b31da42", + "type": "leaf", + "state": { + "type": "quiet-outline", + "state": {} + } + } + ], + "currentTab": 5 + }, + { + "id": "ae4bf98badbfc7ee", + "type": "tabs", + "children": [ + { + "id": "18b9707a37e1188a", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 319.5 + }, + "left-ribbon": { + "hiddenItems": { + "table-editor-obsidian:Advanced Tables Toolbar": false, + "switcher:開啟快速切換": false, + "graph:查看關聯圖": false, + "canvas:建立新畫布": false, + "daily-notes:開啟今天的每日筆記": false, + "templates:插入模板": false, + "command-palette:開啟命令面板": false, + "markdown-importer:開啟 Markdown 格式轉換器": false, + "random-note:開始漫遊筆記": false, + "workspaces:管理工作區配置": false, + "periodic-notes:Open today": false + } + }, + "active": "182a7e73c49d10ce", + "lastOpenFiles": [ + "05. 資料收集/Programming/C++/万字避坑指南!C++ 的缺陷与思考(上).md", + "05. 資料收集/Programming/C++/Modern C++ use in Chromium.md", + "05. 資料收集/Programming/C++/Modern C++ The good parts.md", + "05. 資料收集/Programming/C++/A cheatsheet of modern C++ language and library features.md", + "05. 資料收集/Programming/C++/C++20, How Hard Could It Be.md", + "05. 資料收集/Linux/Docker.md", + "05. 資料收集/軟體工具、設定/Windows Terminal.md", + "orphaned files output.md", + "attachments/Pasted image 20210722145433.png", + "attachments/Pasted image 20220908123355.png", + "attachments/Pasted image 20210818115458.png", + "attachments/Pasted image 20210422205534.png", + "attachments/Pasted image 20210722093705.png", + "attachments/Pasted image 20230504183452.png", + "attachments/Pasted image 20220506145247.png", + "attachments/Pasted image 20210125183754.png", + "attachments/para_example.png", + "attachments/Pasted image 20220815135248.png", + "10. 工作/01. Logitech/Bolide.md", + "Pasted image 20230426213611.png.md", + "Pasted image 20230418111423.png.md", + "02. 個人:Daily/2023/01/2023-01-12(週四).md", + "broken links output.md", + "empty files.md", + "02. 個人:Daily/2020/12/2020-12-22(Tue).md", + "02. 個人:Daily/2020/12/2020-12-27(Sun).md", + "02. 個人:Daily/2021/01/2021-01-14(Thu).md", + "02. 個人:Daily/2021/01/2021-01-25(Mon).md", + "02. 個人:Daily/2021/01/2021-01-28(Thu).md", + "02. 個人:Daily/2021/02/2021-02-03(Wed).md", + "02. 個人:Daily/2021/02/2021-02-04(Thu).md", + "05. 資料收集/Linux/確認日誌的完整性.md", + "05. 資料收集/Programming/Keras/categorical_crossentropy.md", + "05. 資料收集/Programming/Keras/An example that use categorical_crossentropy and softmax.md", + "05. 資料收集/Linux/journalctl.md", + "02. 個人:Daily/2020/12/2020-12-03(Thu).md", + "05. 資料收集/裝置設定", + "05. 資料收集/Programming/OpenCV", + "05. 資料收集/Programming/numpy", + "05. 資料收集/Programming/Keras", + "00. Inbox/自我成長.canvas", + "00. Inbox/vc-fwUpdate code trace(Meetup).canvas", + "00. Inbox/My Mindmap.canvas", + "05. 資料收集/Windows/_Map.canvas", + "05. 資料收集/Programming/C++", + "00. Inbox/CPU Performance Control.canvas", + "05. 資料收集/Linux/_Map.canvas", + "00. Inbox/雜", + "05. 資料收集/樹莓派/_Map.canvas", + "00. Inbox/暫記:以後可能會用到", + "05. 資料收集/Windows", + "00. Inbox/Side project", + "00. Inbox/給孩子的簡報", + "01. 個人/讀書筆記/20240101 - 筆記的魔力.canvas", + "未命名 1.canvas", + "未命名.canvas" + ] +} \ No newline at end of file