2712 lines
407 KiB
JavaScript
2712 lines
407 KiB
JavaScript
/*
|
||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||
if you want to view the source, please visit the github repository of this plugin
|
||
*/
|
||
|
||
var __defProp = Object.defineProperty;
|
||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||
var __export = (target, all) => {
|
||
for (var name in all)
|
||
__defProp(target, name, { get: all[name], enumerable: true });
|
||
};
|
||
var __copyProps = (to, from, except, desc) => {
|
||
if (from && typeof from === "object" || typeof from === "function") {
|
||
for (let key of __getOwnPropNames(from))
|
||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||
}
|
||
return to;
|
||
};
|
||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||
|
||
// src/main.ts
|
||
var main_exports = {};
|
||
__export(main_exports, {
|
||
default: () => EasyTypingPlugin
|
||
});
|
||
module.exports = __toCommonJS(main_exports);
|
||
var import_obsidian3 = require("obsidian");
|
||
var import_state = require("@codemirror/state");
|
||
|
||
// src/core.ts
|
||
var import_obsidian = require("obsidian");
|
||
|
||
// src/utils.ts
|
||
var DEBUG = true;
|
||
var print = (message, ...optionalParams) => {
|
||
if (DEBUG) {
|
||
console.log(message, ...optionalParams);
|
||
}
|
||
};
|
||
function offsetToPos(doc, offset) {
|
||
let line = doc.lineAt(offset);
|
||
return { line: line.number - 1, ch: offset - line.from };
|
||
}
|
||
function getTypeStrOfTransac(tr) {
|
||
let TransacTypeArray = [
|
||
"EasyTyping.change",
|
||
"input.type.compose",
|
||
"input.type",
|
||
"input.paste",
|
||
"input.drop",
|
||
"input.complete",
|
||
"input",
|
||
"delete.selection",
|
||
"delete.forward",
|
||
"delete.backward",
|
||
"delete.cut",
|
||
"delete",
|
||
"move.drop",
|
||
"undo",
|
||
"redo",
|
||
"select.pointer"
|
||
];
|
||
for (let i = 0; i < TransacTypeArray.length; i++) {
|
||
if (tr.isUserEvent(TransacTypeArray[i]))
|
||
return TransacTypeArray[i];
|
||
}
|
||
return "none";
|
||
}
|
||
function string2pairstring(s) {
|
||
let cursorIdx = s.indexOf("|");
|
||
let left = s.substring(0, cursorIdx);
|
||
let right = s.substring(cursorIdx + 1);
|
||
return { left, right };
|
||
}
|
||
function ruleStringList2RuleList(list) {
|
||
let res = [];
|
||
for (let i in list) {
|
||
res[i] = { before: string2pairstring(list[i][0]), after: string2pairstring(list[i][1]) };
|
||
}
|
||
return res;
|
||
}
|
||
function stringDeleteAt(str, index) {
|
||
return str.substring(0, index) + str.substring(index + 1);
|
||
}
|
||
function stringInsertAt(str, index, s) {
|
||
return str.substring(0, index) + s + str.substring(index);
|
||
}
|
||
function isParamDefined(param) {
|
||
return typeof param !== "undefined";
|
||
}
|
||
function showString(s) {
|
||
return s.replace(/\n/g, "\\n");
|
||
}
|
||
function getHiddenObsidianConfig(app) {
|
||
return app.vault.config;
|
||
}
|
||
var ObsidianSettings = class {
|
||
constructor(app) {
|
||
this.app = app;
|
||
}
|
||
isLegacyEditorEnabled() {
|
||
const config = {
|
||
legacyEditor: false,
|
||
...getHiddenObsidianConfig(this.app)
|
||
};
|
||
return config.legacyEditor;
|
||
}
|
||
isDefaultThemeEnabled() {
|
||
const config = {
|
||
cssTheme: "",
|
||
...getHiddenObsidianConfig(this.app)
|
||
};
|
||
return config.cssTheme === "";
|
||
}
|
||
getTabsSettings() {
|
||
return {
|
||
useTab: true,
|
||
tabSize: 4,
|
||
...getHiddenObsidianConfig(this.app)
|
||
};
|
||
}
|
||
getFoldSettings() {
|
||
return {
|
||
foldIndent: true,
|
||
...getHiddenObsidianConfig(this.app)
|
||
};
|
||
}
|
||
getDefaultIndentChars() {
|
||
const { useTab, tabSize } = this.getTabsSettings();
|
||
return useTab ? " " : new Array(tabSize).fill(" ").join("");
|
||
}
|
||
};
|
||
|
||
// src/core.ts
|
||
var import_language = require("@codemirror/language");
|
||
var LineFormater = class {
|
||
constructor() {
|
||
}
|
||
syntaxTreeNodeNameType(name) {
|
||
if (name.contains("code") && !name.contains("link")) {
|
||
return "code" /* code */;
|
||
} else if (name.contains("math")) {
|
||
return "formula" /* formula */;
|
||
} else {
|
||
return "text" /* text */;
|
||
}
|
||
}
|
||
parseLineWithSyntaxTree(state, lineNum, regRegExp) {
|
||
let linePartsOfTxtCodeFormula = [];
|
||
let line = state.doc.line(lineNum);
|
||
const tree = (0, import_language.syntaxTree)(state);
|
||
let pos = line.from;
|
||
let prevNodeType = "none" /* none */;
|
||
let prevBeginIdx = 0;
|
||
while (pos < line.to) {
|
||
let node = tree.resolve(pos, 1);
|
||
let curNodeType = this.syntaxTreeNodeNameType(node.name);
|
||
if (prevNodeType == "none" /* none */) {
|
||
prevNodeType = curNodeType;
|
||
prevBeginIdx = 0;
|
||
} else if (prevNodeType == curNodeType) {
|
||
} else {
|
||
linePartsOfTxtCodeFormula.push({
|
||
content: line.text.substring(prevBeginIdx, pos - line.from),
|
||
type: prevNodeType,
|
||
begin: prevBeginIdx,
|
||
end: pos - line.from,
|
||
leftSpaceRequire: 0 /* none */,
|
||
rightSpaceRequire: 0 /* none */
|
||
});
|
||
prevNodeType = curNodeType;
|
||
prevBeginIdx = pos - line.from;
|
||
}
|
||
if (curNodeType == "text" /* text */) {
|
||
pos++;
|
||
} else {
|
||
pos = node.to;
|
||
}
|
||
if (pos == line.to) {
|
||
linePartsOfTxtCodeFormula.push({
|
||
content: line.text.substring(prevBeginIdx, pos - line.from),
|
||
type: prevNodeType,
|
||
begin: prevBeginIdx,
|
||
end: pos - line.from,
|
||
leftSpaceRequire: 0 /* none */,
|
||
rightSpaceRequire: 0 /* none */
|
||
});
|
||
}
|
||
}
|
||
let retArray = [];
|
||
for (let i = 0; i < linePartsOfTxtCodeFormula.length; i++) {
|
||
if (linePartsOfTxtCodeFormula[i].type != "text" /* text */) {
|
||
retArray.push(linePartsOfTxtCodeFormula[i]);
|
||
} else {
|
||
let tempArray;
|
||
if (isParamDefined(regRegExp))
|
||
tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content, regRegExp);
|
||
else
|
||
tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content);
|
||
tempArray.forEach((item) => {
|
||
item.begin += linePartsOfTxtCodeFormula[i].begin;
|
||
item.end += linePartsOfTxtCodeFormula[i].begin;
|
||
retArray.push(item);
|
||
});
|
||
}
|
||
}
|
||
return retArray;
|
||
}
|
||
formatLineOfDoc(state, settings, fromB, toB, insertedStr) {
|
||
let doc = state.doc;
|
||
let line = doc.lineAt(fromB).text;
|
||
let res = null;
|
||
if (insertedStr.contains("\n")) {
|
||
res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, fromB).ch, offsetToPos(doc, fromB).ch);
|
||
} else {
|
||
res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, toB).ch, offsetToPos(doc, fromB).ch);
|
||
}
|
||
if (res === null || res[2].length == 0)
|
||
return null;
|
||
let newline = stringInsertAt(res[0], res[1], "|");
|
||
let changes = [];
|
||
let offset = doc.lineAt(fromB).from;
|
||
for (let changeItem of res[2]) {
|
||
changes.push({
|
||
changes: { from: offset + changeItem.begin, to: offset + changeItem.end, insert: changeItem.text },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
}
|
||
if (insertedStr.contains("\n")) {
|
||
console.log("insertStr", insertedStr);
|
||
res[1] += insertedStr.length;
|
||
}
|
||
return [changes, { selection: { anchor: offset + res[1] }, userEvent: "EasyTyping.change" }];
|
||
}
|
||
formatLine(state, lineNum, settings, curCh, prevCh) {
|
||
let line = state.doc.line(lineNum).text;
|
||
let regNull = /^\s*$/g;
|
||
if (regNull.test(line))
|
||
return [line, curCh, []];
|
||
let lineParts = settings.UserDefinedRegSwitch ? this.parseLineWithSyntaxTree(state, lineNum, settings.UserDefinedRegExp) : this.parseLineWithSyntaxTree(state, lineNum);
|
||
if (settings.debug)
|
||
console.log("line parts\n", lineParts);
|
||
let linePartsOrigin = JSON.parse(JSON.stringify(lineParts));
|
||
let inlineChangeList = [];
|
||
let cursorLinePartIndex = -1;
|
||
let cursorRelativeIndex = -1;
|
||
let resultCursorCh = 0;
|
||
for (let i = 0; i < lineParts.length; i++) {
|
||
if (curCh > lineParts[i].begin && curCh <= lineParts[i].end) {
|
||
cursorLinePartIndex = i;
|
||
cursorRelativeIndex = curCh - lineParts[i].begin;
|
||
if (lineParts[i].type === "text" /* text */) {
|
||
lineParts[i].content = stringInsertAt(lineParts[i].content, cursorRelativeIndex, "\0");
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
let resultLine = "";
|
||
let offset = 0;
|
||
let prevPartType = "none" /* none */;
|
||
let prevTextEndSpaceState = 0 /* none */;
|
||
for (let i = 0; i < lineParts.length; i++) {
|
||
if (i === 0 && lineParts[i].type === "text" /* text */ && settings.AutoCapital) {
|
||
if (isParamDefined(prevCh) && cursorLinePartIndex != 0) {
|
||
} else {
|
||
let regFirstSentence = /^\s*(\- (\[[x ]\] )?)?“?[a-z\u0401\u0451\u0410-\u044f]/g;
|
||
let regHeaderSentence = /^(#+ |>+ ?|“)[a-z\u0401\u0451\u0410-\u044f]/g;
|
||
let textcopy = lineParts[0].content;
|
||
let match = regFirstSentence.exec(textcopy);
|
||
let matchHeader = regHeaderSentence.exec(textcopy);
|
||
let dstCharIndex = -1;
|
||
if (match) {
|
||
dstCharIndex = regFirstSentence.lastIndex - 1;
|
||
} else if (matchHeader) {
|
||
dstCharIndex = regHeaderSentence.lastIndex - 1;
|
||
}
|
||
if (settings.AutoCapitalMode == "global" /* Globally */ || isParamDefined(prevCh) && dstCharIndex >= prevCh && dstCharIndex < curCh) {
|
||
} else {
|
||
dstCharIndex = -1;
|
||
}
|
||
if (dstCharIndex != -1) {
|
||
lineParts[0].content = textcopy.substring(0, dstCharIndex) + textcopy.charAt(dstCharIndex).toUpperCase() + textcopy.substring(dstCharIndex + 1);
|
||
}
|
||
}
|
||
}
|
||
switch (lineParts[i].type) {
|
||
case "text" /* text */:
|
||
let insertSpace = function(content2, reg2, prevCh2, curCh2, offset2) {
|
||
while (true) {
|
||
let match = reg2.exec(content2);
|
||
if (!match)
|
||
break;
|
||
let tempIndex = reg2.lastIndex - 1;
|
||
if (isParamDefined(prevCh2) && tempIndex >= prevCh2 - offset2 && tempIndex < curCh2 - offset2) {
|
||
content2 = content2.substring(0, tempIndex) + " " + content2.substring(tempIndex);
|
||
curCh2 += 1;
|
||
}
|
||
}
|
||
return [content2, curCh2];
|
||
};
|
||
let content = lineParts[i].content;
|
||
if (settings.AutoCapital) {
|
||
var reg = /[\.\?\!。!?]([\s]*)[a-z\u0401\u0451\u0410-\u044f]/g;
|
||
while (true) {
|
||
let match = reg.exec(content);
|
||
if (!match)
|
||
break;
|
||
let tempIndex = reg.lastIndex - 1;
|
||
let isSpaceDot = tempIndex - 2 < 0 || content.substring(tempIndex - 2, tempIndex) == " .";
|
||
if (settings.AutoCapitalMode == "global" /* Globally */ && !isSpaceDot) {
|
||
lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
|
||
content = lineParts[i].content;
|
||
} else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot) {
|
||
lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
|
||
content = lineParts[i].content;
|
||
}
|
||
}
|
||
}
|
||
if (settings.ChineseEnglishSpace) {
|
||
let reg1 = /([A-Za-z])([\u4e00-\u9fa5])/gi;
|
||
let reg2 = /([\u4e00-\u9fa5])([A-Za-z])/gi;
|
||
[content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
|
||
[content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
|
||
}
|
||
if (settings.ChineseNumberSpace) {
|
||
let reg2 = /([0-9])([\u4e00-\u9fa5])/g;
|
||
let reg1 = /([\u4e00-\u9fa5])([0-9])/g;
|
||
[content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
|
||
[content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
|
||
}
|
||
if (settings.EnglishNumberSpace) {
|
||
let reg2 = /([A-Za-z])(\d)/g;
|
||
let reg1 = /(\d)([A-Za-z])/g;
|
||
[content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
|
||
[content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
|
||
}
|
||
if (settings.ChineseNoSpace) {
|
||
let reg2 = /([\u4e00-\u9fa5,。、!;‘’《》]+)(\s+)([\u4e00-\u9fa5,。、!;‘’《》]+)/g;
|
||
while (reg2.exec(content)) {
|
||
lineParts[i].content = content.replace(reg2, "$1$3");
|
||
content = lineParts[i].content;
|
||
}
|
||
}
|
||
if (settings.PunctuationSpace) {
|
||
{
|
||
let reg2 = /([,\.;\?\!\)])([0-9A-Za-z\u0401\u0451\u0410-\u044f\u4e00-\u9fa5])|([A-Za-z0-9\u4e00-\u9fa5:,\.\?\!'"]+)(\()|[,\.;\?:!][\u4e00-\u9fa5]/gi;
|
||
while (true) {
|
||
let match = reg2.exec(content);
|
||
if (!match)
|
||
break;
|
||
let tempIndex = reg2.lastIndex - 1;
|
||
let isSpaceDot = "!.?;,".contains(content.charAt(tempIndex - 1)) && (tempIndex - 2 < 0 && i == 0 || content.charAt(tempIndex - 2) == " ");
|
||
let isNumPuncNum = /[,.]\d/.test(content.substring(tempIndex - 1, tempIndex + 1)) && (tempIndex - 2 < 0 || /\d/.test(content.charAt(tempIndex - 2)));
|
||
if (settings.PunctuationSpaceMode == "global" /* Globally */ && !isSpaceDot && !isNumPuncNum) {
|
||
content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
|
||
} else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot && !isNumPuncNum) {
|
||
content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
|
||
curCh += 1;
|
||
}
|
||
}
|
||
let reg22 = /(:)([A-Za-z0-9_]+[ ,\.\?\\\/;'",。?;‘“”’、\[\]\-\{\}])/gi;
|
||
lineParts[i].content = content.replace(reg22, "$1 $2");
|
||
content = lineParts[i].content;
|
||
let reg3 = /(:)(["'])/g;
|
||
lineParts[i].content = content.replace(reg3, "$1 $2");
|
||
content = lineParts[i].content;
|
||
}
|
||
}
|
||
let regStrictSpaceStart = /^\0?\s/;
|
||
let regStrictSpaceEnd = /\s\0?$/;
|
||
let regStartWithSpace = /^\0?[\s,\.;\?\!,。;》?::!~\*、()"”\[\]\)\{\}]/;
|
||
let regEndWithSpace = /[\s,。、:;?!()~\*"《“\[\]\(\{\}]\0?$/;
|
||
let txtStartSpaceSate = 0 /* none */;
|
||
let txtEndSpaceState = 0 /* none */;
|
||
if (regStartWithSpace.test(content) || content.startsWith("<br>")) {
|
||
if (regStrictSpaceStart.test(content))
|
||
txtStartSpaceSate = 2 /* strict */;
|
||
else
|
||
txtStartSpaceSate = 1 /* soft */;
|
||
}
|
||
if (regEndWithSpace.test(content) || content.endsWith("<br>")) {
|
||
if (regStrictSpaceEnd.test(content))
|
||
txtEndSpaceState = 2 /* strict */;
|
||
else
|
||
txtEndSpaceState = 1 /* soft */;
|
||
}
|
||
switch (prevPartType) {
|
||
case "none" /* none */:
|
||
break;
|
||
case "code" /* code */:
|
||
if (settings.InlineCodeSpaceMode > txtStartSpaceSate) {
|
||
lineParts[i].content = " " + content;
|
||
content = lineParts[i].content;
|
||
}
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (settings.InlineFormulaSpaceMode > txtStartSpaceSate) {
|
||
lineParts[i].content = " " + content;
|
||
content = lineParts[i].content;
|
||
}
|
||
break;
|
||
case "wikilink" /* wikilink */:
|
||
case "mdlink" /* mdlink */:
|
||
if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > txtStartSpaceSate) {
|
||
lineParts[i].content = " " + content;
|
||
content = lineParts[i].content;
|
||
} else if (settings.InlineLinkSmartSpace && txtStartSpaceSate == 0 /* none */) {
|
||
let charAtTextBegin = content.charAt(0);
|
||
let regMdLinkEnd = /\]/;
|
||
let charAtLinkEndIndex = lineParts[i - 1].content.search(regMdLinkEnd) - 1;
|
||
let charAtLinkEnd = lineParts[i - 1].content.charAt(charAtLinkEndIndex);
|
||
if (charAtLinkEnd === "[")
|
||
break;
|
||
let twoNeighborChars = charAtLinkEnd + charAtTextBegin;
|
||
let regNotNeedSpace = /[\u4e00-\u9fa5,。?:;”“’‘-)}][\u4e00-\u9fa5]/g;
|
||
if (!regNotNeedSpace.test(twoNeighborChars)) {
|
||
lineParts[i].content = " " + content;
|
||
content = lineParts[i].content;
|
||
}
|
||
}
|
||
break;
|
||
case "user-defined" /* user */:
|
||
if (lineParts[i - 1].rightSpaceRequire > txtStartSpaceSate) {
|
||
lineParts[i].content = " " + content;
|
||
content = lineParts[i].content;
|
||
}
|
||
break;
|
||
}
|
||
if (i === cursorLinePartIndex) {
|
||
let reg2 = "\0";
|
||
let n = content.search(reg2);
|
||
resultCursorCh = offset + n;
|
||
lineParts[i].content = stringDeleteAt(content, n);
|
||
}
|
||
resultLine += lineParts[i].content;
|
||
offset += lineParts[i].content.length;
|
||
prevPartType = "text" /* text */;
|
||
prevTextEndSpaceState = txtEndSpaceState;
|
||
break;
|
||
case "code" /* code */:
|
||
switch (prevPartType) {
|
||
case "none" /* none */:
|
||
break;
|
||
case "text" /* text */:
|
||
if (settings.InlineCodeSpaceMode > prevTextEndSpaceState) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "code" /* code */:
|
||
if (settings.InlineCodeSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "mdlink" /* mdlink */:
|
||
case "wikilink" /* wikilink */:
|
||
if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "user-defined" /* user */:
|
||
if (settings.InlineCodeSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
}
|
||
if (i === cursorLinePartIndex) {
|
||
resultCursorCh = offset + cursorRelativeIndex;
|
||
}
|
||
resultLine += lineParts[i].content;
|
||
offset += lineParts[i].content.length;
|
||
prevPartType = "code" /* code */;
|
||
prevTextEndSpaceState = 0 /* none */;
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (lineParts[i].content == "$\\qquad$") {
|
||
prevPartType = "text" /* text */;
|
||
prevTextEndSpaceState = 2 /* strict */;
|
||
break;
|
||
}
|
||
switch (prevPartType) {
|
||
case "none" /* none */:
|
||
break;
|
||
case "text" /* text */:
|
||
if (settings.InlineFormulaSpaceMode > prevTextEndSpaceState) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "code" /* code */:
|
||
if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (settings.InlineCodeSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "mdlink" /* mdlink */:
|
||
case "wikilink" /* wikilink */:
|
||
if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "user-defined" /* user */:
|
||
if (settings.InlineFormulaSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
}
|
||
if (i === cursorLinePartIndex) {
|
||
resultCursorCh = offset + cursorRelativeIndex;
|
||
}
|
||
resultLine += lineParts[i].content;
|
||
offset += lineParts[i].content.length;
|
||
prevPartType = "formula" /* formula */;
|
||
prevTextEndSpaceState = 0 /* none */;
|
||
break;
|
||
case "mdlink" /* mdlink */:
|
||
case "wikilink" /* wikilink */:
|
||
switch (prevPartType) {
|
||
case "none" /* none */:
|
||
break;
|
||
case "text" /* text */:
|
||
if (prevTextEndSpaceState > settings.InlineLinkSpaceMode)
|
||
break;
|
||
if (settings.InlineLinkSpaceMode == 2 /* strict */ && prevTextEndSpaceState < 2 /* strict */) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
} else if (settings.InlineLinkSmartSpace && prevTextEndSpaceState == 0 /* none */) {
|
||
let regNoNeedSpace = /[\u4e00-\u9fa5][\u4e00-\u9fa5]/g;
|
||
let charAtTextEnd = lineParts[i - 1].content.charAt(lineParts[i - 1].content.length - 1);
|
||
let charAtLinkBegin = "";
|
||
if (lineParts[i].type == "wikilink" /* wikilink */) {
|
||
let regAlias = /\|/;
|
||
let charOfAliasBegin = lineParts[i].content.search(regAlias);
|
||
let beginIndex = 2;
|
||
if (lineParts[i].content.charAt(0) === "!")
|
||
beginIndex = 3;
|
||
if (charOfAliasBegin != -1) {
|
||
beginIndex = charOfAliasBegin + 1;
|
||
} else if (lineParts[i].content.charAt(beginIndex) == "#") {
|
||
beginIndex += 1;
|
||
}
|
||
charAtLinkBegin = lineParts[i].content.charAt(beginIndex);
|
||
if (charAtLinkBegin == "]")
|
||
break;
|
||
} else {
|
||
let regMdLinkBegin = /\[/;
|
||
let charAtLinkBeginIndex = lineParts[i].content.search(regMdLinkBegin) + 1;
|
||
charAtLinkBegin = lineParts[i].content.charAt(charAtLinkBeginIndex);
|
||
if (charAtLinkBegin === "]")
|
||
break;
|
||
}
|
||
let twoNeighborChars = charAtTextEnd + charAtLinkBegin;
|
||
if (!regNoNeedSpace.test(twoNeighborChars)) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
} else if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > prevTextEndSpaceState) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "code" /* code */:
|
||
if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "mdlink" /* mdlink */:
|
||
case "wikilink" /* wikilink */:
|
||
if (settings.InlineLinkSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "user-defined" /* user */:
|
||
if (lineParts[i - 1].rightSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
}
|
||
if (i === cursorLinePartIndex) {
|
||
resultCursorCh = offset + cursorRelativeIndex;
|
||
}
|
||
resultLine += lineParts[i].content;
|
||
offset += lineParts[i].content.length;
|
||
prevPartType = lineParts[i].type;
|
||
prevTextEndSpaceState = 0 /* none */;
|
||
break;
|
||
case "user-defined" /* user */:
|
||
switch (prevPartType) {
|
||
case "none" /* none */:
|
||
break;
|
||
case "text" /* text */:
|
||
if (lineParts[i].leftSpaceRequire > prevTextEndSpaceState) {
|
||
lineParts[i - 1].content += " ";
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "code" /* code */:
|
||
if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineCodeSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "formula" /* formula */:
|
||
if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineFormulaSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "mdlink" /* mdlink */:
|
||
case "wikilink" /* wikilink */:
|
||
if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
case "user-defined" /* user */:
|
||
if (lineParts[i].leftSpaceRequire > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
|
||
inlineChangeList.push({
|
||
text: " ",
|
||
begin: lineParts[i].begin,
|
||
end: lineParts[i].begin,
|
||
origin: ""
|
||
});
|
||
resultLine += " ";
|
||
offset += 1;
|
||
}
|
||
break;
|
||
}
|
||
if (i === cursorLinePartIndex) {
|
||
resultCursorCh = offset + cursorRelativeIndex;
|
||
}
|
||
resultLine += lineParts[i].content;
|
||
offset += lineParts[i].content.length;
|
||
prevPartType = "user-defined" /* user */;
|
||
prevTextEndSpaceState = 0 /* none */;
|
||
break;
|
||
}
|
||
}
|
||
for (let i = 0; i < lineParts.length; i++) {
|
||
if (lineParts[i].type === "text" /* text */ && lineParts[i].content != linePartsOrigin[i].content) {
|
||
inlineChangeList.push({
|
||
text: lineParts[i].content,
|
||
begin: linePartsOrigin[i].begin,
|
||
end: linePartsOrigin[i].end,
|
||
origin: linePartsOrigin[i].content
|
||
});
|
||
}
|
||
}
|
||
inlineChangeList = inlineChangeList.sort((a, b) => a.begin - b.begin);
|
||
return [resultLine, resultCursorCh, inlineChangeList];
|
||
}
|
||
};
|
||
function matchWithReg(text, regExp, type, inlineTypeArray, checkArray = false, leftSpaceRe = 0 /* none */, rightSpaceRe = 0 /* none */) {
|
||
let retArray = inlineTypeArray;
|
||
let matchArray = [];
|
||
retArray = retArray.sort((a, b) => a.begin - b.begin);
|
||
while (true) {
|
||
let match = regExp.exec(text);
|
||
if (!match)
|
||
break;
|
||
let valid = true;
|
||
if (checkArray) {
|
||
for (let i = 0; i < retArray.length; i++) {
|
||
if (regExp.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
|
||
valid = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (!valid)
|
||
continue;
|
||
matchArray.push({
|
||
content: match[0],
|
||
type,
|
||
begin: match.index,
|
||
end: regExp.lastIndex,
|
||
leftSpaceRequire: leftSpaceRe,
|
||
rightSpaceRequire: rightSpaceRe
|
||
});
|
||
}
|
||
retArray = retArray.concat(matchArray);
|
||
return retArray;
|
||
}
|
||
function matchWithAbbr(text, type, inlineTypeArray, checkArray = false) {
|
||
let retArray = inlineTypeArray;
|
||
let matchArray = [];
|
||
retArray = retArray.sort((a, b) => a.begin - b.begin);
|
||
let regAbbr = /([a-zA-Z]\.)+/g;
|
||
while (true) {
|
||
let match = regAbbr.exec(text);
|
||
if (!match)
|
||
break;
|
||
let valid = true;
|
||
let isInBlockBegin = match.index == 0;
|
||
if (checkArray) {
|
||
for (let i = 0; i < retArray.length; i++) {
|
||
if (match.index == retArray[i].end) {
|
||
isInBlockBegin = true;
|
||
}
|
||
if (regAbbr.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
|
||
valid = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (!isInBlockBegin && valid) {
|
||
let regChar = /[a-zA-Z0-9]/;
|
||
if (regChar.test(text.charAt(match.index - 1))) {
|
||
valid = false;
|
||
}
|
||
}
|
||
if (!valid)
|
||
continue;
|
||
matchArray.push({
|
||
content: match[0],
|
||
type,
|
||
begin: match.index,
|
||
end: regAbbr.lastIndex,
|
||
leftSpaceRequire: 0 /* none */,
|
||
rightSpaceRequire: 0 /* none */
|
||
});
|
||
}
|
||
retArray = retArray.concat(matchArray);
|
||
return retArray;
|
||
}
|
||
function splitTextWithLinkAndUserDefined(text, regExps) {
|
||
let retArray = [];
|
||
let regWikiLink = /\!{0,2}\[\[[^\[\]]*?\]\]/g;
|
||
let regMdLink = /\!{0,2}\[[^\[\]]*?\]\([^\s\)\(\[\]\{\}']*\)/g;
|
||
retArray = matchWithReg(text, regWikiLink, "wikilink" /* wikilink */, retArray);
|
||
retArray = matchWithReg(text, regMdLink, "mdlink" /* mdlink */, retArray);
|
||
let regExpList = [];
|
||
let leftSRequireList = [];
|
||
let rightSRequireList = [];
|
||
let regNull = /^\s*$/g;
|
||
let regSRequire = /\|[\-=\+][\-=\+]$/;
|
||
if (regExps) {
|
||
let regs = regExps.split("\n");
|
||
for (let i = 0; i < regs.length; i++) {
|
||
if (regNull.test(regs[i]))
|
||
continue;
|
||
if (!regSRequire.test(regs[i]) || regs[i].length <= 3) {
|
||
new import_obsidian.Notice("EasyTyping: \u7B2C" + String(i) + "\u884C\u81EA\u5B9A\u4E49\u6B63\u5219\u4E0D\u7B26\u5408\u89C4\u8303\n" + regs[i]);
|
||
continue;
|
||
}
|
||
let regItem = regs[i].substring(0, regs[i].length - 3);
|
||
let spaceReqString = regs[i].substring(regs[i].length - 3);
|
||
let isValidReg = true;
|
||
try {
|
||
let regTemp = new RegExp(regItem, "g");
|
||
} catch (error) {
|
||
isValidReg = false;
|
||
if (this.settings.debug) {
|
||
new import_obsidian.Notice("EasuTyping: Bad RegExp:\n" + regItem);
|
||
}
|
||
}
|
||
if (isValidReg) {
|
||
regExpList.push(new RegExp(regItem, "g"));
|
||
leftSRequireList.push(str2SpaceState(spaceReqString.charAt(1)));
|
||
rightSRequireList.push(str2SpaceState(spaceReqString.charAt(2)));
|
||
}
|
||
}
|
||
let regLen = regExpList.length;
|
||
for (let i = 0; i < regLen; i++) {
|
||
retArray = matchWithReg(text, regExpList[i], "user-defined" /* user */, retArray, true, leftSRequireList[i], rightSRequireList[i]);
|
||
}
|
||
}
|
||
retArray = matchWithReg(text, /\d{1,2}:\d{1,2}(:\d{0,2}){0,1}/g, "user-defined" /* user */, retArray, true, 1 /* soft */, 0 /* none */);
|
||
retArray = matchWithAbbr(text, "user-defined" /* user */, retArray, true);
|
||
retArray = retArray.sort((a, b) => a.begin - b.begin);
|
||
let textArray = [];
|
||
let textBegin = 0;
|
||
let textEnd = 0;
|
||
for (let i = 0; i < retArray.length; i++) {
|
||
if (textBegin < retArray[i].begin) {
|
||
textEnd = retArray[i].begin;
|
||
textArray.push({
|
||
content: text.substring(textBegin, textEnd),
|
||
type: "text" /* text */,
|
||
begin: textBegin,
|
||
end: textEnd,
|
||
leftSpaceRequire: 0 /* none */,
|
||
rightSpaceRequire: 0 /* none */
|
||
});
|
||
}
|
||
textBegin = retArray[i].end;
|
||
}
|
||
if (textBegin != text.length) {
|
||
textArray.push({
|
||
content: text.substring(textBegin, text.length),
|
||
type: "text" /* text */,
|
||
begin: textBegin,
|
||
end: text.length,
|
||
leftSpaceRequire: 0 /* none */,
|
||
rightSpaceRequire: 0 /* none */
|
||
});
|
||
}
|
||
retArray = retArray.concat(textArray);
|
||
retArray = retArray.sort((a, b) => a.begin - b.begin);
|
||
return retArray;
|
||
}
|
||
function str2SpaceState(s) {
|
||
switch (s) {
|
||
case "+":
|
||
return 2 /* strict */;
|
||
case "=":
|
||
return 1 /* soft */;
|
||
case "-":
|
||
default:
|
||
return 0 /* none */;
|
||
}
|
||
}
|
||
function string2SpaceState(s) {
|
||
if (Number(s) == 0 /* none */)
|
||
return 0 /* none */;
|
||
if (Number(s) == 1 /* soft */)
|
||
return 1 /* soft */;
|
||
if (Number(s) == 2 /* strict */)
|
||
return 2 /* strict */;
|
||
return 0 /* none */;
|
||
}
|
||
function getPosLineType(state, pos) {
|
||
const line = state.doc.lineAt(pos);
|
||
let line_number = line.number;
|
||
const tree = (0, import_language.syntaxTree)(state);
|
||
const token = tree.resolve(line.from, 1).name;
|
||
if (token.contains("table")) {
|
||
return "table" /* table */;
|
||
}
|
||
if (token.contains("hmd-frontmatter")) {
|
||
return "frontmatter" /* frontmatter */;
|
||
}
|
||
if (token.contains("math")) {
|
||
for (let p = line.from + 1; p < line.to; p += 1) {
|
||
if (!tree.resolve(p, 1).name.contains("math")) {
|
||
return "text" /* text */;
|
||
}
|
||
}
|
||
return "formula" /* formula */;
|
||
} else if (token.contains("code") && token.contains("block")) {
|
||
for (let p = line.from + 1; p < line.to; p += 1) {
|
||
let t = tree.resolve(p, 1).name;
|
||
if (!(t.contains("code") && t.contains("block"))) {
|
||
return "text" /* text */;
|
||
}
|
||
}
|
||
return "codeblock" /* codeblock */;
|
||
} else if (token.contains("quote") && !token.contains("callout")) {
|
||
let callout_start_line = -1;
|
||
for (let l = line_number - 1; l >= 1; l -= 1) {
|
||
let l_line = state.doc.line(l);
|
||
let l_token = tree.resolve(l_line.from, 1).name;
|
||
if (!l_token.contains("quote")) {
|
||
break;
|
||
}
|
||
if (l_token.contains("callout")) {
|
||
callout_start_line = l;
|
||
break;
|
||
}
|
||
}
|
||
if (callout_start_line == -1)
|
||
return "text" /* text */;
|
||
let is_code_block = false;
|
||
let reg_code_begin = /^>+ ```/;
|
||
let reg_code_end = /^>+ ```$/;
|
||
for (let l = callout_start_line + 1; l <= line_number; l += 1) {
|
||
let l_line = state.doc.line(l);
|
||
if (is_code_block && reg_code_end.test(l_line.text)) {
|
||
is_code_block = false;
|
||
} else if (!is_code_block && reg_code_begin.test(l_line.text)) {
|
||
is_code_block = true;
|
||
}
|
||
}
|
||
if (is_code_block) {
|
||
return "codeblock" /* codeblock */;
|
||
} else
|
||
return "text" /* text */;
|
||
}
|
||
return "text" /* text */;
|
||
}
|
||
function getPosLineType2(state, pos) {
|
||
const line = state.doc.lineAt(pos);
|
||
const tree = (0, import_language.syntaxTree)(state);
|
||
const token = tree.resolve(line.from, 1).name;
|
||
if (token.contains("hmd-frontmatter")) {
|
||
return "frontmatter" /* frontmatter */;
|
||
}
|
||
if (token.contains("math")) {
|
||
for (let p = line.from + 1; p < line.to; p += 1) {
|
||
if (!tree.resolve(p, 1).name.contains("math")) {
|
||
return "text" /* text */;
|
||
}
|
||
}
|
||
return "formula" /* formula */;
|
||
} else if (token.contains("code") && token.contains("block")) {
|
||
for (let p = line.from + 1; p < line.to; p += 1) {
|
||
let t = tree.resolve(p, 1).name;
|
||
if (!(t.contains("code") && t.contains("block"))) {
|
||
return "text" /* text */;
|
||
}
|
||
}
|
||
return "codeblock" /* codeblock */;
|
||
}
|
||
for (let p = line.from; p < line.to; p += 1) {
|
||
if (tree.resolve(p, 1).name.contains("list")) {
|
||
return "list" /* list */;
|
||
} else if (tree.resolve(p, 1).name.contains("callout")) {
|
||
return "callout_title" /* callout_title */;
|
||
}
|
||
}
|
||
if (token.contains("quote")) {
|
||
return "quote" /* quote */;
|
||
}
|
||
return "text" /* text */;
|
||
}
|
||
|
||
// src/settings.ts
|
||
var import_obsidian2 = require("obsidian");
|
||
var DEFAULT_SETTINGS = {
|
||
Tabout: true,
|
||
SelectionEnhance: true,
|
||
IntrinsicSymbolPairs: true,
|
||
BaseObEditEnhance: true,
|
||
FW2HWEnhance: true,
|
||
AutoFormat: true,
|
||
ExcludeFiles: "",
|
||
ChineseEnglishSpace: true,
|
||
ChineseNumberSpace: true,
|
||
EnglishNumberSpace: true,
|
||
ChineseNoSpace: true,
|
||
PunctuationSpace: true,
|
||
AutoCapital: true,
|
||
AutoCapitalMode: "typing" /* OnlyWhenTyping */,
|
||
PunctuationSpaceMode: "typing" /* OnlyWhenTyping */,
|
||
InlineCodeSpaceMode: 1 /* soft */,
|
||
InlineFormulaSpaceMode: 1 /* soft */,
|
||
InlineLinkSpaceMode: 1 /* soft */,
|
||
InlineLinkSmartSpace: true,
|
||
UserDefinedRegSwitch: true,
|
||
UserDefinedRegExp: "{{.*?}}|++\n<.*?>|--\n\\[\\!.*?\\][-+]{0,1}|-+\n(file:///|https?://|ftp://|obsidian://|zotero://|www.)[^\\s\uFF08\uFF09\u300A\u300B\u3002,\uFF0C\uFF01\uFF1F;\uFF1B\uFF1A\u201C\u201D\u2018\u2019\\)\\(\\[\\]\\{\\}']+|--\n\n[a-zA-Z0-9_\\-.]+@[a-zA-Z0-9_\\-.]+|++\n(?<!#)#[\\u4e00-\\u9fa5\\w-\\/]+|++",
|
||
debug: false,
|
||
userSelRepRuleTrigger: ["-", "#"],
|
||
userSelRepRuleValue: [{ left: "~~", right: "~~" }, { left: "#", right: " " }],
|
||
userDeleteRulesStrList: [["demo|", "|"]],
|
||
userConvertRulesStrList: [[":)|", "\u{1F600}|"]],
|
||
userSelRuleSettingsOpen: true,
|
||
userDelRuleSettingsOpen: true,
|
||
userCvtRuleSettingsOpen: true,
|
||
EnterTwice: false,
|
||
TryFixChineseIM: true,
|
||
PuncRectify: false,
|
||
FixMacOSContextMenu: false,
|
||
TryFixMSIME: false
|
||
};
|
||
var EasyTypingSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||
constructor(app, plugin) {
|
||
super(app, plugin);
|
||
this.plugin = plugin;
|
||
}
|
||
display() {
|
||
const { containerEl } = this;
|
||
containerEl.empty();
|
||
containerEl.createEl("h1", { text: "Obsidian EasyTyping Plugin" });
|
||
containerEl.createEl("p", { text: "More detail is in Github: " }).createEl("a", {
|
||
text: "easy-typing-obsidian",
|
||
href: "https://github.com/Yaozhuwa/easy-typing-obsidian"
|
||
});
|
||
containerEl.createEl("h2", { text: "\u589E\u5F3A\u7F16\u8F91\u8BBE\u7F6E (Enhanced Editing Setting)" });
|
||
new import_obsidian2.Setting(containerEl).setName("Symbol auto pair and delete with pair").setDesc("\u589E\u52A0\u591A\u79CD\u7B26\u53F7\u914D\u5BF9\u8F93\u5165\uFF0C\u914D\u5BF9\u5220\u9664\uFF0C\u5982\u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F,\u3010\u3011\u7B49").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.IntrinsicSymbolPairs).onChange(async (value) => {
|
||
this.plugin.settings.IntrinsicSymbolPairs = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Selection Replace Enhancement").setDesc("\u9009\u4E2D\u6587\u672C\u60C5\u51B5\u4E0B\u7684\u7F16\u8F91\u589E\u5F3A\uFF0C\u6309\uFFE5\u2192$\u9009\u4E2D\u7684\u6587\u672C$, \u6309\xB7\u2192`\u9009\u4E2D\u7684\u6587\u672C`\uFF0C\u300A \u2192 \u300A\u9009\u4E2D\u7684\u6587\u672C\u300B\u7B49\u7B49").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.SelectionEnhance).onChange(async (value) => {
|
||
this.plugin.settings.SelectionEnhance = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Convert successive full width symbol to half width symbol").setDesc("\u8FDE\u7EED\u8F93\u5165\u5168\u89D2\u7B26\u53F7\u8F6C\u534A\u89D2\uFF0C\u3002\u3002\u2192 .\uFF0C\uFF01\uFF01\u2192 !\uFF0C \u300B\u300B\u2192 >").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.FW2HWEnhance).onChange(async (value) => {
|
||
this.plugin.settings.FW2HWEnhance = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Basic symbol input enhance for obsidian").setDesc("Obsidian \u7684\u57FA\u7840\u8F93\u5165\u589E\u5F3A\uFF0C\u5982\u3010\u3010| \u2192 [[|]]\uFF0C\u53E5\u9996\u7684\u3001\u2192 /\uFF0C\u53E5\u9996\u7684\u300B\u2192 >\uFF0C\xB7\xB7| \u2192 `|`\uFF0C `\xB7|` \u53D8\u6210\u4EE3 \u7801\u5757\uFF0C\uFFE5\uFFE5| \u2192 $|$").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.BaseObEditEnhance).onChange(async (value) => {
|
||
this.plugin.settings.BaseObEditEnhance = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Tabout").setDesc("Tabout inline code or paired symbols(when selected). Tab \u8DF3\u51FA\u884C\u5185\u4EE3\u7801\u5757\u6216\u914D\u5BF9\u7B26\u53F7\u5757(\u9009\u4E2D\u65F6)").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.Tabout).onChange(async (value) => {
|
||
this.plugin.settings.Tabout = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
containerEl.createEl("h2", { text: "\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219 (Customize Edit Convertion Rule)" });
|
||
this.buildUserSelRepRuleSetting(this.containerEl.createEl("details", {
|
||
cls: "easytyping-nested-settings",
|
||
attr: {
|
||
...this.plugin.settings.userSelRuleSettingsOpen ? { open: true } : {}
|
||
}
|
||
}));
|
||
this.buildUserDeleteRuleSetting(this.containerEl.createEl("details", {
|
||
cls: "easytyping-nested-settings",
|
||
attr: {
|
||
...this.plugin.settings.userDelRuleSettingsOpen ? { open: true } : {}
|
||
}
|
||
}));
|
||
this.buildUserConvertRuleSetting(this.containerEl.createEl("details", {
|
||
cls: "easytyping-nested-settings",
|
||
attr: {
|
||
...this.plugin.settings.userCvtRuleSettingsOpen ? { open: true } : {}
|
||
}
|
||
}));
|
||
containerEl.createEl("h2", { text: "\u81EA\u52A8\u683C\u5F0F\u5316\u8BBE\u7F6E (Autoformat Setting)" });
|
||
new import_obsidian2.Setting(containerEl).setName("Auto formatting when typing").setDesc("\u662F\u5426\u5728\u7F16\u8F91\u6587\u6863\u65F6\u81EA\u52A8\u683C\u5F0F\u5316\u6587\u672C\uFF0C\u81EA\u52A8\u683C\u5F0F\u5316\u7684\u603B\u5F00\u5173").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.AutoFormat).onChange(async (value) => {
|
||
this.plugin.settings.AutoFormat = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
containerEl.createEl("p", { text: "Detailed Setting Below" });
|
||
new import_obsidian2.Setting(containerEl).setName("Space between Chinese and English").setDesc("\u5728\u4E2D\u6587\u548C\u82F1\u6587\u95F4\u7A7A\u683C").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.ChineseEnglishSpace).onChange(async (value) => {
|
||
this.plugin.settings.ChineseEnglishSpace = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Space between Chinese and Number").setDesc("\u5728\u4E2D\u6587\u548C\u6570\u5B57\u95F4\u7A7A\u683C").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.ChineseNumberSpace).onChange(async (value) => {
|
||
this.plugin.settings.ChineseNumberSpace = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Space between Engilsh and Number").setDesc("\u5728\u82F1\u6587\u548C\u6570\u5B57\u95F4\u7A7A\u683C").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.EnglishNumberSpace).onChange(async (value) => {
|
||
this.plugin.settings.EnglishNumberSpace = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Delete the Space between Chinese characters").setDesc("\u5728\u4E2D\u6587\u5B57\u7B26\u95F4\u53BB\u9664\u7A7A\u683C").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.ChineseNoSpace).onChange(async (value) => {
|
||
this.plugin.settings.ChineseNoSpace = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Capitalize the first letter of every sentence").setDesc("\u82F1\u6587\u6BCF\u4E2A\u53E5\u9996\u5B57\u6BCD\u5927\u5199").addDropdown((dropdown) => {
|
||
dropdown.addOption("typing" /* OnlyWhenTyping */, "\u8F93\u5165\u65F6\u751F\u6548(Only When Typing)");
|
||
dropdown.addOption("global" /* Globally */, "\u5168\u5C40\u751F\u6548(Work Globally)");
|
||
dropdown.setValue(this.plugin.settings.AutoCapitalMode);
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.AutoCapitalMode = v;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
}).addToggle((toggle) => {
|
||
toggle.setTooltip("\u529F\u80FD\u5F00\u5173(Switch)");
|
||
toggle.setValue(this.plugin.settings.AutoCapital).onChange(async (value) => {
|
||
this.plugin.settings.AutoCapital = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Smartly insert space between text and punctuation").setDesc("\u5728\u6587\u672C\u548C\u6807\u70B9\u95F4\u6DFB\u52A0\u7A7A\u683C").addDropdown((dropdown) => {
|
||
dropdown.addOption("typing" /* OnlyWhenTyping */, "\u8F93\u5165\u65F6\u751F\u6548(Only When Typing)");
|
||
dropdown.addOption("global" /* Globally */, "\u5168\u5C40\u751F\u6548(Work Globally)");
|
||
dropdown.setValue(this.plugin.settings.PunctuationSpaceMode);
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.PunctuationSpaceMode = v;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
}).addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.PunctuationSpace).onChange(async (value) => {
|
||
this.plugin.settings.PunctuationSpace = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Space stategy between inline code and text").setDesc("\u5728 `\u884C\u5185\u4EE3\u7801` \u548C\u6587\u672C\u95F4\u7684\u7A7A\u683C\u7B56\u7565\u3002\u65E0\u8981\u6C42\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5DE6\u53F3\u6587\u672C\u6CA1\u6709\u7A7A\u683C\u7684\u8981\u6C42\uFF0C\u8F6F\u7A7A\u683C\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5468\u56F4\u533A\u5757\u53EA\u8981\u6C42\u6709\u8F6F\u7A7A\u683C\uFF0C\u8F6F\u7A7A\u683C\u5982\u5F53\u524D\u5757\u5DE6\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u3002\uFF0C\uFF1B\uFF1F\u7B49\u5168\u89D2\u6807\u70B9\uFF0C\u5F53\u524D\u5757\u53F3\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u6240\u6709\u5168\u534A\u89D2\u6807\u70B9\uFF0C\u4E25\u683C\u7A7A\u683C\uFF1A\u5F53\u524D\u5757\u4E0E\u4E34\u8FD1\u6587\u672C\u4E4B\u95F4\u4E25\u683C\u6DFB\u52A0\u7A7A\u683C\u3002").addDropdown((dropdown) => {
|
||
dropdown.addOption(String(0 /* none */), "\u65E0\u8981\u6C42(No Require)");
|
||
dropdown.addOption(String(1 /* soft */), "\u8F6F\u7A7A\u683C(Soft Space)");
|
||
dropdown.addOption(String(2 /* strict */), "\u4E25\u683C\u7A7A\u683C(Strict Space)");
|
||
dropdown.setValue(String(this.plugin.settings.InlineCodeSpaceMode));
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.InlineCodeSpaceMode = string2SpaceState(v);
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Space stategy between inline formula and text").setDesc("\u5728 $\u884C\u5185\u516C\u5F0F$ \u548C\u6587\u672C\u95F4\u7684\u7A7A\u683C\u7B56\u7565").addDropdown((dropdown) => {
|
||
dropdown.addOption(String(0 /* none */), "\u65E0\u8981\u6C42(No Require)");
|
||
dropdown.addOption(String(1 /* soft */), "\u8F6F\u7A7A\u683C(Soft Space)");
|
||
dropdown.addOption(String(2 /* strict */), "\u4E25\u683C\u7A7A\u683C(Strict Space)");
|
||
dropdown.setValue(String(this.plugin.settings.InlineFormulaSpaceMode));
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.InlineFormulaSpaceMode = string2SpaceState(v);
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Space strategy between link and text").setDesc("\u5728 [[wikilink]] [mdlink](...) \u548C\u6587\u672C\u95F4\u7A7A\u683C\u7B56\u7565\u3002\u667A\u80FD\u7A7A\u683C\u6A21\u5F0F\u4E0B\u5219\u4F1A\u8003\u8651\u8BE5\u94FE\u63A5\u5757\u7684\u663E\u793A\u5185\u5BB9\uFF08\u5982wiki\u94FE\u63A5\u7684\u522B\u540D\uFF09\u6765\u4E0E\u4E34\u8FD1\u6587\u672C\u8FDB\u884C\u7A7A\u683C\u3002").addDropdown((dropdown) => {
|
||
dropdown.addOption("dummy", "\u5446\u7A7A\u683C(dummy)");
|
||
dropdown.addOption("smart", "\u667A\u80FD\u7A7A\u683C(Smart)");
|
||
dropdown.setValue(this.plugin.settings.InlineLinkSmartSpace ? "smart" : "dummy");
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.InlineLinkSmartSpace = v == "smart" ? true : false;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
}).addDropdown((dropdown) => {
|
||
dropdown.addOption(String(0 /* none */), "\u65E0\u8981\u6C42(No Require)");
|
||
dropdown.addOption(String(1 /* soft */), "\u8F6F\u7A7A\u683C(Soft Space)");
|
||
dropdown.addOption(String(2 /* strict */), "\u4E25\u683C\u7A7A\u683C(Strict Space)");
|
||
dropdown.setValue(String(this.plugin.settings.InlineLinkSpaceMode));
|
||
dropdown.onChange(async (v) => {
|
||
this.plugin.settings.InlineLinkSpaceMode = string2SpaceState(v);
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
containerEl.createEl("h2", { text: "\u81EA\u5B9A\u4E49\u6B63\u5219\u533A\u5757 (Custom regular expressions block)" });
|
||
new import_obsidian2.Setting(containerEl).setName("User Defined RegExp Switch").setDesc("\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u5F00\u5173\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u4E14\u53EF\u4EE5\u8BBE\u7F6E\u5339\u914D\u5230\u7684\u5185\u5BB9\u5757\u4E0E\u5176\u4ED6\u5185\u5BB9\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.UserDefinedRegSwitch).onChange(async (value) => {
|
||
this.plugin.settings.UserDefinedRegSwitch = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
containerEl.createEl("p", { text: "\u6B63\u5219\u8868\u8FBE\u5F0F\u76F8\u5173\u77E5\u8BC6\uFF0C\u89C1 " }).createEl("a", {
|
||
text: "\u300A\u962E\u4E00\u5CF0\uFF1A\u6B63\u5219\u8868\u8FBE\u5F0F\u7B80\u660E\u6559\u7A0B\u300B",
|
||
href: "https://javascript.ruanyifeng.com/stdlib/regexp.html#"
|
||
});
|
||
containerEl.createEl("p", { text: "\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219\u4F7F\u7528\u8BF4\u660E\u4E0E\u793A\u4F8B\uFF1A" }).createEl("a", {
|
||
text: "\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219",
|
||
href: "https://github.com/Yaozhuwa/easy-typing-obsidian/blob/master/UserDefinedRegExp.md"
|
||
});
|
||
const regContentAreaSetting = new import_obsidian2.Setting(containerEl);
|
||
regContentAreaSetting.settingEl.setAttribute("style", "display: grid; grid-template-columns: 1fr;");
|
||
regContentAreaSetting.setName("User-defined Regular Expression, one expression per line").setDesc("\u7528\u6237\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u6BCF\u884C\u4E00\u4E2A\u8868\u8FBE\u5F0F\uFF0C\u884C\u5C3E\u4E0D\u8981\u968F\u610F\u52A0\u7A7A\u683C\u3002\u6BCF\u884C\u672B\u5C3E3\u4E2A\u5B57\u7B26\u7684\u56FA\u5B9A\u4E3A|\u548C\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\uFF0C\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u4E3A-=+\uFF0C\u5206\u522B\u4EE3\u8868\u4E0D\u8981\u6C42\u7A7A\u683C(-)\uFF0C\u8F6F\u7A7A\u683C(=)\uFF0C\u4E25\u683C\u7A7A\u683C(+)\u3002\u8FD9\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u5206\u522B\u4E3A\u5339\u914D\u533A\u5757\u7684\u5DE6\u53F3\u4E24\u8FB9\u7684\u7A7A\u683C\u7B56\u7565");
|
||
const regContentArea = new import_obsidian2.TextAreaComponent(regContentAreaSetting.controlEl);
|
||
setAttributes(regContentArea.inputEl, {
|
||
style: "margin-top: 12px; width: 100%; height: 30vh;"
|
||
});
|
||
regContentArea.setValue(this.plugin.settings.UserDefinedRegExp).onChange(async (value) => {
|
||
this.plugin.settings.UserDefinedRegExp = value;
|
||
this.plugin.saveSettings();
|
||
});
|
||
containerEl.createEl("h2", { text: "\u6307\u5B9A\u6587\u4EF6\u4E0D\u81EA\u52A8\u683C\u5F0F\u5316 (Exclude Folders/Files)" });
|
||
new import_obsidian2.Setting(containerEl).setName("Exclude Folders/Files").setDesc("This plugin will parse each line as a exlude folder or file. For example: DailyNote/, DailyNote/WeekNotes/, DailyNote/test.md").addTextArea((text) => text.setValue(this.plugin.settings.ExcludeFiles).onChange(async (value) => {
|
||
this.plugin.settings.ExcludeFiles = value;
|
||
this.plugin.saveSettings();
|
||
}));
|
||
containerEl.createEl("h2", { text: "Experimental Features" });
|
||
new import_obsidian2.Setting(containerEl).setName("Fix MacOS context-menu cursor position(Need to restart Obsidian)").setDesc("\u4FEE\u590D MacOS \u9F20\u6807\u53F3\u952E\u547C\u51FA\u83DC\u5355\u65F6\u5149\u6807\u8DF3\u5230\u4E0B\u4E00\u884C\u7684\u95EE\u9898(\u9700\u8981\u91CD\u542FObsidian\u751F\u6548)").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.FixMacOSContextMenu).onChange(async (value) => {
|
||
this.plugin.settings.FixMacOSContextMenu = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Enhance Chinese Input Method").setDesc("\u4E2D\u6587\u8F93\u5165\u6CD5\u4E0B\uFF0C\u56DE\u8F66/Shift/Enter \u8F93\u5165\u5185\u5BB9\u65F6\u81EA\u52A8\u683C\u5F0F\u5316").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.TryFixChineseIM).onChange(async (value) => {
|
||
this.plugin.settings.TryFixChineseIM = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Fix MicroSoft Input Method Issue").setDesc("\u9002\u914D\u65E7\u7248\u5FAE\u8F6F\u8F93\u5165\u6CD5").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.TryFixMSIME).onChange(async (value) => {
|
||
this.plugin.settings.TryFixMSIME = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Strict Line breaks Mode Enter Twice").setDesc("\u4E25\u683C\u6362\u884C\u7684\u8BBE\u7F6E\u4E0B\uFF0C\u5728\u666E\u901A\u6587\u672C\u884C\u8FDB\u884C\u4E00\u6B21\u56DE\u8F66\u4F1A\u4EA7\u751F\u4E24\u4E2A\u6362\u884C\u7B26").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.EnterTwice).onChange(async (value) => {
|
||
this.plugin.settings.EnterTwice = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Punc rectify").setDesc("\u4EC5\u5728\u8F93\u5165\u8FC7\u7A0B\u4E2D\uFF0C\u4E2D\u6587\u95F4\u7684\u82F1\u6587\u6807\u70B9\uFF08,.?!\uFF09\u81EA\u52A8\u8F6C\u6362\u4E3A\u5168\u89D2\uFF08\u53EF\u64A4\u9500\uFF09").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.PuncRectify).onChange(async (value) => {
|
||
this.plugin.settings.PuncRectify = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(containerEl).setName("Print debug info in console").setDesc("\u5728\u63A7\u5236\u53F0\u8F93\u51FA\u8C03\u8BD5\u4FE1\u606F").addToggle((toggle) => {
|
||
toggle.setValue(this.plugin.settings.debug).onChange(async (value) => {
|
||
this.plugin.settings.debug = value;
|
||
await this.plugin.saveSettings();
|
||
});
|
||
});
|
||
}
|
||
buildUserSelRepRuleSetting(containerEl) {
|
||
containerEl.empty();
|
||
containerEl.ontoggle = async () => {
|
||
this.plugin.settings.userSelRuleSettingsOpen = containerEl.open;
|
||
await this.plugin.saveSettings();
|
||
};
|
||
const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
|
||
summary.setText("\u81EA\u5B9A\u4E49\u9009\u4E2D\u6587\u672C\u7F16\u8F91\u589E\u5F3A\u89C4\u5219 (Customize Selection Replace Rule)");
|
||
const selectionRuleSetting = new import_obsidian2.Setting(containerEl);
|
||
selectionRuleSetting.setName("Selection Replece Rule");
|
||
const replaceRuleTrigger = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
|
||
replaceRuleTrigger.setPlaceholder("Triggr Symbol");
|
||
const replaceLeftString = new import_obsidian2.TextAreaComponent(selectionRuleSetting.controlEl);
|
||
replaceLeftString.setPlaceholder("New Left Side String");
|
||
const replaceRightString = new import_obsidian2.TextAreaComponent(selectionRuleSetting.controlEl);
|
||
replaceRightString.setPlaceholder("New Right Side String");
|
||
selectionRuleSetting.addButton((button) => {
|
||
button.setButtonText("+").setTooltip("Add Rule").onClick(async (buttonEl) => {
|
||
let trigger = replaceRuleTrigger.inputEl.value;
|
||
let left = replaceLeftString.inputEl.value;
|
||
let right = replaceRightString.inputEl.value;
|
||
if (trigger && (left || right)) {
|
||
if (trigger.length != 1 && trigger != "\u2014\u2014" && trigger != "\u2026\u2026") {
|
||
new import_obsidian2.Notice("Inlvalid trigger, trigger must be a symbol of length 1 or symbol \u2014\u2014, \u2026\u2026");
|
||
return;
|
||
}
|
||
if (this.plugin.addUserSelectionRepRule(trigger, left, right)) {
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
} else {
|
||
new import_obsidian2.Notice("warning! Trigger " + trigger + " is already exist!");
|
||
}
|
||
} else {
|
||
new import_obsidian2.Notice("missing input");
|
||
}
|
||
});
|
||
});
|
||
for (let i = 0; i < this.plugin.settings.userSelRepRuleTrigger.length; i++) {
|
||
let trigger = this.plugin.settings.userSelRepRuleTrigger[i];
|
||
let left_s = this.plugin.settings.userSelRepRuleValue[i].left;
|
||
let right_s = this.plugin.settings.userSelRepRuleValue[i].right;
|
||
let showStr = "Trigger: " + trigger + " \u2192 " + showString(left_s) + "selected" + showString(right_s);
|
||
new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
|
||
button.setIcon("gear").setTooltip("Edit rule").onClick(() => {
|
||
new SelectRuleEditModal(this.app, trigger, left_s, right_s, async (new_left, new_right) => {
|
||
this.plugin.updateUserSelectionRepRule(i, new_left, new_right);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
}).open();
|
||
});
|
||
}).addExtraButton((button) => {
|
||
button.setIcon("trash").setTooltip("Remove rule").onClick(async () => {
|
||
this.plugin.deleteUserSelectionRepRule(i);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
});
|
||
});
|
||
}
|
||
}
|
||
buildUserDeleteRuleSetting(containerEl) {
|
||
containerEl.empty();
|
||
containerEl.ontoggle = async () => {
|
||
this.plugin.settings.userDelRuleSettingsOpen = containerEl.open;
|
||
await this.plugin.saveSettings();
|
||
};
|
||
const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
|
||
summary.setText("\u81EA\u5B9A\u4E49\u5220\u9664\u7F16\u8F91\u589E\u5F3A\u89C4\u5219 (Customize Delete Rule)");
|
||
const deleteRuleSetting = new import_obsidian2.Setting(containerEl);
|
||
deleteRuleSetting.setName("Delete Rule").setDesc("\u89C4\u5219\uFF1A\u7528|\u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002 Tips: Using | to indicate the cursor position.");
|
||
const patternBefore = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
|
||
patternBefore.setPlaceholder("Before Delete");
|
||
const patternAfter = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
|
||
patternAfter.setPlaceholder("New Pattern");
|
||
deleteRuleSetting.addButton((button) => {
|
||
button.setButtonText("+").setTooltip("Add Rule").onClick(async (buttonEl) => {
|
||
let before = patternBefore.inputEl.value;
|
||
let after = patternAfter.inputEl.value;
|
||
if (before && after) {
|
||
let regRule = /\|/g;
|
||
if (before.search(regRule) == -1 || after.search(regRule) == -1) {
|
||
new import_obsidian2.Notice("Inlvalid trigger, pattern must contain symbol | which indicate cursor position");
|
||
return;
|
||
} else {
|
||
this.plugin.addUserDeleteRule(before, after);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
}
|
||
} else {
|
||
new import_obsidian2.Notice("missing input");
|
||
}
|
||
});
|
||
});
|
||
for (let i = 0; i < this.plugin.settings.userDeleteRulesStrList.length; i++) {
|
||
let before = this.plugin.settings.userDeleteRulesStrList[i][0];
|
||
let after = this.plugin.settings.userDeleteRulesStrList[i][1];
|
||
let showStr = '"' + showString(before) + '" delete.backwards \u2192 "' + showString(after) + '"';
|
||
new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
|
||
button.setIcon("gear").setTooltip("Edit rule").onClick(() => {
|
||
new EditConvertRuleModal(this.app, "Delete Rule" /* delete */, before, after, async (new_before, new_after) => {
|
||
this.plugin.updateUserDeleteRule(i, new_before, new_after);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
}).open();
|
||
});
|
||
}).addExtraButton((button) => {
|
||
button.setIcon("trash").setTooltip("Remove rule").onClick(async () => {
|
||
this.plugin.deleteUserDeleteRule(i);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
});
|
||
});
|
||
}
|
||
}
|
||
buildUserConvertRuleSetting(containerEl) {
|
||
containerEl.empty();
|
||
containerEl.ontoggle = async () => {
|
||
this.plugin.settings.userCvtRuleSettingsOpen = containerEl.open;
|
||
await this.plugin.saveSettings();
|
||
};
|
||
const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
|
||
summary.setText("\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219 (Customize Convert Rule)");
|
||
const convertRuleSetting = new import_obsidian2.Setting(containerEl);
|
||
convertRuleSetting.setName("Convert Rule").setDesc("\u89C4\u5219\uFF1A\u7528|\u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002 Tips: Using | to indicate the cursor position.");
|
||
const patternBefore = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
|
||
patternBefore.setPlaceholder("Before Convert");
|
||
const patternAfter = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
|
||
patternAfter.setPlaceholder("New Pattern");
|
||
convertRuleSetting.addButton((button) => {
|
||
button.setButtonText("+").setTooltip("Add Rule").onClick(async (buttonEl) => {
|
||
let before = patternBefore.inputEl.value;
|
||
let after = patternAfter.inputEl.value;
|
||
if (before && after) {
|
||
let regRule = /\|/g;
|
||
if (before.search(regRule) == -1 || after.search(regRule) == -1) {
|
||
new import_obsidian2.Notice("Inlvalid trigger, pattern must contain symbol | which indicate cursor position");
|
||
return;
|
||
} else {
|
||
this.plugin.addUserConvertRule(before, after);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
}
|
||
} else {
|
||
new import_obsidian2.Notice("missing input");
|
||
}
|
||
});
|
||
});
|
||
for (let i = 0; i < this.plugin.settings.userConvertRulesStrList.length; i++) {
|
||
let before = this.plugin.settings.userConvertRulesStrList[i][0];
|
||
let after = this.plugin.settings.userConvertRulesStrList[i][1];
|
||
let showStr = '"' + showString(before) + '" auto convert to "' + showString(after) + '"';
|
||
new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
|
||
button.setIcon("gear").setTooltip("Edit rule").onClick(() => {
|
||
new EditConvertRuleModal(this.app, "Convert Rule" /* convert */, before, after, async (new_before, new_after) => {
|
||
this.plugin.updateUserConvertRule(i, new_before, new_after);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
}).open();
|
||
});
|
||
}).addExtraButton((button) => {
|
||
button.setIcon("trash").setTooltip("Remove rule").onClick(async () => {
|
||
this.plugin.deleteUserConvertRule(i);
|
||
await this.plugin.saveSettings();
|
||
this.display();
|
||
});
|
||
});
|
||
}
|
||
}
|
||
};
|
||
function setAttributes(element, attributes) {
|
||
for (let key in attributes) {
|
||
element.setAttribute(key, attributes[key]);
|
||
}
|
||
}
|
||
var SelectRuleEditModal = class extends import_obsidian2.Modal {
|
||
constructor(app, trigger, left, right, onSubmit) {
|
||
super(app);
|
||
this.trigger = trigger;
|
||
this.old_left = left;
|
||
this.old_right = right;
|
||
this.new_left = left;
|
||
this.new_right = right;
|
||
this.onSubmit = onSubmit;
|
||
}
|
||
onOpen() {
|
||
const { contentEl } = this;
|
||
contentEl.createEl("h1", { text: "Edit Selection Replace Rule" });
|
||
new import_obsidian2.Setting(contentEl).setName("Trigger").addText((text) => {
|
||
text.setValue(this.trigger);
|
||
text.setDisabled(true);
|
||
});
|
||
new import_obsidian2.Setting(contentEl).setName("Left").addTextArea((text) => {
|
||
text.setValue(this.old_left);
|
||
text.onChange((value) => {
|
||
this.new_left = value;
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(contentEl).setName("Right").addTextArea((text) => {
|
||
text.setValue(this.old_right);
|
||
text.onChange((value) => {
|
||
this.new_right = value;
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Update").setCta().onClick(() => {
|
||
this.close();
|
||
this.onSubmit(this.new_left, this.new_right);
|
||
}));
|
||
}
|
||
onClose() {
|
||
let { contentEl } = this;
|
||
contentEl.empty();
|
||
}
|
||
};
|
||
var EditConvertRuleModal = class extends import_obsidian2.Modal {
|
||
constructor(app, type, before, after, onSubmit) {
|
||
super(app);
|
||
this.type = type;
|
||
this.old_before = before;
|
||
this.old_after = after;
|
||
this.new_before = before;
|
||
this.new_after = after;
|
||
this.onSubmit = onSubmit;
|
||
}
|
||
onOpen() {
|
||
const { contentEl } = this;
|
||
contentEl.createEl("h1", { text: "Edit " + this.type });
|
||
new import_obsidian2.Setting(contentEl).setName("Old Pattern").addTextArea((text) => {
|
||
text.setValue(this.old_before);
|
||
text.onChange((value) => {
|
||
this.new_before = value;
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(contentEl).setName("New Pattern").addTextArea((text) => {
|
||
text.setValue(this.old_after);
|
||
text.onChange((value) => {
|
||
this.new_after = value;
|
||
});
|
||
});
|
||
new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Update").setCta().onClick(() => {
|
||
if (this.checkConvertPatternString(this.new_before, this.new_after)) {
|
||
this.close();
|
||
this.onSubmit(this.new_before, this.new_after);
|
||
} else {
|
||
new import_obsidian2.Notice("Invalid pattern string!");
|
||
}
|
||
}));
|
||
}
|
||
checkConvertPatternString(before, after) {
|
||
let regRule = /\|/g;
|
||
if (before.search(regRule) == -1 || after.search(regRule) == -1)
|
||
return false;
|
||
return true;
|
||
}
|
||
onClose() {
|
||
let { contentEl } = this;
|
||
contentEl.empty();
|
||
}
|
||
};
|
||
|
||
// src/main.ts
|
||
var import_view = require("@codemirror/view");
|
||
var import_language2 = require("@codemirror/language");
|
||
var EasyTypingPlugin = class extends import_obsidian3.Plugin {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.transactionFilterPlugin = (tr) => {
|
||
const changes = [];
|
||
if (!tr.docChanged)
|
||
return tr;
|
||
let selected = tr.startState.selection.asSingle().main.anchor != tr.startState.selection.asSingle().main.head;
|
||
let changeTypeStr = getTypeStrOfTransac(tr);
|
||
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
|
||
var _a, _b;
|
||
let changedStr = tr.startState.sliceDoc(fromA, toA);
|
||
let changestr_ = changedStr.replace(/\s/g, "0");
|
||
let insertedStr = inserted.sliceString(0);
|
||
if (this.settings.debug) {
|
||
console.log("[TransactionFilter] type, fromA, toA, changed, fromB, toB, inserted");
|
||
console.log(changeTypeStr, fromA, toA, changedStr, fromB, toB, insertedStr);
|
||
}
|
||
if (getPosLineType(tr.startState, fromA) == "table" /* table */)
|
||
return tr;
|
||
if (this.settings.SelectionEnhance) {
|
||
if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA != toA && (fromB + 1 === toB || insertedStr == "\u2014\u2014" || insertedStr == "\u2026\u2026")) {
|
||
if (this.SelectionReplaceMap.has(insertedStr)) {
|
||
changes.push({ changes: { from: fromA, insert: (_a = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _a.left }, userEvent: "EasyTyping.change" });
|
||
changes.push({ changes: { from: toA, insert: (_b = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _b.right }, userEvent: "EasyTyping.change" });
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (selected)
|
||
return tr;
|
||
if (this.settings.TryFixMSIME && changeTypeStr == "input.type.compose" && changedStr == "" && /^[\u4e00-\u9fa5]+$/.test(insertedStr)) {
|
||
print("MS-IME Compose detected:", insertedStr);
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
if (changeTypeStr == "delete.backward" && !selected && getPosLineType(tr.startState, toA) == "codeblock" /* codeblock */) {
|
||
let line_number = tr.startState.doc.lineAt(toA).number;
|
||
let cur_line = tr.startState.doc.lineAt(toA);
|
||
let list_code = false;
|
||
let list_code_indent = 0;
|
||
for (let i = line_number - 1; i >= 0; i--) {
|
||
let line = tr.startState.doc.line(i);
|
||
if (/^\s+```/.test(line.text)) {
|
||
list_code = true;
|
||
list_code_indent = line.text.match(/^\s*/)[0].length;
|
||
break;
|
||
} else if (/^```/.test(line.text))
|
||
break;
|
||
else
|
||
continue;
|
||
}
|
||
if (list_code) {
|
||
console.log("list_code, indent: ", list_code_indent);
|
||
if (toA == cur_line.from + list_code_indent) {
|
||
changes.push({ changes: { from: tr.startState.doc.line(line_number - 1).to, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
if (fromA >= cur_line.from && fromA < cur_line.from + list_code_indent && toA > cur_line.from + list_code_indent) {
|
||
changes.push({ changes: { from: cur_line.from + list_code_indent, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (changeTypeStr == "delete.backward") {
|
||
for (let rule of this.UserDeleteRules) {
|
||
let left = tr.startState.doc.sliceString(toA - rule.before.left.length, toA);
|
||
let right = tr.startState.doc.sliceString(toA, toA + rule.before.right.length);
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (changeTypeStr === "delete.backward" && this.settings.IntrinsicSymbolPairs) {
|
||
if (this.SymbolPairsMap.has(changedStr) && this.SymbolPairsMap.get(changedStr) === tr.startState.sliceDoc(toA, toA + 1)) {
|
||
changes.push({ changes: { from: fromA, to: toA + 1 }, userEvent: "EasyTyping.change" });
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
let line_content = tr.startState.doc.lineAt(toA).text;
|
||
let next_line_content = tr.startState.doc.sliceString(toA, toA + line_content.length + 1);
|
||
if (/^\s*```$/.test(line_content) && "\n" + line_content == next_line_content) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - 3,
|
||
to: toA + line_content.length + 1,
|
||
insert: ""
|
||
},
|
||
selection: { anchor: toA - 3 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
for (let rule of this.IntrinsicDeleteRules) {
|
||
let left = tr.startState.doc.sliceString(toA - rule.before.left.length, toA);
|
||
let right = tr.startState.doc.sliceString(toA, toA + rule.before.right.length);
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (changeTypeStr == "input.type" && insertedStr == "`\n```" && this.settings.BaseObEditEnhance) {
|
||
const line_content = tr.startState.doc.lineAt(fromA).text;
|
||
if (/^\s*``$/.test(line_content)) {
|
||
changes.push({
|
||
changes: { from: fromA, to: toA, insert: "`\n" + line_content + "`" },
|
||
selection: { anchor: fromA + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA === toA && fromB + 1 === toB) {
|
||
if (this.settings.BaseObEditEnhance) {
|
||
if (insertedStr === "`" && toA - tr.startState.doc.lineAt(toA).from > 2 && tr.startState.sliceDoc(toA - 1, toA) === "`" && tr.startState.sliceDoc(toA - 2, toA - 1) != "`") {
|
||
changes.push({
|
||
changes: { from: toA, insert: "`" },
|
||
selection: { anchor: toA },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
if (insertedStr == "\xB7") {
|
||
let line_content = tr.startState.doc.lineAt(fromA).text;
|
||
let ch_pos = fromA - tr.startState.doc.lineAt(fromA).from;
|
||
if (/^\s*``$/.test(line_content) && ch_pos == line_content.length - 1) {
|
||
changes.push({
|
||
changes: { from: fromA + 1, to: toA + 1, insert: "`\n" + line_content + "`" },
|
||
selection: { anchor: fromA + 2 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
for (let rule of this.BasicConvRules) {
|
||
if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
|
||
continue;
|
||
if (rule.before.left.charAt(0) === "\n" && offsetToPos(tr.state.doc, fromA).line === 0 && toB - rule.before.left.length + 1 === 0) {
|
||
let left = tr.state.doc.sliceString(toB - rule.before.left.length + 1, toB);
|
||
let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
|
||
if (left === rule.before.left.substring(1) && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length + 2,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left.substring(1) + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
} else {
|
||
let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
|
||
let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length + 1,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (this.settings.FW2HWEnhance) {
|
||
for (let rule of this.FW2HWSymbolRules) {
|
||
if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
|
||
continue;
|
||
let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
|
||
let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length + 1,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (this.settings.IntrinsicSymbolPairs) {
|
||
for (let rule of this.IntrinsicAutoPairRulesPatch) {
|
||
if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
|
||
continue;
|
||
let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
|
||
let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
changes.push({
|
||
changes: {
|
||
from: toA - rule.before.left.length + 1,
|
||
to: toA + rule.before.right.length,
|
||
insert: rule.after.left + rule.after.right
|
||
},
|
||
selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
if (this.SymbolPairsMap.has(insertedStr) && insertedStr != "'") {
|
||
changes.push({
|
||
changes: { from: fromA, to: toA, insert: insertedStr + this.SymbolPairsMap.get(insertedStr) },
|
||
selection: { anchor: fromA + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
} else if (insertedStr === "'") {
|
||
let charBeforeCursor = tr.startState.sliceDoc(fromA - 1, fromA);
|
||
if (["", " ", "\n"].includes(charBeforeCursor)) {
|
||
changes.push({
|
||
changes: { from: fromA, to: toA, insert: "''" },
|
||
selection: { anchor: fromA + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
if (insertedStr === "\u201D" || insertedStr === "\u2019") {
|
||
let tempStr = insertedStr === "\u201D" ? "\u201C\u201D" : "\u2018\u2019";
|
||
changes.push({
|
||
changes: { from: fromA, to: toA, insert: tempStr },
|
||
selection: { anchor: fromA + 1 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
}
|
||
if (changeTypeStr == "input.paste" && fromA == toA && fromA == fromB && getPosLineType(tr.startState, fromB) == "codeblock" /* codeblock */) {
|
||
let line = tr.startState.doc.lineAt(fromB).text;
|
||
let indent_space = line.match(/^\s*/)[0].length;
|
||
let inserted_lines = insertedStr.split("\n");
|
||
if (inserted_lines.length > 1) {
|
||
let first_line = inserted_lines[0].trimStart();
|
||
let rest_lines = inserted_lines.slice(1);
|
||
let min_indent_space = Infinity;
|
||
for (let line2 of rest_lines) {
|
||
let indent = line2.match(/^\s*/)[0].length;
|
||
if (indent < min_indent_space)
|
||
min_indent_space = indent;
|
||
}
|
||
let new_rest_lines = rest_lines.map((line2) => line2.substring(min_indent_space));
|
||
new_rest_lines = new_rest_lines.map((line2) => line2.replace(/[\t]/g, this.obsidianSettings.getDefaultIndentChars()));
|
||
let final_rest_lines = new_rest_lines.map((line2) => " ".repeat(indent_space) + line2);
|
||
let new_insertedStr = first_line + "\n" + final_rest_lines.join("\n");
|
||
changes.push({
|
||
changes: { from: fromA, to: toA, insert: new_insertedStr },
|
||
selection: { anchor: fromA + new_insertedStr.length },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
tr = tr.startState.update(...changes);
|
||
return tr;
|
||
}
|
||
}
|
||
});
|
||
return tr;
|
||
};
|
||
this.viewUpdatePlugin = (update) => {
|
||
if (this.onFormatArticle === true)
|
||
return;
|
||
let notSelected = true;
|
||
let mainSelection = update.view.state.selection.asSingle().main;
|
||
if (mainSelection.anchor != mainSelection.head)
|
||
notSelected = false;
|
||
if (!update.docChanged)
|
||
return;
|
||
let isExcludeFile = this.isCurrentFileExclude();
|
||
let tr = update.transactions[0];
|
||
let changeType = getTypeStrOfTransac(tr);
|
||
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
|
||
let insertedStr = inserted.sliceString(0);
|
||
let changedStr = tr.startState.doc.sliceString(fromA, toA);
|
||
if (this.settings.debug) {
|
||
console.log("[ViewUpdate] type, fromA, toA, changed, fromB, toB, inserted");
|
||
console.log(changeType, fromA, toA, changedStr, fromB, toB, insertedStr);
|
||
console.log("==>[Composing]", update.view.composing);
|
||
}
|
||
if (getPosLineType(update.view.state, fromB) == "table" /* table */) {
|
||
return;
|
||
}
|
||
let cursor = update.view.state.selection.asSingle().main;
|
||
let ChineseRegExp = /^[\u4e00-\u9fa5【】·¥《》?:;’‘”“「」、。,()!——……\d]+$/;
|
||
let chineseEndFlag = changeType == "input.type.compose" && cursor.anchor == cursor.head && cursor.anchor === toB && ChineseRegExp.test(insertedStr);
|
||
if (changeType != "input.type.compose")
|
||
this.compose_need_handle = false;
|
||
if (this.settings.AutoFormat && notSelected && !isExcludeFile && (getPosLineType(update.view.state, fromB) == "text" /* text */ || getPosLineType(update.view.state, fromB) == "table" /* table */)) {
|
||
if (changeType == "input.type.compose") {
|
||
if (!/^\d$/.test(insertedStr)) {
|
||
if (this.compose_need_handle == false) {
|
||
this.compose_begin_pos = fromB;
|
||
this.compose_end_pos = toB;
|
||
this.compose_need_handle = true;
|
||
} else {
|
||
this.compose_end_pos = toB;
|
||
if (this.compose_begin_pos == this.compose_end_pos) {
|
||
this.compose_need_handle = false;
|
||
}
|
||
}
|
||
if (chineseEndFlag)
|
||
this.compose_need_handle = false;
|
||
} else {
|
||
if (this.compose_need_handle) {
|
||
this.compose_end_pos = toB;
|
||
if (this.compose_begin_pos == this.compose_end_pos) {
|
||
this.compose_need_handle = false;
|
||
}
|
||
chineseEndFlag = this.compose_need_handle ? false : chineseEndFlag;
|
||
}
|
||
}
|
||
}
|
||
if (chineseEndFlag)
|
||
this.compose_need_handle = false;
|
||
}
|
||
if (changeType == "input.type" || changeType == "input" || chineseEndFlag || changeType == "none") {
|
||
for (let rule of this.UserConvertRules) {
|
||
let left = update.view.state.doc.sliceString(toB - rule.before.left.length, toB);
|
||
let right = update.view.state.doc.sliceString(toB, toB + rule.before.right.length);
|
||
let inserted2 = rule.after.left + rule.after.right;
|
||
let anchor = toB - rule.before.left.length + rule.after.left.length;
|
||
let from = toB - rule.before.left.length;
|
||
let to = toB + rule.before.right.length;
|
||
if (rule.before.left.charAt(0) === "\n" && rule.after.left.charAt(0) === "\n" && toB - rule.before.left.length + 1 == 0) {
|
||
left = "\n" + left;
|
||
inserted2 = inserted2.substring(1);
|
||
from = 0;
|
||
}
|
||
if (left === rule.before.left && right === rule.before.right) {
|
||
update.view.dispatch({
|
||
changes: {
|
||
from,
|
||
to,
|
||
insert: inserted2
|
||
},
|
||
selection: { anchor },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
return;
|
||
}
|
||
}
|
||
if (this.settings.PuncRectify && chineseEndFlag && this.compose_begin_pos > 1 && /[,.?!]/.test(update.view.state.doc.sliceString(this.compose_begin_pos - 1, this.compose_begin_pos))) {
|
||
let punc = update.view.state.doc.sliceString(this.compose_begin_pos - 1, this.compose_begin_pos);
|
||
if (this.compose_begin_pos > 2 && /[\s\n\w]/.test(update.view.state.doc.sliceString(this.compose_begin_pos - 2, this.compose_begin_pos - 1))) {
|
||
} else {
|
||
update.view.dispatch({
|
||
changes: {
|
||
from: this.compose_begin_pos - 1,
|
||
to: this.compose_begin_pos,
|
||
insert: this.halfToFullSymbolMap.get(punc)
|
||
},
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
return;
|
||
}
|
||
}
|
||
if (this.settings.AutoFormat && notSelected && !isExcludeFile && (changeType != "none" || insertedStr == "\n")) {
|
||
if (getPosLineType(update.view.state, fromB) == "text" /* text */ || getPosLineType(update.view.state, fromB) == "table" /* table */) {
|
||
let changes = this.Formater.formatLineOfDoc(update.state, this.settings, fromB, cursor.anchor, insertedStr);
|
||
if (changes != null) {
|
||
update.view.dispatch(...changes[0]);
|
||
update.view.dispatch(changes[1]);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (this.settings.AutoFormat && !isExcludeFile && changeType == "input.paste" && !import_obsidian3.Platform.isIosApp) {
|
||
let updateLineStart = update.state.doc.lineAt(fromB).number;
|
||
let updateLineEnd = update.state.doc.lineAt(toB).number;
|
||
if (updateLineStart == updateLineEnd && getPosLineType(update.view.state, toB) == "text" /* text */) {
|
||
let changes = this.Formater.formatLineOfDoc(update.state, this.settings, fromB, toB, insertedStr);
|
||
if (changes != null) {
|
||
update.view.dispatch(...changes[0]);
|
||
return;
|
||
}
|
||
} else {
|
||
let all_changes = [];
|
||
let inserted_array = insertedStr.split("\n");
|
||
let update_start = fromB;
|
||
for (let i = updateLineStart; i <= updateLineEnd; i++) {
|
||
let real_inserted = inserted_array[i - updateLineStart];
|
||
let changes = this.Formater.formatLineOfDoc(update.state, this.settings, update_start, update_start + real_inserted.length, real_inserted);
|
||
if (changes != null) {
|
||
all_changes.push(...changes[0]);
|
||
}
|
||
update_start += real_inserted.length + 1;
|
||
}
|
||
if (all_changes.length > 0) {
|
||
update.view.dispatch(...all_changes);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
};
|
||
this.handleTabDown = (view) => {
|
||
if (!this.settings.Tabout)
|
||
return false;
|
||
let state = view.state;
|
||
let doc = state.doc;
|
||
const tree = (0, import_language2.syntaxTree)(state);
|
||
const s = view.state.selection;
|
||
if (s.ranges.length > 1)
|
||
return false;
|
||
const pos = s.main.to;
|
||
let line = doc.lineAt(pos);
|
||
if (s.main.from == s.main.to && getPosLineType(view.state, s.main.from) == "codeblock" /* codeblock */) {
|
||
view.dispatch({
|
||
changes: {
|
||
from: s.main.from,
|
||
insert: this.obsidianSettings.getDefaultIndentChars()
|
||
},
|
||
selection: {
|
||
anchor: s.main.from + this.obsidianSettings.getDefaultIndentChars().length
|
||
}
|
||
});
|
||
return true;
|
||
}
|
||
if (pos - line.from != 0 && tree.resolve(pos - 1, 1).name.contains("inline-code")) {
|
||
if (tree.resolve(pos, 1).name.contains("formatting-code_inline-code")) {
|
||
view.dispatch({
|
||
selection: { anchor: pos + 1, head: pos + 1 }
|
||
});
|
||
return true;
|
||
}
|
||
for (let p = pos + 1; p < line.to && tree.resolve(p, 1).name.contains("inline-code"); p += 1) {
|
||
if (tree.resolve(p, 1).name.contains("formatting-code_inline-code")) {
|
||
view.dispatch({
|
||
selection: { anchor: p, head: p }
|
||
});
|
||
return true;
|
||
}
|
||
if (p == line.to - 1 && tree.resolve(p, 1).name.contains("inline-code")) {
|
||
view.dispatch({
|
||
selection: { anchor: p + 1, head: p + 1 }
|
||
});
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
let selection = view.state.selection.asSingle().main;
|
||
let selected = selection.anchor != selection.head;
|
||
if (selected) {
|
||
let new_anchor = selection.anchor < selection.head ? selection.anchor : selection.head;
|
||
let new_head = selection.anchor > selection.head ? selection.anchor : selection.head;
|
||
for (let pstr of this.TaboutPairStrs) {
|
||
if (doc.sliceString(new_anchor - pstr.left.length, new_anchor) == pstr.left && doc.sliceString(new_head, new_head + pstr.right.length) == pstr.right) {
|
||
view.dispatch({
|
||
selection: { anchor: new_head + pstr.right.length, head: new_head + pstr.right.length }
|
||
});
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
this.handleEnter = (view) => {
|
||
if (!this.settings.EnterTwice)
|
||
return false;
|
||
let strictLineBreaks = this.app.vault.getConfig("strictLineBreaks");
|
||
if (!strictLineBreaks)
|
||
return false;
|
||
let state = view.state;
|
||
let doc = state.doc;
|
||
const tree = (0, import_language2.syntaxTree)(state);
|
||
const s = view.state.selection;
|
||
if (s.ranges.length > 1)
|
||
return false;
|
||
const pos = s.main.to;
|
||
let line = doc.lineAt(pos);
|
||
if (/^\s*$/.test(line.text))
|
||
return false;
|
||
else if (getPosLineType2(state, pos) == "text" /* text */) {
|
||
view.dispatch({
|
||
changes: {
|
||
from: pos,
|
||
to: pos,
|
||
insert: "\n\n"
|
||
},
|
||
selection: { anchor: pos + 2 },
|
||
userEvent: "EasyTyping.change"
|
||
});
|
||
return true;
|
||
}
|
||
return false;
|
||
};
|
||
this.onKeyup = (event, view) => {
|
||
if (this.settings.debug) {
|
||
console.log("Keyup:", event.key);
|
||
}
|
||
this.handleEndComposeTypeKey(event, view);
|
||
};
|
||
this.handleEndComposeTypeKey = (event, view) => {
|
||
if (!this.settings.TryFixChineseIM)
|
||
return;
|
||
if (["Enter", "Process", " ", "Shift"].contains(event.key) && this.settings.AutoFormat && this.compose_need_handle && !this.isCurrentFileExclude()) {
|
||
let cursor = view.state.selection.asSingle().main;
|
||
if (getPosLineType(view.state, cursor.anchor) != "text" /* text */)
|
||
return;
|
||
if (cursor.head != cursor.anchor)
|
||
return;
|
||
let insertedStr = view.state.doc.sliceString(this.compose_begin_pos, cursor.anchor);
|
||
let changes = this.Formater.formatLineOfDoc(view.state, this.settings, this.compose_begin_pos, cursor.anchor, insertedStr);
|
||
this.compose_need_handle = false;
|
||
if (changes != null) {
|
||
view.dispatch(...changes[0]);
|
||
view.dispatch(changes[1]);
|
||
return;
|
||
}
|
||
}
|
||
};
|
||
this.formatArticle = (editor, view) => {
|
||
const editorView = editor.cm;
|
||
const tree = (0, import_language2.ensureSyntaxTree)(editorView.state, editorView.state.doc.length);
|
||
if (!tree) {
|
||
new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
|
||
return;
|
||
}
|
||
this.onFormatArticle = true;
|
||
let lineCount = editor.lineCount();
|
||
let new_article = "";
|
||
let cs = editor.getCursor();
|
||
let ch = 0;
|
||
for (let i = 0; i < lineCount; i++) {
|
||
if (i != 0)
|
||
new_article += "\n";
|
||
if (i != cs.line) {
|
||
new_article += this.preFormatOneLine(editor, i + 1)[0];
|
||
} else {
|
||
let newData = this.preFormatOneLine(editor, i + 1, cs.ch);
|
||
new_article += newData[0];
|
||
ch = newData[1];
|
||
}
|
||
}
|
||
editor.setValue(new_article);
|
||
editor.setCursor({ line: cs.line, ch });
|
||
this.onFormatArticle = false;
|
||
new import_obsidian3.Notice("EasyTyping: Format Article Done!");
|
||
};
|
||
this.formatSelectionOrCurLine = (editor, view) => {
|
||
if (!editor.somethingSelected() || editor.getSelection() === "") {
|
||
let lineNumber = editor.getCursor().line;
|
||
let newLineData = this.preFormatOneLine(editor, lineNumber + 1, editor.getCursor().ch);
|
||
editor.replaceRange(newLineData[0], { line: lineNumber, ch: 0 }, { line: lineNumber, ch: editor.getLine(lineNumber).length });
|
||
editor.setSelection({ line: lineNumber, ch: newLineData[1] });
|
||
return;
|
||
}
|
||
let selection = editor.listSelections()[0];
|
||
let begin = selection.anchor.line;
|
||
let end = selection.head.line;
|
||
if (begin > end) {
|
||
let temp = begin;
|
||
begin = end;
|
||
end = temp;
|
||
}
|
||
let new_lines = "";
|
||
for (let i = begin; i <= end; i++) {
|
||
if (i != begin)
|
||
new_lines += "\n";
|
||
new_lines += this.preFormatOneLine(editor, i + 1)[0];
|
||
}
|
||
editor.replaceRange(new_lines, { line: begin, ch: 0 }, { line: end, ch: editor.getLine(end).length });
|
||
if (selection.anchor.line < selection.head.line) {
|
||
editor.setSelection({ line: selection.anchor.line, ch: 0 }, { line: selection.head.line, ch: editor.getLine(selection.head.line).length });
|
||
} else {
|
||
editor.setSelection({ line: selection.anchor.line, ch: editor.getLine(selection.anchor.line).length }, { line: selection.head.line, ch: 0 });
|
||
}
|
||
};
|
||
this.formatOneLine = (editor, lineNumber) => {
|
||
const editorView = editor.cm;
|
||
let state = editorView.state;
|
||
let line = state.doc.line(lineNumber);
|
||
if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
|
||
let oldLine = line.text;
|
||
let newLine = this.Formater.formatLine(state, lineNumber, this.settings, oldLine.length, 0)[0];
|
||
if (oldLine != newLine) {
|
||
editor.replaceRange(newLine, { line: lineNumber - 1, ch: 0 }, { line: lineNumber - 1, ch: oldLine.length });
|
||
editor.setCursor({ line: lineNumber - 1, ch: editor.getLine(lineNumber - 1).length });
|
||
}
|
||
}
|
||
return;
|
||
};
|
||
this.preFormatOneLine = (editor, lineNumber, ch = -1) => {
|
||
const editorView = editor.cm;
|
||
let state = editorView.state;
|
||
let line = state.doc.line(lineNumber);
|
||
let newLine = line.text;
|
||
let newCh = 0;
|
||
let curCh = line.text.length;
|
||
if (ch != -1) {
|
||
curCh = ch;
|
||
}
|
||
if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
|
||
let newLineData = this.Formater.formatLine(state, lineNumber, this.settings, curCh, 0);
|
||
newLine = newLineData[0];
|
||
newCh = newLineData[1];
|
||
}
|
||
return [newLine, newCh];
|
||
};
|
||
this.deleteBlankLines = (editor) => {
|
||
if (this.settings.debug) {
|
||
console.log(this.app.vault.getConfig("strictLineBreaks"));
|
||
}
|
||
let strictLineBreaks = this.app.vault.getConfig("strictLineBreaks");
|
||
const editorView = editor.cm;
|
||
let state = editorView.state;
|
||
let doc = state.doc;
|
||
const tree = (0, import_language2.ensureSyntaxTree)(state, doc.length);
|
||
if (!tree) {
|
||
new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
|
||
return;
|
||
}
|
||
let start_line = 1;
|
||
let end_line = doc.lines;
|
||
let line_num = doc.lines;
|
||
const selected = editor.somethingSelected() && editor.getSelection() != "";
|
||
if (selected) {
|
||
let selection = editor.listSelections()[0];
|
||
let begin = selection.anchor.line + 1;
|
||
let end = selection.head.line + 1;
|
||
if (begin > end) {
|
||
let temp = begin;
|
||
begin = end;
|
||
end = temp;
|
||
}
|
||
start_line = begin;
|
||
end_line = end;
|
||
}
|
||
let delete_index = [];
|
||
let blank_reg = /^\s*$/;
|
||
let remain_next_blank = false;
|
||
if (start_line != 1) {
|
||
let node = tree.resolve(doc.line(start_line - 1).from, 1);
|
||
if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
|
||
remain_next_blank = true;
|
||
}
|
||
}
|
||
if (end_line != line_num && !blank_reg.test(doc.line(end_line + 1).text)) {
|
||
end_line += 1;
|
||
}
|
||
for (let i = start_line; i <= end_line; i++) {
|
||
let line = doc.line(i);
|
||
let pos = line.from;
|
||
let node = tree.resolve(pos, 1);
|
||
if (blank_reg.test(line.text) && !remain_next_blank) {
|
||
delete_index.push(i);
|
||
continue;
|
||
} else if (blank_reg.test(line.text) && remain_next_blank) {
|
||
remain_next_blank = false;
|
||
continue;
|
||
}
|
||
if (node.name.contains("hr") && delete_index[delete_index.length - 1] == i - 1) {
|
||
delete_index.pop();
|
||
} else if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
|
||
remain_next_blank = true;
|
||
} else {
|
||
remain_next_blank = false;
|
||
}
|
||
}
|
||
let newContent = "";
|
||
for (let i = 1; i < line_num; i++) {
|
||
if (!delete_index.contains(i)) {
|
||
newContent += doc.line(i).text + "\n";
|
||
}
|
||
}
|
||
if (!delete_index.contains(line_num)) {
|
||
newContent += doc.line(line_num).text;
|
||
}
|
||
editor.setValue(newContent);
|
||
};
|
||
this.getEditor = () => {
|
||
let editor = null;
|
||
let markdownView = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
|
||
if (markdownView) {
|
||
editor = markdownView.editor;
|
||
}
|
||
if (editor === null)
|
||
console.log("can't get editor");
|
||
return editor;
|
||
};
|
||
}
|
||
async onload() {
|
||
await this.loadSettings();
|
||
this.selectionReplaceMapInitalData = [
|
||
["\u3010", { left: "[", right: "]" }],
|
||
["\uFFE5", { left: "$", right: "$" }],
|
||
["\xB7", { left: "`", right: "`" }],
|
||
["\u300A", { left: "\u300A", right: "\u300B" }],
|
||
["\u201C", { left: "\u201C", right: "\u201D" }],
|
||
["\u201D", { left: "\u201C", right: "\u201D" }],
|
||
["\uFF08", { left: "\uFF08", right: "\uFF09" }],
|
||
["<", { left: "<", right: ">" }]
|
||
];
|
||
this.refreshSelectionReplaceRule();
|
||
this.SymbolPairsMap = /* @__PURE__ */ new Map();
|
||
let SymbolPairs = ["\u3010\u3011", "\uFF08\uFF09", "\u300A\u300B", "\u201C\u201D", "\u2018\u2019", "\u300C\u300D", "\u300E\u300F", "[]", "()", "{}", '""', "''"];
|
||
for (let pairStr of SymbolPairs)
|
||
this.SymbolPairsMap.set(pairStr.charAt(0), pairStr.charAt(1));
|
||
this.halfToFullSymbolMap = /* @__PURE__ */ new Map([
|
||
[".", "\u3002"],
|
||
[",", "\uFF0C"],
|
||
["?", "\uFF1F"],
|
||
["!", "\uFF01"]
|
||
]);
|
||
let BasicConvRuleStringList = [
|
||
["\xB7\xB7|", "`|`"],
|
||
["\uFF01\u3010\u3010|\u3011", "![[|]]"],
|
||
["\uFF01\u3010\u3010|", "![[|]]"],
|
||
["\u3010\u3010|\u3011", "[[|]]"],
|
||
["\u3010\u3010|", "[[|]]"],
|
||
["\uFFE5\uFFE5|", "$|$"],
|
||
["$\uFFE5|$", "$$\n|\n$$"],
|
||
["\xA5\xA5|", "$|$"],
|
||
["$\xA5|$", "$$\n|\n$$"],
|
||
["$$|$", "$$\n|\n$$"],
|
||
["$$|", "$|$"],
|
||
[">\u300B|", ">>|"],
|
||
["\n\u300B|", "\n>|"],
|
||
[" \u300B|", " >|"],
|
||
["\n\u3001|", "\n/|"]
|
||
];
|
||
this.BasicConvRules = ruleStringList2RuleList(BasicConvRuleStringList);
|
||
let FW2HWSymbolRulesStrList = [
|
||
["\u3002\u3002|", ".|"],
|
||
["\uFF01\uFF01|", "!|"],
|
||
["\uFF1B\uFF1B|", ";|"],
|
||
["\uFF0C\uFF0C|", ",|"],
|
||
["\uFF1A\uFF1A|", ":|"],
|
||
["\uFF1F\uFF1F|", "?|"],
|
||
["\uFF08\uFF08|\uFF09", "(|)"],
|
||
["\uFF08\uFF08|", "(|)"],
|
||
["\u201C\u201C|\u201D", '"|"'],
|
||
["\u201C\u201D|\u201D", '"|"'],
|
||
["\u2018\u2018|\u2019", "'|'"],
|
||
["\u2018\u2019|\u2019", "'|'"],
|
||
["\u300B\u300B|", ">|"],
|
||
["\u300A\u300A|\u300B", "<|"],
|
||
["\u300A\u300A|", "<|"]
|
||
];
|
||
this.FW2HWSymbolRules = ruleStringList2RuleList(FW2HWSymbolRulesStrList);
|
||
let fw2hw_rule_0 = { before: { left: "\uFF5C\uFF5C", right: "" }, after: { left: "|", right: "" } };
|
||
this.FW2HWSymbolRules.push(fw2hw_rule_0);
|
||
let DeleteRulesStrList = [["$|$", "|"], ["==|==", "|"], ["$$\n|\n$$", "|"]];
|
||
this.IntrinsicDeleteRules = ruleStringList2RuleList(DeleteRulesStrList);
|
||
let autoPairRulesPatchStrList = [
|
||
["\u3010\u3011|\u3011", "\u3010\u3011|"],
|
||
["\uFF08\uFF09|\uFF09", "\uFF08\uFF09|"],
|
||
["<>|>", "<>|"],
|
||
["\u300A\u300B|\u300B", "\u300A\u300B|"],
|
||
["\u300C\u300D|\u300D", "\u300C\u300D|"],
|
||
["\u300E\u300F|\u300F", "\u300E\u300F|"],
|
||
["()|)", "()|"],
|
||
["[]|]", "[]|"],
|
||
["{}|}", "{}|"],
|
||
["''|'", "''|"],
|
||
['""|"', '""|']
|
||
];
|
||
this.IntrinsicAutoPairRulesPatch = ruleStringList2RuleList(autoPairRulesPatchStrList);
|
||
let TaboutPairStrs = [
|
||
"\u3010|\u3011",
|
||
"\uFF08|\uFF09",
|
||
"\u300A|\u300B",
|
||
"\u201C|\u201D",
|
||
"\u2018|\u2019",
|
||
"\u300C|\u300D",
|
||
"\u300E|\u300F",
|
||
"'|'",
|
||
'"|"',
|
||
"$$|$$",
|
||
"$|$",
|
||
"__|__",
|
||
"_|_",
|
||
"==|==",
|
||
"~~|~~",
|
||
"**|**",
|
||
"*|*",
|
||
"[[|]]",
|
||
"[|]",
|
||
"{|}",
|
||
"(|)",
|
||
"<|>"
|
||
];
|
||
this.TaboutPairStrs = TaboutPairStrs.map((s) => string2pairstring(s));
|
||
this.refreshUserDeleteRule();
|
||
this.refreshUserConvertRule();
|
||
this.CurActiveMarkdown = "";
|
||
this.compose_need_handle = false;
|
||
this.Formater = new LineFormater();
|
||
this.onFormatArticle = false;
|
||
this.obsidianSettings = new ObsidianSettings(this.app);
|
||
this.registerEditorExtension([
|
||
import_state.EditorState.transactionFilter.of(this.transactionFilterPlugin),
|
||
import_view.EditorView.updateListener.of(this.viewUpdatePlugin),
|
||
import_state.Prec.highest(import_view.EditorView.domEventHandlers({
|
||
"keyup": this.onKeyup
|
||
}))
|
||
]);
|
||
this.registerEditorExtension(import_state.Prec.highest(import_view.keymap.of([
|
||
{
|
||
key: "Tab",
|
||
run: (view) => {
|
||
const success = this.handleTabDown(view);
|
||
return success;
|
||
}
|
||
},
|
||
{
|
||
key: "Enter",
|
||
run: (view) => {
|
||
const success = this.handleEnter(view);
|
||
return success;
|
||
}
|
||
}
|
||
])));
|
||
this.lang = window.localStorage.getItem("language");
|
||
let command_name_map = this.getCommandNameMap();
|
||
this.addCommand({
|
||
id: "easy-typing-format-article",
|
||
name: command_name_map.get("format_article"),
|
||
editorCallback: (editor, view) => {
|
||
this.formatArticle(editor, view);
|
||
},
|
||
hotkeys: [{
|
||
modifiers: ["Ctrl", "Shift"],
|
||
key: "s"
|
||
}]
|
||
});
|
||
this.addCommand({
|
||
id: "easy-typing-format-selection",
|
||
name: command_name_map.get("format_selection"),
|
||
editorCallback: (editor, view) => {
|
||
this.formatSelectionOrCurLine(editor, view);
|
||
},
|
||
hotkeys: [{
|
||
modifiers: ["Ctrl", "Shift"],
|
||
key: "l"
|
||
}]
|
||
});
|
||
this.addCommand({
|
||
id: "easy-typing-delete-blank-line",
|
||
name: command_name_map.get("delete_blank_line"),
|
||
editorCallback: (editor, view) => {
|
||
this.deleteBlankLines(editor);
|
||
},
|
||
hotkeys: [{
|
||
modifiers: ["Ctrl", "Shift"],
|
||
key: "k"
|
||
}]
|
||
});
|
||
this.addCommand({
|
||
id: "easy-typing-insert-codeblock",
|
||
name: command_name_map.get("insert_codeblock"),
|
||
editorCallback: (editor, view) => {
|
||
this.convert2CodeBlock(editor);
|
||
},
|
||
hotkeys: [{
|
||
modifiers: ["Ctrl", "Shift"],
|
||
key: "n"
|
||
}]
|
||
});
|
||
this.addCommand({
|
||
id: "easy-typing-format-switch",
|
||
name: command_name_map.get("switch_autoformat"),
|
||
callback: () => this.switchAutoFormatting(),
|
||
hotkeys: [{
|
||
modifiers: ["Ctrl"],
|
||
key: "tab"
|
||
}]
|
||
});
|
||
this.addCommand({
|
||
id: "easy-typing-paste-without-format",
|
||
name: command_name_map.get("paste_wo_format"),
|
||
editorCallback: (editor) => this.normalPaste(editor),
|
||
hotkeys: [
|
||
{
|
||
modifiers: ["Mod", "Shift"],
|
||
key: "v"
|
||
}
|
||
]
|
||
});
|
||
this.addSettingTab(new EasyTypingSettingTab(this.app, this));
|
||
this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => {
|
||
if (leaf.view.getViewType() == "markdown") {
|
||
let file = this.app.workspace.getActiveFile();
|
||
if (file != null && this.CurActiveMarkdown != file.path) {
|
||
this.CurActiveMarkdown = file.path;
|
||
if (this.settings.debug)
|
||
new import_obsidian3.Notice("new md-file open: " + file.path);
|
||
}
|
||
}
|
||
}));
|
||
if (import_obsidian3.Platform.isMacOS && this.settings.FixMacOSContextMenu) {
|
||
this.registerEvent(this.app.workspace.on("editor-menu", (menu, editor, view) => {
|
||
if (editor.listSelections().length != 1)
|
||
return;
|
||
let selection = editor.listSelections()[0];
|
||
let selected = editor.getSelection();
|
||
if (selected == "\n") {
|
||
editor.setSelection(selection.anchor, selection.anchor);
|
||
}
|
||
}));
|
||
}
|
||
console.log("Easy Typing Plugin loaded.");
|
||
}
|
||
onunload() {
|
||
console.log("Easy Typing Plugin unloaded.");
|
||
}
|
||
async normalPaste(editor) {
|
||
let clipboardText = await navigator.clipboard.readText();
|
||
if (clipboardText === null || clipboardText === "")
|
||
return;
|
||
if (this.settings.debug)
|
||
console.log("Normal Paste!!");
|
||
const editorView = editor.cm;
|
||
let mainSelection = editorView.state.selection.asSingle().main;
|
||
editorView.dispatch({
|
||
changes: { from: mainSelection.from, to: mainSelection.to, insert: clipboardText },
|
||
userEvent: "input.paste"
|
||
});
|
||
}
|
||
isCurrentFileExclude() {
|
||
if (this.CurActiveMarkdown == "") {
|
||
let file = this.app.workspace.getActiveFile();
|
||
if (file != null && this.CurActiveMarkdown != file.path) {
|
||
this.CurActiveMarkdown = file.path;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
let excludePaths = this.settings.ExcludeFiles.split("\n");
|
||
for (let epath of excludePaths) {
|
||
if (epath.charAt(0) == "/")
|
||
epath = epath.substring(1);
|
||
if (this.CurActiveMarkdown == epath)
|
||
return true;
|
||
let len = epath.length;
|
||
if (this.CurActiveMarkdown.substring(0, len) == epath && (this.CurActiveMarkdown.charAt(len) == "/" || this.CurActiveMarkdown.charAt(len) == "\\" || epath.charAt(len - 1) == "/" || epath.charAt(len - 1) == "\\")) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
switchAutoFormatting() {
|
||
this.settings.AutoFormat = !this.settings.AutoFormat;
|
||
let status = this.settings.AutoFormat ? "on" : "off";
|
||
new import_obsidian3.Notice("EasyTyping: Autoformat is " + status + "!");
|
||
}
|
||
convert2CodeBlock(editor) {
|
||
if (this.settings.debug)
|
||
console.log("----- EasyTyping: insert code block-----");
|
||
if (editor.somethingSelected && editor.getSelection() != "") {
|
||
let selected = editor.getSelection();
|
||
let selectedRange = editor.listSelections()[0];
|
||
let anchor = selectedRange.anchor;
|
||
let head = selectedRange.head;
|
||
let replacement = "```\n" + selected + "\n```";
|
||
if (anchor.line > head.line || anchor.line == head.line && anchor.ch > head.ch) {
|
||
let temp = anchor;
|
||
anchor = head;
|
||
head = temp;
|
||
}
|
||
let dstLine = anchor.line;
|
||
if (anchor.ch != 0) {
|
||
replacement = "\n" + replacement;
|
||
dstLine += 1;
|
||
}
|
||
if (head.ch != editor.getLine(head.line).length) {
|
||
replacement = replacement + "\n";
|
||
}
|
||
editor.replaceSelection(replacement);
|
||
editor.setCursor({ line: dstLine, ch: 3 });
|
||
} else {
|
||
let cs = editor.getCursor();
|
||
let replace = "```\n```";
|
||
let dstLine = cs.line;
|
||
if (cs.ch != 0) {
|
||
replace = "\n" + replace;
|
||
dstLine += 1;
|
||
}
|
||
if (cs.ch != editor.getLine(cs.line).length) {
|
||
replace = replace + "\n";
|
||
}
|
||
editor.replaceRange(replace, cs);
|
||
editor.setCursor({ line: dstLine, ch: 3 });
|
||
}
|
||
}
|
||
refreshSelectionReplaceRule() {
|
||
this.SelectionReplaceMap = new Map(this.selectionReplaceMapInitalData);
|
||
for (let i = 0; i < this.settings.userSelRepRuleTrigger.length; i++) {
|
||
let trigger = this.settings.userSelRepRuleTrigger[i];
|
||
let lefts = this.settings.userSelRepRuleValue[i].left;
|
||
let rights = this.settings.userSelRepRuleValue[i].right;
|
||
this.SelectionReplaceMap.set(trigger, { left: lefts, right: rights });
|
||
}
|
||
}
|
||
addUserSelectionRepRule(trigger, left, right) {
|
||
if (this.settings.userSelRepRuleTrigger.includes(trigger))
|
||
return false;
|
||
this.settings.userSelRepRuleTrigger.push(trigger);
|
||
this.settings.userSelRepRuleValue.push({ left, right });
|
||
this.refreshSelectionReplaceRule();
|
||
return true;
|
||
}
|
||
deleteUserSelectionRepRule(idx) {
|
||
if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
|
||
return;
|
||
this.settings.userSelRepRuleTrigger.splice(idx, 1);
|
||
this.settings.userSelRepRuleValue.splice(idx, 1);
|
||
this.refreshSelectionReplaceRule();
|
||
}
|
||
updateUserSelectionRepRule(idx, left, right) {
|
||
if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
|
||
return;
|
||
this.settings.userSelRepRuleValue[idx].left = left;
|
||
this.settings.userSelRepRuleValue[idx].right = right;
|
||
this.refreshSelectionReplaceRule();
|
||
}
|
||
refreshUserDeleteRule() {
|
||
this.UserDeleteRules = ruleStringList2RuleList(this.settings.userDeleteRulesStrList);
|
||
}
|
||
addUserDeleteRule(before, after) {
|
||
this.settings.userDeleteRulesStrList.push([before, after]);
|
||
this.refreshUserDeleteRule();
|
||
}
|
||
deleteUserDeleteRule(idx) {
|
||
if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
|
||
return;
|
||
this.settings.userDeleteRulesStrList.splice(idx, 1);
|
||
this.refreshUserDeleteRule();
|
||
}
|
||
updateUserDeleteRule(idx, before, after) {
|
||
if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
|
||
return;
|
||
this.settings.userDeleteRulesStrList[idx][0] = before;
|
||
this.settings.userDeleteRulesStrList[idx][1] = after;
|
||
this.refreshUserDeleteRule();
|
||
}
|
||
refreshUserConvertRule() {
|
||
this.UserConvertRules = ruleStringList2RuleList(this.settings.userConvertRulesStrList);
|
||
}
|
||
addUserConvertRule(before, after) {
|
||
this.settings.userConvertRulesStrList.push([before, after]);
|
||
this.refreshUserConvertRule();
|
||
}
|
||
deleteUserConvertRule(idx) {
|
||
if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
|
||
return;
|
||
this.settings.userConvertRulesStrList.splice(idx, 1);
|
||
this.refreshUserConvertRule();
|
||
}
|
||
getCommandNameMap() {
|
||
const lang = window.localStorage.getItem("language");
|
||
let command_name_map_en = /* @__PURE__ */ new Map([
|
||
["format_article", "Format current article"],
|
||
["format_selection", "Format selected text or current line"],
|
||
["delete_blank_line", "Delete blank lines of the selected or whole article"],
|
||
["insert_codeblock", "Insert code block w/wo selection"],
|
||
["switch_autoformat", "Switch autoformat"],
|
||
["paste_wo_format", "Paste without format"]
|
||
]);
|
||
let command_name_map_zh_TW = /* @__PURE__ */ new Map([
|
||
["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
|
||
["format_selection", "\u683C\u5F0F\u5316\u9078\u4E2D\u90E8\u5206/\u7576\u524D\u884C"],
|
||
["delete_blank_line", "\u522A\u9664\u9078\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u9918\u7A7A\u767D\u884C"],
|
||
["insert_codeblock", "\u63D2\u5165\u4EE3\u78BC\u584A"],
|
||
["switch_autoformat", "\u5207\u63DB\u81EA\u52D5\u683C\u5F0F\u5316\u958B\u95DC"],
|
||
["paste_wo_format", "\u7121\u683C\u5F0F\u5316\u7C98\u8CBC"]
|
||
]);
|
||
let command_name_map_zh = /* @__PURE__ */ new Map([
|
||
["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
|
||
["format_selection", "\u683C\u5F0F\u5316\u9009\u4E2D\u90E8\u5206/\u5F53\u524D\u884C"],
|
||
["delete_blank_line", "\u522A\u9664\u9009\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u4F59\u7A7A\u767D\u884C"],
|
||
["insert_codeblock", "\u63D2\u5165\u4EE3\u7801\u5757"],
|
||
["switch_autoformat", "\u5207\u6362\u81EA\u52A8\u683C\u5F0F\u5316\u5F00\u5173"],
|
||
["paste_wo_format", "\u65E0\u683C\u5F0F\u5316\u7C98\u8D34"]
|
||
]);
|
||
let command_name_map = command_name_map_en;
|
||
if (lang == "zh") {
|
||
command_name_map = command_name_map_zh;
|
||
} else if (lang == "zh-TW") {
|
||
command_name_map = command_name_map_zh_TW;
|
||
}
|
||
return command_name_map;
|
||
}
|
||
updateUserConvertRule(idx, before, after) {
|
||
if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
|
||
return;
|
||
this.settings.userConvertRulesStrList[idx][0] = before;
|
||
this.settings.userConvertRulesStrList[idx][1] = after;
|
||
this.refreshUserConvertRule();
|
||
}
|
||
async loadSettings() {
|
||
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||
}
|
||
async saveSettings() {
|
||
await this.saveData(this.settings);
|
||
}
|
||
};
|
||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2NvcmUudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtFZGl0b3IsIE1hcmtkb3duVmlldywgTWVudSwgTm90aWNlLCBQbGF0Zm9ybSwgUGx1Z2luLCBXb3Jrc3BhY2VMZWFmfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge0VkaXRvclNlbGVjdGlvbiwgRWRpdG9yU3RhdGUsIFByZWMsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNwZWN9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7Q29udmVydFJ1bGUsIERFRkFVTFRfU0VUVElOR1MsIEVhc3lUeXBpbmdTZXR0aW5ncywgRWFzeVR5cGluZ1NldHRpbmdUYWIsIFBhaXJTdHJpbmd9IGZyb20gXCIuL3NldHRpbmdzXCJcbmltcG9ydCB7RWRpdG9yVmlldywga2V5bWFwLCBWaWV3VXBkYXRlfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7XG5cdGdldE9ic2lkaWFuU2V0dGluZ3MsXG5cdE9ic2lkaWFuU2V0dGluZ3MsXG5cdGdldFR5cGVTdHJPZlRyYW5zYWMsXG5cdG9mZnNldFRvUG9zLFxuXHRwcmludCxcblx0cnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QsXG5cdHN0cmluZzJwYWlyc3RyaW5nXG59IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQge2dldFBvc0xpbmVUeXBlLCBnZXRQb3NMaW5lVHlwZTIsIExpbmVGb3JtYXRlciwgTGluZVR5cGV9IGZyb20gJy4vY29yZSdcbmltcG9ydCB7ZW5zdXJlU3ludGF4VHJlZSwgc3ludGF4VHJlZX0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwib2JzaWRpYW5cIiB7XG5cdC8vIGFkZCB0eXBlIHNhZmV0eSBmb3IgdGhlIHVuZG9jdW1lbnRlZCBtZXRob2RzLCBcblx0Ly8gQ09QWSBGUk9NIGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2dyaWVzZXIvb2JzaWRpYW4tc21hcnRlci1tZC1ob3RrZXlzL3RyZWUvbWFzdGVyXG5cdC8vIGludGVyZmFjZSBFZGl0b3Ige1xuXHQvLyBcdGNtOiB7XG5cdC8vIFx0XHRmaW5kV29yZEF0PzogKHBvczogRWRpdG9yUG9zaXRpb24pID0+IEVkaXRvclNlbGVjdGlvbjtcblx0Ly8gXHRcdHN0YXRlPzogeyB3b3JkQXQ6IChvZmZzZXQ6IG51bWJlcikgPT4geyBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXJ9IH07XG5cdC8vIFx0fTtcblx0Ly8gfVxuXHQvLyBpbnRlcmZhY2UgQXBwIHtcblx0Ly8gXHRjb21tYW5kczogeyBleGVjdXRlQ29tbWFuZEJ5SWQ6IChjb21tYW5kSUQ6IHN0cmluZykgPT4gdm9pZCB9O1xuXHQvLyB9XG5cdGludGVyZmFjZSBWYXVsdCB7XG5cdFx0c2V0Q29uZmlnOiAoY29uZmlnOiBzdHJpbmcsIG5ld1ZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuXHRcdGdldENvbmZpZzogKGNvbmZpZzogc3RyaW5nKSA9PiBib29sZWFuO1xuXHR9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWFzeVR5cGluZ1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBFYXN5VHlwaW5nU2V0dGluZ3M7XG5cdHNlbGVjdGlvblJlcGxhY2VNYXBJbml0YWxEYXRhOiBbc3RyaW5nLCBQYWlyU3RyaW5nXVtdO1xuXHRTZWxlY3Rpb25SZXBsYWNlTWFwOiBNYXA8c3RyaW5nLCBQYWlyU3RyaW5nPjtcblx0U3ltYm9sUGFpcnNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cdGhhbGZUb0Z1bGxTeW1ib2xNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cdEJhc2ljQ29udlJ1bGVzOiBDb252ZXJ0UnVsZVtdO1xuXHRGVzJIV1N5bWJvbFJ1bGVzOiBDb252ZXJ0UnVsZVtdO1xuXHRGb3JtYXRlcjogTGluZUZvcm1hdGVyO1xuXHRJbnRyaW5zaWNEZWxldGVSdWxlczogQ29udmVydFJ1bGVbXTtcblx0SW50cmluc2ljQXV0b1BhaXJSdWxlc1BhdGNoOiBDb252ZXJ0UnVsZVtdO1xuXHRDdXJBY3RpdmVNYXJrZG93bjogc3RyaW5nO1xuXG5cdFVzZXJEZWxldGVSdWxlczogQ29udmVydFJ1bGVbXTtcblx0VXNlckNvbnZlcnRSdWxlczogQ29udmVydFJ1bGVbXTtcblx0bGFuZzogc3RyaW5nO1xuXG5cdGNvbXBvc2VfYmVnaW5fcG9zOiBudW1iZXI7XG5cdGNvbXBvc2VfZW5kX3BvczogbnVtYmVyO1xuXHRjb21wb3NlX25lZWRfaGFuZGxlOiBib29sZWFuO1xuXG5cdG9uRm9ybWF0QXJ0aWNsZTogYm9vbGVhbjtcblx0VGFib3V0UGFpclN0cnM6IFBhaXJTdHJpbmdbXTtcblxuXHRvYnNpZGlhblNldHRpbmdzOiBPYnNpZGlhblNldHRpbmdzO1xuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdHRoaXMuc2VsZWN0aW9uUmVwbGFjZU1hcEluaXRhbERhdGEgPSBbXG5cdFx0XHRbXCJcdTMwMTBcIiwgeyBsZWZ0OiBcIltcIiwgcmlnaHQ6IFwiXVwiIH1dLCBbXCJcdUZGRTVcIiwgeyBsZWZ0OiBcIiRcIiwgcmlnaHQ6IFwiJFwiIH1dLCBbXCJcdTAwQjdcIiwgeyBsZWZ0OiBcImBcIiwgcmlnaHQ6IFwiYFwiIH1dLFxuXHRcdFx0W1wiXHUzMDBBXCIsIHsgbGVmdDogXCJcdTMwMEFcIiwgcmlnaHQ6IFwiXHUzMDBCXCIgfV0sIFtcIlx1MjAxQ1wiLCB7IGxlZnQ6IFwiXHUyMDFDXCIsIHJpZ2h0OiBcIlx1MjAxRFwiIH1dLCBbXCJcdTIwMURcIiwgeyBsZWZ0OiBcIlx1MjAxQ1wiLCByaWdodDogXCJcdTIwMURcIiB9XSwgW1wiXHVGRjA4XCIsIHsgbGVmdDogXCJcdUZGMDhcIiwgcmlnaHQ6IFwiXHVGRjA5XCIgfV0sXG5cdFx0XHRbXCI8XCIsIHsgbGVmdDogXCI8XCIsIHJpZ2h0OiBcIj5cIiB9XVxuXHRcdF07XG5cdFx0dGhpcy5yZWZyZXNoU2VsZWN0aW9uUmVwbGFjZVJ1bGUoKTtcblx0XHR0aGlzLlN5bWJvbFBhaXJzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0XHRsZXQgU3ltYm9sUGFpcnMgPSBbXCJcdTMwMTBcdTMwMTFcIiwgXCJcdUZGMDhcdUZGMDlcIiwgXCJcdTMwMEFcdTMwMEJcIiwgXCJcdTIwMUNcdTIwMURcIiwgXCJcdTIwMThcdTIwMTlcIiwgXCJcdTMwMENcdTMwMERcIiwgXCJcdTMwMEVcdTMwMEZcIiwgJ1tdJywgJygpJywgJ3t9JywgJ1wiXCInLCBcIicnXCJdXG5cdFx0Zm9yIChsZXQgcGFpclN0ciBvZiBTeW1ib2xQYWlycykgdGhpcy5TeW1ib2xQYWlyc01hcC5zZXQocGFpclN0ci5jaGFyQXQoMCksIHBhaXJTdHIuY2hhckF0KDEpKTtcblxuXHRcdHRoaXMuaGFsZlRvRnVsbFN5bWJvbE1hcCA9IG5ldyBNYXAoW1xuXHRcdFx0W1wiLlwiLCBcIlx1MzAwMlwiXSxcblx0XHRcdFtcIixcIiwgXCJcdUZGMENcIl0sXG5cdFx0XHRbJz8nLCAnXHVGRjFGJ10sXG5cdFx0XHRbJyEnLCAnXHVGRjAxJ11cblx0XHRdKTtcblxuXHRcdGxldCBCYXNpY0NvbnZSdWxlU3RyaW5nTGlzdDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbWydcdTAwQjdcdTAwQjd8JywgJ2B8YCddLCBbXCJcdUZGMDFcdTMwMTBcdTMwMTB8XHUzMDExXCIsJyFbW3xdXSddLFsnXHVGRjAxXHUzMDEwXHUzMDEwfCcsICchW1t8XV0nXSxcblx0XHRbXCJcdTMwMTBcdTMwMTB8XHUzMDExXCIsIFwiW1t8XV1cIl0sIFsnXHUzMDEwXHUzMDEwfCcsIFwiW1t8XV1cIl0sIFsnXHVGRkU1XHVGRkU1fCcsICckfCQnXSwgWyckXHVGRkU1fCQnLCBcIiQkXFxufFxcbiQkXCJdLFsnXHUwMEE1XHUwMEE1fCcsJyR8JCddLCBbJyRcdTAwQTV8JCcsIFwiJCRcXG58XFxuJCRcIl0sW1wiJCR8JFwiLCBcIiQkXFxufFxcbiQkXCJdLCBbJyQkfCcsIFwiJHwkXCJdLFxuXHRcdFtcIj5cdTMwMEJ8XCIsIFwiPj58XCJdLCBbJ1xcblx1MzAwQnwnLCBcIlxcbj58XCJdLCBbXCIgXHUzMDBCfFwiLCBcIiA+fFwiXSwgW1wiXFxuXHUzMDAxfFwiLCBcIlxcbi98XCJdXTtcblx0XHR0aGlzLkJhc2ljQ29udlJ1bGVzID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QoQmFzaWNDb252UnVsZVN0cmluZ0xpc3QpO1xuXHRcdGxldCBGVzJIV1N5bWJvbFJ1bGVzU3RyTGlzdDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbW1wiXHUzMDAyXHUzMDAyfFwiLCBcIi58XCJdLCBbXCJcdUZGMDFcdUZGMDF8XCIsIFwiIXxcIl0sIFtcIlx1RkYxQlx1RkYxQnxcIiwgXCI7fFwiXSwgW1wiXHVGRjBDXHVGRjBDfFwiLCBcIix8XCJdLFxuXHRcdFtcIlx1RkYxQVx1RkYxQXxcIiwgXCI6fFwiXSwgWydcdUZGMUZcdUZGMUZ8JywgJz98J10sIFsnXHVGRjA4XHVGRjA4fFx1RkYwOScsIFwiKHwpXCJdLCBbJ1x1RkYwOFx1RkYwOHwnLCAnKHwpJ10sIFtcIlx1MjAxQ1x1MjAxQ3xcdTIwMURcIiwgXCJcXFwifFxcXCJcIl0sIFtcIlx1MjAxQ1x1MjAxRHxcdTIwMURcIiwgXCJcXFwifFxcXCJcIl0sIFtcIlx1MjAxOFx1MjAxOHxcdTIwMTlcIiwgXCInfCdcIl0sIFtcIlx1MjAxOFx1MjAxOXxcdTIwMTlcIiwgXCInfCdcIl0sXG5cdFx0W1wiXHUzMDBCXHUzMDBCfFwiLCBcIj58XCJdLCBbXCJcdTMwMEFcdTMwMEF8XHUzMDBCXCIsIFwiPHxcIl0sIFsnXHUzMDBBXHUzMDBBfCcsIFwiPHxcIl1dO1xuXHRcdHRoaXMuRlcySFdTeW1ib2xSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KEZXMkhXU3ltYm9sUnVsZXNTdHJMaXN0KTtcblx0XHRsZXQgZncyaHdfcnVsZV8wOiBDb252ZXJ0UnVsZSA9IHtiZWZvcmU6e2xlZnQ6J1x1RkY1Q1x1RkY1QycsIHJpZ2h0OicnfSwgYWZ0ZXI6e2xlZnQ6J3wnLCByaWdodDonJ319O1xuXHRcdHRoaXMuRlcySFdTeW1ib2xSdWxlcy5wdXNoKGZ3Mmh3X3J1bGVfMClcblxuXHRcdGxldCBEZWxldGVSdWxlc1N0ckxpc3Q6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1tcIiR8JFwiLCBcInxcIl0sIFsnPT18PT0nLCAnfCddLCBbJyQkXFxufFxcbiQkJywgXCJ8XCJdXTtcblx0XHR0aGlzLkludHJpbnNpY0RlbGV0ZVJ1bGVzID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QoRGVsZXRlUnVsZXNTdHJMaXN0KTtcblxuXHRcdGxldCBhdXRvUGFpclJ1bGVzUGF0Y2hTdHJMaXN0OiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtbXCJcdTMwMTBcdTMwMTF8XHUzMDExXCIsIFwiXHUzMDEwXHUzMDExfFwiXSwgW1wiXHVGRjA4XHVGRjA5fFx1RkYwOVwiLCBcIlx1RkYwOFx1RkYwOXxcIl0sXG5cdFx0W1wiPD58PlwiLCBcIjw+fFwiXSwgW1wiXHUzMDBBXHUzMDBCfFx1MzAwQlwiLCBcIlx1MzAwQVx1MzAwQnxcIl0sIFtcIlx1MzAwQ1x1MzAwRHxcdTMwMERcIiwgXCJcdTMwMENcdTMwMER8XCJdLCBbXCJcdTMwMEVcdTMwMEZ8XHUzMDBGXCIsIFwiXHUzMDBFXHUzMDBGfFwiXSwgW1wiKCl8KVwiLCBcIigpfFwiXSwgWydbXXxdJywgJ1tdfCddLFxuXHRcdFtcInt9fH1cIiwgXCJ7fXxcIl0sIFtcIicnfCdcIiwgXCInJ3xcIl0sIFsnXCJcInxcIicsICdcIlwifCddLFxuXHRcdF07XG5cdFx0dGhpcy5JbnRyaW5zaWNBdXRvUGFpclJ1bGVzUGF0Y2ggPSBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdChhdXRvUGFpclJ1bGVzUGF0Y2hTdHJMaXN0KTtcblxuXHRcdGxldCBUYWJvdXRQYWlyU3RycyA9IFtcIlx1MzAxMHxcdTMwMTFcIiwgXCJcdUZGMDh8XHVGRjA5XCIsIFwiXHUzMDBBfFx1MzAwQlwiLCBcIlx1MjAxQ3xcdTIwMURcIiwgXCJcdTIwMTh8XHUyMDE5XCIsIFxuXHRcdFx0XHRcdFx0ICAgXCJcdTMwMEN8XHUzMDBEXCIsIFwiXHUzMDBFfFx1MzAwRlwiLCBcIid8J1wiLCBcIlxcXCJ8XFxcIlwiLCBcIiQkfCQkXCIsICckfCQnLCAnX198X18nLCAnX3xfJyxcblx0XHRcdFx0XHRcdFx0XCI9PXw9PVwiLCBcIn5+fH5+XCIsIFwiKip8KipcIiwgJyp8KicsIFwiW1t8XV1cIiwgJ1t8XScsXCJ7fH1cIiwgXCIofClcIiwgXCI8fD5cIl07XG5cdFx0dGhpcy5UYWJvdXRQYWlyU3RycyA9IFRhYm91dFBhaXJTdHJzLm1hcCgoczpzdHJpbmcpPT5zdHJpbmcycGFpcnN0cmluZyhzKSk7XG5cblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJDb252ZXJ0UnVsZSgpO1xuXG5cdFx0dGhpcy5DdXJBY3RpdmVNYXJrZG93biA9IFwiXCI7XG5cblx0XHR0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUgPSBmYWxzZTtcblxuXHRcdHRoaXMuRm9ybWF0ZXIgPSBuZXcgTGluZUZvcm1hdGVyKCk7XG5cblx0XHR0aGlzLm9uRm9ybWF0QXJ0aWNsZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5vYnNpZGlhblNldHRpbmdzID0gbmV3IE9ic2lkaWFuU2V0dGluZ3ModGhpcy5hcHApO1xuXG5cdFx0dGhpcy5yZWdpc3RlckVkaXRvckV4dGVuc2lvbihbXG5cdFx0XHRFZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlci5vZih0aGlzLnRyYW5zYWN0aW9uRmlsdGVyUGx1Z2luKSxcblx0XHRcdEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YodGhpcy52aWV3VXBkYXRlUGx1Z2luKSxcblx0XHRcdFByZWMuaGlnaGVzdChFZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuXHRcdFx0XHRcImtleXVwXCI6IHRoaXMub25LZXl1cFxuXHRcdFx0fSkpXG5cdFx0XSk7XG5cblxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oUHJlYy5oaWdoZXN0KGtleW1hcC5vZihbXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJUYWJcIixcblx0XHRcdFx0cnVuOiAodmlldzogRWRpdG9yVmlldyk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmhhbmRsZVRhYkRvd24odmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFbnRlclwiLFxuXHRcdFx0XHRydW46ICh2aWV3OiBFZGl0b3JWaWV3KTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VjY2VzcyA9IHRoaXMuaGFuZGxlRW50ZXIodmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdKSkpO1xuXG5cdFx0dGhpcy5sYW5nID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5ndWFnZScpO1xuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwID0gdGhpcy5nZXRDb21tYW5kTmFtZU1hcCgpO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWZvcm1hdC1hcnRpY2xlXCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcImZvcm1hdF9hcnRpY2xlXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0QXJ0aWNsZShlZGl0b3IsIHZpZXcpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJzXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWZvcm1hdC1zZWxlY3Rpb25cIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiZm9ybWF0X3NlbGVjdGlvblwiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLmZvcm1hdFNlbGVjdGlvbk9yQ3VyTGluZShlZGl0b3IsIHZpZXcpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJsXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWRlbGV0ZS1ibGFuay1saW5lXCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcImRlbGV0ZV9ibGFua19saW5lXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuZGVsZXRlQmxhbmtMaW5lcyhlZGl0b3IpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJrXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWluc2VydC1jb2RlYmxvY2tcIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiaW5zZXJ0X2NvZGVibG9ja1wiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbnZlcnQyQ29kZUJsb2NrKGVkaXRvcik7XG5cdFx0XHR9LFxuXHRcdFx0aG90a2V5czogW3tcblx0XHRcdFx0bW9kaWZpZXJzOiBbJ0N0cmwnLCAnU2hpZnQnXSxcblx0XHRcdFx0a2V5OiBcIm5cIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctZm9ybWF0LXN3aXRjaFwiLFxuXHRcdFx0bmFtZTogY29tbWFuZF9uYW1lX21hcC5nZXQoXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiKSxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLnN3aXRjaEF1dG9Gb3JtYXR0aW5nKCksXG5cdFx0XHRob3RrZXlzOiBbe1xuXHRcdFx0XHRtb2RpZmllcnM6IFsnQ3RybCddLFxuXHRcdFx0XHRrZXk6IFwidGFiXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLXBhc3RlLXdpdGhvdXQtZm9ybWF0XCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcInBhc3RlX3dvX2Zvcm1hdFwiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLm5vcm1hbFBhc3RlKGVkaXRvciksXG5cdFx0XHRob3RrZXlzOiBbXG5cdFx0XHQgIHtcblx0XHRcdFx0bW9kaWZpZXJzOiBbXCJNb2RcIiwgXCJTaGlmdFwiXSxcblx0XHRcdFx0a2V5OiBcInZcIixcblx0XHRcdCAgfSxcblx0XHRcdF0sXG5cdFx0ICB9KTtcblxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBFYXN5VHlwaW5nU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+IHtcblx0XHRcdGlmIChsZWFmLnZpZXcuZ2V0Vmlld1R5cGUoKSA9PSAnbWFya2Rvd24nKSB7XG5cdFx0XHRcdGxldCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdFx0aWYgKGZpbGUgIT0gbnVsbCAmJiB0aGlzLkN1ckFjdGl2ZU1hcmtkb3duICE9IGZpbGUucGF0aCkge1xuXHRcdFx0XHRcdHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gPSBmaWxlLnBhdGg7XG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpXG5cdFx0XHRcdFx0XHRuZXcgTm90aWNlKCduZXcgbWQtZmlsZSBvcGVuOiAnICsgZmlsZS5wYXRoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkpO1xuXG5cdFx0Ly9cdTUyMjRcdTY1QURcdTVGNTNcdTUyNERcdTY2MkZcdTU0MjZcdTRFM0FNQUNcdTdDRkJcdTdFREZcblx0XHRpZiAoUGxhdGZvcm0uaXNNYWNPUyAmJiB0aGlzLnNldHRpbmdzLkZpeE1hY09TQ29udGV4dE1lbnUpIHtcblx0XHRcdC8vIFx1NjhDMFx1NkQ0Qlx1OUYyMFx1NjgwN1x1NTNGM1x1OTUyRVx1NTQ3Q1x1NTFGQVx1ODNEQ1x1NTM1NVx1NzY4NFx1NEU4Qlx1NEVGNlxuXHRcdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZWRpdG9yLW1lbnUnLCAobWVudTogTWVudSwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnZWRpdG9yLW1lbnUnLCBtZW51LCBlZGl0b3IsIHZpZXcpO1xuXHRcdFx0XHRpZiAoZWRpdG9yLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoICE9IDEpIHJldHVybjtcblx0XHRcdFx0bGV0IHNlbGVjdGlvbiA9IGVkaXRvci5saXN0U2VsZWN0aW9ucygpWzBdO1xuXHRcdFx0XHRsZXQgc2VsZWN0ZWQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIHNlbGVjdGVkLCBzZWxlY3RlZD09J1xcbicpO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnc2VsZWN0aW9uJywgc2VsZWN0aW9uKTtcblx0XHRcdFx0aWYgKHNlbGVjdGVkPT0nXFxuJylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLmFuY2hvciwgc2VsZWN0aW9uLmFuY2hvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHQvLyB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCAoZmlsZTogVEZpbGUgfCBudWxsKSA9PiB7XG5cdFx0Ly8gXHRpZiAoZmlsZSAhPSBudWxsKSB7XG5cdFx0Ly8gXHRcdGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuXHRcdC8vIFx0XHRpZiAoZWRpdG9yID09PSBudWxsKSByZXR1cm47XG5cdFx0Ly8gXHRcdHRoaXMuQ29udGVudFBhcnNlci5wYXJzZU5ld0FydGljbGUoZWRpdG9yLmdldFZhbHVlKCkpO1xuXHRcdC8vIFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zykge1xuXHRcdC8vIFx0XHRcdG5ldyBOb3RpY2UoXCJFYXN5VHlwaW5nOiBQYXJzZSBOZXcgQXJ0aWNsZTogXCIgKyBmaWxlLnZhdWx0LmdldE5hbWUoKSArICcvJyArIGZpbGUucGF0aCk7XG5cdFx0Ly8gXHRcdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHRoaXMuQ29udGVudFBhcnNlci5wcmludCgpO1xuXHRcdC8vIFx0XHR9XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gfSkpO1xuXHRcdGNvbnNvbGUubG9nKFwiRWFzeSBUeXBpbmcgUGx1Z2luIGxvYWRlZC5cIilcblx0fVxuXG5cdG9udW5sb2FkKCkge1xuXHRcdGNvbnNvbGUubG9nKFwiRWFzeSBUeXBpbmcgUGx1Z2luIHVubG9hZGVkLlwiKVxuXHR9XG5cblx0dHJhbnNhY3Rpb25GaWx0ZXJQbHVnaW4gPSAodHI6IFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25TcGVjIHwgcmVhZG9ubHkgVHJhbnNhY3Rpb25TcGVjW10gPT4ge1xuXHRcdGNvbnN0IGNoYW5nZXM6IFRyYW5zYWN0aW9uU3BlY1tdID0gW107XG5cdFx0aWYgKCF0ci5kb2NDaGFuZ2VkKSByZXR1cm4gdHI7XG5cdFx0bGV0IHNlbGVjdGVkID0gdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24uYXNTaW5nbGUoKS5tYWluLmFuY2hvciAhPSB0ci5zdGFydFN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW4uaGVhZDtcblxuXHRcdGxldCBjaGFuZ2VUeXBlU3RyID0gZ2V0VHlwZVN0ck9mVHJhbnNhYyh0cik7XG5cdFx0dHIuY2hhbmdlcy5pdGVyQ2hhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiwgaW5zZXJ0ZWQpID0+IHtcblx0XHRcdGxldCBjaGFuZ2VkU3RyID0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyhmcm9tQSwgdG9BKTtcblx0XHRcdGxldCBjaGFuZ2VzdHJfID0gY2hhbmdlZFN0ci5yZXBsYWNlKC9cXHMvZywgJzAnKVxuXHRcdFx0bGV0IGluc2VydGVkU3RyID0gaW5zZXJ0ZWQuc2xpY2VTdHJpbmcoMCk7XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zylcblx0XHRcdHtcblx0XHRcdFx0Y29uc29sZS5sb2coXCJbVHJhbnNhY3Rpb25GaWx0ZXJdIHR5cGUsIGZyb21BLCB0b0EsIGNoYW5nZWQsIGZyb21CLCB0b0IsIGluc2VydGVkXCIpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyhjaGFuZ2VUeXBlU3RyLCBmcm9tQSwgdG9BLCBjaGFuZ2VkU3RyLGZyb21CLCB0b0IsIGluc2VydGVkU3RyKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gXHU4ODY4XHU2ODNDXHU3RjE2XHU4RjkxXHU2NUY2XHU3NkY0XHU2M0E1XHU4RkQ0XHU1NkRFXHVGRjBDXHU4OUUzXHU1MUIzXHU4ODY4XHU2ODNDXHU1MTg1XHU1QkI5XHU3RjE2XHU4RjkxXHU2NzA5XHU2NUY2XHU1MDE5XHU0RjFBXHU4REYzXHU1MUZBXHU4MDVBXHU3MTI2XHU3MkI2XHU2MDAxXHU3Njg0IEJ1Z1xuXHRcdFx0aWYgKGdldFBvc0xpbmVUeXBlKHRyLnN0YXJ0U3RhdGUsIGZyb21BKT09TGluZVR5cGUudGFibGUpIHJldHVybiB0cjtcblxuXHRcdFx0Ly8gPT09PT09PT09PSBTZWxlY3Rpb24gUmVwbGFjZSA9PT09PT09PT09PT1cblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLlNlbGVjdGlvbkVuaGFuY2UpIHtcblx0XHRcdFx0aWYgKChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyB8fCBjaGFuZ2VUeXBlU3RyID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIpICYmIGZyb21BICE9IHRvQSAmJiAoKGZyb21CICsgMSA9PT0gdG9CKXx8aW5zZXJ0ZWRTdHI9PSdcdTIwMTRcdTIwMTQnfHxpbnNlcnRlZFN0cj09J1x1MjAyNlx1MjAyNicpKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcC5oYXMoaW5zZXJ0ZWRTdHIpKSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IGZyb21BLCBpbnNlcnQ6IHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcC5nZXQoaW5zZXJ0ZWRTdHIpPy5sZWZ0IH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIH0pXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IHRvQSwgaW5zZXJ0OiB0aGlzLlNlbGVjdGlvblJlcGxhY2VNYXAuZ2V0KGluc2VydGVkU3RyKT8ucmlnaHQgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSlcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzZWxlY3RlZCkgcmV0dXJuIHRyO1xuXG5cdFx0XHQvLyBcdTVDMURcdThCRDVcdTg5RTNcdTUxQjNcdTVGQUVcdThGNkZcdTY1RTdcdTcyNDhcdThGOTNcdTUxNjVcdTZDRDVcdTc2ODRcdTk1RUVcdTk4OTh+XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5UcnlGaXhNU0lNRSAmJiBcblx0XHRcdFx0Y2hhbmdlVHlwZVN0ciA9PSBcImlucHV0LnR5cGUuY29tcG9zZVwiICYmIFxuXHRcdFx0XHRjaGFuZ2VkU3RyID09ICcnICYmIC9eW1xcdTRlMDAtXFx1OWZhNV0rJC8udGVzdChpbnNlcnRlZFN0cikpe1xuXHRcdFx0XHRwcmludChcIk1TLUlNRSBDb21wb3NlIGRldGVjdGVkOlwiLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gXHU1MjE3XHU4ODY4XHU0RTBCXHU3Njg0XHU0RUUzXHU3ODAxXHU1NzU3XHU1MjIwXHU5NjY0XHU1MjlGXHU4MEZEXHU0RjE4XHU1MzE2XG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PSBcImRlbGV0ZS5iYWNrd2FyZFwiICYmICFzZWxlY3RlZCAmJiBcblx0XHRcdFx0Z2V0UG9zTGluZVR5cGUodHIuc3RhcnRTdGF0ZSwgdG9BKSA9PSBMaW5lVHlwZS5jb2RlYmxvY2spIHtcblx0XHRcdFx0bGV0IGxpbmVfbnVtYmVyID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KHRvQSkubnVtYmVyO1xuXHRcdFx0XHRsZXQgY3VyX2xpbmUgPSB0ci5zdGFydFN0YXRlLmRvYy5saW5lQXQodG9BKTtcblx0XHRcdFx0bGV0IGxpc3RfY29kZSA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgbGlzdF9jb2RlX2luZGVudCA9IDA7XG5cdFx0XHRcdGZvciAobGV0IGkgPSBsaW5lX251bWJlciAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdFx0bGV0IGxpbmUgPSB0ci5zdGFydFN0YXRlLmRvYy5saW5lKGkpO1xuXHRcdFx0XHRcdGlmICgvXlxccytgYGAvLnRlc3QobGluZS50ZXh0KSkge1xuXHRcdFx0XHRcdFx0bGlzdF9jb2RlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGxpc3RfY29kZV9pbmRlbnQgPSBsaW5lLnRleHQubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKC9eYGBgLy50ZXN0KGxpbmUudGV4dCkpIGJyZWFrO1xuXHRcdFx0XHRcdGVsc2UgY29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobGlzdF9jb2RlKSB7XG5cdFx0XHRcdFx0Y29uc29sZS5sb2coJ2xpc3RfY29kZSwgaW5kZW50OiAnLCBsaXN0X2NvZGVfaW5kZW50KTtcblx0XHRcdFx0XHRpZiAodG9BID09IGN1cl9saW5lLmZyb20gKyBsaXN0X2NvZGVfaW5kZW50KSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmUobGluZV9udW1iZXItMSkudG8sIHRvOiB0b0EsIGluc2VydDogJycgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZnJvbUE+PWN1cl9saW5lLmZyb20gJiYgZnJvbUEgPCBjdXJfbGluZS5mcm9tK2xpc3RfY29kZV9pbmRlbnQgJiYgdG9BPmN1cl9saW5lLmZyb20rbGlzdF9jb2RlX2luZGVudCl7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IGN1cl9saW5lLmZyb20rbGlzdF9jb2RlX2luZGVudCwgdG86IHRvQSwgaW5zZXJ0OiAnJyB9LCB1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIiB9KTtcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZXJEZWZpbmVkIERlbGV0ZSBSdWxlXG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PSBcImRlbGV0ZS5iYWNrd2FyZFwiKSB7XG5cdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5Vc2VyRGVsZXRlUnVsZXMpIHtcblx0XHRcdFx0XHRsZXQgbGVmdCA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLCB0b0EpO1xuXHRcdFx0XHRcdGxldCByaWdodCA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQSwgdG9BICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRpZiAobGVmdCA9PT0gcnVsZS5iZWZvcmUubGVmdCAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHR0bzogdG9BICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gPT09PT09PT09PSBkZWxldGUgcGFpciBzeW1ib2wgPT09PT09PT09PT09XG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PT0gXCJkZWxldGUuYmFja3dhcmRcIiAmJiB0aGlzLnNldHRpbmdzLkludHJpbnNpY1N5bWJvbFBhaXJzKSB7XG5cdFx0XHRcdGlmICh0aGlzLlN5bWJvbFBhaXJzTWFwLmhhcyhjaGFuZ2VkU3RyKSAmJiB0aGlzLlN5bWJvbFBhaXJzTWFwLmdldChjaGFuZ2VkU3RyKSA9PT0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyh0b0EsIHRvQSArIDEpKSB7XG5cdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSArIDEgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSk7XG5cdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTUyMjBcdTk2NjRcdTRFRTNcdTc4MDFcdTU3NTdcblx0XHRcdFx0bGV0IGxpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdCh0b0EpLnRleHQ7XG5cdFx0XHRcdGxldCBuZXh0X2xpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQSwgdG9BICsgbGluZV9jb250ZW50Lmxlbmd0aCsxKTtcblx0XHRcdFx0aWYgKC9eXFxzKmBgYCQvLnRlc3QobGluZV9jb250ZW50KSAmJiAnXFxuJytsaW5lX2NvbnRlbnQ9PW5leHRfbGluZV9jb250ZW50KSB7XG5cdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYW5nZXM6e1xuXHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EtMywgXG5cdFx0XHRcdFx0XHRcdHRvOiB0b0ErbGluZV9jb250ZW50Lmxlbmd0aCsxLFxuXHRcdFx0XHRcdFx0XHRpbnNlcnQ6ICcnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gMyB9LFxuXHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5JbnRyaW5zaWNEZWxldGVSdWxlcykge1xuXHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQSk7XG5cdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BLCB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdGlmIChsZWZ0ID09PSBydWxlLmJlZm9yZS5sZWZ0ICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdGZyb206IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQgKyBydWxlLmFmdGVyLnJpZ2h0XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCB9LFxuXHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTgyRjFcdTY1ODdcdThGOTNcdTUxNjVcdTZDRDVcdTRFMEJcdThGOTNcdTUxNjVcdTRFRTNcdTc4MDFcdTU3NTdcblx0XHRcdGlmIChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyAmJiBpbnNlcnRlZFN0ciA9PSdgXFxuYGBgJyAmJiB0aGlzLnNldHRpbmdzLkJhc2VPYkVkaXRFbmhhbmNlKXtcblx0XHRcdFx0Y29uc3QgbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS50ZXh0O1xuXHRcdFx0XHRpZiAoL15cXHMqYGAkLy50ZXN0KGxpbmVfY29udGVudCkpe1xuXHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzOiB7ZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogJ2BcXG4nK2xpbmVfY29udGVudCsnYCd9LFxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAxIH0sXG5cdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdC8vIFx1OTAxQVx1NUUzOFx1NTM1NVx1NUI1N1x1OEY5M1x1NTE2NVxuXHRcdFx0aWYgKChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyB8fCBjaGFuZ2VUeXBlU3RyID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIpICYmIGZyb21BID09PSB0b0EgJiYgZnJvbUIgKyAxID09PSB0b0IpIHtcblx0XHRcdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiSW5wdXQudHlwZSA9PiBcIiwgaW5zZXJ0ZWRTdHIpXG5cdFx0XHRcdC8vID09PT09PT09PT09IGJhc2ljIGNvbnZlcnQgcnVsZXMgPT09PT09PT09PT09XG5cdFx0XHRcdC8vIG5vdCBzdXBwb3J0IHVuZG8gYW5kIHJlZG9cblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuQmFzZU9iRWRpdEVuaGFuY2UpIHtcblx0XHRcdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTgyRjFcdTY1ODdcdTY4MDdcdTcwQjlcdTRFMEJgYHxcdTc2ODRcdTYwQzVcdTUxQjVcdUZGMENcdTUxNDlcdTY4MDdcdTgxRUFcdTUyQThcdThERjNcdThGNkNcdTUyMzBcdTRFMkRcdTk1RjRcblx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgPT09ICdgJyAmJiBcblx0XHRcdFx0XHRcdHRvQS10ci5zdGFydFN0YXRlLmRvYy5saW5lQXQodG9BKS5mcm9tPjIgJiYgXG5cdFx0XHRcdFx0XHR0ci5zdGFydFN0YXRlLnNsaWNlRG9jKHRvQS0xLCB0b0EpID09PSAnYCdcblx0XHRcdFx0XHRcdCYmIHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2ModG9BLTIsIHRvQS0xKSAhPSAnYCcpe1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge2Zyb206dG9BLCBpbnNlcnQ6J2AnfSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFx1NTkwNFx1NzQwNlx1NEUyRFx1NjU4N1x1OEY5M1x1NTE2NVx1NkNENVx1NEUwQlx1OEY5M1x1NTE2NVx1NEVFM1x1NzgwMVx1NTc1N1xuXHRcdFx0XHRcdGlmIChpbnNlcnRlZFN0ciA9PSAnXHUwMEI3Jyl7XG5cdFx0XHRcdFx0XHRsZXQgbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS50ZXh0O1xuXHRcdFx0XHRcdFx0bGV0IGNoX3BvcyA9IGZyb21BIC0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS5mcm9tO1xuXHRcdFx0XHRcdFx0aWYgKC9eXFxzKmBgJC8udGVzdChsaW5lX2NvbnRlbnQpICYmIGNoX3Bvcz09bGluZV9jb250ZW50Lmxlbmd0aC0xKXtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7ZnJvbTogZnJvbUErMSwgdG86IHRvQSsxLCBpbnNlcnQ6ICdgXFxuJytsaW5lX2NvbnRlbnQrJ2AnfSxcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBmcm9tQSArIDIgfSxcblx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5CYXNpY0NvbnZSdWxlcykge1xuXHRcdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gMSkpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0Ly8gXHU1OTA0XHU3NDA2XHU2NTg3XHU2ODYzXHU3QjJDIDAgXHU4ODRDXG5cdFx0XHRcdFx0XHRpZiAocnVsZS5iZWZvcmUubGVmdC5jaGFyQXQoMCkgPT09ICdcXG4nICYmIG9mZnNldFRvUG9zKHRyLnN0YXRlLmRvYywgZnJvbUEpLmxpbmUgPT09IDAgJiYgdG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMSwgdG9CKTtcblx0XHRcdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiwgdG9CICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQuc3Vic3RyaW5nKDEpICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZyb206IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQuc3Vic3RyaW5nKDEpICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCArIDEgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIFx1OTAxQVx1NUUzOFx1NjBDNVx1NTFCNVx1NTkwNFx1NzQwNlxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLCB0b0IpO1xuXHRcdFx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CLCB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRpZiAobGVmdCA9PT0gcnVsZS5iZWZvcmUubGVmdCAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDEsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCArIDEgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5GVzJIV0VuaGFuY2UpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuRlcySFdTeW1ib2xSdWxlcykge1xuXHRcdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gMSkpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0bGV0IGxlZnQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQik7XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CLCB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQgJiYgcmlnaHQgPT09IHJ1bGUuYmVmb3JlLnJpZ2h0KSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyBydWxlLmFmdGVyLmxlZnQubGVuZ3RoICsgMSB9LFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PSBhdXRvIHBhaXIgPT09PT09PT09PT09PT09PT1cblx0XHRcdFx0Ly8gbGV0IFBhaXJWYWxpZFNldCA9IG5ldyBTZXQoW1wiXCIsIFwiIFwiLFwiXFxuXCJdKVxuXHRcdFx0XHQvLyBsZXQgY2hhckFmdGVyQ3Vyc29yID0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyh0b0EsIHRvQSsxKTtcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuSW50cmluc2ljU3ltYm9sUGFpcnMpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuSW50cmluc2ljQXV0b1BhaXJSdWxlc1BhdGNoKSB7XG5cdFx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgIT0gcnVsZS5iZWZvcmUubGVmdC5jaGFyQXQocnVsZS5iZWZvcmUubGVmdC5sZW5ndGggLSAxKSkgY29udGludWU7XG5cdFx0XHRcdFx0XHRsZXQgbGVmdCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCwgdG9CKTtcblx0XHRcdFx0XHRcdGxldCByaWdodCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IsIHRvQiArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZiAobGVmdCA9PT0gcnVsZS5iZWZvcmUubGVmdCAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDEsXG5cdFx0XHRcdFx0XHRcdFx0XHR0bzogdG9BICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQgKyBydWxlLmFmdGVyLnJpZ2h0XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5TeW1ib2xQYWlyc01hcC5oYXMoaW5zZXJ0ZWRTdHIpICYmIGluc2VydGVkU3RyIT1cIidcIikge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSwgaW5zZXJ0OiBpbnNlcnRlZFN0ciArIHRoaXMuU3ltYm9sUGFpcnNNYXAuZ2V0KGluc2VydGVkU3RyKSB9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBmcm9tQSArIDEgfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoaW5zZXJ0ZWRTdHIgPT09IFwiJ1wiKSB7XG5cdFx0XHRcdFx0XHRsZXQgY2hhckJlZm9yZUN1cnNvciA9IHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2MoZnJvbUEgLSAxLCBmcm9tQSk7XG5cdFx0XHRcdFx0XHRpZiAoWycnLCAnICcsICdcXG4nXS5pbmNsdWRlcyhjaGFyQmVmb3JlQ3Vyc29yKSkge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHsgZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogXCInJ1wiIH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgYXV0b3BhaXIgZm9yIFwiXHUyMDFEXCIgYW5kIFwiXHUyMDE5XCJcblx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgPT09ICdcdTIwMUQnIHx8IGluc2VydGVkU3RyID09PSAnXHUyMDE5Jykge1xuXHRcdFx0XHRcdFx0bGV0IHRlbXBTdHIgPSBpbnNlcnRlZFN0ciA9PT0gXCJcdTIwMURcIiA/IFwiXHUyMDFDXHUyMDFEXCIgOiBcIlx1MjAxOFx1MjAxOVwiO1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSwgaW5zZXJ0OiB0ZW1wU3RyIH0sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb21BICsgMSB9LFxuXHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTU3MjhcdTRFRTNcdTc4MDFcdTU3NTdcdTRFMkRcdTdDOThcdThEMzRcdTY1RjZcdTY2N0FcdTgwRkRcdTZERkJcdTUyQTBcdTdGMjlcdThGREJcblx0XHRcdGlmIChjaGFuZ2VUeXBlU3RyPT1cImlucHV0LnBhc3RlXCIgJiYgZnJvbUE9PXRvQSAmJiBmcm9tQT09ZnJvbUIgJiYgXG5cdFx0XHRcdFx0Z2V0UG9zTGluZVR5cGUodHIuc3RhcnRTdGF0ZSwgZnJvbUIpID09IExpbmVUeXBlLmNvZGVibG9jayl7XG5cdFx0XHRcdGxldCBsaW5lID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21CKS50ZXh0O1xuXHRcdFx0XHRsZXQgaW5kZW50X3NwYWNlID0gbGluZS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG5cdFx0XHRcdGxldCBpbnNlcnRlZF9saW5lcyA9IGluc2VydGVkU3RyLnNwbGl0KCdcXG4nKTtcblx0XHRcdFx0aWYoaW5zZXJ0ZWRfbGluZXMubGVuZ3RoPjEpe1xuXHRcdFx0XHRcdGxldCBmaXJzdF9saW5lID0gaW5zZXJ0ZWRfbGluZXNbMF0udHJpbVN0YXJ0KCk7XG5cdFx0XHRcdFx0bGV0IHJlc3RfbGluZXMgPSBpbnNlcnRlZF9saW5lcy5zbGljZSgxKTtcblx0XHRcdFx0XHQvLyBmaW5kIHRoZSBtaW5pbXVtIGluZGVudCBzcGFjZSBpbiByZXN0IGxpbmVzXG5cdFx0XHRcdFx0bGV0IG1pbl9pbmRlbnRfc3BhY2UgPSBJbmZpbml0eTtcblx0XHRcdFx0XHRmb3IgKGxldCBsaW5lIG9mIHJlc3RfbGluZXMpe1xuXHRcdFx0XHRcdFx0bGV0IGluZGVudCA9IGxpbmUubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0aWYgKGluZGVudDxtaW5faW5kZW50X3NwYWNlKSBtaW5faW5kZW50X3NwYWNlID0gaW5kZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyByZW1vdmUgdGhpcyBtaW5faW5kZW50X3NwYWNlIGZyb20gcmVzdCBsaW5lc1xuXHRcdFx0XHRcdGxldCBuZXdfcmVzdF9saW5lcyA9IHJlc3RfbGluZXMubWFwKChsaW5lOnN0cmluZyk9PmxpbmUuc3Vic3RyaW5nKG1pbl9pbmRlbnRfc3BhY2UpKTtcblx0XHRcdFx0XHRuZXdfcmVzdF9saW5lcyA9IG5ld19yZXN0X2xpbmVzLm1hcChcblx0XHRcdFx0XHRcdChsaW5lOnN0cmluZyk9PmxpbmUucmVwbGFjZSgvW1xcdF0vZywgdGhpcy5vYnNpZGlhblNldHRpbmdzLmdldERlZmF1bHRJbmRlbnRDaGFycygpKSk7XG5cdFx0XHRcdFx0bGV0IGZpbmFsX3Jlc3RfbGluZXMgPSBuZXdfcmVzdF9saW5lcy5tYXAoKGxpbmU6c3RyaW5nKT0+JyAnLnJlcGVhdChpbmRlbnRfc3BhY2UpK2xpbmUpO1xuXHRcdFx0XHRcdGxldCBuZXdfaW5zZXJ0ZWRTdHIgPSBmaXJzdF9saW5lKydcXG4nK2ZpbmFsX3Jlc3RfbGluZXMuam9pbignXFxuJyk7XG5cdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYW5nZXM6IHtmcm9tOiBmcm9tQSwgdG86IHRvQSwgaW5zZXJ0OiBuZXdfaW5zZXJ0ZWRTdHJ9LFxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7YW5jaG9yOiBmcm9tQStuZXdfaW5zZXJ0ZWRTdHIubGVuZ3RofSxcblx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdH1cdFx0XHRcdFxuXHRcdFx0fVxuXG5cdFx0fSlcblx0XHRyZXR1cm4gdHI7XG5cdH1cblxuXHRhc3luYyBub3JtYWxQYXN0ZShlZGl0b3I6IEVkaXRvcik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjbGlwYm9hcmRUZXh0ID0gYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuXHRcdGlmIChjbGlwYm9hcmRUZXh0ID09PSBudWxsIHx8IGNsaXBib2FyZFRleHQgPT09IFwiXCIpIHJldHVybjtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmxvZyhcIk5vcm1hbCBQYXN0ZSEhXCIpXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciwgbm90IHR5cGVkXG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGxldCBtYWluU2VsZWN0aW9uID0gZWRpdG9yVmlldy5zdGF0ZS5zZWxlY3Rpb24uYXNTaW5nbGUoKS5tYWluO1xuXHRcdGVkaXRvclZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0Y2hhbmdlczogeyBmcm9tOiBtYWluU2VsZWN0aW9uLmZyb20sIHRvOiBtYWluU2VsZWN0aW9uLnRvLCBpbnNlcnQ6IGNsaXBib2FyZFRleHQgfSxcblx0XHRcdHVzZXJFdmVudDogXCJpbnB1dC5wYXN0ZVwiXG5cdFx0fSk7XG5cdH1cblxuXHR2aWV3VXBkYXRlUGx1Z2luID0gKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuXHRcdGlmICh0aGlzLm9uRm9ybWF0QXJ0aWNsZSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG5cdFx0bGV0IG5vdFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRsZXQgbWFpblNlbGVjdGlvbiA9IHVwZGF0ZS52aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0aWYgKG1haW5TZWxlY3Rpb24uYW5jaG9yICE9IG1haW5TZWxlY3Rpb24uaGVhZCkgbm90U2VsZWN0ZWQgPSBmYWxzZTtcblx0XHRpZiAoIXVwZGF0ZS5kb2NDaGFuZ2VkKSByZXR1cm47XG5cblx0XHRsZXQgaXNFeGNsdWRlRmlsZSA9IHRoaXMuaXNDdXJyZW50RmlsZUV4Y2x1ZGUoKTtcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duLCBpc0V4Y2x1ZGVGaWxlKVxuXG5cdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiLS0tLS1WaWV3VXBkYXRlQ2hhbmdlLS0tLS1cIik7XG5cdFx0bGV0IHRyID0gdXBkYXRlLnRyYW5zYWN0aW9uc1swXVxuXHRcdGxldCBjaGFuZ2VUeXBlID0gZ2V0VHlwZVN0ck9mVHJhbnNhYyh0cik7XG5cblx0XHR0ci5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CLCBpbnNlcnRlZCkgPT4ge1xuXHRcdFx0bGV0IGluc2VydGVkU3RyID0gaW5zZXJ0ZWQuc2xpY2VTdHJpbmcoMCk7XG5cdFx0XHRsZXQgY2hhbmdlZFN0ciA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb21BLCB0b0EpO1xuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xuXHRcdFx0XHRjb25zb2xlLmxvZyhcIltWaWV3VXBkYXRlXSB0eXBlLCBmcm9tQSwgdG9BLCBjaGFuZ2VkLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFwiKTtcblx0XHRcdFx0Y29uc29sZS5sb2coY2hhbmdlVHlwZSwgZnJvbUEsIHRvQSwgY2hhbmdlZFN0ciwgZnJvbUIsIHRvQiwgaW5zZXJ0ZWRTdHIpXG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiPT0+W0NvbXBvc2luZ11cIiwgdXBkYXRlLnZpZXcuY29tcG9zaW5nKVxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0YWJsZSBcdTUxODVcdTkwRThcdTRFMERcdTUwNUFcdTU5MDRcdTc0MDZcdUZGMENcdTc2RjRcdTYzQTVcdThGRDRcdTU2REUgPT4gXHU5MTREXHU1NDA4IE9ic2lkaWFuIFx1NzY4NFx1NjczQVx1NTIzNlxuXHRcdFx0aWYgKGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCBmcm9tQikgPT0gTGluZVR5cGUudGFibGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTYyN0VcdTUyMzBcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcdUZGMENcdTZCRDRcdThGODNcdTU0OEMgdG9CIFx1NzY4NFx1NEY0RFx1N0Y2RVx1NjYyRlx1NTQyNlx1NzZGOFx1NTQwQ1x1RkYwQ1x1NzZGOFx1NTQwQ1x1NEUxNFx1NjcwMFx1N0VDOFx1NjNEMlx1NTE2NVx1NjU4N1x1NUI1N1x1NEUzQVx1NEUyRFx1NjU4N1x1RkYwQ1x1NTIxOVx1NEUzQVx1NEUyRFx1NjU4N1x1OEY5M1x1NTE2NVx1N0VEM1x1Njc1Rlx1NzY4NFx1NzJCNlx1NjAwMVxuXHRcdFx0bGV0IGN1cnNvciA9IHVwZGF0ZS52aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0XHRsZXQgQ2hpbmVzZVJlZ0V4cCA9IC9eW1xcdTRlMDAtXFx1OWZhNVx1MzAxMFx1MzAxMVx1MDBCN1x1RkZFNVx1MzAwQVx1MzAwQlx1RkYxRlx1RkYxQVx1RkYxQlx1MjAxOVx1MjAxOFx1MjAxRFx1MjAxQ1x1MzAwQ1x1MzAwRFx1MzAwMVx1MzAwMlx1RkYwQ1x1RkYwOFx1RkYwOVx1RkYwMVx1MjAxNFx1MjAxNFx1MjAyNlx1MjAyNlxcZF0rJC87XG5cdFx0XHRsZXQgY2hpbmVzZUVuZEZsYWcgPSBjaGFuZ2VUeXBlID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIgJiZcblx0XHRcdFx0Y3Vyc29yLmFuY2hvciA9PSBjdXJzb3IuaGVhZCAmJiBjdXJzb3IuYW5jaG9yID09PSB0b0IgJiZcblx0XHRcdFx0Q2hpbmVzZVJlZ0V4cC50ZXN0KGluc2VydGVkU3RyKTtcblxuXHRcdFx0aWYgKGNoYW5nZVR5cGUgIT0gXCJpbnB1dC50eXBlLmNvbXBvc2VcIikgdGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gZmFsc2U7XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ICYmIG5vdFNlbGVjdGVkICYmICFpc0V4Y2x1ZGVGaWxlICYmXG5cdFx0XHRcdChnZXRQb3NMaW5lVHlwZSh1cGRhdGUudmlldy5zdGF0ZSwgZnJvbUIpID09IExpbmVUeXBlLnRleHQgfHwgZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIGZyb21CKSA9PSBMaW5lVHlwZS50YWJsZSkpIHtcblx0XHRcdFx0aWYgKGNoYW5nZVR5cGUgPT0gXCJpbnB1dC50eXBlLmNvbXBvc2VcIikge1xuXHRcdFx0XHRcdGlmICghL15cXGQkLy50ZXN0KGluc2VydGVkU3RyKSl7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9zZV9iZWdpbl9wb3MgPSBmcm9tQjtcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb3NlX2VuZF9wb3MgPSB0b0I7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb3NlX2VuZF9wb3MgPSB0b0I7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLmNvbXBvc2VfYmVnaW5fcG9zID09IHRoaXMuY29tcG9zZV9lbmRfcG9zKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjaGluZXNlRW5kRmxhZykgdGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb3NlX25lZWRfaGFuZGxlKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9zZV9lbmRfcG9zID0gdG9CO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5jb21wb3NlX2JlZ2luX3BvcyA9PSB0aGlzLmNvbXBvc2VfZW5kX3Bvcykge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNoaW5lc2VFbmRGbGFnID0gdGhpcy5jb21wb3NlX25lZWRfaGFuZGxlP2ZhbHNlOmNoaW5lc2VFbmRGbGFnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY2hpbmVzZUVuZEZsYWcpIHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IGZhbHNlO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIkNvbXBvc2VcIiwgY2hpbmVzZUVuZEZsYWcsIHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSk7XG5cdFx0XHR9XG5cblxuXHRcdFx0Ly8gXHU1MjI0XHU2NUFEXHU2QkNGXHU2QjIxXHU4RjkzXHU1MTY1XHU3RUQzXHU2NzVGXG5cdFx0XHRpZiAoY2hhbmdlVHlwZSA9PSAnaW5wdXQudHlwZScgfHwgY2hhbmdlVHlwZSA9PSBcImlucHV0XCIgfHwgY2hpbmVzZUVuZEZsYWcgfHwgY2hhbmdlVHlwZSA9PSAnbm9uZScpIHtcblx0XHRcdFx0Ly8gXHU3NTI4XHU2MjM3XHU4MUVBXHU1QjlBXHU0RTQ5XHU4RjZDXHU1MzE2XHU4OUM0XHU1MjE5XG5cdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5Vc2VyQ29udmVydFJ1bGVzKSB7XG5cdFx0XHRcdFx0Ly8gaWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuc3Vic3RyaW5nKHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gaW5zZXJ0ZWRTdHIubGVuZ3RoKSkgY29udGludWU7XG5cdFx0XHRcdFx0bGV0IGxlZnQgPSB1cGRhdGUudmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQik7XG5cdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdXBkYXRlLnZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiwgdG9CICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRsZXQgaW5zZXJ0ZWQgPSBydWxlLmFmdGVyLmxlZnQgKyBydWxlLmFmdGVyLnJpZ2h0O1xuXHRcdFx0XHRcdGxldCBhbmNob3IgPSB0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IGZyb20gPSB0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aDtcblx0XHRcdFx0XHRsZXQgdG8gPSB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGg7XG5cdFx0XHRcdFx0Ly8gXHU1QkY5XHU2NTg3XHU2ODYzXHU5OTk2XHU4ODRDXHU4OUM0XHU1MjE5XHU1MDVBXHU3Mjc5XHU2QjhBXHU1OTA0XHU3NDA2XG5cdFx0XHRcdFx0aWYgKHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KDApID09PSAnXFxuJyAmJiBydWxlLmFmdGVyLmxlZnQuY2hhckF0KDApID09PSAnXFxuJyAmJlxuXHRcdFx0XHRcdFx0dG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgrMT09MCkge1xuXHRcdFx0XHRcdFx0bGVmdCA9ICdcXG4nICsgbGVmdDtcblx0XHRcdFx0XHRcdGluc2VydGVkID0gaW5zZXJ0ZWQuc3Vic3RyaW5nKDEpO1xuXHRcdFx0XHRcdFx0ZnJvbSA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChsZWZ0ID09PSBydWxlLmJlZm9yZS5sZWZ0ICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0dXBkYXRlLnZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZnJvbTogZnJvbSxcblx0XHRcdFx0XHRcdFx0XHR0bzogdG8sXG5cdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBpbnNlcnRlZFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBhbmNob3IgfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuUHVuY1JlY3RpZnkgJiYgY2hpbmVzZUVuZEZsYWcgJiYgdGhpcy5jb21wb3NlX2JlZ2luX3BvcyA+IDEgJiZcblx0XHRcdFx0XHQvWywuPyFdLy50ZXN0KHVwZGF0ZS52aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyh0aGlzLmNvbXBvc2VfYmVnaW5fcG9zIC0gMSwgdGhpcy5jb21wb3NlX2JlZ2luX3BvcykpKSB7XG5cdFx0XHRcdFx0bGV0IHB1bmMgPSB1cGRhdGUudmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodGhpcy5jb21wb3NlX2JlZ2luX3BvcyAtIDEsIHRoaXMuY29tcG9zZV9iZWdpbl9wb3MpXG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tcG9zZV9iZWdpbl9wb3MgPiAyICYmXG5cdFx0XHRcdFx0XHQvW1xcc1xcblxcd10vLnRlc3QodXBkYXRlLnZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuY29tcG9zZV9iZWdpbl9wb3MgLSAyLCB0aGlzLmNvbXBvc2VfYmVnaW5fcG9zIC0gMSkpKSB7IH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdHVwZGF0ZS52aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdGZyb206IHRoaXMuY29tcG9zZV9iZWdpbl9wb3MgLSAxLFxuXHRcdFx0XHRcdFx0XHRcdHRvOiB0aGlzLmNvbXBvc2VfYmVnaW5fcG9zLFxuXHRcdFx0XHRcdFx0XHRcdGluc2VydDogdGhpcy5oYWxmVG9GdWxsU3ltYm9sTWFwLmdldChwdW5jKVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQvLyBzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gXHU1MjI0XHU2NUFEXHU2ODNDXHU1RjBGXHU1MzE2XHU2NTg3XHU2NzJDXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwicmVhZHkgdG8gZm9ybWF0XCIpO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImNoZWNrIGlzIGV4Y2x1ZSBmaWxlOlwiLCBpc0V4Y2x1ZGVGaWxlKVxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ICYmIG5vdFNlbGVjdGVkICYmICFpc0V4Y2x1ZGVGaWxlICYmXG5cdFx0XHRcdFx0IChjaGFuZ2VUeXBlICE9ICdub25lJyB8fCBpbnNlcnRlZFN0cj09XCJcXG5cIikpIHtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRpZiAoZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIGZyb21CKSA9PSBMaW5lVHlwZS50ZXh0IHx8IGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCBmcm9tQikgPT0gTGluZVR5cGUudGFibGUpe1xuXHRcdFx0XHRcdFx0bGV0IGNoYW5nZXMgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmVPZkRvYyh1cGRhdGUuc3RhdGUsIHRoaXMuc2V0dGluZ3MsIGZyb21CLCBjdXJzb3IuYW5jaG9yLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdFx0XHRpZiAoY2hhbmdlcyAhPSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZS52aWV3LmRpc3BhdGNoKC4uLmNoYW5nZXNbMF0pO1xuXHRcdFx0XHRcdFx0XHR1cGRhdGUudmlldy5kaXNwYXRjaChjaGFuZ2VzWzFdKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTdDOThcdThEMzRcdTY1RjZcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgJiYgIWlzRXhjbHVkZUZpbGUgJiYgY2hhbmdlVHlwZSA9PSBcImlucHV0LnBhc3RlXCIgJiYgIVBsYXRmb3JtLmlzSW9zQXBwKSB7XG5cdFx0XHRcdGxldCB1cGRhdGVMaW5lU3RhcnQgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChmcm9tQikubnVtYmVyO1xuXHRcdFx0XHRsZXQgdXBkYXRlTGluZUVuZCA9IHVwZGF0ZS5zdGF0ZS5kb2MubGluZUF0KHRvQikubnVtYmVyO1xuXHRcdFx0XHRpZiAodXBkYXRlTGluZVN0YXJ0ID09IHVwZGF0ZUxpbmVFbmQgJiYgZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIHRvQikgPT0gTGluZVR5cGUudGV4dCkge1xuXHRcdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2ModXBkYXRlLnN0YXRlLCB0aGlzLnNldHRpbmdzLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdFx0aWYgKGNoYW5nZXMgIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dXBkYXRlLnZpZXcuZGlzcGF0Y2goLi4uY2hhbmdlc1swXSk7XG5cdFx0XHRcdFx0XHQvLyB1cGRhdGUudmlldy5kaXNwYXRjaChjaGFuZ2VzWzFdKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bGV0IGFsbF9jaGFuZ2VzOiBUcmFuc2FjdGlvblNwZWNbXSA9IFtdO1xuXHRcdFx0XHRcdGxldCBpbnNlcnRlZF9hcnJheSA9IGluc2VydGVkU3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0XHRcdGxldCB1cGRhdGVfc3RhcnQgPSBmcm9tQlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSB1cGRhdGVMaW5lU3RhcnQ7IGkgPD0gdXBkYXRlTGluZUVuZDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRsZXQgcmVhbF9pbnNlcnRlZCA9IGluc2VydGVkX2FycmF5W2kgLSB1cGRhdGVMaW5lU3RhcnRdO1xuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ3JlYWxfaW5zZXJ0ZWQnLCByZWFsX2luc2VydGVkLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSlcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCd1cGRhdGVfZG9jX3RleHQnLCB1cGRhdGUuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHVwZGF0ZV9zdGFydCwgdXBkYXRlX3N0YXJ0ICsgcmVhbF9pbnNlcnRlZC5sZW5ndGgpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSlcblx0XHRcdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2ModXBkYXRlLnN0YXRlLCB0aGlzLnNldHRpbmdzLCB1cGRhdGVfc3RhcnQsIHVwZGF0ZV9zdGFydCArIHJlYWxfaW5zZXJ0ZWQubGVuZ3RoLCByZWFsX2luc2VydGVkKTtcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdjaGFuZ2VzJywgY2hhbmdlcylcblx0XHRcdFx0XHRcdGlmIChjaGFuZ2VzICE9IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0YWxsX2NoYW5nZXMucHVzaCguLi5jaGFuZ2VzWzBdKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHVwZGF0ZV9zdGFydCArPSByZWFsX2luc2VydGVkLmxlbmd0aCArIDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhbGxfY2hhbmdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHR1cGRhdGUudmlldy5kaXNwYXRjaCguLi5hbGxfY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XHQvLyBpdGVyY2hhbmdlcyBlbmRcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlVGFiRG93biA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLlRhYm91dCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IHN0YXRlID0gdmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0Y29uc3QgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpO1xuXHRcdGNvbnN0IHMgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblx0XHRpZiAocy5yYW5nZXMubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXHRcdGNvbnN0IHBvcyA9IHMubWFpbi50bztcblx0XHRsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKVxuXG5cdFx0Ly8gRGVidWcgaW5mb1xuXHRcdC8vIGNvbnNvbGUubG9nKGxpbmUudGV4dClcblx0XHQvLyBmb3IgKGxldCBwPWxpbmUuZnJvbTsgcDw9bGluZS50bzsgcCs9MSl7XG5cdFx0Ly8gXHRjb25zdCB0b2tlbiA9IHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lXG5cdFx0Ly8gXHRjb25zb2xlLmxvZyhwLWxpbmUuZnJvbSwgdG9rZW4pXG5cdFx0Ly8gfVxuXHRcdC8vIHJldHVybiB0cnVlO1xuXG5cdFx0aWYgKHMubWFpbi5mcm9tPT1zLm1haW4udG8gJiYgZ2V0UG9zTGluZVR5cGUodmlldy5zdGF0ZSwgcy5tYWluLmZyb20pID09IExpbmVUeXBlLmNvZGVibG9jayl7XG5cdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdGZyb206IHMubWFpbi5mcm9tLFxuXHRcdFx0XHRcdGluc2VydDogdGhpcy5vYnNpZGlhblNldHRpbmdzLmdldERlZmF1bHRJbmRlbnRDaGFycygpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlbGVjdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogcy5tYWluLmZyb20gKyB0aGlzLm9ic2lkaWFuU2V0dGluZ3MuZ2V0RGVmYXVsdEluZGVudENoYXJzKCkubGVuZ3RoXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gcmV0dXJuIHRydWU7XG5cblx0XHQvLyBcdTVGNTNcdTUxNDlcdTY4MDdcdTU3MjhcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTUxODVcdTkwRThcblx0XHRpZiAocG9zIC0gbGluZS5mcm9tICE9IDAgJiYgdHJlZS5yZXNvbHZlKHBvcyAtIDEsIDEpLm5hbWUuY29udGFpbnMoJ2lubGluZS1jb2RlJykpIHtcblx0XHRcdGlmICh0cmVlLnJlc29sdmUocG9zLCAxKS5uYW1lLmNvbnRhaW5zKCdmb3JtYXR0aW5nLWNvZGVfaW5saW5lLWNvZGUnKSkge1xuXHRcdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwb3MgKyAxLCBoZWFkOiBwb3MgKyAxIH1cblx0XHRcdFx0fSlcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IHAgPSBwb3MgKyAxOyBwIDwgbGluZS50byAmJiB0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnaW5saW5lLWNvZGUnKTsgcCArPSAxKSB7XG5cdFx0XHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NjI3RVx1NTIzMCBgIFx1NTIxOVx1NTE0OVx1NjgwN1x1OERGM1x1NTIzMFx1NTE3Nlx1NTQwRVxuXHRcdFx0XHRpZiAodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2Zvcm1hdHRpbmctY29kZV9pbmxpbmUtY29kZScpKSB7XG5cdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwLCBoZWFkOiBwIH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NkNBMVx1NjI3RVx1NTIzMCBgIFx1NTIxOVx1NzZGNFx1NjNBNVx1OERGM1x1NTIzMFx1ODg0Q1x1NUMzRVxuXHRcdFx0XHRpZiAocCA9PSBsaW5lLnRvIC0gMSAmJiB0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnaW5saW5lLWNvZGUnKSkge1xuXHRcdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogcCArIDEsIGhlYWQ6IHAgKyAxIH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gXHU1RjUzXHU1MTQ5XHU2ODA3XHU1NzI4XHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1OTE2XHU5MEU4XHVGRjBDXHU1RTc2XHU1NzI4XHU5MDA5XHU0RTJEXHU2NTg3XHU2NzJDXHU3Njg0XHU2MEM1XHU1MUI1XHU0RTBCXHVGRjBDdGFiXHU1QzA2XHU0RjFBXHU4REYzXHU1MUZBXHU1MjMwcGFpcnN0cmluZ1x1NzY4NFx1NTkxNlx1OTBFOFxuXHRcdGxldCBzZWxlY3Rpb24gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0bGV0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmFuY2hvciAhPSBzZWxlY3Rpb24uaGVhZDtcblx0XHRpZiAoc2VsZWN0ZWQpe1xuXHRcdFx0bGV0IG5ld19hbmNob3IgPSBzZWxlY3Rpb24uYW5jaG9yPHNlbGVjdGlvbi5oZWFkP3NlbGVjdGlvbi5hbmNob3I6c2VsZWN0aW9uLmhlYWQ7XG5cdFx0XHRsZXQgbmV3X2hlYWQgPSBzZWxlY3Rpb24uYW5jaG9yPnNlbGVjdGlvbi5oZWFkP3NlbGVjdGlvbi5hbmNob3I6c2VsZWN0aW9uLmhlYWQ7XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcInNlbGVjdGlvblwiLCBzZWxlY3Rpb24uYW5jaG9yLCBzZWxlY3Rpb24uaGVhZClcblxuXHRcdFx0Zm9yIChsZXQgcHN0ciBvZiB0aGlzLlRhYm91dFBhaXJTdHJzKXtcblx0XHRcdFx0aWYgKGRvYy5zbGljZVN0cmluZyhuZXdfYW5jaG9yLXBzdHIubGVmdC5sZW5ndGgsIG5ld19hbmNob3IpID09IHBzdHIubGVmdCAmJlxuXHRcdFx0XHRcdGRvYy5zbGljZVN0cmluZyhuZXdfaGVhZCwgbmV3X2hlYWQrcHN0ci5yaWdodC5sZW5ndGgpID09IHBzdHIucmlnaHQpe1xuXHRcdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IG5ld19oZWFkK3BzdHIucmlnaHQubGVuZ3RoLCBoZWFkOiBuZXdfaGVhZCtwc3RyLnJpZ2h0Lmxlbmd0aCB9XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBoYW5kbGVFbnRlciA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0Ly8gY29uc29sZS5sb2coXCJ0aGlzLnNldHRpbmdzLkVudGVyVHdpY2VcIiwgdGhpcy5zZXR0aW5ncy5FbnRlclR3aWNlKVxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5FbnRlclR3aWNlKSByZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBjb25zdCBiYXNlUGF0aCA9ICh0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIGFueSkuYmFzZVBhdGhcblx0XHQvLyBsZXQgY29uZmlnX3BhdGggPSBiYXNlUGF0aCArIFwiL1wiICsgdGhpcy5hcHAudmF1bHQuY29uZmlnRGlyICsgXCIvYXBwLmpzb25cIjtcblx0XHQvLyBsZXQgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnX3BhdGgsICd1dGYtOCcpKVxuXHRcdC8vIGxldCBzdHJpY3RMaW5lQnJlYWtzID0gY29uZmlnLnN0cmljdExpbmVCcmVha3MgfHwgZmFsc2U7XG5cdFx0bGV0IHN0cmljdExpbmVCcmVha3MgPSB0aGlzLmFwcC52YXVsdC5nZXRDb25maWcoXCJzdHJpY3RMaW5lQnJlYWtzXCIpO1xuXHRcdGlmICghc3RyaWN0TGluZUJyZWFrcykgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IHN0YXRlID0gdmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0Y29uc3QgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpO1xuXHRcdGNvbnN0IHMgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblx0XHRpZiAocy5yYW5nZXMubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXHRcdGNvbnN0IHBvcyA9IHMubWFpbi50bztcblx0XHRsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKVxuXG5cdFx0Ly8gY29uc29sZS5sb2cobGluZS50ZXh0LCBnZXRQb3NMaW5lVHlwZTIoc3RhdGUsIHBvcykpXG5cdFx0Ly8gZm9yIChsZXQgcD1saW5lLmZyb207IHA8PWxpbmUudG87IHArPTEpe1xuXHRcdC8vIFx0Y29uc3QgdG9rZW4gPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuXHRcdC8vIFx0Y29uc29sZS5sb2cocC1saW5lLmZyb20sIHRva2VuKVxuXHRcdC8vIH1cblx0XHRpZiAoL15cXHMqJC8udGVzdChsaW5lLnRleHQpKSByZXR1cm4gZmFsc2U7XG5cdFx0ZWxzZSBpZiAoZ2V0UG9zTGluZVR5cGUyKHN0YXRlLCBwb3MpID09IExpbmVUeXBlLnRleHQpIHtcblx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZnJvbTogcG9zLFxuXHRcdFx0XHRcdHRvOiBwb3MsXG5cdFx0XHRcdFx0aW5zZXJ0OiAnXFxuXFxuJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwb3MgKyAyIH0sXG5cdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbktleXVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50LCB2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiS2V5dXA6XCIsIGV2ZW50LmtleSwgZXZlbnQuc2hpZnRLZXksIGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpO1xuXHRcdFx0Y29uc29sZS5sb2coXCJLZXl1cDpcIiwgZXZlbnQua2V5KTtcblx0XHR9XG5cdFx0dGhpcy5oYW5kbGVFbmRDb21wb3NlVHlwZUtleShldmVudCwgdmlldyk7XG5cdH1cblxuXHRoYW5kbGVFbmRDb21wb3NlVHlwZUtleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCwgdmlldzogRWRpdG9yVmlldykgPT4ge1xuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5UcnlGaXhDaGluZXNlSU0pIHJldHVybjtcblx0XHRpZiAoWydFbnRlcicsICdQcm9jZXNzJywgJyAnLCAnU2hpZnQnXS5jb250YWlucyhldmVudC5rZXkpICYmIHRoaXMuc2V0dGluZ3MuQXV0b0Zvcm1hdCAmJlxuXHRcdFx0dGhpcy5jb21wb3NlX25lZWRfaGFuZGxlICYmICF0aGlzLmlzQ3VycmVudEZpbGVFeGNsdWRlKCkpIHtcblx0XHRcdGxldCBjdXJzb3IgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0XHRpZiAoZ2V0UG9zTGluZVR5cGUodmlldy5zdGF0ZSwgY3Vyc29yLmFuY2hvcikgIT0gTGluZVR5cGUudGV4dCkgcmV0dXJuO1xuXHRcdFx0aWYgKGN1cnNvci5oZWFkICE9IGN1cnNvci5hbmNob3IpIHJldHVybjtcblx0XHRcdGxldCBpbnNlcnRlZFN0ciA9IHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuY29tcG9zZV9iZWdpbl9wb3MsIGN1cnNvci5hbmNob3IpO1xuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJpbnNlcnRlZCBzdHJcIiwgaW5zZXJ0ZWRTdHIpO1xuXHRcdFx0bGV0IGNoYW5nZXMgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmVPZkRvYyh2aWV3LnN0YXRlLCB0aGlzLnNldHRpbmdzLFxuXHRcdFx0XHR0aGlzLmNvbXBvc2VfYmVnaW5fcG9zLCBjdXJzb3IuYW5jaG9yLCBpbnNlcnRlZFN0cik7XG5cdFx0XHR0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUgPSBmYWxzZTtcblx0XHRcdGlmIChjaGFuZ2VzICE9IG51bGwpIHtcblx0XHRcdFx0dmlldy5kaXNwYXRjaCguLi5jaGFuZ2VzWzBdKTtcblx0XHRcdFx0dmlldy5kaXNwYXRjaChjaGFuZ2VzWzFdKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZvcm1hdEFydGljbGUgPSAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQgPT4ge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IsIG5vdCB0eXBlZFxuXHRcdGNvbnN0IGVkaXRvclZpZXcgPSBlZGl0b3IuY20gYXMgRWRpdG9yVmlldztcblx0XHRjb25zdCB0cmVlID0gZW5zdXJlU3ludGF4VHJlZShlZGl0b3JWaWV3LnN0YXRlLCBlZGl0b3JWaWV3LnN0YXRlLmRvYy5sZW5ndGgpO1xuXHRcdGlmICghdHJlZSl7XG5cdFx0XHRuZXcgTm90aWNlKCdFYXN5VHlwaW5nOiBTeW50YXggdHJlZSBpcyBub3QgcmVhZHkgeWV0LCBwbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluIGxhdGVyIScsIDUwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMub25Gb3JtYXRBcnRpY2xlID0gdHJ1ZTtcblx0XHRcblx0XHRsZXQgbGluZUNvdW50ID0gZWRpdG9yLmxpbmVDb3VudCgpO1xuXHRcdGxldCBuZXdfYXJ0aWNsZSA9IFwiXCI7XG5cdFx0bGV0IGNzID0gZWRpdG9yLmdldEN1cnNvcigpO1xuXHRcdGxldCBjaCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuXHRcdFx0aWYgKGkgIT0gMCkgbmV3X2FydGljbGUgKz0gJ1xcbic7XG5cdFx0XHRpZiAoaSAhPSBjcy5saW5lKSB7XG5cdFx0XHRcdG5ld19hcnRpY2xlICs9IHRoaXMucHJlRm9ybWF0T25lTGluZShlZGl0b3IsIGkgKyAxKVswXTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRsZXQgbmV3RGF0YSA9IHRoaXMucHJlRm9ybWF0T25lTGluZShlZGl0b3IsIGkgKyAxLCBjcy5jaCk7XG5cdFx0XHRcdG5ld19hcnRpY2xlICs9IG5ld0RhdGFbMF07XG5cdFx0XHRcdGNoID0gbmV3RGF0YVsxXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWRpdG9yLnNldFZhbHVlKG5ld19hcnRpY2xlKTtcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogY3MubGluZSwgY2g6IGNoIH0pO1xuXG5cdFx0dGhpcy5vbkZvcm1hdEFydGljbGUgPSBmYWxzZTtcblxuXHRcdG5ldyBOb3RpY2UoXCJFYXN5VHlwaW5nOiBGb3JtYXQgQXJ0aWNsZSBEb25lIVwiKTtcblx0fVxuXG5cdGlzQ3VycmVudEZpbGVFeGNsdWRlKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID09IFwiXCIpIHtcblx0XHRcdGxldCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdGlmIChmaWxlICE9IG51bGwgJiYgdGhpcy5DdXJBY3RpdmVNYXJrZG93biAhPSBmaWxlLnBhdGgpIHtcblx0XHRcdFx0dGhpcy5DdXJBY3RpdmVNYXJrZG93biA9IGZpbGUucGF0aDtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IGV4Y2x1ZGVQYXRocyA9IHRoaXMuc2V0dGluZ3MuRXhjbHVkZUZpbGVzLnNwbGl0KCdcXG4nKTtcblx0XHRmb3IgKGxldCBlcGF0aCBvZiBleGNsdWRlUGF0aHMpIHtcblx0XHRcdGlmIChlcGF0aC5jaGFyQXQoMCkgPT0gJy8nKSBlcGF0aCA9IGVwYXRoLnN1YnN0cmluZygxKTtcblx0XHRcdGlmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID09IGVwYXRoKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGxldCBsZW4gPSBlcGF0aC5sZW5ndGg7XG5cdFx0XHRpZiAodGhpcy5DdXJBY3RpdmVNYXJrZG93bi5zdWJzdHJpbmcoMCwgbGVuKSA9PSBlcGF0aCAmJiAodGhpcy5DdXJBY3RpdmVNYXJrZG93bi5jaGFyQXQobGVuKSA9PSAnLycgfHwgdGhpcy5DdXJBY3RpdmVNYXJrZG93bi5jaGFyQXQobGVuKSA9PSAnXFxcXCcgfHxcblx0XHRcdFx0ZXBhdGguY2hhckF0KGxlbiAtIDEpID09IFwiL1wiIHx8IGVwYXRoLmNoYXJBdChsZW4gLSAxKSA9PSBcIlxcXFxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvcm1hdFNlbGVjdGlvbk9yQ3VyTGluZSA9IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KTogdm9pZCA9PiB7XG5cdFx0aWYgKCFlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSB8fCBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkgPT09ICcnKSB7XG5cdFx0XHRsZXQgbGluZU51bWJlciA9IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lO1xuXHRcdFx0bGV0IG5ld0xpbmVEYXRhID0gdGhpcy5wcmVGb3JtYXRPbmVMaW5lKGVkaXRvciwgbGluZU51bWJlciArIDEsIGVkaXRvci5nZXRDdXJzb3IoKS5jaCk7XG5cdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKG5ld0xpbmVEYXRhWzBdLCB7IGxpbmU6IGxpbmVOdW1iZXIsIGNoOiAwIH0sIHsgbGluZTogbGluZU51bWJlciwgY2g6IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpLmxlbmd0aCB9KTtcblx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oeyBsaW5lOiBsaW5lTnVtYmVyLCBjaDogbmV3TGluZURhdGFbMV0gfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxldCBzZWxlY3Rpb24gPSBlZGl0b3IubGlzdFNlbGVjdGlvbnMoKVswXTtcblx0XHRsZXQgYmVnaW4gPSBzZWxlY3Rpb24uYW5jaG9yLmxpbmU7XG5cdFx0bGV0IGVuZCA9IHNlbGVjdGlvbi5oZWFkLmxpbmU7XG5cdFx0aWYgKGJlZ2luID4gZW5kKSB7XG5cdFx0XHRsZXQgdGVtcCA9IGJlZ2luO1xuXHRcdFx0YmVnaW4gPSBlbmQ7XG5cdFx0XHRlbmQgPSB0ZW1wO1xuXHRcdH1cblx0XHQvLyBjb25zb2xlLmxvZyhiZWdpbiwgZW5kKVxuXHRcdGxldCBuZXdfbGluZXMgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSBiZWdpbjsgaSA8PSBlbmQ7IGkrKykge1xuXHRcdFx0aWYgKGkgIT0gYmVnaW4pIG5ld19saW5lcyArPSAnXFxuJztcblx0XHRcdG5ld19saW5lcyArPSB0aGlzLnByZUZvcm1hdE9uZUxpbmUoZWRpdG9yLCBpICsgMSlbMF07XG5cdFx0fVxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3X2xpbmVzLCB7IGxpbmU6IGJlZ2luLCBjaDogMCB9LCB7IGxpbmU6IGVuZCwgY2g6IGVkaXRvci5nZXRMaW5lKGVuZCkubGVuZ3RoIH0pO1xuXHRcdGlmIChzZWxlY3Rpb24uYW5jaG9yLmxpbmUgPCBzZWxlY3Rpb24uaGVhZC5saW5lKSB7XG5cdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHsgbGluZTogc2VsZWN0aW9uLmFuY2hvci5saW5lLCBjaDogMCB9LCB7IGxpbmU6IHNlbGVjdGlvbi5oZWFkLmxpbmUsIGNoOiBlZGl0b3IuZ2V0TGluZShzZWxlY3Rpb24uaGVhZC5saW5lKS5sZW5ndGggfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7IGxpbmU6IHNlbGVjdGlvbi5hbmNob3IubGluZSwgY2g6IGVkaXRvci5nZXRMaW5lKHNlbGVjdGlvbi5hbmNob3IubGluZSkubGVuZ3RoIH0sIHsgbGluZTogc2VsZWN0aW9uLmhlYWQubGluZSwgY2g6IDAgfSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gcGFyYW06IGxpbmVOdW1iZXIgaXMgKDEtYmFzZWQpLCBcdTVFOUZcdTVGMDNcdTUxRkRcdTY1NzBcblx0Zm9ybWF0T25lTGluZSA9IChlZGl0b3I6IEVkaXRvciwgbGluZU51bWJlcjogbnVtYmVyKTogdm9pZCA9PiB7XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciwgbm90IHR5cGVkXG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGxldCBzdGF0ZSA9IGVkaXRvclZpZXcuc3RhdGU7XG5cdFx0bGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKVxuXG5cdFx0aWYgKGdldFBvc0xpbmVUeXBlKHN0YXRlLCBsaW5lLmZyb20pID09IExpbmVUeXBlLnRleHQgfHwgZ2V0UG9zTGluZVR5cGUoc3RhdGUsIGxpbmUuZnJvbSkgPT0gTGluZVR5cGUudGFibGUpIHtcblx0XHRcdGxldCBvbGRMaW5lID0gbGluZS50ZXh0O1xuXHRcdFx0bGV0IG5ld0xpbmUgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmUoc3RhdGUsIGxpbmVOdW1iZXIsIHRoaXMuc2V0dGluZ3MsIG9sZExpbmUubGVuZ3RoLCAwKVswXTtcblx0XHRcdGlmIChvbGRMaW5lICE9IG5ld0xpbmUpIHtcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdMaW5lLCB7IGxpbmU6IGxpbmVOdW1iZXIgLSAxLCBjaDogMCB9LCB7IGxpbmU6IGxpbmVOdW1iZXIgLSAxLCBjaDogb2xkTGluZS5sZW5ndGggfSk7XG5cdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBsaW5lTnVtYmVyIC0gMSwgY2g6IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIgLSAxKS5sZW5ndGggfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIHBhcmFtOiBsaW5lTnVtYmVyIGlzICgxLWJhc2VkKVxuXHRwcmVGb3JtYXRPbmVMaW5lID0gKGVkaXRvcjogRWRpdG9yLCBsaW5lTnVtYmVyOiBudW1iZXIsIGNoOiBudW1iZXIgPSAtMSk6IFtzdHJpbmcsIG51bWJlcl0gPT4ge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IsIG5vdCB0eXBlZFxuXHRcdGNvbnN0IGVkaXRvclZpZXcgPSBlZGl0b3IuY20gYXMgRWRpdG9yVmlldztcblx0XHRsZXQgc3RhdGUgPSBlZGl0b3JWaWV3LnN0YXRlO1xuXHRcdGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUobGluZU51bWJlcilcblxuXHRcdGxldCBuZXdMaW5lID0gbGluZS50ZXh0O1xuXHRcdGxldCBuZXdDaCA9IDA7XG5cdFx0bGV0IGN1ckNoID0gbGluZS50ZXh0Lmxlbmd0aDtcblx0XHRpZiAoY2ggIT0gLTEpIHtcblx0XHRcdGN1ckNoID0gY2g7XG5cdFx0fVxuXHRcdGlmIChnZXRQb3NMaW5lVHlwZShzdGF0ZSwgbGluZS5mcm9tKSA9PSBMaW5lVHlwZS50ZXh0IHx8IGdldFBvc0xpbmVUeXBlKHN0YXRlLCBsaW5lLmZyb20pID09IExpbmVUeXBlLnRhYmxlKSB7XG5cdFx0XHRsZXQgbmV3TGluZURhdGEgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmUoc3RhdGUsIGxpbmVOdW1iZXIsIHRoaXMuc2V0dGluZ3MsIGN1ckNoLCAwKTtcblx0XHRcdG5ld0xpbmUgPSBuZXdMaW5lRGF0YVswXTtcblx0XHRcdG5ld0NoID0gbmV3TGluZURhdGFbMV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtuZXdMaW5lLCBuZXdDaF07XG5cdH1cblxuXHRkZWxldGVCbGFua0xpbmVzID0gKGVkaXRvcjogRWRpdG9yKTogdm9pZCA9PiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuYXBwLnZhdWx0LmdldENvbmZpZyhcInN0cmljdExpbmVCcmVha3NcIikpO1xuXHRcdFx0Ly8gcmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgc3RyaWN0TGluZUJyZWFrcyA9IHRoaXMuYXBwLnZhdWx0LmdldENvbmZpZyhcInN0cmljdExpbmVCcmVha3NcIik7XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yLCBub3QgdHlwZWRcblx0XHRjb25zdCBlZGl0b3JWaWV3ID0gZWRpdG9yLmNtIGFzIEVkaXRvclZpZXc7XG5cdFx0bGV0IHN0YXRlID0gZWRpdG9yVmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0XG5cdFx0Y29uc3QgdHJlZSA9IGVuc3VyZVN5bnRheFRyZWUoc3RhdGUsIGRvYy5sZW5ndGgpO1xuXHRcdGlmICghdHJlZSl7XG5cdFx0XHRuZXcgTm90aWNlKCdFYXN5VHlwaW5nOiBTeW50YXggdHJlZSBpcyBub3QgcmVhZHkgeWV0LCBwbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluIGxhdGVyIScsIDUwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRsZXQgc3RhcnRfbGluZSA9IDE7XG5cdFx0bGV0IGVuZF9saW5lID0gZG9jLmxpbmVzO1xuXHRcdGxldCBsaW5lX251bSA9IGRvYy5saW5lcztcblx0XHRjb25zdCBzZWxlY3RlZCA9IGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpICYmIGVkaXRvci5nZXRTZWxlY3Rpb24oKSAhPSAnJztcblx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdGxldCBzZWxlY3Rpb24gPSBlZGl0b3IubGlzdFNlbGVjdGlvbnMoKVswXTtcblx0XHRcdGxldCBiZWdpbiA9IHNlbGVjdGlvbi5hbmNob3IubGluZSArIDE7XG5cdFx0XHRsZXQgZW5kID0gc2VsZWN0aW9uLmhlYWQubGluZSArIDE7XG5cdFx0XHRpZiAoYmVnaW4gPiBlbmQpIHtcblx0XHRcdFx0bGV0IHRlbXAgPSBiZWdpbjtcblx0XHRcdFx0YmVnaW4gPSBlbmQ7XG5cdFx0XHRcdGVuZCA9IHRlbXA7XG5cdFx0XHR9XG5cdFx0XHRzdGFydF9saW5lID0gYmVnaW47XG5cdFx0XHRlbmRfbGluZSA9IGVuZFxuXHRcdH1cblxuXHRcdC8vIGlmKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xuXHRcdC8vIFx0bGV0IGxpbmVfaW5kZXggPSBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZSArIDE7XG5cdFx0Ly8gXHRsZXQgY29udGVudCA9IGVkaXRvci5nZXRMaW5lKGVkaXRvci5nZXRDdXJzb3IoKS5saW5lKTtcblx0XHQvLyBcdGNvbnNvbGUubG9nKGNvbnRlbnQpO1xuXHRcdC8vIFx0Zm9yIChsZXQgaT0wO2k8Y29udGVudC5sZW5ndGg7aSsrKXtcblx0XHQvLyBcdFx0bGV0IG5vZGUgPSB0cmVlLnJlc29sdmUoZG9jLmxpbmUobGluZV9pbmRleCkuZnJvbStpLCAxKTtcblx0XHQvLyBcdFx0Y29uc29sZS5sb2coaSwgbm9kZS5uYW1lKVxuXHRcdC8vIFx0fVxuXHRcdC8vIFx0cmV0dXJuO1xuXHRcdC8vIH1cblxuXHRcdGxldCBkZWxldGVfaW5kZXg6IG51bWJlcltdID0gW107XG5cdFx0bGV0IGJsYW5rX3JlZyA9IC9eXFxzKiQvO1xuXHRcdGxldCByZW1haW5fbmV4dF9ibGFuayA9IGZhbHNlO1xuXG5cdFx0aWYgKHN0YXJ0X2xpbmUgIT0gMSkge1xuXHRcdFx0bGV0IG5vZGUgPSB0cmVlLnJlc29sdmUoZG9jLmxpbmUoc3RhcnRfbGluZSAtIDEpLmZyb20sIDEpO1xuXHRcdFx0aWYgKG5vZGUubmFtZS5jb250YWlucygnbGlzdCcpIHx8IG5vZGUubmFtZS5jb250YWlucygncXVvdGUnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ2Jsb2NraWQnKSkge1xuXHRcdFx0XHRyZW1haW5fbmV4dF9ibGFuayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChlbmRfbGluZSAhPSBsaW5lX251bSAmJiAhYmxhbmtfcmVnLnRlc3QoZG9jLmxpbmUoZW5kX2xpbmUgKyAxKS50ZXh0KSkge1xuXHRcdFx0ZW5kX2xpbmUgKz0gMTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gc3RhcnRfbGluZTsgaSA8PSBlbmRfbGluZTsgaSsrKSB7XG5cdFx0XHRsZXQgbGluZSA9IGRvYy5saW5lKGkpO1xuXHRcdFx0bGV0IHBvcyA9IGxpbmUuZnJvbTtcblx0XHRcdGxldCBub2RlID0gdHJlZS5yZXNvbHZlKHBvcywgMSk7XG5cblx0XHRcdC8vIFx1NUJGOVx1NEU4RVx1N0E3QVx1NzY3RFx1ODg0Q1xuXHRcdFx0aWYgKGJsYW5rX3JlZy50ZXN0KGxpbmUudGV4dCkgJiYgIXJlbWFpbl9uZXh0X2JsYW5rKSB7XG5cdFx0XHRcdGRlbGV0ZV9pbmRleC5wdXNoKGkpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGJsYW5rX3JlZy50ZXN0KGxpbmUudGV4dCkgJiYgcmVtYWluX25leHRfYmxhbmspIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChub2RlLm5hbWUuY29udGFpbnMoJ2hyJykgJiYgZGVsZXRlX2luZGV4W2RlbGV0ZV9pbmRleC5sZW5ndGggLSAxXSA9PSBpIC0gMSkge1xuXHRcdFx0XHRkZWxldGVfaW5kZXgucG9wKClcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG5vZGUubmFtZS5jb250YWlucygnbGlzdCcpIHx8IG5vZGUubmFtZS5jb250YWlucygncXVvdGUnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ2Jsb2NraWQnKSkge1xuXHRcdFx0XHRyZW1haW5fbmV4dF9ibGFuayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gY29uc29sZS5sb2coXCJkZWxldGVfaW5kZXhcIixkZWxldGVfaW5kZXgpXG5cdFx0bGV0IG5ld0NvbnRlbnQgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgbGluZV9udW07IGkrKykge1xuXHRcdFx0aWYgKCFkZWxldGVfaW5kZXguY29udGFpbnMoaSkpIHtcblx0XHRcdFx0bmV3Q29udGVudCArPSBkb2MubGluZShpKS50ZXh0ICsgJ1xcbic7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZGVsZXRlX2luZGV4LmNvbnRhaW5zKGxpbmVfbnVtKSkge1xuXHRcdFx0bmV3Q29udGVudCArPSBkb2MubGluZShsaW5lX251bSkudGV4dFxuXHRcdH1cblxuXHRcdGVkaXRvci5zZXRWYWx1ZShuZXdDb250ZW50KTtcblx0XHQvLyB0aGlzLkNvbnRlbnRQYXJzZXIucmVwYXJzZShlZGl0b3IuZ2V0VmFsdWUoKSwgMCk7XG5cdH1cblxuXHRzd2l0Y2hBdXRvRm9ybWF0dGluZygpIHtcblx0XHR0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgPSAhdGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0O1xuXHRcdGxldCBzdGF0dXMgPSB0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgPyAnb24nIDogJ29mZic7XG5cdFx0bmV3IE5vdGljZSgnRWFzeVR5cGluZzogQXV0b2Zvcm1hdCBpcyAnICsgc3RhdHVzICsgJyEnKTtcblx0fVxuXG5cdGNvbnZlcnQyQ29kZUJsb2NrKGVkaXRvcjogRWRpdG9yKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiLS0tLS0gRWFzeVR5cGluZzogaW5zZXJ0IGNvZGUgYmxvY2stLS0tLVwiKTtcblx0XHRpZiAoZWRpdG9yLnNvbWV0aGluZ1NlbGVjdGVkICYmIGVkaXRvci5nZXRTZWxlY3Rpb24oKSAhPSBcIlwiKSB7XG5cdFx0XHRsZXQgc2VsZWN0ZWQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRsZXQgc2VsZWN0ZWRSYW5nZSA9IGVkaXRvci5saXN0U2VsZWN0aW9ucygpWzBdO1xuXHRcdFx0bGV0IGFuY2hvciA9IHNlbGVjdGVkUmFuZ2UuYW5jaG9yO1xuXHRcdFx0bGV0IGhlYWQgPSBzZWxlY3RlZFJhbmdlLmhlYWQ7XG5cblx0XHRcdGxldCByZXBsYWNlbWVudCA9IFwiYGBgXFxuXCIgKyBzZWxlY3RlZCArIFwiXFxuYGBgXCI7XG5cdFx0XHQvLyBtYWtlIHN1cmUgYW5jaG9yIDwgaGVhZFxuXHRcdFx0aWYgKGFuY2hvci5saW5lID4gaGVhZC5saW5lIHx8IChhbmNob3IubGluZSA9PSBoZWFkLmxpbmUgJiYgYW5jaG9yLmNoID4gaGVhZC5jaCkpIHtcblx0XHRcdFx0bGV0IHRlbXAgPSBhbmNob3I7XG5cdFx0XHRcdGFuY2hvciA9IGhlYWQ7XG5cdFx0XHRcdGhlYWQgPSB0ZW1wO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGRzdExpbmUgPSBhbmNob3IubGluZTtcblx0XHRcdGlmIChhbmNob3IuY2ggIT0gMCkge1xuXHRcdFx0XHRyZXBsYWNlbWVudCA9ICdcXG4nICsgcmVwbGFjZW1lbnQ7XG5cdFx0XHRcdGRzdExpbmUgKz0gMTtcblx0XHRcdH1cblx0XHRcdGlmIChoZWFkLmNoICE9IGVkaXRvci5nZXRMaW5lKGhlYWQubGluZSkubGVuZ3RoKSB7XG5cdFx0XHRcdHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHJlcGxhY2VtZW50KTtcblx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBkc3RMaW5lLCBjaDogMyB9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsZXQgY3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cdFx0XHRsZXQgcmVwbGFjZSA9IFwiYGBgXFxuYGBgXCI7XG5cdFx0XHRsZXQgZHN0TGluZSA9IGNzLmxpbmU7XG5cdFx0XHRpZiAoY3MuY2ggIT0gMCkge1xuXHRcdFx0XHRyZXBsYWNlID0gXCJcXG5cIiArIHJlcGxhY2U7XG5cdFx0XHRcdGRzdExpbmUgKz0gMTtcblx0XHRcdH1cblx0XHRcdGlmIChjcy5jaCAhPSBlZGl0b3IuZ2V0TGluZShjcy5saW5lKS5sZW5ndGgpIHtcblx0XHRcdFx0cmVwbGFjZSA9IHJlcGxhY2UgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UocmVwbGFjZSwgY3MpO1xuXHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGRzdExpbmUsIGNoOiAzIH0pO1xuXHRcdH1cblxuXHR9XG5cblx0cmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCkge1xuXHRcdHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcCA9IG5ldyBNYXAodGhpcy5zZWxlY3Rpb25SZXBsYWNlTWFwSW5pdGFsRGF0YSk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlcltpXTtcblx0XHRcdGxldCBsZWZ0cyA9IHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5sZWZ0O1xuXHRcdFx0bGV0IHJpZ2h0cyA9IHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5yaWdodDtcblxuXHRcdFx0dGhpcy5TZWxlY3Rpb25SZXBsYWNlTWFwLnNldCh0cmlnZ2VyLCB7IGxlZnQ6IGxlZnRzLCByaWdodDogcmlnaHRzIH0pO1xuXHRcdH1cblx0fVxuXG5cdGFkZFVzZXJTZWxlY3Rpb25SZXBSdWxlKHRyaWdnZXI6IHN0cmluZywgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyLmluY2x1ZGVzKHRyaWdnZXIpKSByZXR1cm4gZmFsc2U7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIucHVzaCh0cmlnZ2VyKVxuXHRcdHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZS5wdXNoKHsgbGVmdDogbGVmdCwgcmlnaHQ6IHJpZ2h0IH0pO1xuXHRcdHRoaXMucmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRkZWxldGVVc2VyU2VsZWN0aW9uUmVwUnVsZShpZHg6IG51bWJlcik6IHZvaWQge1xuXHRcdGlmIChpZHggPCAwIHx8IGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5sZW5ndGgpIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5zcGxpY2UoaWR4LCAxKTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWUuc3BsaWNlKGlkeCwgMSk7XG5cdFx0dGhpcy5yZWZyZXNoU2VsZWN0aW9uUmVwbGFjZVJ1bGUoKTtcblx0fVxuXG5cdHVwZGF0ZVVzZXJTZWxlY3Rpb25SZXBSdWxlKGlkeDogbnVtYmVyLCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpIHtcblx0XHRpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoKSByZXR1cm47XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlW2lkeF0ubGVmdCA9IGxlZnQ7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlW2lkeF0ucmlnaHQgPSByaWdodDtcblx0XHR0aGlzLnJlZnJlc2hTZWxlY3Rpb25SZXBsYWNlUnVsZSgpO1xuXHR9XG5cblx0cmVmcmVzaFVzZXJEZWxldGVSdWxlKCkge1xuXHRcdHRoaXMuVXNlckRlbGV0ZVJ1bGVzID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QodGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0KTtcblx0fVxuXG5cdGFkZFVzZXJEZWxldGVSdWxlKGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0LnB1c2goW2JlZm9yZSwgYWZ0ZXJdKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHR9XG5cblx0ZGVsZXRlVXNlckRlbGV0ZVJ1bGUoaWR4OiBudW1iZXIpIHtcblx0XHRpZiAoaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5sZW5ndGggfHwgaWR4IDwgMCkgcmV0dXJuO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5zcGxpY2UoaWR4LCAxKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHR9XG5cblx0dXBkYXRlVXNlckRlbGV0ZVJ1bGUoaWR4OiBudW1iZXIsIGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0aWYgKGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaWR4XVswXSA9IGJlZm9yZTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaWR4XVsxXSA9IGFmdGVyO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJEZWxldGVSdWxlKCk7XG5cdH1cblxuXHRyZWZyZXNoVXNlckNvbnZlcnRSdWxlKCkge1xuXHRcdHRoaXMuVXNlckNvbnZlcnRSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QpO1xuXHR9XG5cblx0YWRkVXNlckNvbnZlcnRSdWxlKGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdC5wdXNoKFtiZWZvcmUsIGFmdGVyXSk7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckNvbnZlcnRSdWxlKCk7XG5cdH1cblxuXHRkZWxldGVVc2VyQ29udmVydFJ1bGUoaWR4OiBudW1iZXIpIHtcblx0XHRpZiAoaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0LnNwbGljZShpZHgsIDEpO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJDb252ZXJ0UnVsZSgpO1xuXHR9XG5cblx0Z2V0Q29tbWFuZE5hbWVNYXAoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG5cdFx0Y29uc3QgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwX2VuID0gbmV3IE1hcChbXG5cdFx0XHRbXCJmb3JtYXRfYXJ0aWNsZVwiLCBcIkZvcm1hdCBjdXJyZW50IGFydGljbGVcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiRm9ybWF0IHNlbGVjdGVkIHRleHQgb3IgY3VycmVudCBsaW5lXCJdLFxuXHRcdFx0W1wiZGVsZXRlX2JsYW5rX2xpbmVcIiwgXCJEZWxldGUgYmxhbmsgbGluZXMgb2YgdGhlIHNlbGVjdGVkIG9yIHdob2xlIGFydGljbGVcIl0sXG5cdFx0XHRbXCJpbnNlcnRfY29kZWJsb2NrXCIsIFwiSW5zZXJ0IGNvZGUgYmxvY2sgdy93byBzZWxlY3Rpb25cIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlN3aXRjaCBhdXRvZm9ybWF0XCJdLFxuXHRcdFx0W1wicGFzdGVfd29fZm9ybWF0XCIsIFwiUGFzdGUgd2l0aG91dCBmb3JtYXRcIl0sXG5cdFx0XSk7XG5cblx0XHRsZXQgY29tbWFuZF9uYW1lX21hcF96aF9UVyA9IG5ldyBNYXAoW1xuXHRcdFx0W1wiZm9ybWF0X2FydGljbGVcIiwgXCJcdTY4M0NcdTVGMEZcdTUzMTZcdTUxNjhcdTY1ODdcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiXHU2ODNDXHU1RjBGXHU1MzE2XHU5MDc4XHU0RTJEXHU5MEU4XHU1MjA2L1x1NzU3Nlx1NTI0RFx1ODg0Q1wiXSxcblx0XHRcdFtcImRlbGV0ZV9ibGFua19saW5lXCIsIFwiXHU1MjJBXHU5NjY0XHU5MDc4XHU0RTJEXHU5MEU4XHU1MjA2L1x1NTE2OFx1NjU4N1x1NzY4NFx1NTkxQVx1OTkxOFx1N0E3QVx1NzY3RFx1ODg0Q1wiXSxcblx0XHRcdFtcImluc2VydF9jb2RlYmxvY2tcIiwgXCJcdTYzRDJcdTUxNjVcdTRFRTNcdTc4QkNcdTU4NEFcIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlx1NTIwN1x1NjNEQlx1ODFFQVx1NTJENVx1NjgzQ1x1NUYwRlx1NTMxNlx1OTU4Qlx1OTVEQ1wiXSxcblx0XHRcdFtcInBhc3RlX3dvX2Zvcm1hdFwiLCBcIlx1NzEyMVx1NjgzQ1x1NUYwRlx1NTMxNlx1N0M5OFx1OENCQ1wiXSxcblx0XHRdKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwX3poID0gbmV3IE1hcChbXG5cdFx0XHRbXCJmb3JtYXRfYXJ0aWNsZVwiLCBcIlx1NjgzQ1x1NUYwRlx1NTMxNlx1NTE2OFx1NjU4N1wiXSxcblx0XHRcdFtcImZvcm1hdF9zZWxlY3Rpb25cIiwgXCJcdTY4M0NcdTVGMEZcdTUzMTZcdTkwMDlcdTRFMkRcdTkwRThcdTUyMDYvXHU1RjUzXHU1MjREXHU4ODRDXCJdLFxuXHRcdFx0W1wiZGVsZXRlX2JsYW5rX2xpbmVcIiwgXCJcdTUyMkFcdTk2NjRcdTkwMDlcdTRFMkRcdTkwRThcdTUyMDYvXHU1MTY4XHU2NTg3XHU3Njg0XHU1OTFBXHU0RjU5XHU3QTdBXHU3NjdEXHU4ODRDXCJdLFxuXHRcdFx0W1wiaW5zZXJ0X2NvZGVibG9ja1wiLCBcIlx1NjNEMlx1NTE2NVx1NEVFM1x1NzgwMVx1NTc1N1wiXSxcblx0XHRcdFtcInN3aXRjaF9hdXRvZm9ybWF0XCIsIFwiXHU1MjA3XHU2MzYyXHU4MUVBXHU1MkE4XHU2ODNDXHU1RjBGXHU1MzE2XHU1RjAwXHU1MTczXCJdLFxuXHRcdFx0W1wicGFzdGVfd29fZm9ybWF0XCIsIFwiXHU2NUUwXHU2ODNDXHU1RjBGXHU1MzE2XHU3Qzk4XHU4RDM0XCJdLFxuXHRcdF0pO1xuXG5cdFx0bGV0IGNvbW1hbmRfbmFtZV9tYXAgPSBjb21tYW5kX25hbWVfbWFwX2VuO1xuXHRcdGlmIChsYW5nID09ICd6aCcpIHtcblx0XHRcdGNvbW1hbmRfbmFtZV9tYXAgPSBjb21tYW5kX25hbWVfbWFwX3poO1xuXHRcdH1cblx0XHRlbHNlIGlmIChsYW5nID09ICd6aC1UVycpIHtcblx0XHRcdGNvbW1hbmRfbmFtZV9tYXAgPSBjb21tYW5kX25hbWVfbWFwX3poX1RXO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21tYW5kX25hbWVfbWFwO1xuXHR9XG5cblx0dXBkYXRlVXNlckNvbnZlcnRSdWxlKGlkeDogbnVtYmVyLCBiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZykge1xuXHRcdGlmIChpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdC5sZW5ndGggfHwgaWR4IDwgMCkgcmV0dXJuO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3RbaWR4XVswXSA9IGJlZm9yZTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2lkeF1bMV0gPSBhZnRlcjtcblx0XHR0aGlzLnJlZnJlc2hVc2VyQ29udmVydFJ1bGUoKTtcblx0fVxuXG5cdGdldEVkaXRvciA9ICgpOiBFZGl0b3IgfCBudWxsID0+IHtcblx0XHRsZXQgZWRpdG9yID0gbnVsbDtcblx0XHRsZXQgbWFya2Rvd25WaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcblx0XHRpZiAobWFya2Rvd25WaWV3KSB7XG5cdFx0XHRlZGl0b3IgPSBtYXJrZG93blZpZXcuZWRpdG9yO1xuXHRcdH1cblx0XHRpZiAoZWRpdG9yID09PSBudWxsKSBjb25zb2xlLmxvZygnY2FuXFwndCBnZXQgZWRpdG9yJyk7XG5cdFx0cmV0dXJuIGVkaXRvcjtcblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG59IiwgImltcG9ydCB7IE5vdGljZX0gZnJvbSBcIm9ic2lkaWFuXCJcbmltcG9ydCB7IEVhc3lUeXBpbmdTZXR0aW5ncywgV29ya01vZGUgfSBmcm9tICcuL3NldHRpbmdzJ1xuaW1wb3J0IHsgQW5ub3RhdGlvbiwgRWRpdG9yU3RhdGUsIEV4dGVuc2lvbiwgU3RhdGVGaWVsZCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uU3BlYywgVGV4dCwgTGluZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IG9mZnNldFRvUG9zLCBwb3NUb09mZnNldCwgc3RyaW5nRGVsZXRlQXQsIHN0cmluZ0luc2VydEF0LCBpc1BhcmFtRGVmaW5lZH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IHN5bnRheFRyZWUgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7cHJpbnR9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGVudW0gTGluZVR5cGUgeyB0ZXh0ID0gJ3RleHQnLCBjb2RlYmxvY2sgPSAnY29kZWJsb2NrJywgZm9ybXVsYSA9ICdmb3JtdWxhJywgXG4gICAgICAgICAgICAgICAgICAgICAgICBub25lID0gJ25vbmUnLCBmcm9udG1hdHRlcj1cImZyb250bWF0dGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdW90ZT0ncXVvdGUnLCBjYWxsb3V0X3RpdGxlPSdjYWxsb3V0X3RpdGxlJywgbGlzdD0nbGlzdCcsIHRhYmxlPSAndGFibGUnIH1cblxuZXhwb3J0IGVudW0gU3BhY2VTdGF0ZSB7XG4gICAgbm9uZSxcbiAgICBzb2Z0LFxuICAgIHN0cmljdFxufVxuXG5leHBvcnQgZW51bSBJbmxpbmVUeXBlIHtcbiAgICB0ZXh0ID0gJ3RleHQnLCBjb2RlID0gJ2NvZGUnLCBmb3JtdWxhID0gJ2Zvcm11bGEnLFxuICAgIHdpa2lsaW5rID0gJ3dpa2lsaW5rJywgbWRsaW5rID0gXCJtZGxpbmtcIixcbiAgICB1c2VyID0gJ3VzZXItZGVmaW5lZCcsIG5vbmUgPSAnbm9uZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVDaGFuZ2Uge1xuICAgIHRleHQ6IHN0cmluZyxcbiAgICBiZWdpbjogbnVtYmVyLFxuICAgIGVuZDogbnVtYmVyLFxuICAgIG9yaWdpbjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWNsZVBhcnQge1xuICAgIHR5cGU6IExpbmVUeXBlO1xuICAgIGJlZ2luOiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVQYXJ0IHtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgdHlwZTogSW5saW5lVHlwZTtcbiAgICBiZWdpbjogbnVtYmVyO1xuICAgIGVuZDogbnVtYmVyO1xuICAgIGxlZnRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGU7XG4gICAgcmlnaHRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5lRm9ybWF0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3ludGF4VHJlZU5vZGVOYW1lVHlwZShuYW1lOnN0cmluZyk6SW5saW5lVHlwZXtcbiAgICAgICAgaWYobmFtZS5jb250YWlucygnY29kZScpICYmICFuYW1lLmNvbnRhaW5zKFwibGlua1wiKSl7XG4gICAgICAgICAgICByZXR1cm4gSW5saW5lVHlwZS5jb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYobmFtZS5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgICAgIHJldHVybiBJbmxpbmVUeXBlLmZvcm11bGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHJldHVybiBJbmxpbmVUeXBlLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJhbSBsaW5lTnVtOiAxLWJhc2VkIGxpbmUgbnVtYmVyXG4gICAgcGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGU6IEVkaXRvclN0YXRlLCBsaW5lTnVtOm51bWJlciwgcmVnUmVnRXhwPzogc3RyaW5nKXtcbiAgICAgICAgbGV0IGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGE6IElubGluZVBhcnRbXSA9IFtdO1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgICAgIGxldCBwb3MgPSBsaW5lLmZyb207XG4gICAgICAgIGxldCBwcmV2Tm9kZVR5cGU6SW5saW5lVHlwZSA9IElubGluZVR5cGUubm9uZTtcbiAgICAgICAgbGV0IHByZXZCZWdpbklkeCA9IDA7XG4gICAgICAgIHdoaWxlKHBvczxsaW5lLnRvKXtcbiAgICAgICAgICAgIGxldCBub2RlID0gdHJlZS5yZXNvbHZlKHBvcywgMSk7XG4gICAgICAgICAgICBsZXQgY3VyTm9kZVR5cGUgPSB0aGlzLnN5bnRheFRyZWVOb2RlTmFtZVR5cGUobm9kZS5uYW1lKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZihwcmV2Tm9kZVR5cGU9PUlubGluZVR5cGUubm9uZSl7XG4gICAgICAgICAgICAgICAgcHJldk5vZGVUeXBlPWN1ck5vZGVUeXBlO1xuICAgICAgICAgICAgICAgIHByZXZCZWdpbklkeD0wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihwcmV2Tm9kZVR5cGU9PWN1ck5vZGVUeXBlKXt9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6bGluZS50ZXh0LnN1YnN0cmluZyhwcmV2QmVnaW5JZHgsIHBvcy1saW5lLmZyb20pLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOnByZXZOb2RlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46cHJldkJlZ2luSWR4LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6cG9zLWxpbmUuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTpTcGFjZVN0YXRlLm5vbmUsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOlNwYWNlU3RhdGUubm9uZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcHJldk5vZGVUeXBlID0gY3VyTm9kZVR5cGU7XG4gICAgICAgICAgICAgICAgcHJldkJlZ2luSWR4ID0gcG9zLWxpbmUuZnJvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBuZXh0IHBvc1xuICAgICAgICAgICAgaWYgKGN1ck5vZGVUeXBlID09IElubGluZVR5cGUudGV4dCl7XG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHBvcyA9IG5vZGUudG87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHBvcz09bGluZS50byl7XG4gICAgICAgICAgICAgICAgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpsaW5lLnRleHQuc3Vic3RyaW5nKHByZXZCZWdpbklkeCwgcG9zLWxpbmUuZnJvbSksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6cHJldk5vZGVUeXBlLFxuICAgICAgICAgICAgICAgICAgICBiZWdpbjpwcmV2QmVnaW5JZHgsXG4gICAgICAgICAgICAgICAgICAgIGVuZDpwb3MtbGluZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOlNwYWNlU3RhdGUubm9uZSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6U3BhY2VTdGF0ZS5ub25lXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpbmUgcGFydHM6IFwiLCBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhKTtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIGxldCByZXRBcnJheTogSW5saW5lUGFydFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0udHlwZSAhPSBJbmxpbmVUeXBlLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXRBcnJheS5wdXNoKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBBcnJheTogSW5saW5lUGFydFtdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BhcmFtRGVmaW5lZChyZWdSZWdFeHApKVxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSBzcGxpdFRleHRXaXRoTGlua0FuZFVzZXJEZWZpbmVkKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0uY29udGVudCwgcmVnUmVnRXhwKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IHNwbGl0VGV4dFdpdGhMaW5rQW5kVXNlckRlZmluZWQobGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYVtpXS5jb250ZW50KTtcbiAgICBcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5iZWdpbiArPSBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhW2ldLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmVuZCArPSBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhW2ldLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICByZXRBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHJldEFycmF5KVxuICAgICAgICByZXR1cm4gcmV0QXJyYXk7XG4gICAgfVxuXG4gICAgZm9ybWF0TGluZU9mRG9jKHN0YXRlOiBFZGl0b3JTdGF0ZSwgc2V0dGluZ3M6IEVhc3lUeXBpbmdTZXR0aW5ncywgZnJvbUI6IG51bWJlciwgdG9COiBudW1iZXIsIGluc2VydGVkU3RyOiBzdHJpbmcpOiBbVHJhbnNhY3Rpb25TcGVjW10sIFRyYW5zYWN0aW9uU3BlY10gfCBudWxsIHtcbiAgICAgICAgbGV0IGRvYyA9IHN0YXRlLmRvYztcbiAgICAgICAgbGV0IGxpbmUgPSBkb2MubGluZUF0KGZyb21CKS50ZXh0O1xuICAgICAgICBsZXQgcmVzID0gbnVsbFxuICAgICAgICBpZiAoaW5zZXJ0ZWRTdHIuY29udGFpbnMoXCJcXG5cIikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdGcm9tQiwgVG9CJywgZnJvbUIsIHRvQilcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuZm9ybWF0TGluZShzdGF0ZSwgZG9jLmxpbmVBdChmcm9tQikubnVtYmVyLCBzZXR0aW5ncywgb2Zmc2V0VG9Qb3MoZG9jLCBmcm9tQikuY2gsIG9mZnNldFRvUG9zKGRvYywgZnJvbUIpLmNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuZm9ybWF0TGluZShzdGF0ZSwgZG9jLmxpbmVBdChmcm9tQikubnVtYmVyLCBzZXR0aW5ncywgb2Zmc2V0VG9Qb3MoZG9jLCB0b0IpLmNoLCBvZmZzZXRUb1Bvcyhkb2MsIGZyb21CKS5jaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcyA9PT1udWxsIHx8IHJlc1syXS5sZW5ndGg9PTApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5ld2xpbmUgPSBzdHJpbmdJbnNlcnRBdChyZXNbMF0sIHJlc1sxXSwgXCJ8XCIpO1xuICAgICAgICAvLyBpZiAoc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiRWFzeVR5cGluZzogTmV3IExpbmUgU3RyaW5nOlwiLCBuZXdsaW5lKVxuXG4gICAgICAgIGxldCBjaGFuZ2VzOiBUcmFuc2FjdGlvblNwZWNbXSA9IFtdO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZG9jLmxpbmVBdChmcm9tQikuZnJvbTtcblxuICAgICAgICBmb3IobGV0IGNoYW5nZUl0ZW0gb2YgcmVzWzJdKVxuICAgICAgICB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6e2Zyb206IG9mZnNldCtjaGFuZ2VJdGVtLmJlZ2luLCB0bzpvZmZzZXQrY2hhbmdlSXRlbS5lbmQsIGluc2VydDpjaGFuZ2VJdGVtLnRleHR9LCB1c2VyRXZlbnQ6XCJFYXN5VHlwaW5nLmNoYW5nZVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnRlZFN0ci5jb250YWlucyhcIlxcblwiKSl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImluc2VydFN0clwiLCBpbnNlcnRlZFN0cilcbiAgICAgICAgICAgIHJlc1sxXSs9IGluc2VydGVkU3RyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NoYW5nZXMsIHtzZWxlY3Rpb246e2FuY2hvcjpvZmZzZXQrcmVzWzFdfSwgdXNlckV2ZW50OlwiRWFzeVR5cGluZy5jaGFuZ2VcIn1dO1xuICAgIH1cblxuICAgIC8vIFx1OEZENFx1NTZERVx1NTAzQ1x1RkYxQSBbXHU2NzAwXHU3RUM4XHU3Njg0XHU4ODRDXHVGRjBDXHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHVGRjBDXHU1MTg1XHU1QkI5XHU2NTM5XHU1M0Q4XVxuICAgIC8vIHBhcmFtIGxpbmVOdW06IDEtYmFzZWQgbGluZSBudW1iZXJcbiAgICAvLyBjdXJDaDogXHU1MTQ5XHU2ODA3XHU1NzI4XHU1RjUzXHU1MjREXHU4ODRDXHU3Njg0XHU0RjREXHU3RjZFXG4gICAgLy8gcHJldkNoOiBcdTUxNDlcdTY4MDdcdTU3MjhcdTUyNERcdTRFMDBcdTY1RjZcdTUyM0JcdTU3MjhcdTVGNTNcdTUyNERcdTg4NENcdTc2ODRcdTRGNERcdTdGNkVcbiAgICBmb3JtYXRMaW5lKHN0YXRlOiBFZGl0b3JTdGF0ZSwgbGluZU51bTpudW1iZXIsIHNldHRpbmdzOiBFYXN5VHlwaW5nU2V0dGluZ3MsIGN1ckNoOiBudW1iZXIsIHByZXZDaD86IG51bWJlcik6IFtzdHJpbmcsIG51bWJlciwgSW5saW5lQ2hhbmdlW11dIHwgbnVsbCB7XG4gICAgICAgIC8vIG5ldyBOb3RpY2UoXCJmb3JtYXQtbm93XCIpO1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGxpbmVOdW0pLnRleHQ7XG4gICAgICAgIGxldCByZWdOdWxsID0gL15cXHMqJC9nO1xuICAgICAgICBpZiAocmVnTnVsbC50ZXN0KGxpbmUpKSByZXR1cm4gW2xpbmUsIGN1ckNoLCBbXV07XG4gICAgICAgIC8vIDEuIFx1NTIxMlx1NTIwNlx1NEUwMFx1ODg0Q1x1NjU4N1x1NUI1N1x1NzY4NFx1NTE4NVx1OTBFOFx1NEUwRFx1NTQwQ1x1NkEyMVx1NTc1N1x1NTMzQVx1NTdERlxuXG4gICAgICAgIGxldCBsaW5lUGFydHMgPSBzZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ1N3aXRjaFxuICAgICAgICA/IHRoaXMucGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGUsIGxpbmVOdW0sIHNldHRpbmdzLlVzZXJEZWZpbmVkUmVnRXhwKVxuICAgICAgICA6IHRoaXMucGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGUsIGxpbmVOdW0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmxvZyhcImxpbmUgcGFydHNcXG5cIiwgbGluZVBhcnRzKTtcblxuICAgICAgICAvLyBcdTU5MDdcdTRFRkRcdTUzOUZcdTY3NjVcdTc2ODRsaW5lUGFydHMsIFx1NkRGMVx1NjJGN1x1OEQxRFxuICAgICAgICBsZXQgbGluZVBhcnRzT3JpZ2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaW5lUGFydHMpKTtcbiAgICAgICAgbGV0IGlubGluZUNoYW5nZUxpc3Q6IElubGluZUNoYW5nZVtdID0gW107XG5cbiAgICAgICAgbGV0IGN1cnNvckxpbmVQYXJ0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGN1cnNvclJlbGF0aXZlSW5kZXggPSAtMTtcbiAgICAgICAgbGV0IHJlc3VsdEN1cnNvckNoID0gMDsgICAgIC8vIFx1OEY5M1x1NTFGQVx1NzY4NFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVxuXG4gICAgICAgIC8vIDIuIFx1NjI3RVx1NTIzMFx1NTE0OVx1NjgwN1x1NjI0MFx1NTcyOFx1NzY4NFx1OTBFOFx1NTIwNlx1RkYwQ1x1NTk4Mlx1Njc5Q1x1NjYyRiBJbmxpbmVQYXJ0LnRleHRcdUZGMENcdTUyMTlcdTU3MjhcdTUxNDlcdTY4MDdcdTU5MDRcdTYzRDJcdTUxNjUnXFwwJ1x1Njc2NVx1NjgwN1x1OEJCMFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGN1ckNoID4gbGluZVBhcnRzW2ldLmJlZ2luICYmIGN1ckNoIDw9IGxpbmVQYXJ0c1tpXS5lbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJzb3JMaW5lUGFydEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBjdXJzb3JSZWxhdGl2ZUluZGV4ID0gY3VyQ2ggLSBsaW5lUGFydHNbaV0uYmVnaW47XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS50eXBlID09PSBJbmxpbmVUeXBlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBzdHJpbmdJbnNlcnRBdChsaW5lUGFydHNbaV0uY29udGVudCwgY3Vyc29yUmVsYXRpdmVJbmRleCwgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0TGluZSA9ICcnO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gXHU0RkREXHU1QjU4XHU1MjREXHU0RTAwXHU5MEU4XHU1MjA2XHU3Njg0XHU1MzNBXHU1NzU3XHU3QzdCXHU1NzhCXHVGRjBDSW5saW5lVHlwZS5ub25lIFx1NEVFM1x1ODg2OFx1NEUwMFx1ODg0Q1x1NzY4NFx1NUYwMFx1NTlDQlxuICAgICAgICBsZXQgcHJldlBhcnRUeXBlOiBzdHJpbmcgPSBJbmxpbmVUeXBlLm5vbmU7XG4gICAgICAgIGxldCBwcmV2VGV4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLm5vbmU7XG5cbiAgICAgICAgLy8gMy4gXHU5MDREXHU1Mzg2XHU2QkNGXHU0RTJBXHU4ODRDXHU5MEU4XHU1MjA2XHVGRjBDXHU4RkRCXHU4ODRDXHU2ODNDXHU1RjBGXHU1MzE2XHU1OTA0XHU3NDA2XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyAzLjEgXHU1OTgyXHU2NzlDXHU4ODRDXHU1MTg1XHU3QjJDXHU0RTAwXHU5MEU4XHU1MjA2XHU0RTNBXHU2NTg3XHU2NzJDXHVGRjBDXHU1MjE5XHU1OTA0XHU3NDA2XHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1MTk5XHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBsaW5lUGFydHNbaV0udHlwZSA9PT0gSW5saW5lVHlwZS50ZXh0ICYmIHNldHRpbmdzLkF1dG9DYXBpdGFsKSB7XG4gICAgICAgICAgICAgICAgLy8gMy4xLjEgXHU1OTgyXHU2NzlDIHByZXZDdXJzb3IgXHU0RTE0XHU1MTQ5XHU2ODA3XHU0RTBEXHU1NzI4XHU2QjY0XHU5MEU4XHU1MjA2XHVGRjBDXHU1MjE5XHU4REYzXHU4RkM3XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgY3Vyc29yTGluZVBhcnRJbmRleCAhPSAwKSB7IH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0ZpcnN0U2VudGVuY2UgPSAvXlxccyooXFwtIChcXFtbeCBdXFxdICk/KT9cdTIwMUM/W2EtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXS9nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnSGVhZGVyU2VudGVuY2UgPSAvXigjKyB8PisgP3xcdTIwMUMpW2EtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXS9nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dGNvcHkgPSBsaW5lUGFydHNbMF0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnRmlyc3RTZW50ZW5jZS5leGVjKHRleHRjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoSGVhZGVyID0gcmVnSGVhZGVyU2VudGVuY2UuZXhlYyh0ZXh0Y29weSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkc3RDaGFySW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFySW5kZXggPSByZWdGaXJzdFNlbnRlbmNlLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdENoYXJJbmRleCA9IHJlZ0hlYWRlclNlbnRlbmNlLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQXV0b0NhcGl0YWxNb2RlID09IFdvcmtNb2RlLkdsb2JhbGx5IHx8IChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIGRzdENoYXJJbmRleCA+PSBwcmV2Q2ggJiYgZHN0Q2hhckluZGV4IDwgY3VyQ2gpKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFySW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkc3RDaGFySW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzWzBdLmNvbnRlbnQgPSB0ZXh0Y29weS5zdWJzdHJpbmcoMCwgZHN0Q2hhckluZGV4KSArIHRleHRjb3B5LmNoYXJBdChkc3RDaGFySW5kZXgpLnRvVXBwZXJDYXNlKCkgKyB0ZXh0Y29weS5zdWJzdHJpbmcoZHN0Q2hhckluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGluZVBhcnRzW2ldLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyAzLjIuMSBcdTU5MDRcdTc0MDZcdTY1ODdcdTY3MkNcdTUzM0FcdTU3NTdcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC40IFx1NTkwNFx1NzQwNlx1NTNFNVx1OTk5Nlx1NUI1N1x1NkJDRFx1NTkyN1x1NTE5OVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQXV0b0NhcGl0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWcgPSAvW1xcLlxcP1xcIVx1MzAwMlx1RkYwMVx1RkYxRl0oW1xcc10qKVthLXpcXHUwNDAxXFx1MDQ1MVxcdTA0MTAtXFx1MDQ0Zl0vZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnLmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicHJldkNoLCBjdXJDaCwgb2Zmc2V0LCB0ZW1wSW5kZXhcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwcmV2Q2gsIGN1ckNoLCBvZmZzZXQsIHRlbXBJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNTcGFjZURvdCA9IHRlbXBJbmRleC0yPDAgfHwgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4LTIsIHRlbXBJbmRleCk9PScgLic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkF1dG9DYXBpdGFsTW9kZSA9PSBXb3JrTW9kZS5HbG9iYWxseSAmJiAhaXNTcGFjZURvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgpLnRvVXBwZXJDYXNlKCkgKyBjb250ZW50LnN1YnN0cmluZyhyZWcubGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQgJiYgIWlzU3BhY2VEb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygwLCB0ZW1wSW5kZXgpICsgY29udGVudC5jaGFyQXQodGVtcEluZGV4KS50b1VwcGVyQ2FzZSgpICsgY29udGVudC5zdWJzdHJpbmcocmVnLmxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICBcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnNlcnRTcGFjZShjb250ZW50OiBzdHJpbmcsIHJlZzogUmVnRXhwLCBwcmV2Q2g6IG51bWJlciwgY3VyQ2g6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiBbc3RyaW5nLCBudW1iZXJdIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnLmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBcIiBcIiArIGNvbnRlbnQuc3Vic3RyaW5nKHRlbXBJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjb250ZW50LCBjdXJDaF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjEgXHU1OTA0XHU3NDA2XHU0RTJEXHU4MkYxXHU2NTg3XHU0RTRCXHU5NUY0XHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DaGluZXNlRW5nbGlzaFNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnMSA9IC8oW0EtWmEtel0pKFtcXHU0ZTAwLVxcdTlmYTVdKS9naTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcyID0gLyhbXFx1NGUwMC1cXHU5ZmE1XSkoW0EtWmEtel0pL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZzEsIHByZXZDaCwgY3VyQ2gsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnMiwgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DaGluZXNlTnVtYmVyU3BhY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oWzAtOV0pKFtcXHU0ZTAwLVxcdTlmYTVdKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzEgPSAvKFtcXHU0ZTAwLVxcdTlmYTVdKShbMC05XSkvZztcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcsIHByZXZDaCwgY3VyQ2gsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnMSwgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5FbmdsaXNoTnVtYmVyU3BhY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW0EtWmEtel0pKFxcZCkvZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcxID0gLyhcXGQpKFtBLVphLXpdKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZywgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcxLCBwcmV2Q2gsIGN1ckNoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC4yIFx1NTkwNFx1NzQwNlx1NEUyRFx1NjU4N1x1OTVGNFx1NjVFMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQ2hpbmVzZU5vU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcgPSAvKFtcXHU0ZTAwLVxcdTlmYTVcdUZGMENcdTMwMDJcdTMwMDFcdUZGMDFcdUZGMUJcdTIwMThcdTIwMTlcdTMwMEFcdTMwMEJdKykoXFxzKykoW1xcdTRlMDAtXFx1OWZhNVx1RkYwQ1x1MzAwMlx1MzAwMVx1RkYwMVx1RkYxQlx1MjAxOFx1MjAxOVx1MzAwQVx1MzAwQl0rKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZy5leGVjKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVnLCBcIiQxJDNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gXHU2ODA3XHU3MEI5XHU0RTBFXHU2NTg3XHU2NzJDXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjMgXHU1OTA0XHU3NDA2XHU2ODA3XHU3MEI5XHU0RTBFXHU2NTg3XHU2NzJDXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihzZXR0aW5ncy5FbmdsaXNoU3BhY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oWyxcXC47XFw/XFwhXFwpXSkoWzAtOUEtWmEtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXFx1NGUwMC1cXHU5ZmE1XSl8KFtBLVphLXowLTlcXHU0ZTAwLVxcdTlmYTU6LFxcLlxcP1xcISdcIl0rKShcXCgpfFssXFwuO1xcPzohXVtcXHU0ZTAwLVxcdTlmYTVdL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHJlZy5leGVjKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNTcGFjZURvdCA9ICchLj87LCcuY29udGFpbnMoY29udGVudC5jaGFyQXQodGVtcEluZGV4LTEpKSAmJiAoKHRlbXBJbmRleC0yPDAgJiYgaT09MCkgfHwgY29udGVudC5jaGFyQXQodGVtcEluZGV4LTIpPT0nICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNOdW1QdW5jTnVtID0gL1ssLl1cXGQvLnRlc3QoY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4LTEsIHRlbXBJbmRleCsxKSkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBJbmRleC0yPDAgfHwgL1xcZC8udGVzdChjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgtMikpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlTW9kZSA9PSBXb3JrTW9kZS5HbG9iYWxseSAmJiAhaXNTcGFjZURvdCAmJiAhaXNOdW1QdW5jTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgdGVtcEluZGV4KSArIFwiIFwiICsgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzU3BhY2VEb3QgJiYgIWlzTnVtUHVuY051bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBcIiBcIiArIGNvbnRlbnQuc3Vic3RyaW5nKHRlbXBJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJDaCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXHU1MzU1XHU3MkVDXHU1OTA0XHU3NDA2XHU1MTkyXHU1M0Y3XHU1NDBFXHU2NTg3XHU2NzJDXHU3Njg0XHU4MUVBXHU1MkE4XHU3QTdBXHU2ODNDXHVGRjBDXHU0RTNBXHU0RTg2XHU1MTdDXHU1QkI5IDplbW9qaTogXHU2ODNDXHU1RjBGXHU3Njg0XHU4RjkzXHU1MTY1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzIgPSAvKDopKFtBLVphLXowLTlfXStbICxcXC5cXD9cXFxcXFwvOydcIlx1RkYwQ1x1MzAwMlx1RkYxRlx1RkYxQlx1MjAxOFx1MjAxQ1x1MjAxRFx1MjAxOVx1MzAwMVxcW1xcXVxcLVxce1xcfV0pL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlZzIsIFwiJDEgJDJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzMgPSAvKDopKFtcIiddKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlZzMsIFwiJDEgJDJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC43IFx1NUY5N1x1NTIzMFx1NjU4N1x1NjcyQ1x1OTBFOFx1NTIwNlx1NjYyRlx1NTQyNlx1NEVFNVx1N0E3QVx1NzY3RFx1N0IyNlx1NUYwMFx1NTlDQlx1NjIxNlx1N0VEM1x1Njc1Rlx1RkYwQ1x1NzUyOFx1Njc2NVx1NTIyNFx1NjVBRFx1NTQwRVx1N0VFRFx1NjU4N1x1NjcyQ1x1NTI0RFx1NTQwRVx1NjYyRlx1NTQyNlx1OTcwMFx1ODk4MVx1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnU3RyaWN0U3BhY2VTdGFydCA9IC9eXFwwP1xccy87XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdTdHJpY3RTcGFjZUVuZCA9IC9cXHNcXDA/JC87XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdTdGFydFdpdGhTcGFjZSA9IC9eXFwwP1tcXHMsXFwuO1xcP1xcIVx1RkYwQ1x1MzAwMlx1RkYxQlx1MzAwQlx1RkYxRlx1RkYxQTpcdUZGMDF+XFwqXHUzMDAxXHVGRjA4XHVGRjA5XCJcdTIwMURcXFtcXF1cXClcXHtcXH1dLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0VuZFdpdGhTcGFjZSA9IC9bXFxzXHVGRjBDXHUzMDAyXHUzMDAxXHVGRjFBXHVGRjFCXHVGRjFGXHVGRjAxXHVGRjA4XHVGRjA5flxcKlwiXHUzMDBBXHUyMDFDXFxbXFxdXFwoXFx7XFx9XVxcMD8kLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dFN0YXJ0U3BhY2VTYXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ1N0YXJ0V2l0aFNwYWNlLnRlc3QoY29udGVudCl8fGNvbnRlbnQuc3RhcnRzV2l0aChcIjxicj5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdTdHJpY3RTcGFjZVN0YXJ0LnRlc3QoY29udGVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0U3RhcnRTcGFjZVNhdGUgPSBTcGFjZVN0YXRlLnN0cmljdFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dFN0YXJ0U3BhY2VTYXRlID0gU3BhY2VTdGF0ZS5zb2Z0XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVnRW5kV2l0aFNwYWNlLnRlc3QoY29udGVudCkgfHwgY29udGVudC5lbmRzV2l0aChcIjxicj5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdTdHJpY3RTcGFjZUVuZC50ZXN0KGNvbnRlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLnN0cmljdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5zb2Z0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC44IFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1OTBFOFx1NTIwNlx1NzY4NFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTkwNFx1NzQwNlx1N0E3QVx1NjgzQ1x1NkRGQlx1NTJBMFx1NzY4NFx1OTVFRVx1OTg5OFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXZQYXJ0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZSA+IHR4dFN0YXJ0U3BhY2VTYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gJyAnICsgY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlID4gdHh0U3RhcnRTcGFjZVNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlICYmIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGUgPiB0eHRTdGFydFNwYWNlU2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9ICcgJyArIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgdHh0U3RhcnRTcGFjZVNhdGUgPT0gU3BhY2VTdGF0ZS5ub25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRUZXh0QmVnaW4gPSBjb250ZW50LmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ01kTGlua0VuZCA9IC9cXF0vO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hhckF0TGlua0VuZEluZGV4ID0gbGluZVBhcnRzW2kgLSAxXS5jb250ZW50LnNlYXJjaChyZWdNZExpbmtFbmQpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJBdExpbmtFbmQgPSBsaW5lUGFydHNbaSAtIDFdLmNvbnRlbnQuY2hhckF0KGNoYXJBdExpbmtFbmRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRMaW5rRW5kID09PSAnWycpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHdvTmVpZ2hib3JDaGFycyA9IGNoYXJBdExpbmtFbmQgKyBjaGFyQXRUZXh0QmVnaW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdOb3ROZWVkU3BhY2UgPSAvW1xcdTRlMDAtXFx1OWZhNVx1RkYwQ1x1MzAwMlx1RkYxRlx1RkYxQVx1RkYxQlx1MjAxRFx1MjAxQ1x1MjAxOVx1MjAxOC1cdUZGMDl9XVtcXHU0ZTAwLVxcdTlmYTVdL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnTm90TmVlZFNwYWNlLnRlc3QodHdvTmVpZ2hib3JDaGFycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gJyAnICsgY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS51c2VyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaSAtIDFdLnJpZ2h0U3BhY2VSZXF1aXJlID4gdHh0U3RhcnRTcGFjZVNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC45IFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gY3Vyc29yTGluZVBhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9ICdcXDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSBjb250ZW50LnNlYXJjaChyZWcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIG47XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTUyMjBcdTk2NjQgXFwwXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IHN0cmluZ0RlbGV0ZUF0KGNvbnRlbnQsIG4pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gSW5saW5lVHlwZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBwcmV2VGV4dEVuZFNwYWNlU3RhdGUgPSB0eHRFbmRTcGFjZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAzLjIuMiBcdTU5MDRcdTc0MDZcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTU3NTdcdTkwRThcdTUyMDZcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4xIFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTQ4Q3NldHRpbmdzXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwcmV2UGFydFR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5ub25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGUgPiBwcmV2VGV4dEVuZFNwYWNlU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0ucmlnaHRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4yIFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZihpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIGN1cnNvclJlbGF0aXZlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4zIFx1NTNEOFx1OTFDRlx1NjZGNFx1NjVCMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBJbmxpbmVUeXBlLmNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMy4yLjMgXHU1OTA0XHU3NDA2XHU4ODRDXHU1MTg1XHU1MTZDXHU1RjBGXHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0uY29udGVudCA9PSBcIiRcXFxccXF1YWQkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUuc3RyaWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4xIFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTQ4Q3NldHRpbmdzXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwcmV2UGFydFR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5ub25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGU+cHJldlRleHRFbmRTcGFjZVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0ucmlnaHRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4yIFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZihpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIGN1cnNvclJlbGF0aXZlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4zIFx1NTNEOFx1OTFDRlx1NjZGNFx1NjVCMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBJbmxpbmVUeXBlLmZvcm11bGE7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByZXZQYXJ0VHlwZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlRleHRFbmRTcGFjZVN0YXRlPnNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGUpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPT1TcGFjZVN0YXRlLnN0cmljdCAmJiBwcmV2VGV4dEVuZFNwYWNlU3RhdGU8U3BhY2VTdGF0ZS5zdHJpY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSAmJiBwcmV2VGV4dEVuZFNwYWNlU3RhdGU9PVNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdOb05lZWRTcGFjZSA9IC9bXFx1NGUwMC1cXHU5ZmE1XVtcXHU0ZTAwLVxcdTlmYTVdL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRUZXh0RW5kID0gbGluZVBhcnRzW2ktMV0uY29udGVudC5jaGFyQXQobGluZVBhcnRzW2ktMV0uY29udGVudC5sZW5ndGgtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRMaW5rQmVnaW46c3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS50eXBlPT1JbmxpbmVUeXBlLndpa2lsaW5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnQWxpYXMgPSAvXFx8LztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyT2ZBbGlhc0JlZ2luID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuc2VhcmNoKHJlZ0FsaWFzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hhck9mQWxpYXNCZWdpblwiLGNoYXJPZkFsaWFzQmVnaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmVnaW5JbmRleCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lUGFydHNbaV0uY29udGVudC5jaGFyQXQoMCk9PT0nIScpIGJlZ2luSW5kZXg9MztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJPZkFsaWFzQmVnaW4hPS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luSW5kZXggPSBjaGFyT2ZBbGlhc0JlZ2luKzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGxpbmVQYXJ0c1tpXS5jb250ZW50LmNoYXJBdChiZWdpbkluZGV4KT09JyMnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJBdExpbmtCZWdpbiA9IGxpbmVQYXJ0c1tpXS5jb250ZW50LmNoYXJBdChiZWdpbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYmVnaW5JbmRleFwiLCBiZWdpbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoYXJBdExpbmtCZWdpbj09J10nKSBicmVhazsgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdNZExpbmtCZWdpbiA9IC9cXFsvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJBdExpbmtCZWdpbkluZGV4ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuc2VhcmNoKHJlZ01kTGlua0JlZ2luKSsxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckF0TGlua0JlZ2luID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuY2hhckF0KGNoYXJBdExpbmtCZWdpbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoYXJBdExpbmtCZWdpbj09PSddJykgYnJlYWs7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHdvTmVpZ2hib3JDaGFycyA9IGNoYXJBdFRleHRFbmQrY2hhckF0TGlua0JlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmVnTm9OZWVkU3BhY2UudGVzdCh0d29OZWlnaGJvckNoYXJzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIXNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlICYmIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+cHJldlRleHRFbmRTcGFjZVN0YXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZXx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpLTFdLnJpZ2h0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExpbmsuMiBcdTU5ODJcdTY3OUNcdThCRTVcdTUzM0FcdTU3NTdcdTY3MDlcdTUxNDlcdTY4MDdcdUZGMENcdTUyMTlcdThCQTFcdTdCOTdcdTY3MDBcdTdFQzhcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gY3Vyc29yTGluZVBhcnRJbmRleClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q3Vyc29yQ2ggPSBvZmZzZXQgKyBjdXJzb3JSZWxhdGl2ZUluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExpbmsuMyBcdTY2RjRcdTY1QjBcdTUzRDhcdTkxQ0ZcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gbGluZVBhcnRzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMy4yLjUgXHU1OTA0XHU3NDA2XHU3NTI4XHU2MjM3XHU4MUVBXHU1QjlBXHU0RTQ5XHU1MzNBXHU1NzU3XHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZXIuMSBcdTY4MzlcdTYzNkVcdTUyNERcdTRFMDBcdTUzM0FcdTU3NTdcdTdDN0JcdTU3OEJcdTU0OENzZXR0aW5nc1x1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJldlBhcnRUeXBlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubm9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS50ZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5wcmV2VGV4dEVuZFNwYWNlU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5tZGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUud2lraWxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5yaWdodFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBVc2VyLjIgXHU1OTgyXHU2NzlDXHU4QkU1XHU1MzNBXHU1NzU3XHU2NzA5XHU1MTQ5XHU2ODA3XHVGRjBDXHU1MjE5XHU4QkExXHU3Qjk3XHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXG4gICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IGN1cnNvckxpbmVQYXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEN1cnNvckNoID0gb2Zmc2V0ICsgY3Vyc29yUmVsYXRpdmVJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBMaW5rLjMgXHU2NkY0XHU2NUIwXHU1M0Q4XHU5MUNGXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaW5lUGFydHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUudXNlcjtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihsZXQgaT0wO2k8bGluZVBhcnRzLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKGxpbmVQYXJ0c1tpXS50eXBlID09PSBJbmxpbmVUeXBlLnRleHQgJiYgbGluZVBhcnRzW2ldLmNvbnRlbnQhPWxpbmVQYXJ0c09yaWdpbltpXS5jb250ZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZVBhcnRzW2ldLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzT3JpZ2luW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNPcmlnaW5baV0uZW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBsaW5lUGFydHNPcmlnaW5baV0uY29udGVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGlubGluZUNoYW5nZUxpc3QgPSBpbmxpbmVDaGFuZ2VMaXN0LnNvcnQoKGEsIGIpOm51bWJlcj0+YS5iZWdpbi1iLmJlZ2luKTtcbiAgICAgICAgcmV0dXJuIFtyZXN1bHRMaW5lLCByZXN1bHRDdXJzb3JDaCwgaW5saW5lQ2hhbmdlTGlzdF07XG4gICAgfVxuICAgIFxufVxuXG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93blBhcnNlcntcbiAgICBjb25zdHJ1Y3Rvcigpe31cblxufVxuXG5mdW5jdGlvbiBtYXRjaFdpdGhSZWcodGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgdHlwZTogSW5saW5lVHlwZSwgaW5saW5lVHlwZUFycmF5OiBJbmxpbmVQYXJ0W10sXG4gICAgY2hlY2tBcnJheSA9IGZhbHNlLCBsZWZ0U3BhY2VSZTogU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZSwgcmlnaHRTcGFjZVJlOiBTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lKTogSW5saW5lUGFydFtdIHtcbiAgICBsZXQgcmV0QXJyYXkgPSBpbmxpbmVUeXBlQXJyYXk7XG4gICAgbGV0IG1hdGNoQXJyYXk6IElubGluZVBhcnRbXSA9IFtdO1xuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuc29ydCgoYSwgYik6IG51bWJlciA9PiBhLmJlZ2luIC0gYi5iZWdpbik7XG4gICAgLy8gY29uc29sZS5sb2coJ2JlZm9yZS0tLS0tLS0tLS0tXFxuJyxyZXRBcnJheSlcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KTtcbiAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICAgIC8vIFx1NjhDMFx1NjdFNVx1NTFCMlx1N0E4MVxuICAgICAgICBpZiAoY2hlY2tBcnJheSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmKHJlZ0V4cC5sYXN0SW5kZXg+cmV0QXJyYXlbaV0uYmVnaW4gJiYgcmV0QXJyYXlbaV0uZW5kPm1hdGNoLmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsaWQpIGNvbnRpbnVlO1xuICAgICAgICBtYXRjaEFycmF5LnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBiZWdpbjogbWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgZW5kOiByZWdFeHAubGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIGxlZnRTcGFjZVJlcXVpcmU6IGxlZnRTcGFjZVJlLFxuICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiByaWdodFNwYWNlUmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5jb25jYXQobWF0Y2hBcnJheSk7XG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyPT09PT09PT09PT1cXG4nLCByZXRBcnJheSk7XG4gICAgcmV0dXJuIHJldEFycmF5O1xufVxuXG5mdW5jdGlvbiBtYXRjaFdpdGhBYmJyKHRleHQ6IHN0cmluZywgdHlwZTogSW5saW5lVHlwZSwgaW5saW5lVHlwZUFycmF5OiBJbmxpbmVQYXJ0W10sIGNoZWNrQXJyYXkgPSBmYWxzZSl7XG4gICAgbGV0IHJldEFycmF5ID0gaW5saW5lVHlwZUFycmF5O1xuICAgIGxldCBtYXRjaEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICByZXRBcnJheSA9IHJldEFycmF5LnNvcnQoKGEsIGIpOiBudW1iZXIgPT4gYS5iZWdpbiAtIGIuYmVnaW4pO1xuICAgIGxldCByZWdBYmJyID0gLyhbYS16QS1aXVxcLikrL2c7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gcmVnQWJici5leGVjKHRleHQpO1xuICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzSW5CbG9ja0JlZ2luOmJvb2xlYW4gPSAobWF0Y2guaW5kZXg9PTApO1xuICAgICAgICAvLyBcdTY4QzBcdTY3RTVcdTUxQjJcdTdBODFcbiAgICAgICAgaWYgKGNoZWNrQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZihtYXRjaC5pbmRleCA9PSByZXRBcnJheVtpXS5lbmQpe1xuICAgICAgICAgICAgICAgICAgICBpc0luQmxvY2tCZWdpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZ0FiYnIubGFzdEluZGV4PnJldEFycmF5W2ldLmJlZ2luICYmIHJldEFycmF5W2ldLmVuZD5tYXRjaC5pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighaXNJbkJsb2NrQmVnaW4gJiYgdmFsaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZWdDaGFyID0gL1thLXpBLVowLTldLztcbiAgICAgICAgICAgIGlmKHJlZ0NoYXIudGVzdCh0ZXh0LmNoYXJBdChtYXRjaC5pbmRleC0xKSkpe1xuICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbGlkKSBjb250aW51ZTtcbiAgICAgICAgbWF0Y2hBcnJheS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1hdGNoWzBdLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgYmVnaW46IG1hdGNoLmluZGV4LFxuICAgICAgICAgICAgICAgIGVuZDogcmVnQWJici5sYXN0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lLFxuICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5jb25jYXQobWF0Y2hBcnJheSk7XG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyPT09PT09PT09PT1cXG4nLCByZXRBcnJheSk7XG4gICAgcmV0dXJuIHJldEFycmF5O1xufVxuXG4vKipcbiAqIFx1NTIwNlx1NTI3Mlx1NEUwMFx1ODg0Q1x1NjU4N1x1NjcyQ1x1NEUyRFx1NzY4NFx1OTRGRVx1NjNBNVx1NTQ4Q1x1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1NzY4NFx1NkI2M1x1NTIxOVx1OTBFOFx1NTIwNlx1RkYwQ1x1NUY5N1x1NTIzMCBJbmxpbmVQYXJ0IFx1NzY4NFx1NEUwRFx1NTQwQ1x1NTMzQVx1NTdERlxuICovXG5mdW5jdGlvbiBzcGxpdFRleHRXaXRoTGlua0FuZFVzZXJEZWZpbmVkKHRleHQ6IHN0cmluZywgcmVnRXhwcz86IHN0cmluZyk6IElubGluZVBhcnRbXSB7XG4gICAgbGV0IHJldEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICBsZXQgcmVnV2lraUxpbmsgPSAvXFwhezAsMn1cXFtcXFtbXlxcW1xcXV0qP1xcXVxcXS9nO1xuICAgIGxldCByZWdNZExpbmsgPSAvXFwhezAsMn1cXFtbXlxcW1xcXV0qP1xcXVxcKFteXFxzXFwpXFwoXFxbXFxdXFx7XFx9J10qXFwpL2c7XG4gICAgLy8gbGV0IHJlZ0JhcmVMaW5rID0gLyhodHRwcz86XFwvXFwvfGZ0cDpcXC9cXC98b2JzaWRpYW46XFwvXFwvfHpvdGVybzpcXC9cXC98d3d3LilbXlxcc1x1RkYwOFx1RkYwOVx1MzAwQVx1MzAwQlx1MzAwMlx1RkYwQ1x1RkYwMVx1RkYxRlx1RkYxQlx1RkYxQVx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVxcKVxcKFxcW1xcXVxce1xcfSddKy9nO1xuXG4gICAgLy8gMS4gXHU1MzM5XHU5MTREd2lraWxpbmtcbiAgICByZXRBcnJheSA9IG1hdGNoV2l0aFJlZyh0ZXh0LCByZWdXaWtpTGluaywgSW5saW5lVHlwZS53aWtpbGluaywgcmV0QXJyYXkpO1xuICAgIC8vIDIuIFx1NTMzOVx1OTE0RG1kbGlua1xuICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoUmVnKHRleHQsIHJlZ01kTGluaywgSW5saW5lVHlwZS5tZGxpbmssIHJldEFycmF5KTtcblxuICAgIC8vIDMuIFx1NTMzOVx1OTE0RFx1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVxuICAgIGxldCByZWdFeHBMaXN0OiBSZWdFeHBbXSA9IFtdO1xuICAgIGxldCBsZWZ0U1JlcXVpcmVMaXN0OiBTcGFjZVN0YXRlW10gPSBbXTtcbiAgICBsZXQgcmlnaHRTUmVxdWlyZUxpc3Q6IFNwYWNlU3RhdGVbXSA9IFtdO1xuICAgIGxldCByZWdOdWxsID0gL15cXHMqJC9nO1xuICAgIGxldCByZWdTUmVxdWlyZSA9IC9cXHxbXFwtPVxcK11bXFwtPVxcK10kLztcbiAgICBpZiAocmVnRXhwcykge1xuICAgICAgICBsZXQgcmVncyA9IHJlZ0V4cHMuc3BsaXQoJ1xcbicpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ3MubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgaWYgKHJlZ051bGwudGVzdChyZWdzW2ldKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICgoIXJlZ1NSZXF1aXJlLnRlc3QocmVnc1tpXSkpIHx8IHJlZ3NbaV0ubGVuZ3RoIDw9IDMpIHtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiRWFzeVR5cGluZzogXHU3QjJDXCIgKyBTdHJpbmcoaSkgKyBcIlx1ODg0Q1x1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVx1NEUwRFx1N0IyNlx1NTQwOFx1ODlDNFx1ODMwM1xcblwiK3JlZ3NbaV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlZ0l0ZW0gPSByZWdzW2ldLnN1YnN0cmluZygwLCByZWdzW2ldLmxlbmd0aCAtIDMpO1xuICAgICAgICAgICAgbGV0IHNwYWNlUmVxU3RyaW5nID0gcmVnc1tpXS5zdWJzdHJpbmcocmVnc1tpXS5sZW5ndGggLSAzKTtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWRSZWcgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVnVGVtcCA9IG5ldyBSZWdFeHAocmVnSXRlbSwgJ2cnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaXNWYWxpZFJlZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiRWFzdVR5cGluZzogQmFkIFJlZ0V4cDpcXG5cIiArIHJlZ0l0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzVmFsaWRSZWcpIHtcbiAgICAgICAgICAgICAgICByZWdFeHBMaXN0LnB1c2gobmV3IFJlZ0V4cChyZWdJdGVtLCAnZycpKTtcbiAgICAgICAgICAgICAgICBsZWZ0U1JlcXVpcmVMaXN0LnB1c2goc3RyMlNwYWNlU3RhdGUoc3BhY2VSZXFTdHJpbmcuY2hhckF0KDEpKSk7XG4gICAgICAgICAgICAgICAgcmlnaHRTUmVxdWlyZUxpc3QucHVzaChzdHIyU3BhY2VTdGF0ZShzcGFjZVJlcVN0cmluZy5jaGFyQXQoMikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVnTGVuID0gcmVnRXhwTGlzdC5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdMZW47IGkrKykge1xuICAgICAgICAgICAgcmV0QXJyYXkgPSBtYXRjaFdpdGhSZWcodGV4dCwgcmVnRXhwTGlzdFtpXSwgSW5saW5lVHlwZS51c2VyLCByZXRBcnJheSwgdHJ1ZSwgbGVmdFNSZXF1aXJlTGlzdFtpXSwgcmlnaHRTUmVxdWlyZUxpc3RbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHU1MzM5XHU5MTREXHU2NUY2XHU5NUY0XHU2MjMzXG4gICAgcmV0QXJyYXkgPSBtYXRjaFdpdGhSZWcodGV4dCwgL1xcZHsxLDJ9OlxcZHsxLDJ9KDpcXGR7MCwyfSl7MCwxfS9nLCBJbmxpbmVUeXBlLnVzZXIsIHJldEFycmF5LCB0cnVlLCBTcGFjZVN0YXRlLnNvZnQsIFNwYWNlU3RhdGUubm9uZSk7XG5cbiAgICAvLyA0LiBcdTUzMzlcdTkxNERcdTdGMjlcdTUxOTlcdTU5ODIgYS5tLlxuICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoQWJicih0ZXh0LCBJbmxpbmVUeXBlLnVzZXIsIHJldEFycmF5LCB0cnVlKTtcblxuICAgIC8vIDUuIFx1NUY5N1x1NTIzMFx1NTI2OVx1NEY1OVx1NzY4NFx1NjU4N1x1NjcyQ1x1OTBFOFx1NTIwNlxuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuc29ydCgoYSwgYik6IG51bWJlciA9PiBhLmJlZ2luIC0gYi5iZWdpbik7XG5cbiAgICBsZXQgdGV4dEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICBsZXQgdGV4dEJlZ2luID0gMDtcbiAgICBsZXQgdGV4dEVuZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGV4dEJlZ2luIDwgcmV0QXJyYXlbaV0uYmVnaW4pIHtcbiAgICAgICAgICAgIHRleHRFbmQgPSByZXRBcnJheVtpXS5iZWdpbjtcbiAgICAgICAgICAgIHRleHRBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGV4dC5zdWJzdHJpbmcodGV4dEJlZ2luLCB0ZXh0RW5kKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogSW5saW5lVHlwZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBiZWdpbjogdGV4dEJlZ2luLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHRleHRFbmQsXG4gICAgICAgICAgICAgICAgICAgIGxlZnRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGUubm9uZSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGUubm9uZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dEJlZ2luID0gcmV0QXJyYXlbaV0uZW5kO1xuICAgIH1cblxuICAgIGlmICh0ZXh0QmVnaW4gIT0gdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgdGV4dEFycmF5LnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogdGV4dC5zdWJzdHJpbmcodGV4dEJlZ2luLCB0ZXh0Lmxlbmd0aCksXG4gICAgICAgICAgICAgICAgdHlwZTogSW5saW5lVHlwZS50ZXh0LFxuICAgICAgICAgICAgICAgIGJlZ2luOiB0ZXh0QmVnaW4sXG4gICAgICAgICAgICAgICAgZW5kOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmUsXG4gICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGUubm9uZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIDYuIFx1NTQwOFx1NUU3Nlx1NjU4N1x1NjcyQ1x1OTBFOFx1NTIwNlx1NTQ4Q1x1NTE3Nlx1NEVENlx1OTBFOFx1NTIwNlxuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuY29uY2F0KHRleHRBcnJheSk7XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5zb3J0KChhLCBiKTogbnVtYmVyID0+IGEuYmVnaW4gLSBiLmJlZ2luKTtcbiAgICByZXR1cm4gcmV0QXJyYXlcbn1cblxuLy8gXHU1QjU3XHU3QjI2XHU4RjZDXHU1MzE2XHU2MjEwXHU3QTdBXHU2ODNDXHU3MkI2XHU2MDAxXHU4OTgxXHU2QzQyXG5mdW5jdGlvbiBzdHIyU3BhY2VTdGF0ZShzOiBzdHJpbmcpOiBTcGFjZVN0YXRlIHtcbiAgICBzd2l0Y2ggKHMpIHtcbiAgICAgICAgY2FzZSBcIitcIjpcbiAgICAgICAgICAgIHJldHVybiBTcGFjZVN0YXRlLnN0cmljdDtcbiAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICByZXR1cm4gU3BhY2VTdGF0ZS5zb2Z0O1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBTcGFjZVN0YXRlLm5vbmU7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcyU3BhY2VTdGF0ZShzOnN0cmluZyk6U3BhY2VTdGF0ZVxue1xuICAgIGlmKE51bWJlcihzKT09U3BhY2VTdGF0ZS5ub25lKSByZXR1cm4gU3BhY2VTdGF0ZS5ub25lO1xuICAgIGlmKE51bWJlcihzKT09U3BhY2VTdGF0ZS5zb2Z0KSByZXR1cm4gU3BhY2VTdGF0ZS5zb2Z0O1xuICAgIGlmKE51bWJlcihzKT09U3BhY2VTdGF0ZS5zdHJpY3QpIHJldHVybiBTcGFjZVN0YXRlLnN0cmljdDtcbiAgICByZXR1cm4gU3BhY2VTdGF0ZS5ub25lO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NMaW5lVHlwZShzdGF0ZTogRWRpdG9yU3RhdGUsIHBvczogbnVtYmVyKTpMaW5lVHlwZSB7XG4gICAgY29uc3QgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKVxuICAgIGxldCBsaW5lX251bWJlciA9IGxpbmUubnVtYmVyXG4gICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpO1xuICAgIGNvbnN0IHRva2VuID0gdHJlZS5yZXNvbHZlKGxpbmUuZnJvbSwgMSkubmFtZVxuXG4gICAgLy8gZm9yIChsZXQgcD1saW5lLmZyb207IHA8bGluZS50bzsgcCs9MSl7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKHAtbGluZS5mcm9tLCB0cmVlLnJlc29sdmUocCwgMSkubmFtZSlcbiAgICAvLyB9XG5cbiAgICBpZiAodG9rZW4uY29udGFpbnMoJ3RhYmxlJykpe1xuICAgICAgICByZXR1cm4gTGluZVR5cGUudGFibGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLmNvbnRhaW5zKCdobWQtZnJvbnRtYXR0ZXInKSl7XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5mcm9udG1hdHRlcjtcbiAgICB9XG5cbiAgICBpZih0b2tlbi5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgZm9yKGxldCBwPWxpbmUuZnJvbSsxO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgICAgIGlmKCF0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTGluZVR5cGUudGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGluZVR5cGUuZm9ybXVsYVxuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdjb2RlJykgJiYgdG9rZW4uY29udGFpbnMoJ2Jsb2NrJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgbGV0IHQgPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuICAgICAgICAgICAgaWYoISh0LmNvbnRhaW5zKCdjb2RlJykgJiYgdC5jb250YWlucygnYmxvY2snKSkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9ja1xuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdxdW90ZScpICYmICF0b2tlbi5jb250YWlucygnY2FsbG91dCcpKXtcbiAgICAgICAgLy8gXHU2M0E1XHU0RTBCXHU2NzY1XHU1MjI0XHU2NUFEXHU4QkU1XHU4ODRDXHU2NjJGXHU1NDI2XHU0RTNBY2FsbG91dFx1NTc1N1x1NTE4NVx1NzY4NFx1NEVFM1x1NzgwMVx1NTc1N1xuICAgICAgICAvLyBcdTk5OTZcdTUxNDhcdTUyMjRcdTY1QURcdTY2MkZcdTU0MjZcdTRFM0FjYWxsb3V0XG4gICAgICAgIGxldCBjYWxsb3V0X3N0YXJ0X2xpbmUgPSAtMTtcbiAgICAgICAgZm9yKGxldCBsPWxpbmVfbnVtYmVyLTE7IGw+PTE7IGwtPTEpe1xuICAgICAgICAgICAgbGV0IGxfbGluZSA9IHN0YXRlLmRvYy5saW5lKGwpXG4gICAgICAgICAgICBsZXQgbF90b2tlbiA9IHRyZWUucmVzb2x2ZShsX2xpbmUuZnJvbSwgMSkubmFtZVxuICAgICAgICAgICAgaWYoIWxfdG9rZW4uY29udGFpbnMoJ3F1b3RlJykpe1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxfdG9rZW4uY29udGFpbnMoJ2NhbGxvdXQnKSl7XG4gICAgICAgICAgICAgICAgY2FsbG91dF9zdGFydF9saW5lID0gbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbG91dF9zdGFydF9saW5lPT0tMSkgcmV0dXJuIExpbmVUeXBlLnRleHQ7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTcxMzZcdTU0MEVcdTUyMjRcdTY1QURcdTY2MkZcdTU0MjZcdTRFM0FcdTRFRTNcdTc4MDFcdTU3NTdcbiAgICAgICAgbGV0IGlzX2NvZGVfYmxvY2s6Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVnX2NvZGVfYmVnaW4gPSAvXj4rIGBgYC87XG4gICAgICAgIGxldCByZWdfY29kZV9lbmQgPSAvXj4rIGBgYCQvO1xuICAgICAgICBmb3IgKGxldCBsPWNhbGxvdXRfc3RhcnRfbGluZSsxOyBsPD1saW5lX251bWJlcjsgbCs9MSl7XG4gICAgICAgICAgICBsZXQgbF9saW5lID0gc3RhdGUuZG9jLmxpbmUobClcbiAgICAgICAgICAgIGlmKGlzX2NvZGVfYmxvY2sgJiYgcmVnX2NvZGVfZW5kLnRlc3QobF9saW5lLnRleHQpKXtcbiAgICAgICAgICAgICAgICBpc19jb2RlX2Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKCFpc19jb2RlX2Jsb2NrICYmIHJlZ19jb2RlX2JlZ2luLnRlc3QobF9saW5lLnRleHQpKXtcbiAgICAgICAgICAgICAgICBpc19jb2RlX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNfY29kZV9ibG9jaykge1xuICAgICAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHJldHVybiBMaW5lVHlwZS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gTGluZVR5cGUudGV4dFxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NMaW5lVHlwZTIoc3RhdGU6IEVkaXRvclN0YXRlLCBwb3M6IG51bWJlcik6TGluZVR5cGUge1xuICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcylcbiAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgY29uc3QgdG9rZW4gPSB0cmVlLnJlc29sdmUobGluZS5mcm9tLCAxKS5uYW1lXG4gICAgaWYgKHRva2VuLmNvbnRhaW5zKCdobWQtZnJvbnRtYXR0ZXInKSl7XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5mcm9udG1hdHRlclxuICAgIH1cblxuICAgIGlmKHRva2VuLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgaWYoIXRyZWUucmVzb2x2ZShwLCAxKS5uYW1lLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmZvcm11bGFcbiAgICB9XG4gICAgZWxzZSBpZih0b2tlbi5jb250YWlucygnY29kZScpICYmIHRva2VuLmNvbnRhaW5zKCdibG9jaycpKXtcbiAgICAgICAgZm9yKGxldCBwPWxpbmUuZnJvbSsxO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgICAgIGxldCB0ID0gdHJlZS5yZXNvbHZlKHAsIDEpLm5hbWVcbiAgICAgICAgICAgIGlmKCEodC5jb250YWlucygnY29kZScpICYmIHQuY29udGFpbnMoJ2Jsb2NrJykpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTGluZVR5cGUudGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5jb2RlYmxvY2tcbiAgICB9XG5cbiAgICBmb3IobGV0IHA9bGluZS5mcm9tO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgaWYodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2xpc3QnKSl7XG4gICAgICAgICAgICByZXR1cm4gTGluZVR5cGUubGlzdFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2NhbGxvdXQnKSl7XG4gICAgICAgICAgICByZXR1cm4gTGluZVR5cGUuY2FsbG91dF90aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRva2VuLmNvbnRhaW5zKCdxdW90ZScpKXtcbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLnF1b3RlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gTGluZVR5cGUudGV4dFxufSIsICJpbXBvcnQgeyBBbm5vdGF0aW9uLCBFZGl0b3JTdGF0ZSwgRXh0ZW5zaW9uLCBTdGF0ZUZpZWxkLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25TcGVjLCBUZXh0fSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBFYXN5VHlwaW5nU2V0dGluZ1RhYiwgRWFzeVR5cGluZ1NldHRpbmdzLCBQYWlyU3RyaW5nLCBDb252ZXJ0UnVsZX0gZnJvbSBcIi4vc2V0dGluZ3NcIlxuaW1wb3J0IHsgQXBwLCBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbidcblxubGV0IERFQlVHID0gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IHByaW50PShtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+e1xuICAgIGlmIChERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgQXBwSGlkZGVuUHJvcHMge1xuXHRpbnRlcm5hbFBsdWdpbnM6IHtcblx0XHRjb25maWc6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9O1xuXHR9O1xuXHRpc01vYmlsZTogYm9vbGVhbjtcblx0cGx1Z2luczoge1xuXHRcdGVuYWJsZWRQbHVnaW5zOiBTZXQ8c3RyaW5nPjtcblx0XHRtYW5pZmVzdHM6IHsgW2tleTogc3RyaW5nXTogeyB2ZXJzaW9uOiBzdHJpbmcgfSB9O1xuXHR9O1xuXHR2YXVsdDoge1xuXHRcdGNvbmZpZzogb2JqZWN0O1xuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zVG9PZmZzZXQoZG9jOlRleHQsIHBvczp7bGluZTpudW1iZXIsIGNoOm51bWJlcn0pIHtcblx0cmV0dXJuIGRvYy5saW5lKHBvcy5saW5lICsgMSkuZnJvbSArIHBvcy5jaFxufVxuZXhwb3J0IGZ1bmN0aW9uIG9mZnNldFRvUG9zKGRvYzpUZXh0LCBvZmZzZXQ6bnVtYmVyKSB7XG5cdGxldCBsaW5lID0gZG9jLmxpbmVBdChvZmZzZXQpXG5cdHJldHVybiB7bGluZTogbGluZS5udW1iZXIgLSAxLCBjaDogb2Zmc2V0IC0gbGluZS5mcm9tfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZVN0ck9mVHJhbnNhYyh0cjogVHJhbnNhY3Rpb24pOiBzdHJpbmcge1xuXHRsZXQgVHJhbnNhY1R5cGVBcnJheTpzdHJpbmdbXSA9IFtcIkVhc3lUeXBpbmcuY2hhbmdlXCIsIFxuXHRcdFx0XHRcdFx0XHRcImlucHV0LnR5cGUuY29tcG9zZVwiLCBcImlucHV0LnR5cGVcIiwgXCJpbnB1dC5wYXN0ZVwiLCBcImlucHV0LmRyb3BcIiwgXCJpbnB1dC5jb21wbGV0ZVwiLCBcImlucHV0XCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVsZXRlLnNlbGVjdGlvblwiLCBcImRlbGV0ZS5mb3J3YXJkXCIsIFwiZGVsZXRlLmJhY2t3YXJkXCIsIFwiZGVsZXRlLmN1dFwiLCBcImRlbGV0ZVwiLFxuXHRcdFx0XHRcdFx0XHRcIm1vdmUuZHJvcFwiLFxuXHRcdFx0XHRcdFx0XHRcInVuZG9cIiwgXCJyZWRvXCIsXG5cdFx0XHRcdFx0XHRcdFwic2VsZWN0LnBvaW50ZXJcIl07XG5cdGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBUcmFuc2FjVHlwZUFycmF5Lmxlbmd0aDsgaSsrKVxuXHR7XG5cdFx0aWYgKHRyLmlzVXNlckV2ZW50KFRyYW5zYWNUeXBlQXJyYXlbaV0pKVxuXHRcdFx0cmV0dXJuIFRyYW5zYWNUeXBlQXJyYXlbaV07XG5cdH1cblx0cmV0dXJuIFwibm9uZVwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcycGFpcnN0cmluZyhzOiBzdHJpbmcpOlBhaXJTdHJpbmd7XG5cdGxldCBjdXJzb3JJZHggPSBzLmluZGV4T2YoXCJ8XCIpO1xuXHRsZXQgbGVmdCA9IHMuc3Vic3RyaW5nKDAsIGN1cnNvcklkeCk7XG5cdGxldCByaWdodCA9IHMuc3Vic3RyaW5nKGN1cnNvcklkeCsxKTtcblx0cmV0dXJuIHtsZWZ0OmxlZnQsIHJpZ2h0OnJpZ2h0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KGxpc3Q6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+KTpDb252ZXJ0UnVsZVtdIHtcblx0bGV0IHJlczpDb252ZXJ0UnVsZVtdID0gW107XG5cdGZvciAobGV0IGkgaW4gbGlzdCl7XG5cdFx0cmVzW2ldID0ge2JlZm9yZTogc3RyaW5nMnBhaXJzdHJpbmcobGlzdFtpXVswXSksIGFmdGVyOiBzdHJpbmcycGFpcnN0cmluZyhsaXN0W2ldWzFdKX1cblx0fVxuXHRyZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRGVsZXRlQXQoc3RyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOnN0cmluZ1xue1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KStzdHIuc3Vic3RyaW5nKGluZGV4KzEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nSW5zZXJ0QXQoc3RyOnN0cmluZywgaW5kZXg6IG51bWJlciwgczogc3RyaW5nKTpzdHJpbmdcbntcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkrcytzdHIuc3Vic3RyaW5nKGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyYW1EZWZpbmVkKHBhcmFtOiBhbnkpOmJvb2xlYW5cbntcblx0cmV0dXJuIHR5cGVvZiBwYXJhbSE9PVwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93U3RyaW5nKHM6IHN0cmluZyk6c3RyaW5ne1xuXHRyZXR1cm4gcy5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNpZGlhblNldHRpbmdzKHBsdWdpbjogUGx1Z2luKSB7XG5cdGNvbnN0IGFwcCA9IHBsdWdpbi5hcHAgYXMgYW55IGFzIEFwcEhpZGRlblByb3BzO1xuXHRyZXR1cm4gYXBwLnZhdWx0LmNvbmZpZztcbn1cblxuXG4vLyBDb2RlIEJlbG93IGlzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3ZzbGlua28vb2JzaWRpYW4tb3V0bGluZXJcbi8vIENvcHlyaWdodCAoYykgMjAyMSBWaWFjaGVzbGF2IFNsaW5rb1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuVGFic1NldHRpbmdzIHtcblx0dXNlVGFiOiBib29sZWFuO1xuXHR0YWJTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5Gb2xkU2V0dGluZ3Mge1xuXHRmb2xkSW5kZW50OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBnZXRIaWRkZW5PYnNpZGlhbkNvbmZpZyhhcHA6IEFwcCkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRyZXR1cm4gKGFwcC52YXVsdCBhcyBhbnkpLmNvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIE9ic2lkaWFuU2V0dGluZ3Mge1xuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogQXBwKSB7fVxuXG5cdGlzTGVnYWN5RWRpdG9yRW5hYmxlZCgpIHtcblx0XHRjb25zdCBjb25maWc6IHsgbGVnYWN5RWRpdG9yOiBib29sZWFuIH0gPSB7XG5cdFx0XHRsZWdhY3lFZGl0b3I6IGZhbHNlLFxuXHRcdFx0Li4uZ2V0SGlkZGVuT2JzaWRpYW5Db25maWcodGhpcy5hcHApLFxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29uZmlnLmxlZ2FjeUVkaXRvcjtcblx0fVxuXG5cdGlzRGVmYXVsdFRoZW1lRW5hYmxlZCgpIHtcblx0XHRjb25zdCBjb25maWc6IHsgY3NzVGhlbWU6IHN0cmluZyB9ID0ge1xuXHRcdFx0Y3NzVGhlbWU6IFwiXCIsXG5cdFx0XHQuLi5nZXRIaWRkZW5PYnNpZGlhbkNvbmZpZyh0aGlzLmFwcCksXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb25maWcuY3NzVGhlbWUgPT09IFwiXCI7XG5cdH1cblxuXHRnZXRUYWJzU2V0dGluZ3MoKTogT2JzaWRpYW5UYWJzU2V0dGluZ3Mge1xuXHRcdHJldHVybiB7XG5cdFx0XHR1c2VUYWI6IHRydWUsXG5cdFx0XHR0YWJTaXplOiA0LFxuXHRcdFx0Li4uZ2V0SGlkZGVuT2JzaWRpYW5Db25maWcodGhpcy5hcHApLFxuXHRcdH07XG5cdH1cblxuXHRnZXRGb2xkU2V0dGluZ3MoKTogT2JzaWRpYW5Gb2xkU2V0dGluZ3Mge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmb2xkSW5kZW50OiB0cnVlLFxuXHRcdFx0Li4uZ2V0SGlkZGVuT2JzaWRpYW5Db25maWcodGhpcy5hcHApLFxuXHRcdH07XG5cdH1cblxuXHRnZXREZWZhdWx0SW5kZW50Q2hhcnMoKSB7XG5cdFx0Y29uc3QgeyB1c2VUYWIsIHRhYlNpemUgfSA9IHRoaXMuZ2V0VGFic1NldHRpbmdzKCk7XG5cblx0XHRyZXR1cm4gdXNlVGFiID8gXCJcXHRcIiA6IG5ldyBBcnJheSh0YWJTaXplKS5maWxsKFwiIFwiKS5qb2luKFwiXCIpO1xuXHR9XG59IiwgImltcG9ydCB7IFNwYWNlU3RhdGUsIHN0cmluZzJTcGFjZVN0YXRlIH0gZnJvbSAnc3JjL2NvcmUnO1xuaW1wb3J0IHsgQXBwLCBUZXh0Q29tcG9uZW50LCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgV29ya3NwYWNlLCBXb3Jrc3BhY2VMZWFmLCBUZXh0QXJlYUNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBFYXN5VHlwaW5nUGx1Z2luIGZyb20gJy4vbWFpbic7XG5pbXBvcnQgeyBzaG93U3RyaW5nIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFpclN0cmluZyB7XG5cdGxlZnQ6IHN0cmluZztcblx0cmlnaHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0UnVsZSB7XG5cdGJlZm9yZTogUGFpclN0cmluZztcblx0YWZ0ZXI6IFBhaXJTdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFJ1bGVUeXBlIHtkZWxldGU9IFwiRGVsZXRlIFJ1bGVcIiwgY29udmVydD0nQ29udmVydCBSdWxlJ31cbmV4cG9ydCBlbnVtIFdvcmtNb2RlIHsgT25seVdoZW5UeXBpbmcgPSBcInR5cGluZ1wiLCBHbG9iYWxseSA9IFwiZ2xvYmFsXCIgfVxuXG5leHBvcnQgaW50ZXJmYWNlIEVhc3lUeXBpbmdTZXR0aW5ncyB7XG5cdFRhYm91dDogYm9vbGVhbjtcblx0U2VsZWN0aW9uRW5oYW5jZTogYm9vbGVhbjtcblx0SW50cmluc2ljU3ltYm9sUGFpcnM6IGJvb2xlYW47XG5cdEJhc2VPYkVkaXRFbmhhbmNlOiBib29sZWFuO1xuXHRGVzJIV0VuaGFuY2U6IGJvb2xlYW47XG5cdEF1dG9Gb3JtYXQ6IGJvb2xlYW47XG5cdEV4Y2x1ZGVGaWxlczogc3RyaW5nO1xuXHRBdXRvQ2FwaXRhbDogYm9vbGVhbjtcblx0QXV0b0NhcGl0YWxNb2RlOiBXb3JrTW9kZTtcblx0Q2hpbmVzZUVuZ2xpc2hTcGFjZTogYm9vbGVhbjtcblx0RW5nbGlzaE51bWJlclNwYWNlOiBib29sZWFuO1xuXHRDaGluZXNlTm9TcGFjZTogYm9vbGVhbjtcblx0Q2hpbmVzZU51bWJlclNwYWNlOiBib29sZWFuO1xuXHRQdW5jdHVhdGlvblNwYWNlOiBib29sZWFuO1xuXHRQdW5jdHVhdGlvblNwYWNlTW9kZTogV29ya01vZGU7XG5cdElubGluZUNvZGVTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUZvcm11bGFTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUxpbmtTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUxpbmtTbWFydFNwYWNlOiBib29sZWFuO1xuXHRVc2VyRGVmaW5lZFJlZ1N3aXRjaDogYm9vbGVhbjtcblx0VXNlckRlZmluZWRSZWdFeHA6IHN0cmluZztcblx0ZGVidWc6IGJvb2xlYW47XG5cblx0dXNlclNlbFJlcFJ1bGVUcmlnZ2VyOiBzdHJpbmdbXTtcblx0dXNlclNlbFJlcFJ1bGVWYWx1ZTogUGFpclN0cmluZ1tdO1xuXHR1c2VyRGVsZXRlUnVsZXNTdHJMaXN0OiBbc3RyaW5nLCBzdHJpbmddW107XG5cdHVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0OiBbc3RyaW5nLCBzdHJpbmddW107XG5cdHVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuOiBib29sZWFuO1xuXHR1c2VyRGVsUnVsZVNldHRpbmdzT3BlbjogYm9vbGVhbjtcblx0dXNlckN2dFJ1bGVTZXR0aW5nc09wZW46IGJvb2xlYW47XG5cblx0RW50ZXJUd2ljZTogYm9vbGVhbjtcblx0UHVuY1JlY3RpZnk6IGJvb2xlYW47XG5cdFRyeUZpeENoaW5lc2VJTTogYm9vbGVhbjtcblx0Rml4TWFjT1NDb250ZXh0TWVudTogYm9vbGVhbjtcblx0VHJ5Rml4TVNJTUU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBFYXN5VHlwaW5nU2V0dGluZ3MgPSB7XG5cdFRhYm91dDogdHJ1ZSxcblx0U2VsZWN0aW9uRW5oYW5jZTogdHJ1ZSxcblx0SW50cmluc2ljU3ltYm9sUGFpcnM6IHRydWUsXG5cdEJhc2VPYkVkaXRFbmhhbmNlOiB0cnVlLFxuXHRGVzJIV0VuaGFuY2U6IHRydWUsXG5cblx0QXV0b0Zvcm1hdDogdHJ1ZSxcblx0RXhjbHVkZUZpbGVzOiBcIlwiLFxuXHRDaGluZXNlRW5nbGlzaFNwYWNlOiB0cnVlLFxuXHRDaGluZXNlTnVtYmVyU3BhY2U6IHRydWUsXG5cdEVuZ2xpc2hOdW1iZXJTcGFjZTogdHJ1ZSxcblx0Q2hpbmVzZU5vU3BhY2U6IHRydWUsXG5cdFB1bmN0dWF0aW9uU3BhY2U6IHRydWUsXG5cdEF1dG9DYXBpdGFsOiB0cnVlLFxuXHRBdXRvQ2FwaXRhbE1vZGU6IFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nLFxuXHRQdW5jdHVhdGlvblNwYWNlTW9kZTogV29ya01vZGUuT25seVdoZW5UeXBpbmcsXG5cdElubGluZUNvZGVTcGFjZU1vZGU6IFNwYWNlU3RhdGUuc29mdCxcblx0SW5saW5lRm9ybXVsYVNwYWNlTW9kZTogU3BhY2VTdGF0ZS5zb2Z0LFxuXHRJbmxpbmVMaW5rU3BhY2VNb2RlOiBTcGFjZVN0YXRlLnNvZnQsXG5cdElubGluZUxpbmtTbWFydFNwYWNlOiB0cnVlLFxuXHRVc2VyRGVmaW5lZFJlZ1N3aXRjaDogdHJ1ZSxcblx0VXNlckRlZmluZWRSZWdFeHA6IFwie3suKj99fXwrK1xcblwiK1xuXHRcdFwiPC4qPz58LS1cXG5cIiArXG5cdFx0XCJcXFxcW1xcXFwhLio/XFxcXF1bLStdezAsMX18LStcXG5cIitcblx0XHRcIihmaWxlOi8vL3xodHRwcz86Ly98ZnRwOi8vfG9ic2lkaWFuOi8vfHpvdGVybzovL3x3d3cuKVteXFxcXHNcdUZGMDhcdUZGMDlcdTMwMEFcdTMwMEJcdTMwMDIsXHVGRjBDXHVGRjAxXHVGRjFGO1x1RkYxQlx1RkYxQVx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVxcXFwpXFxcXChcXFxcW1xcXFxdXFxcXHtcXFxcfSddK3wtLVxcblwiK1xuXHRcdFwiXFxuW2EtekEtWjAtOV9cXFxcLS5dK0BbYS16QS1aMC05X1xcXFwtLl0rfCsrXFxuXCIrXG5cdFx0XCIoPzwhIykjW1xcXFx1NGUwMC1cXFxcdTlmYTVcXFxcdy1cXFxcL10rfCsrXCIsXG5cdGRlYnVnOiBmYWxzZSxcblx0dXNlclNlbFJlcFJ1bGVUcmlnZ2VyOiBbXCItXCIsIFwiI1wiXSxcblx0dXNlclNlbFJlcFJ1bGVWYWx1ZTogW3tsZWZ0Olwifn5cIiwgcmlnaHQ6XCJ+flwifSwge2xlZnQ6XCIjXCIsIHJpZ2h0OlwiIFwifV0sXG5cdHVzZXJEZWxldGVSdWxlc1N0ckxpc3Q6IFtbXCJkZW1vfFwiLCBcInxcIl1dLFxuXHR1c2VyQ29udmVydFJ1bGVzU3RyTGlzdDogW1tcIjopfFwiLFwiXHVEODNEXHVERTAwfFwiXV0sXG5cdHVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuOiB0cnVlLFxuXHR1c2VyRGVsUnVsZVNldHRpbmdzT3BlbjogdHJ1ZSxcblx0dXNlckN2dFJ1bGVTZXR0aW5nc09wZW46IHRydWUsXG5cblx0RW50ZXJUd2ljZTogZmFsc2UsXG5cdFRyeUZpeENoaW5lc2VJTTogdHJ1ZSxcblx0UHVuY1JlY3RpZnk6IGZhbHNlLFxuXHRGaXhNYWNPU0NvbnRleHRNZW51OiBmYWxzZSxcblx0VHJ5Rml4TVNJTUU6IGZhbHNlLFxufVxuXG5leHBvcnQgY2xhc3MgRWFzeVR5cGluZ1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBFYXN5VHlwaW5nUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEVhc3lUeXBpbmdQbHVnaW4pIHtcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdH1cblxuXHRkaXNwbGF5KCk6IHZvaWQge1xuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG5cblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiT2JzaWRpYW4gRWFzeVR5cGluZyBQbHVnaW5cIiB9KTtcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBcIk1vcmUgZGV0YWlsIGlzIGluIEdpdGh1YjogXCIgfSkuY3JlYXRlRWwoXCJhXCIsIHtcblx0XHRcdHRleHQ6IFwiZWFzeS10eXBpbmctb2JzaWRpYW5cIixcblx0XHRcdGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL1lhb3podXdhL2Vhc3ktdHlwaW5nLW9ic2lkaWFuXCIsXG5cdFx0fSk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdcdTU4OUVcdTVGM0FcdTdGMTZcdThGOTFcdThCQkVcdTdGNkUgKEVuaGFuY2VkIEVkaXRpbmcgU2V0dGluZyknIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIlN5bWJvbCBhdXRvIHBhaXIgYW5kIGRlbGV0ZSB3aXRoIHBhaXJcIilcblx0XHRcdC5zZXREZXNjKFwiXHU1ODlFXHU1MkEwXHU1OTFBXHU3OUNEXHU3QjI2XHU1M0Y3XHU5MTREXHU1QkY5XHU4RjkzXHU1MTY1XHVGRjBDXHU5MTREXHU1QkY5XHU1MjIwXHU5NjY0XHVGRjBDXHU1OTgyXHUzMDBBXHUzMDBCLCBcdTIwMUNcdTIwMUQsIFx1MzAwQ1x1MzAwRCwgXHUzMDBFXHUzMDBGLFx1MzAxMFx1MzAxMVx1N0I0OVwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnRyaW5zaWNTeW1ib2xQYWlycylcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnRyaW5zaWNTeW1ib2xQYWlycyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTZWxlY3Rpb24gUmVwbGFjZSBFbmhhbmNlbWVudFwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTkwMDlcdTRFMkRcdTY1ODdcdTY3MkNcdTYwQzVcdTUxQjVcdTRFMEJcdTc2ODRcdTdGMTZcdThGOTFcdTU4OUVcdTVGM0FcdUZGMENcdTYzMDlcdUZGRTVcdTIxOTIkXHU5MDA5XHU0RTJEXHU3Njg0XHU2NTg3XHU2NzJDJCwgXHU2MzA5XHUwMEI3XHUyMTkyYFx1OTAwOVx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQ2BcdUZGMENcdTMwMEEgXHUyMTkyIFx1MzAwQVx1OTAwOVx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQ1x1MzAwQlx1N0I0OVx1N0I0OVwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5TZWxlY3Rpb25FbmhhbmNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlNlbGVjdGlvbkVuaGFuY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiQ29udmVydCBzdWNjZXNzaXZlIGZ1bGwgd2lkdGggc3ltYm9sIHRvIGhhbGYgd2lkdGggc3ltYm9sXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlx1OEZERVx1N0VFRFx1OEY5M1x1NTE2NVx1NTE2OFx1ODlEMlx1N0IyNlx1NTNGN1x1OEY2Q1x1NTM0QVx1ODlEMlx1RkYwQ1x1MzAwMlx1MzAwMlx1MjE5MiAuXHVGRjBDXHVGRjAxXHVGRjAxXHUyMTkyICFcdUZGMEMgXHUzMDBCXHUzMDBCXHUyMTkyID5cIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRlcySFdFbmhhbmNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkZXMkhXRW5oYW5jZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJCYXNpYyBzeW1ib2wgaW5wdXQgZW5oYW5jZSBmb3Igb2JzaWRpYW5cIilcblx0XHRcdC5zZXREZXNjKFwiT2JzaWRpYW4gXHU3Njg0XHU1N0ZBXHU3ODQwXHU4RjkzXHU1MTY1XHU1ODlFXHU1RjNBXHVGRjBDXHU1OTgyXHUzMDEwXHUzMDEwfCBcdTIxOTIgW1t8XV1cdUZGMENcdTUzRTVcdTk5OTZcdTc2ODRcdTMwMDFcdTIxOTIgL1x1RkYwQ1x1NTNFNVx1OTk5Nlx1NzY4NFx1MzAwQlx1MjE5MiA+XHVGRjBDXHUwMEI3XHUwMEI3fCBcdTIxOTIgYHxgXHVGRjBDIGBcdTAwQjd8YCBcdTUzRDhcdTYyMTBcdTRFRTNcdFx1NzgwMVx1NTc1N1x1RkYwQ1x1RkZFNVx1RkZFNXwgXHUyMTkyICR8JFwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5CYXNlT2JFZGl0RW5oYW5jZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5CYXNlT2JFZGl0RW5oYW5jZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJUYWJvdXRcIilcblx0XHRcdC5zZXREZXNjKFwiVGFib3V0IGlubGluZSBjb2RlIG9yIHBhaXJlZCBzeW1ib2xzKHdoZW4gc2VsZWN0ZWQpLiBUYWIgXHU4REYzXHU1MUZBXHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1NzU3XHU2MjE2XHU5MTREXHU1QkY5XHU3QjI2XHU1M0Y3XHU1NzU3KFx1OTAwOVx1NEUyRFx1NjVGNilcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuVGFib3V0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlRhYm91dCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1x1ODFFQVx1NUI5QVx1NEU0OVx1N0YxNlx1OEY5MVx1OEY2Q1x1NjM2Mlx1ODlDNFx1NTIxOSAoQ3VzdG9taXplIEVkaXQgQ29udmVydGlvbiBSdWxlKScgfSk7XG5cdFx0dGhpcy5idWlsZFVzZXJTZWxSZXBSdWxlU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiZGV0YWlsc1wiLCB7XG5cdFx0XHRjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIixcblx0XHRcdGF0dHI6IHtcblx0XHRcdFx0Li4uKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuP3sgb3BlbjogdHJ1ZSB9Ont9KVxuXHRcdFx0fVxuXHRcdH0pKVxuXG5cdFx0dGhpcy5idWlsZFVzZXJEZWxldGVSdWxlU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiZGV0YWlsc1wiLCB7XG5cdFx0XHRjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIixcblx0XHRcdGF0dHI6IHtcblx0XHRcdFx0Li4uKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxSdWxlU2V0dGluZ3NPcGVuP3sgb3BlbjogdHJ1ZSB9Ont9KVxuXHRcdFx0fVxuXHRcdH0pKVxuXG5cdFx0dGhpcy5idWlsZFVzZXJDb252ZXJ0UnVsZVNldHRpbmcodGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImRldGFpbHNcIiwge1xuXHRcdFx0Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCIsXG5cdFx0XHRhdHRyOiB7XG5cdFx0XHRcdC4uLih0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyQ3Z0UnVsZVNldHRpbmdzT3Blbj97IG9wZW46IHRydWUgfTp7fSlcblx0XHRcdH1cblx0XHR9KSlcblx0XHRcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1x1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlx1OEJCRVx1N0Y2RSAoQXV0b2Zvcm1hdCBTZXR0aW5nKScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiQXV0byBmb3JtYXR0aW5nIHdoZW4gdHlwaW5nXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlx1NjYyRlx1NTQyNlx1NTcyOFx1N0YxNlx1OEY5MVx1NjU4N1x1Njg2M1x1NjVGNlx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlx1NjU4N1x1NjcyQ1x1RkYwQ1x1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlx1NzY4NFx1NjAzQlx1NUYwMFx1NTE3M1wiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvRm9ybWF0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9Gb3JtYXQgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6ICdEZXRhaWxlZCBTZXR0aW5nIEJlbG93JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTcGFjZSBiZXR3ZWVuIENoaW5lc2UgYW5kIEVuZ2xpc2hcIilcblx0XHRcdC5zZXREZXNjKFwiXHU1NzI4XHU0RTJEXHU2NTg3XHU1NDhDXHU4MkYxXHU2NTg3XHU5NUY0XHU3QTdBXHU2ODNDXCIpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VFbmdsaXNoU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VFbmdsaXNoU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTcGFjZSBiZXR3ZWVuIENoaW5lc2UgYW5kIE51bWJlclwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTU3MjhcdTRFMkRcdTY1ODdcdTU0OENcdTY1NzBcdTVCNTdcdTk1RjRcdTdBN0FcdTY4M0NcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZU51bWJlclNwYWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5DaGluZXNlTnVtYmVyU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiU3BhY2UgYmV0d2VlbiBFbmdpbHNoIGFuZCBOdW1iZXJcIilcblx0XHRcdC5zZXREZXNjKFwiXHU1NzI4XHU4MkYxXHU2NTg3XHU1NDhDXHU2NTcwXHU1QjU3XHU5NUY0XHU3QTdBXHU2ODNDXCIpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkVuZ2xpc2hOdW1iZXJTcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRW5nbGlzaE51bWJlclNwYWNlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVsZXRlIHRoZSBTcGFjZSBiZXR3ZWVuIENoaW5lc2UgY2hhcmFjdGVyc1wiKVxuXHRcdFx0LnNldERlc2MoXCJcdTU3MjhcdTRFMkRcdTY1ODdcdTVCNTdcdTdCMjZcdTk1RjRcdTUzQkJcdTk2NjRcdTdBN0FcdTY4M0NcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZU5vU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VOb1NwYWNlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGV2ZXJ5IHNlbnRlbmNlXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlx1ODJGMVx1NjU4N1x1NkJDRlx1NEUyQVx1NTNFNVx1OTk5Nlx1NUI1N1x1NkJDRFx1NTkyN1x1NTE5OVwiKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuT25seVdoZW5UeXBpbmcsIFwiXHU4RjkzXHU1MTY1XHU2NUY2XHU3NTFGXHU2NTQ4KE9ubHkgV2hlbiBUeXBpbmcpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuR2xvYmFsbHksIFwiXHU1MTY4XHU1QzQwXHU3NTFGXHU2NTQ4KFdvcmsgR2xvYmFsbHkpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvQ2FwaXRhbE1vZGUpO1xuXHRcdFx0XHRkcm9wZG93bi5vbkNoYW5nZShhc3luYyAodjogV29ya01vZGUuT25seVdoZW5UeXBpbmcgfCBXb3JrTW9kZS5HbG9iYWxseSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9DYXBpdGFsTW9kZSA9IHY7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRUb29sdGlwKFwiXHU1MjlGXHU4MEZEXHU1RjAwXHU1MTczKFN3aXRjaClcIik7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvQ2FwaXRhbCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b0NhcGl0YWwgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTbWFydGx5IGluc2VydCBzcGFjZSBiZXR3ZWVuIHRleHQgYW5kIHB1bmN0dWF0aW9uXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlx1NTcyOFx1NjU4N1x1NjcyQ1x1NTQ4Q1x1NjgwN1x1NzBCOVx1OTVGNFx1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1wiKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuT25seVdoZW5UeXBpbmcsIFwiXHU4RjkzXHU1MTY1XHU2NUY2XHU3NTFGXHU2NTQ4KE9ubHkgV2hlbiBUeXBpbmcpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuR2xvYmFsbHksIFwiXHU1MTY4XHU1QzQwXHU3NTFGXHU2NTQ4KFdvcmsgR2xvYmFsbHkpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlTW9kZSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBXb3JrTW9kZS5Pbmx5V2hlblR5cGluZyB8IFdvcmtNb2RlLkdsb2JhbGx5KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZU1vZGUgPSB2O1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIlNwYWNlIHN0YXRlZ3kgYmV0d2VlbiBpbmxpbmUgY29kZSBhbmQgdGV4dFwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTU3MjggYFx1ODg0Q1x1NTE4NVx1NEVFM1x1NzgwMWAgXHU1NDhDXHU2NTg3XHU2NzJDXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHUzMDAyXCIgK1xuXHRcdFx0XHRcIlx1NjVFMFx1ODk4MVx1NkM0Mlx1RkYxQVx1NUJGOVx1NjcyQ1x1N0M3Qlx1NTIyQlx1NTc1N1x1NEUwRVx1NURFNlx1NTNGM1x1NjU4N1x1NjcyQ1x1NkNBMVx1NjcwOVx1N0E3QVx1NjgzQ1x1NzY4NFx1ODk4MVx1NkM0Mlx1RkYwQ1wiICtcblx0XHRcdFx0XCJcdThGNkZcdTdBN0FcdTY4M0NcdUZGMUFcdTVCRjlcdTY3MkNcdTdDN0JcdTUyMkJcdTU3NTdcdTRFMEVcdTU0NjhcdTU2RjRcdTUzM0FcdTU3NTdcdTUzRUFcdTg5ODFcdTZDNDJcdTY3MDlcdThGNkZcdTdBN0FcdTY4M0NcdUZGMENcdThGNkZcdTdBN0FcdTY4M0NcdTU5ODJcdTVGNTNcdTUyNERcdTU3NTdcdTVERTZcdThGQjlcdTc2ODRcdTRFMzRcdThGRDFcdTY1ODdcdTY3MkNcdTRFM0FcdTMwMDJcdUZGMENcdUZGMUJcdUZGMUZcdTdCNDlcdTUxNjhcdTg5RDJcdTY4MDdcdTcwQjlcdUZGMENcdTVGNTNcdTUyNERcdTU3NTdcdTUzRjNcdThGQjlcdTc2ODRcdTRFMzRcdThGRDFcdTY1ODdcdTY3MkNcdTRFM0FcdTYyNDBcdTY3MDlcdTUxNjhcdTUzNEFcdTg5RDJcdTY4MDdcdTcwQjlcdUZGMENcIiArXG5cdFx0XHRcdFwiXHU0RTI1XHU2ODNDXHU3QTdBXHU2ODNDXHVGRjFBXHU1RjUzXHU1MjREXHU1NzU3XHU0RTBFXHU0RTM0XHU4RkQxXHU2NTg3XHU2NzJDXHU0RTRCXHU5NUY0XHU0RTI1XHU2ODNDXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXHUzMDAyXCJcblx0XHRcdClcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLm5vbmUpLCBcIlx1NjVFMFx1ODk4MVx1NkM0MihObyBSZXF1aXJlKVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnNvZnQpLCBcIlx1OEY2Rlx1N0E3QVx1NjgzQyhTb2Z0IFNwYWNlKVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnN0cmljdCksIFwiXHU0RTI1XHU2ODNDXHU3QTdBXHU2ODNDKFN0cmljdCBTcGFjZSlcIik7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlKSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlID0gc3RyaW5nMlNwYWNlU3RhdGUodik7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTcGFjZSBzdGF0ZWd5IGJldHdlZW4gaW5saW5lIGZvcm11bGEgYW5kIHRleHRcIilcblx0XHRcdC5zZXREZXNjKFwiXHU1NzI4ICRcdTg4NENcdTUxODVcdTUxNkNcdTVGMEYkIFx1NTQ4Q1x1NjU4N1x1NjcyQ1x1OTVGNFx1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUubm9uZSksIFwiXHU2NUUwXHU4OTgxXHU2QzQyKE5vIFJlcXVpcmUpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc29mdCksIFwiXHU4RjZGXHU3QTdBXHU2ODNDKFNvZnQgU3BhY2UpXCIpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc3RyaWN0KSwgXCJcdTRFMjVcdTY4M0NcdTdBN0FcdTY4M0MoU3RyaWN0IFNwYWNlKVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUoU3RyaW5nKHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGUpKTtcblx0XHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHY6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGUgPSBzdHJpbmcyU3BhY2VTdGF0ZSh2KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIlNwYWNlIHN0cmF0ZWd5IGJldHdlZW4gbGluayBhbmQgdGV4dFwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTU3MjggW1t3aWtpbGlua11dIFttZGxpbmtdKC4uLikgXHU1NDhDXHU2NTg3XHU2NzJDXHU5NUY0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHUzMDAyXHU2NjdBXHU4MEZEXHU3QTdBXHU2ODNDXHU2QTIxXHU1RjBGXHU0RTBCXHU1MjE5XHU0RjFBXHU4MDAzXHU4NjUxXHU4QkU1XHU5NEZFXHU2M0E1XHU1NzU3XHU3Njg0XHU2NjNFXHU3OTNBXHU1MTg1XHU1QkI5XHVGRjA4XHU1OTgyd2lraVx1OTRGRVx1NjNBNVx1NzY4NFx1NTIyQlx1NTQwRFx1RkYwOVx1Njc2NVx1NEUwRVx1NEUzNFx1OEZEMVx1NjU4N1x1NjcyQ1x1OEZEQlx1ODg0Q1x1N0E3QVx1NjgzQ1x1MzAwMlwiKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oXCJkdW1teVwiLCBcIlx1NTQ0Nlx1N0E3QVx1NjgzQyhkdW1teSlcIik7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihcInNtYXJ0XCIsIFwiXHU2NjdBXHU4MEZEXHU3QTdBXHU2ODNDKFNtYXJ0KVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgPyBcInNtYXJ0XCIgOiBcImR1bW15XCIpO1xuXHRcdFx0XHRkcm9wZG93bi5vbkNoYW5nZShhc3luYyAodjogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgPSB2ID09IFwic21hcnRcIiA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0XHQvLyBuZXcgTm90aWNlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSkpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLm5vbmUpLCBcIlx1NjVFMFx1ODk4MVx1NkM0MihObyBSZXF1aXJlKVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnNvZnQpLCBcIlx1OEY2Rlx1N0E3QVx1NjgzQyhTb2Z0IFNwYWNlKVwiKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnN0cmljdCksIFwiXHU0RTI1XHU2ODNDXHU3QTdBXHU2ODNDKFN0cmljdCBTcGFjZSlcIik7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlKSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlID0gc3RyaW5nMlNwYWNlU3RhdGUodik7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnXHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU1MzNBXHU1NzU3IChDdXN0b20gcmVndWxhciBleHByZXNzaW9ucyBibG9jayknIH0pO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJVc2VyIERlZmluZWQgUmVnRXhwIFN3aXRjaFwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTVGMDBcdTUxNzNcdUZGMENcdTUzMzlcdTkxNERcdTUyMzBcdTc2ODRcdTUxODVcdTVCQjlcdTRFMERcdThGREJcdTg4NENcdTY4M0NcdTVGMEZcdTUzMTZcdUZGMENcdTRFMTRcdTUzRUZcdTRFRTVcdThCQkVcdTdGNkVcdTUzMzlcdTkxNERcdTUyMzBcdTc2ODRcdTUxODVcdTVCQjlcdTU3NTdcdTRFMEVcdTUxNzZcdTRFRDZcdTUxODVcdTVCQjlcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlckRlZmluZWRSZWdTd2l0Y2gpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJEZWZpbmVkUmVnU3dpdGNoID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcInBcIiwgeyB0ZXh0OiBcIlx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1NzZGOFx1NTE3M1x1NzdFNVx1OEJDNlx1RkYwQ1x1ODlDMSBcIiB9KS5jcmVhdGVFbChcImFcIiwge1xuXHRcdFx0dGV4dDogXCJcdTMwMEFcdTk2MkVcdTRFMDBcdTVDRjBcdUZGMUFcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTdCODBcdTY2MEVcdTY1NTlcdTdBMEJcdTMwMEJcIixcblx0XHRcdGhyZWY6IFwiaHR0cHM6Ly9qYXZhc2NyaXB0LnJ1YW55aWZlbmcuY29tL3N0ZGxpYi9yZWdleHAuaHRtbCNcIixcblx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IFwiXHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU4OUM0XHU1MjE5XHU0RjdGXHU3NTI4XHU4QkY0XHU2NjBFXHU0RTBFXHU3OTNBXHU0RjhCXHVGRjFBXCIgfSkuY3JlYXRlRWwoXCJhXCIsIHtcblx0XHRcdHRleHQ6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU4OUM0XHU1MjE5XCIsXG5cdFx0XHRocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ZYW96aHV3YS9lYXN5LXR5cGluZy1vYnNpZGlhbi9ibG9iL21hc3Rlci9Vc2VyRGVmaW5lZFJlZ0V4cC5tZFwiLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgcmVnQ29udGVudEFyZWFTZXR0aW5nID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpO1xuXHRcdHJlZ0NvbnRlbnRBcmVhU2V0dGluZy5zZXR0aW5nRWwuc2V0QXR0cmlidXRlKFxuXHRcdFx0XCJzdHlsZVwiLFxuXHRcdFx0XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcIlxuXHRcdCk7XG5cdFx0cmVnQ29udGVudEFyZWFTZXR0aW5nXG5cdFx0XHQuc2V0TmFtZShcIlVzZXItZGVmaW5lZCBSZWd1bGFyIEV4cHJlc3Npb24sIG9uZSBleHByZXNzaW9uIHBlciBsaW5lXCIpXG5cdFx0XHQuc2V0RGVzYyhcblx0XHRcdFx0XCJcdTc1MjhcdTYyMzdcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdUZGMENcdTUzMzlcdTkxNERcdTUyMzBcdTc2ODRcdTUxODVcdTVCQjlcdTRFMERcdThGREJcdTg4NENcdTY4M0NcdTVGMEZcdTUzMTZcdUZGMENcdTZCQ0ZcdTg4NENcdTRFMDBcdTRFMkFcdTg4NjhcdThGQkVcdTVGMEZcdUZGMENcdTg4NENcdTVDM0VcdTRFMERcdTg5ODFcdTk2OEZcdTYxMEZcdTUyQTBcdTdBN0FcdTY4M0NcdTMwMDJcIiArXG5cdFx0XHRcdFwiXHU2QkNGXHU4ODRDXHU2NzJCXHU1QzNFM1x1NEUyQVx1NUI1N1x1N0IyNlx1NzY4NFx1NTZGQVx1NUI5QVx1NEUzQXxcdTU0OENcdTRFMjRcdTRFMkFcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcdTdCMjZcdTUzRjdcdUZGMENcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcdTdCMjZcdTUzRjdcdTRFM0EtPStcdUZGMENcdTUyMDZcdTUyMkJcdTRFRTNcdTg4NjhcdTRFMERcdTg5ODFcdTZDNDJcdTdBN0FcdTY4M0MoLSlcdUZGMENcdThGNkZcdTdBN0FcdTY4M0MoPSlcdUZGMENcdTRFMjVcdTY4M0NcdTdBN0FcdTY4M0MoKylcdTMwMDJcIiArXG5cdFx0XHRcdFwiXHU4RkQ5XHU0RTI0XHU0RTJBXHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHU3QjI2XHU1M0Y3XHU1MjA2XHU1MjJCXHU0RTNBXHU1MzM5XHU5MTREXHU1MzNBXHU1NzU3XHU3Njg0XHU1REU2XHU1M0YzXHU0RTI0XHU4RkI5XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcblx0XHRcdCk7XG5cdFx0Y29uc3QgcmVnQ29udGVudEFyZWEgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoXG5cdFx0XHRyZWdDb250ZW50QXJlYVNldHRpbmcuY29udHJvbEVsXG5cdFx0KTtcblxuXHRcdHNldEF0dHJpYnV0ZXMocmVnQ29udGVudEFyZWEuaW5wdXRFbCwge1xuXHRcdFx0c3R5bGU6IFwibWFyZ2luLXRvcDogMTJweDsgd2lkdGg6IDEwMCU7ICBoZWlnaHQ6IDMwdmg7XCIsXG5cdFx0XHQvLyBjbGFzczogXCJtcy1jc3MtZWRpdG9yXCIsXG5cdFx0fSk7XG5cdFx0cmVnQ29udGVudEFyZWFcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ0V4cClcblx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlckRlZmluZWRSZWdFeHAgPSB2YWx1ZTtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1x1NjMwN1x1NUI5QVx1NjU4N1x1NEVGNlx1NEUwRFx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNiAoRXhjbHVkZSBGb2xkZXJzL0ZpbGVzKScgfSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkV4Y2x1ZGUgRm9sZGVycy9GaWxlc1wiKVxuXHRcdFx0LnNldERlc2MoXCJUaGlzIHBsdWdpbiB3aWxsIHBhcnNlIGVhY2ggbGluZSBhcyBhIGV4bHVkZSBmb2xkZXIgb3IgZmlsZS4gRm9yIGV4YW1wbGU6IERhaWx5Tm90ZS8sIERhaWx5Tm90ZS9XZWVrTm90ZXMvLCBEYWlseU5vdGUvdGVzdC5tZFwiKVxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxuXHRcdFx0XHR0ZXh0XG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkV4Y2x1ZGVGaWxlcylcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5FeGNsdWRlRmlsZXMgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0V4cGVyaW1lbnRhbCBGZWF0dXJlcycgfSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkZpeCBNYWNPUyBjb250ZXh0LW1lbnUgY3Vyc29yIHBvc2l0aW9uKE5lZWQgdG8gcmVzdGFydCBPYnNpZGlhbilcIilcblx0XHRcdC5zZXREZXNjKFwiXHU0RkVFXHU1OTBEIE1hY09TIFx1OUYyMFx1NjgwN1x1NTNGM1x1OTUyRVx1NTQ3Q1x1NTFGQVx1ODNEQ1x1NTM1NVx1NjVGNlx1NTE0OVx1NjgwN1x1OERGM1x1NTIzMFx1NEUwQlx1NEUwMFx1ODg0Q1x1NzY4NFx1OTVFRVx1OTg5OChcdTk3MDBcdTg5ODFcdTkxQ0RcdTU0MkZPYnNpZGlhblx1NzUxRlx1NjU0OClcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRml4TWFjT1NDb250ZXh0TWVudSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRml4TWFjT1NDb250ZXh0TWVudSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkVuaGFuY2UgQ2hpbmVzZSBJbnB1dCBNZXRob2RcIilcblx0XHRcdC5zZXREZXNjKFwiXHU0RTJEXHU2NTg3XHU4RjkzXHU1MTY1XHU2Q0Q1XHU0RTBCXHVGRjBDXHU1NkRFXHU4RjY2L1NoaWZ0L0VudGVyIFx1OEY5M1x1NTE2NVx1NTE4NVx1NUJCOVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5UcnlGaXhDaGluZXNlSU0pLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlRyeUZpeENoaW5lc2VJTSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShcIkZpeCBNaWNyb1NvZnQgSW5wdXQgTWV0aG9kIElzc3VlXCIpXG5cdFx0XHQuc2V0RGVzYyhcIlx1OTAwMlx1OTE0RFx1NjVFN1x1NzI0OFx1NUZBRVx1OEY2Rlx1OEY5M1x1NTE2NVx1NkNENVwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5UcnlGaXhNU0lNRSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuVHJ5Rml4TVNJTUUgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJTdHJpY3QgTGluZSBicmVha3MgTW9kZSBFbnRlciBUd2ljZVwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTRFMjVcdTY4M0NcdTYzNjJcdTg4NENcdTc2ODRcdThCQkVcdTdGNkVcdTRFMEJcdUZGMENcdTU3MjhcdTY2NkVcdTkwMUFcdTY1ODdcdTY3MkNcdTg4NENcdThGREJcdTg4NENcdTRFMDBcdTZCMjFcdTU2REVcdThGNjZcdTRGMUFcdTRFQTdcdTc1MUZcdTRFMjRcdTRFMkFcdTYzNjJcdTg4NENcdTdCMjZcIilcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRW50ZXJUd2ljZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRW50ZXJUd2ljZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJQdW5jIHJlY3RpZnlcIilcblx0XHRcdC5zZXREZXNjKFwiXHU0RUM1XHU1NzI4XHU4RjkzXHU1MTY1XHU4RkM3XHU3QTBCXHU0RTJEXHVGRjBDXHU0RTJEXHU2NTg3XHU5NUY0XHU3Njg0XHU4MkYxXHU2NTg3XHU2ODA3XHU3MEI5XHVGRjA4LC4/IVx1RkYwOVx1ODFFQVx1NTJBOFx1OEY2Q1x1NjM2Mlx1NEUzQVx1NTE2OFx1ODlEMlx1RkYwOFx1NTNFRlx1NjRBNFx1OTUwMFx1RkYwOVwiKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5QdW5jUmVjdGlmeSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY1JlY3RpZnkgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJQcmludCBkZWJ1ZyBpbmZvIGluIGNvbnNvbGVcIilcblx0XHRcdC5zZXREZXNjKFwiXHU1NzI4XHU2M0E3XHU1MjM2XHU1M0YwXHU4RjkzXHU1MUZBXHU4QzAzXHU4QkQ1XHU0RkUxXHU2MDZGXCIpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1ZyA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0YnVpbGRVc2VyU2VsUmVwUnVsZVNldHRpbmcoY29udGFpbmVyRWw6IEhUTUxEZXRhaWxzRWxlbWVudCl7XG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwub250b2dnbGUgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUnVsZVNldHRpbmdzT3BlbiA9IGNvbnRhaW5lckVsLm9wZW47XG5cdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfTtcblx0XHRjb25zdCBzdW1tYXJ5ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJzdW1tYXJ5XCIsIHtjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIn0pO1xuXHRcdHN1bW1hcnkuc2V0VGV4dChcIlx1ODFFQVx1NUI5QVx1NEU0OVx1OTAwOVx1NEUyRFx1NjU4N1x1NjcyQ1x1N0YxNlx1OEY5MVx1NTg5RVx1NUYzQVx1ODlDNFx1NTIxOSAoQ3VzdG9taXplIFNlbGVjdGlvbiBSZXBsYWNlIFJ1bGUpXCIpXG5cbiAgICAgICAgLy8gc3VtbWFyeS5zZXRIZWFkaW5nKCkuc2V0TmFtZShcIlVzZXIgZGVmaW5lZCBTZWxlY3Rpb24gUmVwbGFjZSBSdWxlXCIpO1xuICAgICAgICAvLyBzdW1tYXJ5LmNyZWF0ZURpdihcImNvbGxhcHNlclwiKS5jcmVhdGVEaXYoXCJoYW5kbGVcIik7XG5cblx0XHRjb25zdCBzZWxlY3Rpb25SdWxlU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblx0XHRzZWxlY3Rpb25SdWxlU2V0dGluZ1xuXHRcdFx0LnNldE5hbWUoXCJTZWxlY3Rpb24gUmVwbGVjZSBSdWxlXCIpXG5cblx0XHRjb25zdCByZXBsYWNlUnVsZVRyaWdnZXIgPSBuZXcgVGV4dENvbXBvbmVudChzZWxlY3Rpb25SdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHJlcGxhY2VSdWxlVHJpZ2dlci5zZXRQbGFjZWhvbGRlcihcIlRyaWdnciBTeW1ib2xcIik7XG5cblx0XHRjb25zdCByZXBsYWNlTGVmdFN0cmluZyA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChzZWxlY3Rpb25SdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHJlcGxhY2VMZWZ0U3RyaW5nLnNldFBsYWNlaG9sZGVyKFwiTmV3IExlZnQgU2lkZSBTdHJpbmdcIik7XG5cblx0XHRjb25zdCByZXBsYWNlUmlnaHRTdHJpbmcgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoc2VsZWN0aW9uUnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRyZXBsYWNlUmlnaHRTdHJpbmcuc2V0UGxhY2Vob2xkZXIoXCJOZXcgUmlnaHQgU2lkZSBTdHJpbmdcIik7XG5cblx0XHRzZWxlY3Rpb25SdWxlU2V0dGluZ1xuXHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XG5cdFx0XHRcdGJ1dHRvblxuXHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiK1wiKVxuXHRcdFx0XHRcdC5zZXRUb29sdGlwKFwiQWRkIFJ1bGVcIilcblx0XHRcdFx0XHQub25DbGljayhhc3luYyAoYnV0dG9uRWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHRyaWdnZXIgPSByZXBsYWNlUnVsZVRyaWdnZXIuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gcmVwbGFjZUxlZnRTdHJpbmcuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCByaWdodCA9IHJlcGxhY2VSaWdodFN0cmluZy5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKHRyaWdnZXIgJiYgKGxlZnQgfHwgcmlnaHQpKSB7XG5cdFx0XHRcdFx0XHRcdGlmKHRyaWdnZXIubGVuZ3RoIT0xICYmIHRyaWdnZXIhPVwiXHUyMDE0XHUyMDE0XCIgJiYgdHJpZ2dlciE9XCJcdTIwMjZcdTIwMjZcIil7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIklubHZhbGlkIHRyaWdnZXIsIHRyaWdnZXIgbXVzdCBiZSBhIHN5bWJvbCBvZiBsZW5ndGggMSBvciBzeW1ib2wgXHUyMDE0XHUyMDE0LCBcdTIwMjZcdTIwMjZcIik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5hZGRVc2VyU2VsZWN0aW9uUmVwUnVsZSh0cmlnZ2VyLCBsZWZ0LCByaWdodCkpe1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIndhcm5pbmchIFRyaWdnZXIgXCIgKyB0cmlnZ2VyICsgXCIgaXMgYWxyZWFkeSBleGlzdCFcIilcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJtaXNzaW5nIGlucHV0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBjb25zdCBzZWxSZXBSdWxlQ29udGFpbmVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJkaXZcIik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCB0cmlnZ2VyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyW2ldO1xuXHRcdFx0bGV0IGxlZnRfcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWVbaV0ubGVmdDtcblx0XHRcdGxldCByaWdodF9zID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5yaWdodDtcblx0XHRcdGxldCBzaG93U3RyID0gXCJUcmlnZ2VyOiBcIiArIHRyaWdnZXIgKyBcIiBcdTIxOTIgXCIgKyBzaG93U3RyaW5nKGxlZnRfcykgKyBcInNlbGVjdGVkXCIgKyBzaG93U3RyaW5nKHJpZ2h0X3MpO1xuXHRcdFx0Ly8gY29uc3Qgc2V0dGluZ0l0ZW0gPSBzZWxSZXBSdWxlQ29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIpO1xuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKHNob3dTdHIpXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZ2VhclwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAoXCJFZGl0IHJ1bGVcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0bmV3IFNlbGVjdFJ1bGVFZGl0TW9kYWwodGhpcy5hcHAsIHRyaWdnZXIsbGVmdF9zLCByaWdodF9zLCBhc3luYyAobmV3X2xlZnQsIG5ld19yaWdodCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZVVzZXJTZWxlY3Rpb25SZXBSdWxlKGksIG5ld19sZWZ0LCBuZXdfcmlnaHQpO1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9KS5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oYnV0dG9uID0+IHtcblx0XHRcdFx0XHRidXR0b24uc2V0SWNvbihcInRyYXNoXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChcIlJlbW92ZSBydWxlXCIpXG5cdFx0XHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmRlbGV0ZVVzZXJTZWxlY3Rpb25SZXBSdWxlKGkpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cblxuXHR9XG5cblx0YnVpbGRVc2VyRGVsZXRlUnVsZVNldHRpbmcoY29udGFpbmVyRWw6IEhUTUxEZXRhaWxzRWxlbWVudCl7XG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwub250b2dnbGUgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyRGVsUnVsZVNldHRpbmdzT3BlbiA9IGNvbnRhaW5lckVsLm9wZW47XG5cdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfTtcblx0XHRjb25zdCBzdW1tYXJ5ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJzdW1tYXJ5XCIsIHtjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIn0pO1xuXHRcdHN1bW1hcnkuc2V0VGV4dChcIlx1ODFFQVx1NUI5QVx1NEU0OVx1NTIyMFx1OTY2NFx1N0YxNlx1OEY5MVx1NTg5RVx1NUYzQVx1ODlDNFx1NTIxOSAoQ3VzdG9taXplIERlbGV0ZSBSdWxlKVwiKVxuXG5cdFx0Y29uc3QgZGVsZXRlUnVsZVNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XG5cdFx0ZGVsZXRlUnVsZVNldHRpbmdcblx0XHRcdC5zZXROYW1lKFwiRGVsZXRlIFJ1bGVcIilcblx0XHRcdC5zZXREZXNjKFwiXHU4OUM0XHU1MjE5XHVGRjFBXHU3NTI4fFx1NEVFM1x1ODg2OFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1RkYwQ1x1NUZDNVx1OTg3Qlx1NTMwNVx1NTQyQlx1NTE0OVx1NjgwN1x1MzAwMiBUaXBzOiBVc2luZyB8IHRvIGluZGljYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uXCIpXG5cblx0XHRjb25zdCBwYXR0ZXJuQmVmb3JlID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGRlbGV0ZVJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cGF0dGVybkJlZm9yZS5zZXRQbGFjZWhvbGRlcihcIkJlZm9yZSBEZWxldGVcIik7XG5cblx0XHRjb25zdCBwYXR0ZXJuQWZ0ZXIgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoZGVsZXRlUnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRwYXR0ZXJuQWZ0ZXIuc2V0UGxhY2Vob2xkZXIoXCJOZXcgUGF0dGVyblwiKTtcblxuXHRcdGRlbGV0ZVJ1bGVTZXR0aW5nXG5cdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IHtcblx0XHRcdFx0YnV0dG9uXG5cdFx0XHRcdFx0LnNldEJ1dHRvblRleHQoXCIrXCIpXG5cdFx0XHRcdFx0LnNldFRvb2x0aXAoXCJBZGQgUnVsZVwiKVxuXHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jIChidXR0b25FbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgYmVmb3JlID0gcGF0dGVybkJlZm9yZS5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0bGV0IGFmdGVyID0gcGF0dGVybkFmdGVyLmlucHV0RWwudmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoYmVmb3JlICYmIGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdGxldCByZWdSdWxlID0gL1xcfC9nO1xuXHRcdFx0XHRcdFx0XHRpZihiZWZvcmUuc2VhcmNoKHJlZ1J1bGUpPT0tMXx8YWZ0ZXIuc2VhcmNoKHJlZ1J1bGUpPT0tMSl7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIklubHZhbGlkIHRyaWdnZXIsIHBhdHRlcm4gbXVzdCBjb250YWluIHN5bWJvbCBcXHwgd2hpY2ggaW5kaWNhdGUgY3Vyc29yIHBvc2l0aW9uXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmFkZFVzZXJEZWxldGVSdWxlKGJlZm9yZSwgYWZ0ZXIpO1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIm1pc3NpbmcgaW5wdXRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5sZW5ndGg7IGkrKyl7XG5cdFx0XHRsZXQgYmVmb3JlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdFtpXVswXTtcblx0XHRcdGxldCBhZnRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaV1bMV07XG5cdFx0XHRsZXQgc2hvd1N0ciA9IFwiXFxcIlwiICsgc2hvd1N0cmluZyhiZWZvcmUpICsgXCJcXFwiICBkZWxldGUuYmFja3dhcmRzICBcdTIxOTIgXFxcIlwiKyBzaG93U3RyaW5nKGFmdGVyKStcIlxcXCJcIjsgXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoc2hvd1N0cilcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJnZWFyXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChcIkVkaXQgcnVsZVwiKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRuZXcgRWRpdENvbnZlcnRSdWxlTW9kYWwodGhpcy5hcHAsIFJ1bGVUeXBlLmRlbGV0ZSwgYmVmb3JlLCBhZnRlciwgYXN5bmMgKG5ld19iZWZvcmUsIG5ld19hZnRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZVVzZXJEZWxldGVSdWxlKGksIG5ld19iZWZvcmUsIG5ld19hZnRlcik7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH0pLm9wZW4oKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwidHJhc2hcIilcblx0XHRcdFx0XHRcdC5zZXRUb29sdGlwKFwiUmVtb3ZlIHJ1bGVcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZGVsZXRlVXNlckRlbGV0ZVJ1bGUoaSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHR9XG5cblx0YnVpbGRVc2VyQ29udmVydFJ1bGVTZXR0aW5nKGNvbnRhaW5lckVsOiBIVE1MRGV0YWlsc0VsZW1lbnQpe1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLm9udG9nZ2xlID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckN2dFJ1bGVTZXR0aW5nc09wZW4gPSBjb250YWluZXJFbC5vcGVuO1xuXHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH07XG5cdFx0Y29uc3Qgc3VtbWFyeSA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3VtbWFyeVwiLCB7Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCJ9KTtcblx0XHRzdW1tYXJ5LnNldFRleHQoXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTdGMTZcdThGOTFcdThGNkNcdTYzNjJcdTg5QzRcdTUyMTkgKEN1c3RvbWl6ZSBDb252ZXJ0IFJ1bGUpXCIpXG5cblx0XHRjb25zdCBjb252ZXJ0UnVsZVNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XG5cdFx0Y29udmVydFJ1bGVTZXR0aW5nXG5cdFx0XHQuc2V0TmFtZShcIkNvbnZlcnQgUnVsZVwiKVxuXHRcdFx0LnNldERlc2MoXCJcdTg5QzRcdTUyMTlcdUZGMUFcdTc1Mjh8XHU0RUUzXHU4ODY4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHVGRjBDXHU1RkM1XHU5ODdCXHU1MzA1XHU1NDJCXHU1MTQ5XHU2ODA3XHUzMDAyIFRpcHM6IFVzaW5nIHwgdG8gaW5kaWNhdGUgdGhlIGN1cnNvciBwb3NpdGlvbi5cIilcblxuXHRcdGNvbnN0IHBhdHRlcm5CZWZvcmUgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoY29udmVydFJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cGF0dGVybkJlZm9yZS5zZXRQbGFjZWhvbGRlcihcIkJlZm9yZSBDb252ZXJ0XCIpO1xuXG5cdFx0Y29uc3QgcGF0dGVybkFmdGVyID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGNvbnZlcnRSdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHBhdHRlcm5BZnRlci5zZXRQbGFjZWhvbGRlcihcIk5ldyBQYXR0ZXJuXCIpO1xuXG5cdFx0Y29udmVydFJ1bGVTZXR0aW5nXG5cdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IHtcblx0XHRcdFx0YnV0dG9uXG5cdFx0XHRcdFx0LnNldEJ1dHRvblRleHQoXCIrXCIpXG5cdFx0XHRcdFx0LnNldFRvb2x0aXAoXCJBZGQgUnVsZVwiKVxuXHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jIChidXR0b25FbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgYmVmb3JlID0gcGF0dGVybkJlZm9yZS5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0bGV0IGFmdGVyID0gcGF0dGVybkFmdGVyLmlucHV0RWwudmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoYmVmb3JlICYmIGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdGxldCByZWdSdWxlID0gL1xcfC9nO1xuXHRcdFx0XHRcdFx0XHRpZihiZWZvcmUuc2VhcmNoKHJlZ1J1bGUpPT0tMXx8YWZ0ZXIuc2VhcmNoKHJlZ1J1bGUpPT0tMSl7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIklubHZhbGlkIHRyaWdnZXIsIHBhdHRlcm4gbXVzdCBjb250YWluIHN5bWJvbCBcXHwgd2hpY2ggaW5kaWNhdGUgY3Vyc29yIHBvc2l0aW9uXCIpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmFkZFVzZXJDb252ZXJ0UnVsZShiZWZvcmUsIGFmdGVyKTtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJtaXNzaW5nIGlucHV0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0Lmxlbmd0aDsgaSsrKXtcblx0XHRcdGxldCBiZWZvcmUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdFtpXVswXTtcblx0XHRcdGxldCBhZnRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2ldWzFdO1xuXHRcdFx0bGV0IHNob3dTdHIgPSBcIlxcXCJcIiArIHNob3dTdHJpbmcoYmVmb3JlKSArIFwiXFxcIiAgYXV0byBjb252ZXJ0IHRvIFxcXCJcIisgc2hvd1N0cmluZyhhZnRlcikrXCJcXFwiXCI7IFxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKHNob3dTdHIpXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZ2VhclwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAoXCJFZGl0IHJ1bGVcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0bmV3IEVkaXRDb252ZXJ0UnVsZU1vZGFsKHRoaXMuYXBwLCBSdWxlVHlwZS5jb252ZXJ0LCBiZWZvcmUsIGFmdGVyLCBhc3luYyAobmV3X2JlZm9yZSwgbmV3X2FmdGVyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlVXNlckNvbnZlcnRSdWxlKGksIG5ld19iZWZvcmUsIG5ld19hZnRlcik7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH0pLm9wZW4oKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwidHJhc2hcIilcblx0XHRcdFx0XHRcdC5zZXRUb29sdGlwKFwiUmVtb3ZlIHJ1bGVcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZGVsZXRlVXNlckNvbnZlcnRSdWxlKGkpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxufVxuXG5cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoZWxlbWVudDogYW55LCBhdHRyaWJ1dGVzOiBhbnkpIHtcblx0Zm9yIChsZXQga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSk7XG5cdH1cbn1cblxuXG5leHBvcnQgY2xhc3MgU2VsZWN0UnVsZUVkaXRNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0dHJpZ2dlcjogc3RyaW5nO1xuXHRvbGRfbGVmdDogc3RyaW5nO1xuXHRvbGRfcmlnaHQ6IHN0cmluZztcblx0bmV3X2xlZnQ6IHN0cmluZztcblx0bmV3X3JpZ2h0OiBzdHJpbmc7XG5cdG9uU3VibWl0OiAobmV3X2xlZnQ6IHN0cmluZywgbmV3X3JpZ2h0OnN0cmluZykgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgdHJpZ2dlcjogc3RyaW5nLCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcsIG9uU3VibWl0OiAobmV3X2xlZnQ6IHN0cmluZywgbmV3X3JpZ2h0OnN0cmluZykgPT4gdm9pZCkge1xuXHRcdHN1cGVyKGFwcCk7XG5cdFx0dGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcblx0XHR0aGlzLm9sZF9sZWZ0ID0gbGVmdDtcblx0XHR0aGlzLm9sZF9yaWdodCA9IHJpZ2h0O1xuXHRcdHRoaXMubmV3X2xlZnQgPSBsZWZ0O1xuXHRcdHRoaXMubmV3X3JpZ2h0ID0gcmlnaHQ7XG5cblx0XHR0aGlzLm9uU3VibWl0ID0gb25TdWJtaXQ7XG5cdH1cblxuXHRvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cblx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiRWRpdCBTZWxlY3Rpb24gUmVwbGFjZSBSdWxlXCIgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShcIlRyaWdnZXJcIilcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG5cdFx0XHRcdHRleHQuc2V0VmFsdWUodGhpcy50cmlnZ2VyKTtcblx0XHRcdFx0dGV4dC5zZXREaXNhYmxlZCh0cnVlKTtcblx0XHRcdH0pXG5cdFx0XG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJMZWZ0XCIpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLm9sZF9sZWZ0KTtcblx0XHRcdFx0dGV4dC5vbkNoYW5nZSgodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5ld19sZWZ0ID0gdmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUoXCJSaWdodFwiKVxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PiB7XG5cdFx0XHRcdHRleHQuc2V0VmFsdWUodGhpcy5vbGRfcmlnaHQpO1xuXHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmV3X3JpZ2h0ID0gdmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuYWRkQnV0dG9uKChidG4pID0+XG5cdFx0XHRcdGJ0blxuXHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiVXBkYXRlXCIpXG5cdFx0XHRcdFx0LnNldEN0YSgpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5vblN1Ym1pdCh0aGlzLm5ld19sZWZ0LCB0aGlzLm5ld19yaWdodCk7XG5cdFx0XHRcdFx0fSkpO1xuXHR9XG5cblx0b25DbG9zZSgpIHtcblx0XHRsZXQgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XG5cdH1cbn1cblxuXG5cbmV4cG9ydCBjbGFzcyBFZGl0Q29udmVydFJ1bGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcblx0dHlwZTogUnVsZVR5cGU7XG5cdG9sZF9iZWZvcmU6IHN0cmluZztcblx0b2xkX2FmdGVyOiBzdHJpbmc7XG5cdG5ld19iZWZvcmU6IHN0cmluZztcblx0bmV3X2FmdGVyOiBzdHJpbmc7XG5cdG9uU3VibWl0OiAobmV3X2JlZm9yZTogc3RyaW5nLCBuZXdfYWZ0ZXI6c3RyaW5nKSA9PiB2b2lkO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCB0eXBlOiBSdWxlVHlwZSwgYmVmb3JlOiBzdHJpbmcsIGFmdGVyOiBzdHJpbmcsIG9uU3VibWl0OiAobmV3X2JlZm9yZTogc3RyaW5nLCBuZXdfYWZ0ZXI6c3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMub2xkX2JlZm9yZSA9IGJlZm9yZTtcblx0XHR0aGlzLm9sZF9hZnRlciA9IGFmdGVyO1xuXHRcdHRoaXMubmV3X2JlZm9yZSA9IGJlZm9yZTtcblx0XHR0aGlzLm5ld19hZnRlciA9IGFmdGVyO1xuXG5cdFx0dGhpcy5vblN1Ym1pdCA9IG9uU3VibWl0O1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwiaDFcIiwgeyB0ZXh0OiBcIkVkaXQgXCIgKyB0aGlzLnR5cGV9KTtcblx0XHRcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShcIk9sZCBQYXR0ZXJuXCIpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLm9sZF9iZWZvcmUpO1xuXHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmV3X2JlZm9yZSA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKFwiTmV3IFBhdHRlcm5cIilcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFZhbHVlKHRoaXMub2xkX2FmdGVyKTtcblx0XHRcdFx0dGV4dC5vbkNoYW5nZSgodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5ld19hZnRlciA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LmFkZEJ1dHRvbigoYnRuKSA9PlxuXHRcdFx0XHRidG5cblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIlVwZGF0ZVwiKVxuXHRcdFx0XHRcdC5zZXRDdGEoKVxuXHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNoZWNrQ29udmVydFBhdHRlcm5TdHJpbmcodGhpcy5uZXdfYmVmb3JlLCB0aGlzLm5ld19hZnRlcikpXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vblN1Ym1pdCh0aGlzLm5ld19iZWZvcmUsIHRoaXMubmV3X2FmdGVyKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJJbnZhbGlkIHBhdHRlcm4gc3RyaW5nIVwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdH0pKTtcblx0fVxuXG5cdGNoZWNrQ29udmVydFBhdHRlcm5TdHJpbmcoYmVmb3JlOiBzdHJpbmcsIGFmdGVyOnN0cmluZyk6Ym9vbGVhbntcblx0XHRsZXQgcmVnUnVsZSA9IC9cXHwvZztcblx0XHRpZihiZWZvcmUuc2VhcmNoKHJlZ1J1bGUpPT0tMSB8fCBhZnRlci5zZWFyY2gocmVnUnVsZSk9PS0xKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQWtGO0FBQ2xGLG1CQUErRTs7O0FDRC9FLHNCQUFzQjs7O0FDSXRCLElBQUksUUFBUTtBQUVMLElBQU0sUUFBTSxDQUFDLFlBQWtCLG1CQUF5QjtBQUMzRCxNQUFJLE9BQU87QUFDUCxZQUFRLElBQUksU0FBUyxHQUFHLGNBQWM7QUFBQSxFQUMxQztBQUNKO0FBbUJPLHFCQUFxQixLQUFVLFFBQWU7QUFDcEQsTUFBSSxPQUFPLElBQUksT0FBTyxNQUFNO0FBQzVCLFNBQU8sRUFBQyxNQUFNLEtBQUssU0FBUyxHQUFHLElBQUksU0FBUyxLQUFLLEtBQUk7QUFDdEQ7QUFFTyw2QkFBNkIsSUFBeUI7QUFDNUQsTUFBSSxtQkFBNEI7QUFBQSxJQUFDO0FBQUEsSUFDM0I7QUFBQSxJQUFzQjtBQUFBLElBQWM7QUFBQSxJQUFlO0FBQUEsSUFBYztBQUFBLElBQWtCO0FBQUEsSUFDbkY7QUFBQSxJQUFvQjtBQUFBLElBQWtCO0FBQUEsSUFBbUI7QUFBQSxJQUFjO0FBQUEsSUFDdkU7QUFBQSxJQUNBO0FBQUEsSUFBUTtBQUFBLElBQ1I7QUFBQSxFQUFnQjtBQUN0QixXQUFTLElBQVksR0FBRyxJQUFJLGlCQUFpQixRQUFRLEtBQ3JEO0FBQ0MsUUFBSSxHQUFHLFlBQVksaUJBQWlCLEVBQUU7QUFDckMsYUFBTyxpQkFBaUI7QUFBQSxFQUMxQjtBQUNBLFNBQU87QUFDUjtBQUVPLDJCQUEyQixHQUFxQjtBQUN0RCxNQUFJLFlBQVksRUFBRSxRQUFRLEdBQUc7QUFDN0IsTUFBSSxPQUFPLEVBQUUsVUFBVSxHQUFHLFNBQVM7QUFDbkMsTUFBSSxRQUFRLEVB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
|