From e7b6d543bbbd22d1ac4fcd73dc0a1efb19378940 Mon Sep 17 00:00:00 2001 From: Heekang Park Date: Tue, 14 Feb 2023 01:02:21 +0900 Subject: [PATCH] v0.3.0 --- .gitignore | 4 +- README.md | 38 +++++++++-- README_ko.md | 38 +++++++++-- dist/main.js | 95 ++++++++++++++++++++-------- dist/manifest.json | 2 +- dist/styles.css | 14 +++-- dist/versions.json | 3 +- imgs/highlight1.png | Bin 7981 -> 18701 bytes manifest.json | 2 +- package-lock.json | 4 +- package.json | 2 +- src/HKCodeBlockProcessor.ts | 122 +++++++++++++++++++++++++++--------- src/styles.scss | 10 ++- versions.json | 3 +- 14 files changed, 252 insertions(+), 85 deletions(-) diff --git a/.gitignore b/.gitignore index 9ef9a46..e48d514 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,7 @@ node_modules +# ignore files for local testing main.js -styles.css \ No newline at end of file +styles.css +data.json \ No newline at end of file diff --git a/README.md b/README.md index 528b7e6..099532e 100644 --- a/README.md +++ b/README.md @@ -88,15 +88,23 @@ If you want to explicitly hide the line numbers, you can do it like this. You can highlight specific lines in the code block with commas like this. - ```python highlight:"2,3" - print("Hello world") - print("I love you") - print("Wow") + ```python highlight:"2-4,8,10" + print("line 1") + print("line 2") + print("line 3") + print("line 4") + print("line 5") + print("line 6") + print("line 7") + print("line 8") + print("line 9") + print("line 10") + print("line 11") ``` ![highlight1](https://github.com/HeekangPark/obsidian-hk-code-block/raw/master/imgs/highlight1.png) -You must put the line numbers in quotes. You can use both single and double quotes. +You must put the line numbers in quotes. You can use both single and double quotes. You can also use a dash to specify a range of line numbers. If you use the line numbers feature and set the line numbers don't start from 1, you must enter the line numbers to be highlighted according to that. @@ -345,8 +353,19 @@ MIT License - [Typewriter](https://github.com/crashmoney/obsidian-typewriter) - Most of the theme problem is caused by the usage of `!important` keywords in the theme CSS. HK Code Block does not use `!important` keywords at all in order to avoid conflicts with other themes or plugins. If you want to use HK Code Block plugin with those themes, you should modify the theme CSS files, or by using `!important` keywords, you should explicitly increase the priority of the HK Code Block CSS rules. +## Bug Report, Feature Request + +If you find any bugs or have any feature requests, please report them on the GitHub Issues. Thank you! + ## Changelog +Versions are controlled by the rule below. + +- Version x.y.z + - x : increased when huge changes are made(ex. change of logic, etc.) + - y : increased when features are newly added or changed + - z : increased when bug fixes are made + ### 0.1.0 - Initial release @@ -359,4 +378,11 @@ MIT License ### 0.2.1 - Bug fix - - Fix that prompted code blocks with multiple lines always show horizontal scrollbars \ No newline at end of file + - Fix that prompted code blocks with multiple lines always show horizontal scrollbars + +### 0.3.0 + +- Bug fix + - Fix that code blocks inside other elements(ex. li) are not rendered properly +- Add features + - Now you can use `-` symbols in the highlight statement so that you can easily highlight multiple, continuous lines. diff --git a/README_ko.md b/README_ko.md index 16f7b18..bfb7646 100644 --- a/README_ko.md +++ b/README_ko.md @@ -88,15 +88,23 @@ HK CodeBlock을 이용하면 Code Block에 다양한 기능들을 추가할 수 다음과 같이 강조하고 싶은 줄의 번호를 콤마로 구분하여 입력하면 해당 줄에 강조 효과를 줄 수 있습니다. - ```python highlight:"2,3" - print("Hello world") - print("I love you") - print("Wow") + ```python highlight:"2-4,8,10" + print("line 1") + print("line 2") + print("line 3") + print("line 4") + print("line 5") + print("line 6") + print("line 7") + print("line 8") + print("line 9") + print("line 10") + print("line 11") ``` ![highlight1](https://github.com/HeekangPark/obsidian-hk-code-block/raw/master/imgs/highlight1.png) -반드시 따옴표 안에 줄 번호를 넣어야 합니다. 큰따옴표와 작은 따옴표 모두 사용 가능합니다. +반드시 따옴표 안에 줄 번호를 넣어야 합니다. 큰따옴표와 작은 따옴표 모두 사용 가능합니다. 범위를 강조하고 싶다면 대시(`-`)를 사용하면 됩니다. 만약 줄 번호 기능을 사용해 줄 번호가 1부터 시작하지 않도록 했다면, 강조할 줄 번호를 입력할 때도 이에 맞춰서 입력해야 합니다. @@ -345,8 +353,19 @@ MIT License - [Typewriter](https://github.com/crashmoney/obsidian-typewriter) - 테마 문제의 대부분은 해당 테마들이 CSS에 `!important` 키워드를 붙여 HK Code Block의 CSS 우선순위가 밀려 발생합니다. HK Code Block은 다른 테마, 플러그인과의 호환성을 위해 `!important` 키워드를 사용하지 않습니다. 만약 이런 테마들에서도 HK Code Block을 사용하고 싶다면 해당 테마의 CSS를 수정하거나 `!important` 등을 사용, HK Code Block의 CSS 우선순위를 직접 높여야 합니다. +## 버그 제보, 기능 추가 요청 + +만약 사용 중 버그를 발견하거나, 기능 추가 요청이 있으시다면 GitHub Issues에 등록해주세요. 감사합니다! + ## Changelog +버전은 다음과 같은 규칙으로 관리됩니다. + +- 버전 x.y.z + - x : 전체 기능의 큰 변화가 있을 때(ex. 로직 변경 등) 증가합니다. + - y : 기능 추가 또는 수정이 있을 때 증가합니다. + - z : 버그 수정이 있을 때 증가합니다. + ### 0.1.0 - 최초 배포 @@ -359,4 +378,11 @@ MIT License ### 0.2.1 - 버그 수정 - - 여러 줄의 소스 코드가 있는 code block에서 프롬프트 기능 활성화 시 가로 스크롤이 생기는 문제 수정 \ No newline at end of file + - 여러 줄의 소스 코드가 있는 code block에서 프롬프트 기능 활성화 시 가로 스크롤이 생기는 문제 수정 + +### 0.3.0 + +- 버그 수정 + - 다른 요소(ex. li) 아래에 있는 code block이 이상하게 렌더링되던 문제 해결 +- 기능 추가 + - 이젠 줄 강조 시 `-` 기호를 사용해 손쉽게 여러 줄을 연속적으로 강조할 수 있음 \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index e748ecf..740f09b 100644 --- a/dist/main.js +++ b/dist/main.js @@ -255,10 +255,30 @@ var REGEX = { COPYBTN_COMPLICATE: /\scopybtn:(true|false)\s/, RESULT: /^```result\s/, PROMPT_SIMPLE: /\sprompt\s/, - PROMPT_COMPLICATE: /\sprompt:(true|false|'(.*?)'|"(.*?)")\s/ + PROMPT_COMPLICATE: /\sprompt:(true|false|'(.*?)'|"(.*?)")\s/, + NUMBER: /^-{0,1}\d+$/ }; function getMeta(view, elem_code, section_code, settings) { - const firstline = view.editor.getLine(section_code.lineStart) + " "; + const lineStart = (() => { + for (let i = section_code.lineStart; i <= section_code.lineEnd; i++) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) + return i; + } + return -1; + })(); + const lineEnd = (() => { + for (let i = section_code.lineEnd; i >= section_code.lineStart; i--) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) + return i; + } + return -1; + })(); + if (lineStart < 0 || lineEnd < 0 || lineStart >= lineEnd) { + throw new Error("Cannot find the first line or the last line of the code block"); + } + const firstline = view.editor.getLine(lineStart) + " "; let showTitle = void 0; let title = ""; const regexResult_title = REGEX.TITLE.exec(firstline); @@ -280,7 +300,7 @@ function getMeta(view, elem_code, section_code, settings) { } let showLinenos = void 0; let linenosStart = settings.defaultLinenosStart; - const linenosNum = section_code.lineEnd - section_code.lineStart - 1; + const linenosNum = lineEnd - lineStart - 1; const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline); const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline); if (regexResult_linenosSimple) { @@ -301,7 +321,20 @@ function getMeta(view, elem_code, section_code, settings) { if (regexResult_highlight) { showHighlight = true; const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2]; - highlightLines = highlightLines_str.split(",").map((line) => parseInt(line)); + 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))) { showHighlight = void 0; highlightLines = []; @@ -413,27 +446,12 @@ async function HKCodeBlockProcessor(el, context, plugin) { const section_code = context.getSectionInfo(elem_code); if (!section_code) return; - const { - showTitle, - title, - isCollapsible, - showLinenos, - linenosStart, - linenosNum, - showHighlight, - highlightLines, - showLanguage, - language, - showCopyBtn, - isResult, - resultPrompt, - showPrompt, - prompt - } = getMeta(view, elem_code, section_code, settings); - if (settings.debugMode) { - console.log({ + let showTitle, title, isCollapsible, showLinenos, linenosStart, linenosNum, showHighlight, highlightLines, showLanguage, language, showCopyBtn, isResult, resultPrompt, showPrompt, prompt; + try { + ({ showTitle, title, + isCollapsible, showLinenos, linenosStart, linenosNum, @@ -446,7 +464,28 @@ async function HKCodeBlockProcessor(el, context, plugin) { resultPrompt, showPrompt, prompt - }); + } = getMeta(view, elem_code, section_code, settings)); + if (settings.debugMode) { + console.log({ + showTitle, + title, + isCollapsible, + showLinenos, + linenosStart, + linenosNum, + showHighlight, + highlightLines, + showLanguage, + language, + showCopyBtn, + isResult, + resultPrompt, + showPrompt, + prompt + }); + } + } catch (e) { + return; } elem_div.classList.add("hk-codeblock"); elem_code.classList.add("hk-codeblock-code"); @@ -504,7 +543,7 @@ async function HKCodeBlockProcessor(el, context, plugin) { 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("code"); + const elem_highlight = document.createElement("div"); elem_highlight.classList.add("hk-codeblock-highlight"); elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { const classNames = []; @@ -531,6 +570,8 @@ async function HKCodeBlockProcessor(el, context, plugin) { 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 @@ -539,7 +580,7 @@ async function HKCodeBlockProcessor(el, context, plugin) { return " ".repeat(prompt.length); } return prompt; - }).join("\n"); + }).filter((line) => line !== null).join("\n"); elem_pre.insertBefore(elem_prompt, elem_code); } if (settings.useResultGlobal === "enable" && isResult === true) { @@ -574,4 +615,4 @@ var HKCodeBlockPlugin = class extends import_obsidian3.Plugin { await this.saveData(this.settings); } }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiwgbG9hZFByaXNtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vSEtDb2RlQmxvY2tTZXR0aW5ncyc7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ1RhYic7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1Byb2Nlc3NvciB9IGZyb20gJy4vSEtDb2RlQmxvY2tQcm9jZXNzb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIS0NvZGVCbG9ja1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnTW9kZSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJsb2FkaW5nIEhLQ29kZUJsb2NrIHBsdWdpblwiKTtcblx0XHR9XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdHByb21wdGluZ0xhbmd1YWdlczogc3RyaW5nW107XG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IHN0cmluZztcblxuXHRkZWJ1Z01vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBIS0NvZGVCbG9ja1NldHRpbmdzID0ge1xuXHR1c2VUaXRsZUdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlQ29sbGFwc2libGVHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0Q29sbGFwc2U6IFwiZXhwYW5kXCIsXG5cdHNob3dDb2xsYXBzZUJ0bjogdHJ1ZSxcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0ZGVmYXVsdExpbmVub3NTdGFydDogMSxcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogdHJ1ZSxcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRoaWdobGlnaHRDb2xvcjogXCIjZmYwMDAwXCIsXG5cblx0dXNlTGFuZ3VhZ2VHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGFuZ3VhZ2U6IFwicGxhaW4gdGV4dFwiLFxuXG5cdHVzZUNvcHlCdG5HbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZVByb21wdEdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdHByb21wdGluZ0xhbmd1YWdlczogW1wiYmFzaFwiXSxcblx0ZGVmYXVsdFByb21wdDogXCIkXCIsXG5cblx0dXNlUmVzdWx0R2xvYmFsOiBcImVuYWJsZVwiLFxuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBcIlJlc3VsdFwiLFxuXG5cdGRlYnVnTW9kZTogZmFsc2UsXG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBjb25zdCBmcmFnV2l0aEhUTUwgPSAodGV4dDogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4ge1xuXHRcdGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKFwiPGJyPlwiKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gdGl0bGVcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaXRsZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgVGl0bGUnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIHRpdGxlIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdGl0bGUgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIHRpdGxlIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUaXRsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBjb2xsYXBzZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvbGxhcHNlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb2xsYXBzZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgYWx3YXlzIGJlIGNvbGxhcHNpYmxlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZSwgYnV0IHdpbGwgbm90IGJlIGNvbGxhcHNlZCBpZiBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY29sbGFwc2libGUgaWYgdGhlIGNvbGxhcHNlIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBuZXZlciBiZSBjb2xsYXBzaWJsZWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWUgYXMgKFwiY29sbGFwc2VcIiB8IFwiZXhwYW5kXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIG51bWJlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIE51bWJlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgTnVtYmVycycpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgbGluZW5vcyBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMaW5lIE51bWJlciBTdGFydCcpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGluZSBudW1iZXIgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihudW0pKSByZXR1cm47XG5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQgPSBudW07XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Nob3cgTGluZSBOdW1iZXIgU3BsaXR0ZXInKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGluZSBoaWdobGlnaHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIEhpZ2hsaWdodCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBIaWdobGlnaHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lIGhpZ2hsaWdodCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGFuZ3VhZ2UnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUgb2YgdGhlIGNvZGUgYmxvY2sgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzcGVjaWZpZWQuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Ly8gY29weSBidXR0b25cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb3B5IEJ1dHRvbicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29weSBCdXR0b24nKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgY29weSBidXR0b24gc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gcHJvbXB0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUHJvbXB0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBQcm9tcHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd25cblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogcHJvbXB0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJlbmFibGVcIjogXCJlbmFibGVcIixcblx0XHRcdFx0XHRcImRpc2FibGVcIjogXCJkaXNhYmxlXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9IHZhbHVlIGFzIChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBSZXN1bHQgUHJvbXB0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIlRoZSBkZWZhdWx0IHByb21wdCBvZiB0aGUgcmVzdWx0IGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBmb3IgZGV2ZWxvcGVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0RldmVsb3BlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWcgTW9kZScpXG5cdFx0XHQuc2V0RGVzYygnU2hvdyBsb2dzIGluIHRoZSBjb25zb2xlLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59IiwgImltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSBcIi4vSEtDb2RlQmxvY2tTZXR0aW5nc1wiO1xuXG5jb25zdCBSRUdFWCA9IHtcbiAgVElUTEU6IC9cXHN0aXRsZTooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT0xMQVBTSUJMRV9TSU1QTEU6IC9cXHNjb2xsYXBzaWJsZVxccy8sXG4gIENPTExBUFNJQkxFX0NPTVBMSUNBVEU6IC9cXHNjb2xsYXBzaWJsZToodHJ1ZXxmYWxzZSlcXHMvLFxuICBMSU5FTk9TX1NJTVBMRTogL1xcc2xpbmVub3NcXHMvLFxuICBMSU5FTk9TX0NPTVBMSUNBVEU6IC9cXHNsaW5lbm9zOih0cnVlfGZhbHNlfCgtezAsMX1cXGQrKSlcXHMvLFxuICBISUdITElHSFQ6IC9cXHNoaWdobGlnaHQ6KD86JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTEFOR1VBR0VfRlJPTV9DTEFTUzogL15sYW5ndWFnZS0oXFx3KykkLyxcbiAgTEFOR1VBR0VfU0lNUExFOiAvXFxzbGFuZ3VhZ2VcXHMvLFxuICBMQU5HVUFHRV9DT01QTElDQVRFOiAvXFxzbGFuZ3VhZ2U6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgQ09QWUJUTl9TSU1QTEU6IC9cXHNjb3B5YnRuXFxzLyxcbiAgQ09QWUJUTl9DT01QTElDQVRFOiAvXFxzY29weWJ0bjoodHJ1ZXxmYWxzZSlcXHMvLFxuICBSRVNVTFQ6IC9eYGBgcmVzdWx0XFxzLyxcbiAgUFJPTVBUX1NJTVBMRTogL1xcc3Byb21wdFxccy8sXG4gIFBST01QVF9DT01QTElDQVRFOiAvXFxzcHJvbXB0Oih0cnVlfGZhbHNlfCcoLio/KSd8XCIoLio/KVwiKVxccy8sXG59XG5cbmZ1bmN0aW9uIGdldE1ldGEodmlldzogTWFya2Rvd25WaWV3LCBlbGVtX2NvZGU6IEhUTUxFbGVtZW50LCBzZWN0aW9uX2NvZGU6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncyk6IHtcbiAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGlzQ29sbGFwc2libGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBmaXJzdGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKHNlY3Rpb25fY29kZS5saW5lU3RhcnQpICsgXCIgXCI7IC8vIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgdG8gbWFrZSBzdXJlIHRoZSByZWdleCB3b3Jrc1xuXG4gIC8vIHRpdGxlXG4gIGxldCBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHRpdGxlID0gXCJcIjtcbiAgY29uc3QgcmVnZXhSZXN1bHRfdGl0bGUgPSBSRUdFWC5USVRMRS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF90aXRsZSkge1xuICAgIHNob3dUaXRsZSA9IHRydWU7XG4gICAgdGl0bGUgPSByZWdleFJlc3VsdF90aXRsZVsxXSB8fCByZWdleFJlc3VsdF90aXRsZVsyXTtcbiAgfVxuXG4gIC8vIGNvbGxhcHNpYmxlXG4gIGxldCBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlU2ltcGxlID0gUkVHRVguQ09MTEFQU0lCTEVfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlID0gUkVHRVguQ09MTEFQU0lCTEVfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSkge1xuICAgIGlzQ29sbGFwc2libGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBpc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBpc0NvbGxhcHNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbGluZW5vc1xuICBsZXQgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGxpbmVub3NTdGFydCA9IHNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQ7XG4gIGNvbnN0IGxpbmVub3NOdW0gPSBzZWN0aW9uX2NvZGUubGluZUVuZCAtIHNlY3Rpb25fY29kZS5saW5lU3RhcnQgLSAxO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlID0gUkVHRVguTElORU5PU19TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSA9IFJFR0VYLkxJTkVOT1NfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlKSB7XG4gICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgc2hvd0xpbmVub3MgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICAgICAgbGluZW5vc1N0YXJ0ID0gcGFyc2VJbnQocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMl0pIHx8IDE7XG4gICAgfVxuICB9XG5cbiAgLy8gaGlnaGxpZ2h0XG4gIGxldCBzaG93SGlnaGxpZ2h0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBoaWdobGlnaHRMaW5lczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0ID0gUkVHRVguSElHSExJR0hULmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2hpZ2hsaWdodCkge1xuICAgIHNob3dIaWdobGlnaHQgPSB0cnVlO1xuICAgIGNvbnN0IGhpZ2hsaWdodExpbmVzX3N0ciA9IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodFsxXSB8fCByZWdleFJlc3VsdF9oaWdobGlnaHRbMl07XG4gICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lc19zdHIuc3BsaXQoXCIsXCIpLm1hcCgobGluZSkgPT4gcGFyc2VJbnQobGluZSkpO1xuXG4gICAgaWYgKGhpZ2hsaWdodExpbmVzLnNvbWUoKGxpbmUpID0+IGlzTmFOKGxpbmUpKSkge1xuICAgICAgLy8gaWYgYW55IGVsZW1lbnQgaXMgbmFuLCB0aGVuIHNldCBzaG93SGlnaGxpZ2h0IHRvIGZhbHNlXG4gICAgICBzaG93SGlnaGxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIG9ubHkgdmFsaWQgbGluZSBudW1iZXJzXG4gICAgICBoaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSA+PSBsaW5lbm9zU3RhcnQgJiYgbGluZSA8IGxpbmVub3NTdGFydCArIGxpbmVub3NOdW0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxhbmd1YWdlXG4gIGxldCBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGxhbmd1YWdlID0gKCgpID0+IHtcbiAgICBsZXQgbGFuZ3VhZ2UgPSBzZXR0aW5ncy5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgZWxlbV9jb2RlLmNsYXNzTGlzdC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzID0gUkVHRVguTEFOR1VBR0VfRlJPTV9DTEFTUy5leGVjKGNsYXNzTmFtZS50cmltKCkpO1xuICAgICAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzKSBsYW5ndWFnZSA9IHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzWzFdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmd1YWdlO1xuICB9KSgpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZVNpbXBsZSA9IFJFR0VYLkxBTkdVQUdFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZSA9IFJFR0VYLkxBTkdVQUdFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUpIHtcbiAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICAgICAgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMl0gfHwgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvcHkgYnV0dG9uXG4gIGxldCBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBjb25zdCByZWdleFJlc3VsdF9jb3B5QnRuU2ltcGxlID0gUkVHRVguQ09QWUJUTl9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSA9IFJFR0VYLkNPUFlCVE5fQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuU2ltcGxlKSB7XG4gICAgc2hvd0NvcHlCdG4gPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0NvcHlCdG4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgc2hvd0NvcHlCdG4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9tcHRcbiAgbGV0IHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSA9IFJFR0VYLlBST01QVF9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0U2ltcGxlKSB7XG4gICAgc2hvd1Byb21wdCA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd1Byb21wdCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1Byb21wdCA9IHRydWU7XG4gICAgICBwcm9tcHQgPSByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbM107XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzdWx0XG4gIGxldCBpc1Jlc3VsdCA9IGZhbHNlO1xuICBsZXQgcmVzdWx0UHJvbXB0ID0gc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcmVzdWx0ID0gUkVHRVguUkVTVUxULmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0ID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcmVzdWx0KSB7XG4gICAgaXNSZXN1bHQgPSB0cnVlO1xuXG4gICAgLy8gb3ZlcnJpZGUgb3RoZXIgbWV0YSBkYXRhIDogb25seSBsaW5lbm9zLCBoaWdobGlnaHQgYXJlIGF2YWlsYWJsZVxuICAgIHNob3dUaXRsZSA9IGZhbHNlO1xuICAgIHNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgc2hvd1Byb21wdCA9IGZhbHNlO1xuXG4gICAgaWYgKHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCkge1xuICAgICAgcmVzdWx0UHJvbXB0ID0gcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0WzJdIHx8IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFszXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgIHRpdGxlOiB0aXRsZSxcbiAgICBpc0NvbGxhcHNpYmxlOiBpc0NvbGxhcHNpYmxlLFxuICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtOiBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZTogc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgaXNSZXN1bHQ6IGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgcHJvbXB0OiBwcm9tcHRcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEhLQ29kZUJsb2NrUHJvY2Vzc29yKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIHBsdWdpbjogSEtDb2RlQmxvY2tQbHVnaW5cbikge1xuICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblxuICBjb25zdCB2aWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmICghdmlldykgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fY29kZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbC5xdWVyeVNlbGVjdG9yKFwicHJlOm5vdCguZnJvbnRtYXR0ZXIpID4gY29kZVwiKTtcbiAgaWYgKCFlbGVtX2NvZGUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX3ByZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX2NvZGUucGFyZW50RWxlbWVudDtcbiAgaWYgKCFlbGVtX3ByZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fZGl2OiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fcHJlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9kaXYpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvcHlCdG46IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9kaXYucXVlcnlTZWxlY3RvcihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xuICBpZiAoIWVsZW1fY29weUJ0bikgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25fY29kZTogKE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHwgbnVsbCkgPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1fY29kZSk7XG4gIGlmICghc2VjdGlvbl9jb2RlKSByZXR1cm47XG5cbiAgLy8gZ2V0IG1ldGFkYXRhXG4gIGNvbnN0IHtcbiAgICBzaG93VGl0bGUsXG4gICAgdGl0bGUsXG4gICAgaXNDb2xsYXBzaWJsZSxcbiAgICBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQsXG4gICAgbGluZW5vc051bSxcbiAgICBzaG93SGlnaGxpZ2h0LFxuICAgIGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZSxcbiAgICBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bixcbiAgICBpc1Jlc3VsdCxcbiAgICByZXN1bHRQcm9tcHQsXG4gICAgc2hvd1Byb21wdCxcbiAgICBwcm9tcHRcbiAgfSA9IGdldE1ldGEodmlldywgZWxlbV9jb2RlLCBzZWN0aW9uX2NvZGUsIHNldHRpbmdzKTtcblxuICBpZiAoc2V0dGluZ3MuZGVidWdNb2RlKSB7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9KVxuICB9XG5cbiAgLy8gY3JlYXRlIEhUTUwgZWxlbWVudHNcbiAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9ja1wiKTtcbiAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29kZVwiKTtcbiAgZWxlbV9jb3B5QnRuLnJlbW92ZSgpOyAvLyByZW1vdmUgdGhlIG9yaWdpbmFsIGNvcHkgYnV0dG9uIGFzIGRlZmF1bHRcblxuICBsZXQgZWxlbV90aXRsZTogKEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgaWYgKHNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd1RpdGxlID09PSB0cnVlKSkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy10aXRsZVwiKTtcblxuICAgIGVsZW1fdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVsZW1fdGl0bGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay10aXRsZVwiKTtcbiAgICBlbGVtX3RpdGxlLmlubmVySFRNTCA9IHRpdGxlO1xuICAgIGVsZW1fZGl2Lmluc2VydEJlZm9yZShlbGVtX3RpdGxlLCBlbGVtX3ByZSk7XG4gIH1cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKGlzQ29sbGFwc2libGUgPT09IHVuZGVmaW5lZCB8fCBpc0NvbGxhcHNpYmxlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChpc0NvbGxhcHNpYmxlID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzaWJsZVwiKTtcblxuICAgIGlmIChzZXR0aW5ncy5kZWZhdWx0Q29sbGFwc2UgPT09IFwiY29sbGFwc2VcIikge1xuICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1fdGl0bGUpIHtcbiAgICAgIGVsZW1fdGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGVsZW1fZGl2LmNsYXNzTGlzdC5jb250YWlucyhcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIikpIHtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG5zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuc1wiKTtcblxuICAgICAgY29uc3QgZWxlbV9jb2xsYXBzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRuLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuXCIsIFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZC1idG5cIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRuLmlubmVySFRNTCA9IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTAgMTlhMSAxIDAgMCAxLS42NC0uMjMgMSAxIDAgMCAxLS4xMy0xLjQxTDEzLjcxIDEyIDkuMzkgNi42M2ExIDEgMCAwIDEgLjE1LTEuNDEgMSAxIDAgMCAxIDEuNDYuMTVsNC44MyA2YTEgMSAwIDAgMSAwIDEuMjdsLTUgNkExIDEgMCAwIDEgMTAgMTl6XCIvPlxuICAgICAgPC9zdmc+YDtcbiAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmFwcGVuZENoaWxkKGVsZW1fY29sbGFwc2VCdG4pO1xuXG4gICAgICBjb25zdCBlbGVtX2V4cGFuZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2V4cGFuZEJ0bi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0blwiLCBcImhrLWNvZGVibG9jay1leHBhbmRlZC1idG5cIik7XG4gICAgICBlbGVtX2V4cGFuZEJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDE2YTEgMSAwIDAgMS0uNjQtLjIzbC02LTVhMSAxIDAgMSAxIDEuMjgtMS41NEwxMiAxMy43MWw1LjM2LTQuMzJhMSAxIDAgMCAxIDEuNDEuMTUgMSAxIDAgMCAxLS4xNCAxLjQ2bC02IDQuODNBMSAxIDAgMCAxIDEyIDE2elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2V4cGFuZEJ0bik7XG5cbiAgICAgIGVsZW1fdGl0bGUucHJlcGVuZChlbGVtX2NvbGxhcHNlQnRucyk7XG4gICAgfVxuICB9XG5cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdW5kZWZpbmVkIHx8IHNob3dMaW5lbm9zID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMaW5lbm9zID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWxpbmVub3NcIik7XG5cbiAgICBjb25zdCBlbGVtX2xpbmVub3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxpbmVub3NcIik7XG4gICAgZWxlbV9saW5lbm9zLmlubmVyVGV4dCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IGlkeCArIGxpbmVub3NTdGFydCkuam9pbihcIlxcblwiKTtcbiAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9saW5lbm9zLCBlbGVtX2NvZGUpO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpIHtcbiAgICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwic2hvdy1zcGxpdHRlclwiKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0hpZ2hsaWdodCA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0XCIpO1xuXG4gICAgZWxlbV9kaXYuc3R5bGUuc2V0UHJvcGVydHkoXCItLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvclwiLCBzZXR0aW5ncy5oaWdobGlnaHRDb2xvcik7XG5cbiAgICBjb25zdCBlbGVtX2hpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICBjb25zdCBlbGVtX2xhbmd1YWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICBlbGVtX3ByZS5wcmVwZW5kKGVsZW1fbGFuZ3VhZ2UpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSAmJiAoc2hvd1Byb21wdCA9PT0gdW5kZWZpbmVkIHx8IHNob3dQcm9tcHQgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXByb21wdFwiKTtcblxuICAgIGNvbnN0IGVsZW1fcHJvbXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3Byb21wdC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXByb21wdFwiKTtcbiAgICBcbiAgICBjb25zdCBsaW5lcyA9IGVsZW1fY29kZS5pbm5lclRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgZWxlbV9wcm9tcHQuaW5uZXJUZXh0ID0gQXJyYXkobGluZW5vc051bSkuZmlsbCgwKS5tYXAoKF8sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2lkeF0udHJpbSgpO1xuICAgICAgY29uc3QgcHJldkxpbmUgPSBpZHggPiAwID8gbGluZXNbaWR4IC0gMV0udHJpbSgpOiBcIlwiO1xuXG4gICAgICBpZiAoXG4gICAgICAgIChsaW5lID09PSBcIlwiKSB8fCAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBlbXB0eVxuICAgICAgICAobGluZS5zdGFydHNXaXRoKFwiI1wiKSkgfHwgLy8gY2hlY2sgaWYgdGhlIGxpbmUgaXMgYSBjb21tZW50XG4gICAgICAgIChwcmV2TGluZS5lbmRzV2l0aChcIlxcXFxcIikpIC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGEgY29udGludWF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lXG4gICAgICApIHsgXG4gICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9tcHQ7XG4gICAgfSkuam9pbihcIlxcblwiKTtcblxuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX3Byb21wdCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy51c2VSZXN1bHRHbG9iYWwgPT09IFwiZW5hYmxlXCIgJiYgKGlzUmVzdWx0ID09PSB0cnVlKSkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcmVzdWx0XCIpO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlXCIpO1xuXG4gICAgZWxlbV9kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1yZXN1bHQtcHJvbXB0XCIsIHJlc3VsdFByb21wdCk7XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUEsbUJBQWtDOzs7QUM2QjNCLElBQU0sbUJBQXdDO0FBQUEsRUFDcEQsZ0JBQWdCO0FBQUEsRUFFaEIsc0JBQXNCO0FBQUEsRUFDdEIsaUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFFakIsa0JBQWtCO0FBQUEsRUFDbEIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFFckIsb0JBQW9CO0FBQUEsRUFDcEIsZ0JBQWdCO0FBQUEsRUFFaEIsbUJBQW1CO0FBQUEsRUFDbkIsaUJBQWlCO0FBQUEsRUFFakIsa0JBQWtCO0FBQUEsRUFFbEIsaUJBQWlCO0FBQUEsRUFDakIsb0JBQW9CLENBQUMsTUFBTTtBQUFBLEVBQzNCLGVBQWU7QUFB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UyxjQUFjLEtBQUs7QUFDaEQsZ0JBQVksVUFBVSxJQUFJLHFCQUFxQjtBQUUvQyxVQUFNLFFBQVEsVUFBVSxVQUFVLE1BQU0sSUFBSTtBQUM1QyxnQkFBWSxZQUFZLE1BQU0sVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLFFBQVE7QUFDaEUsWUFBTSxPQUFPLE1BQU0sR0FBRyxFQUFFLEtBQUs7QUFDN0IsWUFBTSxXQUFXLE1BQU0sSUFBSSxNQUFNLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBRztBQUVsRCxVQUNHLFNBQVM7QUFBQSxNQUNULEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDbkIsU0FBUyxTQUFTLElBQUksR0FDdkI7QUFDQSxlQUFPLElBQUksT0FBTyxPQUFPLE1BQU07QUFBQSxNQUNqQztBQUVBLGFBQU87QUFBQSxJQUNULENBQUMsRUFBRSxLQUFLLElBQUk7QUFFWixhQUFTLGFBQWEsYUFBYSxTQUFTO0FBQUEsRUFDOUM7QUFFQSxNQUFJLFNBQVMsb0JBQW9CLFlBQWEsYUFBYSxNQUFPO0FBQ2hFLGFBQVMsVUFBVSxJQUFJLHFCQUFxQjtBQUM1QyxjQUFVLFVBQVUsSUFBSSwwQkFBMEI7QUFFbEQsYUFBUyxhQUFhLHNCQUFzQixZQUFZO0FBQUEsRUFDMUQ7QUFDRjs7O0FIcFpBLElBQXFCLG9CQUFyQixjQUErQyx3QkFBTztBQUFBLEVBR3JELE1BQU0sU0FBUztBQUNkLFVBQU0sS0FBSyxhQUFhO0FBQ3hCLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDRCQUE0QjtBQUFBLElBQ3pDO0FBR0EsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFHNUQsVUFBTSxZQUFZLEtBQUssOEJBQThCLENBQUMsSUFBSSxRQUFRO0FBQ2pFLDJCQUFxQixJQUFJLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUM7QUFFRCxjQUFVLFlBQVk7QUFBQSxFQUN2QjtBQUFBLEVBRUEsV0FBVztBQUNWLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDhCQUE4QjtBQUFBLElBQzNDO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDMUU7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNsQztBQUNEOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgImltcG9ydF9vYnNpZGlhbiIsICJsYW5ndWFnZSJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiwgbG9hZFByaXNtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vSEtDb2RlQmxvY2tTZXR0aW5ncyc7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ1RhYic7XG5pbXBvcnQgeyBIS0NvZGVCbG9ja1Byb2Nlc3NvciB9IGZyb20gJy4vSEtDb2RlQmxvY2tQcm9jZXNzb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIS0NvZGVCbG9ja1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnTW9kZSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJsb2FkaW5nIEhLQ29kZUJsb2NrIHBsdWdpblwiKTtcblx0XHR9XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdHByb21wdGluZ0xhbmd1YWdlczogc3RyaW5nW107XG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IHN0cmluZztcblxuXHRkZWJ1Z01vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBIS0NvZGVCbG9ja1NldHRpbmdzID0ge1xuXHR1c2VUaXRsZUdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlQ29sbGFwc2libGVHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0Q29sbGFwc2U6IFwiZXhwYW5kXCIsXG5cdHNob3dDb2xsYXBzZUJ0bjogdHJ1ZSxcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0ZGVmYXVsdExpbmVub3NTdGFydDogMSxcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogdHJ1ZSxcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRoaWdobGlnaHRDb2xvcjogXCIjZmYwMDAwXCIsXG5cblx0dXNlTGFuZ3VhZ2VHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGFuZ3VhZ2U6IFwicGxhaW4gdGV4dFwiLFxuXG5cdHVzZUNvcHlCdG5HbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZVByb21wdEdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdHByb21wdGluZ0xhbmd1YWdlczogW1wiYmFzaFwiXSxcblx0ZGVmYXVsdFByb21wdDogXCIkXCIsXG5cblx0dXNlUmVzdWx0R2xvYmFsOiBcImVuYWJsZVwiLFxuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBcIlJlc3VsdFwiLFxuXG5cdGRlYnVnTW9kZTogZmFsc2UsXG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBjb25zdCBmcmFnV2l0aEhUTUwgPSAodGV4dDogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4ge1xuXHRcdGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKFwiPGJyPlwiKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gdGl0bGVcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaXRsZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgVGl0bGUnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIHRpdGxlIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdGl0bGUgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIHRpdGxlIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUaXRsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBjb2xsYXBzZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvbGxhcHNlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb2xsYXBzZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgYWx3YXlzIGJlIGNvbGxhcHNpYmxlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZSwgYnV0IHdpbGwgbm90IGJlIGNvbGxhcHNlZCBpZiBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY29sbGFwc2libGUgaWYgdGhlIGNvbGxhcHNlIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBuZXZlciBiZSBjb2xsYXBzaWJsZWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWUgYXMgKFwiY29sbGFwc2VcIiB8IFwiZXhwYW5kXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIG51bWJlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIE51bWJlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgTnVtYmVycycpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgbGluZW5vcyBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMaW5lIE51bWJlciBTdGFydCcpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGluZSBudW1iZXIgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihudW0pKSByZXR1cm47XG5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQgPSBudW07XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Nob3cgTGluZSBOdW1iZXIgU3BsaXR0ZXInKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGluZSBoaWdobGlnaHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIEhpZ2hsaWdodCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBIaWdobGlnaHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lIGhpZ2hsaWdodCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGFuZ3VhZ2UnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUgb2YgdGhlIGNvZGUgYmxvY2sgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzcGVjaWZpZWQuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Ly8gY29weSBidXR0b25cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb3B5IEJ1dHRvbicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29weSBCdXR0b24nKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgY29weSBidXR0b24gc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gcHJvbXB0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUHJvbXB0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBQcm9tcHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd25cblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogcHJvbXB0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJlbmFibGVcIjogXCJlbmFibGVcIixcblx0XHRcdFx0XHRcImRpc2FibGVcIjogXCJkaXNhYmxlXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9IHZhbHVlIGFzIChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBSZXN1bHQgUHJvbXB0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIlRoZSBkZWZhdWx0IHByb21wdCBvZiB0aGUgcmVzdWx0IGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBmb3IgZGV2ZWxvcGVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0RldmVsb3BlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWcgTW9kZScpXG5cdFx0XHQuc2V0RGVzYygnU2hvdyBsb2dzIGluIHRoZSBjb25zb2xlLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59IiwgImltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSBcIi4vSEtDb2RlQmxvY2tTZXR0aW5nc1wiO1xuXG5jb25zdCBSRUdFWCA9IHtcbiAgVElUTEU6IC9cXHN0aXRsZTooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT0xMQVBTSUJMRV9TSU1QTEU6IC9cXHNjb2xsYXBzaWJsZVxccy8sXG4gIENPTExBUFNJQkxFX0NPTVBMSUNBVEU6IC9cXHNjb2xsYXBzaWJsZToodHJ1ZXxmYWxzZSlcXHMvLFxuICBMSU5FTk9TX1NJTVBMRTogL1xcc2xpbmVub3NcXHMvLFxuICBMSU5FTk9TX0NPTVBMSUNBVEU6IC9cXHNsaW5lbm9zOih0cnVlfGZhbHNlfCgtezAsMX1cXGQrKSlcXHMvLFxuICBISUdITElHSFQ6IC9cXHNoaWdobGlnaHQ6KD86JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTEFOR1VBR0VfRlJPTV9DTEFTUzogL15sYW5ndWFnZS0oXFx3KykkLyxcbiAgTEFOR1VBR0VfU0lNUExFOiAvXFxzbGFuZ3VhZ2VcXHMvLFxuICBMQU5HVUFHRV9DT01QTElDQVRFOiAvXFxzbGFuZ3VhZ2U6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgQ09QWUJUTl9TSU1QTEU6IC9cXHNjb3B5YnRuXFxzLyxcbiAgQ09QWUJUTl9DT01QTElDQVRFOiAvXFxzY29weWJ0bjoodHJ1ZXxmYWxzZSlcXHMvLFxuICBSRVNVTFQ6IC9eYGBgcmVzdWx0XFxzLyxcbiAgUFJPTVBUX1NJTVBMRTogL1xcc3Byb21wdFxccy8sXG4gIFBST01QVF9DT01QTElDQVRFOiAvXFxzcHJvbXB0Oih0cnVlfGZhbHNlfCcoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIE5VTUJFUjogL14tezAsMX1cXGQrJC8sXG59XG5cbmZ1bmN0aW9uIGdldE1ldGEodmlldzogTWFya2Rvd25WaWV3LCBlbGVtX2NvZGU6IEhUTUxFbGVtZW50LCBzZWN0aW9uX2NvZGU6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncyk6IHtcbiAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGlzQ29sbGFwc2libGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBsaW5lU3RhcnQgPSAoKCkgPT4ge1xuICAgIGZvcihsZXQgaSA9IHNlY3Rpb25fY29kZS5saW5lU3RhcnQ7IGkgPD0gc2VjdGlvbl9jb2RlLmxpbmVFbmQ7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUoaSk7XG4gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChcImBgYFwiKSkgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9KSgpO1xuXG4gIGNvbnN0IGxpbmVFbmQgPSAoKCkgPT4ge1xuICAgIGZvcihsZXQgaSA9IHNlY3Rpb25fY29kZS5saW5lRW5kOyBpID49IHNlY3Rpb25fY29kZS5saW5lU3RhcnQ7IGktLSkge1xuICAgICAgY29uc3QgbGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUoaSk7XG4gICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChcImBgYFwiKSkgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9KSgpO1xuXG4gIGlmIChsaW5lU3RhcnQgPCAwIHx8IGxpbmVFbmQgPCAwIHx8IGxpbmVTdGFydCA+PSBsaW5lRW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmUgb3IgdGhlIGxhc3QgbGluZSBvZiB0aGUgY29kZSBibG9ja1wiKTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0bGluZSA9IHZpZXcuZWRpdG9yLmdldExpbmUobGluZVN0YXJ0KSArIFwiIFwiOyAvLyBhZGQgYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lIHRvIG1ha2Ugc3VyZSB0aGUgcmVnZXggd29ya3NcblxuICAvLyB0aXRsZVxuICBsZXQgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCB0aXRsZSA9IFwiXCI7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3RpdGxlID0gUkVHRVguVElUTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfdGl0bGUpIHtcbiAgICBzaG93VGl0bGUgPSB0cnVlO1xuICAgIHRpdGxlID0gcmVnZXhSZXN1bHRfdGl0bGVbMV0gfHwgcmVnZXhSZXN1bHRfdGl0bGVbMl07XG4gIH1cblxuICAvLyBjb2xsYXBzaWJsZVxuICBsZXQgaXNDb2xsYXBzaWJsZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBjb25zdCByZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSA9IFJFR0VYLkNPTExBUFNJQkxFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZSA9IFJFR0VYLkNPTExBUFNJQkxFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVTaW1wbGUpIHtcbiAgICBpc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgaXNDb2xsYXBzaWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgaXNDb2xsYXBzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxpbmVub3NcbiAgbGV0IHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsaW5lbm9zU3RhcnQgPSBzZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0O1xuICBjb25zdCBsaW5lbm9zTnVtID0gbGluZUVuZCAtIGxpbmVTdGFydCAtIDE7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUgPSBSRUdFWC5MSU5FTk9TX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlID0gUkVHRVguTElORU5PU19DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NTaW1wbGUpIHtcbiAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGluZW5vcyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93TGluZW5vcyA9IHRydWU7XG4gICAgICBsaW5lbm9zU3RhcnQgPSBwYXJzZUludChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsyXSkgfHwgMTtcbiAgICB9XG4gIH1cblxuICAvLyBoaWdobGlnaHRcbiAgbGV0IHNob3dIaWdobGlnaHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCByZWdleFJlc3VsdF9oaWdobGlnaHQgPSBSRUdFWC5ISUdITElHSFQuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfaGlnaGxpZ2h0KSB7XG4gICAgc2hvd0hpZ2hsaWdodCA9IHRydWU7XG4gICAgY29uc3QgaGlnaGxpZ2h0TGluZXNfc3RyID0gcmVnZXhSZXN1bHRfaGlnaGxpZ2h0WzFdIHx8IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodFsyXTtcbiAgICBoaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzX3N0ci5zcGxpdChcIixcIikubWFwKChpdGVtKSA9PiB7XG4gICAgICBpdGVtID0gaXRlbS50cmltKCk7XG5cbiAgICAgIGlmIChSRUdFWC5OVU1CRVIudGVzdChpdGVtKSkgcmV0dXJuIHBhcnNlSW50KGl0ZW0pO1xuXG4gICAgICBjb25zdCBtdWx0aXBsZV9saW5lcyA9IGl0ZW0uc3BsaXQoXCItXCIpO1xuICAgICAgaWYgKG11bHRpcGxlX2xpbmVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzBdLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHBhcnNlSW50KG11bHRpcGxlX2xpbmVzWzFdLnRyaW0oKSk7XG5cbiAgICAgICAgaWYgKCFpc05hTihzdGFydCkgJiYgIWlzTmFOKGVuZCkpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sIChfLCBpKSA9PiBpICsgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOYU47XG4gICAgfSkuZmxhdCgpLmZpbHRlcigoaXRlbSkgPT4gIWlzTmFOKGl0ZW0pKTtcblxuICAgIGlmIChoaWdobGlnaHRMaW5lcy5zb21lKChsaW5lKSA9PiBpc05hTihsaW5lKSkpIHtcbiAgICAgIC8vIGlmIGFueSBlbGVtZW50IGlzIG5hbiwgdGhlbiBzZXQgc2hvd0hpZ2hsaWdodCB0byBmYWxzZVxuICAgICAgc2hvd0hpZ2hsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgIGhpZ2hsaWdodExpbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBvbmx5IHZhbGlkIGxpbmUgbnVtYmVyc1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgPj0gbGluZW5vc1N0YXJ0ICYmIGxpbmUgPCBsaW5lbm9zU3RhcnQgKyBsaW5lbm9zTnVtKTtcbiAgICB9XG4gIH1cblxuICAvLyBsYW5ndWFnZVxuICBsZXQgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsYW5ndWFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IGxhbmd1YWdlID0gc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcyA9IFJFR0VYLkxBTkdVQUdFX0ZST01fQ0xBU1MuZXhlYyhjbGFzc05hbWUudHJpbSgpKTtcbiAgICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcykgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzc1sxXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ndWFnZTtcbiAgfSkoKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUgPSBSRUdFWC5MQU5HVUFHRV9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUgPSBSRUdFWC5MQU5HVUFHRV9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlU2ltcGxlKSB7XG4gICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICAgIGxhbmd1YWdlID0gcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVszXTtcbiAgICB9XG4gIH1cblxuICAvLyBjb3B5IGJ1dHRvblxuICBsZXQgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSA9IFJFR0VYLkNPUFlCVE5fU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUgPSBSRUdFWC5DT1BZQlROX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSkge1xuICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJvbXB0XG4gIGxldCBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBwcm9tcHQgPSBzZXR0aW5ncy5kZWZhdWx0UHJvbXB0O1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRTaW1wbGUgPSBSRUdFWC5QUk9NUFRfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSkge1xuICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgICAgcHJvbXB0ID0gcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsyXSB8fCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3VsdFxuICBsZXQgaXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IHJlc3VsdFByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Jlc3VsdCA9IFJFR0VYLlJFU1VMVC5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Jlc3VsdCkge1xuICAgIGlzUmVzdWx0ID0gdHJ1ZTtcblxuICAgIC8vIG92ZXJyaWRlIG90aGVyIG1ldGEgZGF0YSA6IG9ubHkgbGluZW5vcywgaGlnaGxpZ2h0IGFyZSBhdmFpbGFibGVcbiAgICBzaG93VGl0bGUgPSBmYWxzZTtcbiAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICBzaG93Q29weUJ0biA9IGZhbHNlO1xuICAgIHNob3dQcm9tcHQgPSBmYWxzZTtcblxuICAgIGlmIChyZWdleFJlc3VsdFByb21wdF9yZXN1bHQpIHtcbiAgICAgIHJlc3VsdFByb21wdCA9IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFsyXSB8fCByZWdleFJlc3VsdFByb21wdF9yZXN1bHRbM107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICB0aXRsZTogdGl0bGUsXG4gICAgaXNDb2xsYXBzaWJsZTogaXNDb2xsYXBzaWJsZSxcbiAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgbGluZW5vc1N0YXJ0OiBsaW5lbm9zU3RhcnQsXG4gICAgbGluZW5vc051bTogbGluZW5vc051bSxcbiAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgIGhpZ2hsaWdodExpbmVzOiBoaWdobGlnaHRMaW5lcyxcbiAgICBzaG93TGFuZ3VhZ2U6IHNob3dMYW5ndWFnZSxcbiAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgc2hvd0NvcHlCdG46IHNob3dDb3B5QnRuLFxuICAgIGlzUmVzdWx0OiBpc1Jlc3VsdCxcbiAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICBzaG93UHJvbXB0OiBzaG93UHJvbXB0LFxuICAgIHByb21wdDogcHJvbXB0XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBIS0NvZGVCbG9ja1Byb2Nlc3NvcihcbiAgZWw6IEhUTUxFbGVtZW50LFxuICBjb250ZXh0OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LFxuICBwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luXG4pIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwbHVnaW4uc2V0dGluZ3M7XG5cbiAgY29uc3QgdmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICBpZiAoIXZpZXcpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvZGU6IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWwucXVlcnlTZWxlY3RvcihcInByZTpub3QoLmZyb250bWF0dGVyKSA+IGNvZGVcIik7IC8vIHNraXAgZnJvbnQgbWF0dGVyXG4gIGlmICghZWxlbV9jb2RlKSByZXR1cm47XG5cbiAgY29uc3QgZWxlbV9wcmU6IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9jb2RlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9wcmUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2RpdjogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX3ByZS5wYXJlbnRFbGVtZW50O1xuICBpZiAoIWVsZW1fZGl2KSByZXR1cm47XG5cbiAgY29uc3QgZWxlbV9jb3B5QnRuOiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuY29weS1jb2RlLWJ1dHRvblwiKTtcbiAgaWYgKCFlbGVtX2NvcHlCdG4pIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9uX2NvZGU6IChNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB8IG51bGwpID0gY29udGV4dC5nZXRTZWN0aW9uSW5mbyhlbGVtX2NvZGUpO1xuICBpZiAoIXNlY3Rpb25fY29kZSkgcmV0dXJuO1xuXG4gIC8vIGdldCBtZXRhZGF0YVxuICBsZXQgXG4gICAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsaW5lbm9zU3RhcnQ6IG51bWJlcixcbiAgICBsaW5lbm9zTnVtOiBudW1iZXIsXG4gICAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIGhpZ2hsaWdodExpbmVzOiBudW1iZXJbXSxcbiAgICBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgIHNob3dDb3B5QnRuOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gICAgaXNSZXN1bHQ6IGJvb2xlYW4sXG4gICAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gICAgc2hvd1Byb21wdDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICAgIHByb21wdDogc3RyaW5nO1xuICB0cnkge1xuICAgICh7XG4gICAgICBzaG93VGl0bGU6IHNob3dUaXRsZSxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIGlzQ29sbGFwc2libGU6IGlzQ29sbGFwc2libGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9ID0gZ2V0TWV0YSh2aWV3LCBlbGVtX2NvZGUsIHNlY3Rpb25fY29kZSwgc2V0dGluZ3MpKTtcbiAgICBcbiAgICBpZiAoc2V0dGluZ3MuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgIGlzQ29sbGFwc2libGU6IGlzQ29sbGFwc2libGUsXG4gICAgICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICAgICAgbGluZW5vc1N0YXJ0OiBsaW5lbm9zU3RhcnQsXG4gICAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgICAgIGhpZ2hsaWdodExpbmVzOiBoaWdobGlnaHRMaW5lcyxcbiAgICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgc2hvd0NvcHlCdG46IHNob3dDb3B5QnRuLFxuICAgICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgICAgICBzaG93UHJvbXB0OiBzaG93UHJvbXB0LFxuICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgIH0pXG4gICAgfVxuICB9IGNhdGNoIChlKSB7IC8vIGlmIGNhbm5vdCBmaW5kIG1ldGFkYXRhLCBza2lwIHRoaXMgY29kZSBibG9ja1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBIVE1MIGVsZW1lbnRzXG4gIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2tcIik7XG4gIGVsZW1fY29kZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvZGVcIik7XG4gIGVsZW1fY29weUJ0bi5yZW1vdmUoKTsgLy8gcmVtb3ZlIHRoZSBvcmlnaW5hbCBjb3B5IGJ1dHRvbiBhcyBkZWZhdWx0XG5cbiAgbGV0IGVsZW1fdGl0bGU6IChIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGlmIChzZXR0aW5ncy51c2VUaXRsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dUaXRsZSA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctdGl0bGVcIik7XG5cbiAgICBlbGVtX3RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3RpdGxlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stdGl0bGVcIik7XG4gICAgZWxlbV90aXRsZS5pbm5lckhUTUwgPSB0aXRsZTtcbiAgICBlbGVtX2Rpdi5pbnNlcnRCZWZvcmUoZWxlbV90aXRsZSwgZWxlbV9wcmUpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAoc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChpc0NvbGxhcHNpYmxlID09PSB1bmRlZmluZWQgfHwgaXNDb2xsYXBzaWJsZSA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoaXNDb2xsYXBzaWJsZSA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2libGVcIik7XG5cbiAgICBpZiAoc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID09PSBcImNvbGxhcHNlXCIpIHtcbiAgICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2VkXCIpO1xuICAgIH1cblxuICAgIGlmIChlbGVtX3RpdGxlKSB7XG4gICAgICBlbGVtX3RpdGxlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXYpID0+IHtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChlbGVtX2Rpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJoay1jb2RlYmxvY2stY29sbGFwc2VkXCIpKSB7XG4gICAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LnJlbW92ZShcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbGVtX2NvbGxhcHNlQnRucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0bnNcIik7XG5cbiAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0blwiLCBcImhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuXCIpO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEwIDE5YTEgMSAwIDAgMS0uNjQtLjIzIDEgMSAwIDAgMS0uMTMtMS40MUwxMy43MSAxMiA5LjM5IDYuNjNhMSAxIDAgMCAxIC4xNS0xLjQxIDEgMSAwIDAgMSAxLjQ2LjE1bDQuODMgNmExIDEgMCAwIDEgMCAxLjI3bC01IDZBMSAxIDAgMCAxIDEwIDE5elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2NvbGxhcHNlQnRuKTtcblxuICAgICAgY29uc3QgZWxlbV9leHBhbmRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbV9leHBhbmRCdG4uY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5cIiwgXCJoay1jb2RlYmxvY2stZXhwYW5kZWQtYnRuXCIpO1xuICAgICAgZWxlbV9leHBhbmRCdG4uaW5uZXJIVE1MID0gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxNmExIDEgMCAwIDEtLjY0LS4yM2wtNi01YTEgMSAwIDEgMSAxLjI4LTEuNTRMMTIgMTMuNzFsNS4zNi00LjMyYTEgMSAwIDAgMSAxLjQxLjE1IDEgMSAwIDAgMS0uMTQgMS40NmwtNiA0LjgzQTEgMSAwIDAgMSAxMiAxNnpcIi8+XG4gICAgICA8L3N2Zz5gO1xuICAgICAgZWxlbV9jb2xsYXBzZUJ0bnMuYXBwZW5kQ2hpbGQoZWxlbV9leHBhbmRCdG4pO1xuXG4gICAgICBlbGVtX3RpdGxlLnByZXBlbmQoZWxlbV9jb2xsYXBzZUJ0bnMpO1xuICAgIH1cbiAgfVxuXG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xpbmVub3MgPT09IHVuZGVmaW5lZCB8fCBzaG93TGluZW5vcyA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1saW5lbm9zXCIpO1xuXG4gICAgY29uc3QgZWxlbV9saW5lbm9zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1saW5lbm9zXCIpO1xuICAgIGVsZW1fbGluZW5vcy5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiBpZHggKyBsaW5lbm9zU3RhcnQpLmpvaW4oXCJcXG5cIik7XG4gICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fbGluZW5vcywgZWxlbV9jb2RlKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKSB7XG4gICAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcInNob3ctc3BsaXR0ZXJcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLnVzZUhpZ2hsaWdodEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dIaWdobGlnaHQgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodFwiKTtcblxuICAgIGVsZW1fZGl2LnN0eWxlLnNldFByb3BlcnR5KFwiLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3JcIiwgc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpO1xuXG4gICAgY29uc3QgZWxlbV9oaWdobGlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICBjb25zdCBlbGVtX2xhbmd1YWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICBlbGVtX3ByZS5wcmVwZW5kKGVsZW1fbGFuZ3VhZ2UpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSAmJiAoc2hvd1Byb21wdCA9PT0gdW5kZWZpbmVkIHx8IHNob3dQcm9tcHQgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXByb21wdFwiKTtcblxuICAgIGNvbnN0IGVsZW1fcHJvbXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX3Byb21wdC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXByb21wdFwiKTtcblxuICAgIGNvbnN0IGxpbmVzID0gZWxlbV9jb2RlLmlubmVyVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICBlbGVtX3Byb21wdC5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2lkeF0udHJpbSgpO1xuICAgICAgY29uc3QgcHJldkxpbmUgPSBpZHggPiAwID8gbGluZXNbaWR4IC0gMV0udHJpbSgpIDogXCJcIjtcblxuICAgICAgaWYgKFxuICAgICAgICAobGluZSA9PT0gXCJcIikgfHwgLy8gY2hlY2sgaWYgdGhlIGxpbmUgaXMgZW1wdHlcbiAgICAgICAgKGxpbmUuc3RhcnRzV2l0aChcIiNcIikpIHx8IC8vIGNoZWNrIGlmIHRoZSBsaW5lIGlzIGEgY29tbWVudFxuICAgICAgICAocHJldkxpbmUuZW5kc1dpdGgoXCJcXFxcXCIpKSAvLyBjaGVjayBpZiB0aGUgbGluZSBpcyBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9tcHQ7XG4gICAgfSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSBudWxsKS5qb2luKFwiXFxuXCIpO1xuXG4gICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fcHJvbXB0LCBlbGVtX2NvZGUpO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9PT0gXCJlbmFibGVcIiAmJiAoaXNSZXN1bHQgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHRcIik7XG4gICAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcmVzdWx0LWNvZGVcIik7XG5cbiAgICBlbGVtX2Rpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc3VsdC1wcm9tcHRcIiwgcmVzdWx0UHJvbXB0KTtcbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxt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YUFBYSxTQUFTO0FBQUEsRUFDOUM7QUFFQSxNQUFJLFNBQVMsb0JBQW9CLFlBQWEsYUFBYSxNQUFPO0FBQ2hFLGFBQVMsVUFBVSxJQUFJLHFCQUFxQjtBQUM1QyxjQUFVLFVBQVUsSUFBSSwwQkFBMEI7QUFFbEQsYUFBUyxhQUFhLHNCQUFzQixZQUFZO0FBQUEsRUFDMUQ7QUFDRjs7O0FIbGRBLElBQXFCLG9CQUFyQixjQUErQyx3QkFBTztBQUFBLEVBR3JELE1BQU0sU0FBUztBQUNkLFVBQU0sS0FBSyxhQUFhO0FBQ3hCLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDRCQUE0QjtBQUFBLElBQ3pDO0FBR0EsU0FBSyxjQUFjLElBQUksc0JBQXNCLEtBQUssS0FBSyxJQUFJLENBQUM7QUFHNUQsVUFBTSxZQUFZLEtBQUssOEJBQThCLENBQUMsSUFBSSxRQUFRO0FBQ2pFLDJCQUFxQixJQUFJLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUM7QUFFRCxjQUFVLFlBQVk7QUFBQSxFQUN2QjtBQUFBLEVBRUEsV0FBVztBQUNWLFFBQUksS0FBSyxTQUFTLFdBQVc7QUFDNUIsY0FBUSxJQUFJLDhCQUE4QjtBQUFBLElBQzNDO0FBQUEsRUFDRDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDMUU7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNsQztBQUNEOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgImltcG9ydF9vYnNpZGlhbiIsICJsYW5ndWFnZSJdCn0K diff --git a/dist/manifest.json b/dist/manifest.json index 8ef1140..bb14daf 100644 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -1,7 +1,7 @@ { "id": "hk-code-block", "name": "HK Code Block", - "version": "0.2.1", + "version": "0.3.0", "minAppVersion": "1.0.0", "description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view", "author": "Heekang Park", diff --git a/dist/styles.css b/dist/styles.css index 7918aa9..81124ed 100644 --- a/dist/styles.css +++ b/dist/styles.css @@ -1,7 +1,6 @@ /* src/styles.scss */ .hk-codeblock { position: relative; - background-color: var(--hk-codeblock-background-color); margin-bottom: var(--hk-codeblock-margin); } .hk-codeblock { @@ -36,6 +35,7 @@ white-space: pre; overflow-x: auto; padding: 0; + background-color: var(--hk-codeblock-background-color); } .hk-codeblock.hk-codeblock-show-title .hk-codeblock-title { padding-left: var(--hk-codeblock-horizontal-padding); @@ -60,9 +60,10 @@ display: inline-flex; align-items: center; justify-content: center; - margin-right: 4px; + 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: 16px; @@ -108,7 +109,7 @@ border-right: 1px solid var(--hk-codeblock-border-color); margin-right: 1em; } -.hk-codeblock.hk-codeblock-show-highlight pre code.hk-codeblock-highlight { +.hk-codeblock.hk-codeblock-show-highlight pre .hk-codeblock-highlight { display: flex; flex-direction: column; position: absolute; @@ -121,8 +122,11 @@ 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-font-size); + background-color: transparent; } -.hk-codeblock.hk-codeblock-show-highlight pre code.hk-codeblock-highlight .line.highlight { +.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 { @@ -180,4 +184,4 @@ .hk-codeblock + .hk-codeblock.hk-codeblock-result pre .hk-codeblock-result-code { color: var(--hk-codeblock-result-text-color); } -/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay1mb250LXNpemU6IHZhcigtLWNvZGUtc2l6ZSk7XG4gICAgLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcjogdmFyKC0tY29kZS1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250OiB2YXIoLS1mb250LW1vbm9zcGFjZSk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udDogdmFyKC0tZm9udC1tb25vc3BhY2UpO1xuICAgIC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLW1hcmdpbik7XG5cbiAgcHJlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG5cbiAgICBjb2RlLmhrLWNvZGVibG9jay1jb2RlIHtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG4gIH1cbn1cblxuLyogdGl0bGUgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctdGl0bGUge1xuICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWhrLWNvZGVibG9jay1ib3JkZXItY29sb3IpO1xuICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcik7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuXG4gIC5oay1jb2RlYmxvY2stdGl0bGV+cHJlIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8qIGNvbGxhcHNlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXRpdGxlLmhrLWNvZGVibG9jay1jb2xsYXBzaWJsZSB7XG4gIC5oay1jb2RlYmxvY2stdGl0bGUge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0bnMge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHRvcDogLTFweDtcblxuICAgICAgLmhrLWNvZGVibG9jay1jb2xsYXBzZS1idG4ge1xuICAgICAgICB3aWR0aDogMTZweDtcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xuXG4gICAgICAgIGZpbGw6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlOiB2YXIoLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcik7XG4gICAgICAgIHN0cm9rZS13aWR0aDogMjtcbiAgICAgICAgb3BhY2l0eTogMC4yO1xuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWNvbGxhcHNlZC1idG4ge1xuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuaGstY29kZWJsb2NrLWNvbGxhcHNlZCB7XG4gICAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgICBib3JkZXItYm90dG9tOiBub25lO1xuXG4gICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0bnMge1xuICAgICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0biB7XG4gICAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJi5oay1jb2RlYmxvY2stZXhwYW5kZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJlIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi8qIGxpbmVub3MgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctbGluZW5vcyB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1saW5lbm9zIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcik7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWhrLWNvZGVibG9jay1saW5lbm9zLXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICAgICYuc2hvdy1zcGxpdHRlciB7XG4gICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWhrLWNvZGVibG9jay1ib3JkZXItY29sb3IpO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaGlnaGxpZ2h0ICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodCB7XG4gIHByZSB7XG4gICAgY29kZS5oay1jb2RlYmxvY2staGlnaGxpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgb3BhY2l0eTogMC4yO1xuXG4gICAgICAubGluZS5oaWdobGlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBsYW5ndWFnZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZSB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBtYXJnaW46IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250KTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG59XG5cbi8qIHByb21wdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1wcm9tcHQge1xuICBwcmUge1xuICAgIC5oay1jb2RlYmxvY2stcHJvbXB0IHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMC44ZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3IpO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qIHJlc3VsdCAqL1xuLmhrLWNvZGVibG9jaysuaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1yZXN1bHQge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pICogKC0xKSk7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1yZXN1bHQtcHJvbXB0KTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yKTtcbiAgICBvcGFjaXR5OiAwLjY7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gIH1cblxuICBwcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAuaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQW9CRTtBQUNBO0FBQ0E7O0FBckJBO0FBRUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9GO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUNBOztBQU9KO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFNRjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTs7QUFHRjtBQUNFOztBQU9OO0FBQ0U7O0FBSUk7QUFDRTs7QUFHRjtBQUNFOztBQU1SO0FBQ0U7O0FBUUY7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTtBQUNBOztBQVNKO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7O0FBU0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHRjtBQUNFOztBQVFGO0FBQ0U7O0FBUUY7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTU47QUFDRTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHRjtBQUNFOztBQUVBO0FBQ0U7OyIsCiAgIm5hbWVzIjogW10KfQo= */ +/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay1mb250LXNpemU6IHZhcigtLWNvZGUtc2l6ZSk7XG4gICAgLS1oay1jb2RlYmxvY2stdGl0bGUtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcjogdmFyKC0tY29kZS1ub3JtYWwpO1xuICAgIC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250OiB2YXIoLS1mb250LW1vbm9zcGFjZSk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udDogdmFyKC0tZm9udC1tb25vc3BhY2UpO1xuICAgIC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pO1xuXG4gIHByZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuXG4gICAgY29kZS5oay1jb2RlYmxvY2stY29kZSB7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stYmFja2dyb3VuZC1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8qIHRpdGxlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXRpdGxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAuaGstY29kZWJsb2NrLXRpdGxlfnByZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4vKiBjb2xsYXBzZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy10aXRsZS5oay1jb2RlYmxvY2stY29sbGFwc2libGUge1xuICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgLmhrLWNvZGVibG9jay1jb2xsYXBzZS1idG5zIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB0b3A6IC0xcHg7XG4gICAgICBsZWZ0OiAtM3B4O1xuXG4gICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0biB7XG4gICAgICAgIHdpZHRoOiAxNnB4O1xuICAgICAgICBoZWlnaHQ6IDE2cHg7XG5cbiAgICAgICAgZmlsbDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuICAgICAgICBzdHJva2U6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyO1xuICAgICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkIHtcbiAgICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG5cbiAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRuIHtcbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLyogbGluZW5vcyAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1saW5lbm9zIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxpbmVub3Mge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBmbGV4LWdyb3c6IDA7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yKTtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1mb250KTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0taGstY29kZWJsb2NrLWZvbnQtc2l6ZSk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcblxuICAgICAgJi5zaG93LXNwbGl0dGVyIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBoaWdobGlnaHQgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0IHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWhpZ2hsaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWZvbnQpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stZm9udC1zaXplKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgICAubGluZS5oaWdobGlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBsYW5ndWFnZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZSB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBtYXJnaW46IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250KTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG59XG5cbi8qIHByb21wdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1wcm9tcHQge1xuICBwcmUge1xuICAgIC5oay1jb2RlYmxvY2stcHJvbXB0IHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgcGFkZGluZy1yaWdodDogMC44ZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtY29sb3IpO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stcHJvbXB0LXRleHQtZm9udCk7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1mb250LXNpemUpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbi8qIHJlc3VsdCAqL1xuLmhrLWNvZGVibG9jaysuaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1yZXN1bHQge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pICogKC0xKSk7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1yZXN1bHQtcHJvbXB0KTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yKTtcbiAgICBvcGFjaXR5OiAwLjY7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gIH1cblxuICBwcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAuaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQW9CRTtBQUNBOztBQXBCQTtBQUVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBOztBQU9KO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFNRjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQUdGO0FBQ0U7O0FBT047QUFDRTs7QUFJSTtBQUNFOztBQUdGO0FBQ0U7O0FBTVI7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7O0FBU0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdGO0FBQ0U7O0FBUUY7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFNTjtBQUNFO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdGO0FBQ0U7O0FBRUE7QUFDRTs7IiwKICAibmFtZXMiOiBbXQp9Cg== */ diff --git a/dist/versions.json b/dist/versions.json index 586b35b..841ea9b 100644 --- a/dist/versions.json +++ b/dist/versions.json @@ -1,5 +1,6 @@ { "0.1.0": "1.0.0", "0.2.0": "1.0.0", - "0.2.1": "1.0.0" + "0.2.1": "1.0.0", + "0.3.0": "1.0.0" } diff --git a/imgs/highlight1.png b/imgs/highlight1.png index 520d7466cec1abe6bc887801b33e33c0042ac2fa..59c82a0f1bcfae41b9bf00b9cb7cf5a74f762ace 100644 GIT binary patch literal 18701 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 q&_5G_K16xpp|V1r2!Mh>02$Ajgr zIs5cMbx@WPLn#?1-+3AUOhx6MBFZDM@AO|hjWKPdH62h;@H+l^P zjQnnQG|Vc_Z1`wqycN9wwxD<@OEhU#1)BHtQj8@k1KTI8q8t6}s+f*5eYKb#T6{G#%l;T^iX=9;(!1VrPFu$DpRmx{JA%#h^}y(@0}r za=#Q6lg>-WAQBV9m5d}HvS5P2BNfF7>EQ4;!EdSQCKLgf)am{-e1t`_;ler|WzaC0 zh#�!#y$epWo(^_=Y7#$ng0^xkw{y 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 { + for(let i = section_code.lineStart; i <= section_code.lineEnd; i++) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) return i; + } + + return -1; + })(); + + const lineEnd = (() => { + for(let i = section_code.lineEnd; i >= section_code.lineStart; i--) { + const line = view.editor.getLine(i); + if (line.trim().startsWith("```")) return i; + } + + return -1; + })(); + + if (lineStart < 0 || lineEnd < 0 || lineStart >= lineEnd) { + throw new Error("Cannot find the first line or the last line of the code block"); + } + + const firstline = view.editor.getLine(lineStart) + " "; // add a space to the end of the line to make sure the regex works // title let showTitle: (boolean | undefined) = undefined; @@ -66,7 +89,7 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd // linenos let showLinenos: (boolean | undefined) = undefined; let linenosStart = settings.defaultLinenosStart; - const linenosNum = section_code.lineEnd - section_code.lineStart - 1; + const linenosNum = lineEnd - lineStart - 1; const regexResult_linenosSimple = REGEX.LINENOS_SIMPLE.exec(firstline); const regexResult_linenosComplicate = REGEX.LINENOS_COMPLICATE.exec(firstline); if (regexResult_linenosSimple) { @@ -89,7 +112,23 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd if (regexResult_highlight) { showHighlight = true; const highlightLines_str = regexResult_highlight[1] || regexResult_highlight[2]; - highlightLines = highlightLines_str.split(",").map((line) => parseInt(line)); + 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))) { // if any element is nan, then set showHighlight to false @@ -207,7 +246,7 @@ export async function HKCodeBlockProcessor( const view = app.workspace.getActiveViewOfType(MarkdownView); if (!view) return; - const elem_code: (HTMLElement | null) = el.querySelector("pre:not(.frontmatter) > code"); + const elem_code: (HTMLElement | null) = el.querySelector("pre:not(.frontmatter) > code"); // skip front matter if (!elem_code) return; const elem_pre: (HTMLElement | null) = elem_code.parentElement; @@ -223,28 +262,27 @@ export async function HKCodeBlockProcessor( if (!section_code) return; // get metadata - const { - showTitle, - title, - isCollapsible, - showLinenos, - linenosStart, - linenosNum, - showHighlight, - highlightLines, - showLanguage, - language, - showCopyBtn, - isResult, - resultPrompt, - showPrompt, - prompt - } = getMeta(view, elem_code, section_code, settings); - - if (settings.debugMode) { - console.log({ + let + showTitle: (boolean | undefined), + title: string, + isCollapsible: (boolean | undefined), + showLinenos: (boolean | undefined), + linenosStart: number, + linenosNum: number, + showHighlight: (boolean | undefined), + highlightLines: number[], + showLanguage: (boolean | undefined), + language: string, + showCopyBtn: (boolean | undefined), + isResult: boolean, + resultPrompt: string, + showPrompt: (boolean | undefined), + prompt: string; + try { + ({ showTitle: showTitle, title: title, + isCollapsible: isCollapsible, showLinenos: showLinenos, linenosStart: linenosStart, linenosNum: linenosNum, @@ -257,7 +295,29 @@ export async function HKCodeBlockProcessor( resultPrompt: resultPrompt, showPrompt: showPrompt, prompt: prompt, - }) + } = getMeta(view, elem_code, section_code, settings)); + + if (settings.debugMode) { + console.log({ + showTitle: showTitle, + title: title, + isCollapsible: isCollapsible, + showLinenos: showLinenos, + linenosStart: linenosStart, + linenosNum: linenosNum, + showHighlight: showHighlight, + highlightLines: highlightLines, + showLanguage: showLanguage, + language: language, + showCopyBtn: showCopyBtn, + isResult: isResult, + resultPrompt: resultPrompt, + showPrompt: showPrompt, + prompt: prompt, + }) + } + } catch (e) { // if cannot find metadata, skip this code block + return; } // create HTML elements @@ -341,7 +401,7 @@ export async function HKCodeBlockProcessor( elem_div.style.setProperty("--hk-codeblock-highlight-background-color", settings.highlightColor); - const elem_highlight = document.createElement("code"); + const elem_highlight = document.createElement("div"); elem_highlight.classList.add("hk-codeblock-highlight"); elem_highlight.innerHTML = Array(linenosNum).fill(0).map((_, idx) => { const classNames: string[] = []; @@ -383,22 +443,24 @@ export async function HKCodeBlockProcessor( 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(): ""; + 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("\\")) // check if the line is a continuation of the previous line - ) { + ) { return " ".repeat(prompt.length); } return prompt; - }).join("\n"); + }).filter((line) => line !== null).join("\n"); elem_pre.insertBefore(elem_prompt, elem_code); } diff --git a/src/styles.scss b/src/styles.scss index b037747..7ca9cd7 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -19,7 +19,6 @@ } position: relative; - background-color: var(--hk-codeblock-background-color); margin-bottom: var(--hk-codeblock-margin); pre { @@ -37,6 +36,7 @@ white-space: pre; overflow-x: auto; padding: 0; + background-color: var(--hk-codeblock-background-color); } } } @@ -72,9 +72,10 @@ display: inline-flex; align-items: center; justify-content: center; - margin-right: 4px; + margin-right: 2px; position: relative; top: -1px; + left: -3px; .hk-codeblock-collapse-btn { width: 16px; @@ -147,7 +148,7 @@ /* highlight */ .hk-codeblock.hk-codeblock-show-highlight { pre { - code.hk-codeblock-highlight { + .hk-codeblock-highlight { display: flex; flex-direction: column; position: absolute; @@ -160,6 +161,9 @@ 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-font-size); + background-color: transparent; .line.highlight { background-color: var(--hk-codeblock-highlight-background-color); diff --git a/versions.json b/versions.json index 586b35b..841ea9b 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,6 @@ { "0.1.0": "1.0.0", "0.2.0": "1.0.0", - "0.2.1": "1.0.0" + "0.2.1": "1.0.0", + "0.3.0": "1.0.0" }