@witnet/ethers
Version:
Wit/Oracle SDK Framework package for Solidity projects
330 lines • 47 kB
JavaScript
;
const fs = require("fs");
const merge = require("lodash.merge");
const framework = require("witnet-solidity-bridge");
const commas = (number) => {
const parts = number.toString().split(".");
const result = parts.length <= 1
? `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}`
: `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}.${parts[1]}`;
return result;
};
const blue = (str) => `\x1b[34m${str}\x1b[0m`;
const cyan = (str) => `\x1b[36m${str}\x1b[0m`;
const gray = (str) => `\x1b[90m${str}\x1b[0m`;
const green = (str) => `\x1b[32m${str}\x1b[0m`;
const magenta = (str) => `\x1b[0;35m${str}\x1b[0m`;
const red = (str) => `\x1b[31m${str}\x1b[0m`;
const yellow = (str) => `\x1b[33m${str}\x1b[0m`;
const white = (str) => `\x1b[0;38m${str}\x1b[0m`;
const lblue = (str) => `\x1b[1;94m${str}\x1b[0m`;
const lcyan = (str) => `\x1b[1;96m${str}\x1b[0m`;
const lgreen = (str) => `\x1b[1;92m${str}\x1b[0m`;
const lmagenta = (str) => `\x1b[1;95m${str}\x1b[0m`;
const lwhite = (str) => `\x1b[1;98m${str}\x1b[0m`;
const lyellow = (str) => `\x1b[1;93m${str}\x1b[0m`;
const mblue = (str) => `\x1b[94m${str}\x1b[0m`;
const mcyan = (str) => `\x1b[96m${str}\x1b[0m`;
const mgreen = (str) => `\x1b[92m${str}\x1b[0m`;
const mmagenta = (str) => `\x1b[0;95m${str}\x1b[0m`;
const mred = (str) => `\x1b[91m${str}\x1b[0m`;
const myellow = (str) => `\x1b[93m${str}\x1b[0m`;
const WITNET_SDK_RADON_ASSETS_PATH = process.env.WITNET_SDK_RADON_ASSETS_PATH || "../../../../witnet/assets";
const isModuleInitialized = fs.existsSync("./witnet/assets/index.js");
function readWitnetJsonFiles(...filenames) {
return Object.fromEntries(filenames.map(key => {
const filepath = `./witnet/${key}.json`;
return [
key,
fs.existsSync(filepath) ? JSON.parse(fs.readFileSync(filepath)) : {},
];
}));
}
function saveWitnetJsonFiles(data) {
Object.entries(data).forEach(([key, obj]) => {
const filepath = `./witnet/${key}.json`;
if (!fs.existsSync(filepath))
fs.writeFileSync(filepath, "{}");
const json = merge(JSON.parse(fs.readFileSync(filepath)), obj);
fs.writeFileSync(filepath, JSON.stringify(json, null, 4), { flag: "w+" });
});
}
function deleteExtraFlags(args) {
const deleted = [];
return [
args?.filter(arg => {
if (arg.startsWith("--")) {
deleted.push(arg.slice(2));
return false;
}
else {
return true;
}
}),
deleted,
];
}
function extractFlagsFromArgs(args, flags) {
const curated = {};
if (args && Array.isArray(args) && flags) {
flags.forEach(flag => {
const index = args.indexOf(`--${flag}`);
if (index >= 0) {
curated[flag] = true;
args.splice(index, 1);
}
});
}
return [args || [], curated];
}
function extractOptionsFromArgs(args, options) {
const curated = {};
if (args && Array.isArray(args) && options) {
options.forEach(option => {
const index = args.indexOf(`--${option}`);
if (index >= 0) {
curated[option] = args[index];
if (!args[index + 1] || args[index + 1].startsWith("--")) {
args.splice(index, 1);
curated[option] = undefined;
}
else {
curated[option] = args[index + 1];
args.splice(index, 2);
}
}
});
}
return [args || [], curated];
}
function flattenObject(ob) {
const toReturn = {};
for (const i in ob) {
if (!ob.hasOwnProperty(i))
continue;
if ((typeof ob[i]) === "object" && ob[i] !== null) {
const flatObject = flattenObject(ob[i]);
for (const x in flatObject) {
if (!flatObject.hasOwnProperty(x))
continue;
toReturn[i + "." + x] = flatObject[x];
}
}
else {
toReturn[i] = ob[i];
}
}
return toReturn;
}
function getNetworkAddresses(network) {
return merge(framework.getNetworkAddresses(network.toLowerCase()), fs.existsSync(`${WITNET_SDK_RADON_ASSETS_PATH}/../addresses.json`)
? require(`${WITNET_SDK_RADON_ASSETS_PATH}/../addresses.json`)[network.toLowerCase()]
: {});
}
function orderKeys(obj) {
const keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
if (k1 < k2)
return -1;
else if (k1 > k2)
return +1;
else
return 0;
});
let i;
const after = {};
for (i = 0; i < keys.length; i++) {
after[keys[i]] = obj[keys[i]];
delete obj[keys[i]];
}
for (i = 0; i < keys.length; i++) {
obj[keys[i]] = after[keys[i]];
}
return obj;
}
function showVersion() {
console.info(`${lwhite(`Wit/Oracle Ethers CLI v${require("../../package.json").version}`)}`);
}
function traceHeader(header, color = white, indent = "") {
console.info(`${indent}┌─${"─".repeat(header.length)}─┐`);
console.info(`${indent}│ ${color(header)} │`);
console.info(`${indent}└─${"─".repeat(header.length)}─┘`);
}
function traceWitnetAddresses(addresses, constructorArgs, artifacts, indent = "", level) {
const includes = (selection, key) => {
return selection.filter(artifact => key.toLowerCase().indexOf(artifact.toLowerCase()) >= 0).length > 0;
};
let found = 0;
for (const key in orderKeys(addresses)) {
if (typeof addresses[key] === "object") {
found += traceWitnetAddresses(addresses[key], constructorArgs, artifacts, indent, (level || 0) + 1);
}
else {
if (key !== ("WitnetDeployer" &&
!key.endsWith("Lib") &&
!key.endsWith("Proxy") &&
key.indexOf("Trustable") < 0 &&
key.indexOf("Upgradable") < 0 &&
constructorArgs[key] !== undefined) || includes(artifacts, key)) {
found++;
if (includes(artifacts, key)) {
console.info(`${indent}${mblue(addresses[key])}`, "<=", `${lwhite(key)}`);
}
else {
console.info(`${indent}${blue(addresses[key])}`, "<=", `${white(key)}`);
}
}
}
}
return found;
}
function importRadonAssets(options) {
const { assets } = options?.module ? require(options.module) : (options?.legacy ? {} : require("@witnet/sdk"));
return !options?.module && isModuleInitialized && fs.existsSync(`${WITNET_SDK_RADON_ASSETS_PATH}`)
? merge(assets, require(`${WITNET_SDK_RADON_ASSETS_PATH}`))
: assets;
}
function traceTable(records, options) {
const stringify = (data, humanizers, index) => humanizers && humanizers[index] ? humanizers[index](data).toString() : data?.toString() ?? "";
const reduceMax = (numbers) => numbers.reduce((curr, prev) => Math.max(curr, prev), 0);
if (!options)
options = {};
const indent = options?.indent || "";
const numColumns = reduceMax(records.map(record => record?.length || 1));
const maxColumnWidth = options?.maxColumnWidth || 80;
const table = transpose(records, numColumns);
options.widths = options?.widths || table.map((column, index) => {
let maxWidth = reduceMax(column.map(field => colorstrip(stringify(field, options?.humanizers, index)).length));
if (options?.headlines && options.headlines[index]) {
maxWidth = Math.max(maxWidth, colorstrip(options.headlines[index].replaceAll(":", "")).length);
}
return Math.min(maxWidth, maxColumnWidth);
});
let headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}┌─${headline.join("─┬─")}─┐`);
if (options?.headlines) {
headline = options.widths.map((maxWidth, index) => {
const caption = options.headlines[index].replaceAll(":", "");
const captionLength = colorstrip(caption).length;
return `${white(caption)}${" ".repeat(maxWidth - captionLength)}`;
});
console.info(`${indent}│ ${headline.join(" │ ")} │`);
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}├─${headline.join("─┼─")}─┤`);
}
for (let i = 0; i < records.length; i++) {
let line = "";
for (let j = 0; j < numColumns; j++) {
let data = table[j][i];
let color;
if (options?.colors && options.colors[j]) {
color = options.colors[j];
}
else {
color = typeof data === "string"
? green
: (Number(data) === data && data % 1 !== 0 // is float number?
? yellow
: (x) => x);
}
data = stringify(data, options?.humanizers, j);
if (colorstrip(data).length > maxColumnWidth) {
while (colorstrip(data).length > maxColumnWidth - 3) {
data = data.slice(0, -1);
}
data += "...";
}
const dataLength = colorstrip(data).length;
if (options?.headlines && options.headlines[j][0] === ":") {
data = `${color(data)}${" ".repeat(options.widths[j] - dataLength)}`;
}
else {
data = `${" ".repeat(options.widths[j] - dataLength)}${color(data)}`;
}
line += `│ ${data} `;
}
console.info(`${indent}${line}│`);
}
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
console.info(`${indent}└─${headline.join("─┴─")}─┘`);
}
function transpose(records, numColumns) {
const columns = [];
for (let index = 0; index < numColumns; index++) {
columns.push(records.map(row => row[index]));
}
return columns;
}
const colorstrip = (str) => str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, "");
function prompter(promise) {
const loading = (() => {
const h = ["|", "/", "-", "\\"];
let i = 0;
return setInterval(() => {
i = (i > 3) ? 0 : i;
process.stdout.write(`\b\b${h[i]} `);
i++;
}, 50);
})();
return promise
.then(result => {
clearInterval(loading);
process.stdout.write("\b\b");
return result;
});
}
function traceData(header, data, width, color) {
process.stdout.write(header);
if (color)
process.stdout.write(color);
for (let ix = 0; ix < data.length / width; ix++) {
if (ix > 0)
process.stdout.write(" ".repeat(header.length));
process.stdout.write(data.slice(width * ix, width * (ix + 1)));
process.stdout.write("\n");
}
if (color)
process.stdout.write("\x1b[0m");
}
module.exports = {
colors: {
blue,
cyan,
gray,
green,
red,
yellow,
white,
magenta,
lblue,
lcyan,
lgreen,
lmagenta,
lwhite,
lyellow,
mblue,
mcyan,
mgreen,
mred,
myellow,
mmagenta,
},
deleteExtraFlags,
extractFlagsFromArgs,
extractOptionsFromArgs,
flattenObject,
orderKeys,
showVersion,
traceData,
traceHeader,
traceWitnetAddresses,
getNetworkAddresses,
getNetworkConstructorArgs: framework.getNetworkConstructorArgs,
importRadonAssets,
readWitnetJsonFiles,
saveWitnetJsonFiles,
traceTable,
commas,
colorstrip,
prompter,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW4vaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUNyQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtBQUVuRCxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO0lBQ3hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDMUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDckQsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNuRSxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzdDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzlDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2xELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQy9DLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2hELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2hELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2pELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ25ELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO0FBQ2xELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzlDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQzlDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFBO0FBQy9DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFF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QUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDOUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksbUJBQW1CLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLDRCQUE0QixFQUFFLENBQUM7UUFDaEcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxNQUFNLENBQUE7QUFDWixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUUsT0FBTyxFQUFFLE9BQU87SUFDbkMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFBO0lBQzVJLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdEYsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQzFCLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENB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LCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKVxyXG5jb25zdCBtZXJnZSA9IHJlcXVpcmUoXCJsb2Rhc2gubWVyZ2VcIilcclxuY29uc3QgZnJhbWV3b3JrID0gcmVxdWlyZShcIndpdG5ldC1zb2xpZGl0eS1icmlkZ2VcIilcclxuXHJcbmNvbnN0IGNvbW1hcyA9IChudW1iZXIpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IG51bWJlci50b1N0cmluZygpLnNwbGl0KFwiLlwiKVxyXG4gIGNvbnN0IHJlc3VsdCA9IHBhcnRzLmxlbmd0aCA8PSAxXHJcbiAgICA/IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX1gXHJcbiAgICA6IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX0uJHtwYXJ0c1sxXX1gXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5jb25zdCBibHVlID0gKHN0cikgPT4gYFxceDFiWzM0bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBjeWFuID0gKHN0cikgPT4gYFxceDFiWzM2bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBncmF5ID0gKHN0cikgPT4gYFxceDFiWzkwbSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBncmVlbiA9IChzdHIpID0+IGBcXHgxYlszMm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYlswOzM1bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCByZWQgPSAoc3RyKSA9PiBgXFx4MWJbMzFtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IHllbGxvdyA9IChzdHIpID0+IGBcXHgxYlszM20ke3N0cn1cXHgxYlswbWBcclxuY29uc3Qgd2hpdGUgPSAoc3RyKSA9PiBgXFx4MWJbMDszOG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbGJsdWUgPSAoc3RyKSA9PiBgXFx4MWJbMTs5NG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbGN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbMTs5Nm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbGdyZWVuID0gKHN0cikgPT4gYFxceDFiWzE7OTJtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGxtYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzE7OTVtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGx3aGl0ZSA9IChzdHIpID0+IGBcXHgxYlsxOzk4bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBseWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzE7OTNtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG1ibHVlID0gKHN0cikgPT4gYFxceDFiWzk0bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtY3lhbiA9IChzdHIpID0+IGBcXHgxYls5Nm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbWdyZWVuID0gKHN0cikgPT4gYFxceDFiWzkybSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYlswOzk1bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtcmVkID0gKHN0cikgPT4gYFxceDFiWzkxbSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBteWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzkzbSR7c3RyfVxceDFiWzBtYFxyXG5cclxuY29uc3QgV0lUTkVUX1NES19SQURPTl9BU1NFVFNfUEFUSCA9IHByb2Nlc3MuZW52LldJVE5FVF9TREtfUkFET05fQVNTRVRTX1BBVEggfHwgXCIuLi8uLi8uLi8uLi93aXRuZXQvYXNzZXRzXCJcclxuY29uc3QgaXNNb2R1bGVJbml0aWFsaXplZCA9IGZzLmV4aXN0c1N5bmMoXCIuL3dpdG5ldC9hc3NldHMvaW5kZXguanNcIilcclxuXHJcbmZ1bmN0aW9uIHJlYWRXaXRuZXRKc29uRmlsZXMgKC4uLmZpbGVuYW1lcykge1xyXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZmlsZW5hbWVzLm1hcChrZXkgPT4ge1xyXG4gICAgY29uc3QgZmlsZXBhdGggPSBgLi93aXRuZXQvJHtrZXl9Lmpzb25gXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrZXksXHJcbiAgICAgIGZzLmV4aXN0c1N5bmMoZmlsZXBhdGgpID8gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZXBhdGgpKSA6IHt9LFxyXG4gICAgXVxyXG4gIH0pKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzYXZlV2l0bmV0SnNvbkZpbGVzIChkYXRhKSB7XHJcbiAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgb2JqXSkgPT4ge1xyXG4gICAgY29uc3QgZmlsZXBhdGggPSBgLi93aXRuZXQvJHtrZXl9Lmpzb25gXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZXBhdGgpKSBmcy53cml0ZUZpbGVTeW5jKGZpbGVwYXRoLCBcInt9XCIpXHJcbiAgICBjb25zdCBqc29uID0gbWVyZ2UoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZXBhdGgpKSwgb2JqKVxyXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoanNvbiwgbnVsbCwgNCksIHsgZmxhZzogXCJ3K1wiIH0pXHJcbiAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gZGVsZXRlRXh0cmFGbGFncyAoYXJncykge1xyXG4gIGNvbnN0IGRlbGV0ZWQgPSBbXVxyXG4gIHJldHVybiBbXHJcbiAgICBhcmdzPy5maWx0ZXIoYXJnID0+IHtcclxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcclxuICAgICAgICBkZWxldGVkLnB1c2goYXJnLnNsaWNlKDIpKVxyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgIH0pLFxyXG4gICAgZGVsZXRlZCxcclxuICBdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RGbGFnc0Zyb21BcmdzIChhcmdzLCBmbGFncykge1xyXG4gIGNvbnN0IGN1cmF0ZWQgPSB7fVxyXG4gIGlmIChhcmdzICYmIEFycmF5LmlzQXJyYXkoYXJncykgJiYgZmxhZ3MpIHtcclxuICAgIGZsYWdzLmZvckVhY2goZmxhZyA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5pbmRleE9mKGAtLSR7ZmxhZ31gKVxyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIGN1cmF0ZWRbZmxhZ10gPSB0cnVlXHJcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIHJldHVybiBbYXJncyB8fCBbXSwgY3VyYXRlZF1cclxufVxyXG5cclxuZnVuY3Rpb24gZXh0cmFjdE9wdGlvbnNGcm9tQXJncyAoYXJncywgb3B0aW9ucykge1xyXG4gIGNvbnN0IGN1cmF0ZWQgPSB7fVxyXG4gIGlmIChhcmdzICYmIEFycmF5LmlzQXJyYXkoYXJncykgJiYgb3B0aW9ucykge1xyXG4gICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5pbmRleE9mKGAtLSR7b3B0aW9ufWApXHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgY3VyYXRlZFtvcHRpb25dID0gYXJnc1tpbmRleF1cclxuICAgICAgICBpZiAoIWFyZ3NbaW5kZXggKyAxXSB8fCBhcmdzW2luZGV4ICsgMV0uc3RhcnRzV2l0aChcIi0tXCIpKSB7XHJcbiAgICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICAgIGN1cmF0ZWRbb3B0aW9uXSA9IHVuZGVmaW5lZFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdXJhdGVkW29wdGlvbl0gPSBhcmdzW2luZGV4ICsgMV1cclxuICAgICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAyKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIFthcmdzIHx8IFtdLCBjdXJhdGVkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBmbGF0dGVuT2JqZWN0IChvYikge1xyXG4gIGNvbnN0IHRvUmV0dXJuID0ge31cclxuICBmb3IgKGNvbnN0IGkgaW4gb2IpIHtcclxuICAgIGlmICghb2IuaGFzT3duUHJvcGVydHkoaSkpIGNvbnRpbnVlXHJcbiAgICBpZiAoKHR5cGVvZiBvYltpXSkgPT09IFwib2JqZWN0XCIgJiYgb2JbaV0gIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZmxhdE9iamVjdCA9IGZsYXR0ZW5PYmplY3Qob2JbaV0pXHJcbiAgICAgIGZvciAoY29uc3QgeCBpbiBmbGF0T2JqZWN0KSB7XHJcbiAgICAgICAgaWYgKCFmbGF0T2JqZWN0Lmhhc093blByb3BlcnR5KHgpKSBjb250aW51ZVxyXG4gICAgICAgIHRvUmV0dXJuW2kgKyBcIi5cIiArIHhdID0gZmxhdE9iamVjdFt4XVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b1JldHVybltpXSA9IG9iW2ldXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0b1JldHVyblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXROZXR3b3JrQWRkcmVzc2VzIChuZXR3b3JrKSB7XHJcbiAgcmV0dXJuIG1lcmdlKFxyXG4gICAgZnJhbWV3b3JrLmdldE5ldHdvcmtBZGRyZXNzZXMobmV0d29yay50b0xvd2VyQ2FzZSgpKSxcclxuICAgIGZzLmV4aXN0c1N5bmMoYCR7V0lUTkVUX1NES19SQURPTl9BU1NFVFNfUEFUSH0vLi4vYWRkcmVzc2VzLmpzb25gKVxyXG4gICAgICA/IHJlcXVpcmUoYCR7V0lUTkVUX1NES19SQURPTl9BU1NFVFNfUEFUSH0vLi4vYWRkcmVzc2VzLmpzb25gKVtuZXR3b3JrLnRvTG93ZXJDYXNlKCldXHJcbiAgICAgIDoge30sXHJcbiAgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBvcmRlcktleXMgKG9iaikge1xyXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLnNvcnQoZnVuY3Rpb24ga2V5T3JkZXIgKGsxLCBrMikge1xyXG4gICAgaWYgKGsxIDwgazIpIHJldHVybiAtMVxyXG4gICAgZWxzZSBpZiAoazEgPiBrMikgcmV0dXJuICsxXHJcbiAgICBlbHNlIHJldHVybiAwXHJcbiAgfSlcclxuICBsZXQgaTsgY29uc3QgYWZ0ZXIgPSB7fVxyXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBhZnRlcltrZXlzW2ldXSA9IG9ialtrZXlzW2ldXVxyXG4gICAgZGVsZXRlIG9ialtrZXlzW2ldXVxyXG4gIH1cclxuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgb2JqW2tleXNbaV1dID0gYWZ0ZXJba2V5c1tpXV1cclxuICB9XHJcbiAgcmV0dXJuIG9ialxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VmVyc2lvbiAoKSB7XHJcbiAgY29uc29sZS5pbmZvKGAke2x3aGl0ZShgV2l0L09yYWNsZSBFdGhlcnMgQ0xJIHYke3JlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbn1gKX1gKVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZUhlYWRlciAoaGVhZGVyLCBjb2xvciA9IHdoaXRlLCBpbmRlbnQgPSBcIlwiKSB7XHJcbiAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIzilIAke1wi4pSAXCIucmVwZWF0KGhlYWRlci5sZW5ndGgpfeKUgOKUkGApXHJcbiAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIIgJHtjb2xvcihoZWFkZXIpfSDilIJgKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSU4pSAJHtcIuKUgFwiLnJlcGVhdChoZWFkZXIubGVuZ3RoKX3ilIDilJhgKVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZVdpdG5ldEFkZHJlc3NlcyAoYWRkcmVzc2VzLCBjb25zdHJ1Y3RvckFyZ3MsIGFydGlmYWN0cywgaW5kZW50ID0gXCJcIiwgbGV2ZWwpIHtcclxuICBjb25zdCBpbmNsdWRlcyA9IChzZWxlY3Rpb24sIGtleSkgPT4ge1xyXG4gICAgcmV0dXJuIHNlbGVjdGlvbi5maWx0ZXIoXHJcbiAgICAgIGFydGlmYWN0ID0+IGtleS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoYXJ0aWZhY3QudG9Mb3dlckNhc2UoKSkgPj0gMFxyXG4gICAgKS5sZW5ndGggPiAwXHJcbiAgfVxyXG4gIGxldCBmb3VuZCA9IDBcclxuICBmb3IgKGNvbnN0IGtleSBpbiBvcmRlcktleXMoYWRkcmVzc2VzKSkge1xyXG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzZXNba2V5XSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBmb3VuZCArPSB0cmFjZVdpdG5ldEFkZHJlc3NlcyhhZGRyZXNzZXNba2V5XSwgY29uc3RydWN0b3JBcmdzLCBhcnRpZmFjdHMsIGluZGVudCwgKGxldmVsIHx8IDApICsgMSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBrZXkgIT09IChcclxuICAgICAgICAgIFwiV2l0bmV0RGVwbG95ZXJcIiAmJlxyXG4gICAgICAgICAgICAha2V5LmVuZHNXaXRoKFwiTGliXCIpICYmXHJcbiAgICAgICAgICAgICFrZXkuZW5kc1dpdGgoXCJQcm94eVwiKSAmJlxyXG4gICAgICAgICAgICBrZXkuaW5kZXhPZihcIlRydXN0YWJsZVwiKSA8IDAgJiZcclxuICAgICAgICAgICAga2V5LmluZGV4T2YoXCJVcGdyYWRhYmxlXCIpIDwgMCAmJlxyXG4gICAgICAgICAgICBjb25zdHJ1Y3RvckFyZ3Nba2V5XSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgKSB8fCBpbmNsdWRlcyhhcnRpZmFjdHMsIGtleSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgZm91bmQrK1xyXG4gICAgICAgIGlmIChpbmNsdWRlcyhhcnRpZmFjdHMsIGtleSkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR9JHttYmx1ZShhZGRyZXNzZXNba2V5XSl9YCwgXCI8PVwiLCBgJHtsd2hpdGUoa2V5KX1gKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50fSR7Ymx1ZShhZGRyZXNzZXNba2V5XSl9YCwgXCI8PVwiLCBgJHt3aGl0ZShrZXkpfWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmb3VuZFxyXG59XHJcblxyXG5mdW5jdGlvbiBpbXBvcnRSYWRvbkFzc2V0cyAob3B0aW9ucykge1xyXG4gIGNvbnN0IHsgYXNzZXRzIH0gPSBvcHRpb25zPy5tb2R1bGUgPyByZXF1aXJlKG9wdGlvbnMubW9kdWxlKSA6IChvcHRpb25zPy5sZWdhY3kgPyB7fSA6IHJlcXVpcmUoXCJAd2l0bmV0L3Nka1wiKSlcclxuICByZXR1cm4gIW9wdGlvbnM/Lm1vZHVsZSAmJiBpc01vZHVsZUluaXRpYWxpemVkICYmIGZzLmV4aXN0c1N5bmMoYCR7V0lUTkVUX1NES19SQURPTl9BU1NFVFNfUEFUSH1gKVxyXG4gICAgPyBtZXJnZShhc3NldHMsIHJlcXVpcmUoYCR7V0lUTkVUX1NES19SQURPTl9BU1NFVFNfUEFUSH1gKSlcclxuICAgIDogYXNzZXRzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYWNlVGFibGUgKHJlY29yZHMsIG9wdGlvbnMpIHtcclxuICBjb25zdCBzdHJpbmdpZnkgPSAoZGF0YSwgaHVtYW5pemVycywgaW5kZXgpID0+IGh1bWFuaXplcnMgJiYgaHVtYW5pemVyc1tpbmRleF0gPyBodW1hbml6ZXJzW2luZGV4XShkYXRhKS50b1N0cmluZygpIDogZGF0YT8udG9TdHJpbmcoKSA/PyBcIlwiXHJcbiAgY29uc3QgcmVkdWNlTWF4ID0gKG51bWJlcnMpID0+IG51bWJlcnMucmVkdWNlKChjdXJyLCBwcmV2KSA9PiBNYXRoLm1heChjdXJyLCBwcmV2KSwgMClcclxuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fVxyXG4gIGNvbnN0IGluZGVudCA9IG9wdGlvbnM/LmluZGVudCB8fCBcIlwiXHJcbiAgY29uc3QgbnVtQ29sdW1ucyA9IHJlZHVjZU1heChyZWNvcmRzLm1hcChyZWNvcmQgPT4gcmVjb3JkPy5sZW5ndGggfHwgMSkpXHJcbiAgY29uc3QgbWF4Q29sdW1uV2lkdGggPSBvcHRpb25zPy5tYXhDb2x1bW5XaWR0aCB8fCA4MFxyXG4gIGNvbnN0IHRhYmxlID0gdHJhbnNwb3NlKHJlY29yZHMsIG51bUNvbHVtbnMpXHJcbiAgb3B0aW9ucy53aWR0aHMgPSBvcHRpb25zPy53aWR0aHMgfHwgdGFibGUubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICBsZXQgbWF4V2lkdGggPSByZWR1Y2VNYXgoY29sdW1uLm1hcChmaWVsZCA9PiBjb2xvcnN0cmlwKHN0cmluZ2lmeShmaWVsZCwgb3B0aW9ucz8uaHVtYW5pemVycywgaW5kZXgpKS5sZW5ndGgpKVxyXG4gICAgaWYgKG9wdGlvbnM/LmhlYWRsaW5lcyAmJiBvcHRpb25zLmhlYWRsaW5lc1tpbmRleF0pIHtcclxuICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgY29sb3JzdHJpcChvcHRpb25zLmhlYWRsaW5lc1tpbmRleF0ucmVwbGFjZUFsbChcIjpcIiwgXCJcIikpLmxlbmd0aClcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLm1pbihtYXhXaWR0aCwgbWF4Q29sdW1uV2lkdGgpXHJcbiAgfSlcclxuICBsZXQgaGVhZGxpbmUgPSBvcHRpb25zLndpZHRocy5tYXAobWF4V2lkdGggPT4gXCLilIBcIi5yZXBlYXQobWF4V2lkdGgpKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSM4pSAJHtoZWFkbGluZS5qb2luKFwi4pSA4pSs4pSAXCIpfeKUgOKUkGApXHJcbiAgaWYgKG9wdGlvbnM/LmhlYWRsaW5lcykge1xyXG4gICAgaGVhZGxpbmUgPSBvcHRpb25zLndpZHRocy5tYXAoKG1heFdpZHRoLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBjYXB0aW9uID0gb3B0aW9ucy5oZWFkbGluZXNbaW5kZXhdLnJlcGxhY2VBbGwoXCI6XCIsIFwiXCIpXHJcbiAgICAgIGNvbnN0IGNhcHRpb25MZW5ndGggPSBjb2xvcnN0cmlwKGNhcHRpb24pLmxlbmd0aFxyXG4gICAgICByZXR1cm4gYCR7d2hpdGUoY2FwdGlvbil9JHtcIiBcIi5yZXBlYXQobWF4V2lkdGggLSBjYXB0aW9uTGVuZ3RoKX1gXHJcbiAgICB9KVxyXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIIgJHtoZWFkbGluZS5qb2luKFwiIOKUgiBcIil9IOKUgmApXHJcbiAgICBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXHJcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUnOKUgCR7aGVhZGxpbmUuam9pbihcIuKUgOKUvOKUgFwiKX3ilIDilKRgKVxyXG4gIH1cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgIGxldCBsaW5lID0gXCJcIlxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHtcclxuICAgICAgbGV0IGRhdGEgPSB0YWJsZVtqXVtpXVxyXG4gICAgICBsZXQgY29sb3JcclxuICAgICAgaWYgKG9wdGlvbnM/LmNvbG9ycyAmJiBvcHRpb25zLmNvbG9yc1tqXSkge1xyXG4gICAgICAgIGNvbG9yID0gb3B0aW9ucy5jb2xvcnNbal1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2xvciA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXHJcbiAgICAgICAgICA/IGdyZWVuXHJcbiAgICAgICAgICA6IChOdW1iZXIoZGF0YSkgPT09IGRhdGEgJiYgZGF0YSAlIDEgIT09IDAgLy8gaXMgZmxvYXQgbnVtYmVyP1xyXG4gICAgICAgICAgICA/IHllbGxvd1xyXG4gICAgICAgICAgICA6ICh4KSA9PiB4XHJcbiAgICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgZGF0YSA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zPy5odW1hbml6ZXJzLCBqKVxyXG4gICAgICBpZiAoY29sb3JzdHJpcChkYXRhKS5sZW5ndGggPiBtYXhDb2x1bW5XaWR0aCkge1xyXG4gICAgICAgIHdoaWxlIChjb2xvcnN0cmlwKGRhdGEpLmxlbmd0aCA+IG1heENvbHVtbldpZHRoIC0gMykge1xyXG4gICAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoMCwgLTEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGEgKz0gXCIuLi5cIlxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBjb2xvcnN0cmlwKGRhdGEpLmxlbmd0aFxyXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGxpbmVzICYmIG9wdGlvbnMuaGVhZGxpbmVzW2pdWzBdID09PSBcIjpcIikge1xyXG4gICAgICAgIGRhdGEgPSBgJHtjb2xvcihkYXRhKX0ke1wiIFwiLnJlcGVhdChvcHRpb25zLndpZHRoc1tqXSAtIGRhdGFMZW5ndGgpfWBcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRhID0gYCR7XCIgXCIucmVwZWF0KG9wdGlvbnMud2lkdGhzW2pdIC0gZGF0YUxlbmd0aCl9JHtjb2xvcihkYXRhKX1gXHJcbiAgICAgIH1cclxuICAgICAgbGluZSArPSBg4pSCICR7ZGF0YX0gYFxyXG4gICAgfVxyXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH0ke2xpbmV94pSCYClcclxuICB9XHJcbiAgaGVhZGxpbmUgPSBvcHRpb25zLndpZHRocy5tYXAobWF4V2lkdGggPT4gXCLilIBcIi5yZXBlYXQobWF4V2lkdGgpKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSU4pSAJHtoZWFkbGluZS5qb2luKFwi4pSA4pS04pSAXCIpfeKUgOKUmGApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYW5zcG9zZSAocmVjb3JkcywgbnVtQ29sdW1ucykge1xyXG4gIGNvbnN0IGNvbHVtbnMgPSBbXVxyXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBudW1Db2x1bW5zOyBpbmRleCsrKSB7XHJcbiAgICBjb2x1bW5zLnB1c2gocmVjb3Jkcy5tYXAocm93ID0+IHJvd1tpbmRleF0pKVxyXG4gIH1cclxuICByZXR1cm4gY29sdW1uc1xyXG59XHJcblxyXG5jb25zdCBjb2xvcnN0cmlwID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoXHJcbiAgL1tcXHUwMDFiXFx1MDA5Yl1bWygpIzs/XSooPzpbMC05XXsxLDR9KD86O1swLTldezAsNH0pKik/WzAtOUEtT1JaY2YtbnFyeT0+PF0vZywgXCJcIlxyXG4pXHJcblxyXG5mdW5jdGlvbiBwcm9tcHRlciAocHJvbWlzZSkge1xyXG4gIGNvbnN0IGxvYWRpbmcgPSAoKCkgPT4ge1xyXG4gICAgY29uc3QgaCA9IFtcInxcIiwgXCIvXCIsIFwiLVwiLCBcIlxcXFxcIl1cclxuICAgIGxldCBpID0gMFxyXG4gICAgcmV0dXJuIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgaSA9IChpID4gMykgPyAwIDogaVxyXG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgXFxiXFxiJHtoW2ldfSBgKVxyXG4gICAgICBpKytcclxuICAgIH0sIDUwKVxyXG4gIH0pKClcclxuICByZXR1cm4gcHJvbWlzZVxyXG4gICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgY2xlYXJJbnRlcnZhbChsb2FkaW5nKVxyXG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcYlxcYlwiKVxyXG4gICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZURhdGEgKGhlYWRlciwgZGF0YSwgd2lkdGgsIGNvbG9yKSB7XHJcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoaGVhZGVyKVxyXG4gIGlmIChjb2xvcikgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY29sb3IpXHJcbiAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGRhdGEubGVuZ3RoIC8gd2lkdGg7IGl4KyspIHtcclxuICAgIGlmIChpeCA+IDApIHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIFwiLnJlcGVhdChoZWFkZXIubGVuZ3RoKSlcclxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEuc2xpY2Uod2lkdGggKiBpeCwgd2lkdGggKiAoaXggKyAxKSkpXHJcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcblwiKVxyXG4gIH1cclxuICBpZiAoY29sb3IpIHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFx4MWJbMG1cIilcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgY29sb3JzOiB7XHJcbiAgICBibHVlLFxyXG4gICAgY3lhbixcclxuICAgIGdyYXksXHJcbiAgICBncmVlbixcclxuICAgIHJlZCxcclxuICAgIHllbGxvdyxcclxuICAgIHdoaXRlLFxyXG4gICAgbWFnZW50YSxcclxuICAgIGxibHVlLFxyXG4gICAgbGN5YW4sXHJcbiAgICBsZ3JlZW4sXHJcbiAgICBsbWFnZW50YSxcclxuICAgIGx3aGl0ZSxcclxuICAgIGx5ZWxsb3csXHJcbiAgICBtYmx1ZSxcclxuICAgIG1jeWFuLFxyXG4gICAgbWdyZWVuLFxyXG4gICAgbXJlZCxcclxuICAgIG15ZWxsb3csXHJcbiAgICBtbWFnZW50YSxcclxuICB9LFxyXG4gIGRlbGV0ZUV4dHJhRmxhZ3MsXHJcbiAgZXh0cmFjdEZsYWdzRnJvbUFyZ3MsXHJcbiAgZXh0cmFjdE9wdGlvbnNGcm9tQXJncyxcclxuICBmbGF0dGVuT2JqZWN0LFxyXG4gIG9yZGVyS2V5cyxcclxuICBzaG93VmVyc2lvbixcclxuICB0cmFjZURhdGEsXHJcbiAgdHJhY2VIZWFkZXIsXHJcbiAgdHJhY2VXaXRuZXRBZGRyZXNzZXMsXHJcbiAgZ2V0TmV0d29ya0FkZHJlc3NlcyxcclxuICBnZXROZXR3b3JrQ29uc3RydWN0b3JBcmdzOiBmcmFtZXdvcmsuZ2V0TmV0d29ya0NvbnN0cnVjdG9yQXJncyxcclxuICBpbXBvcnRSYWRvbkFzc2V0cyxcclxuICByZWFkV2l0bmV0SnNvbkZpbGVzLFxyXG4gIHNhdmVXaXRuZXRKc29uRmlsZXMsXHJcbiAgdHJhY2VUYWJsZSxcclxuICBjb21tYXMsXHJcbiAgY29sb3JzdHJpcCxcclxuICBwcm9tcHRlcixcclxufVxyXG4iXX0=