fediversity.eu/node_modules/prettier-plugin-go-template/lib/parse.js
2024-03-26 16:28:28 +01:00

183 lines
25 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isUnformattable = exports.isRoot = exports.isMultiBlock = exports.isBlock = exports.isInline = exports.parseGoTemplate = void 0;
const create_id_generator_1 = require("./create-id-generator");
const parseGoTemplate = (text, options) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
const regex = /{{(?<startdelimiter>-|<|%|\/\*)?\s*(?<statement>(?<keyword>if|range|block|with|define|end|else|prettier-ignore-start|prettier-ignore-end)?[\s\S]*?)\s*(?<endDelimiter>-|>|%|\*\/)?}}|(?<unformattableScript><(script)((?!<)[\s\S])*>((?!<\/script)[\s\S])*?{{[\s\S]*?<\/(script)>)|(?<unformattableStyle><(style)((?!<)[\s\S])*>((?!<\/style)[\s\S])*?{{[\s\S]*?<\/(style)>)/g;
const root = {
type: "root",
content: text,
aliasedContent: "",
children: {},
index: 0,
contentStart: 0,
length: text.length,
};
const nodeStack = [root];
const getId = (0, create_id_generator_1.createIdGenerator)();
for (let match of text.matchAll(regex)) {
const current = last(nodeStack);
const keyword = (_a = match.groups) === null || _a === void 0 ? void 0 : _a.keyword;
const statement = (_b = match.groups) === null || _b === void 0 ? void 0 : _b.statement;
const unformattable = (_d = (_c = match.groups) === null || _c === void 0 ? void 0 : _c.unformattableScript) !== null && _d !== void 0 ? _d : (_e = match.groups) === null || _e === void 0 ? void 0 : _e.unformattableStyle;
const startDelimiter = ((_g = (_f = match.groups) === null || _f === void 0 ? void 0 : _f.startdelimiter) !== null && _g !== void 0 ? _g : "");
const endDelimiter = ((_j = (_h = match.groups) === null || _h === void 0 ? void 0 : _h.endDelimiter) !== null && _j !== void 0 ? _j : "");
if (current === undefined) {
throw Error("Node stack empty.");
}
if (match.index === undefined) {
throw Error("Regex match index undefined.");
}
const id = getId();
if (unformattable) {
current.children[id] = {
id,
type: "unformattable",
index: match.index,
length: match[0].length,
content: unformattable,
parent: current,
};
continue;
}
if (statement === undefined) {
throw Error("Formattable match without statement.");
}
const inline = {
index: match.index,
length: match[0].length,
startDelimiter,
endDelimiter,
parent: current,
type: "inline",
statement,
id,
};
if (keyword === "end" || keyword === "prettier-ignore-end") {
if (current.type !== "block") {
throw Error("Encountered unexpected end keyword.");
}
current.length = match[0].length + match.index - current.index;
current.content = text.substring(current.contentStart, match.index);
current.aliasedContent = aliasNodeContent(current);
current.end = inline;
if (current.parent.type === "double-block") {
const firstChild = current.parent.blocks[0];
const lastChild = current.parent.blocks[current.parent.blocks.length - 1];
current.parent.length =
lastChild.index + lastChild.length - firstChild.index;
}
nodeStack.pop();
}
else if (isBlock(current) && keyword === "else") {
const nextChild = {
type: "block",
start: inline,
end: null,
children: {},
keyword: keyword,
index: match.index,
parent: current.parent,
contentStart: match.index + match[0].length,
content: "",
aliasedContent: "",
length: -1,
id: getId(),
startDelimiter,
endDelimiter,
};
if (isMultiBlock(current.parent)) {
current.parent.blocks.push(nextChild);
}
else {
const multiBlock = {
type: "double-block",
parent: current.parent,
index: current.index,
length: -1,
keyword,
id: current.id,
blocks: [current, nextChild],
};
nextChild.parent = multiBlock;
current.parent = multiBlock;
if ("children" in multiBlock.parent) {
multiBlock.parent.children[multiBlock.id] = multiBlock;
}
else {
throw Error("Could not find child in parent.");
}
}
current.id = getId();
current.length = match[0].length + match.index - current.index;
current.content = text.substring(current.contentStart, match.index);
current.aliasedContent = aliasNodeContent(current);
nodeStack.pop();
nodeStack.push(nextChild);
}
else if (keyword) {
const block = {
type: "block",
start: inline,
end: null,
children: {},
keyword: keyword,
index: match.index,
parent: current,
contentStart: match.index + match[0].length,
content: "",
aliasedContent: "",
length: -1,
id: getId(),
startDelimiter,
endDelimiter,
};
current.children[block.id] = block;
nodeStack.push(block);
}
else {
current.children[inline.id] = inline;
}
}
if (!isRoot(nodeStack.pop())) {
throw Error("Missing end block.");
}
root.aliasedContent = aliasNodeContent(root);
return root;
};
exports.parseGoTemplate = parseGoTemplate;
function aliasNodeContent(current) {
let result = current.content;
Object.entries(current.children)
.sort(([_, node1], [__, node2]) => node2.index - node1.index)
.forEach(([id, node]) => (result =
result.substring(0, node.index - current.contentStart) +
id +
result.substring(node.index + node.length - current.contentStart)));
return result;
}
function last(array) {
return array[array.length - 1];
}
function isInline(node) {
return node.type === "inline";
}
exports.isInline = isInline;
function isBlock(node) {
return node.type === "block";
}
exports.isBlock = isBlock;
function isMultiBlock(node) {
return node.type === "double-block";
}
exports.isMultiBlock = isMultiBlock;
function isRoot(node) {
return node.type === "root";
}
exports.isRoot = isRoot;
function isUnformattable(node) {
return node.type === "unformattable";
}
exports.isUnformattable = isUnformattable;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0RBQTBEO0FBRW5ELE1BQU0sZUFBZSxHQUE0QixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTs7SUFDeEUsTUFBTSxLQUFLLEdBQ1QsK1dBQStXLENBQUM7SUFDbFgsTUFBTSxJQUFJLEdBQVc7UUFDbkIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsSUFBSTtRQUNiLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLFFBQVEsRUFBRSxFQUFFO1FBQ1osS0FBSyxFQUFFLENBQUM7UUFDUixZQUFZLEVBQUUsQ0FBQztRQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtLQUNwQixDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBaUIsR0FBRSxDQUFDO0lBRWxDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUcsTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxPQUFxQyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsU0FBUyxDQUFDO1FBQzFDLE1BQU0sYUFBYSxHQUNqQixNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsbUJBQW1CLG1DQUFJLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsa0JBQWtCLENBQUM7UUFFeEUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsY0FBYyxtQ0FDbEQsRUFBRSxDQUEyQixDQUFDO1FBQ2hDLE1BQU0sWUFBWSxHQUFH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SSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDL0IsQ0FBQztBQUZELDBCQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQztBQUN0QyxDQUFDO0FBRkQsb0NBRUM7QUFFRCxTQUFnQixNQUFNLENBQUMsSUFBWTtJQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQzlCLENBQUM7QUFGRCx3QkFFQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxJQUFZO0lBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUM7QUFDdkMsQ0FBQztBQUZELDBDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBjcmVhdGVJZEdlbmVyYXRvciB9IGZyb20gXCIuL2NyZWF0ZS1pZC1nZW5lcmF0b3JcIjtcblxuZXhwb3J0IGNvbnN0IHBhcnNlR29UZW1wbGF0ZTogUGFyc2VyPEdvTm9kZT5bXCJwYXJzZVwiXSA9ICh0ZXh0LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID1cbiAgICAve3soPzxzdGFydGRlbGltaXRlcj4tfDx8JXxcXC9cXCopP1xccyooPzxzdGF0ZW1lbnQ+KD88a2V5d29yZD5pZnxyYW5nZXxibG9ja3x3aXRofGRlZmluZXxlbmR8ZWxzZXxwcmV0dGllci1pZ25vcmUtc3RhcnR8cHJldHRpZXItaWdub3JlLWVuZCk/W1xcc1xcU10qPylcXHMqKD88ZW5kRGVsaW1pdGVyPi18PnwlfFxcKlxcLyk/fX18KD88dW5mb3JtYXR0YWJsZVNjcmlwdD48KHNjcmlwdCkoKD8hPClbXFxzXFxTXSkqPigoPyE8XFwvc2NyaXB0KVtcXHNcXFNdKSo/e3tbXFxzXFxTXSo/PFxcLyhzY3JpcHQpPil8KD88dW5mb3JtYXR0YWJsZVN0eWxlPjwoc3R5bGUpKCg/ITwpW1xcc1xcU10pKj4oKD8hPFxcL3N0eWxlKVtcXHNcXFNdKSo/e3tbXFxzXFxTXSo/PFxcLyhzdHlsZSk+KS9nO1xuICBjb25zdCByb290OiBHb1Jvb3QgPSB7XG4gICAgdHlwZTogXCJyb290XCIsXG4gICAgY29udGVudDogdGV4dCxcbiAgICBhbGlhc2VkQ29udGVudDogXCJcIixcbiAgICBjaGlsZHJlbjoge30sXG4gICAgaW5kZXg6IDAsXG4gICAgY29udGVudFN0YXJ0OiAwLFxuICAgIGxlbmd0aDogdGV4dC5sZW5ndGgsXG4gIH07XG4gIGNvbnN0IG5vZGVTdGFjazogKEdvQmxvY2sgfCBHb1Jvb3QpW10gPSBbcm9vdF07XG4gIGNvbnN0IGdldElkID0gY3JlYXRlSWRHZW5lcmF0b3IoKTtcblxuICBmb3IgKGxldCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHJlZ2V4KSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBsYXN0KG5vZGVTdGFjayk7XG4gICAgY29uc3Qga2V5d29yZCA9IG1hdGNoLmdyb3Vwcz8ua2V5d29yZCBhcyBHb0Jsb2NrS2V5d29yZCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBtYXRjaC5ncm91cHM/LnN0YXRlbWVudDtcbiAgICBjb25zdCB1bmZvcm1hdHRhYmxlID1cbiAgICAgIG1hdGNoLmdyb3Vwcz8udW5mb3JtYXR0YWJsZVNjcmlwdCA/PyBtYXRjaC5ncm91cHM/LnVuZm9ybWF0dGFibGVTdHlsZTtcblxuICAgIGNvbnN0IHN0YXJ0RGVsaW1pdGVyID0gKG1hdGNoLmdyb3Vwcz8uc3RhcnRkZWxpbWl0ZXIgPz9cbiAgICAgIFwiXCIpIGFzIEdvSW5saW5lU3RhcnREZWxpbWl0ZXI7XG4gICAgY29uc3QgZW5kRGVsaW1pdGVyID0gKG1hdGNoLmdyb3Vwcz8uZW5kRGVsaW1pdGVyID8/XG4gICAgICBcIlwiKSBhcyBHb0lubGluZUVuZERlbGltaXRlcjtcblxuICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKFwiTm9kZSBzdGFjayBlbXB0eS5cIik7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLmluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKFwiUmVnZXggbWF0Y2ggaW5kZXggdW5kZWZpbmVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBnZXRJZCgpO1xuICAgIGlmICh1bmZvcm1hdHRhYmxlKSB7XG4gICAgICBjdXJyZW50LmNoaWxkcmVuW2lkXSA9IHtcbiAgICAgICAgaWQsXG4gICAgICAgIHR5cGU6IFwidW5mb3JtYXR0YWJsZVwiLFxuICAgICAgICBpbmRleDogbWF0Y2guaW5kZXgsXG4gICAgICAgIGxlbmd0aDogbWF0Y2hbMF0ubGVuZ3RoLFxuICAgICAgICBjb250ZW50OiB1bmZvcm1hdHRhYmxlLFxuICAgICAgICBwYXJlbnQ6IGN1cnJlbnQsXG4gICAgICB9O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcIkZvcm1hdHRhYmxlIG1hdGNoIHdpdGhvdXQgc3RhdGVtZW50LlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmxpbmU6IEdvSW5saW5lID0ge1xuICAgICAgaW5kZXg6IG1hdGNoLmluZGV4LFxuICAgICAgbGVuZ3RoOiBtYXRjaFswXS5sZW5ndGgsXG4gICAgICBzdGFydERlbGltaXRlcixcbiAgICAgIGVuZERlbGltaXRlcixcbiAgICAgIHBhcmVudDogY3VycmVudCEsXG4gICAgICB0eXBlOiBcImlubGluZVwiLFxuICAgICAgc3RhdGVtZW50LFxuICAgICAgaWQsXG4gICAgfTtcblxuICAgIGlmIChrZXl3b3JkID09PSBcImVuZFwiIHx8IGtleXdvcmQgPT09IFwicHJldHRpZXItaWdub3JlLWVuZFwiKSB7XG4gICAgICBpZiAoY3VycmVudC50eXBlICE9PSBcImJsb2NrXCIpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGVuZCBrZXl3b3JkLlwiKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC5sZW5ndGggPSBtYXRjaFswXS5sZW5ndGggKyBtYXRjaC5pbmRleCAtIGN1cnJlbnQuaW5kZXg7XG4gICAgICBjdXJyZW50LmNvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZyhjdXJyZW50LmNvbnRlbnRTdGFydCwgbWF0Y2guaW5kZXgpO1xuICAgICAgY3VycmVudC5hbGlhc2VkQ29udGVudCA9IGFsaWFzTm9kZUNvbnRlbnQoY3VycmVudCk7XG4gICAgICBjdXJyZW50LmVuZCA9IGlubGluZTtcblxuICAgICAgaWYgKGN1cnJlbnQucGFyZW50LnR5cGUgPT09IFwiZG91YmxlLWJsb2NrXCIpIHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IGN1cnJlbnQucGFyZW50LmJsb2Nrc1swXTtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkID1cbiAgICAgICAgICBjdXJyZW50LnBhcmVudC5ibG9ja3NbY3VycmVudC5wYXJlbnQuYmxvY2tzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGN1cnJlbnQucGFyZW50Lmxlbmd0aCA9XG4gICAgICAgICAgbGFzdENoaWxkLmluZGV4ICsgbGFzdENoaWxkLmxlbmd0aCAtIGZpcnN0Q2hpbGQuaW5kZXg7XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFjay5wb3AoKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvY2soY3VycmVudCkgJiYga2V5d29yZCA9PT0gXCJlbHNlXCIpIHtcbiAgICAgIGNvbnN0IG5leHRDaGlsZDogR29CbG9jayA9IHtcbiAgICAgICAgdHlwZTogXCJibG9ja1wiLFxuICAgICAgICBzdGFydDogaW5saW5lLFxuICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgIGNoaWxkcmVuOiB7fSxcbiAgICAgICAga2V5d29yZDoga2V5d29yZCxcbiAgICAgICAgaW5kZXg6IG1hdGNoLmluZGV4LFxuICAgICAgICBwYXJlbnQ6IGN1cnJlbnQucGFyZW50LFxuICAgICAgICBjb250ZW50U3RhcnQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoLFxuICAgICAgICBjb250ZW50OiBcIlwiLFxuICAgICAgICBhbGlhc2VkQ29udGVudDogXCJcIixcbiAgICAgICAgbGVuZ3RoOiAtMSxcbiAgICAgICAgaWQ6IGdldElkKCksXG4gICAgICAgIHN0YXJ0RGVsaW1pdGVyLFxuICAgICAgICBlbmREZWxpbWl0ZXIsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaXNNdWx0aUJsb2NrKGN1cnJlbnQucGFyZW50KSkge1xuICAgICAgICBjdXJyZW50LnBhcmVudC5ibG9ja3MucHVzaChuZXh0Q2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbXVsdGlCbG9jazogR29NdWx0aUJsb2NrID0ge1xuICAgICAgICAgIHR5cGU6IFwiZG91YmxlLWJsb2NrXCIsXG4gICAgICAgICAgcGFyZW50OiBjdXJyZW50LnBhcmVudCxcbiAgICAgICAgICBpbmRleDogY3VycmVudC5pbmRleCxcbiAgICAgICAgICBsZW5ndGg6IC0xLFxuICAgICAgICAgIGtleXdvcmQsXG4gICAgICAgICAgaWQ6IGN1cnJlbnQuaWQsXG4gICAgICAgICAgYmxvY2tzOiBbY3VycmVudCwgbmV4dENoaWxkXSxcbiAgICAgICAgfTtcbiAgICAgICAgbmV4dENoaWxkLnBhcmVudCA9IG11bHRpQmxvY2s7XG4gICAgICAgIGN1cnJlbnQucGFyZW50ID0gbXVsdGlCbG9jaztcblxuICAgICAgICBpZiAoXCJjaGlsZHJlblwiIGluIG11bHRpQmxvY2sucGFyZW50KSB7XG4gICAgICAgICAgbXVsdGlCbG9jay5wYXJlbnQuY2hpbGRyZW5bbXVsdGlCbG9jay5pZF0gPSBtdWx0aUJsb2NrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2hpbGQgaW4gcGFyZW50LlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmlkID0gZ2V0SWQoKTtcbiAgICAgIGN1cnJlbnQubGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoICsgbWF0Y2guaW5kZXggLSBjdXJyZW50LmluZGV4O1xuICAgICAgY3VycmVudC5jb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoY3VycmVudC5jb250ZW50U3RhcnQsIG1hdGNoLmluZGV4KTtcbiAgICAgIGN1cnJlbnQuYWxpYXNlZENvbnRlbnQgPSBhbGlhc05vZGVDb250ZW50KGN1cnJlbnQpO1xuXG4gICAgICBub2RlU3RhY2sucG9wKCk7XG4gICAgICBub2RlU3RhY2sucHVzaChuZXh0Q2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCkge1xuICAgICAgY29uc3QgYmxvY2s6IEdvQmxvY2sgPSB7XG4gICAgICAgIHR5cGU6IFwiYmxvY2tcIixcbiAgICAgICAgc3RhcnQ6IGlubGluZSxcbiAgICAgICAgZW5kOiBudWxsLFxuICAgICAgICBjaGlsZHJlbjoge30sXG4gICAgICAgIGtleXdvcmQ6IGtleXdvcmQgYXMgR29CbG9ja0tleXdvcmQsXG4gICAgICAgIGluZGV4OiBtYXRjaC5pbmRleCxcbiAgICAgICAgcGFyZW50OiBjdXJyZW50LFxuICAgICAgICBjb250ZW50U3RhcnQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoLFxuICAgICAgICBjb250ZW50OiBcIlwiLFxuICAgICAgICBhbGlhc2VkQ29udGVudDogXCJcIixcbiAgICAgICAgbGVuZ3RoOiAtMSxcbiAgICAgICAgaWQ6IGdldElkKCksXG4gICAgICAgIHN0YXJ0RGVsaW1pdGVyLFxuICAgICAgICBlbmREZWxpbWl0ZXIsXG4gICAgICB9O1xuXG4gICAgICBjdXJyZW50LmNoaWxkcmVuW2Jsb2NrLmlkXSA9IGJsb2NrO1xuICAgICAgbm9kZVN0YWNrLnB1c2goYmxvY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LmNoaWxkcmVuW2lubGluZS5pZF0gPSBpbmxpbmU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1Jvb3Qobm9kZVN0YWNrLnBvcCgpISkpIHtcbiAgICB0aHJvdyBFcnJvcihcIk1pc3NpbmcgZW5kIGJsb2NrLlwiKTtcbiAgfVxuXG4gIHJvb3QuYWxpYXNlZENvbnRlbnQgPSBhbGlhc05vZGVDb250ZW50KHJvb3QpO1xuXG4gIHJldHVybiByb290O1xufTtcblxuZnVuY3Rpb24gYWxpYXNOb2RlQ29udGVudChjdXJyZW50OiBHb0Jsb2NrIHwgR29Sb290KTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IGN1cnJlbnQuY29udGVudDtcblxuICBPYmplY3QuZW50cmllcyhjdXJyZW50LmNoaWxkcmVuKVxuICAgIC5zb3J0KChbXywgbm9kZTFdLCBbX18sIG5vZGUyXSkgPT4gbm9kZTIuaW5kZXggLSBub2RlMS5pbmRleClcbiAgICAuZm9yRWFjaChcbiAgICAgIChbaWQsIG5vZGVdKSA9PlxuICAgICAgICAocmVzdWx0ID1cbiAgICAgICAgICByZXN1bHQuc3Vic3RyaW5nKDAsIG5vZGUuaW5kZXggLSBjdXJyZW50LmNvbnRlbnRTdGFydCkgK1xuICAgICAgICAgIGlkICtcbiAgICAgICAgICByZXN1bHQuc3Vic3RyaW5nKG5vZGUuaW5kZXggKyBub2RlLmxlbmd0aCAtIGN1cnJlbnQuY29udGVudFN0YXJ0KSksXG4gICAgKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBsYXN0PFQ+KGFycmF5OiBUW10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xufVxuXG5leHBvcnQgdHlwZSBHb05vZGUgPVxuICB8IEdvUm9vdFxuICB8IEdvQmxvY2tcbiAgfCBHb0lubGluZVxuICB8IEdvTXVsdGlCbG9ja1xuICB8IEdvVW5mb3JtYXR0YWJsZTtcblxuZXhwb3J0IHR5cGUgR29CbG9ja0tleXdvcmQgPVxuICB8IFwiaWZcIlxuICB8IFwicmFuZ2VcIlxuICB8IFwiYmxvY2tcIlxuICB8IFwid2l0aFwiXG4gIHwgXCJkZWZpbmVcIlxuICB8IFwiZWxzZVwiXG4gIHwgXCJwcmV0dGllci1pZ25vcmUtc3RhcnRcIlxuICB8IFwicHJldHRpZXItaWdub3JlLWVuZFwiXG4gIHwgXCJlbmRcIjtcblxuZXhwb3J0IHR5cGUgR29Sb290ID0geyB0eXBlOiBcInJvb3RcIiB9ICYgT21pdDxcbiAgR29CbG9jayxcbiAgfCBcInR5cGVcIlxuICB8IFwia2V5d29yZFwiXG4gIHwgXCJwYXJlbnRcIlxuICB8IFwic3RhdGVtZW50XCJcbiAgfCBcImlkXCJcbiAgfCBcInN0YXJ0RGVsaW1pdGVyXCJcbiAgfCBcImVuZERlbGltaXRlclwiXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJlbmRcIlxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBHb0Jhc2VOb2RlPFR5cGUgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgaWQ6IHN0cmluZztcbiAgdHlwZTogVHlwZTtcbiAgaW5kZXg6IG51bWJlcjtcbiAgbGVuZ3RoOiBudW1iZXI7XG4gIHBhcmVudDogR29CbG9jayB8IEdvUm9vdCB8IEdvTXVsdGlCbG9jaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHb0Jsb2NrIGV4dGVuZHMgR29CYXNlTm9kZTxcImJsb2NrXCI+LCBXaXRoRGVsaW1pdGVyIHtcbiAga2V5d29yZDogR29CbG9ja0tleXdvcmQ7XG4gIGNoaWxkcmVuOiB7XG4gICAgW2lkOiBzdHJpbmddOiBHb05vZGU7XG4gIH07XG4gIHN0YXJ0OiBHb0lubGluZTtcbiAgZW5kOiBHb0lubGluZSB8IG51bGw7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgYWxpYXNlZENvbnRlbnQ6IHN0cmluZztcbiAgY29udGVudFN0YXJ0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR29NdWx0aUJsb2NrIGV4dGVuZHMgR29CYXNlTm9kZTxcImRvdWJsZS1ibG9ja1wiPiB7XG4gIGJsb2NrczogKEdvQmxvY2sgfCBHb011bHRpQmxvY2spW107XG4gIGtleXdvcmQ6IEdvQmxvY2tLZXl3b3JkO1xufVxuXG5leHBvcnQgdHlwZSBHb1NoYXJlZERlbGltaXRlciA9IFwiJVwiIHwgXCItXCIgfCBcIlwiO1xuZXhwb3J0IHR5cGUgR29JbmxpbmVTdGFydERlbGltaXRlciA9IFwiPFwiIHwgXCIvKlwiIHwgR29TaGFyZWREZWxpbWl0ZXI7XG5leHBvcnQgdHlwZSBHb0lubGluZUVuZERlbGltaXRlciA9IFwiPlwiIHwgXCIqL1wiIHwgR29TaGFyZWREZWxpbWl0ZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR29VbmZvcm1hdHRhYmxlIGV4dGVuZHMgR29CYXNlTm9kZTxcInVuZm9ybWF0dGFibGVcIj4ge1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aERlbGltaXRlciB7XG4gIHN0YXJ0RGVsaW1pdGVyOiBHb0lubGluZVN0YXJ0RGVsaW1pdGVyO1xuICBlbmREZWxpbWl0ZXI6IEdvSW5saW5lRW5kRGVsaW1pdGVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdvSW5saW5lIGV4dGVuZHMgR29CYXNlTm9kZTxcImlubGluZVwiPiwgV2l0aERlbGltaXRlciB7XG4gIHN0YXRlbWVudDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmUobm9kZTogR29Ob2RlKTogbm9kZSBpcyBHb0lubGluZSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IFwiaW5saW5lXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jsb2NrKG5vZGU6IEdvTm9kZSk6IG5vZGUgaXMgR29CbG9jayB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IFwiYmxvY2tcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlCbG9jayhub2RlOiBHb05vZGUpOiBub2RlIGlzIEdvTXVsdGlCbG9jayB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IFwiZG91YmxlLWJsb2NrXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jvb3Qobm9kZTogR29Ob2RlKTogbm9kZSBpcyBHb1Jvb3Qge1xuICByZXR1cm4gbm9kZS50eXBlID09PSBcInJvb3RcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5mb3JtYXR0YWJsZShub2RlOiBHb05vZGUpOiBub2RlIGlzIEdvUm9vdCB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IFwidW5mb3JtYXR0YWJsZVwiO1xufVxuIl19