Absolue-Necessite/.obsidian/plugins/alx-folder-note/main.js
2023-08-24 12:48:49 +02:00

5307 lines
614 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source visit the plugins github repository
*/
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/.pnpm/assert-never@1.2.1/node_modules/assert-never/index.js
var require_assert_never = __commonJS({
"node_modules/.pnpm/assert-never@1.2.1/node_modules/assert-never/index.js"(exports2) {
"use strict";
Object.defineProperty(exports2, "__esModule", { value: true });
function assertNever2(value, noThrow) {
if (noThrow) {
return value;
}
throw new Error("Unhandled discriminated union member: " + JSON.stringify(value));
}
exports2.assertNever = assertNever2;
exports2.default = assertNever2;
}
});
// node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js
var require_path_browserify = __commonJS({
"node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js"(exports2, module2) {
"use strict";
function assertPath(path) {
if (typeof path !== "string") {
throw new TypeError("Path must be a string. Received " + JSON.stringify(path));
}
}
function normalizeStringPosix(path, allowAboveRoot) {
var res = "";
var lastSegmentLength = 0;
var lastSlash = -1;
var dots = 0;
var code;
for (var i = 0; i <= path.length; ++i) {
if (i < path.length)
code = path.charCodeAt(i);
else if (code === 47)
break;
else
code = 47;
if (code === 47) {
if (lastSlash === i - 1 || dots === 1) {
} else if (lastSlash !== i - 1 && dots === 2) {
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) {
if (res.length > 2) {
var lastSlashIndex = res.lastIndexOf("/");
if (lastSlashIndex !== res.length - 1) {
if (lastSlashIndex === -1) {
res = "";
lastSegmentLength = 0;
} else {
res = res.slice(0, lastSlashIndex);
lastSegmentLength = res.length - 1 - res.lastIndexOf("/");
}
lastSlash = i;
dots = 0;
continue;
}
} else if (res.length === 2 || res.length === 1) {
res = "";
lastSegmentLength = 0;
lastSlash = i;
dots = 0;
continue;
}
}
if (allowAboveRoot) {
if (res.length > 0)
res += "/..";
else
res = "..";
lastSegmentLength = 2;
}
} else {
if (res.length > 0)
res += "/" + path.slice(lastSlash + 1, i);
else
res = path.slice(lastSlash + 1, i);
lastSegmentLength = i - lastSlash - 1;
}
lastSlash = i;
dots = 0;
} else if (code === 46 && dots !== -1) {
++dots;
} else {
dots = -1;
}
}
return res;
}
function _format(sep, pathObject) {
var dir = pathObject.dir || pathObject.root;
var base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
if (!dir) {
return base;
}
if (dir === pathObject.root) {
return dir + base;
}
return dir + sep + base;
}
var posix = {
// path.resolve([from ...], to)
resolve: function resolve() {
var resolvedPath = "";
var resolvedAbsolute = false;
var cwd;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path;
if (i >= 0)
path = arguments[i];
else {
if (cwd === void 0)
cwd = process.cwd();
path = cwd;
}
assertPath(path);
if (path.length === 0) {
continue;
}
resolvedPath = path + "/" + resolvedPath;
resolvedAbsolute = path.charCodeAt(0) === 47;
}
resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);
if (resolvedAbsolute) {
if (resolvedPath.length > 0)
return "/" + resolvedPath;
else
return "/";
} else if (resolvedPath.length > 0) {
return resolvedPath;
} else {
return ".";
}
},
normalize: function normalize(path) {
assertPath(path);
if (path.length === 0)
return ".";
var isAbsolute = path.charCodeAt(0) === 47;
var trailingSeparator = path.charCodeAt(path.length - 1) === 47;
path = normalizeStringPosix(path, !isAbsolute);
if (path.length === 0 && !isAbsolute)
path = ".";
if (path.length > 0 && trailingSeparator)
path += "/";
if (isAbsolute)
return "/" + path;
return path;
},
isAbsolute: function isAbsolute(path) {
assertPath(path);
return path.length > 0 && path.charCodeAt(0) === 47;
},
join: function join2() {
if (arguments.length === 0)
return ".";
var joined;
for (var i = 0; i < arguments.length; ++i) {
var arg = arguments[i];
assertPath(arg);
if (arg.length > 0) {
if (joined === void 0)
joined = arg;
else
joined += "/" + arg;
}
}
if (joined === void 0)
return ".";
return posix.normalize(joined);
},
relative: function relative(from, to) {
assertPath(from);
assertPath(to);
if (from === to)
return "";
from = posix.resolve(from);
to = posix.resolve(to);
if (from === to)
return "";
var fromStart = 1;
for (; fromStart < from.length; ++fromStart) {
if (from.charCodeAt(fromStart) !== 47)
break;
}
var fromEnd = from.length;
var fromLen = fromEnd - fromStart;
var toStart = 1;
for (; toStart < to.length; ++toStart) {
if (to.charCodeAt(toStart) !== 47)
break;
}
var toEnd = to.length;
var toLen = toEnd - toStart;
var length = fromLen < toLen ? fromLen : toLen;
var lastCommonSep = -1;
var i = 0;
for (; i <= length; ++i) {
if (i === length) {
if (toLen > length) {
if (to.charCodeAt(toStart + i) === 47) {
return to.slice(toStart + i + 1);
} else if (i === 0) {
return to.slice(toStart + i);
}
} else if (fromLen > length) {
if (from.charCodeAt(fromStart + i) === 47) {
lastCommonSep = i;
} else if (i === 0) {
lastCommonSep = 0;
}
}
break;
}
var fromCode = from.charCodeAt(fromStart + i);
var toCode = to.charCodeAt(toStart + i);
if (fromCode !== toCode)
break;
else if (fromCode === 47)
lastCommonSep = i;
}
var out = "";
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
if (i === fromEnd || from.charCodeAt(i) === 47) {
if (out.length === 0)
out += "..";
else
out += "/..";
}
}
if (out.length > 0)
return out + to.slice(toStart + lastCommonSep);
else {
toStart += lastCommonSep;
if (to.charCodeAt(toStart) === 47)
++toStart;
return to.slice(toStart);
}
},
_makeLong: function _makeLong(path) {
return path;
},
dirname: function dirname3(path) {
assertPath(path);
if (path.length === 0)
return ".";
var code = path.charCodeAt(0);
var hasRoot = code === 47;
var end = -1;
var matchedSlash = true;
for (var i = path.length - 1; i >= 1; --i) {
code = path.charCodeAt(i);
if (code === 47) {
if (!matchedSlash) {
end = i;
break;
}
} else {
matchedSlash = false;
}
}
if (end === -1)
return hasRoot ? "/" : ".";
if (hasRoot && end === 1)
return "//";
return path.slice(0, end);
},
basename: function basename(path, ext) {
if (ext !== void 0 && typeof ext !== "string")
throw new TypeError('"ext" argument must be a string');
assertPath(path);
var start = 0;
var end = -1;
var matchedSlash = true;
var i;
if (ext !== void 0 && ext.length > 0 && ext.length <= path.length) {
if (ext.length === path.length && ext === path)
return "";
var extIdx = ext.length - 1;
var firstNonSlashEnd = -1;
for (i = path.length - 1; i >= 0; --i) {
var code = path.charCodeAt(i);
if (code === 47) {
if (!matchedSlash) {
start = i + 1;
break;
}
} else {
if (firstNonSlashEnd === -1) {
matchedSlash = false;
firstNonSlashEnd = i + 1;
}
if (extIdx >= 0) {
if (code === ext.charCodeAt(extIdx)) {
if (--extIdx === -1) {
end = i;
}
} else {
extIdx = -1;
end = firstNonSlashEnd;
}
}
}
}
if (start === end)
end = firstNonSlashEnd;
else if (end === -1)
end = path.length;
return path.slice(start, end);
} else {
for (i = path.length - 1; i >= 0; --i) {
if (path.charCodeAt(i) === 47) {
if (!matchedSlash) {
start = i + 1;
break;
}
} else if (end === -1) {
matchedSlash = false;
end = i + 1;
}
}
if (end === -1)
return "";
return path.slice(start, end);
}
},
extname: function extname2(path) {
assertPath(path);
var startDot = -1;
var startPart = 0;
var end = -1;
var matchedSlash = true;
var preDotState = 0;
for (var i = path.length - 1; i >= 0; --i) {
var code = path.charCodeAt(i);
if (code === 47) {
if (!matchedSlash) {
startPart = i + 1;
break;
}
continue;
}
if (end === -1) {
matchedSlash = false;
end = i + 1;
}
if (code === 46) {
if (startDot === -1)
startDot = i;
else if (preDotState !== 1)
preDotState = 1;
} else if (startDot !== -1) {
preDotState = -1;
}
}
if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot
preDotState === 0 || // The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
return "";
}
return path.slice(startDot, end);
},
format: function format(pathObject) {
if (pathObject === null || typeof pathObject !== "object") {
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
}
return _format("/", pathObject);
},
parse: function parse2(path) {
assertPath(path);
var ret = { root: "", dir: "", base: "", ext: "", name: "" };
if (path.length === 0)
return ret;
var code = path.charCodeAt(0);
var isAbsolute = code === 47;
var start;
if (isAbsolute) {
ret.root = "/";
start = 1;
} else {
start = 0;
}
var startDot = -1;
var startPart = 0;
var end = -1;
var matchedSlash = true;
var i = path.length - 1;
var preDotState = 0;
for (; i >= start; --i) {
code = path.charCodeAt(i);
if (code === 47) {
if (!matchedSlash) {
startPart = i + 1;
break;
}
continue;
}
if (end === -1) {
matchedSlash = false;
end = i + 1;
}
if (code === 46) {
if (startDot === -1)
startDot = i;
else if (preDotState !== 1)
preDotState = 1;
} else if (startDot !== -1) {
preDotState = -1;
}
}
if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot
preDotState === 0 || // The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
if (end !== -1) {
if (startPart === 0 && isAbsolute)
ret.base = ret.name = path.slice(1, end);
else
ret.base = ret.name = path.slice(startPart, end);
}
} else {
if (startPart === 0 && isAbsolute) {
ret.name = path.slice(1, startDot);
ret.base = path.slice(1, end);
} else {
ret.name = path.slice(startPart, startDot);
ret.base = path.slice(startPart, end);
}
ret.ext = path.slice(startDot, end);
}
if (startPart > 0)
ret.dir = path.slice(0, startPart - 1);
else if (isAbsolute)
ret.dir = "/";
return ret;
},
sep: "/",
delimiter: ":",
win32: null,
posix: null
};
posix.posix = posix;
module2.exports = posix;
}
});
// (disabled):fs
var require_fs = __commonJS({
"(disabled):fs"() {
}
});
// node_modules/.pnpm/kind-of@6.0.3/node_modules/kind-of/index.js
var require_kind_of = __commonJS({
"node_modules/.pnpm/kind-of@6.0.3/node_modules/kind-of/index.js"(exports2, module2) {
var toString = Object.prototype.toString;
module2.exports = function kindOf(val) {
if (val === void 0)
return "undefined";
if (val === null)
return "null";
var type = typeof val;
if (type === "boolean")
return "boolean";
if (type === "string")
return "string";
if (type === "number")
return "number";
if (type === "symbol")
return "symbol";
if (type === "function") {
return isGeneratorFn(val) ? "generatorfunction" : "function";
}
if (isArray(val))
return "array";
if (isBuffer(val))
return "buffer";
if (isArguments(val))
return "arguments";
if (isDate(val))
return "date";
if (isError(val))
return "error";
if (isRegexp(val))
return "regexp";
switch (ctorName(val)) {
case "Symbol":
return "symbol";
case "Promise":
return "promise";
case "WeakMap":
return "weakmap";
case "WeakSet":
return "weakset";
case "Map":
return "map";
case "Set":
return "set";
case "Int8Array":
return "int8array";
case "Uint8Array":
return "uint8array";
case "Uint8ClampedArray":
return "uint8clampedarray";
case "Int16Array":
return "int16array";
case "Uint16Array":
return "uint16array";
case "Int32Array":
return "int32array";
case "Uint32Array":
return "uint32array";
case "Float32Array":
return "float32array";
case "Float64Array":
return "float64array";
}
if (isGeneratorObj(val)) {
return "generator";
}
type = toString.call(val);
switch (type) {
case "[object Object]":
return "object";
case "[object Map Iterator]":
return "mapiterator";
case "[object Set Iterator]":
return "setiterator";
case "[object String Iterator]":
return "stringiterator";
case "[object Array Iterator]":
return "arrayiterator";
}
return type.slice(8, -1).toLowerCase().replace(/\s/g, "");
};
function ctorName(val) {
return typeof val.constructor === "function" ? val.constructor.name : null;
}
function isArray(val) {
if (Array.isArray)
return Array.isArray(val);
return val instanceof Array;
}
function isError(val) {
return val instanceof Error || typeof val.message === "string" && val.constructor && typeof val.constructor.stackTraceLimit === "number";
}
function isDate(val) {
if (val instanceof Date)
return true;
return typeof val.toDateString === "function" && typeof val.getDate === "function" && typeof val.setDate === "function";
}
function isRegexp(val) {
if (val instanceof RegExp)
return true;
return typeof val.flags === "string" && typeof val.ignoreCase === "boolean" && typeof val.multiline === "boolean" && typeof val.global === "boolean";
}
function isGeneratorFn(name, val) {
return ctorName(name) === "GeneratorFunction";
}
function isGeneratorObj(val) {
return typeof val.throw === "function" && typeof val.return === "function" && typeof val.next === "function";
}
function isArguments(val) {
try {
if (typeof val.length === "number" && typeof val.callee === "function") {
return true;
}
} catch (err) {
if (err.message.indexOf("callee") !== -1) {
return true;
}
}
return false;
}
function isBuffer(val) {
if (val.constructor && typeof val.constructor.isBuffer === "function") {
return val.constructor.isBuffer(val);
}
return false;
}
}
});
// node_modules/.pnpm/is-extendable@0.1.1/node_modules/is-extendable/index.js
var require_is_extendable = __commonJS({
"node_modules/.pnpm/is-extendable@0.1.1/node_modules/is-extendable/index.js"(exports2, module2) {
"use strict";
module2.exports = function isExtendable(val) {
return typeof val !== "undefined" && val !== null && (typeof val === "object" || typeof val === "function");
};
}
});
// node_modules/.pnpm/extend-shallow@2.0.1/node_modules/extend-shallow/index.js
var require_extend_shallow = __commonJS({
"node_modules/.pnpm/extend-shallow@2.0.1/node_modules/extend-shallow/index.js"(exports2, module2) {
"use strict";
var isObject = require_is_extendable();
module2.exports = function extend(o) {
if (!isObject(o)) {
o = {};
}
var len = arguments.length;
for (var i = 1; i < len; i++) {
var obj = arguments[i];
if (isObject(obj)) {
assign(o, obj);
}
}
return o;
};
function assign(a, b) {
for (var key in b) {
if (hasOwn(b, key)) {
a[key] = b[key];
}
}
}
function hasOwn(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
}
});
// node_modules/.pnpm/section-matter@1.0.0/node_modules/section-matter/index.js
var require_section_matter = __commonJS({
"node_modules/.pnpm/section-matter@1.0.0/node_modules/section-matter/index.js"(exports2, module2) {
"use strict";
var typeOf = require_kind_of();
var extend = require_extend_shallow();
module2.exports = function(input, options2) {
if (typeof options2 === "function") {
options2 = { parse: options2 };
}
var file = toObject(input);
var defaults = { section_delimiter: "---", parse: identity };
var opts = extend({}, defaults, options2);
var delim = opts.section_delimiter;
var lines = file.content.split(/\r?\n/);
var sections = null;
var section = createSection();
var content = [];
var stack = [];
function initSections(val) {
file.content = val;
sections = [];
content = [];
}
function closeSection(val) {
if (stack.length) {
section.key = getKey(stack[0], delim);
section.content = val;
opts.parse(section, sections);
sections.push(section);
section = createSection();
content = [];
stack = [];
}
}
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
var len = stack.length;
var ln = line.trim();
if (isDelimiter(ln, delim)) {
if (ln.length === 3 && i !== 0) {
if (len === 0 || len === 2) {
content.push(line);
continue;
}
stack.push(ln);
section.data = content.join("\n");
content = [];
continue;
}
if (sections === null) {
initSections(content.join("\n"));
}
if (len === 2) {
closeSection(content.join("\n"));
}
stack.push(ln);
continue;
}
content.push(line);
}
if (sections === null) {
initSections(content.join("\n"));
} else {
closeSection(content.join("\n"));
}
file.sections = sections;
return file;
};
function isDelimiter(line, delim) {
if (line.slice(0, delim.length) !== delim) {
return false;
}
if (line.charAt(delim.length + 1) === delim.slice(-1)) {
return false;
}
return true;
}
function toObject(input) {
if (typeOf(input) !== "object") {
input = { content: input };
}
if (typeof input.content !== "string" && !isBuffer(input.content)) {
throw new TypeError("expected a buffer or string");
}
input.content = input.content.toString();
input.sections = [];
return input;
}
function getKey(val, delim) {
return val ? val.slice(delim.length).trim() : "";
}
function createSection() {
return { key: "", data: "", content: "" };
}
function identity(val) {
return val;
}
function isBuffer(val) {
if (val && val.constructor && typeof val.constructor.isBuffer === "function") {
return val.constructor.isBuffer(val);
}
return false;
}
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/common.js
var require_common = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/common.js"(exports2, module2) {
"use strict";
function isNothing(subject) {
return typeof subject === "undefined" || subject === null;
}
function isObject(subject) {
return typeof subject === "object" && subject !== null;
}
function toArray(sequence) {
if (Array.isArray(sequence))
return sequence;
else if (isNothing(sequence))
return [];
return [sequence];
}
function extend(target, source) {
var index, length, key, sourceKeys;
if (source) {
sourceKeys = Object.keys(source);
for (index = 0, length = sourceKeys.length; index < length; index += 1) {
key = sourceKeys[index];
target[key] = source[key];
}
}
return target;
}
function repeat(string, count) {
var result = "", cycle;
for (cycle = 0; cycle < count; cycle += 1) {
result += string;
}
return result;
}
function isNegativeZero(number) {
return number === 0 && Number.NEGATIVE_INFINITY === 1 / number;
}
module2.exports.isNothing = isNothing;
module2.exports.isObject = isObject;
module2.exports.toArray = toArray;
module2.exports.repeat = repeat;
module2.exports.isNegativeZero = isNegativeZero;
module2.exports.extend = extend;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/exception.js
var require_exception = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/exception.js"(exports2, module2) {
"use strict";
function YAMLException(reason, mark) {
Error.call(this);
this.name = "YAMLException";
this.reason = reason;
this.mark = mark;
this.message = (this.reason || "(unknown reason)") + (this.mark ? " " + this.mark.toString() : "");
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error().stack || "";
}
}
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;
YAMLException.prototype.toString = function toString(compact) {
var result = this.name + ": ";
result += this.reason || "(unknown reason)";
if (!compact && this.mark) {
result += " " + this.mark.toString();
}
return result;
};
module2.exports = YAMLException;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/mark.js
var require_mark = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/mark.js"(exports2, module2) {
"use strict";
var common = require_common();
function Mark(name, buffer, position, line, column) {
this.name = name;
this.buffer = buffer;
this.position = position;
this.line = line;
this.column = column;
}
Mark.prototype.getSnippet = function getSnippet(indent, maxLength) {
var head, start, tail, end, snippet;
if (!this.buffer)
return null;
indent = indent || 4;
maxLength = maxLength || 75;
head = "";
start = this.position;
while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) {
start -= 1;
if (this.position - start > maxLength / 2 - 1) {
head = " ... ";
start += 5;
break;
}
}
tail = "";
end = this.position;
while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) {
end += 1;
if (end - this.position > maxLength / 2 - 1) {
tail = " ... ";
end -= 5;
break;
}
}
snippet = this.buffer.slice(start, end);
return common.repeat(" ", indent) + head + snippet + tail + "\n" + common.repeat(" ", indent + this.position - start + head.length) + "^";
};
Mark.prototype.toString = function toString(compact) {
var snippet, where = "";
if (this.name) {
where += 'in "' + this.name + '" ';
}
where += "at line " + (this.line + 1) + ", column " + (this.column + 1);
if (!compact) {
snippet = this.getSnippet();
if (snippet) {
where += ":\n" + snippet;
}
}
return where;
};
module2.exports = Mark;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type.js
var require_type = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type.js"(exports2, module2) {
"use strict";
var YAMLException = require_exception();
var TYPE_CONSTRUCTOR_OPTIONS = [
"kind",
"resolve",
"construct",
"instanceOf",
"predicate",
"represent",
"defaultStyle",
"styleAliases"
];
var YAML_NODE_KINDS = [
"scalar",
"sequence",
"mapping"
];
function compileStyleAliases(map) {
var result = {};
if (map !== null) {
Object.keys(map).forEach(function(style) {
map[style].forEach(function(alias) {
result[String(alias)] = style;
});
});
}
return result;
}
function Type(tag, options2) {
options2 = options2 || {};
Object.keys(options2).forEach(function(name) {
if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
}
});
this.tag = tag;
this.kind = options2["kind"] || null;
this.resolve = options2["resolve"] || function() {
return true;
};
this.construct = options2["construct"] || function(data) {
return data;
};
this.instanceOf = options2["instanceOf"] || null;
this.predicate = options2["predicate"] || null;
this.represent = options2["represent"] || null;
this.defaultStyle = options2["defaultStyle"] || null;
this.styleAliases = compileStyleAliases(options2["styleAliases"] || null);
if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
}
}
module2.exports = Type;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema.js
var require_schema = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema.js"(exports2, module2) {
"use strict";
var common = require_common();
var YAMLException = require_exception();
var Type = require_type();
function compileList(schema, name, result) {
var exclude = [];
schema.include.forEach(function(includedSchema) {
result = compileList(includedSchema, name, result);
});
schema[name].forEach(function(currentType) {
result.forEach(function(previousType, previousIndex) {
if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {
exclude.push(previousIndex);
}
});
result.push(currentType);
});
return result.filter(function(type, index) {
return exclude.indexOf(index) === -1;
});
}
function compileMap() {
var result = {
scalar: {},
sequence: {},
mapping: {},
fallback: {}
}, index, length;
function collectType(type) {
result[type.kind][type.tag] = result["fallback"][type.tag] = type;
}
for (index = 0, length = arguments.length; index < length; index += 1) {
arguments[index].forEach(collectType);
}
return result;
}
function Schema(definition) {
this.include = definition.include || [];
this.implicit = definition.implicit || [];
this.explicit = definition.explicit || [];
this.implicit.forEach(function(type) {
if (type.loadKind && type.loadKind !== "scalar") {
throw new YAMLException("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");
}
});
this.compiledImplicit = compileList(this, "implicit", []);
this.compiledExplicit = compileList(this, "explicit", []);
this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit);
}
Schema.DEFAULT = null;
Schema.create = function createSchema() {
var schemas, types;
switch (arguments.length) {
case 1:
schemas = Schema.DEFAULT;
types = arguments[0];
break;
case 2:
schemas = arguments[0];
types = arguments[1];
break;
default:
throw new YAMLException("Wrong number of arguments for Schema.create function");
}
schemas = common.toArray(schemas);
types = common.toArray(types);
if (!schemas.every(function(schema) {
return schema instanceof Schema;
})) {
throw new YAMLException("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");
}
if (!types.every(function(type) {
return type instanceof Type;
})) {
throw new YAMLException("Specified list of YAML types (or a single Type object) contains a non-Type object.");
}
return new Schema({
include: schemas,
explicit: types
});
};
module2.exports = Schema;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/str.js
var require_str = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/str.js"(exports2, module2) {
"use strict";
var Type = require_type();
module2.exports = new Type("tag:yaml.org,2002:str", {
kind: "scalar",
construct: function(data) {
return data !== null ? data : "";
}
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/seq.js
var require_seq = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/seq.js"(exports2, module2) {
"use strict";
var Type = require_type();
module2.exports = new Type("tag:yaml.org,2002:seq", {
kind: "sequence",
construct: function(data) {
return data !== null ? data : [];
}
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/map.js
var require_map = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/map.js"(exports2, module2) {
"use strict";
var Type = require_type();
module2.exports = new Type("tag:yaml.org,2002:map", {
kind: "mapping",
construct: function(data) {
return data !== null ? data : {};
}
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js
var require_failsafe = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js"(exports2, module2) {
"use strict";
var Schema = require_schema();
module2.exports = new Schema({
explicit: [
require_str(),
require_seq(),
require_map()
]
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/null.js
var require_null = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/null.js"(exports2, module2) {
"use strict";
var Type = require_type();
function resolveYamlNull(data) {
if (data === null)
return true;
var max = data.length;
return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL");
}
function constructYamlNull() {
return null;
}
function isNull(object) {
return object === null;
}
module2.exports = new Type("tag:yaml.org,2002:null", {
kind: "scalar",
resolve: resolveYamlNull,
construct: constructYamlNull,
predicate: isNull,
represent: {
canonical: function() {
return "~";
},
lowercase: function() {
return "null";
},
uppercase: function() {
return "NULL";
},
camelcase: function() {
return "Null";
}
},
defaultStyle: "lowercase"
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/bool.js
var require_bool = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/bool.js"(exports2, module2) {
"use strict";
var Type = require_type();
function resolveYamlBoolean(data) {
if (data === null)
return false;
var max = data.length;
return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE");
}
function constructYamlBoolean(data) {
return data === "true" || data === "True" || data === "TRUE";
}
function isBoolean(object) {
return Object.prototype.toString.call(object) === "[object Boolean]";
}
module2.exports = new Type("tag:yaml.org,2002:bool", {
kind: "scalar",
resolve: resolveYamlBoolean,
construct: constructYamlBoolean,
predicate: isBoolean,
represent: {
lowercase: function(object) {
return object ? "true" : "false";
},
uppercase: function(object) {
return object ? "TRUE" : "FALSE";
},
camelcase: function(object) {
return object ? "True" : "False";
}
},
defaultStyle: "lowercase"
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/int.js
var require_int = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/int.js"(exports2, module2) {
"use strict";
var common = require_common();
var Type = require_type();
function isHexCode(c) {
return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102;
}
function isOctCode(c) {
return 48 <= c && c <= 55;
}
function isDecCode(c) {
return 48 <= c && c <= 57;
}
function resolveYamlInteger(data) {
if (data === null)
return false;
var max = data.length, index = 0, hasDigits = false, ch;
if (!max)
return false;
ch = data[index];
if (ch === "-" || ch === "+") {
ch = data[++index];
}
if (ch === "0") {
if (index + 1 === max)
return true;
ch = data[++index];
if (ch === "b") {
index++;
for (; index < max; index++) {
ch = data[index];
if (ch === "_")
continue;
if (ch !== "0" && ch !== "1")
return false;
hasDigits = true;
}
return hasDigits && ch !== "_";
}
if (ch === "x") {
index++;
for (; index < max; index++) {
ch = data[index];
if (ch === "_")
continue;
if (!isHexCode(data.charCodeAt(index)))
return false;
hasDigits = true;
}
return hasDigits && ch !== "_";
}
for (; index < max; index++) {
ch = data[index];
if (ch === "_")
continue;
if (!isOctCode(data.charCodeAt(index)))
return false;
hasDigits = true;
}
return hasDigits && ch !== "_";
}
if (ch === "_")
return false;
for (; index < max; index++) {
ch = data[index];
if (ch === "_")
continue;
if (ch === ":")
break;
if (!isDecCode(data.charCodeAt(index))) {
return false;
}
hasDigits = true;
}
if (!hasDigits || ch === "_")
return false;
if (ch !== ":")
return true;
return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
}
function constructYamlInteger(data) {
var value = data, sign = 1, ch, base, digits = [];
if (value.indexOf("_") !== -1) {
value = value.replace(/_/g, "");
}
ch = value[0];
if (ch === "-" || ch === "+") {
if (ch === "-")
sign = -1;
value = value.slice(1);
ch = value[0];
}
if (value === "0")
return 0;
if (ch === "0") {
if (value[1] === "b")
return sign * parseInt(value.slice(2), 2);
if (value[1] === "x")
return sign * parseInt(value, 16);
return sign * parseInt(value, 8);
}
if (value.indexOf(":") !== -1) {
value.split(":").forEach(function(v) {
digits.unshift(parseInt(v, 10));
});
value = 0;
base = 1;
digits.forEach(function(d) {
value += d * base;
base *= 60;
});
return sign * value;
}
return sign * parseInt(value, 10);
}
function isInteger(object) {
return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object));
}
module2.exports = new Type("tag:yaml.org,2002:int", {
kind: "scalar",
resolve: resolveYamlInteger,
construct: constructYamlInteger,
predicate: isInteger,
represent: {
binary: function(obj) {
return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1);
},
octal: function(obj) {
return obj >= 0 ? "0" + obj.toString(8) : "-0" + obj.toString(8).slice(1);
},
decimal: function(obj) {
return obj.toString(10);
},
/* eslint-disable max-len */
hexadecimal: function(obj) {
return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1);
}
},
defaultStyle: "decimal",
styleAliases: {
binary: [2, "bin"],
octal: [8, "oct"],
decimal: [10, "dec"],
hexadecimal: [16, "hex"]
}
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/float.js
var require_float = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/float.js"(exports2, module2) {
"use strict";
var common = require_common();
var Type = require_type();
var YAML_FLOAT_PATTERN = new RegExp(
// 2.5e4, 2.5 and integers
"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"
);
function resolveYamlFloat(data) {
if (data === null)
return false;
if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_`
// Probably should update regexp & check speed
data[data.length - 1] === "_") {
return false;
}
return true;
}
function constructYamlFloat(data) {
var value, sign, base, digits;
value = data.replace(/_/g, "").toLowerCase();
sign = value[0] === "-" ? -1 : 1;
digits = [];
if ("+-".indexOf(value[0]) >= 0) {
value = value.slice(1);
}
if (value === ".inf") {
return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
} else if (value === ".nan") {
return NaN;
} else if (value.indexOf(":") >= 0) {
value.split(":").forEach(function(v) {
digits.unshift(parseFloat(v, 10));
});
value = 0;
base = 1;
digits.forEach(function(d) {
value += d * base;
base *= 60;
});
return sign * value;
}
return sign * parseFloat(value, 10);
}
var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;
function representYamlFloat(object, style) {
var res;
if (isNaN(object)) {
switch (style) {
case "lowercase":
return ".nan";
case "uppercase":
return ".NAN";
case "camelcase":
return ".NaN";
}
} else if (Number.POSITIVE_INFINITY === object) {
switch (style) {
case "lowercase":
return ".inf";
case "uppercase":
return ".INF";
case "camelcase":
return ".Inf";
}
} else if (Number.NEGATIVE_INFINITY === object) {
switch (style) {
case "lowercase":
return "-.inf";
case "uppercase":
return "-.INF";
case "camelcase":
return "-.Inf";
}
} else if (common.isNegativeZero(object)) {
return "-0.0";
}
res = object.toString(10);
return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res;
}
function isFloat(object) {
return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object));
}
module2.exports = new Type("tag:yaml.org,2002:float", {
kind: "scalar",
resolve: resolveYamlFloat,
construct: constructYamlFloat,
predicate: isFloat,
represent: representYamlFloat,
defaultStyle: "lowercase"
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/json.js
var require_json = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/json.js"(exports2, module2) {
"use strict";
var Schema = require_schema();
module2.exports = new Schema({
include: [
require_failsafe()
],
implicit: [
require_null(),
require_bool(),
require_int(),
require_float()
]
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/core.js
var require_core = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/core.js"(exports2, module2) {
"use strict";
var Schema = require_schema();
module2.exports = new Schema({
include: [
require_json()
]
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/timestamp.js
var require_timestamp = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/timestamp.js"(exports2, module2) {
"use strict";
var Type = require_type();
var YAML_DATE_REGEXP = new RegExp(
"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"
);
var YAML_TIMESTAMP_REGEXP = new RegExp(
"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$"
);
function resolveYamlTimestamp(data) {
if (data === null)
return false;
if (YAML_DATE_REGEXP.exec(data) !== null)
return true;
if (YAML_TIMESTAMP_REGEXP.exec(data) !== null)
return true;
return false;
}
function constructYamlTimestamp(data) {
var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date;
match = YAML_DATE_REGEXP.exec(data);
if (match === null)
match = YAML_TIMESTAMP_REGEXP.exec(data);
if (match === null)
throw new Error("Date resolve error");
year = +match[1];
month = +match[2] - 1;
day = +match[3];
if (!match[4]) {
return new Date(Date.UTC(year, month, day));
}
hour = +match[4];
minute = +match[5];
second = +match[6];
if (match[7]) {
fraction = match[7].slice(0, 3);
while (fraction.length < 3) {
fraction += "0";
}
fraction = +fraction;
}
if (match[9]) {
tz_hour = +match[10];
tz_minute = +(match[11] || 0);
delta = (tz_hour * 60 + tz_minute) * 6e4;
if (match[9] === "-")
delta = -delta;
}
date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
if (delta)
date.setTime(date.getTime() - delta);
return date;
}
function representYamlTimestamp(object) {
return object.toISOString();
}
module2.exports = new Type("tag:yaml.org,2002:timestamp", {
kind: "scalar",
resolve: resolveYamlTimestamp,
construct: constructYamlTimestamp,
instanceOf: Date,
represent: representYamlTimestamp
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/merge.js
var require_merge = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/merge.js"(exports2, module2) {
"use strict";
var Type = require_type();
function resolveYamlMerge(data) {
return data === "<<" || data === null;
}
module2.exports = new Type("tag:yaml.org,2002:merge", {
kind: "scalar",
resolve: resolveYamlMerge
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/binary.js
var require_binary = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/binary.js"(exports2, module2) {
"use strict";
var NodeBuffer;
try {
_require = require;
NodeBuffer = _require("buffer").Buffer;
} catch (__) {
}
var _require;
var Type = require_type();
var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";
function resolveYamlBinary(data) {
if (data === null)
return false;
var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;
for (idx = 0; idx < max; idx++) {
code = map.indexOf(data.charAt(idx));
if (code > 64)
continue;
if (code < 0)
return false;
bitlen += 6;
}
return bitlen % 8 === 0;
}
function constructYamlBinary(data) {
var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map = BASE64_MAP, bits = 0, result = [];
for (idx = 0; idx < max; idx++) {
if (idx % 4 === 0 && idx) {
result.push(bits >> 16 & 255);
result.push(bits >> 8 & 255);
result.push(bits & 255);
}
bits = bits << 6 | map.indexOf(input.charAt(idx));
}
tailbits = max % 4 * 6;
if (tailbits === 0) {
result.push(bits >> 16 & 255);
result.push(bits >> 8 & 255);
result.push(bits & 255);
} else if (tailbits === 18) {
result.push(bits >> 10 & 255);
result.push(bits >> 2 & 255);
} else if (tailbits === 12) {
result.push(bits >> 4 & 255);
}
if (NodeBuffer) {
return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);
}
return result;
}
function representYamlBinary(object) {
var result = "", bits = 0, idx, tail, max = object.length, map = BASE64_MAP;
for (idx = 0; idx < max; idx++) {
if (idx % 3 === 0 && idx) {
result += map[bits >> 18 & 63];
result += map[bits >> 12 & 63];
result += map[bits >> 6 & 63];
result += map[bits & 63];
}
bits = (bits << 8) + object[idx];
}
tail = max % 3;
if (tail === 0) {
result += map[bits >> 18 & 63];
result += map[bits >> 12 & 63];
result += map[bits >> 6 & 63];
result += map[bits & 63];
} else if (tail === 2) {
result += map[bits >> 10 & 63];
result += map[bits >> 4 & 63];
result += map[bits << 2 & 63];
result += map[64];
} else if (tail === 1) {
result += map[bits >> 2 & 63];
result += map[bits << 4 & 63];
result += map[64];
result += map[64];
}
return result;
}
function isBinary(object) {
return NodeBuffer && NodeBuffer.isBuffer(object);
}
module2.exports = new Type("tag:yaml.org,2002:binary", {
kind: "scalar",
resolve: resolveYamlBinary,
construct: constructYamlBinary,
predicate: isBinary,
represent: representYamlBinary
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/omap.js
var require_omap = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/omap.js"(exports2, module2) {
"use strict";
var Type = require_type();
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString = Object.prototype.toString;
function resolveYamlOmap(data) {
if (data === null)
return true;
var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data;
for (index = 0, length = object.length; index < length; index += 1) {
pair = object[index];
pairHasKey = false;
if (_toString.call(pair) !== "[object Object]")
return false;
for (pairKey in pair) {
if (_hasOwnProperty.call(pair, pairKey)) {
if (!pairHasKey)
pairHasKey = true;
else
return false;
}
}
if (!pairHasKey)
return false;
if (objectKeys.indexOf(pairKey) === -1)
objectKeys.push(pairKey);
else
return false;
}
return true;
}
function constructYamlOmap(data) {
return data !== null ? data : [];
}
module2.exports = new Type("tag:yaml.org,2002:omap", {
kind: "sequence",
resolve: resolveYamlOmap,
construct: constructYamlOmap
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/pairs.js
var require_pairs = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/pairs.js"(exports2, module2) {
"use strict";
var Type = require_type();
var _toString = Object.prototype.toString;
function resolveYamlPairs(data) {
if (data === null)
return true;
var index, length, pair, keys, result, object = data;
result = new Array(object.length);
for (index = 0, length = object.length; index < length; index += 1) {
pair = object[index];
if (_toString.call(pair) !== "[object Object]")
return false;
keys = Object.keys(pair);
if (keys.length !== 1)
return false;
result[index] = [keys[0], pair[keys[0]]];
}
return true;
}
function constructYamlPairs(data) {
if (data === null)
return [];
var index, length, pair, keys, result, object = data;
result = new Array(object.length);
for (index = 0, length = object.length; index < length; index += 1) {
pair = object[index];
keys = Object.keys(pair);
result[index] = [keys[0], pair[keys[0]]];
}
return result;
}
module2.exports = new Type("tag:yaml.org,2002:pairs", {
kind: "sequence",
resolve: resolveYamlPairs,
construct: constructYamlPairs
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/set.js
var require_set = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/set.js"(exports2, module2) {
"use strict";
var Type = require_type();
var _hasOwnProperty = Object.prototype.hasOwnProperty;
function resolveYamlSet(data) {
if (data === null)
return true;
var key, object = data;
for (key in object) {
if (_hasOwnProperty.call(object, key)) {
if (object[key] !== null)
return false;
}
}
return true;
}
function constructYamlSet(data) {
return data !== null ? data : {};
}
module2.exports = new Type("tag:yaml.org,2002:set", {
kind: "mapping",
resolve: resolveYamlSet,
construct: constructYamlSet
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js
var require_default_safe = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js"(exports2, module2) {
"use strict";
var Schema = require_schema();
module2.exports = new Schema({
include: [
require_core()
],
implicit: [
require_timestamp(),
require_merge()
],
explicit: [
require_binary(),
require_omap(),
require_pairs(),
require_set()
]
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js
var require_undefined = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js"(exports2, module2) {
"use strict";
var Type = require_type();
function resolveJavascriptUndefined() {
return true;
}
function constructJavascriptUndefined() {
return void 0;
}
function representJavascriptUndefined() {
return "";
}
function isUndefined(object) {
return typeof object === "undefined";
}
module2.exports = new Type("tag:yaml.org,2002:js/undefined", {
kind: "scalar",
resolve: resolveJavascriptUndefined,
construct: constructJavascriptUndefined,
predicate: isUndefined,
represent: representJavascriptUndefined
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js
var require_regexp = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js"(exports2, module2) {
"use strict";
var Type = require_type();
function resolveJavascriptRegExp(data) {
if (data === null)
return false;
if (data.length === 0)
return false;
var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = "";
if (regexp[0] === "/") {
if (tail)
modifiers = tail[1];
if (modifiers.length > 3)
return false;
if (regexp[regexp.length - modifiers.length - 1] !== "/")
return false;
}
return true;
}
function constructJavascriptRegExp(data) {
var regexp = data, tail = /\/([gim]*)$/.exec(data), modifiers = "";
if (regexp[0] === "/") {
if (tail)
modifiers = tail[1];
regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
}
return new RegExp(regexp, modifiers);
}
function representJavascriptRegExp(object) {
var result = "/" + object.source + "/";
if (object.global)
result += "g";
if (object.multiline)
result += "m";
if (object.ignoreCase)
result += "i";
return result;
}
function isRegExp(object) {
return Object.prototype.toString.call(object) === "[object RegExp]";
}
module2.exports = new Type("tag:yaml.org,2002:js/regexp", {
kind: "scalar",
resolve: resolveJavascriptRegExp,
construct: constructJavascriptRegExp,
predicate: isRegExp,
represent: representJavascriptRegExp
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/function.js
var require_function = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/type/js/function.js"(exports2, module2) {
"use strict";
var esprima;
try {
_require = require;
esprima = _require("esprima");
} catch (_) {
if (typeof window !== "undefined")
esprima = window.esprima;
}
var _require;
var Type = require_type();
function resolveJavascriptFunction(data) {
if (data === null)
return false;
try {
var source = "(" + data + ")", ast = esprima.parse(source, { range: true });
if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") {
return false;
}
return true;
} catch (err) {
return false;
}
}
function constructJavascriptFunction(data) {
var source = "(" + data + ")", ast = esprima.parse(source, { range: true }), params = [], body;
if (ast.type !== "Program" || ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement" || ast.body[0].expression.type !== "ArrowFunctionExpression" && ast.body[0].expression.type !== "FunctionExpression") {
throw new Error("Failed to resolve function");
}
ast.body[0].expression.params.forEach(function(param) {
params.push(param.name);
});
body = ast.body[0].expression.body.range;
if (ast.body[0].expression.body.type === "BlockStatement") {
return new Function(params, source.slice(body[0] + 1, body[1] - 1));
}
return new Function(params, "return " + source.slice(body[0], body[1]));
}
function representJavascriptFunction(object) {
return object.toString();
}
function isFunction(object) {
return Object.prototype.toString.call(object) === "[object Function]";
}
module2.exports = new Type("tag:yaml.org,2002:js/function", {
kind: "scalar",
resolve: resolveJavascriptFunction,
construct: constructJavascriptFunction,
predicate: isFunction,
represent: representJavascriptFunction
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/default_full.js
var require_default_full = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/schema/default_full.js"(exports2, module2) {
"use strict";
var Schema = require_schema();
module2.exports = Schema.DEFAULT = new Schema({
include: [
require_default_safe()
],
explicit: [
require_undefined(),
require_regexp(),
require_function()
]
});
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/loader.js
var require_loader = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/loader.js"(exports2, module2) {
"use strict";
var common = require_common();
var YAMLException = require_exception();
var Mark = require_mark();
var DEFAULT_SAFE_SCHEMA = require_default_safe();
var DEFAULT_FULL_SCHEMA = require_default_full();
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var CONTEXT_FLOW_IN = 1;
var CONTEXT_FLOW_OUT = 2;
var CONTEXT_BLOCK_IN = 3;
var CONTEXT_BLOCK_OUT = 4;
var CHOMPING_CLIP = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP = 3;
var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;
function _class(obj) {
return Object.prototype.toString.call(obj);
}
function is_EOL(c) {
return c === 10 || c === 13;
}
function is_WHITE_SPACE(c) {
return c === 9 || c === 32;
}
function is_WS_OR_EOL(c) {
return c === 9 || c === 32 || c === 10 || c === 13;
}
function is_FLOW_INDICATOR(c) {
return c === 44 || c === 91 || c === 93 || c === 123 || c === 125;
}
function fromHexCode(c) {
var lc;
if (48 <= c && c <= 57) {
return c - 48;
}
lc = c | 32;
if (97 <= lc && lc <= 102) {
return lc - 97 + 10;
}
return -1;
}
function escapedHexLen(c) {
if (c === 120) {
return 2;
}
if (c === 117) {
return 4;
}
if (c === 85) {
return 8;
}
return 0;
}
function fromDecimalCode(c) {
if (48 <= c && c <= 57) {
return c - 48;
}
return -1;
}
function simpleEscapeSequence(c) {
return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "\x1B" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : "";
}
function charFromCodepoint(c) {
if (c <= 65535) {
return String.fromCharCode(c);
}
return String.fromCharCode(
(c - 65536 >> 10) + 55296,
(c - 65536 & 1023) + 56320
);
}
var simpleEscapeCheck = new Array(256);
var simpleEscapeMap = new Array(256);
for (i = 0; i < 256; i++) {
simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
simpleEscapeMap[i] = simpleEscapeSequence(i);
}
var i;
function State(input, options2) {
this.input = input;
this.filename = options2["filename"] || null;
this.schema = options2["schema"] || DEFAULT_FULL_SCHEMA;
this.onWarning = options2["onWarning"] || null;
this.legacy = options2["legacy"] || false;
this.json = options2["json"] || false;
this.listener = options2["listener"] || null;
this.implicitTypes = this.schema.compiledImplicit;
this.typeMap = this.schema.compiledTypeMap;
this.length = input.length;
this.position = 0;
this.line = 0;
this.lineStart = 0;
this.lineIndent = 0;
this.documents = [];
}
function generateError(state, message) {
return new YAMLException(
message,
new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)
);
}
function throwError(state, message) {
throw generateError(state, message);
}
function throwWarning(state, message) {
if (state.onWarning) {
state.onWarning.call(null, generateError(state, message));
}
}
var directiveHandlers = {
YAML: function handleYamlDirective(state, name, args) {
var match, major, minor;
if (state.version !== null) {
throwError(state, "duplication of %YAML directive");
}
if (args.length !== 1) {
throwError(state, "YAML directive accepts exactly one argument");
}
match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);
if (match === null) {
throwError(state, "ill-formed argument of the YAML directive");
}
major = parseInt(match[1], 10);
minor = parseInt(match[2], 10);
if (major !== 1) {
throwError(state, "unacceptable YAML version of the document");
}
state.version = args[0];
state.checkLineBreaks = minor < 2;
if (minor !== 1 && minor !== 2) {
throwWarning(state, "unsupported YAML version of the document");
}
},
TAG: function handleTagDirective(state, name, args) {
var handle, prefix;
if (args.length !== 2) {
throwError(state, "TAG directive accepts exactly two arguments");
}
handle = args[0];
prefix = args[1];
if (!PATTERN_TAG_HANDLE.test(handle)) {
throwError(state, "ill-formed tag handle (first argument) of the TAG directive");
}
if (_hasOwnProperty.call(state.tagMap, handle)) {
throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
}
if (!PATTERN_TAG_URI.test(prefix)) {
throwError(state, "ill-formed tag prefix (second argument) of the TAG directive");
}
state.tagMap[handle] = prefix;
}
};
function captureSegment(state, start, end, checkJson) {
var _position, _length, _character, _result;
if (start < end) {
_result = state.input.slice(start, end);
if (checkJson) {
for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
_character = _result.charCodeAt(_position);
if (!(_character === 9 || 32 <= _character && _character <= 1114111)) {
throwError(state, "expected valid JSON character");
}
}
} else if (PATTERN_NON_PRINTABLE.test(_result)) {
throwError(state, "the stream contains non-printable characters");
}
state.result += _result;
}
}
function mergeMappings(state, destination, source, overridableKeys) {
var sourceKeys, key, index, quantity;
if (!common.isObject(source)) {
throwError(state, "cannot merge mappings; the provided source object is unacceptable");
}
sourceKeys = Object.keys(source);
for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
key = sourceKeys[index];
if (!_hasOwnProperty.call(destination, key)) {
destination[key] = source[key];
overridableKeys[key] = true;
}
}
}
function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {
var index, quantity;
if (Array.isArray(keyNode)) {
keyNode = Array.prototype.slice.call(keyNode);
for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
if (Array.isArray(keyNode[index])) {
throwError(state, "nested arrays are not supported inside keys");
}
if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") {
keyNode[index] = "[object Object]";
}
}
}
if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") {
keyNode = "[object Object]";
}
keyNode = String(keyNode);
if (_result === null) {
_result = {};
}
if (keyTag === "tag:yaml.org,2002:merge") {
if (Array.isArray(valueNode)) {
for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
mergeMappings(state, _result, valueNode[index], overridableKeys);
}
} else {
mergeMappings(state, _result, valueNode, overridableKeys);
}
} else {
if (!state.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) {
state.line = startLine || state.line;
state.position = startPos || state.position;
throwError(state, "duplicated mapping key");
}
_result[keyNode] = valueNode;
delete overridableKeys[keyNode];
}
return _result;
}
function readLineBreak(state) {
var ch;
ch = state.input.charCodeAt(state.position);
if (ch === 10) {
state.position++;
} else if (ch === 13) {
state.position++;
if (state.input.charCodeAt(state.position) === 10) {
state.position++;
}
} else {
throwError(state, "a line break is expected");
}
state.line += 1;
state.lineStart = state.position;
}
function skipSeparationSpace(state, allowComments, checkIndent) {
var lineBreaks = 0, ch = state.input.charCodeAt(state.position);
while (ch !== 0) {
while (is_WHITE_SPACE(ch)) {
ch = state.input.charCodeAt(++state.position);
}
if (allowComments && ch === 35) {
do {
ch = state.input.charCodeAt(++state.position);
} while (ch !== 10 && ch !== 13 && ch !== 0);
}
if (is_EOL(ch)) {
readLineBreak(state);
ch = state.input.charCodeAt(state.position);
lineBreaks++;
state.lineIndent = 0;
while (ch === 32) {
state.lineIndent++;
ch = state.input.charCodeAt(++state.position);
}
} else {
break;
}
}
if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
throwWarning(state, "deficient indentation");
}
return lineBreaks;
}
function testDocumentSeparator(state) {
var _position = state.position, ch;
ch = state.input.charCodeAt(_position);
if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) {
_position += 3;
ch = state.input.charCodeAt(_position);
if (ch === 0 || is_WS_OR_EOL(ch)) {
return true;
}
}
return false;
}
function writeFoldedLines(state, count) {
if (count === 1) {
state.result += " ";
} else if (count > 1) {
state.result += common.repeat("\n", count - 1);
}
}
function readPlainScalar(state, nodeIndent, withinFlowCollection) {
var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch;
ch = state.input.charCodeAt(state.position);
if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) {
return false;
}
if (ch === 63 || ch === 45) {
following = state.input.charCodeAt(state.position + 1);
if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
return false;
}
}
state.kind = "scalar";
state.result = "";
captureStart = captureEnd = state.position;
hasPendingContent = false;
while (ch !== 0) {
if (ch === 58) {
following = state.input.charCodeAt(state.position + 1);
if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) {
break;
}
} else if (ch === 35) {
preceding = state.input.charCodeAt(state.position - 1);
if (is_WS_OR_EOL(preceding)) {
break;
}
} else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) {
break;
} else if (is_EOL(ch)) {
_line = state.line;
_lineStart = state.lineStart;
_lineIndent = state.lineIndent;
skipSeparationSpace(state, false, -1);
if (state.lineIndent >= nodeIndent) {
hasPendingContent = true;
ch = state.input.charCodeAt(state.position);
continue;
} else {
state.position = captureEnd;
state.line = _line;
state.lineStart = _lineStart;
state.lineIndent = _lineIndent;
break;
}
}
if (hasPendingContent) {
captureSegment(state, captureStart, captureEnd, false);
writeFoldedLines(state, state.line - _line);
captureStart = captureEnd = state.position;
hasPendingContent = false;
}
if (!is_WHITE_SPACE(ch)) {
captureEnd = state.position + 1;
}
ch = state.input.charCodeAt(++state.position);
}
captureSegment(state, captureStart, captureEnd, false);
if (state.result) {
return true;
}
state.kind = _kind;
state.result = _result;
return false;
}
function readSingleQuotedScalar(state, nodeIndent) {
var ch, captureStart, captureEnd;
ch = state.input.charCodeAt(state.position);
if (ch !== 39) {
return false;
}
state.kind = "scalar";
state.result = "";
state.position++;
captureStart = captureEnd = state.position;
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
if (ch === 39) {
captureSegment(state, captureStart, state.position, true);
ch = state.input.charCodeAt(++state.position);
if (ch === 39) {
captureStart = state.position;
state.position++;
captureEnd = state.position;
} else {
return true;
}
} else if (is_EOL(ch)) {
captureSegment(state, captureStart, captureEnd, true);
writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
captureStart = captureEnd = state.position;
} else if (state.position === state.lineStart && testDocumentSeparator(state)) {
throwError(state, "unexpected end of the document within a single quoted scalar");
} else {
state.position++;
captureEnd = state.position;
}
}
throwError(state, "unexpected end of the stream within a single quoted scalar");
}
function readDoubleQuotedScalar(state, nodeIndent) {
var captureStart, captureEnd, hexLength, hexResult, tmp, ch;
ch = state.input.charCodeAt(state.position);
if (ch !== 34) {
return false;
}
state.kind = "scalar";
state.result = "";
state.position++;
captureStart = captureEnd = state.position;
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
if (ch === 34) {
captureSegment(state, captureStart, state.position, true);
state.position++;
return true;
} else if (ch === 92) {
captureSegment(state, captureStart, state.position, true);
ch = state.input.charCodeAt(++state.position);
if (is_EOL(ch)) {
skipSeparationSpace(state, false, nodeIndent);
} else if (ch < 256 && simpleEscapeCheck[ch]) {
state.result += simpleEscapeMap[ch];
state.position++;
} else if ((tmp = escapedHexLen(ch)) > 0) {
hexLength = tmp;
hexResult = 0;
for (; hexLength > 0; hexLength--) {
ch = state.input.charCodeAt(++state.position);
if ((tmp = fromHexCode(ch)) >= 0) {
hexResult = (hexResult << 4) + tmp;
} else {
throwError(state, "expected hexadecimal character");
}
}
state.result += charFromCodepoint(hexResult);
state.position++;
} else {
throwError(state, "unknown escape sequence");
}
captureStart = captureEnd = state.position;
} else if (is_EOL(ch)) {
captureSegment(state, captureStart, captureEnd, true);
writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
captureStart = captureEnd = state.position;
} else if (state.position === state.lineStart && testDocumentSeparator(state)) {
throwError(state, "unexpected end of the document within a double quoted scalar");
} else {
state.position++;
captureEnd = state.position;
}
}
throwError(state, "unexpected end of the stream within a double quoted scalar");
}
function readFlowCollection(state, nodeIndent) {
var readNext = true, _line, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch;
ch = state.input.charCodeAt(state.position);
if (ch === 91) {
terminator = 93;
isMapping = false;
_result = [];
} else if (ch === 123) {
terminator = 125;
isMapping = true;
_result = {};
} else {
return false;
}
if (state.anchor !== null) {
state.anchorMap[state.anchor] = _result;
}
ch = state.input.charCodeAt(++state.position);
while (ch !== 0) {
skipSeparationSpace(state, true, nodeIndent);
ch = state.input.charCodeAt(state.position);
if (ch === terminator) {
state.position++;
state.tag = _tag;
state.anchor = _anchor;
state.kind = isMapping ? "mapping" : "sequence";
state.result = _result;
return true;
} else if (!readNext) {
throwError(state, "missed comma between flow collection entries");
}
keyTag = keyNode = valueNode = null;
isPair = isExplicitPair = false;
if (ch === 63) {
following = state.input.charCodeAt(state.position + 1);
if (is_WS_OR_EOL(following)) {
isPair = isExplicitPair = true;
state.position++;
skipSeparationSpace(state, true, nodeIndent);
}
}
_line = state.line;
composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
keyTag = state.tag;
keyNode = state.result;
skipSeparationSpace(state, true, nodeIndent);
ch = state.input.charCodeAt(state.position);
if ((isExplicitPair || state.line === _line) && ch === 58) {
isPair = true;
ch = state.input.charCodeAt(++state.position);
skipSeparationSpace(state, true, nodeIndent);
composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
valueNode = state.result;
}
if (isMapping) {
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);
} else if (isPair) {
_result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));
} else {
_result.push(keyNode);
}
skipSeparationSpace(state, true, nodeIndent);
ch = state.input.charCodeAt(state.position);
if (ch === 44) {
readNext = true;
ch = state.input.charCodeAt(++state.position);
} else {
readNext = false;
}
}
throwError(state, "unexpected end of the stream within a flow collection");
}
function readBlockScalar(state, nodeIndent) {
var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch;
ch = state.input.charCodeAt(state.position);
if (ch === 124) {
folding = false;
} else if (ch === 62) {
folding = true;
} else {
return false;
}
state.kind = "scalar";
state.result = "";
while (ch !== 0) {
ch = state.input.charCodeAt(++state.position);
if (ch === 43 || ch === 45) {
if (CHOMPING_CLIP === chomping) {
chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP;
} else {
throwError(state, "repeat of a chomping mode identifier");
}
} else if ((tmp = fromDecimalCode(ch)) >= 0) {
if (tmp === 0) {
throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one");
} else if (!detectedIndent) {
textIndent = nodeIndent + tmp - 1;
detectedIndent = true;
} else {
throwError(state, "repeat of an indentation width identifier");
}
} else {
break;
}
}
if (is_WHITE_SPACE(ch)) {
do {
ch = state.input.charCodeAt(++state.position);
} while (is_WHITE_SPACE(ch));
if (ch === 35) {
do {
ch = state.input.charCodeAt(++state.position);
} while (!is_EOL(ch) && ch !== 0);
}
}
while (ch !== 0) {
readLineBreak(state);
state.lineIndent = 0;
ch = state.input.charCodeAt(state.position);
while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) {
state.lineIndent++;
ch = state.input.charCodeAt(++state.position);
}
if (!detectedIndent && state.lineIndent > textIndent) {
textIndent = state.lineIndent;
}
if (is_EOL(ch)) {
emptyLines++;
continue;
}
if (state.lineIndent < textIndent) {
if (chomping === CHOMPING_KEEP) {
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
} else if (chomping === CHOMPING_CLIP) {
if (didReadContent) {
state.result += "\n";
}
}
break;
}
if (folding) {
if (is_WHITE_SPACE(ch)) {
atMoreIndented = true;
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
} else if (atMoreIndented) {
atMoreIndented = false;
state.result += common.repeat("\n", emptyLines + 1);
} else if (emptyLines === 0) {
if (didReadContent) {
state.result += " ";
}
} else {
state.result += common.repeat("\n", emptyLines);
}
} else {
state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines);
}
didReadContent = true;
detectedIndent = true;
emptyLines = 0;
captureStart = state.position;
while (!is_EOL(ch) && ch !== 0) {
ch = state.input.charCodeAt(++state.position);
}
captureSegment(state, captureStart, state.position, false);
}
return true;
}
function readBlockSequence(state, nodeIndent) {
var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch;
if (state.anchor !== null) {
state.anchorMap[state.anchor] = _result;
}
ch = state.input.charCodeAt(state.position);
while (ch !== 0) {
if (ch !== 45) {
break;
}
following = state.input.charCodeAt(state.position + 1);
if (!is_WS_OR_EOL(following)) {
break;
}
detected = true;
state.position++;
if (skipSeparationSpace(state, true, -1)) {
if (state.lineIndent <= nodeIndent) {
_result.push(null);
ch = state.input.charCodeAt(state.position);
continue;
}
}
_line = state.line;
composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
_result.push(state.result);
skipSeparationSpace(state, true, -1);
ch = state.input.charCodeAt(state.position);
if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) {
throwError(state, "bad indentation of a sequence entry");
} else if (state.lineIndent < nodeIndent) {
break;
}
}
if (detected) {
state.tag = _tag;
state.anchor = _anchor;
state.kind = "sequence";
state.result = _result;
return true;
}
return false;
}
function readBlockMapping(state, nodeIndent, flowIndent) {
var following, allowCompact, _line, _pos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch;
if (state.anchor !== null) {
state.anchorMap[state.anchor] = _result;
}
ch = state.input.charCodeAt(state.position);
while (ch !== 0) {
following = state.input.charCodeAt(state.position + 1);
_line = state.line;
_pos = state.position;
if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) {
if (ch === 63) {
if (atExplicitKey) {
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
keyTag = keyNode = valueNode = null;
}
detected = true;
atExplicitKey = true;
allowCompact = true;
} else if (atExplicitKey) {
atExplicitKey = false;
allowCompact = true;
} else {
throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line");
}
state.position += 1;
ch = following;
} else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
if (state.line === _line) {
ch = state.input.charCodeAt(state.position);
while (is_WHITE_SPACE(ch)) {
ch = state.input.charCodeAt(++state.position);
}
if (ch === 58) {
ch = state.input.charCodeAt(++state.position);
if (!is_WS_OR_EOL(ch)) {
throwError(state, "a whitespace character is expected after the key-value separator within a block mapping");
}
if (atExplicitKey) {
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
keyTag = keyNode = valueNode = null;
}
detected = true;
atExplicitKey = false;
allowCompact = false;
keyTag = state.tag;
keyNode = state.result;
} else if (detected) {
throwError(state, "can not read an implicit mapping pair; a colon is missed");
} else {
state.tag = _tag;
state.anchor = _anchor;
return true;
}
} else if (detected) {
throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key");
} else {
state.tag = _tag;
state.anchor = _anchor;
return true;
}
} else {
break;
}
if (state.line === _line || state.lineIndent > nodeIndent) {
if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
if (atExplicitKey) {
keyNode = state.result;
} else {
valueNode = state.result;
}
}
if (!atExplicitKey) {
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);
keyTag = keyNode = valueNode = null;
}
skipSeparationSpace(state, true, -1);
ch = state.input.charCodeAt(state.position);
}
if (state.lineIndent > nodeIndent && ch !== 0) {
throwError(state, "bad indentation of a mapping entry");
} else if (state.lineIndent < nodeIndent) {
break;
}
}
if (atExplicitKey) {
storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);
}
if (detected) {
state.tag = _tag;
state.anchor = _anchor;
state.kind = "mapping";
state.result = _result;
}
return detected;
}
function readTagProperty(state) {
var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch;
ch = state.input.charCodeAt(state.position);
if (ch !== 33)
return false;
if (state.tag !== null) {
throwError(state, "duplication of a tag property");
}
ch = state.input.charCodeAt(++state.position);
if (ch === 60) {
isVerbatim = true;
ch = state.input.charCodeAt(++state.position);
} else if (ch === 33) {
isNamed = true;
tagHandle = "!!";
ch = state.input.charCodeAt(++state.position);
} else {
tagHandle = "!";
}
_position = state.position;
if (isVerbatim) {
do {
ch = state.input.charCodeAt(++state.position);
} while (ch !== 0 && ch !== 62);
if (state.position < state.length) {
tagName = state.input.slice(_position, state.position);
ch = state.input.charCodeAt(++state.position);
} else {
throwError(state, "unexpected end of the stream within a verbatim tag");
}
} else {
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
if (ch === 33) {
if (!isNamed) {
tagHandle = state.input.slice(_position - 1, state.position + 1);
if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
throwError(state, "named tag handle cannot contain such characters");
}
isNamed = true;
_position = state.position + 1;
} else {
throwError(state, "tag suffix cannot contain exclamation marks");
}
}
ch = state.input.charCodeAt(++state.position);
}
tagName = state.input.slice(_position, state.position);
if (PATTERN_FLOW_INDICATORS.test(tagName)) {
throwError(state, "tag suffix cannot contain flow indicator characters");
}
}
if (tagName && !PATTERN_TAG_URI.test(tagName)) {
throwError(state, "tag name cannot contain such characters: " + tagName);
}
if (isVerbatim) {
state.tag = tagName;
} else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
state.tag = state.tagMap[tagHandle] + tagName;
} else if (tagHandle === "!") {
state.tag = "!" + tagName;
} else if (tagHandle === "!!") {
state.tag = "tag:yaml.org,2002:" + tagName;
} else {
throwError(state, 'undeclared tag handle "' + tagHandle + '"');
}
return true;
}
function readAnchorProperty(state) {
var _position, ch;
ch = state.input.charCodeAt(state.position);
if (ch !== 38)
return false;
if (state.anchor !== null) {
throwError(state, "duplication of an anchor property");
}
ch = state.input.charCodeAt(++state.position);
_position = state.position;
while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
ch = state.input.charCodeAt(++state.position);
}
if (state.position === _position) {
throwError(state, "name of an anchor node must contain at least one character");
}
state.anchor = state.input.slice(_position, state.position);
return true;
}
function readAlias(state) {
var _position, alias, ch;
ch = state.input.charCodeAt(state.position);
if (ch !== 42)
return false;
ch = state.input.charCodeAt(++state.position);
_position = state.position;
while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
ch = state.input.charCodeAt(++state.position);
}
if (state.position === _position) {
throwError(state, "name of an alias node must contain at least one character");
}
alias = state.input.slice(_position, state.position);
if (!_hasOwnProperty.call(state.anchorMap, alias)) {
throwError(state, 'unidentified alias "' + alias + '"');
}
state.result = state.anchorMap[alias];
skipSeparationSpace(state, true, -1);
return true;
}
function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, type, flowIndent, blockIndent;
if (state.listener !== null) {
state.listener("open", state);
}
state.tag = null;
state.anchor = null;
state.kind = null;
state.result = null;
allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext;
if (allowToSeek) {
if (skipSeparationSpace(state, true, -1)) {
atNewLine = true;
if (state.lineIndent > parentIndent) {
indentStatus = 1;
} else if (state.lineIndent === parentIndent) {
indentStatus = 0;
} else if (state.lineIndent < parentIndent) {
indentStatus = -1;
}
}
}
if (indentStatus === 1) {
while (readTagProperty(state) || readAnchorProperty(state)) {
if (skipSeparationSpace(state, true, -1)) {
atNewLine = true;
allowBlockCollections = allowBlockStyles;
if (state.lineIndent > parentIndent) {
indentStatus = 1;
} else if (state.lineIndent === parentIndent) {
indentStatus = 0;
} else if (state.lineIndent < parentIndent) {
indentStatus = -1;
}
} else {
allowBlockCollections = false;
}
}
}
if (allowBlockCollections) {
allowBlockCollections = atNewLine || allowCompact;
}
if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
flowIndent = parentIndent;
} else {
flowIndent = parentIndent + 1;
}
blockIndent = state.position - state.lineStart;
if (indentStatus === 1) {
if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) {
hasContent = true;
} else {
if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) {
hasContent = true;
} else if (readAlias(state)) {
hasContent = true;
if (state.tag !== null || state.anchor !== null) {
throwError(state, "alias node should not have any properties");
}
} else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
hasContent = true;
if (state.tag === null) {
state.tag = "?";
}
}
if (state.anchor !== null) {
state.anchorMap[state.anchor] = state.result;
}
}
} else if (indentStatus === 0) {
hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
}
}
if (state.tag !== null && state.tag !== "!") {
if (state.tag === "?") {
if (state.result !== null && state.kind !== "scalar") {
throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
}
for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
type = state.implicitTypes[typeIndex];
if (type.resolve(state.result)) {
state.result = type.construct(state.result);
state.tag = type.tag;
if (state.anchor !== null) {
state.anchorMap[state.anchor] = state.result;
}
break;
}
}
} else if (_hasOwnProperty.call(state.typeMap[state.kind || "fallback"], state.tag)) {
type = state.typeMap[state.kind || "fallback"][state.tag];
if (state.result !== null && type.kind !== state.kind) {
throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
}
if (!type.resolve(state.result)) {
throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag");
} else {
state.result = type.construct(state.result);
if (state.anchor !== null) {
state.anchorMap[state.anchor] = state.result;
}
}
} else {
throwError(state, "unknown tag !<" + state.tag + ">");
}
}
if (state.listener !== null) {
state.listener("close", state);
}
return state.tag !== null || state.anchor !== null || hasContent;
}
function readDocument(state) {
var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch;
state.version = null;
state.checkLineBreaks = state.legacy;
state.tagMap = {};
state.anchorMap = {};
while ((ch = state.input.charCodeAt(state.position)) !== 0) {
skipSeparationSpace(state, true, -1);
ch = state.input.charCodeAt(state.position);
if (state.lineIndent > 0 || ch !== 37) {
break;
}
hasDirectives = true;
ch = state.input.charCodeAt(++state.position);
_position = state.position;
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
ch = state.input.charCodeAt(++state.position);
}
directiveName = state.input.slice(_position, state.position);
directiveArgs = [];
if (directiveName.length < 1) {
throwError(state, "directive name must not be less than one character in length");
}
while (ch !== 0) {
while (is_WHITE_SPACE(ch)) {
ch = state.input.charCodeAt(++state.position);
}
if (ch === 35) {
do {
ch = state.input.charCodeAt(++state.position);
} while (ch !== 0 && !is_EOL(ch));
break;
}
if (is_EOL(ch))
break;
_position = state.position;
while (ch !== 0 && !is_WS_OR_EOL(ch)) {
ch = state.input.charCodeAt(++state.position);
}
directiveArgs.push(state.input.slice(_position, state.position));
}
if (ch !== 0)
readLineBreak(state);
if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
directiveHandlers[directiveName](state, directiveName, directiveArgs);
} else {
throwWarning(state, 'unknown document directive "' + directiveName + '"');
}
}
skipSeparationSpace(state, true, -1);
if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) {
state.position += 3;
skipSeparationSpace(state, true, -1);
} else if (hasDirectives) {
throwError(state, "directives end mark is expected");
}
composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
skipSeparationSpace(state, true, -1);
if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
throwWarning(state, "non-ASCII line breaks are interpreted as content");
}
state.documents.push(state.result);
if (state.position === state.lineStart && testDocumentSeparator(state)) {
if (state.input.charCodeAt(state.position) === 46) {
state.position += 3;
skipSeparationSpace(state, true, -1);
}
return;
}
if (state.position < state.length - 1) {
throwError(state, "end of the stream or a document separator is expected");
} else {
return;
}
}
function loadDocuments(input, options2) {
input = String(input);
options2 = options2 || {};
if (input.length !== 0) {
if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) {
input += "\n";
}
if (input.charCodeAt(0) === 65279) {
input = input.slice(1);
}
}
var state = new State(input, options2);
var nullpos = input.indexOf("\0");
if (nullpos !== -1) {
state.position = nullpos;
throwError(state, "null byte is not allowed in input");
}
state.input += "\0";
while (state.input.charCodeAt(state.position) === 32) {
state.lineIndent += 1;
state.position += 1;
}
while (state.position < state.length - 1) {
readDocument(state);
}
return state.documents;
}
function loadAll(input, iterator, options2) {
if (iterator !== null && typeof iterator === "object" && typeof options2 === "undefined") {
options2 = iterator;
iterator = null;
}
var documents = loadDocuments(input, options2);
if (typeof iterator !== "function") {
return documents;
}
for (var index = 0, length = documents.length; index < length; index += 1) {
iterator(documents[index]);
}
}
function load(input, options2) {
var documents = loadDocuments(input, options2);
if (documents.length === 0) {
return void 0;
} else if (documents.length === 1) {
return documents[0];
}
throw new YAMLException("expected a single document in the stream, but found more");
}
function safeLoadAll(input, iterator, options2) {
if (typeof iterator === "object" && iterator !== null && typeof options2 === "undefined") {
options2 = iterator;
iterator = null;
}
return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options2));
}
function safeLoad(input, options2) {
return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options2));
}
module2.exports.loadAll = loadAll;
module2.exports.load = load;
module2.exports.safeLoadAll = safeLoadAll;
module2.exports.safeLoad = safeLoad;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/dumper.js
var require_dumper = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml/dumper.js"(exports2, module2) {
"use strict";
var common = require_common();
var YAMLException = require_exception();
var DEFAULT_FULL_SCHEMA = require_default_full();
var DEFAULT_SAFE_SCHEMA = require_default_safe();
var _toString = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var CHAR_TAB = 9;
var CHAR_LINE_FEED = 10;
var CHAR_CARRIAGE_RETURN = 13;
var CHAR_SPACE = 32;
var CHAR_EXCLAMATION = 33;
var CHAR_DOUBLE_QUOTE = 34;
var CHAR_SHARP = 35;
var CHAR_PERCENT = 37;
var CHAR_AMPERSAND = 38;
var CHAR_SINGLE_QUOTE = 39;
var CHAR_ASTERISK = 42;
var CHAR_COMMA = 44;
var CHAR_MINUS = 45;
var CHAR_COLON = 58;
var CHAR_EQUALS = 61;
var CHAR_GREATER_THAN = 62;
var CHAR_QUESTION = 63;
var CHAR_COMMERCIAL_AT = 64;
var CHAR_LEFT_SQUARE_BRACKET = 91;
var CHAR_RIGHT_SQUARE_BRACKET = 93;
var CHAR_GRAVE_ACCENT = 96;
var CHAR_LEFT_CURLY_BRACKET = 123;
var CHAR_VERTICAL_LINE = 124;
var CHAR_RIGHT_CURLY_BRACKET = 125;
var ESCAPE_SEQUENCES = {};
ESCAPE_SEQUENCES[0] = "\\0";
ESCAPE_SEQUENCES[7] = "\\a";
ESCAPE_SEQUENCES[8] = "\\b";
ESCAPE_SEQUENCES[9] = "\\t";
ESCAPE_SEQUENCES[10] = "\\n";
ESCAPE_SEQUENCES[11] = "\\v";
ESCAPE_SEQUENCES[12] = "\\f";
ESCAPE_SEQUENCES[13] = "\\r";
ESCAPE_SEQUENCES[27] = "\\e";
ESCAPE_SEQUENCES[34] = '\\"';
ESCAPE_SEQUENCES[92] = "\\\\";
ESCAPE_SEQUENCES[133] = "\\N";
ESCAPE_SEQUENCES[160] = "\\_";
ESCAPE_SEQUENCES[8232] = "\\L";
ESCAPE_SEQUENCES[8233] = "\\P";
var DEPRECATED_BOOLEANS_SYNTAX = [
"y",
"Y",
"yes",
"Yes",
"YES",
"on",
"On",
"ON",
"n",
"N",
"no",
"No",
"NO",
"off",
"Off",
"OFF"
];
function compileStyleMap(schema, map) {
var result, keys, index, length, tag, style, type;
if (map === null)
return {};
result = {};
keys = Object.keys(map);
for (index = 0, length = keys.length; index < length; index += 1) {
tag = keys[index];
style = String(map[tag]);
if (tag.slice(0, 2) === "!!") {
tag = "tag:yaml.org,2002:" + tag.slice(2);
}
type = schema.compiledTypeMap["fallback"][tag];
if (type && _hasOwnProperty.call(type.styleAliases, style)) {
style = type.styleAliases[style];
}
result[tag] = style;
}
return result;
}
function encodeHex(character) {
var string, handle, length;
string = character.toString(16).toUpperCase();
if (character <= 255) {
handle = "x";
length = 2;
} else if (character <= 65535) {
handle = "u";
length = 4;
} else if (character <= 4294967295) {
handle = "U";
length = 8;
} else {
throw new YAMLException("code point within a string may not be greater than 0xFFFFFFFF");
}
return "\\" + handle + common.repeat("0", length - string.length) + string;
}
function State(options2) {
this.schema = options2["schema"] || DEFAULT_FULL_SCHEMA;
this.indent = Math.max(1, options2["indent"] || 2);
this.noArrayIndent = options2["noArrayIndent"] || false;
this.skipInvalid = options2["skipInvalid"] || false;
this.flowLevel = common.isNothing(options2["flowLevel"]) ? -1 : options2["flowLevel"];
this.styleMap = compileStyleMap(this.schema, options2["styles"] || null);
this.sortKeys = options2["sortKeys"] || false;
this.lineWidth = options2["lineWidth"] || 80;
this.noRefs = options2["noRefs"] || false;
this.noCompatMode = options2["noCompatMode"] || false;
this.condenseFlow = options2["condenseFlow"] || false;
this.implicitTypes = this.schema.compiledImplicit;
this.explicitTypes = this.schema.compiledExplicit;
this.tag = null;
this.result = "";
this.duplicates = [];
this.usedDuplicates = null;
}
function indentString(string, spaces) {
var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string.length;
while (position < length) {
next = string.indexOf("\n", position);
if (next === -1) {
line = string.slice(position);
position = length;
} else {
line = string.slice(position, next + 1);
position = next + 1;
}
if (line.length && line !== "\n")
result += ind;
result += line;
}
return result;
}
function generateNextLine(state, level) {
return "\n" + common.repeat(" ", state.indent * level);
}
function testImplicitResolving(state, str2) {
var index, length, type;
for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
type = state.implicitTypes[index];
if (type.resolve(str2)) {
return true;
}
}
return false;
}
function isWhitespace(c) {
return c === CHAR_SPACE || c === CHAR_TAB;
}
function isPrintable(c) {
return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== 65279 || 65536 <= c && c <= 1114111;
}
function isNsChar(c) {
return isPrintable(c) && !isWhitespace(c) && c !== 65279 && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED;
}
function isPlainSafe(c, prev) {
return isPrintable(c) && c !== 65279 && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev));
}
function isPlainSafeFirst(c) {
return isPrintable(c) && c !== 65279 && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT;
}
function needIndentIndicator(string) {
var leadingSpaceRe = /^\n* /;
return leadingSpaceRe.test(string);
}
var STYLE_PLAIN = 1;
var STYLE_SINGLE = 2;
var STYLE_LITERAL = 3;
var STYLE_FOLDED = 4;
var STYLE_DOUBLE = 5;
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {
var i;
var char, prev_char;
var hasLineBreak = false;
var hasFoldableLine = false;
var shouldTrackWidth = lineWidth !== -1;
var previousLineBreak = -1;
var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1));
if (singleLineOnly) {
for (i = 0; i < string.length; i++) {
char = string.charCodeAt(i);
if (!isPrintable(char)) {
return STYLE_DOUBLE;
}
prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
plain = plain && isPlainSafe(char, prev_char);
}
} else {
for (i = 0; i < string.length; i++) {
char = string.charCodeAt(i);
if (char === CHAR_LINE_FEED) {
hasLineBreak = true;
if (shouldTrackWidth) {
hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented.
i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " ";
previousLineBreak = i;
}
} else if (!isPrintable(char)) {
return STYLE_DOUBLE;
}
prev_char = i > 0 ? string.charCodeAt(i - 1) : null;
plain = plain && isPlainSafe(char, prev_char);
}
hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " ");
}
if (!hasLineBreak && !hasFoldableLine) {
return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE;
}
if (indentPerLevel > 9 && needIndentIndicator(string)) {
return STYLE_DOUBLE;
}
return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
}
function writeScalar(state, string, level, iskey) {
state.dump = function() {
if (string.length === 0) {
return "''";
}
if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {
return "'" + string + "'";
}
var indent = state.indent * Math.max(1, level);
var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);
var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel;
function testAmbiguity(string2) {
return testImplicitResolving(state, string2);
}
switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {
case STYLE_PLAIN:
return string;
case STYLE_SINGLE:
return "'" + string.replace(/'/g, "''") + "'";
case STYLE_LITERAL:
return "|" + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent));
case STYLE_FOLDED:
return ">" + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
case STYLE_DOUBLE:
return '"' + escapeString(string, lineWidth) + '"';
default:
throw new YAMLException("impossible error: invalid scalar style");
}
}();
}
function blockHeader(string, indentPerLevel) {
var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : "";
var clip = string[string.length - 1] === "\n";
var keep = clip && (string[string.length - 2] === "\n" || string === "\n");
var chomp = keep ? "+" : clip ? "" : "-";
return indentIndicator + chomp + "\n";
}
function dropEndingNewline(string) {
return string[string.length - 1] === "\n" ? string.slice(0, -1) : string;
}
function foldString(string, width) {
var lineRe = /(\n+)([^\n]*)/g;
var result = function() {
var nextLF = string.indexOf("\n");
nextLF = nextLF !== -1 ? nextLF : string.length;
lineRe.lastIndex = nextLF;
return foldLine(string.slice(0, nextLF), width);
}();
var prevMoreIndented = string[0] === "\n" || string[0] === " ";
var moreIndented;
var match;
while (match = lineRe.exec(string)) {
var prefix = match[1], line = match[2];
moreIndented = line[0] === " ";
result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width);
prevMoreIndented = moreIndented;
}
return result;
}
function foldLine(line, width) {
if (line === "" || line[0] === " ")
return line;
var breakRe = / [^ ]/g;
var match;
var start = 0, end, curr = 0, next = 0;
var result = "";
while (match = breakRe.exec(line)) {
next = match.index;
if (next - start > width) {
end = curr > start ? curr : next;
result += "\n" + line.slice(start, end);
start = end + 1;
}
curr = next;
}
result += "\n";
if (line.length - start > width && curr > start) {
result += line.slice(start, curr) + "\n" + line.slice(curr + 1);
} else {
result += line.slice(start);
}
return result.slice(1);
}
function escapeString(string) {
var result = "";
var char, nextChar;
var escapeSeq;
for (var i = 0; i < string.length; i++) {
char = string.charCodeAt(i);
if (char >= 55296 && char <= 56319) {
nextChar = string.charCodeAt(i + 1);
if (nextChar >= 56320 && nextChar <= 57343) {
result += encodeHex((char - 55296) * 1024 + nextChar - 56320 + 65536);
i++;
continue;
}
}
escapeSeq = ESCAPE_SEQUENCES[char];
result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char);
}
return result;
}
function writeFlowSequence(state, level, object) {
var _result = "", _tag = state.tag, index, length;
for (index = 0, length = object.length; index < length; index += 1) {
if (writeNode(state, level, object[index], false, false)) {
if (index !== 0)
_result += "," + (!state.condenseFlow ? " " : "");
_result += state.dump;
}
}
state.tag = _tag;
state.dump = "[" + _result + "]";
}
function writeBlockSequence(state, level, object, compact) {
var _result = "", _tag = state.tag, index, length;
for (index = 0, length = object.length; index < length; index += 1) {
if (writeNode(state, level + 1, object[index], true, true)) {
if (!compact || index !== 0) {
_result += generateNextLine(state, level);
}
if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
_result += "-";
} else {
_result += "- ";
}
_result += state.dump;
}
}
state.tag = _tag;
state.dump = _result || "[]";
}
function writeFlowMapping(state, level, object) {
var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer;
for (index = 0, length = objectKeyList.length; index < length; index += 1) {
pairBuffer = "";
if (index !== 0)
pairBuffer += ", ";
if (state.condenseFlow)
pairBuffer += '"';
objectKey = objectKeyList[index];
objectValue = object[objectKey];
if (!writeNode(state, level, objectKey, false, false)) {
continue;
}
if (state.dump.length > 1024)
pairBuffer += "? ";
pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " ");
if (!writeNode(state, level, objectValue, false, false)) {
continue;
}
pairBuffer += state.dump;
_result += pairBuffer;
}
state.tag = _tag;
state.dump = "{" + _result + "}";
}
function writeBlockMapping(state, level, object, compact) {
var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer;
if (state.sortKeys === true) {
objectKeyList.sort();
} else if (typeof state.sortKeys === "function") {
objectKeyList.sort(state.sortKeys);
} else if (state.sortKeys) {
throw new YAMLException("sortKeys must be a boolean or a function");
}
for (index = 0, length = objectKeyList.length; index < length; index += 1) {
pairBuffer = "";
if (!compact || index !== 0) {
pairBuffer += generateNextLine(state, level);
}
objectKey = objectKeyList[index];
objectValue = object[objectKey];
if (!writeNode(state, level + 1, objectKey, true, true, true)) {
continue;
}
explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024;
if (explicitPair) {
if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
pairBuffer += "?";
} else {
pairBuffer += "? ";
}
}
pairBuffer += state.dump;
if (explicitPair) {
pairBuffer += generateNextLine(state, level);
}
if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
continue;
}
if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
pairBuffer += ":";
} else {
pairBuffer += ": ";
}
pairBuffer += state.dump;
_result += pairBuffer;
}
state.tag = _tag;
state.dump = _result || "{}";
}
function detectType(state, object, explicit) {
var _result, typeList, index, length, type, style;
typeList = explicit ? state.explicitTypes : state.implicitTypes;
for (index = 0, length = typeList.length; index < length; index += 1) {
type = typeList[index];
if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === "object" && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) {
state.tag = explicit ? type.tag : "?";
if (type.represent) {
style = state.styleMap[type.tag] || type.defaultStyle;
if (_toString.call(type.represent) === "[object Function]") {
_result = type.represent(object, style);
} else if (_hasOwnProperty.call(type.represent, style)) {
_result = type.represent[style](object, style);
} else {
throw new YAMLException("!<" + type.tag + '> tag resolver accepts not "' + style + '" style');
}
state.dump = _result;
}
return true;
}
}
return false;
}
function writeNode(state, level, object, block, compact, iskey) {
state.tag = null;
state.dump = object;
if (!detectType(state, object, false)) {
detectType(state, object, true);
}
var type = _toString.call(state.dump);
if (block) {
block = state.flowLevel < 0 || state.flowLevel > level;
}
var objectOrArray = type === "[object Object]" || type === "[object Array]", duplicateIndex, duplicate;
if (objectOrArray) {
duplicateIndex = state.duplicates.indexOf(object);
duplicate = duplicateIndex !== -1;
}
if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) {
compact = false;
}
if (duplicate && state.usedDuplicates[duplicateIndex]) {
state.dump = "*ref_" + duplicateIndex;
} else {
if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
state.usedDuplicates[duplicateIndex] = true;
}
if (type === "[object Object]") {
if (block && Object.keys(state.dump).length !== 0) {
writeBlockMapping(state, level, state.dump, compact);
if (duplicate) {
state.dump = "&ref_" + duplicateIndex + state.dump;
}
} else {
writeFlowMapping(state, level, state.dump);
if (duplicate) {
state.dump = "&ref_" + duplicateIndex + " " + state.dump;
}
}
} else if (type === "[object Array]") {
var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level;
if (block && state.dump.length !== 0) {
writeBlockSequence(state, arrayLevel, state.dump, compact);
if (duplicate) {
state.dump = "&ref_" + duplicateIndex + state.dump;
}
} else {
writeFlowSequence(state, arrayLevel, state.dump);
if (duplicate) {
state.dump = "&ref_" + duplicateIndex + " " + state.dump;
}
}
} else if (type === "[object String]") {
if (state.tag !== "?") {
writeScalar(state, state.dump, level, iskey);
}
} else {
if (state.skipInvalid)
return false;
throw new YAMLException("unacceptable kind of an object to dump " + type);
}
if (state.tag !== null && state.tag !== "?") {
state.dump = "!<" + state.tag + "> " + state.dump;
}
}
return true;
}
function getDuplicateReferences(object, state) {
var objects = [], duplicatesIndexes = [], index, length;
inspectNode(object, objects, duplicatesIndexes);
for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
state.duplicates.push(objects[duplicatesIndexes[index]]);
}
state.usedDuplicates = new Array(length);
}
function inspectNode(object, objects, duplicatesIndexes) {
var objectKeyList, index, length;
if (object !== null && typeof object === "object") {
index = objects.indexOf(object);
if (index !== -1) {
if (duplicatesIndexes.indexOf(index) === -1) {
duplicatesIndexes.push(index);
}
} else {
objects.push(object);
if (Array.isArray(object)) {
for (index = 0, length = object.length; index < length; index += 1) {
inspectNode(object[index], objects, duplicatesIndexes);
}
} else {
objectKeyList = Object.keys(object);
for (index = 0, length = objectKeyList.length; index < length; index += 1) {
inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
}
}
}
}
}
function dump(input, options2) {
options2 = options2 || {};
var state = new State(options2);
if (!state.noRefs)
getDuplicateReferences(input, state);
if (writeNode(state, 0, input, true, true))
return state.dump + "\n";
return "";
}
function safeDump(input, options2) {
return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options2));
}
module2.exports.dump = dump;
module2.exports.safeDump = safeDump;
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml.js
var require_js_yaml = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/lib/js-yaml.js"(exports2, module2) {
"use strict";
var loader = require_loader();
var dumper = require_dumper();
function deprecated(name) {
return function() {
throw new Error("Function " + name + " is deprecated and cannot be used.");
};
}
module2.exports.Type = require_type();
module2.exports.Schema = require_schema();
module2.exports.FAILSAFE_SCHEMA = require_failsafe();
module2.exports.JSON_SCHEMA = require_json();
module2.exports.CORE_SCHEMA = require_core();
module2.exports.DEFAULT_SAFE_SCHEMA = require_default_safe();
module2.exports.DEFAULT_FULL_SCHEMA = require_default_full();
module2.exports.load = loader.load;
module2.exports.loadAll = loader.loadAll;
module2.exports.safeLoad = loader.safeLoad;
module2.exports.safeLoadAll = loader.safeLoadAll;
module2.exports.dump = dumper.dump;
module2.exports.safeDump = dumper.safeDump;
module2.exports.YAMLException = require_exception();
module2.exports.MINIMAL_SCHEMA = require_failsafe();
module2.exports.SAFE_SCHEMA = require_default_safe();
module2.exports.DEFAULT_SCHEMA = require_default_full();
module2.exports.scan = deprecated("scan");
module2.exports.parse = deprecated("parse");
module2.exports.compose = deprecated("compose");
module2.exports.addConstructor = deprecated("addConstructor");
}
});
// node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/index.js
var require_js_yaml2 = __commonJS({
"node_modules/.pnpm/js-yaml@3.14.1/node_modules/js-yaml/index.js"(exports2, module2) {
"use strict";
var yaml2 = require_js_yaml();
module2.exports = yaml2;
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/engines.js
var require_engines = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/engines.js"(exports, module) {
"use strict";
var yaml = require_js_yaml2();
var engines = exports = module.exports;
engines.yaml = {
parse: yaml.safeLoad.bind(yaml),
stringify: yaml.safeDump.bind(yaml)
};
engines.json = {
parse: JSON.parse.bind(JSON),
stringify: function(obj, options2) {
const opts = Object.assign({ replacer: null, space: 2 }, options2);
return JSON.stringify(obj, opts.replacer, opts.space);
}
};
engines.javascript = {
parse: function parse(str, options, wrap) {
try {
if (wrap !== false) {
str = "(function() {\nreturn " + str.trim() + ";\n}());";
}
return eval(str) || {};
} catch (err) {
if (wrap !== false && /(unexpected|identifier)/i.test(err.message)) {
return parse(str, options, false);
}
throw new SyntaxError(err);
}
},
stringify: function() {
throw new Error("stringifying JavaScript is not supported");
}
};
}
});
// node_modules/.pnpm/strip-bom-string@1.0.0/node_modules/strip-bom-string/index.js
var require_strip_bom_string = __commonJS({
"node_modules/.pnpm/strip-bom-string@1.0.0/node_modules/strip-bom-string/index.js"(exports2, module2) {
"use strict";
module2.exports = function(str2) {
if (typeof str2 === "string" && str2.charAt(0) === "\uFEFF") {
return str2.slice(1);
}
return str2;
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/utils.js
var require_utils = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/utils.js"(exports2) {
"use strict";
var stripBom = require_strip_bom_string();
var typeOf = require_kind_of();
exports2.define = function(obj, key, val) {
Reflect.defineProperty(obj, key, {
enumerable: false,
configurable: true,
writable: true,
value: val
});
};
exports2.isBuffer = function(val) {
return typeOf(val) === "buffer";
};
exports2.isObject = function(val) {
return typeOf(val) === "object";
};
exports2.toBuffer = function(input) {
return typeof input === "string" ? Buffer.from(input) : input;
};
exports2.toString = function(input) {
if (exports2.isBuffer(input))
return stripBom(String(input));
if (typeof input !== "string") {
throw new TypeError("expected input to be a string or buffer");
}
return stripBom(input);
};
exports2.arrayify = function(val) {
return val ? Array.isArray(val) ? val : [val] : [];
};
exports2.startsWith = function(str2, substr, len) {
if (typeof len !== "number")
len = substr.length;
return str2.slice(0, len) === substr;
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/defaults.js
var require_defaults = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/defaults.js"(exports2, module2) {
"use strict";
var engines2 = require_engines();
var utils = require_utils();
module2.exports = function(options2) {
const opts = Object.assign({}, options2);
opts.delimiters = utils.arrayify(opts.delims || opts.delimiters || "---");
if (opts.delimiters.length === 1) {
opts.delimiters.push(opts.delimiters[0]);
}
opts.language = (opts.language || opts.lang || "yaml").toLowerCase();
opts.engines = Object.assign({}, engines2, opts.parsers, opts.engines);
return opts;
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/engine.js
var require_engine = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/engine.js"(exports2, module2) {
"use strict";
module2.exports = function(name, options2) {
let engine = options2.engines[name] || options2.engines[aliase(name)];
if (typeof engine === "undefined") {
throw new Error('gray-matter engine "' + name + '" is not registered');
}
if (typeof engine === "function") {
engine = { parse: engine };
}
return engine;
};
function aliase(name) {
switch (name.toLowerCase()) {
case "js":
case "javascript":
return "javascript";
case "coffee":
case "coffeescript":
case "cson":
return "coffee";
case "yaml":
case "yml":
return "yaml";
default: {
return name;
}
}
}
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/stringify.js
var require_stringify = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/stringify.js"(exports2, module2) {
"use strict";
var typeOf = require_kind_of();
var getEngine = require_engine();
var defaults = require_defaults();
module2.exports = function(file, data, options2) {
if (data == null && options2 == null) {
switch (typeOf(file)) {
case "object":
data = file.data;
options2 = {};
break;
case "string":
return file;
default: {
throw new TypeError("expected file to be a string or object");
}
}
}
const str2 = file.content;
const opts = defaults(options2);
if (data == null) {
if (!opts.data)
return file;
data = opts.data;
}
const language = file.language || opts.language;
const engine = getEngine(language, opts);
if (typeof engine.stringify !== "function") {
throw new TypeError('expected "' + language + '.stringify" to be a function');
}
data = Object.assign({}, file.data, data);
const open = opts.delimiters[0];
const close = opts.delimiters[1];
const matter2 = engine.stringify(data, options2).trim();
let buf = "";
if (matter2 !== "{}") {
buf = newline(open) + newline(matter2) + newline(close);
}
if (typeof file.excerpt === "string" && file.excerpt !== "") {
if (str2.indexOf(file.excerpt.trim()) === -1) {
buf += newline(file.excerpt) + newline(close);
}
}
return buf + newline(str2);
};
function newline(str2) {
return str2.slice(-1) !== "\n" ? str2 + "\n" : str2;
}
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/excerpt.js
var require_excerpt = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/excerpt.js"(exports2, module2) {
"use strict";
var defaults = require_defaults();
module2.exports = function(file, options2) {
const opts = defaults(options2);
if (file.data == null) {
file.data = {};
}
if (typeof opts.excerpt === "function") {
return opts.excerpt(file, opts);
}
const sep = file.data.excerpt_separator || opts.excerpt_separator;
if (sep == null && (opts.excerpt === false || opts.excerpt == null)) {
return file;
}
const delimiter = typeof opts.excerpt === "string" ? opts.excerpt : sep || opts.delimiters[0];
const idx = file.content.indexOf(delimiter);
if (idx !== -1) {
file.excerpt = file.content.slice(0, idx);
}
return file;
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/to-file.js
var require_to_file = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/to-file.js"(exports2, module2) {
"use strict";
var typeOf = require_kind_of();
var stringify = require_stringify();
var utils = require_utils();
module2.exports = function(file) {
if (typeOf(file) !== "object") {
file = { content: file };
}
if (typeOf(file.data) !== "object") {
file.data = {};
}
if (file.contents && file.content == null) {
file.content = file.contents;
}
utils.define(file, "orig", utils.toBuffer(file.content));
utils.define(file, "language", file.language || "");
utils.define(file, "matter", file.matter || "");
utils.define(file, "stringify", function(data, options2) {
if (options2 && options2.language) {
file.language = options2.language;
}
return stringify(file, data, options2);
});
file.content = utils.toString(file.content);
file.isEmpty = false;
file.excerpt = "";
return file;
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/parse.js
var require_parse = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/lib/parse.js"(exports2, module2) {
"use strict";
var getEngine = require_engine();
var defaults = require_defaults();
module2.exports = function(language, str2, options2) {
const opts = defaults(options2);
const engine = getEngine(language, opts);
if (typeof engine.parse !== "function") {
throw new TypeError('expected "' + language + '.parse" to be a function');
}
return engine.parse(str2, opts);
};
}
});
// node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/index.js
var require_gray_matter = __commonJS({
"node_modules/.pnpm/gray-matter@4.0.3/node_modules/gray-matter/index.js"(exports2, module2) {
"use strict";
var fs = require_fs();
var sections = require_section_matter();
var defaults = require_defaults();
var stringify = require_stringify();
var excerpt = require_excerpt();
var engines2 = require_engines();
var toFile = require_to_file();
var parse2 = require_parse();
var utils = require_utils();
function matter2(input, options2) {
if (input === "") {
return { data: {}, content: input, excerpt: "", orig: input };
}
let file = toFile(input);
const cached = matter2.cache[file.content];
if (!options2) {
if (cached) {
file = Object.assign({}, cached);
file.orig = cached.orig;
return file;
}
matter2.cache[file.content] = file;
}
return parseMatter(file, options2);
}
function parseMatter(file, options2) {
const opts = defaults(options2);
const open = opts.delimiters[0];
const close = "\n" + opts.delimiters[1];
let str2 = file.content;
if (opts.language) {
file.language = opts.language;
}
const openLen = open.length;
if (!utils.startsWith(str2, open, openLen)) {
excerpt(file, opts);
return file;
}
if (str2.charAt(openLen) === open.slice(-1)) {
return file;
}
str2 = str2.slice(openLen);
const len = str2.length;
const language = matter2.language(str2, opts);
if (language.name) {
file.language = language.name;
str2 = str2.slice(language.raw.length);
}
let closeIndex = str2.indexOf(close);
if (closeIndex === -1) {
closeIndex = len;
}
file.matter = str2.slice(0, closeIndex);
const block = file.matter.replace(/^\s*#[^\n]+/gm, "").trim();
if (block === "") {
file.isEmpty = true;
file.empty = file.content;
file.data = {};
} else {
file.data = parse2(file.language, file.matter, opts);
}
if (closeIndex === len) {
file.content = "";
} else {
file.content = str2.slice(closeIndex + close.length);
if (file.content[0] === "\r") {
file.content = file.content.slice(1);
}
if (file.content[0] === "\n") {
file.content = file.content.slice(1);
}
}
excerpt(file, opts);
if (opts.sections === true || typeof opts.section === "function") {
sections(file, opts.section);
}
return file;
}
matter2.engines = engines2;
matter2.stringify = function(file, data, options2) {
if (typeof file === "string")
file = matter2(file, options2);
return stringify(file, data, options2);
};
matter2.read = function(filepath, options2) {
const str2 = fs.readFileSync(filepath, "utf8");
const file = matter2(str2, options2);
file.path = filepath;
return file;
};
matter2.test = function(str2, options2) {
return utils.startsWith(str2, defaults(options2).delimiters[0]);
};
matter2.language = function(str2, options2) {
const opts = defaults(options2);
const open = opts.delimiters[0];
if (matter2.test(str2)) {
str2 = str2.slice(open.length);
}
const language = str2.slice(0, str2.search(/\r?\n/));
return {
raw: language,
name: language ? language.trim() : ""
};
};
matter2.cache = {};
matter2.clearCache = function() {
matter2.cache = {};
};
module2.exports = matter2;
}
});
// src/fn-main.ts
var fn_main_exports = {};
__export(fn_main_exports, {
default: () => ALxFolderNote
});
module.exports = __toCommonJS(fn_main_exports);
// node_modules/.pnpm/@aidenlx+folder-note-core@1.3.6/node_modules/@aidenlx/folder-note-core/lib/index.js
var import_obsidian = require("obsidian");
// node_modules/.pnpm/@aidenlx+folder-note-core@1.3.6/node_modules/@aidenlx/folder-note-core/lib/typings/api.js
var NoteLoc;
(function(NoteLoc2) {
NoteLoc2[NoteLoc2["Index"] = 0] = "Index";
NoteLoc2[NoteLoc2["Inside"] = 1] = "Inside";
NoteLoc2[NoteLoc2["Outside"] = 2] = "Outside";
})(NoteLoc || (NoteLoc = {}));
// node_modules/.pnpm/@aidenlx+folder-note-core@1.3.6/node_modules/@aidenlx/folder-note-core/lib/index.js
var getApi = (plugin) => {
var _a;
if (plugin)
return (_a = plugin.app.plugins.plugins["folder-note-core"]) === null || _a === void 0 ? void 0 : _a.api;
else
return window["FolderNoteAPIv0"];
};
// node_modules/.pnpm/@aidenlx+obsidian-icon-shortcodes@0.9.0/node_modules/@aidenlx/obsidian-icon-shortcodes/lib/index.js
var import_obsidian2 = require("obsidian");
var getApi2 = (plugin) => {
var _a;
if (plugin)
return (_a = plugin.app.plugins.plugins["obsidian-icon-shortcodes"]) === null || _a === void 0 ? void 0 : _a.api;
else
return window["IconSCAPIv0"];
};
// src/fn-main.ts
var import_obsidian16 = require("obsidian");
// src/drag-patch.ts
var import_obsidian3 = require("obsidian");
// node_modules/.pnpm/monkey-around@2.3.0/node_modules/monkey-around/mjs/index.js
function around(obj, factories) {
const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key]));
return removers.length === 1 ? removers[0] : function() {
removers.forEach((r) => r());
};
}
function around1(obj, method, createWrapper) {
const original = obj[method], hadOwn = obj.hasOwnProperty(method);
let current = createWrapper(original);
if (original)
Object.setPrototypeOf(current, original);
Object.setPrototypeOf(wrapper, current);
obj[method] = wrapper;
return remove;
function wrapper(...args) {
if (current === original && obj[method] === wrapper)
remove();
return current.apply(this, args);
}
function remove() {
if (obj[method] === wrapper) {
if (hadOwn)
obj[method] = original;
else
delete obj[method];
}
if (current === original)
return;
current = original;
Object.setPrototypeOf(wrapper, original || Function);
}
}
// src/drag-patch.ts
var import_obsidian4 = require("obsidian");
var HD = {
none: [],
copy: ["copy"],
copyLink: ["copy", "link"],
copyMove: ["copy", "move"],
link: ["link"],
linkMove: ["link", "move"],
move: ["move"],
all: ["copy", "link", "move"],
uninitialized: []
};
function VD(e, t) {
t && function(e2, t2) {
if ("none" === t2)
return true;
let n = HD[e2.dataTransfer.effectAllowed];
return !!n && n.contains(t2);
}(e, t) && (e.dataTransfer.dropEffect = t);
}
var getMarkdownView = () => {
const leaves = app.workspace.getLeavesOfType("markdown");
if (leaves.length > 0) {
return leaves[0].view;
} else
return null;
};
var PatchDragManager = (plugin) => {
const { getFolderNote } = plugin.CoreApi;
const patchClipboardManager = () => {
const view = getMarkdownView();
if (!view)
return false;
const editMode = view.editMode ?? view.sourceMode;
if (!editMode)
throw new Error("Failed to patch clipboard manager: no edit view found");
plugin.register(
around(
editMode.clipboardManager.constructor.prototype,
{
handleDragOver: (next) => function(evt, ...args) {
const { draggable } = this.app.dragManager;
if (draggable && !(import_obsidian4.Platform.isMacOS ? evt.shiftKey : evt.altKey) && draggable.file instanceof import_obsidian4.TFolder && getFolderNote(draggable.file)) {
VD(evt, "link");
this.app.dragManager.setAction(
i18next.t("interface.drag-and-drop.insert-link-here")
);
} else {
next.call(this, evt, ...args);
}
},
handleDrop: (next) => function(evt, ...args) {
const fallback = () => next.call(this, evt, ...args);
const { draggable } = plugin.app.dragManager;
let note;
if (draggable?.type === "folder" && draggable.file instanceof import_obsidian4.TFolder && (note = getFolderNote(draggable.file))) {
draggable.file = note;
draggable.type = "file";
}
return fallback();
}
}
)
);
console.log("alx-folder-note: clipboard manager patched");
return true;
};
plugin.app.workspace.onLayoutReady(() => {
if (!patchClipboardManager()) {
const evt = app.workspace.on("layout-change", () => {
patchClipboardManager() && app.workspace.offref(evt);
});
plugin.registerEvent(evt);
}
});
plugin.register(
around(app.dragManager.constructor.prototype, {
dragFolder: (next) => function(evt, folder, source, ...args) {
let note;
if (note = getFolderNote(folder)) {
const url = app.getObsidianUrl(note);
evt.dataTransfer.setData("text/plain", url);
evt.dataTransfer.setData("text/uri-list", url);
}
return next.call(this, evt, folder, source, ...args);
}
})
);
};
var drag_patch_default = PatchDragManager;
// src/fe-patch.ts
var import_obsidian13 = require("obsidian");
// src/click-handler.ts
var import_obsidian7 = require("obsidian");
// src/misc.ts
var import_assert_never = __toESM(require_assert_never());
var import_obsidian5 = require("obsidian");
var import_obsidian6 = require("obsidian");
var import_path = __toESM(require_path_browserify());
var getViewOfType = (type, app2) => {
const vc = app2.viewRegistry.getViewCreatorByType(type);
return vc ? vc(new import_obsidian5.WorkspaceLeaf(app2)) : null;
};
var isFolder = (item) => item.file instanceof import_obsidian6.TFolder;
var isModifier = (evt, pref) => {
const { altKey, metaKey, ctrlKey, shiftKey } = evt;
switch (pref) {
case "Mod":
return import_obsidian6.Platform.isMacOS ? metaKey : ctrlKey;
case "Ctrl":
return ctrlKey;
case "Meta":
return metaKey;
case "Shift":
return shiftKey;
case "Alt":
return altKey;
default:
(0, import_assert_never.default)(pref);
}
};
var ClickNotice = class extends import_obsidian6.Notice {
constructor(message, action, timeout) {
super(typeof message === "string" ? message : "", timeout);
this.noticeEl.addEventListener("click", action);
if (typeof message === "function") {
this.noticeEl.empty();
let frag = new DocumentFragment();
message(frag);
this.noticeEl.append(frag);
}
}
};
function getFileItemTitleEl(fileItem) {
return fileItem.titleEl ?? fileItem.selfEl;
}
function getFileItemInnerTitleEl(fileItem) {
return fileItem.titleInnerEl ?? fileItem.innerEl;
}
// src/click-handler.ts
var getClickHandler = (plugin) => {
const { getFolderNote, getFolderNotePath, getNewFolderNote } = plugin.CoreApi;
return async (item, evt) => {
if (!item || import_obsidian7.Platform.isMobile && !plugin.settings.mobileClickToOpen || // allow folder shift selection to work
evt.shiftKey || // triggered only when click on title
!(getFileItemInnerTitleEl(item) === evt.target || getFileItemInnerTitleEl(item).contains(evt.target)) || // ignore file being renamed
item.fileExplorer.fileBeingRenamed === item.file)
return false;
if (evt.type === "auxclick" && evt.button !== 1)
return false;
const folder = item.file;
const createNew = evt.type === "click" && isModifier(evt, plugin.settings.modifierForNewNote) || evt.type === "auxclick" && evt.button === 1;
try {
let folderNote = getFolderNote(folder), fnPath;
if (createNew && !folderNote && (fnPath = getFolderNotePath(folder))) {
folderNote = await plugin.app.vault.create(
fnPath.path,
getNewFolderNote(folder)
);
}
if (!folderNote)
return false;
await plugin.app.workspace.openLinkText(
folderNote.path,
"",
createNew || evt.type === "auxclick",
{ active: true }
);
if (plugin.settings.expandFolderOnClick && item.collapsed)
await item.setCollapsed(false);
return true;
} catch (error) {
console.error(error);
return false;
}
};
};
var pressHandler = (item, _evt) => {
if (!item || item.fileExplorer.fileBeingRenamed === item.file)
return false;
const folder = item.file;
item.fileExplorer.folderNoteUtils?.folderFocus.toggleFocusFolder(folder);
return true;
};
// src/fe-handler/active-folder.ts
var import_obsidian9 = require("obsidian");
// src/fe-handler/base.ts
var import_obsidian8 = require("obsidian");
var FEHandler_Base = class {
constructor(plugin, fileExplorer) {
this.plugin = plugin;
this.fileExplorer = fileExplorer;
}
longPressRegistered = /* @__PURE__ */ new WeakSet();
get fncApi() {
return this.plugin.CoreApi;
}
get app() {
return this.plugin.app;
}
get files() {
return this.fileExplorer.files;
}
getAfItem = (path) => this.fileExplorer.fileItems[path] ?? null;
iterateItems = (callback) => Object.values(this.fileExplorer.fileItems).forEach(callback);
debouncers = {};
_execQueue(queueName) {
const { action, queue } = this.queues[queueName];
if (queue.size <= 0)
return;
if (queue instanceof Set) {
queue.forEach((id) => action(id));
} else {
queue.forEach((args, id) => action(id, ...args));
}
queue.clear();
}
execQueue(queueName) {
if (!Object.keys(this.queues).includes(queueName))
return;
const debouncer = this.debouncers[queueName] ?? (this.debouncers[queueName] = (0, import_obsidian8.debounce)(
() => this._execQueue(queueName),
200,
true
));
debouncer();
}
};
// src/fe-handler/active-folder.ts
var isActiveClass = "is-active";
var ActiveFolder = class extends FEHandler_Base {
queues = {};
constructor(plugin, fileExplorer) {
super(plugin, fileExplorer);
const { workspace } = plugin.app;
this.handleActiveLeafChange(workspace.activeLeaf);
plugin.registerEvent(
workspace.on(
"active-leaf-change",
this.handleActiveLeafChange.bind(this)
)
);
this.plugin.register(() => this.activeFolder = null);
}
_activeFolder = null;
set activeFolder(folder) {
const getTitleEl = (folder2) => folder2 && this.fileExplorer.fileItems[folder2.path] ? getFileItemTitleEl(this.fileExplorer.fileItems[folder2.path]) : void 0;
if (!folder) {
getTitleEl(this._activeFolder)?.removeClass(isActiveClass);
} else if (folder !== this._activeFolder) {
getTitleEl(this._activeFolder)?.removeClass(isActiveClass);
getTitleEl(folder)?.addClass(isActiveClass);
}
this._activeFolder = folder;
}
get activeFolder() {
return this._activeFolder;
}
handleActiveLeafChange(leaf) {
let folder;
if (leaf && leaf.view instanceof import_obsidian9.MarkdownView && (folder = this.fncApi.getFolderFromNote(leaf.view.file))) {
this.activeFolder = folder;
} else {
this.activeFolder = null;
}
}
};
// src/fe-handler/folder-focus.ts
var import_obsidian10 = require("obsidian");
var focusedFolderCls = "alx-focused-folder";
var focusModeCls = "alx-folder-focus";
var FolderFocus = class extends FEHandler_Base {
queues = {};
constructor(plugin, fileExplorer) {
super(plugin, fileExplorer);
const { workspace } = plugin.app;
this.plugin.register(
() => this.focusedFolder && this.toggleFocusFolder(null)
);
[
workspace.on("file-menu", (menu, af) => {
if (!(af instanceof import_obsidian10.TFolder) || af.isRoot())
return;
menu.addItem(
(item) => item.setTitle("Toggle Focus").setIcon("crossed-star").onClick(() => this.toggleFocusFolder(af))
);
})
].forEach(this.plugin.registerEvent.bind(this.plugin));
}
_focusedFolder = null;
get focusedFolder() {
return this._focusedFolder?.folder ?? null;
}
set focusedFolder(item) {
if (this._focusedFolder) {
const { folder, collapsedCache } = this._focusedFolder;
if (folder.collapsed !== collapsedCache)
folder.setCollapsed(collapsedCache);
}
this._focusedFolder = item ? { folder: item, collapsedCache: item.collapsed } : null;
if (item && item.collapsed) {
item.setCollapsed(false);
this.plugin.app.nextFrame(() => {
this.fileExplorer.dom.infinityScroll.computeSync();
this.fileExplorer.dom.infinityScroll.scrollIntoView(item);
});
}
this.fileExplorer.dom.navFileContainerEl.toggleClass(focusModeCls, !!item);
}
toggleFocusFolder(folder) {
const folderItem = folder ? this.getAfItem(folder.path) : null;
if (this.focusedFolder) {
this._focusFolder(this.focusedFolder, true);
}
if (folderItem && folderItem.file.path === this.focusedFolder?.file.path) {
this.focusedFolder = null;
} else {
folderItem && this._focusFolder(folderItem, false);
this.focusedFolder = folderItem;
}
}
_focusFolder(folder, revert = false) {
if (folder.file.isRoot())
throw new Error("Cannot focus on root dir");
folder.el.toggleClass(focusedFolderCls, !revert);
}
};
// src/fe-handler/folder-mark.ts
var import_obsidian11 = require("obsidian");
var import_path2 = __toESM(require_path_browserify());
var folderIconMark = "alx-folder-icons";
var folderNoteClass = "alx-folder-note";
var folderClass = "alx-folder-with-note";
var emptyFolderClass = "alx-empty-folder";
var FolderMark = class extends FEHandler_Base {
constructor(plugin, fileExplorer) {
super(plugin, fileExplorer);
this.initFolderMark();
if (this.plugin.settings.folderIcon) {
this.initFolderIcon();
}
if (this.plugin.settings.hideCollapseIndicator) {
this.initHideCollapseIndicator();
}
}
queues = {
mark: {
queue: /* @__PURE__ */ new Map(),
action: (path, revert) => {
const item = this.getAfItem(path);
if (!item) {
console.warn("no afitem found for path %s, escaping...", path);
return;
}
if (isFolder(item)) {
if (revert === !!item.isFolderWithNote) {
item.el.toggleClass(folderClass, !revert);
item.isFolderWithNote = revert ? void 0 : true;
if (this.plugin.settings.hideCollapseIndicator)
item.el.toggleClass(
emptyFolderClass,
revert ? false : item.file.children.length === 1
);
}
this._updateIcon(path, revert, item);
} else if (revert === !!item.isFolderNote) {
item.el.toggleClass(folderNoteClass, !revert);
item.isFolderNote = revert ? void 0 : true;
}
}
},
changedFolder: {
queue: /* @__PURE__ */ new Set(),
action: (path) => {
let note = this.fncApi.getFolderNote(path);
if (note) {
this.getAfItem(path)?.el.toggleClass(
emptyFolderClass,
note.parent.children.length === 1
);
}
}
}
};
initFolderMark() {
const { vault, metadataCache } = this.app;
this.markAll();
[
vault.on("folder-note:create", (note, folder) => {
this.setMark(note);
this.setMark(folder);
}),
vault.on("folder-note:delete", (note, folder) => {
this.setMark(note, true);
this.setMark(folder, true);
}),
vault.on("folder-note:rename", () => {
}),
vault.on("folder-note:cfg-changed", () => {
this.markAll(true);
window.setTimeout(this.markAll, 200);
}),
metadataCache.on("changed", (file) => {
let folder;
if (folder = this.fncApi.getFolderFromNote(file)) {
this.setMark(folder);
}
})
].forEach(this.plugin.registerEvent.bind(this.plugin));
}
//#region set class mark for folder notes and folders
setMark = (target, revert = false) => {
if (!target)
return;
const { queue } = this.queues.mark;
let path;
if (target instanceof import_obsidian11.TAbstractFile) {
path = target.path;
} else if (typeof target === "string") {
path = target;
} else {
path = target.file.path;
}
queue.set(path, [revert]);
this.execQueue("mark");
};
markAll = (revert = false) => {
this.iterateItems((item) => {
if (isFolder(item) && !revert) {
this.markFolderNote(item.file);
} else if (revert) {
this.setMark(item, true);
}
});
};
markFolderNote = (af) => {
if (af instanceof import_obsidian11.TFolder && af.isRoot())
return false;
const { getFolderNote, getFolderFromNote } = this.fncApi;
let found = null;
if (af instanceof import_obsidian11.TFile)
found = getFolderFromNote(af);
else if (af instanceof import_obsidian11.TFolder)
found = getFolderNote(af);
if (found) {
this.setMark(found);
this.setMark(af);
} else {
this.setMark(af, true);
}
return !!found;
};
// #endregion
//#region folder icon setup
initFolderIcon() {
document.body.toggleClass(folderIconMark, this.plugin.settings.folderIcon);
const { vault } = this.app;
const updateIcon = () => {
for (const path of this.foldersWithIcon) {
this.setMark(path);
}
};
[
vault.on("iconsc:initialized", updateIcon),
vault.on("iconsc:changed", updateIcon)
].forEach(this.plugin.registerEvent.bind(this.plugin));
}
foldersWithIcon = /* @__PURE__ */ new Set();
_updateIcon(path, revert, item) {
const api = this.plugin.IconSCAPI;
if (!api)
return;
let folderNotePath, metadata;
const revertIcon = () => {
delete item.el.dataset.icon;
delete item.el.dataset["icon-type"];
this.foldersWithIcon.delete(path);
item.el.style.removeProperty("--alx-folder-icon-txt");
item.el.style.removeProperty("--alx-folder-icon-url");
};
if (revert) {
revertIcon();
} else if ((folderNotePath = this.fncApi.getFolderNotePath(path)?.path) && (metadata = this.plugin.app.metadataCache.getCache(folderNotePath))) {
let iconId = metadata.frontmatter?.icon, icon;
if (iconId && typeof iconId === "string" && (icon = api.getIcon(iconId, true))) {
this.foldersWithIcon.add(path);
item.el.dataset.icon = iconId.replace(/^:|:$/g, "");
if (!api.isEmoji(iconId)) {
item.el.dataset.iconType = "svg";
item.el.style.setProperty("--alx-folder-icon-url", `url("${icon}")`);
item.el.style.setProperty("--alx-folder-icon-txt", '" "');
} else {
item.el.dataset.iconType = "emoji";
item.el.style.setProperty("--alx-folder-icon-url", '""');
item.el.style.setProperty("--alx-folder-icon-txt", `"${icon}"`);
}
} else if (item.el.dataset.icon) {
revertIcon();
}
}
}
//#endregion
//#region set hide collapse indicator
initHideCollapseIndicator() {
if (!this.plugin.settings.hideCollapseIndicator)
return;
const { vault } = this.app;
[
vault.on("create", (file) => this.setChangedFolder(file.parent.path)),
vault.on("delete", (file) => {
let parent = (0, import_path2.dirname)(file.path);
this.setChangedFolder(parent === "." ? "/" : parent);
}),
vault.on("rename", (file, oldPath) => {
this.setChangedFolder(file.parent.path);
let parent = (0, import_path2.dirname)(oldPath);
this.setChangedFolder(parent === "." ? "/" : parent);
})
].forEach(this.plugin.registerEvent.bind(this.plugin));
}
setChangedFolder = (folderPath) => {
if (!folderPath || folderPath === "/")
return;
this.queues.changedFolder.queue.add(folderPath);
this.execQueue("changedFolder");
};
//#endregion
};
// src/fe-handler/index.ts
var getFileExplorerHandlers = (plugin, fileExplorer) => ({
// initialized (mark folders, hook evt handlers...) when constructed
plugin,
folderFocus: new FolderFocus(plugin, fileExplorer),
folderMark: new FolderMark(plugin, fileExplorer),
activeFolder: new ActiveFolder(plugin, fileExplorer)
});
var fe_handler_default = getFileExplorerHandlers;
// src/modules/long-press.ts
var import_obsidian12 = require("obsidian");
var timer = null;
var startX = 0;
var startY = 0;
var requestTimeout = (fn, delay) => {
let start = (/* @__PURE__ */ new Date()).getTime();
let handle = {};
let loop = () => {
let current = (/* @__PURE__ */ new Date()).getTime();
let delta = current - start;
if (delta >= delay) {
fn();
} else {
handle.value = requestAnimationFrame(loop);
}
};
handle.value = requestAnimationFrame(loop);
return handle;
};
var clearRequestTimeout = (handle) => {
handle && cancelAnimationFrame(handle.value);
};
var clearLongPressTimer = () => {
clearRequestTimeout(timer);
timer = null;
};
var fireLongPressEvent = (originalEvent) => {
clearLongPressTimer();
let allowClickEvent = originalEvent.target?.dispatchEvent(
new CustomEvent("long-press", {
bubbles: true,
cancelable: true,
// custom event data (legacy)
detail: {
clientX: originalEvent.clientX,
clientY: originalEvent.clientY
},
// add coordinate data that would typically acompany a touch/click event
// @ts-ignore
clientX: originalEvent.clientX,
clientY: originalEvent.clientY,
offsetX: originalEvent.offsetX,
offsetY: originalEvent.offsetY,
pageX: originalEvent.pageX,
pageY: originalEvent.pageY,
screenX: originalEvent.screenX,
screenY: originalEvent.screenY
})
);
if (!allowClickEvent) {
const suppressEvent = (e) => {
moniterIn?.removeEventListener("click", suppressEvent, true);
cancelEvent(e);
};
moniterIn?.addEventListener("click", suppressEvent, true);
}
};
var startLongPressTimer = (e) => {
clearLongPressTimer();
let el = e.target;
let longPressDelayInMs = parseInt(
getNearestAttribute(el, "data-long-press-delay", "800"),
10
);
timer = requestTimeout(fireLongPressEvent.bind(el, e), longPressDelayInMs);
};
var cancelEvent = (e) => {
e.stopImmediatePropagation();
e.preventDefault();
e.stopPropagation();
};
var mouseDownHandler = (e) => {
startX = e.clientX;
startY = e.clientY;
startLongPressTimer(e);
};
var mouseMoveHandler = (e) => {
clearLongPressTimer();
};
var getNearestAttribute = (el, attributeName, defaultValue) => {
while (el instanceof Element && el !== document.documentElement) {
let attributeValue = el.getAttribute(attributeName);
if (attributeValue) {
return attributeValue;
}
el = el.parentNode;
}
return defaultValue;
};
var moniterIn;
var removeEvtListener = (el) => {
moniterIn = null;
el.removeEventListener("pointerup", clearLongPressTimer, true);
el.removeEventListener("drag", mouseMoveHandler, true);
el.removeEventListener("wheel", clearLongPressTimer, true);
el.removeEventListener("scroll", clearLongPressTimer, true);
el.removeEventListener("pointerdown", mouseDownHandler, true);
};
var AddLongPressEvt = (plugin, el) => {
if (!plugin.settings.longPressFocus || import_obsidian12.Platform.isMobile)
return;
if (moniterIn) {
removeEvtListener(moniterIn);
}
moniterIn = el;
el.addEventListener("pointerup", clearLongPressTimer, true);
el.addEventListener("drag", mouseMoveHandler, true);
el.addEventListener("wheel", clearLongPressTimer, true);
el.addEventListener("scroll", clearLongPressTimer, true);
el.addEventListener("pointerdown", mouseDownHandler, true);
plugin.register(() => removeEvtListener(el));
};
var long_press_default = AddLongPressEvt;
// src/fe-patch.ts
var getFolderItemFromEl = (navEl, view) => {
const folder = view.files.get(navEl);
return folder instanceof import_obsidian13.TFolder ? view.fileItems[folder.path] : null;
};
var Rt = (evt, target) => {
let n = evt.relatedTarget;
return !(n instanceof Node && target.contains(n));
};
var resetFileExplorer = async (plugin) => {
for (const leaf of plugin.app.workspace.getLeavesOfType("file-explorer")) {
let state = leaf.getViewState();
await leaf.setViewState({ type: "empty" });
leaf.setViewState(state);
}
};
var PatchFileExplorer = (plugin) => {
const { getFolderFromNote } = plugin.CoreApi, clickHandler = getClickHandler(plugin);
let FileExplorerViewInst = getViewOfType(
"file-explorer",
plugin.app
), FileExplorerPluginInst = plugin.app.internalPlugins.plugins["file-explorer"]?.instance;
if (!FileExplorerViewInst || !FileExplorerPluginInst)
return;
const FileExplorerView5 = FileExplorerViewInst.constructor, FileExplorerPlugin = FileExplorerPluginInst.constructor, FolderItem5 = FileExplorerViewInst.createFolderDom(
plugin.app.vault.getRoot()
).constructor;
FileExplorerViewInst = null;
const uninstallers = [
around(FileExplorerView5.prototype, {
load: (next) => function() {
const self = this;
next.call(self);
self.folderNoteUtils = fe_handler_default(plugin, self);
long_press_default(plugin, self.dom.navFileContainerEl);
self.containerEl.on(
"auxclick",
".nav-folder",
(evt, navEl) => {
const item = getFolderItemFromEl(navEl, self);
item && clickHandler(item, evt);
}
);
self.containerEl.on(
"long-press",
".nav-folder",
(evt, navEl) => {
const item = getFolderItemFromEl(navEl, self);
item && pressHandler(item, evt);
}
);
},
onFileMouseover: (next) => function(evt, navTitleEl) {
next.call(this, evt, navTitleEl);
if (!Rt(evt, navTitleEl))
return;
const af = this.currentHoverFile;
if (!af || // if event is triggered on same file, do nothing
this._AFN_HOVER && this._AFN_HOVER === af || !(af instanceof import_obsidian13.TFolder))
return;
const note = plugin.CoreApi.getFolderNote(af);
if (note) {
this.app.workspace.trigger("hover-link", {
event: evt,
source: "file-explorer",
hoverParent: this,
targetEl: navTitleEl,
linktext: note.path
});
}
this._AFN_HOVER = af;
},
onFileMouseout: (next) => function(evt, navTitleEl) {
next.call(this, evt, navTitleEl);
if (!Rt(evt, navTitleEl))
return;
delete this._AFN_HOVER;
}
}),
// patch reveal in folder to alter folder note target to linked folder
around(FileExplorerPlugin.prototype, {
revealInFolder: (next) => function(file) {
if (file instanceof import_obsidian13.TFile && plugin.settings.hideNoteInExplorer) {
const findResult = getFolderFromNote(file);
if (findResult)
file = findResult;
}
return next.call(this, file);
}
}),
around(FolderItem5.prototype, {
onTitleElClick: (next) => async function(evt) {
if (!await clickHandler(this, evt))
next.call(this, evt);
},
onSelfClick: (next) => async function(evt) {
if (!await clickHandler(this, evt))
next.call(this, evt);
}
})
];
resetFileExplorer(plugin);
plugin.register(() => {
uninstallers.forEach((revert) => revert());
resetFileExplorer(plugin);
});
};
var fe_patch_default = PatchFileExplorer;
// src/modules/set-folder-icon.ts
var import_gray_matter = __toESM(require_gray_matter());
var import_obsidian14 = require("obsidian");
var registerSetFolderIconCmd = (plugin) => {
const { workspace, vault } = plugin.app;
const setIconField = async (icon, file) => icon && vault.modify(
file,
(0, import_gray_matter.default)(await vault.read(file)).stringify(
{ icon: icon.id },
{ flowLevel: 3, indent: 4 }
)
);
plugin.addCommand({
id: "set-folder-icon",
name: "Set Folder Icon",
checkCallback: (checking) => {
const iscAPI = plugin.IconSCAPI;
if (!iscAPI)
return false;
const mdView = workspace.getActiveViewOfType(import_obsidian14.MarkdownView);
if (!mdView)
return false;
const folder = plugin.CoreApi.getFolderFromNote(mdView.file);
if (!folder)
return false;
if (checking)
return true;
iscAPI.getIconFromUser().then((icon) => setIconField(icon, mdView.file));
}
});
plugin.registerEvent(
workspace.on("file-menu", (menu, af, src) => {
const iscAPI = plugin.IconSCAPI;
if (!iscAPI)
return;
let note;
if (af instanceof import_obsidian14.TFolder && (note = plugin.CoreApi.getFolderNote(af)) || af instanceof import_obsidian14.TFile && (note = af, plugin.CoreApi.getFolderFromNote(af))) {
const folderNote = note;
menu.addItem(
(item) => item.setIcon("image-glyph").setTitle("Set Folder Icon").onClick(
async () => setIconField(await iscAPI.getIconFromUser(), folderNote)
)
);
}
})
);
};
var set_folder_icon_default = registerSetFolderIconCmd;
// src/settings.ts
var import_obsidian15 = require("obsidian");
var noHideNoteMark = "alx-no-hide-note";
var MobileNoClickMark = "alx-no-click-on-mobile";
var DEFAULT_SETTINGS = {
modifierForNewNote: "Mod",
hideNoteInExplorer: true,
hideCollapseIndicator: false,
longPressFocus: false,
folderIcon: true,
folderNotePref: null,
deleteOutsideNoteWithFolder: null,
indexName: null,
autoRename: null,
folderNoteTemplate: null,
mobileClickToOpen: true,
longPressDelay: 800,
expandFolderOnClick: false
};
var old = [
"folderNotePref",
"deleteOutsideNoteWithFolder",
"indexName",
"autoRename",
"folderNoteTemplate"
];
var ALxFolderNoteSettingTab = class extends import_obsidian15.PluginSettingTab {
plugin;
constructor(app2, plugin) {
super(app2, plugin);
this.plugin = plugin;
}
checkMigrated() {
return old.every((key) => this.plugin.settings[key] === null);
}
getInitGuide(desc, targetPluginID, container) {
return new import_obsidian15.Setting(container).setDesc(
desc + "use the buttons to install & enable it then reload alx-folder-note to take effects"
).addButton(
(btn) => btn.setIcon("down-arrow-with-tail").setTooltip("Go to Plugin Page").onClick(
() => window.open(`obsidian://show-plugin?id=${targetPluginID}`)
)
).addButton(
(btn) => btn.setIcon("reset").setTooltip("Reload alx-folder-note").onClick(async () => {
await this.app.plugins.disablePlugin(this.plugin.manifest.id);
await this.app.plugins.enablePlugin(this.plugin.manifest.id);
this.app.setting.openTabById(this.plugin.manifest.id);
})
);
}
display() {
let { containerEl } = this;
containerEl.empty();
new import_obsidian15.Setting(containerEl).setHeading().setName("Core");
try {
this.plugin.CoreApi;
if (this.checkMigrated()) {
this.plugin.CoreApi.renderCoreSettings(containerEl);
} else
this.setMigrate();
} catch (error) {
this.getInitGuide(
"Seems like Folder Note Core is not enabled, ",
"folder-note-core",
containerEl
);
return;
}
this.setFolderIcon();
this.setModifier();
this.setHide();
this.addToggle(this.containerEl, "expandFolderOnClick").setName("Expand Folder on Click").setDesc(
"Expand collapsed folders with note while opening them by clicking on folder title"
);
this.setMobile();
this.setFocus();
new import_obsidian15.Setting(containerEl).setHeading().setName("Folder Overview");
const folderv = this.app.plugins.plugins["alx-folder-note-folderv"];
if (folderv?.renderFoldervSettings) {
folderv.renderFoldervSettings(containerEl);
} else {
this.getInitGuide(
"Folder Overview (folderv) is now an optional component, ",
"alx-folder-note-folderv",
containerEl
);
}
new import_obsidian15.Setting(containerEl).setHeading().setName("Debug");
this.plugin.CoreApi.renderLogLevel(containerEl);
}
setMigrate() {
new import_obsidian15.Setting(this.containerEl).setName("Migrate settings to Folder Note Core").setDesc(
"Some settings has not been migrated to Folder Note Core, click Migrate to migrate old config or Cancel to use config in Folder Note Core in favor of old config"
).addButton(
(cb) => cb.setButtonText("Migrate").onClick(async () => {
const toImport = old.reduce(
(obj, k) => (obj[k] = this.plugin.settings[k] ?? void 0, obj),
{}
);
this.plugin.CoreApi.importSettings(toImport);
old.forEach((k) => this.plugin.settings[k] = null);
await this.plugin.saveSettings();
this.display();
})
).addButton(
(cb) => cb.setButtonText("Cancel").onClick(async () => {
old.forEach((k) => this.plugin.settings[k] = null);
await this.plugin.saveSettings();
this.display();
})
);
}
setMobile() {
if (!import_obsidian15.Platform.isMobile)
return;
this.addToggle(
this.containerEl,
"mobileClickToOpen",
(value) => document.body.toggleClass(MobileNoClickMark, !value)
).setName("Click folder title to open folder note on mobile").setDesc(
"Disable this if you want to the default action. You can still use context menu to open folder note"
);
}
setModifier = () => {
new import_obsidian15.Setting(this.containerEl).setName("Modifier for New Note").setDesc("Choose a modifier to click folders with to create folder notes").addDropdown((dropDown) => {
const windowsOpts = {
Mod: "Ctrl (Cmd in macOS)",
Ctrl: "Ctrl (Ctrl in macOS)",
Meta: "\u229E Win",
// Shift: "Shift",
Alt: "Alt"
};
const macOSOpts = {
Mod: "\u2318 Cmd (Ctrl in Windows)",
Ctrl: "\u2303 Control",
Meta: "\u2318 Cmd (Win in Windows)",
// Shift: "⇧ Shift",
Alt: "\u2325 Option"
};
const options2 = import_obsidian15.Platform.isMacOS ? macOSOpts : windowsOpts;
dropDown.addOptions(options2).setValue(this.plugin.settings.modifierForNewNote).onChange(async (value) => {
this.plugin.settings.modifierForNewNote = value;
await this.plugin.saveSettings();
});
});
};
setHide() {
this.addToggle(
this.containerEl,
"hideNoteInExplorer",
(value) => document.body.toggleClass(noHideNoteMark, !value)
).setName("Hide Folder Note").setDesc("Hide folder note files from file explorer");
this.addToggle(this.containerEl, "hideCollapseIndicator").setName("Hide Collapse Indicator").setDesc(
"Hide collapse indicator when folder contains only folder note, reload obsidian to take effects"
);
}
setFolderIcon() {
this.addToggle(
this.containerEl,
"folderIcon",
(value) => document.body.toggleClass(folderIconMark, value)
).setName("Set Folder Icon in Folder Notes").setDesc(
createFragment((el) => {
el.appendText(
"Set `icon` field with icon shortcode in frontmatter of foler note to specify linked folder's icon"
);
el.createEl("br");
el.createEl("a", {
href: "https://github.com/aidenlx/obsidian-icon-shortcodes",
text: "Icon Shortcodes v0.5.1+"
});
el.appendText(" Required. ");
if (!getApi2(this.plugin))
el.appendText("(Currently not enabled)");
el.createEl("br");
el.appendText("Restart obsidian to take effects");
})
);
}
setFocus() {
new import_obsidian15.Setting(this.containerEl).setHeading().setName("Focus").setDesc(
`You can use "Toggle Focus" option in folder context menu${import_obsidian15.Platform.isMobile ? "" : " or long press on folder title"} to focus on a specific folder`
);
if (!import_obsidian15.Platform.isMobile)
this.addToggle(this.containerEl, "longPressFocus").setName("Long Press on Folder to Focus").setDesc(
"Long press with mouse on folder name inside file explorer to focus the folder. Only work on Desktop, reload obsidian to take effects"
);
new import_obsidian15.Setting(this.containerEl).addText((text) => {
Object.assign(text.inputEl, {
type: "number",
min: "0.2",
step: "0.1",
required: true
});
text.inputEl.addClass("input-short");
text.inputEl.insertAdjacentElement(
"afterend",
createSpan({ cls: ["validity", "unit"], text: "second(s)" })
);
text.setValue(`${this.plugin.longPressDelay / 1e3}`).onChange(async (val) => {
const delay = +val * 1e3;
this.plugin.longPressDelay = delay;
await this.plugin.saveSettings();
});
}).setName("Long Press Delay");
}
addToggle(addTo, key, onSet) {
return new import_obsidian15.Setting(addTo).addToggle((toggle) => {
toggle.setValue(this.plugin.settings[key]).onChange(
(value) => (this.plugin.settings[key] = value, onSet && onSet(value), this.plugin.saveSettings())
);
});
}
};
// src/fn-main.ts
var foldervNotifiedKey = "foldervNotified";
var ALxFolderNote = class extends import_obsidian16.Plugin {
settings = DEFAULT_SETTINGS;
get CoreApi() {
let message;
let api = getApi(this) || getApi();
if (api) {
return api;
} else {
message = "Failed to initialize alx-folder-note";
new ClickNotice(
message + ": Click here for more details",
() => this.app.setting.openTabById(this.manifest.id)
);
throw new Error(message + ": folder-note-core not available");
}
}
get IconSCAPI() {
if (this.settings.folderIcon) {
return getApi2(this);
}
return null;
}
noticeFoldervChange() {
if (!this.app.plugins.plugins["alx-folder-note-folderv"] && // not installed
!Number(localStorage.getItem(foldervNotifiedKey))) {
new ClickNotice(
(frag) => {
frag.appendText(
"Since v0.13.0, folder overview (folderv) has become an optional component that requires a dedicated plugin, "
);
frag.createEl("button", {
text: "Go to Folder Overview Section of the Setting Tab to Install"
}).addEventListener(
"click",
() => this.app.setting.openTabById(this.manifest.id)
);
frag.createEl("button", {
text: "Don't show this again"
});
},
() => localStorage.setItem(foldervNotifiedKey, "1"),
5e3
);
}
}
initialized = false;
initialize() {
if (this.initialized)
return;
fe_patch_default(this);
document.body.toggleClass(
MobileNoClickMark,
!this.settings.mobileClickToOpen
);
document.body.toggleClass(
noHideNoteMark,
!this.settings.hideNoteInExplorer
);
this.initialized = true;
}
async onload() {
console.log("loading alx-folder-note");
await this.loadSettings();
let tab = new ALxFolderNoteSettingTab(this.app, this);
if (!tab.checkMigrated())
new import_obsidian16.Notice(
"Old config not yet migrated, \nOpen Settings Tab of ALx Folder Note for details"
);
this.addSettingTab(tab);
let initCalled = false;
const init = () => {
initCalled = true;
set_folder_icon_default(this);
this.app.workspace.onLayoutReady(this.initialize.bind(this));
drag_patch_default(this);
this.noticeFoldervChange();
};
if (getApi(this)) {
init();
} else {
if (this.app.plugins.enabledPlugins.has("folder-note-core")) {
const timeoutId = window.setTimeout(() => {
if (!initCalled) {
this.app.vault.offref(evtRef);
throw new Error(
"folder-note-core enabled but fail to load within 5s"
);
}
}, 5e3);
const evtRef = this.app.vault.on("folder-note:api-ready", () => {
init();
if (timeoutId)
window.clearTimeout(timeoutId);
this.app.vault.offref(evtRef);
});
} else {
this.CoreApi;
}
}
}
async loadSettings() {
this.settings = { ...this.settings, ...await this.loadData() };
this.setupLongPressDelay();
}
async saveSettings() {
await this.saveData(this.settings);
}
get longPressDelay() {
return this.settings.longPressDelay;
}
set longPressDelay(delay) {
this.settings.longPressDelay = delay;
document.body.dataset[longPressDelayDataKey] = `${delay}`;
}
setupLongPressDelay() {
this.longPressDelay = this.longPressDelay;
this.register(() => delete document.body.dataset[longPressDelayDataKey]);
}
};
var longPressDelayDataKey = "longPressDelay";
/*!
* long-press-event
* Pure JavaScript long-press-event
* https://github.com/john-doherty/long-press-event
* @author John Doherty <www.johndoherty.info>
* @license MIT
*/
/*! Bundled license information:
is-extendable/index.js:
(*!
* is-extendable <https://github.com/jonschlinkert/is-extendable>
*
* Copyright (c) 2015, Jon Schlinkert.
* Licensed under the MIT License.
*)
strip-bom-string/index.js:
(*!
* strip-bom-string <https://github.com/jonschlinkert/strip-bom-string>
*
* Copyright (c) 2015, 2017, Jon Schlinkert.
* Released under the MIT License.
*)
*/
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fzc2VydC1uZXZlckAxLjIuMS9ub2RlX21vZHVsZXMvYXNzZXJ0LW5ldmVyL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9wYXRoLWJyb3dzZXJpZnlAMS4wLjEvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va2luZC1vZkA2LjAuMy9ub2RlX21vZHVsZXMva2luZC1vZi9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vaXMtZXh0ZW5kYWJsZUAwLjEuMS9ub2RlX21vZHVsZXMvaXMtZXh0ZW5kYWJsZS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZXh0ZW5kLXNoYWxsb3dAMi4wLjEvbm9kZV9tb2R1bGVzL2V4dGVuZC1zaGFsbG93L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9zZWN0aW9uLW1hdHRlckAxLjAuMC9ub2RlX21vZHVsZXMvc2VjdGlvbi1tYXR0ZXIvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9tYXJrLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc3RyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tYXAuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9udWxsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvaW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2NvcmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvdGltZXN0YW1wLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21lcmdlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3BhaXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NldC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy91bmRlZmluZWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvcmVnZXhwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9qcy15YW1sQDMuMTQuMS9ub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9sb2FkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2R1bXBlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vanMteWFtbEAzLjE0LjEvbm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2pzLXlhbWxAMy4xNC4xL25vZGVfbW9kdWxlcy9qcy15YW1sL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9ncmF5LW1hdHRlckA0LjAuMy9ub2RlX21vZHVsZXMvZ3JheS1tYXR0ZXIvbGliL2VuZ2luZXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmlwLWJvbS1zdHJpbmdAMS4wLjAvbm9kZV9tb2R1bGVzL3N0cmlwLWJvbS1zdHJpbmcvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dyYXktbWF0dGVyQDQuMC4zL25vZGVfbW9kdWxlcy9ncmF5LW1hdHRlci9saWIvdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dyYXktbWF0dGVyQDQuMC4zL25vZGVfbW9kdWxlcy9ncmF5LW1hdHRlci9saWIvZGVmYXVsdHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dyYXktbWF0dGVyQDQuMC4zL25vZGVfbW9kdWxlcy9ncmF5LW1hdHRlci9saWIvZW5naW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9ncmF5LW1hdHRlckA0LjAuMy9ub2RlX21vZHVsZXMvZ3JheS1tYXR0ZXIvbGliL3N0cmluZ2lmeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZ3JheS1tYXR0ZXJANC4wLjMvbm9kZV9tb2R1bGVzL2dyYXktbWF0dGVyL2xpYi9leGNlcnB0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9ncmF5LW1hdHRlckA0LjAuMy9ub2RlX21vZHVsZXMvZ3JheS1tYXR0ZXIvbGliL3RvLWZpbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dyYXktbWF0dGVyQDQuMC4zL25vZGVfbW9kdWxlcy9ncmF5LW1hdHRlci9saWIvcGFyc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2dyYXktbWF0dGVyQDQuMC4zL25vZGVfbW9kdWxlcy9ncmF5LW1hdHRlci9pbmRleC5qcyIsICIuLi9zcmMvZm4tbWFpbi50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQGFpZGVubHgrZm9sZGVyLW5vdGUtY29yZUAxLjMuNi9ub2RlX21vZHVsZXMvQGFpZGVubHgvZm9sZGVyLW5vdGUtY29yZS9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BhaWRlbmx4K2ZvbGRlci1ub3RlLWNvcmVAMS4zLjYvbm9kZV9tb2R1bGVzL0BhaWRlbmx4L2ZvbGRlci1ub3RlLWNvcmUvc3JjL3R5cGluZ3MvYXBpLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWlkZW5seCtvYnNpZGlhbi1pY29uLXNob3J0Y29kZXNAMC45LjAvbm9kZV9tb2R1bGVzL0BhaWRlbmx4L29ic2lkaWFuLWljb24tc2hvcnRjb2Rlcy9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2RyYWctcGF0Y2gudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21vbmtleS1hcm91bmRAMi4zLjAvbm9kZV9tb2R1bGVzL21vbmtleS1hcm91bmQvbWpzL2luZGV4LmpzIiwgIi4uL3NyYy9mZS1wYXRjaC50cyIsICIuLi9zcmMvY2xpY2staGFuZGxlci50cyIsICIuLi9zcmMvbWlzYy50cyIsICIuLi9zcmMvZmUtaGFuZGxlci9hY3RpdmUtZm9sZGVyLnRzIiwgIi4uL3NyYy9mZS1oYW5kbGVyL2Jhc2UudHMiLCAiLi4vc3JjL2ZlLWhhbmRsZXIvZm9sZGVyLWZvY3VzLnRzIiwgIi4uL3NyYy9mZS1oYW5kbGVyL2ZvbGRlci1tYXJrLnRzIiwgIi4uL3NyYy9mZS1oYW5kbGVyL2luZGV4LnRzIiwgIi4uL3NyYy9tb2R1bGVzL2xvbmctcHJlc3MudHMiLCAiLi4vc3JjL21vZHVsZXMvc2V0LWZvbGRlci1pY29uLnRzIiwgIi4uL3NyYy9zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZXhoYXVzdGl2ZSBjaGVja3Mgb2YgZGlzY3JpbWluYXRlZCB1bmlvbnMuXG4gKiBodHRwczovL2Jhc2FyYXQuZ2l0Ym9va3MuaW8vdHlwZXNjcmlwdC9kb2NzL3R5cGVzL2Rpc2NyaW1pbmF0ZWQtdW5pb25zLmh0bWxcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIHR5cGUgQSA9IHt0eXBlOiAnYSd9O1xuICogICAgdHlwZSBCID0ge3R5cGU6ICdiJ307XG4gKiAgICB0eXBlIFVuaW9uID0gQSB8IEI7XG4gKlxuICogICAgZnVuY3Rpb24gZG9Tb21ldGhpbmcoYXJnOiBVbmlvbikge1xuICogICAgICBpZiAoYXJnLnR5cGUgPT09ICdhJykge1xuICogICAgICAgIHJldHVybiBzb21ldGhpbmc7XG4gKiAgICAgIH1cbiAqXG4gKiAgICAgIGlmIChhcmcudHlwZSA9PT0gJ2InKSB7XG4gKiAgICAgICAgcmV0dXJuIHNvbWV0aGluZ0Vsc2U7XG4gKiAgICAgIH1cbiAqXG4gKiAgICAgIC8vIFRTIHdpbGwgZXJyb3IgaWYgdGhlcmUgYXJlIG90aGVyIHR5cGVzIGluIHRoZSB1bmlvblxuICogICAgICAvLyBXaWxsIHRocm93IGFuIEVycm9yIHdoZW4gY2FsbGVkIGF0IHJ1bnRpbWUuXG4gKiAgICAgIC8vIFVzZSBgYXNzZXJ0TmV2ZXIoYXJnLCB0cnVlKWAgaW5zdGVhZCB0byBmYWlsIHNpbGVudGx5LlxuICogICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIoYXJnKTtcbiAqICAgIH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG5vVGhyb3cpIHtcbiAgICBpZiAobm9UaHJvdykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBkaXNjcmltaW5hdGVkIHVuaW9uIG1lbWJlcjogXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuZXhwb3J0cy5kZWZhdWx0ID0gYXNzZXJ0TmV2ZXI7XG4iLCAiLy8gJ3BhdGgnIG1vZHVsZSBleHRyYWN0ZWQgZnJvbSBOb2RlLmpzIHY4LjExLjEgKG9ubHkgdGhlIHBvc2l4IHBhcnQpXG4vLyB0cmFuc3BsaXRlZCB3aXRoIEJhYmVsXG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAnICsgSlNPTi5zdHJpbmdpZnkocGF0aCkpO1xuICB9XG59XG5cbi8vIFJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCB3aXRoIGRpcmVjdG9yeSBuYW1lc1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nUG9zaXgocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICB2YXIgbGFzdFNsYXNoID0gLTE7XG4gIHZhciBkb3RzID0gMDtcbiAgdmFyIGNvZGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKVxuICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBlbHNlIGlmIChjb2RlID09PSA0NyAvKi8qLylcbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGNvZGUgPSA0NyAvKi8qLztcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIHtcbiAgICAgICAgLy8gTk9PUFxuICAgICAgfSBlbHNlIGlmIChsYXN0U2xhc2ggIT09IGkgLSAxICYmIGRvdHMgPT09IDIpIHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAxKSAhPT0gNDYgLyouKi8gfHwgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDIpICE9PSA0NiAvKi4qLykge1xuICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFyIGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMiB8fCByZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXMgKz0gJy8uLic7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzID0gJy4uJztcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMClcbiAgICAgICAgICByZXMgKz0gJy8nICsgcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcyA9IHBhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaSk7XG4gICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gaSAtIGxhc3RTbGFzaCAtIDE7XG4gICAgICB9XG4gICAgICBsYXN0U2xhc2ggPSBpO1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA0NiAvKi4qLyAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXQoc2VwLCBwYXRoT2JqZWN0KSB7XG4gIHZhciBkaXIgPSBwYXRoT2JqZWN0LmRpciB8fCBwYXRoT2JqZWN0LnJvb3Q7XG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8IChwYXRoT2JqZWN0Lm5hbWUgfHwgJycpICsgKHBhdGhPYmplY3QuZXh0IHx8ICcnKTtcbiAgaWYgKCFkaXIpIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICBpZiAoZGlyID09PSBwYXRoT2JqZWN0LnJvb3QpIHtcbiAgICByZXR1cm4gZGlyICsgYmFzZTtcbiAgfVxuICByZXR1cm4gZGlyICsgc2VwICsgYmFzZTtcbn1cblxudmFyIHBvc2l4ID0ge1xuICAvLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgdmFyIHJlc29sdmVkUGF0aCA9ICcnO1xuICAgIHZhciByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gICAgdmFyIGN3ZDtcblxuICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgICB2YXIgcGF0aDtcbiAgICAgIGlmIChpID49IDApXG4gICAgICAgIHBhdGggPSBhcmd1bWVudHNbaV07XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGN3ZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIHBhdGggPSBjd2Q7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nUG9zaXgocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSk7XG5cbiAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkge1xuICAgICAgaWYgKHJlc29sdmVkUGF0aC5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnLic7XG4gICAgfVxuICB9LFxuXG4gIG5vcm1hbGl6ZTogZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuXG4gICAgdmFyIGlzQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qLyovO1xuICAgIHZhciB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSA0NyAvKi8qLztcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgIHBhdGggPSBub3JtYWxpemVTdHJpbmdQb3NpeChwYXRoLCAhaXNBYnNvbHV0ZSk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgJiYgIWlzQWJzb2x1dGUpIHBhdGggPSAnLic7XG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCAmJiB0cmFpbGluZ1NlcGFyYXRvcikgcGF0aCArPSAnLyc7XG5cbiAgICBpZiAoaXNBYnNvbHV0ZSkgcmV0dXJuICcvJyArIHBhdGg7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgaXNBYnNvbHV0ZTogZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gIH0sXG5cbiAgam9pbjogZnVuY3Rpb24gam9pbigpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiAnLic7XG4gICAgdmFyIGpvaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGFzc2VydFBhdGgoYXJnKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgam9pbmVkID0gYXJnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgam9pbmVkICs9ICcvJyArIGFyZztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuICcuJztcbiAgICByZXR1cm4gcG9zaXgubm9ybWFsaXplKGpvaW5lZCk7XG4gIH0sXG5cbiAgcmVsYXRpdmU6IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gICAgYXNzZXJ0UGF0aChmcm9tKTtcbiAgICBhc3NlcnRQYXRoKHRvKTtcblxuICAgIGlmIChmcm9tID09PSB0bykgcmV0dXJuICcnO1xuXG4gICAgZnJvbSA9IHBvc2l4LnJlc29sdmUoZnJvbSk7XG4gICAgdG8gPSBwb3NpeC5yZXNvbHZlKHRvKTtcblxuICAgIGlmIChmcm9tID09PSB0bykgcmV0dXJuICcnO1xuXG4gICAgLy8gVHJpbSBhbnkgbGVhZGluZyBiYWNrc2xhc2hlc1xuICAgIHZhciBmcm9tU3RhcnQgPSAxO1xuICAgIGZvciAoOyBmcm9tU3RhcnQgPCBmcm9tLmxlbmd0aDsgKytmcm9tU3RhcnQpIHtcbiAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0KSAhPT0gNDcgLyovKi8pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZnJvbUVuZCA9IGZyb20ubGVuZ3RoO1xuICAgIHZhciBmcm9tTGVuID0gZnJvbUVuZCAtIGZyb21TdGFydDtcblxuICAgIC8vIFRyaW0gYW55IGxlYWRpbmcgYmFja3NsYXNoZXNcbiAgICB2YXIgdG9TdGFydCA9IDE7XG4gICAgZm9yICg7IHRvU3RhcnQgPCB0by5sZW5ndGg7ICsrdG9TdGFydCkge1xuICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCkgIT09IDQ3IC8qLyovKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHRvRW5kID0gdG8ubGVuZ3RoO1xuICAgIHZhciB0b0xlbiA9IHRvRW5kIC0gdG9TdGFydDtcblxuICAgIC8vIENvbXBhcmUgcGF0aHMgdG8gZmluZCB0aGUgbG9uZ2VzdCBjb21tb24gcGF0aCBmcm9tIHJvb3RcbiAgICB2YXIgbGVuZ3RoID0gZnJvbUxlbiA8IHRvTGVuID8gZnJvbUxlbiA6IHRvTGVuO1xuICAgIHZhciBsYXN0Q29tbW9uU2VwID0gLTE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDw9IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICh0b0xlbiA+IGxlbmd0aCkge1xuICAgICAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyJzsgdG89Jy9mb28vYmFyL2JheidcbiAgICAgICAgICAgIHJldHVybiB0by5zbGljZSh0b1N0YXJ0ICsgaSArIDEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSByb290XG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nLyc7IHRvPScvZm9vJ1xuICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZnJvbUxlbiA+IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSkgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGBmcm9tYC5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvZm9vL2Jhci9iYXonOyB0bz0nL2Zvby9iYXInXG4gICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvbyc7IHRvPScvJ1xuICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpO1xuICAgICAgdmFyIHRvQ29kZSA9IHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpO1xuICAgICAgaWYgKGZyb21Db2RlICE9PSB0b0NvZGUpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IDQ3IC8qLyovKVxuICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgLy8gR2VuZXJhdGUgdGhlIHJlbGF0aXZlIHBhdGggYmFzZWQgb24gdGhlIHBhdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGB0b2BcbiAgICAvLyBhbmQgYGZyb21gXG4gICAgZm9yIChpID0gZnJvbVN0YXJ0ICsgbGFzdENvbW1vblNlcCArIDE7IGkgPD0gZnJvbUVuZDsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gZnJvbUVuZCB8fCBmcm9tLmNoYXJDb2RlQXQoaSkgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgIGlmIChvdXQubGVuZ3RoID09PSAwKVxuICAgICAgICAgIG91dCArPSAnLi4nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgb3V0ICs9ICcvLi4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3RseSwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBkZXN0aW5hdGlvbiAoYHRvYCkgcGF0aCB0aGF0IGNvbWVzIGFmdGVyXG4gICAgLy8gdGhlIGNvbW1vbiBwYXRoIHBhcnRzXG4gICAgaWYgKG91dC5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIG91dCArIHRvLnNsaWNlKHRvU3RhcnQgKyBsYXN0Q29tbW9uU2VwKTtcbiAgICBlbHNlIHtcbiAgICAgIHRvU3RhcnQgKz0gbGFzdENvbW1vblNlcDtcbiAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSA0NyAvKi8qLylcbiAgICAgICAgKyt0b1N0YXJ0O1xuICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQpO1xuICAgIH1cbiAgfSxcblxuICBfbWFrZUxvbmc6IGZ1bmN0aW9uIF9tYWtlTG9uZyhwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgZGlybmFtZTogZnVuY3Rpb24gZGlybmFtZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG4gICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIGhhc1Jvb3QgPSBjb2RlID09PSA0NyAvKi8qLztcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiBoYXNSb290ID8gJy8nIDogJy4nO1xuICAgIGlmIChoYXNSb290ICYmIGVuZCA9PT0gMSkgcmV0dXJuICcvLyc7XG4gICAgcmV0dXJuIHBhdGguc2xpY2UoMCwgZW5kKTtcbiAgfSxcblxuICBiYXNlbmFtZTogZnVuY3Rpb24gYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBleHQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImV4dFwiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuXG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoZXh0ICE9PSB1bmRlZmluZWQgJiYgZXh0Lmxlbmd0aCA+IDAgJiYgZXh0Lmxlbmd0aCA8PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGV4dC5sZW5ndGggPT09IHBhdGgubGVuZ3RoICYmIGV4dCA9PT0gcGF0aCkgcmV0dXJuICcnO1xuICAgICAgdmFyIGV4dElkeCA9IGV4dC5sZW5ndGggLSAxO1xuICAgICAgdmFyIGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTtcbiAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCByZW1lbWJlciB0aGlzIGluZGV4IGluIGNhc2VcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZ1xuICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHRJZHggPj0gMCkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBleHBsaWNpdCBleHRlbnNpb25cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBleHQuY2hhckNvZGVBdChleHRJZHgpKSB7XG4gICAgICAgICAgICAgIGlmICgtLWV4dElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uIGRvZXMgbm90IG1hdGNoLCBzbyBvdXIgcmVzdWx0IGlzIHRoZSBlbnRpcmUgcGF0aFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgICAgZXh0SWR4ID0gLTE7XG4gICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA9PT0gZW5kKSBlbmQgPSBmaXJzdE5vblNsYXNoRW5kO2Vsc2UgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IHBhdGgubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgICAgICAvLyBwYXRoIGNvbXBvbmVudFxuICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJyc7XG4gICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgZXh0bmFtZTogZnVuY3Rpb24gZXh0bmFtZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgICB2YXIgc3RhcnRQYXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kXG4gICAgdmFyIHByZURvdFN0YXRlID0gMDtcbiAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSlcbiAgICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSlcbiAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90XG4gICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgICAgcHJlRG90U3RhdGUgPT09IDEgJiYgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7XG4gIH0sXG5cbiAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQocGF0aE9iamVjdCkge1xuICAgIGlmIChwYXRoT2JqZWN0ID09PSBudWxsIHx8IHR5cGVvZiBwYXRoT2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwicGF0aE9iamVjdFwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBwYXRoT2JqZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mb3JtYXQoJy8nLCBwYXRoT2JqZWN0KTtcbiAgfSxcblxuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UocGF0aCkge1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICB2YXIgcmV0ID0geyByb290OiAnJywgZGlyOiAnJywgYmFzZTogJycsIGV4dDogJycsIG5hbWU6ICcnIH07XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gcmV0O1xuICAgIHZhciBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBpc0Fic29sdXRlID0gY29kZSA9PT0gNDcgLyovKi87XG4gICAgdmFyIHN0YXJ0O1xuICAgIGlmIChpc0Fic29sdXRlKSB7XG4gICAgICByZXQucm9vdCA9ICcvJztcbiAgICAgIHN0YXJ0ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgICB2YXIgc3RhcnRQYXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgdmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7XG5cbiAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kXG4gICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgICB2YXIgcHJlRG90U3RhdGUgPSAwO1xuXG4gICAgLy8gR2V0IG5vbi1kaXIgaW5mb1xuICAgIGZvciAoOyBpID49IHN0YXJ0OyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgc3RhcnREb3QgPSBpO2Vsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSBwcmVEb3RTdGF0ZSA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fFxuICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkge1xuICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgaWYgKHN0YXJ0UGFydCA9PT0gMCAmJiBpc0Fic29sdXRlKSByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aC5zbGljZSgxLCBlbmQpO2Vsc2UgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhcnRQYXJ0ID09PSAwICYmIGlzQWJzb2x1dGUpIHtcbiAgICAgICAgcmV0Lm5hbWUgPSBwYXRoLnNsaWNlKDEsIHN0YXJ0RG90KTtcbiAgICAgICAgcmV0LmJhc2UgPSBwYXRoLnNsaWNlKDEsIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBzdGFydERvdCk7XG4gICAgICAgIHJldC5iYXNlID0gcGF0aC5zbGljZShzdGFydFBhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICByZXQuZXh0ID0gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRQYXJ0ID4gMCkgcmV0LmRpciA9IHBhdGguc2xpY2UoMCwgc3RhcnRQYXJ0IC0gMSk7ZWxzZSBpZiAoaXNBYnNvbHV0ZSkgcmV0LmRpciA9ICcvJztcblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgc2VwOiAnLycsXG4gIGRlbGltaXRlcjogJzonLFxuICB3aW4zMjogbnVsbCxcbiAgcG9zaXg6IG51bGxcbn07XG5cbnBvc2l4LnBvc2l4ID0gcG9zaXg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXg7XG4iLCAidmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIGlmICh2YWwgPT09IHZvaWQgMCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuXG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdib29sZWFuJykgcmV0dXJuICdib29sZWFuJztcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSByZXR1cm4gJ3N0cmluZyc7XG4gIGlmICh0eXBlID09PSAnbnVtYmVyJykgcmV0dXJuICdudW1iZXInO1xuICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHJldHVybiAnc3ltYm9sJztcbiAgaWYgKHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXNHZW5lcmF0b3JGbih2YWwpID8gJ2dlbmVyYXRvcmZ1bmN0aW9uJyA6ICdmdW5jdGlvbic7XG4gIH1cblxuICBpZiAoaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzQnVmZmVyKHZhbCkpIHJldHVybiAnYnVmZmVyJztcbiAgaWYgKGlzQXJndW1lbnRzKHZhbCkpIHJldHVybiAnYXJndW1lbnRzJztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgaWYgKGlzUmVnZXhwKHZhbCkpIHJldHVybiAncmVnZXhwJztcblxuICBzd2l0Y2ggKGN0b3JOYW1lKHZhbCkpIHtcbiAgICBjYXNlICdTeW1ib2wnOiByZXR1cm4gJ3N5bWJvbCc7XG4gICAgY2FzZSAnUHJvbWlzZSc6IHJldHVybiAncHJvbWlzZSc7XG5cbiAgICAvLyBTZXQsIE1hcCwgV2Vha1NldCwgV2Vha01hcFxuICAgIGNhc2UgJ1dlYWtNYXAnOiByZXR1cm4gJ3dlYWttYXAnO1xuICAgIGNhc2UgJ1dlYWtTZXQnOiByZXR1cm4gJ3dlYWtzZXQnO1xuICAgIGNhc2UgJ01hcCc6IHJldHVybiAnbWFwJztcbiAgICBjYXNlICdTZXQnOiByZXR1cm4gJ3NldCc7XG5cbiAgICAvLyA4LWJpdCB0eXBlZCBhcnJheXNcbiAgICBjYXNlICdJbnQ4QXJyYXknOiByZXR1cm4gJ2ludDhhcnJheSc7XG4gICAgY2FzZSAnVWludDhBcnJheSc6IHJldHVybiAndWludDhhcnJheSc7XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOiByZXR1cm4gJ3VpbnQ4Y2xhbXBlZGFycmF5JztcblxuICAgIC8vIDE2LWJpdCB0eXBlZCBhcnJheXNcbiAgICBjYXNlICdJbnQxNkFycmF5JzogcmV0dXJuICdpbnQxNmFycmF5JztcbiAgICBjYXNlICdVaW50MTZBcnJheSc6IHJldHVybiAndWludDE2YXJyYXknO1xuXG4gICAgLy8gMzItYml0IHR5cGVkIGFycmF5c1xuICAgIGNhc2UgJ0ludDMyQXJyYXknOiByZXR1cm4gJ2ludDMyYXJyYXknO1xuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzogcmV0dXJuICd1aW50MzJhcnJheSc7XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzogcmV0dXJuICdmbG9hdDMyYXJyYXknO1xuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6IHJldHVybiAnZmxvYXQ2NGFycmF5JztcbiAgfVxuXG4gIGlmIChpc0dlbmVyYXRvck9iaih2YWwpKSB7XG4gICAgcmV0dXJuICdnZW5lcmF0b3InO1xuICB9XG5cbiAgLy8gTm9uLXBsYWluIG9iamVjdHNcbiAgdHlwZSA9IHRvU3RyaW5nLmNhbGwodmFsKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnW29iamVjdCBPYmplY3RdJzogcmV0dXJuICdvYmplY3QnO1xuICAgIC8vIGl0ZXJhdG9yc1xuICAgIGNhc2UgJ1tvYmplY3QgTWFwIEl0ZXJhdG9yXSc6IHJldHVybiAnbWFwaXRlcmF0b3InO1xuICAgIGNhc2UgJ1tvYmplY3QgU2V0IEl0ZXJhdG9yXSc6IHJldHVybiAnc2V0aXRlcmF0b3InO1xuICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nIEl0ZXJhdG9yXSc6IHJldHVybiAnc3RyaW5naXRlcmF0b3InO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXkgSXRlcmF0b3JdJzogcmV0dXJuICdhcnJheWl0ZXJhdG9yJztcbiAgfVxuXG4gIC8vIG90aGVyXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59O1xuXG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQXJyYXk7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAodHlwZW9mIHZhbC5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09ICdudW1iZXInKTtcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiB2YWwuZ2V0RGF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNSZWdleHAodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC5mbGFncyA9PT0gJ3N0cmluZydcbiAgICAmJiB0eXBlb2YgdmFsLmlnbm9yZUNhc2UgPT09ICdib29sZWFuJ1xuICAgICYmIHR5cGVvZiB2YWwubXVsdGlsaW5lID09PSAnYm9vbGVhbidcbiAgICAmJiB0eXBlb2YgdmFsLmdsb2JhbCA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRvckZuKG5hbWUsIHZhbCkge1xuICByZXR1cm4gY3Rvck5hbWUobmFtZSkgPT09ICdHZW5lcmF0b3JGdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdG9yT2JqKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC50aHJvdyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiB2YWwucmV0dXJuID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIHZhbC5uZXh0ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWwpIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHZhbC5sZW5ndGggPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWwuY2FsbGVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZS5pbmRleE9mKCdjYWxsZWUnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBTYWZhcmkgNS03ICg4LTEwIHlyLW9sZCBicm93c2VyKSxcbiAqIHRha2UgYSBsb29rIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaXMtYnVmZmVyXG4gKi9cblxuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIGlmICh2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iLCAiLyohXG4gKiBpcy1leHRlbmRhYmxlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1leHRlbmRhYmxlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXh0ZW5kYWJsZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnICYmIHZhbCAhPT0gbnVsbFxuICAgICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCdpcy1leHRlbmRhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0ZW5kKG8vKiwgb2JqZWN0cyovKSB7XG4gIGlmICghaXNPYmplY3QobykpIHsgbyA9IHt9OyB9XG5cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2ldO1xuXG4gICAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICAgIGFzc2lnbihvLCBvYmopO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbztcbn07XG5cbmZ1bmN0aW9uIGFzc2lnbihhLCBiKSB7XG4gIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgaWYgKGhhc093bihiLCBrZXkpKSB7XG4gICAgICBhW2tleV0gPSBiW2tleV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBga2V5YCBpcyBhbiBvd24gcHJvcGVydHkgb2YgYG9iamAuXG4gKi9cblxuZnVuY3Rpb24gaGFzT3duKG9iaiwga2V5KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHR5cGVPZiA9IHJlcXVpcmUoJ2tpbmQtb2YnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCdleHRlbmQtc2hhbGxvdycpO1xuXG4vKipcbiAqIFBhcnNlIHNlY3Rpb25zIGluIGBpbnB1dGAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgc2VjdGlvbnMgPSByZXF1aXJlKCd7JT0gbmFtZSAlfScpO1xuICogdmFyIHJlc3VsdCA9IHNlY3Rpb25zKGlucHV0LCBvcHRpb25zKTtcbiAqIC8vIHsgY29udGVudDogJ0NvbnRlbnQgYmVmb3JlIHNlY3Rpb25zJywgc2VjdGlvbnM6IFtdIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfE9iamVjdH0gYGlucHV0YCBJZiBpbnB1dCBpcyBhbiBvYmplY3QsIGl0J3MgYGNvbnRlbnRgIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmcgb3IgYnVmZmVyLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGBjb250ZW50YCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIGBzZWN0aW9uc2Agb2JqZWN0cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0geyBwYXJzZTogb3B0aW9ucyB9O1xuICB9XG5cbiAgdmFyIGZpbGUgPSB0b09iamVjdChpbnB1dCk7XG4gIHZhciBkZWZhdWx0cyA9IHtzZWN0aW9uX2RlbGltaXRlcjogJy0tLScsIHBhcnNlOiBpZGVudGl0eX07XG4gIHZhciBvcHRzID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIHZhciBkZWxpbSA9IG9wdHMuc2VjdGlvbl9kZWxpbWl0ZXI7XG4gIHZhciBsaW5lcyA9IGZpbGUuY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICB2YXIgc2VjdGlvbnMgPSBudWxsO1xuICB2YXIgc2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24oKTtcbiAgdmFyIGNvbnRlbnQgPSBbXTtcbiAgdmFyIHN0YWNrID0gW107XG5cbiAgZnVuY3Rpb24gaW5pdFNlY3Rpb25zKHZhbCkge1xuICAgIGZpbGUuY29udGVudCA9IHZhbDtcbiAgICBzZWN0aW9ucyA9IFtdO1xuICAgIGNvbnRlbnQgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlU2VjdGlvbih2YWwpIHtcbiAgICBpZiAoc3RhY2subGVuZ3RoKSB7XG4gICAgICBzZWN0aW9uLmtleSA9IGdldEtleShzdGFja1swXSwgZGVsaW0pO1xuICAgICAgc2VjdGlvbi5jb250ZW50ID0gdmFsO1xuICAgICAgb3B0cy5wYXJzZShzZWN0aW9uLCBzZWN0aW9ucyk7XG4gICAgICBzZWN0aW9ucy5wdXNoKHNlY3Rpb24pO1xuICAgICAgc2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24oKTtcbiAgICAgIGNvbnRlbnQgPSBbXTtcbiAgICAgIHN0YWNrID0gW107XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsaW5lID0gbGluZXNbaV07XG4gICAgdmFyIGxlbiA9IHN0YWNrLmxlbmd0aDtcbiAgICB2YXIgbG4gPSBsaW5lLnRyaW0oKTtcblxuICAgIGlmIChpc0RlbGltaXRlcihsbiwgZGVsaW0pKSB7XG4gICAgICBpZiAobG4ubGVuZ3RoID09PSAzICYmIGkgIT09IDApIHtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCB8fCBsZW4gPT09IDIpIHtcbiAgICAgICAgICBjb250ZW50LnB1c2gobGluZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2sucHVzaChsbik7XG4gICAgICAgIHNlY3Rpb24uZGF0YSA9IGNvbnRlbnQuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnRlbnQgPSBbXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICBpbml0U2VjdGlvbnMoY29udGVudC5qb2luKCdcXG4nKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsZW4gPT09IDIpIHtcbiAgICAgICAgY2xvc2VTZWN0aW9uKGNvbnRlbnQuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICBzdGFjay5wdXNoKGxuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnRlbnQucHVzaChsaW5lKTtcbiAgfVxuXG4gIGlmIChzZWN0aW9ucyA9PT0gbnVsbCkge1xuICAgIGluaXRTZWN0aW9ucyhjb250ZW50LmpvaW4oJ1xcbicpKTtcbiAgfSBlbHNlIHtcbiAgICBjbG9zZVNlY3Rpb24oY29udGVudC5qb2luKCdcXG4nKSk7XG4gIH1cblxuICBmaWxlLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gIHJldHVybiBmaWxlO1xufTtcblxuZnVuY3Rpb24gaXNEZWxpbWl0ZXIobGluZSwgZGVsaW0pIHtcbiAgaWYgKGxpbmUuc2xpY2UoMCwgZGVsaW0ubGVuZ3RoKSAhPT0gZGVsaW0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbmUuY2hhckF0KGRlbGltLmxlbmd0aCArIDEpID09PSBkZWxpbS5zbGljZSgtMSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KGlucHV0KSB7XG4gIGlmICh0eXBlT2YoaW5wdXQpICE9PSAnb2JqZWN0Jykge1xuICAgIGlucHV0ID0geyBjb250ZW50OiBpbnB1dCB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnB1dC5jb250ZW50ICE9PSAnc3RyaW5nJyAmJiAhaXNCdWZmZXIoaW5wdXQuY29udGVudCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIGJ1ZmZlciBvciBzdHJpbmcnKTtcbiAgfVxuXG4gIGlucHV0LmNvbnRlbnQgPSBpbnB1dC5jb250ZW50LnRvU3RyaW5nKCk7XG4gIGlucHV0LnNlY3Rpb25zID0gW107XG4gIHJldHVybiBpbnB1dDtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KHZhbCwgZGVsaW0pIHtcbiAgcmV0dXJuIHZhbCA/IHZhbC5zbGljZShkZWxpbS5sZW5ndGgpLnRyaW0oKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWN0aW9uKCkge1xuICByZXR1cm4geyBrZXk6ICcnLCBkYXRhOiAnJywgY29udGVudDogJycgfTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHkodmFsKSB7XG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICBpZiAodmFsICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHx8IChzdWJqZWN0ID09PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiBpc09iamVjdChzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnKSAmJiAoc3ViamVjdCAhPT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gdG9BcnJheShzZXF1ZW5jZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZXF1ZW5jZSkpIHJldHVybiBzZXF1ZW5jZTtcbiAgZWxzZSBpZiAoaXNOb3RoaW5nKHNlcXVlbmNlKSkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBbIHNlcXVlbmNlIF07XG59XG5cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCBrZXksIHNvdXJjZUtleXM7XG5cbiAgaWYgKHNvdXJjZSkge1xuICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgY291bnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBjeWNsZTtcblxuICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDsgY3ljbGUgKz0gMSkge1xuICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIGlzTmVnYXRpdmVaZXJvKG51bWJlcikge1xuICByZXR1cm4gKG51bWJlciA9PT0gMCkgJiYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gMSAvIG51bWJlcik7XG59XG5cblxubW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nICAgICAgPSBpc05vdGhpbmc7XG5tb2R1bGUuZXhwb3J0cy5pc09iamVjdCAgICAgICA9IGlzT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMudG9BcnJheSAgICAgICAgPSB0b0FycmF5O1xubW9kdWxlLmV4cG9ydHMucmVwZWF0ICAgICAgICAgPSByZXBlYXQ7XG5tb2R1bGUuZXhwb3J0cy5pc05lZ2F0aXZlWmVybyA9IGlzTmVnYXRpdmVaZXJvO1xubW9kdWxlLmV4cG9ydHMuZXh0ZW5kICAgICAgICAgPSBleHRlbmQ7XG4iLCAiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIHRoaXMubmFtZSA9ICdZQU1MRXhjZXB0aW9uJztcbiAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gIHRoaXMubWFyayA9IG1hcms7XG4gIHRoaXMubWVzc2FnZSA9ICh0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKScpICsgKHRoaXMubWFyayA/ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpIDogJycpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbiovXG5cbnZhciBjb21tb24gICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBUeXBlICAgICAgICAgID0gcmVxdWlyZSgnLi90eXBlJyk7XG5cblxuZnVuY3Rpb24gY29tcGlsZUxpc3Qoc2NoZW1hLCBuYW1lLCByZXN1bHQpIHtcbiAgdmFyIGV4Y2x1ZGUgPSBbXTtcblxuICBzY2hlbWEuaW5jbHVkZS5mb3JFYWNoKGZ1bmN0aW9uIChpbmNsdWRlZFNjaGVtYSkge1xuICAgIHJlc3VsdCA9IGNvbXBpbGVMaXN0KGluY2x1ZGVkU2NoZW1hLCBuYW1lLCByZXN1bHQpO1xuICB9KTtcblxuICBzY2hlbWFbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudFR5cGUpIHtcbiAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7XG4gICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnICYmIHByZXZpb3VzVHlwZS5raW5kID09PSBjdXJyZW50VHlwZS5raW5kKSB7XG4gICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUeXBlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZnVuY3Rpb24gKHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleCkgPT09IC0xO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBjb21waWxlTWFwKC8qIGxpc3RzLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgICAgIHNjYWxhcjoge30sXG4gICAgICAgIHNlcXVlbmNlOiB7fSxcbiAgICAgICAgbWFwcGluZzoge30sXG4gICAgICAgIGZhbGxiYWNrOiB7fVxuICAgICAgfSwgaW5kZXgsIGxlbmd0aDtcblxuICBmdW5jdGlvbiBjb2xsZWN0VHlwZSh0eXBlKSB7XG4gICAgcmVzdWx0W3R5cGUua2luZF1bdHlwZS50YWddID0gcmVzdWx0WydmYWxsYmFjayddW3R5cGUudGFnXSA9IHR5cGU7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBhcmd1bWVudHNbaW5kZXhdLmZvckVhY2goY29sbGVjdFR5cGUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gU2NoZW1hKGRlZmluaXRpb24pIHtcbiAgdGhpcy5pbmNsdWRlICA9IGRlZmluaXRpb24uaW5jbHVkZSAgfHwgW107XG4gIHRoaXMuaW1wbGljaXQgPSBkZWZpbml0aW9uLmltcGxpY2l0IHx8IFtdO1xuICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbi5leHBsaWNpdCB8fCBbXTtcblxuICB0aGlzLmltcGxpY2l0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAodHlwZS5sb2FkS2luZCAmJiB0eXBlLmxvYWRLaW5kICE9PSAnc2NhbGFyJykge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1RoZXJlIGlzIGEgbm9uLXNjYWxhciB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBJbXBsaWNpdCByZXNvbHZpbmcgb2Ygc3VjaCB0eXBlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5jb21waWxlZEltcGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2ltcGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkRXhwbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnZXhwbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRUeXBlTWFwICA9IGNvbXBpbGVNYXAodGhpcy5jb21waWxlZEltcGxpY2l0LCB0aGlzLmNvbXBpbGVkRXhwbGljaXQpO1xufVxuXG5cblNjaGVtYS5ERUZBVUxUID0gbnVsbDtcblxuXG5TY2hlbWEuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlU2NoZW1hKCkge1xuICB2YXIgc2NoZW1hcywgdHlwZXM7XG5cbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgc2NoZW1hcyA9IFNjaGVtYS5ERUZBVUxUO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgIHNjaGVtYXMgPSBhcmd1bWVudHNbMF07XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBTY2hlbWEuY3JlYXRlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7XG4gIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpO1xuXG4gIGlmICghc2NoZW1hcy5ldmVyeShmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgaW5zdGFuY2VvZiBTY2hlbWE7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAoIXR5cGVzLmV2ZXJ5KGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTY2hlbWEoe1xuICAgIGluY2x1ZGU6IHNjaGVtYXMsXG4gICAgZXhwbGljaXQ6IHR5cGVzXG4gIH0pO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICcnOyB9XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsICIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTnVsbChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDEgJiYgZGF0YSA9PT0gJ34nKSB8fFxuICAgICAgICAgKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ251bGwnIHx8IGRhdGEgPT09ICdOdWxsJyB8fCBkYXRhID09PSAnTlVMTCcpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGwob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE51bGwsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE51bGwsXG4gIHByZWRpY2F0ZTogaXNOdWxsLFxuICByZXByZXNlbnQ6IHtcbiAgICBjYW5vbmljYWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICd+JzsgICAgfSxcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdudWxsJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOVUxMJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOdWxsJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ3RydWUnIHx8IGRhdGEgPT09ICdUcnVlJyB8fCBkYXRhID09PSAnVFJVRScpKSB8fFxuICAgICAgICAgKG1heCA9PT0gNSAmJiAoZGF0YSA9PT0gJ2ZhbHNlJyB8fCBkYXRhID09PSAnRmFsc2UnIHx8IGRhdGEgPT09ICdGQUxTRScpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJvb2xlYW4oZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUUlVFJztcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEJvb2xlYW5dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbixcbiAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sXG4gIHJlcHJlc2VudDoge1xuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ3RydWUnIDogJ2ZhbHNlJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUUlVFJyA6ICdGQUxTRSc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVHJ1ZScgOiAnRmFsc2UnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gaXNIZXhDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB8fFxuICAgICAgICAgKCgweDQxLyogQSAqLyA8PSBjKSAmJiAoYyA8PSAweDQ2LyogRiAqLykpIHx8XG4gICAgICAgICAoKDB4NjEvKiBhICovIDw9IGMpICYmIChjIDw9IDB4NjYvKiBmICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzT2N0Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzcvKiA3ICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjQ29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgaGFzRGlnaXRzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoIW1heCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gZGF0YVtpbmRleF07XG5cbiAgLy8gc2lnblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuICB9XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICAvLyAwXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gbWF4KSByZXR1cm4gdHJ1ZTtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG5cbiAgICAvLyBiYXNlIDIsIGJhc2UgOCwgYmFzZSAxNlxuXG4gICAgaWYgKGNoID09PSAnYicpIHtcbiAgICAgIC8vIGJhc2UgMlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cyAmJiBjaCAhPT0gJ18nO1xuICAgIH1cblxuXG4gICAgaWYgKGNoID09PSAneCcpIHtcbiAgICAgIC8vIGJhc2UgMTZcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmICghaXNIZXhDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzICYmIGNoICE9PSAnXyc7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHMgJiYgY2ggIT09ICdfJztcbiAgfVxuXG4gIC8vIGJhc2UgMTAgKGV4Y2VwdCAwKSBvciBiYXNlIDYwXG5cbiAgLy8gdmFsdWUgc2hvdWxkIG5vdCBzdGFydCB3aXRoIGBfYDtcbiAgaWYgKGNoID09PSAnXycpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICBpZiAoY2ggPT09ICc6JykgYnJlYWs7XG4gICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFNob3VsZCBoYXZlIGRpZ2l0cyBhbmQgc2hvdWxkIG5vdCBlbmQgd2l0aCBgX2BcbiAgaWYgKCFoYXNEaWdpdHMgfHwgY2ggPT09ICdfJykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmICFiYXNlNjAgLSBkb25lO1xuICBpZiAoY2ggIT09ICc6JykgcmV0dXJuIHRydWU7XG5cbiAgLy8gYmFzZTYwIGFsbW9zdCBub3QgdXNlZCwgbm8gbmVlZHMgdG8gb3B0aW1pemVcbiAgcmV0dXJuIC9eKDpbMC01XT9bMC05XSkrJC8udGVzdChkYXRhLnNsaWNlKGluZGV4KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YSwgc2lnbiA9IDEsIGNoLCBiYXNlLCBkaWdpdHMgPSBbXTtcblxuICBpZiAodmFsdWUuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXy9nLCAnJyk7XG4gIH1cblxuICBjaCA9IHZhbHVlWzBdO1xuXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBpZiAoY2ggPT09ICctJykgc2lnbiA9IC0xO1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgY2ggPSB2YWx1ZVswXTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gMDtcblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ2InKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCAyKTtcbiAgICBpZiAodmFsdWVbMV0gPT09ICd4JykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTYpO1xuICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDgpO1xuICB9XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlSW50KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gKGQgKiBiYXNlKTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cblxuICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmXG4gICAgICAgICAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEludGVnZXIsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEludGVnZXIsXG4gIHByZWRpY2F0ZTogaXNJbnRlZ2VyLFxuICByZXByZXNlbnQ6IHtcbiAgICBiaW5hcnk6ICAgICAgZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqID49IDAgPyAnMGInICsgb2JqLnRvU3RyaW5nKDIpIDogJy0wYicgKyBvYmoudG9TdHJpbmcoMikuc2xpY2UoMSk7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiA+PSAwID8gJzAnICArIG9iai50b1N0cmluZyg4KSA6ICctMCcgICsgb2JqLnRvU3RyaW5nKDgpLnNsaWNlKDEpOyB9LFxuICAgIGRlY2ltYWw6ICAgICBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmoudG9TdHJpbmcoMTApOyB9LFxuICAgIC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbiAgICBoZXhhZGVjaW1hbDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqID49IDAgPyAnMHgnICsgb2JqLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpIDogICctMHgnICsgb2JqLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAvLyAyLjVlNCwgMi41IGFuZCBpbnRlZ2Vyc1xuICAnXig/OlstK10/KD86MHxbMS05XVswLTlfXSopKD86XFxcXC5bMC05X10qKT8oPzpbZUVdWy0rXT9bMC05XSspPycgK1xuICAvLyAuMmU0LCAuMlxuICAvLyBzcGVjaWFsIGNhc2UsIHNlZW1zIG5vdCBmcm9tIHNwZWNcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspPycgK1xuICAvLyAyMDo1OVxuICAnfFstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXFxcLlswLTlfXSonICtcbiAgLy8gLmluZlxuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgLy8gLm5hblxuICAnfFxcXFwuKD86bmFufE5hTnxOQU4pKSQnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxGbG9hdChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSB8fFxuICAgICAgLy8gUXVpY2sgaGFjayB0byBub3QgYWxsb3cgaW50ZWdlcnMgZW5kIHdpdGggYF9gXG4gICAgICAvLyBQcm9iYWJseSBzaG91bGQgdXBkYXRlIHJlZ2V4cCAmIGNoZWNrIHNwZWVkXG4gICAgICBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gPT09ICdfJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sRmxvYXQoZGF0YSkge1xuICB2YXIgdmFsdWUsIHNpZ24sIGJhc2UsIGRpZ2l0cztcblxuICB2YWx1ZSAgPSBkYXRhLnJlcGxhY2UoL18vZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHNpZ24gICA9IHZhbHVlWzBdID09PSAnLScgPyAtMSA6IDE7XG4gIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICgnKy0nLmluZGV4T2YodmFsdWVbMF0pID49IDApIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnLmluZicpIHtcbiAgICByZXR1cm4gKHNpZ24gPT09IDEpID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09ICcubmFuJykge1xuICAgIHJldHVybiBOYU47XG5cbiAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgPj0gMCkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VGbG9hdCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwLjA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gZCAqIGJhc2U7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG4gIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZSwgMTApO1xufVxuXG5cbnZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvO1xuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sRmxvYXQob2JqZWN0LCBzdHlsZSkge1xuICB2YXIgcmVzO1xuXG4gIGlmIChpc05hTihvYmplY3QpKSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcubmFuJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLk5BTic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5OYU4nO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy0uaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLS5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICctLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKSB7XG4gICAgcmV0dXJuICctMC4wJztcbiAgfVxuXG4gIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7XG5cbiAgLy8gSlMgc3RyaW5naWZpZXIgY2FuIGJ1aWxkIHNjaWVudGlmaWMgZm9ybWF0IHdpdGhvdXQgZG90czogNWUtMTAwLFxuICAvLyB3aGlsZSBZQU1MIHJlcXVyZXMgZG90OiA1LmUtMTAwLiBGaXggaXQgd2l0aCBzaW1wbGUgaGFja1xuXG4gIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCdlJywgJy5lJykgOiByZXM7XG59XG5cbmZ1bmN0aW9uIGlzRmxvYXQob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IE51bWJlcl0nKSAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgIT09IDAgfHwgY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LFxuICBwcmVkaWNhdGU6IGlzRmxvYXQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsICIvLyBTdGFuZGFyZCBZQU1MJ3MgSlNPTiBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDMyMzFcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCB0aGlzIHNjaGVtYSBpcyBub3Qgc3VjaCBzdHJpY3QgYXMgZGVmaW5lZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy8gSXQgYWxsb3dzIG51bWJlcnMgaW4gYmluYXJ5IG5vdGFpb24sIHVzZSBgTnVsbGAgYW5kIGBOVUxMYCBhcyBgbnVsbGAsIGV0Yy5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2ZhaWxzYWZlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL251bGwnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Jvb2wnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2ludCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvZmxvYXQnKVxuICBdXG59KTtcbiIsICIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9EQVRFX1JFR0VYUCA9IG5ldyBSZWdFeHAoXG4gICdeKFswLTldWzAtOV1bMC05XVswLTldKScgICAgICAgICAgKyAvLyBbMV0geWVhclxuICAnLShbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzJdIG1vbnRoXG4gICctKFswLTldWzAtOV0pJCcpOyAgICAgICAgICAgICAgICAgICAvLyBbM10gZGF5XG5cbnZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzNdIGRheVxuICAnKD86W1R0XXxbIFxcXFx0XSspJyAgICAgICAgICAgICAgICAgKyAvLyAuLi5cbiAgJyhbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICArIC8vIFs0XSBob3VyXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNV0gbWludXRlXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNl0gc2Vjb25kXG4gICcoPzpcXFxcLihbMC05XSopKT8nICAgICAgICAgICAgICAgICArIC8vIFs3XSBmcmFjdGlvblxuICAnKD86WyBcXFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KScgKyAvLyBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyXG4gICcoPzo6KFswLTldWzAtOV0pKT8pKT8kJyk7ICAgICAgICAgICAvLyBbMTFdIHR6X21pbnV0ZVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSkgIT09IG51bGwpIHJldHVybiB0cnVlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgIT09IG51bGwpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfREFURV9SRUdFWFAuZXhlYyhkYXRhKTtcbiAgaWYgKG1hdGNoID09PSBudWxsKSBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxudmFyIE5vZGVCdWZmZXI7XG5cbnRyeSB7XG4gIC8vIEEgdHJpY2sgZm9yIGJyb3dzZXJpZmllZCB2ZXJzaW9uLCB0byBub3QgaW5jbHVkZSBgQnVmZmVyYCBzaGltXG4gIHZhciBfcmVxdWlyZSA9IHJlcXVpcmU7XG4gIE5vZGVCdWZmZXIgPSBfcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xufSBjYXRjaCAoX18pIHt9XG5cbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSB7XG4gICAgLy8gU3VwcG9ydCBub2RlIDYuKyBCdWZmZXIgQVBJIHdoZW4gYXZhaWxhYmxlXG4gICAgcmV0dXJuIE5vZGVCdWZmZXIuZnJvbSA/IE5vZGVCdWZmZXIuZnJvbShyZXN1bHQpIDogbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnJywgYml0cyA9IDAsIGlkeCwgdGFpbCxcbiAgICAgIG1heCA9IG9iamVjdC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBBU0NJSSBjaGFyYWN0ZXJzLlxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgMyA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbCA9IG1heCAlIDM7XG5cbiAgaWYgKHRhaWwgPT09IDApIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDIpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEwKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHtcbiAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LFxuICBwcmVkaWNhdGU6IGlzQmluYXJ5LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnlcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sT21hcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleCwgbGVuZ3RoLCBwYWlyLCBwYWlyS2V5LCBwYWlySGFzS2V5LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcbiAgICBwYWlySGFzS2V5ID0gZmFsc2U7XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHBhaXJLZXkgaW4gcGFpcikge1xuICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhaXIsIHBhaXJLZXkpKSB7XG4gICAgICAgIGlmICghcGFpckhhc0tleSkgcGFpckhhc0tleSA9IHRydWU7XG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFpckhhc0tleSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE9tYXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE9tYXBcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sUGFpcnMsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFBhaXJzXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxTZXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGtleSwgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBpZiAob2JqZWN0W2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxTZXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFNldFxufSk7XG4iLCAiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGlmIHJlZ2V4cCBzdGFydHMgd2l0aCAnLycgaXQgY2FuIGhhdmUgbW9kaWZpZXJzIGFuZCBtdXN0IGJlIHByb3Blcmx5IGNsb3NlZFxuICAvLyBgL2Zvby9naW1gIC0gbW9kaWZpZXJzIHRhaWwgY2FuIGJlIG1heGltdW0gMyBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcblxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGlmIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggLywgaXMgc2hvdWxkIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWRcbiAgICBpZiAocmVnZXhwW3JlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMV0gIT09ICcvJykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBgL2Zvby9naW1gIC0gdGFpbCBjYW4gYmUgbWF4aW11bSA0IGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuICAgIHJlZ2V4cCA9IHJlZ2V4cC5zbGljZSgxLCByZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwLCBtb2RpZmllcnMpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJy8nICsgb2JqZWN0LnNvdXJjZSArICcvJztcblxuICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCxcbiAgcHJlZGljYXRlOiBpc1JlZ0V4cCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBlc3ByaW1hO1xuXG4vLyBCcm93c2VyaWZpZWQgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGVzcHJpbWFcbi8vXG4vLyAxLiBGb3Igbm9kZS5qcyBqdXN0IHJlcXVpcmUgbW9kdWxlIGFzIGRlcHNcbi8vIDIuIEZvciBicm93c2VyIHRyeSB0byByZXF1aXJlIG11ZHVsZSB2aWEgZXh0ZXJuYWwgQU1EIHN5c3RlbS5cbi8vICAgIElmIG5vdCBmb3VuZCAtIHRyeSB0byBmYWxsYmFjayB0byB3aW5kb3cuZXNwcmltYS4gSWYgbm90XG4vLyAgICBmb3VuZCB0b28gLSB0aGVuIGZhaWwgdG8gcGFyc2UuXG4vL1xudHJ5IHtcbiAgLy8gd29ya2Fyb3VuZCB0byBleGNsdWRlIHBhY2thZ2UgZnJvbSBicm93c2VyaWZ5IGxpc3QuXG4gIHZhciBfcmVxdWlyZSA9IHJlcXVpcmU7XG4gIGVzcHJpbWEgPSBfcmVxdWlyZSgnZXNwcmltYScpO1xufSBjYXRjaCAoXykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1yZWRlY2xhcmUgKi9cbiAgLyogZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIChhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicgJiZcbiAgICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgLypqc2xpbnQgZXZpbDp0cnVlKi9cblxuICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pLFxuICAgICAgcGFyYW1zID0gW10sXG4gICAgICBib2R5O1xuXG4gIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAoYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nICYmXG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTtcbiAgfSk7XG5cbiAgYm9keSA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS5yYW5nZTtcblxuICAvLyBFc3ByaW1hJ3MgcmFuZ2VzIGluY2x1ZGUgdGhlIGZpcnN0ICd7JyBhbmQgdGhlIGxhc3QgJ30nIGNoYXJhY3RlcnMgb25cbiAgLy8gZnVuY3Rpb24gZXhwcmVzc2lvbnMuIFNvIGN1dCB0aGVtIG91dC5cbiAgaWYgKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyovXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsIHNvdXJjZS5zbGljZShib2R5WzBdICsgMSwgYm9keVsxXSAtIDEpKTtcbiAgfVxuICAvLyBFUzYgYXJyb3cgZnVuY3Rpb25zIGNhbiBvbWl0IHRoZSBCbG9ja1N0YXRlbWVudC4gSW4gdGhhdCBjYXNlLCBqdXN0IHJldHVyblxuICAvLyB0aGUgYm9keS5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyovXG4gIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCAncmV0dXJuICcgKyBzb3VyY2Uuc2xpY2UoYm9keVswXSwgYm9keVsxXSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsICIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBsb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBKUy1ZQU1MJ3MgZGVmYXVsdCBzYWZlIHNjaGVtYSBhbmQgaW5jbHVkZXNcbi8vIEphdmFTY3JpcHQtc3BlY2lmaWMgdHlwZXM6ICEhanMvdW5kZWZpbmVkLCAhIWpzL3JlZ2V4cCBhbmQgISFqcy9mdW5jdGlvbi5cbi8vXG4vLyBBbHNvIHRoaXMgc2NoZW1hIGlzIHVzZWQgYXMgZGVmYXVsdCBiYXNlIHNjaGVtYSBhdCBgU2NoZW1hLmNyZWF0ZWAgZnVuY3Rpb24uXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYS5ERUZBVUxUID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2RlZmF1bHRfc2FmZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy91bmRlZmluZWQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3JlZ2V4cCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvZnVuY3Rpb24nKVxuICBdXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gX2NsYXNzKG9iaikgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7IH1cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovXG4gIHJldHVybiAoYyA9PT0gMHgzMC8qIDAgKi8pID8gJ1xceDAwJyA6XG4gICAgICAgIChjID09PSAweDYxLyogYSAqLykgPyAnXFx4MDcnIDpcbiAgICAgICAgKGMgPT09IDB4NjIvKiBiICovKSA/ICdcXHgwOCcgOlxuICAgICAgICAoYyA9PT0gMHg3NC8qIHQgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDA5LyogVGFiICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHg2RS8qIG4gKi8pID8gJ1xceDBBJyA6XG4gICAgICAgIChjID09PSAweDc2LyogdiAqLykgPyAnXFx4MEInIDpcbiAgICAgICAgKGMgPT09IDB4NjYvKiBmICovKSA/ICdcXHgwQycgOlxuICAgICAgICAoYyA9PT0gMHg3Mi8qIHIgKi8pID8gJ1xceDBEJyA6XG4gICAgICAgIChjID09PSAweDY1LyogZSAqLykgPyAnXFx4MUInIDpcbiAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgPyAnICcgOlxuICAgICAgICAoYyA9PT0gMHgyMi8qIFwiICovKSA/ICdcXHgyMicgOlxuICAgICAgICAoYyA9PT0gMHgyRi8qIC8gKi8pID8gJy8nIDpcbiAgICAgICAgKGMgPT09IDB4NUMvKiBcXCAqLykgPyAnXFx4NUMnIDpcbiAgICAgICAgKGMgPT09IDB4NEUvKiBOICovKSA/ICdcXHg4NScgOlxuICAgICAgICAoYyA9PT0gMHg1Ri8qIF8gKi8pID8gJ1xceEEwJyA6XG4gICAgICAgIChjID09PSAweDRDLyogTCAqLykgPyAnXFx1MjAyOCcgOlxuICAgICAgICAoYyA9PT0gMHg1MC8qIFAgKi8pID8gJ1xcdTIwMjknIDogJyc7XG59XG5cbmZ1bmN0aW9uIGNoYXJGcm9tQ29kZXBvaW50KGMpIHtcbiAgaWYgKGMgPD0gMHhGRkZGKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gIH1cbiAgLy8gRW5jb2RlIFVURi0xNiBzdXJyb2dhdGUgcGFpclxuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjQ29kZV9wb2ludHNfVS4yQjAxMDAwMF90b19VLjJCMTBGRkZGXG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICgoYyAtIDB4MDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsXG4gICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMFxuICApO1xufVxuXG52YXIgc2ltcGxlRXNjYXBlQ2hlY2sgPSBuZXcgQXJyYXkoMjU2KTsgLy8gaW50ZWdlciwgZm9yIGZhc3QgYWNjZXNzXG52YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gIHNpbXBsZUVzY2FwZUNoZWNrW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSkgPyAxIDogMDtcbiAgc2ltcGxlRXNjYXBlTWFwW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSk7XG59XG5cblxuZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gIHRoaXMuZmlsZW5hbWUgID0gb3B0aW9uc1snZmlsZW5hbWUnXSAgfHwgbnVsbDtcbiAgdGhpcy5zY2hlbWEgICAgPSBvcHRpb25zWydzY2hlbWEnXSAgICB8fCBERUZBVUxUX0ZVTExfU0NIRU1BO1xuICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbJ29uV2FybmluZyddIHx8IG51bGw7XG4gIHRoaXMubGVnYWN5ICAgID0gb3B0aW9uc1snbGVnYWN5J10gICAgfHwgZmFsc2U7XG4gIHRoaXMuanNvbiAgICAgID0gb3B0aW9uc1snanNvbiddICAgICAgfHwgZmFsc2U7XG4gIHRoaXMubGlzdGVuZXIgID0gb3B0aW9uc1snbGlzdGVuZXInXSAgfHwgbnVsbDtcblxuICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0O1xuICB0aGlzLnR5cGVNYXAgICAgICAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7XG5cbiAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICB0aGlzLnBvc2l0aW9uICAgPSAwO1xuICB0aGlzLmxpbmUgICAgICAgPSAwO1xuICB0aGlzLmxpbmVTdGFydCAgPSAwO1xuICB0aGlzLmxpbmVJbmRlbnQgPSAwO1xuXG4gIHRoaXMuZG9jdW1lbnRzID0gW107XG5cbiAgLypcbiAgdGhpcy52ZXJzaW9uO1xuICB0aGlzLmNoZWNrTGluZUJyZWFrcztcbiAgdGhpcy50YWdNYXA7XG4gIHRoaXMuYW5jaG9yTWFwO1xuICB0aGlzLnRhZztcbiAgdGhpcy5hbmNob3I7XG4gIHRoaXMua2luZDtcbiAgdGhpcy5yZXN1bHQ7Ki9cblxufVxuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKFxuICAgIG1lc3NhZ2UsXG4gICAgbmV3IE1hcmsoc3RhdGUuZmlsZW5hbWUsIHN0YXRlLmlucHV0LCBzdGF0ZS5wb3NpdGlvbiwgc3RhdGUubGluZSwgKHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0KSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0Vycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHN0YXRlLm9uV2FybmluZykge1xuICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5cbnZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHtcblxuICBZQU1MOiBmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgbWF0Y2gsIG1ham9yLCBtaW5vcjtcblxuICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIG1hdGNoID0gL14oWzAtOV0rKVxcLihbMC05XSspJC8uZXhlYyhhcmdzWzBdKTtcblxuICAgIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcblxuICAgIGlmIChtYWpvciAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuXG4gICAgc3RhdGUudmVyc2lvbiA9IGFyZ3NbMF07XG4gICAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gKG1pbm9yIDwgMik7XG5cbiAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG4gIH0sXG5cbiAgVEFHOiBmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBoYW5kbGUsIHByZWZpeDtcblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1RBRyBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IHR3byBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBoYW5kbGUgPSBhcmdzWzBdO1xuICAgIHByZWZpeCA9IGFyZ3NbMV07XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciBcIicgKyBoYW5kbGUgKyAnXCIgdGFnIGhhbmRsZScpO1xuICAgIH1cblxuICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHN0YXRlLnRhZ01hcFtoYW5kbGVdID0gcHJlZml4O1xuICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBzdGFydCwgZW5kLCBjaGVja0pzb24pIHtcbiAgdmFyIF9wb3NpdGlvbiwgX2xlbmd0aCwgX2NoYXJhY3RlciwgX3Jlc3VsdDtcblxuICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICBfcmVzdWx0ID0gc3RhdGUuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICBpZiAoY2hlY2tKc29uKSB7XG4gICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDsgX3Bvc2l0aW9uIDwgX2xlbmd0aDsgX3Bvc2l0aW9uICs9IDEpIHtcbiAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSAweDA5IHx8XG4gICAgICAgICAgICAgICgweDIwIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAweDEwRkZGRikpKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIHZhbGlkIEpTT04gY2hhcmFjdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFBBVFRFUk5fTk9OX1BSSU5UQUJMRS50ZXN0KF9yZXN1bHQpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5yZXN1bHQgKz0gX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHtcbiAgdmFyIHNvdXJjZUtleXMsIGtleSwgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUnKTtcbiAgfVxuXG4gIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG5cbiAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkpKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07XG4gICAgICBvdmVycmlkYWJsZUtleXNba2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUsIHN0YXJ0TGluZSwgc3RhcnRQb3MpIHtcbiAgdmFyIGluZGV4LCBxdWFudGl0eTtcblxuICAvLyBUaGUgb3V0cHV0IGlzIGEgcGxhaW4gb2JqZWN0IGhlcmUsIHNvIGtleXMgY2FuIG9ubHkgYmUgc3RyaW5ncy5cbiAgLy8gV2UgbmVlZCB0byBjb252ZXJ0IGtleU5vZGUgdG8gYSBzdHJpbmcsIGJ1dCBkb2luZyBzbyBjYW4gaGFuZyB0aGUgcHJvY2Vzc1xuICAvLyAoZGVlcGx5IG5lc3RlZCBhcnJheXMgdGhhdCBleHBsb2RlIGV4cG9uZW50aWFsbHkgdXNpbmcgYWxpYXNlcykuXG4gIGlmIChBcnJheS5pc0FycmF5KGtleU5vZGUpKSB7XG4gICAga2V5Tm9kZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGtleU5vZGUpO1xuXG4gICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0ga2V5Tm9kZS5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleU5vZGVbaW5kZXhdKSkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmVzdGVkIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUga2V5cycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGtleU5vZGUgPT09ICdvYmplY3QnICYmIF9jbGFzcyhrZXlOb2RlW2luZGV4XSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIGtleU5vZGVbaW5kZXhdID0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQXZvaWQgY29kZSBleGVjdXRpb24gaW4gbG9hZCgpIHZpYSB0b1N0cmluZyBwcm9wZXJ0eVxuICAvLyAoc3RpbGwgdXNlIGl0cyBvd24gdG9TdHJpbmcgZm9yIGFycmF5cywgdGltZXN0YW1wcyxcbiAgLy8gYW5kIHdoYXRldmVyIHVzZXIgc2NoZW1hIGV4dGVuc2lvbnMgaGFwcGVuIHRvIGhhdmUgQEB0b1N0cmluZ1RhZylcbiAgaWYgKHR5cGVvZiBrZXlOb2RlID09PSAnb2JqZWN0JyAmJiBfY2xhc3Moa2V5Tm9kZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAga2V5Tm9kZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuICB9XG5cblxuICBrZXlOb2RlID0gU3RyaW5nKGtleU5vZGUpO1xuXG4gIGlmIChfcmVzdWx0ID09PSBudWxsKSB7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9XG5cbiAgaWYgKGtleVRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHZhbHVlTm9kZS5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4XSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlLCBvdmVycmlkYWJsZUtleXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXN0YXRlLmpzb24gJiZcbiAgICAgICAgIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKG92ZXJyaWRhYmxlS2V5cywga2V5Tm9kZSkgJiZcbiAgICAgICAgX2hhc093blByb3BlcnR5LmNhbGwoX3Jlc3VsdCwga2V5Tm9kZSkpIHtcbiAgICAgIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgfHwgc3RhdGUubGluZTtcbiAgICAgIHN0YXRlLnBvc2l0aW9uID0gc3RhcnRQb3MgfHwgc3RhdGUucG9zaXRpb247XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRlZCBtYXBwaW5nIGtleScpO1xuICAgIH1cbiAgICBfcmVzdWx0W2tleU5vZGVdID0gdmFsdWVOb2RlO1xuICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07XG4gIH1cblxuICByZXR1cm4gX3Jlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkge1xuICB2YXIgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4MEEvKiBMRiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MEQvKiBDUiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDBBLyogTEYgKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgKz0gMTtcbiAgc3RhdGUubGluZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7XG4gIHZhciBsaW5lQnJlYWtzID0gMCxcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8ge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9IHdoaWxlIChjaCAhPT0gMHgwQS8qIExGICovICYmIGNoICE9PSAweDBELyogQ1IgKi8gJiYgY2ggIT09IDApO1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGxpbmVCcmVha3MrKztcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ2RlZmljaWVudCBpbmRlbnRhdGlvbicpO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVCcmVha3M7XG59XG5cbmZ1bmN0aW9uIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAvLyBDb25kaXRpb24gc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCBpcyB0ZXN0ZWRcbiAgLy8gaW4gcGFyZW50IG9uIGVhY2ggY2FsbCwgZm9yIGVmZmljaWVuY3kuIE5vIG5lZWRzIHRvIHRlc3QgaGVyZSBhZ2Fpbi5cbiAgaWYgKChjaCA9PT0gMHgyRC8qIC0gKi8gfHwgY2ggPT09IDB4MkUvKiAuICovKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7XG5cbiAgICBfcG9zaXRpb24gKz0gMztcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAwIHx8IGlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgY291bnQpIHtcbiAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgfSBlbHNlIGlmIChjb3VudCA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgY291bnQgLSAxKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCwgd2l0aGluRmxvd0NvbGxlY3Rpb24pIHtcbiAgdmFyIHByZWNlZGluZyxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoYXNQZW5kaW5nQ29udGVudCxcbiAgICAgIF9saW5lLFxuICAgICAgX2xpbmVTdGFydCxcbiAgICAgIF9saW5lSW5kZW50LFxuICAgICAgX2tpbmQgPSBzdGF0ZS5raW5kLFxuICAgICAgX3Jlc3VsdCA9IHN0YXRlLnJlc3VsdCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGlzX1dTX09SX0VPTChjaCkgICAgICB8fFxuICAgICAgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8XG4gICAgICBjaCA9PT0gMHgyMy8qICMgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI2LyogJiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MkEvKiAqICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMS8qICEgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDdDLyogfCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4M0UvKiA+ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNy8qICcgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIyLyogXCIgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI1LyogJSAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NDAvKiBAICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg2MC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBwcmVjZWRpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uIC0gMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgfHxcbiAgICAgICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgICAgYnJlYWs7XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZS5saW5lU3RhcnQ7XG4gICAgICBfbGluZUluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgLTEpO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7XG4gICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7XG4gICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTtcbiAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzUGVuZGluZ0NvbnRlbnQpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHN0YXRlLmxpbmUgLSBfbGluZSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgIH1cblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcblxuICBpZiAoc3RhdGUucmVzdWx0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gX2tpbmQ7XG4gIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2gsXG4gICAgICBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjcvKiAnICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgICAgY2FwdHVyZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRpZFJlYWRDb250ZW50ID0gZmFsc2UsXG4gICAgICBkZXRlY3RlZEluZGVudCA9IGZhbHNlLFxuICAgICAgdGV4dEluZGVudCAgICAgPSBub2RlSW5kZW50LFxuICAgICAgZW1wdHlMaW5lcyAgICAgPSAwLFxuICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZSxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDdDLyogfCAqLykge1xuICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgzRS8qID4gKi8pIHtcbiAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQi8qICsgKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgICBpZiAoQ0hPTVBJTkdfQ0xJUCA9PT0gY2hvbXBpbmcpIHtcbiAgICAgICAgY2hvbXBpbmcgPSAoY2ggPT09IDB4MkIvKiArICovKSA/IENIT01QSU5HX0tFRVAgOiBDSE9NUElOR19TVFJJUDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHRtcCA9IGZyb21EZWNpbWFsQ29kZShjaCkpID49IDApIHtcbiAgICAgIGlmICh0bXAgPT09IDApIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBleHBsaWNpdCBpbmRlbnRhdGlvbiB3aWR0aCBvZiBhIGJsb2NrIHNjYWxhcjsgaXQgY2Fubm90IGJlIGxlc3MgdGhhbiBvbmUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRldGVjdGVkSW5kZW50KSB7XG4gICAgICAgIHRleHRJbmRlbnQgPSBub2RlSW5kZW50ICsgdG1wIC0gMTtcbiAgICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhbiBpbmRlbnRhdGlvbiB3aWR0aCBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSk7XG5cbiAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIHdoaWxlICgoIWRldGVjdGVkSW5kZW50IHx8IHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSAmJlxuICAgICAgICAgICAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykpIHtcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIWRldGVjdGVkSW5kZW50ICYmIHN0YXRlLmxpbmVJbmRlbnQgPiB0ZXh0SW5kZW50KSB7XG4gICAgICB0ZXh0SW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgZW1wdHlMaW5lcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRW5kIG9mIHRoZSBzY2FsYXIuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCB0ZXh0SW5kZW50KSB7XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGNob21waW5nLlxuICAgICAgaWYgKGNob21waW5nID09PSBDSE9NUElOR19LRUVQKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7XG4gICAgICAgIGlmIChkaWRSZWFkQ29udGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgdGhlIHNjYWxhciBpcyBub3QgZW1wdHkuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJyZWFrIHRoaXMgYHdoaWxlYCBjeWNsZSBhbmQgZ28gdG8gdGhlIGZ1bmNpdG9uJ3MgZXBpbG9ndWUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGb2xkZWQgc3R5bGU6IHVzZSBmYW5jeSBydWxlcyB0byBoYW5kbGUgbGluZSBicmVha3MuXG4gICAgaWYgKGZvbGRpbmcpIHtcblxuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIChtb3JlLWluZGVudGVkIGxpbmVzKSBhcmUgbm90IGZvbGRlZC5cbiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICAvLyBleGNlcHQgZm9yIHRoZSBmaXJzdCBjb250ZW50IGxpbmUgKGNmLiBFeGFtcGxlIDguMSlcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkaWRSZWFkQ29udGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBLZWVwIGFsbCBsaW5lIGJyZWFrcyBleGNlcHQgdGhlIGhlYWRlciBsaW5lIGJyZWFrLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGRpZFJlYWRDb250ZW50ID8gMSArIGVtcHR5TGluZXMgOiBlbXB0eUxpbmVzKTtcbiAgICB9XG5cbiAgICBkaWRSZWFkQ29udGVudCA9IHRydWU7XG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3BvcyxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgICAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgICAgICA9IHt9LFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlUYWcgICAgICAgID0gbnVsbCxcbiAgICAgIGtleU5vZGUgICAgICAgPSBudWxsLFxuICAgICAgdmFsdWVOb2RlICAgICA9IG51bGwsXG4gICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsXG4gICAgICBkZXRlY3RlZCAgICAgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lOyAvLyBTYXZlIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgX3BvcyA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgLy9cbiAgICAvLyBFeHBsaWNpdCBub3RhdGlvbiBjYXNlLiBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGJsb2NrczpcbiAgICAvLyBmaXJzdCBmb3IgdGhlIGtleSAoZGVub3RlZCBieSBcIj9cIikgYW5kIHNlY29uZCBmb3IgdGhlIHZhbHVlIChkZW5vdGVkIGJ5IFwiOlwiKVxuICAgIC8vXG4gICAgaWYgKChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4M0EvKiA6ICovKSAmJiBpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIC8vIGkuZS4gMHgzQS8qIDogKi8gPT09IGNoYXJhY3RlciBhZnRlciB0aGUgZXhwbGljaXQga2V5LlxuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUsIF9saW5lLCBfcG9zKTtcbiAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBtYXBwaW5nIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gRXBpbG9ndWUuXG4gIC8vXG5cbiAgLy8gU3BlY2lhbCBjYXNlOiBsYXN0IG1hcHBpbmcncyBub2RlIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBpbiBleHBsaWNpdCBub3RhdGlvbi5cbiAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIHJlc3VsdGluZyBtYXBwaW5nLlxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdtYXBwaW5nJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGRldGVjdGVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGlzVmVyYmF0aW0gPSBmYWxzZSxcbiAgICAgIGlzTmFtZWQgICAgPSBmYWxzZSxcbiAgICAgIHRhZ0hhbmRsZSxcbiAgICAgIHRhZ05hbWUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDNDLyogPCAqLykge1xuICAgIGlzVmVyYmF0aW0gPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2UgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgIHRhZ0hhbmRsZSA9ICchISc7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGFnSGFuZGxlID0gJyEnO1xuICB9XG5cbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gMHgzRS8qID4gKi8pO1xuXG4gICAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgc3RhdGUubGVuZ3RoKSB7XG4gICAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZycpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcblxuICAgICAgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgICAgICBpZiAoIWlzTmFtZWQpIHtcbiAgICAgICAgICB0YWdIYW5kbGUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24gLSAxLCBzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdCh0YWdIYW5kbGUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGFnTmFtZSAmJiAhUEFUVEVSTl9UQUdfVVJJLnRlc3QodGFnTmFtZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIG5hbWUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzOiAnICsgdGFnTmFtZSk7XG4gIH1cblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIHRhZ0hhbmRsZSkpIHtcbiAgICBzdGF0ZS50YWcgPSBzdGF0ZS50YWdNYXBbdGFnSGFuZGxlXSArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchJykge1xuICAgIHN0YXRlLnRhZyA9ICchJyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchIScpIHtcbiAgICBzdGF0ZS50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlIFwiJyArIHRhZ0hhbmRsZSArICdcIicpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhbiBhbmNob3IgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBzdGF0ZS5hbmNob3IgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLCBhbGlhcyxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDJBLyogKiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIGFsaWFzID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5hbmNob3JNYXAsIGFsaWFzKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmlkZW50aWZpZWQgYWxpYXMgXCInICsgYWxpYXMgKyAnXCInKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlLCBwYXJlbnRJbmRlbnQsIG5vZGVDb250ZXh0LCBhbGxvd1RvU2VlaywgYWxsb3dDb21wYWN0KSB7XG4gIHZhciBhbGxvd0Jsb2NrU3R5bGVzLFxuICAgICAgYWxsb3dCbG9ja1NjYWxhcnMsXG4gICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsXG4gICAgICBpbmRlbnRTdGF0dXMgPSAxLCAvLyAxOiB0aGlzPnBhcmVudCwgMDogdGhpcz1wYXJlbnQsIC0xOiB0aGlzPHBhcmVudFxuICAgICAgYXROZXdMaW5lICA9IGZhbHNlLFxuICAgICAgaGFzQ29udGVudCA9IGZhbHNlLFxuICAgICAgdHlwZUluZGV4LFxuICAgICAgdHlwZVF1YW50aXR5LFxuICAgICAgdHlwZSxcbiAgICAgIGZsb3dJbmRlbnQsXG4gICAgICBibG9ja0luZGVudDtcblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignb3BlbicsIHN0YXRlKTtcbiAgfVxuXG4gIHN0YXRlLnRhZyAgICA9IG51bGw7XG4gIHN0YXRlLmFuY2hvciA9IG51bGw7XG4gIHN0YXRlLmtpbmQgICA9IG51bGw7XG4gIHN0YXRlLnJlc3VsdCA9IG51bGw7XG5cbiAgYWxsb3dCbG9ja1N0eWxlcyA9IGFsbG93QmxvY2tTY2FsYXJzID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zID1cbiAgICBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQgfHxcbiAgICBDT05URVhUX0JMT0NLX0lOICA9PT0gbm9kZUNvbnRleHQ7XG5cbiAgaWYgKGFsbG93VG9TZWVrKSB7XG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgIHdoaWxlIChyZWFkVGFnUHJvcGVydHkoc3RhdGUpIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkpIHtcbiAgICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYWxsb3dCbG9ja1N0eWxlcztcblxuICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHtcbiAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0O1xuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSB8fCBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICBpZiAoQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0ZMT1dfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudCArIDE7XG4gICAgfVxuXG4gICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDtcblxuICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiZcbiAgICAgICAgICAocmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KSB8fFxuICAgICAgICAgICByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoYWxsb3dCbG9ja1NjYWxhcnMgJiYgcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICAgIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8XG4gICAgICAgICAgICByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCB8fCBzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhbGlhcyBub2RlIHNob3VsZCBub3QgaGF2ZSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLnRhZyA9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBibG9jayBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBzYW1lIGluZGVudGF0aW9uIGxldmVsIGFzIHRoZSBwYXJlbnQuXG4gICAgICAvLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI3OTk3ODRcbiAgICAgIGhhc0NvbnRlbnQgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiYgcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJyEnKSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJz8nKSB7XG4gICAgICAvLyBJbXBsaWNpdCByZXNvbHZpbmcgaXMgbm90IGFsbG93ZWQgZm9yIG5vbi1zY2FsYXIgdHlwZXMsIGFuZCAnPydcbiAgICAgIC8vIG5vbi1zcGVjaWZpYyB0YWcgaXMgb25seSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHRvIHBsYWluIHNjYWxhcnMuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGtpbmQgY29uZm9ybWl0eSBpbiBjYXNlIHVzZXIgZXhwbGljaXRseSBhc3NpZ25zICc/J1xuICAgICAgLy8gdGFnLCBmb3IgZXhhbXBsZSBsaWtlIHRoaXM6IFwiITw/PiBbMF1cIlxuICAgICAgLy9cbiAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgc3RhdGUua2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBub2RlIGtpbmQgZm9yICE8Pz4gdGFnOyBpdCBzaG91bGQgYmUgXCJzY2FsYXJcIiwgbm90IFwiJyArIHN0YXRlLmtpbmQgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDsgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5OyB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIGlmICh0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICAgIHN0YXRlLnRhZyA9IHR5cGUudGFnO1xuICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudHlwZU1hcFtzdGF0ZS5raW5kIHx8ICdmYWxsYmFjayddLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS5raW5kIHx8ICdmYWxsYmFjayddW3N0YXRlLnRhZ107XG5cbiAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgdHlwZS5raW5kICE9PSBzdGF0ZS5raW5kKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCcgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSBcIicgKyB0eXBlLmtpbmQgKyAnXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCcgKyBzdGF0ZS50YWcgKyAnPiBleHBsaWNpdCB0YWcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biB0YWcgITwnICsgc3RhdGUudGFnICsgJz4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignY2xvc2UnLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnRhZyAhPT0gbnVsbCB8fCAgc3RhdGUuYW5jaG9yICE9PSBudWxsIHx8IGhhc0NvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkge1xuICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgX3Bvc2l0aW9uLFxuICAgICAgZGlyZWN0aXZlTmFtZSxcbiAgICAgIGRpcmVjdGl2ZUFyZ3MsXG4gICAgICBoYXNEaXJlY3RpdmVzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBzdGF0ZS52ZXJzaW9uID0gbnVsbDtcbiAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gc3RhdGUubGVnYWN5O1xuICBzdGF0ZS50YWdNYXAgPSB7fTtcbiAgc3RhdGUuYW5jaG9yTWFwID0ge307XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IDAgfHwgY2ggIT09IDB4MjUvKiAlICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBkaXJlY3RpdmVOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgZGlyZWN0aXZlQXJncyA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZSBuYW1lIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBvbmUgY2hhcmFjdGVyIGluIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIHdoaWxlIChjaCAhPT0gMCkge1xuICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19FT0woY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSBicmVhaztcblxuICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoICE9PSAwKSByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChkaXJlY3RpdmVIYW5kbGVycywgZGlyZWN0aXZlTmFtZSkpIHtcbiAgICAgIGRpcmVjdGl2ZUhhbmRsZXJzW2RpcmVjdGl2ZU5hbWVdKHN0YXRlLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5rbm93biBkb2N1bWVudCBkaXJlY3RpdmUgXCInICsgZGlyZWN0aXZlTmFtZSArICdcIicpO1xuICAgIH1cbiAgfVxuXG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gMCAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgICAgID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDIpID09PSAweDJELyogLSAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIH0gZWxzZSBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBjb21wb3NlTm9kZShzdGF0ZSwgc3RhdGUubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUuY2hlY2tMaW5lQnJlYWtzICYmXG4gICAgICBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUy50ZXN0KHN0YXRlLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlLnBvc2l0aW9uKSkpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdub24tQVNDSUkgbGluZSBicmVha3MgYXJlIGludGVycHJldGVkIGFzIGNvbnRlbnQnKTtcbiAgfVxuXG4gIHN0YXRlLmRvY3VtZW50cy5wdXNoKHN0YXRlLnJlc3VsdCk7XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuXG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDJFLyogLiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2VuZCBvZiB0aGUgc3RyZWFtIG9yIGEgZG9jdW1lbnQgc2VwYXJhdG9yIGlzIGV4cGVjdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykge1xuICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChpbnB1dC5sZW5ndGggIT09IDApIHtcblxuICAgIC8vIEFkZCB0YWlsaW5nIGBcXG5gIGlmIG5vdCBleGlzdHNcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwQS8qIExGICovICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEQvKiBDUiAqLykge1xuICAgICAgaW5wdXQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgQk9NXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIHZhciBudWxscG9zID0gaW5wdXQuaW5kZXhPZignXFwwJyk7XG5cbiAgaWYgKG51bGxwb3MgIT09IC0xKSB7XG4gICAgc3RhdGUucG9zaXRpb24gPSBudWxscG9zO1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdudWxsIGJ5dGUgaXMgbm90IGFsbG93ZWQgaW4gaW5wdXQnKTtcbiAgfVxuXG4gIC8vIFVzZSAwIGFzIHN0cmluZyB0ZXJtaW5hdG9yLiBUaGF0IHNpZ25pZmljYW50bHkgc2ltcGxpZmllcyBib3VuZHMgY2hlY2suXG4gIHN0YXRlLmlucHV0ICs9ICdcXDAnO1xuXG4gIHdoaWxlIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgc3RhdGUubGluZUluZGVudCArPSAxO1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICByZWFkRG9jdW1lbnQoc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmRvY3VtZW50cztcbn1cblxuXG5mdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvciwgb3B0aW9ucykge1xuICBpZiAoaXRlcmF0b3IgIT09IG51bGwgJiYgdHlwZW9mIGl0ZXJhdG9yID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zID0gaXRlcmF0b3I7XG4gICAgaXRlcmF0b3IgPSBudWxsO1xuICB9XG5cbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmICh0eXBlb2YgaXRlcmF0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRzO1xuICB9XG5cbiAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvciA9PT0gJ29iamVjdCcgJiYgaXRlcmF0b3IgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucyA9IGl0ZXJhdG9yO1xuICAgIGl0ZXJhdG9yID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvciwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xuXG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgQ0hBUl9UQUIgICAgICAgICAgICAgICAgICA9IDB4MDk7IC8qIFRhYiAqL1xudmFyIENIQVJfTElORV9GRUVEICAgICAgICAgICAgPSAweDBBOyAvKiBMRiAqL1xudmFyIENIQVJfQ0FSUklBR0VfUkVUVVJOICAgICAgPSAweDBEOyAvKiBDUiAqL1xudmFyIENIQVJfU1BBQ0UgICAgICAgICAgICAgICAgPSAweDIwOyAvKiBTcGFjZSAqL1xudmFyIENIQVJfRVhDTEFNQVRJT04gICAgICAgICAgPSAweDIxOyAvKiAhICovXG52YXIgQ0hBUl9ET1VCTEVfUVVPVEUgICAgICAgICA9IDB4MjI7IC8qIFwiICovXG52YXIgQ0hBUl9TSEFSUCAgICAgICAgICAgICAgICA9IDB4MjM7IC8qICMgKi9cbnZhciBDSEFSX1BFUkNFTlQgICAgICAgICAgICAgID0gMHgyNTsgLyogJSAqL1xudmFyIENIQVJfQU1QRVJTQU5EICAgICAgICAgICAgPSAweDI2OyAvKiAmICovXG52YXIgQ0hBUl9TSU5HTEVfUVVPVEUgICAgICAgICA9IDB4Mjc7IC8qICcgKi9cbnZhciBDSEFSX0FTVEVSSVNLICAgICAgICAgICAgID0gMHgyQTsgLyogKiAqL1xudmFyIENIQVJfQ09NTUEgICAgICAgICAgICAgICAgPSAweDJDOyAvKiAsICovXG52YXIgQ0hBUl9NSU5VUyAgICAgICAgICAgICAgICA9IDB4MkQ7IC8qIC0gKi9cbnZhciBDSEFSX0NPTE9OICAgICAgICAgICAgICAgID0gMHgzQTsgLyogOiAqL1xudmFyIENIQVJfRVFVQUxTICAgICAgICAgICAgICAgPSAweDNEOyAvKiA9ICovXG52YXIgQ0hBUl9HUkVBVEVSX1RIQU4gICAgICAgICA9IDB4M0U7IC8qID4gKi9cbnZhciBDSEFSX1FVRVNUSU9OICAgICAgICAgICAgID0gMHgzRjsgLyogPyAqL1xudmFyIENIQVJfQ09NTUVSQ0lBTF9BVCAgICAgICAgPSAweDQwOyAvKiBAICovXG52YXIgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUICA9IDB4NUI7IC8qIFsgKi9cbnZhciBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUID0gMHg1RDsgLyogXSAqL1xudmFyIENIQVJfR1JBVkVfQUNDRU5UICAgICAgICAgPSAweDYwOyAvKiBgICovXG52YXIgQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgICA9IDB4N0I7IC8qIHsgKi9cbnZhciBDSEFSX1ZFUlRJQ0FMX0xJTkUgICAgICAgID0gMHg3QzsgLyogfCAqL1xudmFyIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0tFVCAgPSAweDdEOyAvKiB9ICovXG5cbnZhciBFU0NBUEVfU0VRVUVOQ0VTID0ge307XG5cbkVTQ0FQRV9TRVFVRU5DRVNbMHgwMF0gICA9ICdcXFxcMCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDddICAgPSAnXFxcXGEnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDA4XSAgID0gJ1xcXFxiJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwOV0gICA9ICdcXFxcdCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MEFdICAgPSAnXFxcXG4nO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBCXSAgID0gJ1xcXFx2JztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwQ10gICA9ICdcXFxcZic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MERdICAgPSAnXFxcXHInO1xuRVNDQVBFX1NFUVVFTkNFU1sweDFCXSAgID0gJ1xcXFxlJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMl0gICA9ICdcXFxcXCInO1xuRVNDQVBFX1NFUVVFTkNFU1sweDVDXSAgID0gJ1xcXFxcXFxcJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHg4NV0gICA9ICdcXFxcTic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4QTBdICAgPSAnXFxcXF8nO1xuRVNDQVBFX1NFUVVFTkNFU1sweDIwMjhdID0gJ1xcXFxMJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMDI5XSA9ICdcXFxcUCc7XG5cbnZhciBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWCA9IFtcbiAgJ3knLCAnWScsICd5ZXMnLCAnWWVzJywgJ1lFUycsICdvbicsICdPbicsICdPTicsXG4gICduJywgJ04nLCAnbm8nLCAnTm8nLCAnTk8nLCAnb2ZmJywgJ09mZicsICdPRkYnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVNYXAoc2NoZW1hLCBtYXApIHtcbiAgdmFyIHJlc3VsdCwga2V5cywgaW5kZXgsIGxlbmd0aCwgdGFnLCBzdHlsZSwgdHlwZTtcblxuICBpZiAobWFwID09PSBudWxsKSByZXR1cm4ge307XG5cbiAgcmVzdWx0ID0ge307XG4gIGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICB0YWcgPSBrZXlzW2luZGV4XTtcbiAgICBzdHlsZSA9IFN0cmluZyhtYXBbdGFnXSk7XG5cbiAgICBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAnISEnKSB7XG4gICAgICB0YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZy5zbGljZSgyKTtcbiAgICB9XG4gICAgdHlwZSA9IHNjaGVtYS5jb21waWxlZFR5cGVNYXBbJ2ZhbGxiYWNrJ11bdGFnXTtcblxuICAgIGlmICh0eXBlICYmIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGUuc3R5bGVBbGlhc2VzLCBzdHlsZSkpIHtcbiAgICAgIHN0eWxlID0gdHlwZS5zdHlsZUFsaWFzZXNbc3R5bGVdO1xuICAgIH1cblxuICAgIHJlc3VsdFt0YWddID0gc3R5bGU7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBlbmNvZGVIZXgoY2hhcmFjdGVyKSB7XG4gIHZhciBzdHJpbmcsIGhhbmRsZSwgbGVuZ3RoO1xuXG4gIHN0cmluZyA9IGNoYXJhY3Rlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblxuICBpZiAoY2hhcmFjdGVyIDw9IDB4RkYpIHtcbiAgICBoYW5kbGUgPSAneCc7XG4gICAgbGVuZ3RoID0gMjtcbiAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPD0gMHhGRkZGKSB7XG4gICAgaGFuZGxlID0gJ3UnO1xuICAgIGxlbmd0aCA9IDQ7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDw9IDB4RkZGRkZGRkYpIHtcbiAgICBoYW5kbGUgPSAnVSc7XG4gICAgbGVuZ3RoID0gODtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignY29kZSBwb2ludCB3aXRoaW4gYSBzdHJpbmcgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gMHhGRkZGRkZGRicpO1xuICB9XG5cbiAgcmV0dXJuICdcXFxcJyArIGhhbmRsZSArIGNvbW1vbi5yZXBlYXQoJzAnLCBsZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn1cblxuZnVuY3Rpb24gU3RhdGUob3B0aW9ucykge1xuICB0aGlzLnNjaGVtYSAgICAgICAgPSBvcHRpb25zWydzY2hlbWEnXSB8fCBERUZBVUxUX0ZVTExfU0NIRU1BO1xuICB0aGlzLmluZGVudCAgICAgICAgPSBNYXRoLm1heCgxLCAob3B0aW9uc1snaW5kZW50J10gfHwgMikpO1xuICB0aGlzLm5vQXJyYXlJbmRlbnQgPSBvcHRpb25zWydub0FycmF5SW5kZW50J10gfHwgZmFsc2U7XG4gIHRoaXMuc2tpcEludmFsaWQgICA9IG9wdGlvbnNbJ3NraXBJbnZhbGlkJ10gfHwgZmFsc2U7XG4gIHRoaXMuZmxvd0xldmVsICAgICA9IChjb21tb24uaXNOb3RoaW5nKG9wdGlvbnNbJ2Zsb3dMZXZlbCddKSA/IC0xIDogb3B0aW9uc1snZmxvd0xldmVsJ10pO1xuICB0aGlzLnN0eWxlTWFwICAgICAgPSBjb21waWxlU3R5bGVNYXAodGhpcy5zY2hlbWEsIG9wdGlvbnNbJ3N0eWxlcyddIHx8IG51bGwpO1xuICB0aGlzLnNvcnRLZXlzICAgICAgPSBvcHRpb25zWydzb3J0S2V5cyddIHx8IGZhbHNlO1xuICB0aGlzLmxpbmVXaWR0aCAgICAgPSBvcHRpb25zWydsaW5lV2lkdGgnXSB8fCA4MDtcbiAgdGhpcy5ub1JlZnMgICAgICAgID0gb3B0aW9uc1snbm9SZWZzJ10gfHwgZmFsc2U7XG4gIHRoaXMubm9Db21wYXRNb2RlICA9IG9wdGlvbnNbJ25vQ29tcGF0TW9kZSddIHx8IGZhbHNlO1xuICB0aGlzLmNvbmRlbnNlRmxvdyAgPSBvcHRpb25zWydjb25kZW5zZUZsb3cnXSB8fCBmYWxzZTtcblxuICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0O1xuICB0aGlzLmV4cGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEV4cGxpY2l0O1xuXG4gIHRoaXMudGFnID0gbnVsbDtcbiAgdGhpcy5yZXN1bHQgPSAnJztcblxuICB0aGlzLmR1cGxpY2F0ZXMgPSBbXTtcbiAgdGhpcy51c2VkRHVwbGljYXRlcyA9IG51bGw7XG59XG5cbi8vIEluZGVudHMgZXZlcnkgbGluZSBpbiBhIHN0cmluZy4gRW1wdHkgbGluZXMgKFxcbiBvbmx5KSBhcmUgbm90IGluZGVudGVkLlxuZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0cmluZywgc3BhY2VzKSB7XG4gIHZhciBpbmQgPSBjb21tb24ucmVwZWF0KCcgJywgc3BhY2VzKSxcbiAgICAgIHBvc2l0aW9uID0gMCxcbiAgICAgIG5leHQgPSAtMSxcbiAgICAgIHJlc3VsdCA9ICcnLFxuICAgICAgbGluZSxcbiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgbmV4dCA9IHN0cmluZy5pbmRleE9mKCdcXG4nLCBwb3NpdGlvbik7XG4gICAgaWYgKG5leHQgPT09IC0xKSB7XG4gICAgICBsaW5lID0gc3RyaW5nLnNsaWNlKHBvc2l0aW9uKTtcbiAgICAgIHBvc2l0aW9uID0gbGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lID0gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBuZXh0ICsgMSk7XG4gICAgICBwb3NpdGlvbiA9IG5leHQgKyAxO1xuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCAmJiBsaW5lICE9PSAnXFxuJykgcmVzdWx0ICs9IGluZDtcblxuICAgIHJlc3VsdCArPSBsaW5lO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpIHtcbiAgcmV0dXJuICdcXG4nICsgY29tbW9uLnJlcGVhdCgnICcsIHN0YXRlLmluZGVudCAqIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gdGVzdEltcGxpY2l0UmVzb2x2aW5nKHN0YXRlLCBzdHIpIHtcbiAgdmFyIGluZGV4LCBsZW5ndGgsIHR5cGU7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHR5cGUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW2luZGV4XTtcblxuICAgIGlmICh0eXBlLnJlc29sdmUoc3RyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBbMzNdIHMtd2hpdGUgOjo9IHMtc3BhY2UgfCBzLXRhYlxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGMpIHtcbiAgcmV0dXJuIGMgPT09IENIQVJfU1BBQ0UgfHwgYyA9PT0gQ0hBUl9UQUI7XG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGNhbiBiZSBwcmludGVkIHdpdGhvdXQgZXNjYXBpbmcuXG4vLyBGcm9tIFlBTUwgMS4yOiBcImFueSBhbGxvd2VkIGNoYXJhY3RlcnMga25vd24gdG8gYmUgbm9uLXByaW50YWJsZVxuLy8gc2hvdWxkIGFsc28gYmUgZXNjYXBlZC4gW0hvd2V2ZXIsXSBUaGlzIGlzblx1MjAxOXQgbWFuZGF0b3J5XCJcbi8vIERlcml2ZWQgZnJvbSBuYi1jaGFyIC0gXFx0IC0gI3g4NSAtICN4QTAgLSAjeDIwMjggLSAjeDIwMjkuXG5mdW5jdGlvbiBpc1ByaW50YWJsZShjKSB7XG4gIHJldHVybiAgKDB4MDAwMjAgPD0gYyAmJiBjIDw9IDB4MDAwMDdFKVxuICAgICAgfHwgKCgweDAwMEExIDw9IGMgJiYgYyA8PSAweDAwRDdGRikgJiYgYyAhPT0gMHgyMDI4ICYmIGMgIT09IDB4MjAyOSlcbiAgICAgIHx8ICgoMHgwRTAwMCA8PSBjICYmIGMgPD0gMHgwMEZGRkQpICYmIGMgIT09IDB4RkVGRiAvKiBCT00gKi8pXG4gICAgICB8fCAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTtcbn1cblxuLy8gWzM0XSBucy1jaGFyIDo6PSBuYi1jaGFyIC0gcy13aGl0ZVxuLy8gWzI3XSBuYi1jaGFyIDo6PSBjLXByaW50YWJsZSAtIGItY2hhciAtIGMtYnl0ZS1vcmRlci1tYXJrXG4vLyBbMjZdIGItY2hhciAgOjo9IGItbGluZS1mZWVkIHwgYi1jYXJyaWFnZS1yZXR1cm5cbi8vIFsyNF0gYi1saW5lLWZlZWQgICAgICAgOjo9ICAgICAjeEEgICAgLyogTEYgKi9cbi8vIFsyNV0gYi1jYXJyaWFnZS1yZXR1cm4gOjo9ICAgICAjeEQgICAgLyogQ1IgKi9cbi8vIFszXSAgYy1ieXRlLW9yZGVyLW1hcmsgOjo9ICAgICAjeEZFRkZcbmZ1bmN0aW9uIGlzTnNDaGFyKGMpIHtcbiAgcmV0dXJuIGlzUHJpbnRhYmxlKGMpICYmICFpc1doaXRlc3BhY2UoYylcbiAgICAvLyBieXRlLW9yZGVyLW1hcmtcbiAgICAmJiBjICE9PSAweEZFRkZcbiAgICAvLyBiLWNoYXJcbiAgICAmJiBjICE9PSBDSEFSX0NBUlJJQUdFX1JFVFVSTlxuICAgICYmIGMgIT09IENIQVJfTElORV9GRUVEO1xufVxuXG4vLyBTaW1wbGlmaWVkIHRlc3QgZm9yIHZhbHVlcyBhbGxvd2VkIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gcGxhaW4gc3R5bGUuXG5mdW5jdGlvbiBpc1BsYWluU2FmZShjLCBwcmV2KSB7XG4gIC8vIFVzZXMgYSBzdWJzZXQgb2YgbmItY2hhciAtIGMtZmxvdy1pbmRpY2F0b3IgLSBcIjpcIiAtIFwiI1wiXG4gIC8vIHdoZXJlIG5iLWNoYXIgOjo9IGMtcHJpbnRhYmxlIC0gYi1jaGFyIC0gYy1ieXRlLW9yZGVyLW1hcmsuXG4gIHJldHVybiBpc1ByaW50YWJsZShjKSAmJiBjICE9PSAweEZFRkZcbiAgICAvLyAtIGMtZmxvdy1pbmRpY2F0b3JcbiAgICAmJiBjICE9PSBDSEFSX0NPTU1BXG4gICAgJiYgYyAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUXG4gICAgLy8gLSBcIjpcIiAtIFwiI1wiXG4gICAgLy8gLyogQW4gbnMtY2hhciBwcmVjZWRpbmcgKi8gXCIjXCJcbiAgICAmJiBjICE9PSBDSEFSX0NPTE9OXG4gICAgJiYgKChjICE9PSBDSEFSX1NIQVJQKSB8fCAocHJldiAmJiBpc05zQ2hhcihwcmV2KSkpO1xufVxuXG4vLyBTaW1wbGlmaWVkIHRlc3QgZm9yIHZhbHVlcyBhbGxvd2VkIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gcGxhaW4gc3R5bGUuXG5mdW5jdGlvbiBpc1BsYWluU2FmZUZpcnN0KGMpIHtcbiAgLy8gVXNlcyBhIHN1YnNldCBvZiBucy1jaGFyIC0gYy1pbmRpY2F0b3JcbiAgLy8gd2hlcmUgbnMtY2hhciA9IG5iLWNoYXIgLSBzLXdoaXRlLlxuICByZXR1cm4gaXNQcmludGFibGUoYykgJiYgYyAhPT0gMHhGRUZGXG4gICAgJiYgIWlzV2hpdGVzcGFjZShjKSAvLyAtIHMtd2hpdGVcbiAgICAvLyAtIChjLWluZGljYXRvciA6Oj1cbiAgICAvLyBcdTIwMUMtXHUyMDFEIHwgXHUyMDFDP1x1MjAxRCB8IFx1MjAxQzpcdTIwMUQgfCBcdTIwMUMsXHUyMDFEIHwgXHUyMDFDW1x1MjAxRCB8IFx1MjAxQ11cdTIwMUQgfCBcdTIwMUN7XHUyMDFEIHwgXHUyMDFDfVx1MjAxRFxuICAgICYmIGMgIT09IENIQVJfTUlOVVNcbiAgICAmJiBjICE9PSBDSEFSX1FVRVNUSU9OXG4gICAgJiYgYyAhPT0gQ0hBUl9DT0xPTlxuICAgICYmIGMgIT09IENIQVJfQ09NTUFcbiAgICAmJiBjICE9PSBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVRcbiAgICAmJiBjICE9PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVRcbiAgICAmJiBjICE9PSBDSEFSX1JJR0hUX0NVUkxZX0JSQUNLRVRcbiAgICAvLyB8IFx1MjAxQyNcdTIwMUQgfCBcdTIwMUMmXHUyMDFEIHwgXHUyMDFDKlx1MjAxRCB8IFx1MjAxQyFcdTIwMUQgfCBcdTIwMUN8XHUyMDFEIHwgXHUyMDFDPVx1MjAxRCB8IFx1MjAxQz5cdTIwMUQgfCBcdTIwMUMnXHUyMDFEIHwgXHUyMDFDXCJcdTIwMURcbiAgICAmJiBjICE9PSBDSEFSX1NIQVJQXG4gICAgJiYgYyAhPT0gQ0hBUl9BTVBFUlNBTkRcbiAgICAmJiBjICE9PSBDSEFSX0FTVEVSSVNLXG4gICAgJiYgYyAhPT0gQ0hBUl9FWENMQU1BVElPTlxuICAgICYmIGMgIT09IENIQVJfVkVSVElDQUxfTElORVxuICAgICYmIGMgIT09IENIQVJfRVFVQUxTXG4gICAgJiYgYyAhPT0gQ0hBUl9HUkVBVEVSX1RIQU5cbiAgICAmJiBjICE9PSBDSEFSX1NJTkdMRV9RVU9URVxuICAgICYmIGMgIT09IENIQVJfRE9VQkxFX1FVT1RFXG4gICAgLy8gfCBcdTIwMUMlXHUyMDFEIHwgXHUyMDFDQFx1MjAxRCB8IFx1MjAxQ2BcdTIwMUQpXG4gICAgJiYgYyAhPT0gQ0hBUl9QRVJDRU5UXG4gICAgJiYgYyAhPT0gQ0hBUl9DT01NRVJDSUFMX0FUXG4gICAgJiYgYyAhPT0gQ0hBUl9HUkFWRV9BQ0NFTlQ7XG59XG5cbi8vIERldGVybWluZXMgd2hldGhlciBibG9jayBpbmRlbnRhdGlvbiBpbmRpY2F0b3IgaXMgcmVxdWlyZWQuXG5mdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZykge1xuICB2YXIgbGVhZGluZ1NwYWNlUmUgPSAvXlxcbiogLztcbiAgcmV0dXJuIGxlYWRpbmdTcGFjZVJlLnRlc3Qoc3RyaW5nKTtcbn1cblxudmFyIFNUWUxFX1BMQUlOICAgPSAxLFxuICAgIFNUWUxFX1NJTkdMRSAgPSAyLFxuICAgIFNUWUxFX0xJVEVSQUwgPSAzLFxuICAgIFNUWUxFX0ZPTERFRCAgPSA0LFxuICAgIFNUWUxFX0RPVUJMRSAgPSA1O1xuXG4vLyBEZXRlcm1pbmVzIHdoaWNoIHNjYWxhciBzdHlsZXMgYXJlIHBvc3NpYmxlIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc3R5bGUuXG4vLyBsaW5lV2lkdGggPSAtMSA9PiBubyBsaW1pdC5cbi8vIFByZS1jb25kaXRpb25zOiBzdHIubGVuZ3RoID4gMC5cbi8vIFBvc3QtY29uZGl0aW9uczpcbi8vICAgIFNUWUxFX1BMQUlOIG9yIFNUWUxFX1NJTkdMRSA9PiBubyBcXG4gYXJlIGluIHRoZSBzdHJpbmcuXG4vLyAgICBTVFlMRV9MSVRFUkFMID0+IG5vIGxpbmVzIGFyZSBzdWl0YWJsZSBmb3IgZm9sZGluZyAob3IgbGluZVdpZHRoIGlzIC0xKS5cbi8vICAgIFNUWUxFX0ZPTERFRCA9PiBhIGxpbmUgPiBsaW5lV2lkdGggYW5kIGNhbiBiZSBmb2xkZWQgKGFuZCBsaW5lV2lkdGggIT0gLTEpLlxuZnVuY3Rpb24gY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nLCBzaW5nbGVMaW5lT25seSwgaW5kZW50UGVyTGV2ZWwsIGxpbmVXaWR0aCwgdGVzdEFtYmlndW91c1R5cGUpIHtcbiAgdmFyIGk7XG4gIHZhciBjaGFyLCBwcmV2X2NoYXI7XG4gIHZhciBoYXNMaW5lQnJlYWsgPSBmYWxzZTtcbiAgdmFyIGhhc0ZvbGRhYmxlTGluZSA9IGZhbHNlOyAvLyBvbmx5IGNoZWNrZWQgaWYgc2hvdWxkVHJhY2tXaWR0aFxuICB2YXIgc2hvdWxkVHJhY2tXaWR0aCA9IGxpbmVXaWR0aCAhPT0gLTE7XG4gIHZhciBwcmV2aW91c0xpbmVCcmVhayA9IC0xOyAvLyBjb3VudCB0aGUgZmlyc3QgbGluZSBjb3JyZWN0bHlcbiAgdmFyIHBsYWluID0gaXNQbGFpblNhZmVGaXJzdChzdHJpbmcuY2hhckNvZGVBdCgwKSlcbiAgICAgICAgICAmJiAhaXNXaGl0ZXNwYWNlKHN0cmluZy5jaGFyQ29kZUF0KHN0cmluZy5sZW5ndGggLSAxKSk7XG5cbiAgaWYgKHNpbmdsZUxpbmVPbmx5KSB7XG4gICAgLy8gQ2FzZTogbm8gYmxvY2sgc3R5bGVzLlxuICAgIC8vIENoZWNrIGZvciBkaXNhbGxvd2VkIGNoYXJhY3RlcnMgdG8gcnVsZSBvdXQgcGxhaW4gYW5kIHNpbmdsZS5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFyID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7XG4gICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7XG4gICAgICB9XG4gICAgICBwcmV2X2NoYXIgPSBpID4gMCA/IHN0cmluZy5jaGFyQ29kZUF0KGkgLSAxKSA6IG51bGw7XG4gICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIsIHByZXZfY2hhcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENhc2U6IGJsb2NrIHN0eWxlcyBwZXJtaXR0ZWQuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaWYgKGNoYXIgPT09IENIQVJfTElORV9GRUVEKSB7XG4gICAgICAgIGhhc0xpbmVCcmVhayA9IHRydWU7XG4gICAgICAgIC8vIENoZWNrIGlmIGFueSBsaW5lIGNhbiBiZSBmb2xkZWQuXG4gICAgICAgIGlmIChzaG91bGRUcmFja1dpZHRoKSB7XG4gICAgICAgICAgaGFzRm9sZGFibGVMaW5lID0gaGFzRm9sZGFibGVMaW5lIHx8XG4gICAgICAgICAgICAvLyBGb2xkYWJsZSBsaW5lID0gdG9vIGxvbmcsIGFuZCBub3QgbW9yZS1pbmRlbnRlZC5cbiAgICAgICAgICAgIChpIC0gcHJldmlvdXNMaW5lQnJlYWsgLSAxID4gbGluZVdpZHRoICYmXG4gICAgICAgICAgICAgc3RyaW5nW3ByZXZpb3VzTGluZUJyZWFrICsgMV0gIT09ICcgJyk7XG4gICAgICAgICAgcHJldmlvdXNMaW5lQnJlYWsgPSBpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkge1xuICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFO1xuICAgICAgfVxuICAgICAgcHJldl9jaGFyID0gaSA+IDAgPyBzdHJpbmcuY2hhckNvZGVBdChpIC0gMSkgOiBudWxsO1xuICAgICAgcGxhaW4gPSBwbGFpbiAmJiBpc1BsYWluU2FmZShjaGFyLCBwcmV2X2NoYXIpO1xuICAgIH1cbiAgICAvLyBpbiBjYXNlIHRoZSBlbmQgaXMgbWlzc2luZyBhIFxcblxuICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCAoc2hvdWxkVHJhY2tXaWR0aCAmJlxuICAgICAgKGkgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiZcbiAgICAgICBzdHJpbmdbcHJldmlvdXNMaW5lQnJlYWsgKyAxXSAhPT0gJyAnKSk7XG4gIH1cbiAgLy8gQWx0aG91Z2ggZXZlcnkgc3R5bGUgY2FuIHJlcHJlc2VudCBcXG4gd2l0aG91dCBlc2NhcGluZywgcHJlZmVyIGJsb2NrIHN0eWxlc1xuICAvLyBmb3IgbXVsdGlsaW5lLCBzaW5jZSB0aGV5J3JlIG1vcmUgcmVhZGFibGUgYW5kIHRoZXkgZG9uJ3QgYWRkIGVtcHR5IGxpbmVzLlxuICAvLyBBbHNvIHByZWZlciBmb2xkaW5nIGEgc3VwZXItbG9uZyBsaW5lLlxuICBpZiAoIWhhc0xpbmVCcmVhayAmJiAhaGFzRm9sZGFibGVMaW5lKSB7XG4gICAgLy8gU3RyaW5ncyBpbnRlcnByZXRhYmxlIGFzIGFub3RoZXIgdHlwZSBoYXZlIHRvIGJlIHF1b3RlZDtcbiAgICAvLyBlLmcuIHRoZSBzdHJpbmcgJ3RydWUnIHZzLiB0aGUgYm9vbGVhbiB0cnVlLlxuICAgIHJldHVybiBwbGFpbiAmJiAhdGVzdEFtYmlndW91c1R5cGUoc3RyaW5nKVxuICAgICAgPyBTVFlMRV9QTEFJTiA6IFNUWUxFX1NJTkdMRTtcbiAgfVxuICAvLyBFZGdlIGNhc2U6IGJsb2NrIGluZGVudGF0aW9uIGluZGljYXRvciBjYW4gb25seSBoYXZlIG9uZSBkaWdpdC5cbiAgaWYgKGluZGVudFBlckxldmVsID4gOSAmJiBuZWVkSW5kZW50SW5kaWNhdG9yKHN0cmluZykpIHtcbiAgICByZXR1cm4gU1RZTEVfRE9VQkxFO1xuICB9XG4gIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyBibG9jayBzdHlsZXMgYXJlIHZhbGlkLlxuICAvLyBQcmVmZXIgbGl0ZXJhbCBzdHlsZSB1bmxlc3Mgd2Ugd2FudCB0byBmb2xkLlxuICByZXR1cm4gaGFzRm9sZGFibGVMaW5lID8gU1RZTEVfRk9MREVEIDogU1RZTEVfTElURVJBTDtcbn1cblxuLy8gTm90ZTogbGluZSBicmVha2luZy9mb2xkaW5nIGlzIGltcGxlbWVudGVkIGZvciBvbmx5IHRoZSBmb2xkZWQgc3R5bGUuXG4vLyBOQi4gV2UgZHJvcCB0aGUgbGFzdCB0cmFpbGluZyBuZXdsaW5lIChpZiBhbnkpIG9mIGEgcmV0dXJuZWQgYmxvY2sgc2NhbGFyXG4vLyAgc2luY2UgdGhlIGR1bXBlciBhZGRzIGl0cyBvd24gbmV3bGluZS4gVGhpcyBhbHdheXMgd29ya3M6XG4vLyAgICBcdTIwMjIgTm8gZW5kaW5nIG5ld2xpbmUgPT4gdW5hZmZlY3RlZDsgYWxyZWFkeSB1c2luZyBzdHJpcCBcIi1cIiBjaG9tcGluZy5cbi8vICAgIFx1MjAyMiBFbmRpbmcgbmV3bGluZSAgICA9PiByZW1vdmVkIHRoZW4gcmVzdG9yZWQuXG4vLyAgSW1wb3J0YW50bHksIHRoaXMga2VlcHMgdGhlIFwiK1wiIGNob21wIGluZGljYXRvciBmcm9tIGdhaW5pbmcgYW4gZXh0cmEgbGluZS5cbmZ1bmN0aW9uIHdyaXRlU2NhbGFyKHN0YXRlLCBzdHJpbmcsIGxldmVsLCBpc2tleSkge1xuICBzdGF0ZS5kdW1wID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiJydcIjtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5ub0NvbXBhdE1vZGUgJiZcbiAgICAgICAgREVQUkVDQVRFRF9CT09MRUFOU19TWU5UQVguaW5kZXhPZihzdHJpbmcpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIFwiJ1wiICsgc3RyaW5nICsgXCInXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudCAqIE1hdGgubWF4KDEsIGxldmVsKTsgLy8gbm8gMC1pbmRlbnQgc2NhbGFyc1xuICAgIC8vIEFzIGluZGVudGF0aW9uIGdldHMgZGVlcGVyLCBsZXQgdGhlIHdpZHRoIGRlY3JlYXNlIG1vbm90b25pY2FsbHlcbiAgICAvLyB0byB0aGUgbG93ZXIgYm91bmQgbWluKHN0YXRlLmxpbmVXaWR0aCwgNDApLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIGltcGxpZXNcbiAgICAvLyAgc3RhdGUubGluZVdpZHRoIFx1MjI2NCA0MCArIHN0YXRlLmluZGVudDogd2lkdGggaXMgZml4ZWQgYXQgdGhlIGxvd2VyIGJvdW5kLlxuICAgIC8vICBzdGF0ZS5saW5lV2lkdGggPiA0MCArIHN0YXRlLmluZGVudDogd2lkdGggZGVjcmVhc2VzIHVudGlsIHRoZSBsb3dlciBib3VuZC5cbiAgICAvLyBUaGlzIGJlaGF2ZXMgYmV0dGVyIHRoYW4gYSBjb25zdGFudCBtaW5pbXVtIHdpZHRoIHdoaWNoIGRpc2FsbG93cyBuYXJyb3dlciBvcHRpb25zLFxuICAgIC8vIG9yIGFuIGluZGVudCB0aHJlc2hvbGQgd2hpY2ggY2F1c2VzIHRoZSB3aWR0aCB0byBzdWRkZW5seSBpbmNyZWFzZS5cbiAgICB2YXIgbGluZVdpZHRoID0gc3RhdGUubGluZVdpZHRoID09PSAtMVxuICAgICAgPyAtMSA6IE1hdGgubWF4KE1hdGgubWluKHN0YXRlLmxpbmVXaWR0aCwgNDApLCBzdGF0ZS5saW5lV2lkdGggLSBpbmRlbnQpO1xuXG4gICAgLy8gV2l0aG91dCBrbm93aW5nIGlmIGtleXMgYXJlIGltcGxpY2l0L2V4cGxpY2l0LCBhc3N1bWUgaW1wbGljaXQgZm9yIHNhZmV0eS5cbiAgICB2YXIgc2luZ2xlTGluZU9ubHkgPSBpc2tleVxuICAgICAgLy8gTm8gYmxvY2sgc3R5bGVzIGluIGZsb3cgbW9kZS5cbiAgICAgIHx8IChzdGF0ZS5mbG93TGV2ZWwgPiAtMSAmJiBsZXZlbCA+PSBzdGF0ZS5mbG93TGV2ZWwpO1xuICAgIGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdGVzdEltcGxpY2l0UmVzb2x2aW5nKHN0YXRlLCBzdHJpbmcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nLCBzaW5nbGVMaW5lT25seSwgc3RhdGUuaW5kZW50LCBsaW5lV2lkdGgsIHRlc3RBbWJpZ3VpdHkpKSB7XG4gICAgICBjYXNlIFNUWUxFX1BMQUlOOlxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgY2FzZSBTVFlMRV9TSU5HTEU6XG4gICAgICAgIHJldHVybiBcIidcIiArIHN0cmluZy5yZXBsYWNlKC8nL2csIFwiJydcIikgKyBcIidcIjtcbiAgICAgIGNhc2UgU1RZTEVfTElURVJBTDpcbiAgICAgICAgcmV0dXJuICd8JyArIGJsb2NrSGVhZGVyKHN0cmluZywgc3RhdGUuaW5kZW50KVxuICAgICAgICAgICsgZHJvcEVuZGluZ05ld2xpbmUoaW5kZW50U3RyaW5nKHN0cmluZywgaW5kZW50KSk7XG4gICAgICBjYXNlIFNUWUxFX0ZPTERFRDpcbiAgICAgICAgcmV0dXJuICc+JyArIGJsb2NrSGVhZGVyKHN0cmluZywgc3RhdGUuaW5kZW50KVxuICAgICAgICAgICsgZHJvcEVuZGluZ05ld2xpbmUoaW5kZW50U3RyaW5nKGZvbGRTdHJpbmcoc3RyaW5nLCBsaW5lV2lkdGgpLCBpbmRlbnQpKTtcbiAgICAgIGNhc2UgU1RZTEVfRE9VQkxFOlxuICAgICAgICByZXR1cm4gJ1wiJyArIGVzY2FwZVN0cmluZyhzdHJpbmcsIGxpbmVXaWR0aCkgKyAnXCInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2ltcG9zc2libGUgZXJyb3I6IGludmFsaWQgc2NhbGFyIHN0eWxlJyk7XG4gICAgfVxuICB9KCkpO1xufVxuXG4vLyBQcmUtY29uZGl0aW9uczogc3RyaW5nIGlzIHZhbGlkIGZvciBhIGJsb2NrIHNjYWxhciwgMSA8PSBpbmRlbnRQZXJMZXZlbCA8PSA5LlxuZnVuY3Rpb24gYmxvY2tIZWFkZXIoc3RyaW5nLCBpbmRlbnRQZXJMZXZlbCkge1xuICB2YXIgaW5kZW50SW5kaWNhdG9yID0gbmVlZEluZGVudEluZGljYXRvcihzdHJpbmcpID8gU3RyaW5nKGluZGVudFBlckxldmVsKSA6ICcnO1xuXG4gIC8vIG5vdGUgdGhlIHNwZWNpYWwgY2FzZTogdGhlIHN0cmluZyAnXFxuJyBjb3VudHMgYXMgYSBcInRyYWlsaW5nXCIgZW1wdHkgbGluZS5cbiAgdmFyIGNsaXAgPSAgICAgICAgICBzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDFdID09PSAnXFxuJztcbiAgdmFyIGtlZXAgPSBjbGlwICYmIChzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDJdID09PSAnXFxuJyB8fCBzdHJpbmcgPT09ICdcXG4nKTtcbiAgdmFyIGNob21wID0ga2VlcCA/ICcrJyA6IChjbGlwID8gJycgOiAnLScpO1xuXG4gIHJldHVybiBpbmRlbnRJbmRpY2F0b3IgKyBjaG9tcCArICdcXG4nO1xufVxuXG4vLyAoU2VlIHRoZSBub3RlIGZvciB3cml0ZVNjYWxhci4pXG5mdW5jdGlvbiBkcm9wRW5kaW5nTmV3bGluZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1tzdHJpbmcubGVuZ3RoIC0gMV0gPT09ICdcXG4nID8gc3RyaW5nLnNsaWNlKDAsIC0xKSA6IHN0cmluZztcbn1cblxuLy8gTm90ZTogYSBsb25nIGxpbmUgd2l0aG91dCBhIHN1aXRhYmxlIGJyZWFrIHBvaW50IHdpbGwgZXhjZWVkIHRoZSB3aWR0aCBsaW1pdC5cbi8vIFByZS1jb25kaXRpb25zOiBldmVyeSBjaGFyIGluIHN0ciBpc1ByaW50YWJsZSwgc3RyLmxlbmd0aCA+IDAsIHdpZHRoID4gMC5cbmZ1bmN0aW9uIGZvbGRTdHJpbmcoc3RyaW5nLCB3aWR0aCkge1xuICAvLyBJbiBmb2xkZWQgc3R5bGUsICRrJCBjb25zZWN1dGl2ZSBuZXdsaW5lcyBvdXRwdXQgYXMgJGsrMSQgbmV3bGluZXNcdTIwMTRcbiAgLy8gdW5sZXNzIHRoZXkncmUgYmVmb3JlIG9yIGFmdGVyIGEgbW9yZS1pbmRlbnRlZCBsaW5lLCBvciBhdCB0aGUgdmVyeVxuICAvLyBiZWdpbm5pbmcgb3IgZW5kLCBpbiB3aGljaCBjYXNlICRrJCBtYXBzIHRvICRrJC5cbiAgLy8gVGhlcmVmb3JlLCBwYXJzZSBlYWNoIGNodW5rIGFzIG5ld2xpbmUocykgZm9sbG93ZWQgYnkgYSBjb250ZW50IGxpbmUuXG4gIHZhciBsaW5lUmUgPSAvKFxcbispKFteXFxuXSopL2c7XG5cbiAgLy8gZmlyc3QgbGluZSAocG9zc2libHkgYW4gZW1wdHkgbGluZSlcbiAgdmFyIHJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5leHRMRiA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcbiAgICBuZXh0TEYgPSBuZXh0TEYgIT09IC0xID8gbmV4dExGIDogc3RyaW5nLmxlbmd0aDtcbiAgICBsaW5lUmUubGFzdEluZGV4ID0gbmV4dExGO1xuICAgIHJldHVybiBmb2xkTGluZShzdHJpbmcuc2xpY2UoMCwgbmV4dExGKSwgd2lkdGgpO1xuICB9KCkpO1xuICAvLyBJZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSB5ZXQsIGRvbid0IGFkZCBhbiBleHRyYSBcXG4uXG4gIHZhciBwcmV2TW9yZUluZGVudGVkID0gc3RyaW5nWzBdID09PSAnXFxuJyB8fCBzdHJpbmdbMF0gPT09ICcgJztcbiAgdmFyIG1vcmVJbmRlbnRlZDtcblxuICAvLyByZXN0IG9mIHRoZSBsaW5lc1xuICB2YXIgbWF0Y2g7XG4gIHdoaWxlICgobWF0Y2ggPSBsaW5lUmUuZXhlYyhzdHJpbmcpKSkge1xuICAgIHZhciBwcmVmaXggPSBtYXRjaFsxXSwgbGluZSA9IG1hdGNoWzJdO1xuICAgIG1vcmVJbmRlbnRlZCA9IChsaW5lWzBdID09PSAnICcpO1xuICAgIHJlc3VsdCArPSBwcmVmaXhcbiAgICAgICsgKCFwcmV2TW9yZUluZGVudGVkICYmICFtb3JlSW5kZW50ZWQgJiYgbGluZSAhPT0gJydcbiAgICAgICAgPyAnXFxuJyA6ICcnKVxuICAgICAgKyBmb2xkTGluZShsaW5lLCB3aWR0aCk7XG4gICAgcHJldk1vcmVJbmRlbnRlZCA9IG1vcmVJbmRlbnRlZDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEdyZWVkeSBsaW5lIGJyZWFraW5nLlxuLy8gUGlja3MgdGhlIGxvbmdlc3QgbGluZSB1bmRlciB0aGUgbGltaXQgZWFjaCB0aW1lLFxuLy8gb3RoZXJ3aXNlIHNldHRsZXMgZm9yIHRoZSBzaG9ydGVzdCBsaW5lIG92ZXIgdGhlIGxpbWl0LlxuLy8gTkIuIE1vcmUtaW5kZW50ZWQgbGluZXMgKmNhbm5vdCogYmUgZm9sZGVkLCBhcyB0aGF0IHdvdWxkIGFkZCBhbiBleHRyYSBcXG4uXG5mdW5jdGlvbiBmb2xkTGluZShsaW5lLCB3aWR0aCkge1xuICBpZiAobGluZSA9PT0gJycgfHwgbGluZVswXSA9PT0gJyAnKSByZXR1cm4gbGluZTtcblxuICAvLyBTaW5jZSBhIG1vcmUtaW5kZW50ZWQgbGluZSBhZGRzIGEgXFxuLCBicmVha3MgY2FuJ3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZS5cbiAgdmFyIGJyZWFrUmUgPSAvIFteIF0vZzsgLy8gbm90ZTogdGhlIG1hdGNoIGluZGV4IHdpbGwgYWx3YXlzIGJlIDw9IGxlbmd0aC0yLlxuICB2YXIgbWF0Y2g7XG4gIC8vIHN0YXJ0IGlzIGFuIGluY2x1c2l2ZSBpbmRleC4gZW5kLCBjdXJyLCBhbmQgbmV4dCBhcmUgZXhjbHVzaXZlLlxuICB2YXIgc3RhcnQgPSAwLCBlbmQsIGN1cnIgPSAwLCBuZXh0ID0gMDtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIC8vIEludmFyaWFudHM6IDAgPD0gc3RhcnQgPD0gbGVuZ3RoLTEuXG4gIC8vICAgMCA8PSBjdXJyIDw9IG5leHQgPD0gbWF4KDAsIGxlbmd0aC0yKS4gY3VyciAtIHN0YXJ0IDw9IHdpZHRoLlxuICAvLyBJbnNpZGUgdGhlIGxvb3A6XG4gIC8vICAgQSBtYXRjaCBpbXBsaWVzIGxlbmd0aCA+PSAyLCBzbyBjdXJyIGFuZCBuZXh0IGFyZSA8PSBsZW5ndGgtMi5cbiAgd2hpbGUgKChtYXRjaCA9IGJyZWFrUmUuZXhlYyhsaW5lKSkpIHtcbiAgICBuZXh0ID0gbWF0Y2guaW5kZXg7XG4gICAgLy8gbWFpbnRhaW4gaW52YXJpYW50OiBjdXJyIC0gc3RhcnQgPD0gd2lkdGhcbiAgICBpZiAobmV4dCAtIHN0YXJ0ID4gd2lkdGgpIHtcbiAgICAgIGVuZCA9IChjdXJyID4gc3RhcnQpID8gY3VyciA6IG5leHQ7IC8vIGRlcml2ZSBlbmQgPD0gbGVuZ3RoLTJcbiAgICAgIHJlc3VsdCArPSAnXFxuJyArIGxpbmUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAvLyBza2lwIHRoZSBzcGFjZSB0aGF0IHdhcyBvdXRwdXQgYXMgXFxuXG4gICAgICBzdGFydCA9IGVuZCArIDE7ICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmUgc3RhcnQgPD0gbGVuZ3RoLTFcbiAgICB9XG4gICAgY3VyciA9IG5leHQ7XG4gIH1cblxuICAvLyBCeSB0aGUgaW52YXJpYW50cywgc3RhcnQgPD0gbGVuZ3RoLTEsIHNvIHRoZXJlIGlzIHNvbWV0aGluZyBsZWZ0IG92ZXIuXG4gIC8vIEl0IGlzIGVpdGhlciB0aGUgd2hvbGUgc3RyaW5nIG9yIGEgcGFydCBzdGFydGluZyBmcm9tIG5vbi13aGl0ZXNwYWNlLlxuICByZXN1bHQgKz0gJ1xcbic7XG4gIC8vIEluc2VydCBhIGJyZWFrIGlmIHRoZSByZW1haW5kZXIgaXMgdG9vIGxvbmcgYW5kIHRoZXJlIGlzIGEgYnJlYWsgYXZhaWxhYmxlLlxuICBpZiAobGluZS5sZW5ndGggLSBzdGFydCA+IHdpZHRoICYmIGN1cnIgPiBzdGFydCkge1xuICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0LCBjdXJyKSArICdcXG4nICsgbGluZS5zbGljZShjdXJyICsgMSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5zbGljZSgxKTsgLy8gZHJvcCBleHRyYSBcXG4gam9pbmVyXG59XG5cbi8vIEVzY2FwZXMgYSBkb3VibGUtcXVvdGVkIHN0cmluZy5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgY2hhciwgbmV4dENoYXI7XG4gIHZhciBlc2NhcGVTZXE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFyID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgLy8gQ2hlY2sgZm9yIHN1cnJvZ2F0ZSBwYWlycyAocmVmZXJlbmNlIFVuaWNvZGUgMy4wIHNlY3Rpb24gXCIzLjcgU3Vycm9nYXRlc1wiKS5cbiAgICBpZiAoY2hhciA+PSAweEQ4MDAgJiYgY2hhciA8PSAweERCRkYvKiBoaWdoIHN1cnJvZ2F0ZSAqLykge1xuICAgICAgbmV4dENoYXIgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dENoYXIgPj0gMHhEQzAwICYmIG5leHRDaGFyIDw9IDB4REZGRi8qIGxvdyBzdXJyb2dhdGUgKi8pIHtcbiAgICAgICAgLy8gQ29tYmluZSB0aGUgc3Vycm9nYXRlIHBhaXIgYW5kIHN0b3JlIGl0IGVzY2FwZWQuXG4gICAgICAgIHJlc3VsdCArPSBlbmNvZGVIZXgoKGNoYXIgLSAweEQ4MDApICogMHg0MDAgKyBuZXh0Q2hhciAtIDB4REMwMCArIDB4MTAwMDApO1xuICAgICAgICAvLyBBZHZhbmNlIGluZGV4IG9uZSBleHRyYSBzaW5jZSB3ZSBhbHJlYWR5IHVzZWQgdGhhdCBjaGFyIGhlcmUuXG4gICAgICAgIGkrKzsgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVzY2FwZVNlcSA9IEVTQ0FQRV9TRVFVRU5DRVNbY2hhcl07XG4gICAgcmVzdWx0ICs9ICFlc2NhcGVTZXEgJiYgaXNQcmludGFibGUoY2hhcilcbiAgICAgID8gc3RyaW5nW2ldXG4gICAgICA6IGVzY2FwZVNlcSB8fCBlbmNvZGVIZXgoY2hhcik7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB3cml0ZUZsb3dTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIG9iamVjdCkge1xuICB2YXIgX3Jlc3VsdCA9ICcnLFxuICAgICAgX3RhZyAgICA9IHN0YXRlLnRhZyxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIC8vIFdyaXRlIG9ubHkgdmFsaWQgZWxlbWVudHMuXG4gICAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdFtpbmRleF0sIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgIGlmIChpbmRleCAhPT0gMCkgX3Jlc3VsdCArPSAnLCcgKyAoIXN0YXRlLmNvbmRlbnNlRmxvdyA/ICcgJyA6ICcnKTtcbiAgICAgIF9yZXN1bHQgKz0gc3RhdGUuZHVtcDtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gJ1snICsgX3Jlc3VsdCArICddJztcbn1cblxuZnVuY3Rpb24gd3JpdGVCbG9ja1NlcXVlbmNlKHN0YXRlLCBsZXZlbCwgb2JqZWN0LCBjb21wYWN0KSB7XG4gIHZhciBfcmVzdWx0ID0gJycsXG4gICAgICBfdGFnICAgID0gc3RhdGUudGFnLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGg7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgLy8gV3JpdGUgb25seSB2YWxpZCBlbGVtZW50cy5cbiAgICBpZiAod3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdFtpbmRleF0sIHRydWUsIHRydWUpKSB7XG4gICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXggIT09IDApIHtcbiAgICAgICAgX3Jlc3VsdCArPSBnZW5lcmF0ZU5leHRMaW5lKHN0YXRlLCBsZXZlbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZS5kdW1wLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgX3Jlc3VsdCArPSAnLSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfcmVzdWx0ICs9ICctICc7XG4gICAgICB9XG5cbiAgICAgIF9yZXN1bHQgKz0gc3RhdGUuZHVtcDtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gX3Jlc3VsdCB8fCAnW10nOyAvLyBFbXB0eSBzZXF1ZW5jZSBpZiBubyB2YWxpZCB2YWx1ZXMuXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvd01hcHBpbmcoc3RhdGUsIGxldmVsLCBvYmplY3QpIHtcbiAgdmFyIF9yZXN1bHQgICAgICAgPSAnJyxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoLFxuICAgICAgb2JqZWN0S2V5LFxuICAgICAgb2JqZWN0VmFsdWUsXG4gICAgICBwYWlyQnVmZmVyO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcblxuICAgIHBhaXJCdWZmZXIgPSAnJztcbiAgICBpZiAoaW5kZXggIT09IDApIHBhaXJCdWZmZXIgKz0gJywgJztcblxuICAgIGlmIChzdGF0ZS5jb25kZW5zZUZsb3cpIHBhaXJCdWZmZXIgKz0gJ1wiJztcblxuICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXhdO1xuICAgIG9iamVjdFZhbHVlID0gb2JqZWN0W29iamVjdEtleV07XG5cbiAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwsIG9iamVjdEtleSwgZmFsc2UsIGZhbHNlKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCBrZXk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmR1bXAubGVuZ3RoID4gMTAyNCkgcGFpckJ1ZmZlciArPSAnPyAnO1xuXG4gICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wICsgKHN0YXRlLmNvbmRlbnNlRmxvdyA/ICdcIicgOiAnJykgKyAnOicgKyAoc3RhdGUuY29uZGVuc2VGbG93ID8gJycgOiAnICcpO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RWYWx1ZSwgZmFsc2UsIGZhbHNlKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCB2YWx1ZS5cbiAgICB9XG5cbiAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXA7XG5cbiAgICAvLyBCb3RoIGtleSBhbmQgdmFsdWUgYXJlIHZhbGlkLlxuICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRlLnRhZyA9IF90YWc7XG4gIHN0YXRlLmR1bXAgPSAneycgKyBfcmVzdWx0ICsgJ30nO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJsb2NrTWFwcGluZyhzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkge1xuICB2YXIgX3Jlc3VsdCAgICAgICA9ICcnLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGgsXG4gICAgICBvYmplY3RLZXksXG4gICAgICBvYmplY3RWYWx1ZSxcbiAgICAgIGV4cGxpY2l0UGFpcixcbiAgICAgIHBhaXJCdWZmZXI7XG5cbiAgLy8gQWxsb3cgc29ydGluZyBrZXlzIHNvIHRoYXQgdGhlIG91dHB1dCBmaWxlIGlzIGRldGVybWluaXN0aWNcbiAgaWYgKHN0YXRlLnNvcnRLZXlzID09PSB0cnVlKSB7XG4gICAgLy8gRGVmYXVsdCBzb3J0aW5nXG4gICAgb2JqZWN0S2V5TGlzdC5zb3J0KCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlLnNvcnRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gQ3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAgICBvYmplY3RLZXlMaXN0LnNvcnQoc3RhdGUuc29ydEtleXMpO1xuICB9IGVsc2UgaWYgKHN0YXRlLnNvcnRLZXlzKSB7XG4gICAgLy8gU29tZXRoaW5nIGlzIHdyb25nXG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ3NvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyQnVmZmVyID0gJyc7XG5cbiAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXggIT09IDApIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgIH1cblxuICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXhdO1xuICAgIG9iamVjdFZhbHVlID0gb2JqZWN0W29iamVjdEtleV07XG5cbiAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RLZXksIHRydWUsIHRydWUsIHRydWUpKSB7XG4gICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhaXIgYmVjYXVzZSBvZiBpbnZhbGlkIGtleS5cbiAgICB9XG5cbiAgICBleHBsaWNpdFBhaXIgPSAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJz8nKSB8fFxuICAgICAgICAgICAgICAgICAgIChzdGF0ZS5kdW1wICYmIHN0YXRlLmR1bXAubGVuZ3RoID4gMTAyNCk7XG5cbiAgICBpZiAoZXhwbGljaXRQYWlyKSB7XG4gICAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgIHBhaXJCdWZmZXIgKz0gJz8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFpckJ1ZmZlciArPSAnPyAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDtcblxuICAgIGlmIChleHBsaWNpdFBhaXIpIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgIH1cblxuICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdFZhbHVlLCB0cnVlLCBleHBsaWNpdFBhaXIpKSB7XG4gICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhaXIgYmVjYXVzZSBvZiBpbnZhbGlkIHZhbHVlLlxuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZS5kdW1wLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gJzonO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlyQnVmZmVyICs9ICc6ICc7XG4gICAgfVxuXG4gICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wO1xuXG4gICAgLy8gQm90aCBrZXkgYW5kIHZhbHVlIGFyZSB2YWxpZC5cbiAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gX3Jlc3VsdCB8fCAne30nOyAvLyBFbXB0eSBtYXBwaW5nIGlmIG5vIHZhbGlkIHBhaXJzLlxufVxuXG5mdW5jdGlvbiBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGV4cGxpY2l0KSB7XG4gIHZhciBfcmVzdWx0LCB0eXBlTGlzdCwgaW5kZXgsIGxlbmd0aCwgdHlwZSwgc3R5bGU7XG5cbiAgdHlwZUxpc3QgPSBleHBsaWNpdCA/IHN0YXRlLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZS5pbXBsaWNpdFR5cGVzO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0eXBlTGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdHlwZSA9IHR5cGVMaXN0W2luZGV4XTtcblxuICAgIGlmICgodHlwZS5pbnN0YW5jZU9mICB8fCB0eXBlLnByZWRpY2F0ZSkgJiZcbiAgICAgICAgKCF0eXBlLmluc3RhbmNlT2YgfHwgKCh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JykgJiYgKG9iamVjdCBpbnN0YW5jZW9mIHR5cGUuaW5zdGFuY2VPZikpKSAmJlxuICAgICAgICAoIXR5cGUucHJlZGljYXRlICB8fCB0eXBlLnByZWRpY2F0ZShvYmplY3QpKSkge1xuXG4gICAgICBzdGF0ZS50YWcgPSBleHBsaWNpdCA/IHR5cGUudGFnIDogJz8nO1xuXG4gICAgICBpZiAodHlwZS5yZXByZXNlbnQpIHtcbiAgICAgICAgc3R5bGUgPSBzdGF0ZS5zdHlsZU1hcFt0eXBlLnRhZ10gfHwgdHlwZS5kZWZhdWx0U3R5bGU7XG5cbiAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGUucmVwcmVzZW50KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJykge1xuICAgICAgICAgIF9yZXN1bHQgPSB0eXBlLnJlcHJlc2VudChvYmplY3QsIHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLnJlcHJlc2VudCwgc3R5bGUpKSB7XG4gICAgICAgICAgX3Jlc3VsdCA9IHR5cGUucmVwcmVzZW50W3N0eWxlXShvYmplY3QsIHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignITwnICsgdHlwZS50YWcgKyAnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgXCInICsgc3R5bGUgKyAnXCIgc3R5bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmR1bXAgPSBfcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFNlcmlhbGl6ZXMgYG9iamVjdGAgYW5kIHdyaXRlcyBpdCB0byBnbG9iYWwgYHJlc3VsdGAuXG4vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2Ugb24gaW52YWxpZCBvYmplY3QuXG4vL1xuZnVuY3Rpb24gd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCwgb2JqZWN0LCBibG9jaywgY29tcGFjdCwgaXNrZXkpIHtcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuZHVtcCA9IG9iamVjdDtcblxuICBpZiAoIWRldGVjdFR5cGUoc3RhdGUsIG9iamVjdCwgZmFsc2UpKSB7XG4gICAgZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCB0cnVlKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gX3RvU3RyaW5nLmNhbGwoc3RhdGUuZHVtcCk7XG5cbiAgaWYgKGJsb2NrKSB7XG4gICAgYmxvY2sgPSAoc3RhdGUuZmxvd0xldmVsIDwgMCB8fCBzdGF0ZS5mbG93TGV2ZWwgPiBsZXZlbCk7XG4gIH1cblxuICB2YXIgb2JqZWN0T3JBcnJheSA9IHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBkdXBsaWNhdGVJbmRleCxcbiAgICAgIGR1cGxpY2F0ZTtcblxuICBpZiAob2JqZWN0T3JBcnJheSkge1xuICAgIGR1cGxpY2F0ZUluZGV4ID0gc3RhdGUuZHVwbGljYXRlcy5pbmRleE9mKG9iamVjdCk7XG4gICAgZHVwbGljYXRlID0gZHVwbGljYXRlSW5kZXggIT09IC0xO1xuICB9XG5cbiAgaWYgKChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHx8IGR1cGxpY2F0ZSB8fCAoc3RhdGUuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkpIHtcbiAgICBjb21wYWN0ID0gZmFsc2U7XG4gIH1cblxuICBpZiAoZHVwbGljYXRlICYmIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSkge1xuICAgIHN0YXRlLmR1bXAgPSAnKnJlZl8nICsgZHVwbGljYXRlSW5kZXg7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9iamVjdE9yQXJyYXkgJiYgZHVwbGljYXRlICYmICFzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHtcbiAgICAgIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgaWYgKGJsb2NrICYmIChPYmplY3Qua2V5cyhzdGF0ZS5kdW1wKS5sZW5ndGggIT09IDApKSB7XG4gICAgICAgIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlLCBsZXZlbCwgc3RhdGUuZHVtcCwgY29tcGFjdCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5kdW1wID0gJyZyZWZfJyArIGR1cGxpY2F0ZUluZGV4ICsgc3RhdGUuZHVtcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JpdGVGbG93TWFwcGluZyhzdGF0ZSwgbGV2ZWwsIHN0YXRlLmR1bXApO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArICcgJyArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIHZhciBhcnJheUxldmVsID0gKHN0YXRlLm5vQXJyYXlJbmRlbnQgJiYgKGxldmVsID4gMCkpID8gbGV2ZWwgLSAxIDogbGV2ZWw7XG4gICAgICBpZiAoYmxvY2sgJiYgKHN0YXRlLmR1bXAubGVuZ3RoICE9PSAwKSkge1xuICAgICAgICB3cml0ZUJsb2NrU2VxdWVuY2Uoc3RhdGUsIGFycmF5TGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlLCBhcnJheUxldmVsLCBzdGF0ZS5kdW1wKTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIHN0YXRlLmR1bXAgPSAnJnJlZl8nICsgZHVwbGljYXRlSW5kZXggKyAnICcgKyBzdGF0ZS5kdW1wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBTdHJpbmddJykge1xuICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gJz8nKSB7XG4gICAgICAgIHdyaXRlU2NhbGFyKHN0YXRlLCBzdGF0ZS5kdW1wLCBsZXZlbCwgaXNrZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUuc2tpcEludmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCd1bmFjY2VwdGFibGUga2luZCBvZiBhbiBvYmplY3QgdG8gZHVtcCAnICsgdHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICc/Jykge1xuICAgICAgc3RhdGUuZHVtcCA9ICchPCcgKyBzdGF0ZS50YWcgKyAnPiAnICsgc3RhdGUuZHVtcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhvYmplY3QsIHN0YXRlKSB7XG4gIHZhciBvYmplY3RzID0gW10sXG4gICAgICBkdXBsaWNhdGVzSW5kZXhlcyA9IFtdLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGg7XG5cbiAgaW5zcGVjdE5vZGUob2JqZWN0LCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcyk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGR1cGxpY2F0ZXNJbmRleGVzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBzdGF0ZS5kdXBsaWNhdGVzLnB1c2gob2JqZWN0c1tkdXBsaWNhdGVzSW5kZXhlc1tpbmRleF1dKTtcbiAgfVxuICBzdGF0ZS51c2VkRHVwbGljYXRlcyA9IG5ldyBBcnJheShsZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShvYmplY3QsIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKSB7XG4gIHZhciBvYmplY3RLZXlMaXN0LFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGg7XG5cbiAgaWYgKG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jykge1xuICAgIGluZGV4ID0gb2JqZWN0cy5pbmRleE9mKG9iamVjdCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGR1cGxpY2F0ZXNJbmRleGVzLmluZGV4T2YoaW5kZXgpID09PSAtMSkge1xuICAgICAgICBkdXBsaWNhdGVzSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgaW5zcGVjdE5vZGUob2JqZWN0W2luZGV4XSwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RLZXlMaXN0ID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICAgICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0S2V5TGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgaW5zcGVjdE5vZGUob2JqZWN0W29iamVjdEtleUxpc3RbaW5kZXhdXSwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGR1bXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKG9wdGlvbnMpO1xuXG4gIGlmICghc3RhdGUubm9SZWZzKSBnZXREdXBsaWNhdGVSZWZlcmVuY2VzKGlucHV0LCBzdGF0ZSk7XG5cbiAgaWYgKHdyaXRlTm9kZShzdGF0ZSwgMCwgaW5wdXQsIHRydWUsIHRydWUpKSByZXR1cm4gc3RhdGUuZHVtcCArICdcXG4nO1xuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gc2FmZUR1bXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGR1bXAoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5kdW1wICAgICA9IGR1bXA7XG5tb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCA9IHNhZmVEdW1wO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbG9hZGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2xvYWRlcicpO1xudmFyIGR1bXBlciA9IHJlcXVpcmUoJy4vanMteWFtbC9kdW1wZXInKTtcblxuXG5mdW5jdGlvbiBkZXByZWNhdGVkKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uICcgKyBuYW1lICsgJyBpcyBkZXByZWNhdGVkIGFuZCBjYW5ub3QgYmUgdXNlZC4nKTtcbiAgfTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5UeXBlICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3R5cGUnKTtcbm1vZHVsZS5leHBvcnRzLlNjaGVtYSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hJyk7XG5tb2R1bGUuZXhwb3J0cy5GQUlMU0FGRV9TQ0hFTUEgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuSlNPTl9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvanNvbicpO1xubW9kdWxlLmV4cG9ydHMuQ09SRV9TQ0hFTUEgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvY29yZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgICAgICAgICAgPSBsb2FkZXIubG9hZDtcbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgICAgICAgICAgPSBsb2FkZXIubG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgICAgICAgICAgICA9IGR1bXBlci5kdW1wO1xubW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgICAgICAgICAgICA9IGR1bXBlci5zYWZlRHVtcDtcbm1vZHVsZS5leHBvcnRzLllBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvZXhjZXB0aW9uJyk7XG5cbi8vIERlcHJlY2F0ZWQgc2NoZW1hIG5hbWVzIGZyb20gSlMtWUFNTCAyLjAueFxubW9kdWxlLmV4cG9ydHMuTUlOSU1BTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5TQUZFX1NDSEVNQSAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cbi8vIERlcHJlY2F0ZWQgZnVuY3Rpb25zIGZyb20gSlMtWUFNTCAxLngueFxubW9kdWxlLmV4cG9ydHMuc2NhbiAgICAgICAgICAgPSBkZXByZWNhdGVkKCdzY2FuJyk7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZSAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3BhcnNlJyk7XG5tb2R1bGUuZXhwb3J0cy5jb21wb3NlICAgICAgICA9IGRlcHJlY2F0ZWQoJ2NvbXBvc2UnKTtcbm1vZHVsZS5leHBvcnRzLmFkZENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZCgnYWRkQ29uc3RydWN0b3InKTtcbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeWFtbCA9IHJlcXVpcmUoJ2pzLXlhbWwnKTtcblxuLyoqXG4gKiBEZWZhdWx0IGVuZ2luZXNcbiAqL1xuXG5jb25zdCBlbmdpbmVzID0gZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIFlBTUxcbiAqL1xuXG5lbmdpbmVzLnlhbWwgPSB7XG4gIHBhcnNlOiB5YW1sLnNhZmVMb2FkLmJpbmQoeWFtbCksXG4gIHN0cmluZ2lmeTogeWFtbC5zYWZlRHVtcC5iaW5kKHlhbWwpXG59O1xuXG4vKipcbiAqIEpTT05cbiAqL1xuXG5lbmdpbmVzLmpzb24gPSB7XG4gIHBhcnNlOiBKU09OLnBhcnNlLmJpbmQoSlNPTiksXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24ob2JqLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe3JlcGxhY2VyOiBudWxsLCBzcGFjZTogMn0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIG9wdHMucmVwbGFjZXIsIG9wdHMuc3BhY2UpO1xuICB9XG59O1xuXG4vKipcbiAqIEphdmFTY3JpcHRcbiAqL1xuXG5lbmdpbmVzLmphdmFzY3JpcHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShzdHIsIG9wdGlvbnMsIHdyYXApIHtcbiAgICAvKiBlc2xpbnQgbm8tZXZhbDogMCAqL1xuICAgIHRyeSB7XG4gICAgICBpZiAod3JhcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgc3RyID0gJyhmdW5jdGlvbigpIHtcXG5yZXR1cm4gJyArIHN0ci50cmltKCkgKyAnO1xcbn0oKSk7JztcbiAgICAgIH1cbiAgICAgIHJldHVybiBldmFsKHN0cikgfHwge307XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAod3JhcCAhPT0gZmFsc2UgJiYgLyh1bmV4cGVjdGVkfGlkZW50aWZpZXIpL2kudGVzdChlcnIubWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlKHN0ciwgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGVycik7XG4gICAgfVxuICB9LFxuICBzdHJpbmdpZnk6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5naWZ5aW5nIEphdmFTY3JpcHQgaXMgbm90IHN1cHBvcnRlZCcpO1xuICB9XG59O1xuIiwgIi8qIVxuICogc3RyaXAtYm9tLXN0cmluZyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvc3RyaXAtYm9tLXN0cmluZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5jaGFyQXQoMCkgPT09ICdcXHVmZWZmJykge1xuICAgIHJldHVybiBzdHIuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpcEJvbSA9IHJlcXVpcmUoJ3N0cmlwLWJvbS1zdHJpbmcnKTtcbmNvbnN0IHR5cGVPZiA9IHJlcXVpcmUoJ2tpbmQtb2YnKTtcblxuZXhwb3J0cy5kZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsKSB7XG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IHZhbFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWxgIGlzIGEgYnVmZmVyXG4gKi9cblxuZXhwb3J0cy5pc0J1ZmZlciA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdHlwZU9mKHZhbCkgPT09ICdidWZmZXInO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbGAgaXMgYW4gb2JqZWN0XG4gKi9cblxuZXhwb3J0cy5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdHlwZU9mKHZhbCkgPT09ICdvYmplY3QnO1xufTtcblxuLyoqXG4gKiBDYXN0IGBpbnB1dGAgdG8gYSBidWZmZXJcbiAqL1xuXG5leHBvcnRzLnRvQnVmZmVyID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShpbnB1dCkgOiBpbnB1dDtcbn07XG5cbi8qKlxuICogQ2FzdCBgdmFsYCB0byBhIHN0cmluZy5cbiAqL1xuXG5leHBvcnRzLnRvU3RyaW5nID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgaWYgKGV4cG9ydHMuaXNCdWZmZXIoaW5wdXQpKSByZXR1cm4gc3RyaXBCb20oU3RyaW5nKGlucHV0KSk7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgaW5wdXQgdG8gYmUgYSBzdHJpbmcgb3IgYnVmZmVyJyk7XG4gIH1cbiAgcmV0dXJuIHN0cmlwQm9tKGlucHV0KTtcbn07XG5cbi8qKlxuICogQ2FzdCBgdmFsYCB0byBhbiBhcnJheS5cbiAqL1xuXG5leHBvcnRzLmFycmF5aWZ5ID0gZnVuY3Rpb24odmFsKSB7XG4gIHJldHVybiB2YWwgPyAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pIDogW107XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgc3RyYCBzdGFydHMgd2l0aCBgc3Vic3RyYC5cbiAqL1xuXG5leHBvcnRzLnN0YXJ0c1dpdGggPSBmdW5jdGlvbihzdHIsIHN1YnN0ciwgbGVuKSB7XG4gIGlmICh0eXBlb2YgbGVuICE9PSAnbnVtYmVyJykgbGVuID0gc3Vic3RyLmxlbmd0aDtcbiAgcmV0dXJuIHN0ci5zbGljZSgwLCBsZW4pID09PSBzdWJzdHI7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5naW5lcyA9IHJlcXVpcmUoJy4vZW5naW5lcycpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG5cbiAgLy8gZW5zdXJlIHRoYXQgZGVsaW1pdGVycyBhcmUgYW4gYXJyYXlcbiAgb3B0cy5kZWxpbWl0ZXJzID0gdXRpbHMuYXJyYXlpZnkob3B0cy5kZWxpbXMgfHwgb3B0cy5kZWxpbWl0ZXJzIHx8ICctLS0nKTtcbiAgaWYgKG9wdHMuZGVsaW1pdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICBvcHRzLmRlbGltaXRlcnMucHVzaChvcHRzLmRlbGltaXRlcnNbMF0pO1xuICB9XG5cbiAgb3B0cy5sYW5ndWFnZSA9IChvcHRzLmxhbmd1YWdlIHx8IG9wdHMubGFuZyB8fCAneWFtbCcpLnRvTG93ZXJDYXNlKCk7XG4gIG9wdHMuZW5naW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIGVuZ2luZXMsIG9wdHMucGFyc2Vycywgb3B0cy5lbmdpbmVzKTtcbiAgcmV0dXJuIG9wdHM7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lLCBvcHRpb25zKSB7XG4gIGxldCBlbmdpbmUgPSBvcHRpb25zLmVuZ2luZXNbbmFtZV0gfHwgb3B0aW9ucy5lbmdpbmVzW2FsaWFzZShuYW1lKV07XG4gIGlmICh0eXBlb2YgZW5naW5lID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcignZ3JheS1tYXR0ZXIgZW5naW5lIFwiJyArIG5hbWUgKyAnXCIgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgfVxuICBpZiAodHlwZW9mIGVuZ2luZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGVuZ2luZSA9IHsgcGFyc2U6IGVuZ2luZSB9O1xuICB9XG4gIHJldHVybiBlbmdpbmU7XG59O1xuXG5mdW5jdGlvbiBhbGlhc2UobmFtZSkge1xuICBzd2l0Y2ggKG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2pzJzpcbiAgICBjYXNlICdqYXZhc2NyaXB0JzpcbiAgICAgIHJldHVybiAnamF2YXNjcmlwdCc7XG4gICAgY2FzZSAnY29mZmVlJzpcbiAgICBjYXNlICdjb2ZmZWVzY3JpcHQnOlxuICAgIGNhc2UgJ2Nzb24nOlxuICAgICAgcmV0dXJuICdjb2ZmZWUnO1xuICAgIGNhc2UgJ3lhbWwnOlxuICAgIGNhc2UgJ3ltbCc6XG4gICAgICByZXR1cm4gJ3lhbWwnO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdHlwZU9mID0gcmVxdWlyZSgna2luZC1vZicpO1xuY29uc3QgZ2V0RW5naW5lID0gcmVxdWlyZSgnLi9lbmdpbmUnKTtcbmNvbnN0IGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZpbGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKGRhdGEgPT0gbnVsbCAmJiBvcHRpb25zID09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVPZihmaWxlKSkge1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgZGF0YSA9IGZpbGUuZGF0YTtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBmaWxlIHRvIGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0ciA9IGZpbGUuY29udGVudDtcbiAgY29uc3Qgb3B0cyA9IGRlZmF1bHRzKG9wdGlvbnMpO1xuICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgaWYgKCFvcHRzLmRhdGEpIHJldHVybiBmaWxlO1xuICAgIGRhdGEgPSBvcHRzLmRhdGE7XG4gIH1cblxuICBjb25zdCBsYW5ndWFnZSA9IGZpbGUubGFuZ3VhZ2UgfHwgb3B0cy5sYW5ndWFnZTtcbiAgY29uc3QgZW5naW5lID0gZ2V0RW5naW5lKGxhbmd1YWdlLCBvcHRzKTtcbiAgaWYgKHR5cGVvZiBlbmdpbmUuc3RyaW5naWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgXCInICsgbGFuZ3VhZ2UgKyAnLnN0cmluZ2lmeVwiIHRvIGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBmaWxlLmRhdGEsIGRhdGEpO1xuICBjb25zdCBvcGVuID0gb3B0cy5kZWxpbWl0ZXJzWzBdO1xuICBjb25zdCBjbG9zZSA9IG9wdHMuZGVsaW1pdGVyc1sxXTtcbiAgY29uc3QgbWF0dGVyID0gZW5naW5lLnN0cmluZ2lmeShkYXRhLCBvcHRpb25zKS50cmltKCk7XG4gIGxldCBidWYgPSAnJztcblxuICBpZiAobWF0dGVyICE9PSAne30nKSB7XG4gICAgYnVmID0gbmV3bGluZShvcGVuKSArIG5ld2xpbmUobWF0dGVyKSArIG5ld2xpbmUoY2xvc2UpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBmaWxlLmV4Y2VycHQgPT09ICdzdHJpbmcnICYmIGZpbGUuZXhjZXJwdCAhPT0gJycpIHtcbiAgICBpZiAoc3RyLmluZGV4T2YoZmlsZS5leGNlcnB0LnRyaW0oKSkgPT09IC0xKSB7XG4gICAgICBidWYgKz0gbmV3bGluZShmaWxlLmV4Y2VycHQpICsgbmV3bGluZShjbG9zZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZiArIG5ld2xpbmUoc3RyKTtcbn07XG5cbmZ1bmN0aW9uIG5ld2xpbmUoc3RyKSB7XG4gIHJldHVybiBzdHIuc2xpY2UoLTEpICE9PSAnXFxuJyA/IHN0ciArICdcXG4nIDogc3RyO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZmlsZSwgb3B0aW9ucykge1xuICBjb25zdCBvcHRzID0gZGVmYXVsdHMob3B0aW9ucyk7XG5cbiAgaWYgKGZpbGUuZGF0YSA9PSBudWxsKSB7XG4gICAgZmlsZS5kYXRhID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdHMuZXhjZXJwdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvcHRzLmV4Y2VycHQoZmlsZSwgb3B0cyk7XG4gIH1cblxuICBjb25zdCBzZXAgPSBmaWxlLmRhdGEuZXhjZXJwdF9zZXBhcmF0b3IgfHwgb3B0cy5leGNlcnB0X3NlcGFyYXRvcjtcbiAgaWYgKHNlcCA9PSBudWxsICYmIChvcHRzLmV4Y2VycHQgPT09IGZhbHNlIHx8IG9wdHMuZXhjZXJwdCA9PSBudWxsKSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgZGVsaW1pdGVyID0gdHlwZW9mIG9wdHMuZXhjZXJwdCA9PT0gJ3N0cmluZydcbiAgICA/IG9wdHMuZXhjZXJwdFxuICAgIDogKHNlcCB8fCBvcHRzLmRlbGltaXRlcnNbMF0pO1xuXG4gIC8vIGlmIGVuYWJsZWQsIGdldCB0aGUgZXhjZXJwdCBkZWZpbmVkIGFmdGVyIGZyb250LW1hdHRlclxuICBjb25zdCBpZHggPSBmaWxlLmNvbnRlbnQuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICBpZiAoaWR4ICE9PSAtMSkge1xuICAgIGZpbGUuZXhjZXJwdCA9IGZpbGUuY29udGVudC5zbGljZSgwLCBpZHgpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdHlwZU9mID0gcmVxdWlyZSgna2luZC1vZicpO1xuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gZW5zdXJlIGFuIG9iamVjdCBpcyByZXR1cm5lZFxuICogd2l0aCB0aGUgZXhwZWN0ZWQgcHJvcGVydGllcy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZpbGUpIHtcbiAgaWYgKHR5cGVPZihmaWxlKSAhPT0gJ29iamVjdCcpIHtcbiAgICBmaWxlID0geyBjb250ZW50OiBmaWxlIH07XG4gIH1cblxuICBpZiAodHlwZU9mKGZpbGUuZGF0YSkgIT09ICdvYmplY3QnKSB7XG4gICAgZmlsZS5kYXRhID0ge307XG4gIH1cblxuICAvLyBpZiBmaWxlIHdhcyBwYXNzZWQgYXMgYW4gb2JqZWN0LCBlbnN1cmUgdGhhdFxuICAvLyBcImZpbGUuY29udGVudFwiIGlzIHNldFxuICBpZiAoZmlsZS5jb250ZW50cyAmJiBmaWxlLmNvbnRlbnQgPT0gbnVsbCkge1xuICAgIGZpbGUuY29udGVudCA9IGZpbGUuY29udGVudHM7XG4gIH1cblxuICAvLyBzZXQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBvbiB0aGUgZmlsZSBvYmplY3RcbiAgdXRpbHMuZGVmaW5lKGZpbGUsICdvcmlnJywgdXRpbHMudG9CdWZmZXIoZmlsZS5jb250ZW50KSk7XG4gIHV0aWxzLmRlZmluZShmaWxlLCAnbGFuZ3VhZ2UnLCBmaWxlLmxhbmd1YWdlIHx8ICcnKTtcbiAgdXRpbHMuZGVmaW5lKGZpbGUsICdtYXR0ZXInLCBmaWxlLm1hdHRlciB8fCAnJyk7XG4gIHV0aWxzLmRlZmluZShmaWxlLCAnc3RyaW5naWZ5JywgZnVuY3Rpb24oZGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGFuZ3VhZ2UpIHtcbiAgICAgIGZpbGUubGFuZ3VhZ2UgPSBvcHRpb25zLmxhbmd1YWdlO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5naWZ5KGZpbGUsIGRhdGEsIG9wdGlvbnMpO1xuICB9KTtcblxuICAvLyBzdHJpcCBCT00gYW5kIGVuc3VyZSB0aGF0IFwiZmlsZS5jb250ZW50XCIgaXMgYSBzdHJpbmdcbiAgZmlsZS5jb250ZW50ID0gdXRpbHMudG9TdHJpbmcoZmlsZS5jb250ZW50KTtcbiAgZmlsZS5pc0VtcHR5ID0gZmFsc2U7XG4gIGZpbGUuZXhjZXJwdCA9ICcnO1xuICByZXR1cm4gZmlsZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBnZXRFbmdpbmUgPSByZXF1aXJlKCcuL2VuZ2luZScpO1xuY29uc3QgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGFuZ3VhZ2UsIHN0ciwgb3B0aW9ucykge1xuICBjb25zdCBvcHRzID0gZGVmYXVsdHMob3B0aW9ucyk7XG4gIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShsYW5ndWFnZSwgb3B0cyk7XG4gIGlmICh0eXBlb2YgZW5naW5lLnBhcnNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgXCInICsgbGFuZ3VhZ2UgKyAnLnBhcnNlXCIgdG8gYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHJldHVybiBlbmdpbmUucGFyc2Uoc3RyLCBvcHRzKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzZWN0aW9ucyA9IHJlcXVpcmUoJ3NlY3Rpb24tbWF0dGVyJyk7XG5jb25zdCBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vbGliL2RlZmF1bHRzJyk7XG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdpZnknKTtcbmNvbnN0IGV4Y2VycHQgPSByZXF1aXJlKCcuL2xpYi9leGNlcnB0Jyk7XG5jb25zdCBlbmdpbmVzID0gcmVxdWlyZSgnLi9saWIvZW5naW5lcycpO1xuY29uc3QgdG9GaWxlID0gcmVxdWlyZSgnLi9saWIvdG8tZmlsZScpO1xuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL2xpYi9wYXJzZScpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xuXG4vKipcbiAqIFRha2VzIGEgc3RyaW5nIG9yIG9iamVjdCB3aXRoIGBjb250ZW50YCBwcm9wZXJ0eSwgZXh0cmFjdHNcbiAqIGFuZCBwYXJzZXMgZnJvbnQtbWF0dGVyIGZyb20gdGhlIHN0cmluZywgdGhlbiByZXR1cm5zIGFuIG9iamVjdFxuICogd2l0aCBgZGF0YWAsIGBjb250ZW50YCBhbmQgb3RoZXIgW3VzZWZ1bCBwcm9wZXJ0aWVzXSgjcmV0dXJuZWQtb2JqZWN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbWF0dGVyID0gcmVxdWlyZSgnZ3JheS1tYXR0ZXInKTtcbiAqIGNvbnNvbGUubG9nKG1hdHRlcignLS0tXFxudGl0bGU6IEhvbWVcXG4tLS1cXG5PdGhlciBzdHVmZicpKTtcbiAqIC8vPT4geyBkYXRhOiB7IHRpdGxlOiAnSG9tZSd9LCBjb250ZW50OiAnT3RoZXIgc3R1ZmYnIH1cbiAqIGBgYFxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBgaW5wdXRgIFN0cmluZywgb3Igb2JqZWN0IHdpdGggYGNvbnRlbnRgIHN0cmluZ1xuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBtYXR0ZXIoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaWYgKGlucHV0ID09PSAnJykge1xuICAgIHJldHVybiB7IGRhdGE6IHt9LCBjb250ZW50OiBpbnB1dCwgZXhjZXJwdDogJycsIG9yaWc6IGlucHV0IH07XG4gIH1cblxuICBsZXQgZmlsZSA9IHRvRmlsZShpbnB1dCk7XG4gIGNvbnN0IGNhY2hlZCA9IG1hdHRlci5jYWNoZVtmaWxlLmNvbnRlbnRdO1xuXG4gIGlmICghb3B0aW9ucykge1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGZpbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjYWNoZWQpO1xuICAgICAgZmlsZS5vcmlnID0gY2FjaGVkLm9yaWc7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IGNhY2hlIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zIHBhc3NlZC4gaWYgd2UgY2FjaGUgd2hlbiBvcHRpb25zXG4gICAgLy8gYXJlIHBhc3NlZCwgd2Ugd291bGQgbmVlZCB0byBhbHNvIGNhY2hlIG9wdGlvbnMgdmFsdWVzLCB3aGljaCB3b3VsZFxuICAgIC8vIG5lZ2F0ZSBhbnkgcGVyZm9ybWFuY2UgYmVuZWZpdHMgb2YgY2FjaGluZ1xuICAgIG1hdHRlci5jYWNoZVtmaWxlLmNvbnRlbnRdID0gZmlsZTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZU1hdHRlcihmaWxlLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBmcm9udCBtYXR0ZXJcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZU1hdHRlcihmaWxlLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSBkZWZhdWx0cyhvcHRpb25zKTtcbiAgY29uc3Qgb3BlbiA9IG9wdHMuZGVsaW1pdGVyc1swXTtcbiAgY29uc3QgY2xvc2UgPSAnXFxuJyArIG9wdHMuZGVsaW1pdGVyc1sxXTtcbiAgbGV0IHN0ciA9IGZpbGUuY29udGVudDtcblxuICBpZiAob3B0cy5sYW5ndWFnZSkge1xuICAgIGZpbGUubGFuZ3VhZ2UgPSBvcHRzLmxhbmd1YWdlO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIG9wZW5pbmcgZGVsaW1pdGVyXG4gIGNvbnN0IG9wZW5MZW4gPSBvcGVuLmxlbmd0aDtcbiAgaWYgKCF1dGlscy5zdGFydHNXaXRoKHN0ciwgb3Blbiwgb3BlbkxlbikpIHtcbiAgICBleGNlcnB0KGZpbGUsIG9wdHMpO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgLy8gaWYgdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyIHRoZSBvcGVuaW5nIGRlbGltaXRlciBpc1xuICAvLyBhIGNoYXJhY3RlciBmcm9tIHRoZSBkZWxpbWl0ZXIsIHRoZW4gaXQncyBub3QgYSBmcm9udC1cbiAgLy8gbWF0dGVyIGRlbGltaXRlclxuICBpZiAoc3RyLmNoYXJBdChvcGVuTGVuKSA9PT0gb3Blbi5zbGljZSgtMSkpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIC8vIHN0cmlwIHRoZSBvcGVuaW5nIGRlbGltaXRlclxuICBzdHIgPSBzdHIuc2xpY2Uob3Blbkxlbik7XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG5cbiAgLy8gdXNlIHRoZSBsYW5ndWFnZSBkZWZpbmVkIGFmdGVyIGZpcnN0IGRlbGltaXRlciwgaWYgaXQgZXhpc3RzXG4gIGNvbnN0IGxhbmd1YWdlID0gbWF0dGVyLmxhbmd1YWdlKHN0ciwgb3B0cyk7XG4gIGlmIChsYW5ndWFnZS5uYW1lKSB7XG4gICAgZmlsZS5sYW5ndWFnZSA9IGxhbmd1YWdlLm5hbWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKGxhbmd1YWdlLnJhdy5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgY2xvc2luZyBkZWxpbWl0ZXJcbiAgbGV0IGNsb3NlSW5kZXggPSBzdHIuaW5kZXhPZihjbG9zZSk7XG4gIGlmIChjbG9zZUluZGV4ID09PSAtMSkge1xuICAgIGNsb3NlSW5kZXggPSBsZW47XG4gIH1cblxuICAvLyBnZXQgdGhlIHJhdyBmcm9udC1tYXR0ZXIgYmxvY2tcbiAgZmlsZS5tYXR0ZXIgPSBzdHIuc2xpY2UoMCwgY2xvc2VJbmRleCk7XG5cbiAgY29uc3QgYmxvY2sgPSBmaWxlLm1hdHRlci5yZXBsYWNlKC9eXFxzKiNbXlxcbl0rL2dtLCAnJykudHJpbSgpO1xuICBpZiAoYmxvY2sgPT09ICcnKSB7XG4gICAgZmlsZS5pc0VtcHR5ID0gdHJ1ZTtcbiAgICBmaWxlLmVtcHR5ID0gZmlsZS5jb250ZW50O1xuICAgIGZpbGUuZGF0YSA9IHt9O1xuICB9IGVsc2Uge1xuXG4gICAgLy8gY3JlYXRlIGZpbGUuZGF0YSBieSBwYXJzaW5nIHRoZSByYXcgZmlsZS5tYXR0ZXIgYmxvY2tcbiAgICBmaWxlLmRhdGEgPSBwYXJzZShmaWxlLmxhbmd1YWdlLCBmaWxlLm1hdHRlciwgb3B0cyk7XG4gIH1cblxuICAvLyB1cGRhdGUgZmlsZS5jb250ZW50XG4gIGlmIChjbG9zZUluZGV4ID09PSBsZW4pIHtcbiAgICBmaWxlLmNvbnRlbnQgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBmaWxlLmNvbnRlbnQgPSBzdHIuc2xpY2UoY2xvc2VJbmRleCArIGNsb3NlLmxlbmd0aCk7XG4gICAgaWYgKGZpbGUuY29udGVudFswXSA9PT0gJ1xccicpIHtcbiAgICAgIGZpbGUuY29udGVudCA9IGZpbGUuY29udGVudC5zbGljZSgxKTtcbiAgICB9XG4gICAgaWYgKGZpbGUuY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgIGZpbGUuY29udGVudCA9IGZpbGUuY29udGVudC5zbGljZSgxKTtcbiAgICB9XG4gIH1cblxuICBleGNlcnB0KGZpbGUsIG9wdHMpO1xuXG4gIGlmIChvcHRzLnNlY3Rpb25zID09PSB0cnVlIHx8IHR5cGVvZiBvcHRzLnNlY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZWN0aW9ucyhmaWxlLCBvcHRzLnNlY3Rpb24pO1xuICB9XG4gIHJldHVybiBmaWxlO1xufVxuXG4vKipcbiAqIEV4cG9zZSBlbmdpbmVzXG4gKi9cblxubWF0dGVyLmVuZ2luZXMgPSBlbmdpbmVzO1xuXG4vKipcbiAqIFN0cmluZ2lmeSBhbiBvYmplY3QgdG8gWUFNTCBvciB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBhbmRcbiAqIGFwcGVuZCBpdCB0byB0aGUgZ2l2ZW4gc3RyaW5nLiBCeSBkZWZhdWx0LCBvbmx5IFlBTUwgYW5kIEpTT05cbiAqIGNhbiBiZSBzdHJpbmdpZmllZC4gU2VlIHRoZSBbZW5naW5lc10oI2VuZ2luZXMpIHNlY3Rpb24gdG8gbGVhcm5cbiAqIGhvdyB0byBzdHJpbmdpZnkgb3RoZXIgbGFuZ3VhZ2VzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zb2xlLmxvZyhtYXR0ZXIuc3RyaW5naWZ5KCdmb28gYmFyIGJheicsIHt0aXRsZTogJ0hvbWUnfSkpO1xuICogLy8gcmVzdWx0cyBpbjpcbiAqIC8vIC0tLVxuICogLy8gdGl0bGU6IEhvbWVcbiAqIC8vIC0tLVxuICogLy8gZm9vIGJhciBiYXpcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBgZmlsZWAgVGhlIGNvbnRlbnQgc3RyaW5nIHRvIGFwcGVuZCB0byBzdHJpbmdpZmllZCBmcm9udC1tYXR0ZXIsIG9yIGEgZmlsZSBvYmplY3Qgd2l0aCBgZmlsZS5jb250ZW50YCBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYGRhdGFgIEZyb250IG1hdHRlciB0byBzdHJpbmdpZnkuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFtPcHRpb25zXSgjb3B0aW9ucykgdG8gcGFzcyB0byBncmF5LW1hdHRlciBhbmQgW2pzLXlhbWxdLlxuICogQHJldHVybiB7U3RyaW5nfSBSZXR1cm5zIGEgc3RyaW5nIGNyZWF0ZWQgYnkgd3JhcHBpbmcgc3RyaW5naWZpZWQgeWFtbCB3aXRoIGRlbGltaXRlcnMsIGFuZCBhcHBlbmRpbmcgdGhhdCB0byB0aGUgZ2l2ZW4gc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tYXR0ZXIuc3RyaW5naWZ5ID0gZnVuY3Rpb24oZmlsZSwgZGF0YSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSBmaWxlID0gbWF0dGVyKGZpbGUsIG9wdGlvbnMpO1xuICByZXR1cm4gc3RyaW5naWZ5KGZpbGUsIGRhdGEsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHJlYWQgYSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtIGFuZCBwYXJzZVxuICogZnJvbnQgbWF0dGVyLiBSZXR1cm5zIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgW21haW4gZnVuY3Rpb25dKCNtYXR0ZXIpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBmaWxlID0gbWF0dGVyLnJlYWQoJy4vY29udGVudC9ibG9nLXBvc3QubWQnKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBmaWxlcGF0aGAgZmlsZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHJlYWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFtPcHRpb25zXSgjb3B0aW9ucykgdG8gcGFzcyB0byBncmF5LW1hdHRlci5cbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBbYW4gb2JqZWN0XSgjcmV0dXJuZWQtb2JqZWN0KSB3aXRoIGBkYXRhYCBhbmQgYGNvbnRlbnRgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1hdHRlci5yZWFkID0gZnVuY3Rpb24oZmlsZXBhdGgsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RyID0gZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoLCAndXRmOCcpO1xuICBjb25zdCBmaWxlID0gbWF0dGVyKHN0ciwgb3B0aW9ucyk7XG4gIGZpbGUucGF0aCA9IGZpbGVwYXRoO1xuICByZXR1cm4gZmlsZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgc3RyaW5nYCBoYXMgZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtICB7U3RyaW5nfSBgc3RyaW5nYFxuICogQHBhcmFtICB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgZnJvbnQgbWF0dGVyIGV4aXN0cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWF0dGVyLnRlc3QgPSBmdW5jdGlvbihzdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHV0aWxzLnN0YXJ0c1dpdGgoc3RyLCBkZWZhdWx0cyhvcHRpb25zKS5kZWxpbWl0ZXJzWzBdKTtcbn07XG5cbi8qKlxuICogRGV0ZWN0IHRoZSBsYW5ndWFnZSB0byB1c2UsIGlmIG9uZSBpcyBkZWZpbmVkIGFmdGVyIHRoZVxuICogZmlyc3QgZnJvbnQtbWF0dGVyIGRlbGltaXRlci5cbiAqIEBwYXJhbSAge1N0cmluZ30gYHN0cmluZ2BcbiAqIEBwYXJhbSAge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IE9iamVjdCB3aXRoIGByYXdgIChhY3R1YWwgbGFuZ3VhZ2Ugc3RyaW5nKSwgYW5kIGBuYW1lYCwgdGhlIGxhbmd1YWdlIHdpdGggd2hpdGVzcGFjZSB0cmltbWVkXG4gKi9cblxubWF0dGVyLmxhbmd1YWdlID0gZnVuY3Rpb24oc3RyLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSBkZWZhdWx0cyhvcHRpb25zKTtcbiAgY29uc3Qgb3BlbiA9IG9wdHMuZGVsaW1pdGVyc1swXTtcblxuICBpZiAobWF0dGVyLnRlc3Qoc3RyKSkge1xuICAgIHN0ciA9IHN0ci5zbGljZShvcGVuLmxlbmd0aCk7XG4gIH1cblxuICBjb25zdCBsYW5ndWFnZSA9IHN0ci5zbGljZSgwLCBzdHIuc2VhcmNoKC9cXHI/XFxuLykpO1xuICByZXR1cm4ge1xuICAgIHJhdzogbGFuZ3VhZ2UsXG4gICAgbmFtZTogbGFuZ3VhZ2UgPyBsYW5ndWFnZS50cmltKCkgOiAnJ1xuICB9O1xufTtcblxuLyoqXG4gKiBFeHBvc2UgYG1hdHRlcmBcbiAqL1xuXG5tYXR0ZXIuY2FjaGUgPSB7fTtcbm1hdHRlci5jbGVhckNhY2hlID0gZnVuY3Rpb24oKSB7XG4gIG1hdHRlci5jYWNoZSA9IHt9O1xufTtcbm1vZHVsZS5leHBvcnRzID0gbWF0dGVyO1xuIiwgImltcG9ydCBcIi4vbWFpbi5sZXNzXCI7XG5cbmltcG9ydCB7IEZvbGRlck5vdGVBUEksIGdldEFwaSBhcyBnZXRGTkNBcGkgfSBmcm9tIFwiQGFpZGVubHgvZm9sZGVyLW5vdGUtY29yZVwiO1xuaW1wb3J0IHsgZ2V0QXBpIGFzIGdldElTQ0FwaSB9IGZyb20gXCJAYWlkZW5seC9vYnNpZGlhbi1pY29uLXNob3J0Y29kZXNcIjtcbmltcG9ydCB7IE5vdGljZSwgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBQYXRjaERyYWdNYW5hZ2VyIGZyb20gXCIuL2RyYWctcGF0Y2hcIjtcbmltcG9ydCBQYXRjaEZpbGVFeHBsb3JlciBmcm9tIFwiLi9mZS1wYXRjaFwiO1xuaW1wb3J0IHsgQ2xpY2tOb3RpY2UgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgcmVnaXN0ZXJTZXRGb2xkZXJJY29uQ21kIGZyb20gXCIuL21vZHVsZXMvc2V0LWZvbGRlci1pY29uXCI7XG5pbXBvcnQge1xuICBBTHhGb2xkZXJOb3RlU2V0dGluZ3MsXG4gIEFMeEZvbGRlck5vdGVTZXR0aW5nVGFiLFxuICBERUZBVUxUX1NFVFRJTkdTLFxuICBNb2JpbGVOb0NsaWNrTWFyayxcbiAgbm9IaWRlTm90ZU1hcmssXG59IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmNvbnN0IGZvbGRlcnZOb3RpZmllZEtleSA9IFwiZm9sZGVydk5vdGlmaWVkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFMeEZvbGRlck5vdGUgZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogQUx4Rm9sZGVyTm90ZVNldHRpbmdzID0gREVGQVVMVF9TRVRUSU5HUztcblxuICBnZXQgQ29yZUFwaSgpOiBGb2xkZXJOb3RlQVBJIHtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBsZXQgYXBpID0gZ2V0Rk5DQXBpKHRoaXMpIHx8IGdldEZOQ0FwaSgpO1xuICAgIGlmIChhcGkpIHtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBcIkZhaWxlZCB0byBpbml0aWFsaXplIGFseC1mb2xkZXItbm90ZVwiO1xuICAgICAgbmV3IENsaWNrTm90aWNlKG1lc3NhZ2UgKyBcIjogQ2xpY2sgaGVyZSBmb3IgbW9yZSBkZXRhaWxzXCIsICgpID0+XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQodGhpcy5tYW5pZmVzdC5pZCksXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgKyBcIjogZm9sZGVyLW5vdGUtY29yZSBub3QgYXZhaWxhYmxlXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgSWNvblNDQVBJKCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmZvbGRlckljb24pIHtcbiAgICAgIHJldHVybiBnZXRJU0NBcGkodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbm90aWNlRm9sZGVydkNoYW5nZSgpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5hcHAucGx1Z2lucy5wbHVnaW5zW1wiYWx4LWZvbGRlci1ub3RlLWZvbGRlcnZcIl0gJiYgLy8gbm90IGluc3RhbGxlZFxuICAgICAgIU51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShmb2xkZXJ2Tm90aWZpZWRLZXkpKSAvLyBub3Qgbm90aWZpZWRcbiAgICApIHtcbiAgICAgIG5ldyBDbGlja05vdGljZShcbiAgICAgICAgKGZyYWcpID0+IHtcbiAgICAgICAgICBmcmFnLmFwcGVuZFRleHQoXG4gICAgICAgICAgICBcIlNpbmNlIHYwLjEzLjAsIGZvbGRlciBvdmVydmlldyAoZm9sZGVydikgaGFzIGJlY29tZSBhbiBvcHRpb25hbCBjb21wb25lbnQgXCIgK1xuICAgICAgICAgICAgICBcInRoYXQgcmVxdWlyZXMgYSBkZWRpY2F0ZWQgcGx1Z2luLCBcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIGZyYWdcbiAgICAgICAgICAgIC5jcmVhdGVFbChcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICAgIHRleHQ6IFwiR28gdG8gRm9sZGVyIE92ZXJ2aWV3IFNlY3Rpb24gb2YgdGhlIFNldHRpbmcgVGFiIHRvIEluc3RhbGxcIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICAgICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQodGhpcy5tYW5pZmVzdC5pZCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGZyYWcuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgdGV4dDogXCJEb24ndCBzaG93IHRoaXMgYWdhaW5cIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oZm9sZGVydk5vdGlmaWVkS2V5LCBcIjFcIiksXG4gICAgICAgIDVlMyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIFBhdGNoRmlsZUV4cGxvcmVyKHRoaXMpO1xuICAgIGRvY3VtZW50LmJvZHkudG9nZ2xlQ2xhc3MoXG4gICAgICBNb2JpbGVOb0NsaWNrTWFyayxcbiAgICAgICF0aGlzLnNldHRpbmdzLm1vYmlsZUNsaWNrVG9PcGVuLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYm9keS50b2dnbGVDbGFzcyhcbiAgICAgIG5vSGlkZU5vdGVNYXJrLFxuICAgICAgIXRoaXMuc2V0dGluZ3MuaGlkZU5vdGVJbkV4cGxvcmVyLFxuICAgICk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBhc3luYyBvbmxvYWQoKSB7XG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIGFseC1mb2xkZXItbm90ZVwiKTtcblxuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgdGFiID0gbmV3IEFMeEZvbGRlck5vdGVTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKTtcbiAgICBpZiAoIXRhYi5jaGVja01pZ3JhdGVkKCkpXG4gICAgICBuZXcgTm90aWNlKFxuICAgICAgICBcIk9sZCBjb25maWcgbm90IHlldCBtaWdyYXRlZCwgXFxuXCIgK1xuICAgICAgICAgIFwiT3BlbiBTZXR0aW5ncyBUYWIgb2YgQUx4IEZvbGRlciBOb3RlIGZvciBkZXRhaWxzXCIsXG4gICAgICApO1xuICAgIHRoaXMuYWRkU2V0dGluZ1RhYih0YWIpO1xuXG4gICAgbGV0IGluaXRDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpbml0ID0gKCkgPT4ge1xuICAgICAgaW5pdENhbGxlZCA9IHRydWU7XG4gICAgICByZWdpc3RlclNldEZvbGRlckljb25DbWQodGhpcyk7XG4gICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSh0aGlzLmluaXRpYWxpemUuYmluZCh0aGlzKSk7XG4gICAgICBQYXRjaERyYWdNYW5hZ2VyKHRoaXMpO1xuICAgICAgdGhpcy5ub3RpY2VGb2xkZXJ2Q2hhbmdlKCk7XG4gICAgfTtcblxuICAgIGlmIChnZXRGTkNBcGkodGhpcykpIHtcbiAgICAgIGluaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZm9sZGVyLW5vdGUtY29yZVwiKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFpbml0Q2FsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZ0UmVmKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJmb2xkZXItbm90ZS1jb3JlIGVuYWJsZWQgYnV0IGZhaWwgdG8gbG9hZCB3aXRoaW4gNXNcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1ZTMpO1xuICAgICAgICBjb25zdCBldnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbihcImZvbGRlci1ub3RlOmFwaS1yZWFkeVwiLCAoKSA9PiB7XG4gICAgICAgICAgaW5pdCgpO1xuICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZ0UmVmKTsgLy8gcmVnaXN0ZXIgZXZlbnQgb25seSBvbmNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5Db3JlQXBpOyAvLyBwcm9tcHQgdG8gZW5hYmxlIGZvbGRlci1ub3RlLWNvcmVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4udGhpcy5zZXR0aW5ncywgLi4uKGF3YWl0IHRoaXMubG9hZERhdGEoKSkgfTtcbiAgICB0aGlzLnNldHVwTG9uZ1ByZXNzRGVsYXkoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuICB9XG5cbiAgZ2V0IGxvbmdQcmVzc0RlbGF5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MubG9uZ1ByZXNzRGVsYXk7XG4gIH1cbiAgc2V0IGxvbmdQcmVzc0RlbGF5KGRlbGF5OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldHRpbmdzLmxvbmdQcmVzc0RlbGF5ID0gZGVsYXk7XG4gICAgZG9jdW1lbnQuYm9keS5kYXRhc2V0W2xvbmdQcmVzc0RlbGF5RGF0YUtleV0gPSBgJHtkZWxheX1gO1xuICB9XG4gIHNldHVwTG9uZ1ByZXNzRGVsYXkoKSB7XG4gICAgLy8gc2V0IGxvbmcgcHJlc3MgZGVsYXkgdG8gdGhlIGJvZHlcbiAgICB0aGlzLmxvbmdQcmVzc0RlbGF5ID0gdGhpcy5sb25nUHJlc3NEZWxheTtcbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IGRlbGV0ZSBkb2N1bWVudC5ib2R5LmRhdGFzZXRbbG9uZ1ByZXNzRGVsYXlEYXRhS2V5XSk7XG4gIH1cbn1cblxuY29uc3QgbG9uZ1ByZXNzRGVsYXlEYXRhS2V5ID0gXCJsb25nUHJlc3NEZWxheVwiO1xuIiwgImltcG9ydCBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgRm9sZGVyTm90ZUFQSSwgeyBGTkNFdmVudHMsIE5vdGVMb2MgfSBmcm9tIFwiLi90eXBpbmdzL2FwaVwiO1xuZXhwb3J0IHR5cGUgeyBGTkNFdmVudHMsIEZvbGRlck5vdGVBUEksIE5vdGVMb2MgfTtcblxuLy8gRVZFTlRTXG5cbnR5cGUgT25BcmdzPFQ+ID0gVCBleHRlbmRzIFtpbmZlciBBLCAuLi5pbmZlciBCXVxuICA/IEEgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IFtuYW1lOiBBLCBjYWxsYmFjazogKC4uLmFyZ3M6IEIpID0+IGFueV1cbiAgICA6IG5ldmVyXG4gIDogbmV2ZXI7XG50eXBlIEV2ZW50c09uQXJncyA9IE9uQXJnczxGTkNFdmVudHM+O1xuXG5kZWNsYXJlIG1vZHVsZSBcIm9ic2lkaWFuXCIge1xuICBpbnRlcmZhY2UgVmF1bHQge1xuICAgIG9uKC4uLmFyZ3M6IEV2ZW50c09uQXJncyk6IEV2ZW50UmVmO1xuICB9XG59XG5cbi8vIFVUSUwgRlVOQ1RJT05TXG5cbmV4cG9ydCBjb25zdCBnZXRBcGkgPSAocGx1Z2luPzogUGx1Z2luKTogRm9sZGVyTm90ZUFQSSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChwbHVnaW4pIHJldHVybiBwbHVnaW4uYXBwLnBsdWdpbnMucGx1Z2luc1tcImZvbGRlci1ub3RlLWNvcmVcIl0/LmFwaTtcbiAgZWxzZSByZXR1cm4gd2luZG93W1wiRm9sZGVyTm90ZUFQSXYwXCJdO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGx1Z2luRW5hYmxlZCA9IChwbHVnaW46IFBsdWdpbikgPT5cbiAgcGx1Z2luLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImZvbGRlci1ub3RlLWNvcmVcIik7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckFwaSA9IChcbiAgcGx1Z2luOiBQbHVnaW4sXG4gIGNhbGxiYWNrOiAoYXBpOiBGb2xkZXJOb3RlQVBJKSA9PiB2b2lkLFxuKTogRm9sZGVyTm90ZUFQSSB8IHVuZGVmaW5lZCA9PiB7XG4gIHBsdWdpbi5hcHAudmF1bHQub24oXCJmb2xkZXItbm90ZTphcGktcmVhZHlcIiwgY2FsbGJhY2spO1xuICByZXR1cm4gZ2V0QXBpKHBsdWdpbik7XG59O1xuIiwgImltcG9ydCB7IE9wZW5WaWV3U3RhdGUsIFRGaWxlLCBURm9sZGVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBGTkNvcmUgZnJvbSBcIi4uL2ZuYy1tYWluXCI7XG5pbXBvcnQgeyBGTkNvcmVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5nc1wiO1xuXG5pbnRlcmZhY2UgT2xkQ29uZmlnIHtcbiAgLyoqXG4gICAqICBJbmRleD0wLCBJbnNpZGU9MSwgT3V0c2lkZT0yLFxuICAgKi9cbiAgZm9sZGVyTm90ZVByZWY6IDAgfCAxIHwgMjtcbiAgZGVsZXRlT3V0c2lkZU5vdGVXaXRoRm9sZGVyOiBib29sZWFuO1xuICBpbmRleE5hbWU6IHN0cmluZztcbiAgYXV0b1JlbmFtZTogYm9vbGVhbjtcbiAgZm9sZGVyTm90ZVRlbXBsYXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIE5vdGVMb2Mge1xuICBJbmRleCxcbiAgSW5zaWRlLFxuICBPdXRzaWRlLFxufVxuXG5leHBvcnQgdHlwZSBGb2xkZXJOb3RlUGF0aCA9IHtcbiAgLyoqIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovXG4gIGRpcjogc3RyaW5nO1xuICAvKiogdGhlIGZpbGUgbmFtZSAoaW5jbHVkaW5nIGV4dGVuc2lvbikgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogZnVsbCBmaWxlcGF0aCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBURmlsZSAqL1xuICBwYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJmYWNlIEZvbGRlck5vdGVBUEkge1xuICBpbXBvcnRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxPbGRDb25maWc+KTogdm9pZDtcbiAgcmVuZGVyQ29yZVNldHRpbmdzKHRhcmdldDogSFRNTEVsZW1lbnQpOiB2b2lkO1xuICByZW5kZXJMb2dMZXZlbCh0YXJnZXI6IEhUTUxFbGVtZW50KTogdm9pZDtcblxuICBnZXRGb2xkZXJGcm9tTm90ZShub3RlOiBURmlsZSB8IHN0cmluZywgc3RyYXRlZ3k/OiBOb3RlTG9jKTogVEZvbGRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBHZXQgcGF0aCBvZiBnaXZlbiBub3RlL25vdGVQYXRoJ3MgZm9sZGVyIGJhc2VkIG9uIHNldHRpbmdcbiAgICogQHBhcmFtIG5vdGUgbm90ZVBhdGggb3Igbm90ZSBURmlsZVxuICAgKiBAcGFyYW0gbmV3Rm9sZGVyIGlmIHRoZSBwYXRoIGlzIHVzZWQgdG8gY3JlYXRlIG5ldyBmb2xkZXJcbiAgICogQHJldHVybnMgZm9sZGVyIHBhdGgsIHdpbGwgcmV0dXJuIG51bGwgaWYgbm90ZSBiYXNlbmFtZSBpbnZhaWxkIGFuZCBuZXdGb2xkZXI9ZmFsc2VcbiAgICovXG4gIGdldEZvbGRlclBhdGgoXG4gICAgbm90ZTogVEZpbGUgfCBzdHJpbmcsXG4gICAgbmV3Rm9sZGVyOiBib29sZWFuLFxuICAgIHN0cmF0ZWd5PzogTm90ZUxvYyxcbiAgKTogc3RyaW5nIHwgbnVsbDtcblxuICBnZXRGb2xkZXJOb3RlKGZvbGRlcjogVEZvbGRlciB8IHN0cmluZywgc3RyYXRlZ3k/OiBOb3RlTG9jKTogVEZpbGUgfCBudWxsO1xuICAvKiogR2V0IHRoZSBwYXRoIHRvIHRoZSBmb2xkZXIgbm90ZSBmb3IgZ2l2ZW4gZmlsZSBiYXNlZCBvbiBzZXR0aW5nLFxuICAgKiBAcmV0dXJucyBub3QgZ3VhcmFudGVlZCB0byBleGlzdHMgICovXG4gIGdldEZvbGRlck5vdGVQYXRoKFxuICAgIGZvbGRlcjogVEZvbGRlciB8IHN0cmluZyxcbiAgICBzdHJhdGVneT86IE5vdGVMb2MsXG4gICk6IEZvbGRlck5vdGVQYXRoIHwgbnVsbDtcblxuICAvKiogR2VuZXJhdGUgZm9sZGVyIG5vdGUgY29udGVudCBmb3IgZ2l2ZW4gZm9sZGVyIGJhc2VkIG9uIHRlbXBsYXRlICovXG4gIGdldE5ld0ZvbGRlck5vdGUoZm9sZGVyOiBURm9sZGVyKTogc3RyaW5nO1xuXG4gIE9wZW5Gb2xkZXJOb3RlKFxuICAgIGZvbGRlcjogVEZvbGRlciB8IHN0cmluZyxcbiAgICBkcnlydW4/OiBib29sZWFuLFxuICAgIGNvbmZpZz86IHsgbmV3TGVhZj86IGJvb2xlYW47IG9wZW5WaWV3U3RhdGU/OiBPcGVuVmlld1N0YXRlIH0sXG4gICk6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcmV0dXJucyByZXR1cm4gZmFsc2UgaWYgbm8gbGlua2VkIGZvbGRlciBmb3VuZFxuICAgKi9cbiAgRGVsZXRlTGlua2VkRm9sZGVyKGZpbGU6IFRGaWxlLCBkcnlydW4/OiBib29sZWFuKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExpbmsgY3VycmVudCBub3RlIHRvIHBhcmVudCBmb2xkZXIsIG1vdmUgZ2l2ZW4gZmlsZSBpZiBuZWVkZWRcbiAgICogQHJldHVybnMgcmV0dXJuIGZhbHNlIGlmIGFscmVhZHkgbGlua2VkXG4gICAqL1xuICBMaW5rVG9QYXJlbnRGb2xkZXIoZmlsZTogVEZpbGUsIGRyeXJ1bj86IGJvb2xlYW4pOiBib29sZWFuO1xuICAvKipcbiAgICogRGVsZXRlIGdpdmVuIGZpbGUgYXMgd2VsbCBhcyBsaW5rZWQgZm9sZGVyLCB3aWxsIHByb21wdCBmb3IgY29uZmlybWF0aW9uXG4gICAqIEByZXR1cm5zIHJldHVybiBmYWxzZSBpZiBubyBsaW5rZWQgZm9sZGVyIGZvdW5kXG4gICAqL1xuICBEZWxldGVOb3RlQW5kTGlua2VkRm9sZGVyKHRhcmdldDogVEZpbGUgfCBURm9sZGVyLCBkcnlydW4/OiBib29sZWFuKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBmb2xkZXIgYmFzZWQgb24gY29uZmlnIGFuZCBtb3ZlIGdpdmVuIGZpbGUgaWYgbmVlZGVkXG4gICAqIEByZXR1cm5zIHJldHVybiBmYWxzZSBpZiBmb2xkZXIgYWxyZWFkeSBleGlzdHNcbiAgICovXG4gIGNyZWF0ZUZvbGRlckZvck5vdGUoZmlsZTogVEZpbGUsIGRyeXJ1bj86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKipcbiAgICogQHJldHVybnMgcmV0dXJuIGZhbHNlIGlmIGZvbGRlciBub3RlIG5vdCBleGlzdHNcbiAgICovXG4gIERlbGV0ZUZvbGRlck5vdGUoZm9sZGVyOiBURm9sZGVyLCBkcnlydW4/OiBib29sZWFuKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEByZXR1cm5zIHJldHVybiBmYWxzZSBpZiBmb2xkZXIgbm90ZSBhbHJlYWR5IGV4aXN0c1xuICAgKi9cbiAgQ3JlYXRlRm9sZGVyTm90ZShmb2xkZXI6IFRGb2xkZXIsIGRyeXJ1bj86IGJvb2xlYW4pOiBib29sZWFuO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIE11c3QgdXNlIHZhciwgbm8gY29uc3QvbGV0XG4gIHZhciBGb2xkZXJOb3RlQVBJdjA6IEZvbGRlck5vdGVBUEkgfCB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBBUElfTkFNRSA9IFwiRm9sZGVyTm90ZUFQSXYwXCI7XG5cbmV4cG9ydCB0eXBlIEZOQ0V2ZW50cyA9XG4gIHwgW25hbWU6IFwiZm9sZGVyLW5vdGU6YXBpLXJlYWR5XCIsIGFwaTogRm9sZGVyTm90ZUFQSV1cbiAgfCBbbmFtZTogXCJmb2xkZXItbm90ZTpjZmctY2hhbmdlZFwiXVxuICB8IFtuYW1lOiBcImZvbGRlci1ub3RlOmRlbGV0ZVwiLCBub3RlOiBURmlsZSwgZm9sZGVyOiBURm9sZGVyXVxuICB8IFtcbiAgICAgIG5hbWU6IFwiZm9sZGVyLW5vdGU6cmVuYW1lXCIsXG4gICAgICBub3RlOiBbZmlsZTogVEZpbGUsIG9sZFBhdGg6IHN0cmluZ10sXG4gICAgICBmb2xkZXI6IFtmb2xkZXI6IFRGb2xkZXIsIG9sZFBhdGg6IHN0cmluZ10sXG4gICAgXVxuICB8IFtuYW1lOiBcImZvbGRlci1ub3RlOmNyZWF0ZVwiLCBub3RlOiBURmlsZSwgZm9sZGVyOiBURm9sZGVyXTtcblxuZXhwb3J0IGNvbnN0IGdldEFwaSA9IChwbHVnaW46IEZOQ29yZSk6IEZvbGRlck5vdGVBUEkgPT4ge1xuICByZXR1cm4ge1xuICAgIGdldCByZW5kZXJDb3JlU2V0dGluZ3MoKSB7XG4gICAgICByZXR1cm4gcGx1Z2luLnNldHRpbmdUYWIucmVuZGVyQ29yZVNldHRpbmdzO1xuICAgIH0sXG4gICAgZ2V0IHJlbmRlckxvZ0xldmVsKCkge1xuICAgICAgcmV0dXJuIHBsdWdpbi5zZXR0aW5nVGFiLnNldExvZ0xldmVsO1xuICAgIH0sXG4gICAgaW1wb3J0U2V0dGluZ3M6IChjZmcpID0+IHtcbiAgICAgIGlmIChjZmcuZm9sZGVyTm90ZVByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzd2l0Y2ggKGNmZy5mb2xkZXJOb3RlUHJlZikge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNmZy5mb2xkZXJOb3RlUHJlZiA9IE5vdGVMb2MuSW5kZXg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjZmcuZm9sZGVyTm90ZVByZWYgPSBOb3RlTG9jLkluc2lkZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNmZy5mb2xkZXJOb3RlUHJlZiA9IE5vdGVMb2MuT3V0c2lkZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9JbXBvcnQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoY2ZnKS5maWx0ZXIoKFtrLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICAgKSBhcyBGTkNvcmVTZXR0aW5ncztcblxuICAgICAgICBwbHVnaW4uc2V0dGluZ3MgPSB7IC4uLnBsdWdpbi5zZXR0aW5ncywgLi4udG9JbXBvcnQgfTtcbiAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IGdldE5ld0ZvbGRlck5vdGUoKSB7XG4gICAgICByZXR1cm4gcGx1Z2luLmdldE5ld0ZvbGRlck5vdGU7XG4gICAgfSxcbiAgICBnZXQgZ2V0Rm9sZGVyRnJvbU5vdGUoKSB7XG4gICAgICByZXR1cm4gcGx1Z2luLnJlc29sdmVyLmdldEZvbGRlckZyb21Ob3RlO1xuICAgIH0sXG4gICAgZ2V0IGdldEZvbGRlclBhdGgoKSB7XG4gICAgICByZXR1cm4gcGx1Z2luLnJlc29sdmVyLmdldEZvbGRlclBhdGg7XG4gICAgfSxcbiAgICBnZXQgZ2V0Rm9sZGVyTm90ZSgpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucmVzb2x2ZXIuZ2V0Rm9sZGVyTm90ZTtcbiAgICB9LFxuICAgIGdldCBnZXRGb2xkZXJOb3RlUGF0aCgpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucmVzb2x2ZXIuZ2V0Rm9sZGVyTm90ZVBhdGg7XG4gICAgfSxcbiAgICBnZXQgRGVsZXRlTGlua2VkRm9sZGVyKCkge1xuICAgICAgcmV0dXJuIHBsdWdpbi5yZXNvbHZlci5EZWxldGVMaW5rZWRGb2xkZXI7XG4gICAgfSxcbiAgICBnZXQgTGlua1RvUGFyZW50Rm9sZGVyKCkge1xuICAgICAgcmV0dXJuIHBsdWdpbi5yZXNvbHZlci5MaW5rVG9QYXJlbnRGb2xkZXI7XG4gICAgfSxcbiAgICBnZXQgRGVsZXRlTm90ZUFuZExpbmtlZEZvbGRlcigpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucmVzb2x2ZXIuRGVsZXRlTm90ZUFuZExpbmtlZEZvbGRlcjtcbiAgICB9LFxuICAgIGdldCBjcmVhdGVGb2xkZXJGb3JOb3RlKCkge1xuICAgICAgcmV0dXJuIHBsdWdpbi5yZXNvbHZlci5jcmVhdGVGb2xkZXJGb3JOb3RlO1xuICAgIH0sXG4gICAgZ2V0IERlbGV0ZUZvbGRlck5vdGUoKSB7XG4gICAgICByZXR1cm4gcGx1Z2luLnJlc29sdmVyLkRlbGV0ZUZvbGRlck5vdGU7XG4gICAgfSxcbiAgICBnZXQgQ3JlYXRlRm9sZGVyTm90ZSgpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucmVzb2x2ZXIuQ3JlYXRlRm9sZGVyTm90ZTtcbiAgICB9LFxuICAgIGdldCBPcGVuRm9sZGVyTm90ZSgpIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucmVzb2x2ZXIuT3BlbkZvbGRlck5vdGU7XG4gICAgfSxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBJY29uU0NBUEksIHsgZXZ0UHJlZml4LCBQTUV2ZW50cyB9IGZyb20gXCIuL3R5cGluZ3MvYXBpXCI7XG5cbi8vIEVWRU5UU1xuXG50eXBlIE9uQXJnczxUPiA9IFQgZXh0ZW5kcyBbaW5mZXIgQSwgLi4uaW5mZXIgQl1cbiAgPyBBIGV4dGVuZHMgc3RyaW5nXG4gICAgPyBbbmFtZTogYCR7dHlwZW9mIGV2dFByZWZpeH0ke0F9YCwgY2FsbGJhY2s6ICguLi5hcmdzOiBCKSA9PiBhbnldXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuZGVjbGFyZSBtb2R1bGUgXCJvYnNpZGlhblwiIHtcbiAgaW50ZXJmYWNlIFZhdWx0IHtcbiAgICBvbiguLi5hcmdzOiBPbkFyZ3M8UE1FdmVudHM+KTogRXZlbnRSZWY7XG4gIH1cbn1cblxuLy8gVVRJTCBGVU5DVElPTlNcblxuZXhwb3J0IGNvbnN0IGdldEFwaSA9IChwbHVnaW4/OiBQbHVnaW4pOiBJY29uU0NBUEkgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAocGx1Z2luKVxuICAgIHJldHVybiBwbHVnaW4uYXBwLnBsdWdpbnMucGx1Z2luc1tcIm9ic2lkaWFuLWljb24tc2hvcnRjb2Rlc1wiXT8uYXBpO1xuICBlbHNlIHJldHVybiB3aW5kb3dbXCJJY29uU0NBUEl2MFwiXTtcbn07XG5cbi8qKiBAZGVwcmVjYXRlZCB5b3UgY2FuIGNoZWNrIGlmIGdldEFwaSByZXR1cm4gdW5kZWZpbmVkIGRpcmVjdGx5ICovXG5leHBvcnQgY29uc3QgaXNQbHVnaW5FbmFibGVkID0gKHBsdWdpbj86IFBsdWdpbikgPT5cbiAgZ2V0QXBpKHBsdWdpbikgIT09IHVuZGVmaW5lZDtcbiIsICJpbXBvcnQgXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuaW1wb3J0IHtcbiAgQ2xpcGJvYXJkTWFuYWdlcixcbiAgRHJhZ01hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgUGxhdGZvcm0sXG4gIFRGb2xkZXIsXG4gIFdvcmtzcGFjZUxlYWYsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgdHlwZSBBTHhGb2xkZXJOb3RlIGZyb20gXCIuL2ZuLW1haW5cIjtcblxuZGVjbGFyZSBnbG9iYWwge1xuICB2YXIgaTE4bmV4dDogYW55O1xufVxuZGVjbGFyZSBtb2R1bGUgXCJvYnNpZGlhblwiIHtcbiAgaW50ZXJmYWNlIEFwcCB7XG4gICAgZHJhZ01hbmFnZXI6IERyYWdNYW5hZ2VyO1xuICAgIGdldE9ic2lkaWFuVXJsKGZpbGU6IFRGaWxlKTogc3RyaW5nO1xuICB9XG4gIGludGVyZmFjZSBEcmFnSW5mbyB7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBpY29uOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBmaWxlPzogVEZvbGRlciB8IFRGaWxlO1xuICB9XG4gIGludGVyZmFjZSBEcmFnRm9sZGVySW5mbyBleHRlbmRzIERyYWdJbmZvIHtcbiAgICB0eXBlOiBcImZvbGRlclwiO1xuICAgIGZpbGU6IFRGb2xkZXI7XG4gIH1cbiAgaW50ZXJmYWNlIERyYWdGaWxlSW5mbyBleHRlbmRzIERyYWdJbmZvIHtcbiAgICB0eXBlOiBcImZpbGVcIjtcbiAgICBmaWxlOiBURmlsZTtcbiAgfVxuICBpbnRlcmZhY2UgRHJhZ0ZpbGVzSW5mbyBleHRlbmRzIERyYWdJbmZvIHtcbiAgICB0eXBlOiBcImZpbGVzXCI7XG4gICAgZmlsZXM6IFRGaWxlW107XG4gIH1cbiAgY2xhc3MgRHJhZ01hbmFnZXIge1xuICAgIGRyYWdnYWJsZTogRHJhZ0luZm8gfCBudWxsO1xuICAgIHNldEFjdGlvbjogKGFjdGlvbjogc3RyaW5nKSA9PiBhbnk7XG4gICAgZHJhZ0ZpbGUoZXZ0OiBEcmFnRXZlbnQsIGZpbGU6IFRGaWxlLCBzb3VyY2U/OiBzdHJpbmcpOiBEcmFnRm9sZGVySW5mbztcbiAgICBkcmFnRmlsZXMoZXZ0OiBEcmFnRXZlbnQsIGZpbGVzOiBURmlsZVtdLCBzb3VyY2U/OiBzdHJpbmcpOiBEcmFnRmlsZXNJbmZvO1xuICAgIGRyYWdGb2xkZXIoXG4gICAgICBldnQ6IERyYWdFdmVudCxcbiAgICAgIGZvbGRlcjogVEZvbGRlcixcbiAgICAgIHNvdXJjZT86IHN0cmluZyxcbiAgICApOiBEcmFnRm9sZGVySW5mbztcbiAgICAvLyBoYW5kbGVEcm9wOiAoXG4gICAgLy8gICBlbDogSFRNTEVsZW1lbnQsXG4gICAgLy8gICBoYW5kbGVyOiAoXG4gICAgLy8gICAgIGV2dDogRHJhZ0V2ZW50LFxuICAgIC8vICAgICBkcmFnYWJsZTogRHJhZ0luZm8sXG4gICAgLy8gICAgIGRyYWdpbmc6IGJvb2xlYW4sXG4gICAgLy8gICApID0+IHtcbiAgICAvLyAgICAgYWN0aW9uOiBzdHJpbmc7XG4gICAgLy8gICAgIGRyb3BFZmZlY3Q6IHN0cmluZztcbiAgICAvLyAgICAgaG92ZXJFbD86IEhUTUxFbGVtZW50O1xuICAgIC8vICAgICBob3ZlckNsYXNzPzogc3RyaW5nO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIGFyZzA6IGJvb2xlYW4sXG4gICAgLy8gKSA9PiB2b2lkO1xuICB9XG4gIGludGVyZmFjZSBNYXJrZG93blZpZXcge1xuICAgIGVkaXRNb2RlPzogTWFya2Rvd25FZGl0VmlldztcbiAgICBzb3VyY2VNb2RlPzogTWFya2Rvd25FZGl0VmlldztcbiAgfVxuICBpbnRlcmZhY2UgTWFya2Rvd25FZGl0VmlldyB7XG4gICAgY2xpcGJvYXJkTWFuYWdlcjogQ2xpcGJvYXJkTWFuYWdlcjtcbiAgfVxuICBjbGFzcyBDbGlwYm9hcmRNYW5hZ2VyIHtcbiAgICBhcHA6IEFwcDtcbiAgICBoYW5kbGVEcm9wOiAoZXZ0OiBEcmFnRXZlbnQpID0+IGJvb2xlYW47XG4gICAgaGFuZGxlRHJhZ092ZXI6IChldnQ6IERyYWdFdmVudCkgPT4gdm9pZDtcbiAgfVxufVxuXG5jb25zdCBIRCA9IHtcbiAgbm9uZTogW10sXG4gIGNvcHk6IFtcImNvcHlcIl0sXG4gIGNvcHlMaW5rOiBbXCJjb3B5XCIsIFwibGlua1wiXSxcbiAgY29weU1vdmU6IFtcImNvcHlcIiwgXCJtb3ZlXCJdLFxuICBsaW5rOiBbXCJsaW5rXCJdLFxuICBsaW5rTW92ZTogW1wibGlua1wiLCBcIm1vdmVcIl0sXG4gIG1vdmU6IFtcIm1vdmVcIl0sXG4gIGFsbDogW1wiY29weVwiLCBcImxpbmtcIiwgXCJtb3ZlXCJdLFxuICB1bmluaXRpYWxpemVkOiBbXSxcbn0gYXMgY29uc3Q7XG5mdW5jdGlvbiBWRChlOiBEcmFnRXZlbnQsIHQ6IERhdGFUcmFuc2ZlcltcImRyb3BFZmZlY3RcIl0pIHtcbiAgdCAmJlxuICAgIChmdW5jdGlvbiAoZSwgdCkge1xuICAgICAgaWYgKFwibm9uZVwiID09PSB0KSByZXR1cm4gITA7XG4gICAgICBsZXQgbiA9IEhEW2UuZGF0YVRyYW5zZmVyIS5lZmZlY3RBbGxvd2VkXTtcbiAgICAgIHJldHVybiAhIW4gJiYgKG4gYXMgYW55KS5jb250YWlucyh0KTtcbiAgICB9KShlLCB0KSAmJlxuICAgIChlLmRhdGFUcmFuc2ZlciEuZHJvcEVmZmVjdCA9IHQpO1xufVxuXG5jb25zdCBnZXRNYXJrZG93blZpZXcgPSAoKSA9PiB7XG4gIGNvbnN0IGxlYXZlcyA9IGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwibWFya2Rvd25cIik7XG4gIGlmIChsZWF2ZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBsZWF2ZXNbMF0udmlldyBhcyBNYXJrZG93blZpZXc7XG4gIH0gZWxzZSByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IFBhdGNoRHJhZ01hbmFnZXIgPSAocGx1Z2luOiBBTHhGb2xkZXJOb3RlKSA9PiB7XG4gIGNvbnN0IHsgZ2V0Rm9sZGVyTm90ZSB9ID0gcGx1Z2luLkNvcmVBcGk7XG5cbiAgY29uc3QgcGF0Y2hDbGlwYm9hcmRNYW5hZ2VyID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHZpZXcgPSBnZXRNYXJrZG93blZpZXcoKTtcbiAgICBpZiAoIXZpZXcpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlZGl0TW9kZSA9IHZpZXcuZWRpdE1vZGUgPz8gdmlldy5zb3VyY2VNb2RlO1xuXG4gICAgaWYgKCFlZGl0TW9kZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXRjaCBjbGlwYm9hcmQgbWFuYWdlcjogbm8gZWRpdCB2aWV3IGZvdW5kXCIpO1xuXG4gICAgcGx1Z2luLnJlZ2lzdGVyKFxuICAgICAgYXJvdW5kKFxuICAgICAgICBlZGl0TW9kZS5jbGlwYm9hcmRNYW5hZ2VyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBhcyBDbGlwYm9hcmRNYW5hZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgaGFuZGxlRHJhZ092ZXI6IChuZXh0KSA9PlxuICAgICAgICAgICAgZnVuY3Rpb24gKHRoaXM6IENsaXBib2FyZE1hbmFnZXIsIGV2dCwgLi4uYXJncykge1xuICAgICAgICAgICAgICBjb25zdCB7IGRyYWdnYWJsZSB9ID0gdGhpcy5hcHAuZHJhZ01hbmFnZXI7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGUgJiZcbiAgICAgICAgICAgICAgICAhKFBsYXRmb3JtLmlzTWFjT1MgPyBldnQuc2hpZnRLZXkgOiBldnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZS5maWxlIGluc3RhbmNlb2YgVEZvbGRlciAmJlxuICAgICAgICAgICAgICAgIGdldEZvbGRlck5vdGUoZHJhZ2dhYmxlLmZpbGUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIFZEKGV2dCwgXCJsaW5rXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLmRyYWdNYW5hZ2VyLnNldEFjdGlvbihcbiAgICAgICAgICAgICAgICAgIGkxOG5leHQudChcImludGVyZmFjZS5kcmFnLWFuZC1kcm9wLmluc2VydC1saW5rLWhlcmVcIiksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0LmNhbGwodGhpcywgZXZ0LCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBoYW5kbGVEcm9wOiAobmV4dCkgPT5cbiAgICAgICAgICAgIGZ1bmN0aW9uICh0aGlzOiBDbGlwYm9hcmRNYW5hZ2VyLCBldnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmFsbGJhY2sgPSAoKSA9PiBuZXh0LmNhbGwodGhpcywgZXZ0LCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgY29uc3QgeyBkcmFnZ2FibGUgfSA9IHBsdWdpbi5hcHAuZHJhZ01hbmFnZXI7XG4gICAgICAgICAgICAgIGxldCBub3RlO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlPy50eXBlID09PSBcImZvbGRlclwiICYmXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlLmZpbGUgaW5zdGFuY2VvZiBURm9sZGVyICYmXG4gICAgICAgICAgICAgICAgKG5vdGUgPSBnZXRGb2xkZXJOb3RlKGRyYWdnYWJsZS5maWxlKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlLmZpbGUgPSBub3RlO1xuICAgICAgICAgICAgICAgIGRyYWdnYWJsZS50eXBlID0gXCJmaWxlXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFwiYWx4LWZvbGRlci1ub3RlOiBjbGlwYm9hcmQgbWFuYWdlciBwYXRjaGVkXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHBsdWdpbi5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xuICAgIGlmICghcGF0Y2hDbGlwYm9hcmRNYW5hZ2VyKCkpIHtcbiAgICAgIGNvbnN0IGV2dCA9IGFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgcGF0Y2hDbGlwYm9hcmRNYW5hZ2VyKCkgJiYgYXBwLndvcmtzcGFjZS5vZmZyZWYoZXZ0KTtcbiAgICAgIH0pO1xuICAgICAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoZXZ0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHBsdWdpbi5yZWdpc3RlcihcbiAgICBhcm91bmQoYXBwLmRyYWdNYW5hZ2VyLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBhcyBEcmFnTWFuYWdlciwge1xuICAgICAgZHJhZ0ZvbGRlcjogKG5leHQpID0+XG4gICAgICAgIGZ1bmN0aW9uICh0aGlzOiBEcmFnTWFuYWdlciwgZXZ0LCBmb2xkZXIsIHNvdXJjZSwgLi4uYXJncykge1xuICAgICAgICAgIGxldCBub3RlO1xuICAgICAgICAgIGlmICgobm90ZSA9IGdldEZvbGRlck5vdGUoZm9sZGVyKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGFwcC5nZXRPYnNpZGlhblVybChub3RlKTtcbiAgICAgICAgICAgIGV2dC5kYXRhVHJhbnNmZXIhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHVybCk7XG4gICAgICAgICAgICBldnQuZGF0YVRyYW5zZmVyIS5zZXREYXRhKFwidGV4dC91cmktbGlzdFwiLCB1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV4dC5jYWxsKHRoaXMsIGV2dCwgZm9sZGVyLCBzb3VyY2UsIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICApO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBhdGNoRHJhZ01hbmFnZXI7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGFyb3VuZChvYmosIGZhY3Rvcmllcykge1xuICAgIGNvbnN0IHJlbW92ZXJzID0gT2JqZWN0LmtleXMoZmFjdG9yaWVzKS5tYXAoa2V5ID0+IGFyb3VuZDEob2JqLCBrZXksIGZhY3Rvcmllc1trZXldKSk7XG4gICAgcmV0dXJuIHJlbW92ZXJzLmxlbmd0aCA9PT0gMSA/IHJlbW92ZXJzWzBdIDogZnVuY3Rpb24gKCkgeyByZW1vdmVycy5mb3JFYWNoKHIgPT4gcigpKTsgfTtcbn1cbmZ1bmN0aW9uIGFyb3VuZDEob2JqLCBtZXRob2QsIGNyZWF0ZVdyYXBwZXIpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IG9ialttZXRob2RdLCBoYWRPd24gPSBvYmouaGFzT3duUHJvcGVydHkobWV0aG9kKTtcbiAgICBsZXQgY3VycmVudCA9IGNyZWF0ZVdyYXBwZXIob3JpZ2luYWwpO1xuICAgIC8vIExldCBvdXIgd3JhcHBlciBpbmhlcml0IHN0YXRpYyBwcm9wcyBmcm9tIHRoZSB3cmFwcGluZyBtZXRob2QsXG4gICAgLy8gYW5kIHRoZSB3cmFwcGluZyBtZXRob2QsIHByb3BzIGZyb20gdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgIGlmIChvcmlnaW5hbClcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGN1cnJlbnQsIG9yaWdpbmFsKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yod3JhcHBlciwgY3VycmVudCk7XG4gICAgb2JqW21ldGhvZF0gPSB3cmFwcGVyO1xuICAgIC8vIFJldHVybiBhIGNhbGxiYWNrIHRvIGFsbG93IHNhZmUgcmVtb3ZhbFxuICAgIHJldHVybiByZW1vdmU7XG4gICAgZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYmVlbiBkZWFjdGl2YXRlZCBhbmQgYXJlIG5vIGxvbmdlciB3cmFwcGVkLCByZW1vdmUgb3Vyc2VsdmVzXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbCAmJiBvYmpbbWV0aG9kXSA9PT0gd3JhcHBlcilcbiAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICByZXR1cm4gY3VycmVudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAvLyBJZiBubyBvdGhlciBwYXRjaGVzLCBqdXN0IGRvIGEgZGlyZWN0IHJlbW92YWxcbiAgICAgICAgaWYgKG9ialttZXRob2RdID09PSB3cmFwcGVyKSB7XG4gICAgICAgICAgICBpZiAoaGFkT3duKVxuICAgICAgICAgICAgICAgIG9ialttZXRob2RdID0gb3JpZ2luYWw7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGVsZXRlIG9ialttZXRob2RdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gRWxzZSBwYXNzIGZ1dHVyZSBjYWxscyB0aHJvdWdoLCBhbmQgcmVtb3ZlIHdyYXBwZXIgZnJvbSB0aGUgcHJvdG90eXBlIGNoYWluXG4gICAgICAgIGN1cnJlbnQgPSBvcmlnaW5hbDtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIG9yaWdpbmFsIHx8IEZ1bmN0aW9uKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZGVkdXBlKGtleSwgb2xkRm4sIG5ld0ZuKSB7XG4gICAgY2hlY2tba2V5XSA9IGtleTtcbiAgICByZXR1cm4gY2hlY2s7XG4gICAgZnVuY3Rpb24gY2hlY2soLi4uYXJncykge1xuICAgICAgICByZXR1cm4gKG9sZEZuW2tleV0gPT09IGtleSA/IG9sZEZuIDogbmV3Rm4pLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihwcm9taXNlLCBjYikge1xuICAgIHJldHVybiBwcm9taXNlLnRoZW4oY2IsIGNiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoYXN5bmNGdW5jdGlvbikge1xuICAgIGxldCBsYXN0UnVuID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICBhZnRlcihsYXN0UnVuLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXN5bmNGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKHJlcywgcmVqKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd3JhcHBlci5hZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGxhc3RSdW4gPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHsgYWZ0ZXIobGFzdFJ1biwgcmVzKTsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gd3JhcHBlcjtcbn1cbiIsICJpbXBvcnQgeyBhcm91bmQgfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWxlRXhwbG9yZXJQbHVnaW4gYXMgRkVQbHVnaW5DbHMsXG4gIEZpbGVFeHBsb3JlclZpZXcgYXMgRkVWaWV3Q2xzLFxuICBGaWxlRXhwbG9yZXJWaWV3LFxuICBGb2xkZXJJdGVtIGFzIEZvbGRlckl0ZW1DbHMsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgVEFic3RyYWN0RmlsZSwgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgZ2V0Q2xpY2tIYW5kbGVyLCBwcmVzc0hhbmRsZXIgfSBmcm9tIFwiLi9jbGljay1oYW5kbGVyXCI7XG5pbXBvcnQgZ2V0RmlsZUV4cGxvcmVySGFuZGxlcnMgZnJvbSBcIi4vZmUtaGFuZGxlclwiO1xuaW1wb3J0IEFMeEZvbGRlck5vdGUgZnJvbSBcIi4vZm4tbWFpblwiO1xuaW1wb3J0IHsgZ2V0Vmlld09mVHlwZSB9IGZyb20gXCIuL21pc2NcIjtcbmltcG9ydCBBZGRMb25nUHJlc3NFdnQsIHsgTG9uZ1ByZXNzRXZlbnQgfSBmcm9tIFwiLi9tb2R1bGVzL2xvbmctcHJlc3NcIjtcblxuY29uc3QgZ2V0Rm9sZGVySXRlbUZyb21FbCA9IChuYXZFbDogSFRNTEVsZW1lbnQsIHZpZXc6IEZFVmlld0NscykgPT4ge1xuICBjb25zdCBmb2xkZXIgPSB2aWV3LmZpbGVzLmdldChuYXZFbCk7XG4gIHJldHVybiBmb2xkZXIgaW5zdGFuY2VvZiBURm9sZGVyXG4gICAgPyAodmlldy5maWxlSXRlbXNbZm9sZGVyLnBhdGhdIGFzIEZvbGRlckl0ZW1DbHMpXG4gICAgOiBudWxsO1xufTtcbmNvbnN0IFJ0ID0gKGV2dDogTW91c2VFdmVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCkgPT4ge1xuICBsZXQgbiA9IGV2dC5yZWxhdGVkVGFyZ2V0O1xuICByZXR1cm4gIShuIGluc3RhbmNlb2YgTm9kZSAmJiB0YXJnZXQuY29udGFpbnMobikpO1xufTtcbi8qKlxuICogcmVzZXQgZXhpc3RpbmcgZmlsZSBleHBsb3JlciB2aWV3c1xuICovXG5jb25zdCByZXNldEZpbGVFeHBsb3JlciA9IGFzeW5jIChwbHVnaW46IEFMeEZvbGRlck5vdGUpID0+IHtcbiAgZm9yIChjb25zdCBsZWFmIG9mIHBsdWdpbi5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcImZpbGUtZXhwbG9yZXJcIikpIHtcbiAgICBsZXQgc3RhdGUgPSBsZWFmLmdldFZpZXdTdGF0ZSgpO1xuICAgIGF3YWl0IGxlYWYuc2V0Vmlld1N0YXRlKHsgdHlwZTogXCJlbXB0eVwiIH0pO1xuICAgIGxlYWYuc2V0Vmlld1N0YXRlKHN0YXRlKTtcbiAgfVxufTtcblxuY29uc3QgUGF0Y2hGaWxlRXhwbG9yZXIgPSAocGx1Z2luOiBBTHhGb2xkZXJOb3RlKSA9PiB7XG4gIGNvbnN0IHsgZ2V0Rm9sZGVyRnJvbU5vdGUgfSA9IHBsdWdpbi5Db3JlQXBpLFxuICAgIGNsaWNrSGFuZGxlciA9IGdldENsaWNrSGFuZGxlcihwbHVnaW4pO1xuXG4gIGxldCBGaWxlRXhwbG9yZXJWaWV3SW5zdDogRkVWaWV3Q2xzIHwgbnVsbCA9IGdldFZpZXdPZlR5cGU8RkVWaWV3Q2xzPihcbiAgICAgIFwiZmlsZS1leHBsb3JlclwiLFxuICAgICAgcGx1Z2luLmFwcCxcbiAgICApLFxuICAgIEZpbGVFeHBsb3JlclBsdWdpbkluc3QgPVxuICAgICAgcGx1Z2luLmFwcC5pbnRlcm5hbFBsdWdpbnMucGx1Z2luc1tcImZpbGUtZXhwbG9yZXJcIl0/Lmluc3RhbmNlO1xuICBpZiAoIUZpbGVFeHBsb3JlclZpZXdJbnN0IHx8ICFGaWxlRXhwbG9yZXJQbHVnaW5JbnN0KSByZXR1cm47XG5cbiAgLy8gZ2V0IGNvbnN0cnVjdG9yc1xuICBjb25zdCBGaWxlRXhwbG9yZXJWaWV3ID0gRmlsZUV4cGxvcmVyVmlld0luc3QuY29uc3RydWN0b3IgYXMgdHlwZW9mIEZFVmlld0NscyxcbiAgICBGaWxlRXhwbG9yZXJQbHVnaW4gPVxuICAgICAgRmlsZUV4cGxvcmVyUGx1Z2luSW5zdC5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgRkVQbHVnaW5DbHMsXG4gICAgRm9sZGVySXRlbSA9IEZpbGVFeHBsb3JlclZpZXdJbnN0LmNyZWF0ZUZvbGRlckRvbShcbiAgICAgIHBsdWdpbi5hcHAudmF1bHQuZ2V0Um9vdCgpLFxuICAgICkuY29uc3RydWN0b3IgYXMgdHlwZW9mIEZvbGRlckl0ZW1DbHM7XG5cbiAgRmlsZUV4cGxvcmVyVmlld0luc3QgPSBudWxsO1xuXG4gIGNvbnN0IHVuaW5zdGFsbGVyczogUmV0dXJuVHlwZTx0eXBlb2YgYXJvdW5kPltdID0gW1xuICAgIGFyb3VuZChGaWxlRXhwbG9yZXJWaWV3LnByb3RvdHlwZSwge1xuICAgICAgbG9hZDogKG5leHQpID0+XG4gICAgICAgIGZ1bmN0aW9uICh0aGlzOiBGRVZpZXdDbHMpIHtcbiAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgICBuZXh0LmNhbGwoc2VsZik7XG4gICAgICAgICAgc2VsZi5mb2xkZXJOb3RlVXRpbHMgPSBnZXRGaWxlRXhwbG9yZXJIYW5kbGVycyhwbHVnaW4sIHNlbGYpO1xuICAgICAgICAgIEFkZExvbmdQcmVzc0V2dChwbHVnaW4sIHNlbGYuZG9tLm5hdkZpbGVDb250YWluZXJFbCk7XG4gICAgICAgICAgc2VsZi5jb250YWluZXJFbC5vbihcbiAgICAgICAgICAgIFwiYXV4Y2xpY2tcIixcbiAgICAgICAgICAgIFwiLm5hdi1mb2xkZXJcIixcbiAgICAgICAgICAgIChldnQ6IE1vdXNlRXZlbnQsIG5hdkVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rm9sZGVySXRlbUZyb21FbChuYXZFbCwgc2VsZik7XG4gICAgICAgICAgICAgIGl0ZW0gJiYgY2xpY2tIYW5kbGVyKGl0ZW0sIGV2dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VsZi5jb250YWluZXJFbC5vbihcbiAgICAgICAgICAgIFwibG9uZy1wcmVzc1wiIGFzIGFueSxcbiAgICAgICAgICAgIFwiLm5hdi1mb2xkZXJcIixcbiAgICAgICAgICAgIChldnQ6IExvbmdQcmVzc0V2ZW50LCBuYXZFbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGdldEZvbGRlckl0ZW1Gcm9tRWwobmF2RWwsIHNlbGYpO1xuICAgICAgICAgICAgICBpdGVtICYmIHByZXNzSGFuZGxlcihpdGVtLCBldnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgb25GaWxlTW91c2VvdmVyOiAobmV4dCkgPT5cbiAgICAgICAgZnVuY3Rpb24gKHRoaXM6IEZpbGVFeHBsb3JlclZpZXcsIGV2dCwgbmF2VGl0bGVFbCkge1xuICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCBldnQsIG5hdlRpdGxlRWwpO1xuICAgICAgICAgIGlmICghUnQoZXZ0LCBuYXZUaXRsZUVsKSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGFmID0gdGhpcy5jdXJyZW50SG92ZXJGaWxlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFhZiB8fFxuICAgICAgICAgICAgLy8gaWYgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHNhbWUgZmlsZSwgZG8gbm90aGluZ1xuICAgICAgICAgICAgKHRoaXMuX0FGTl9IT1ZFUiAmJiB0aGlzLl9BRk5fSE9WRVIgPT09IGFmKSB8fFxuICAgICAgICAgICAgIShhZiBpbnN0YW5jZW9mIFRGb2xkZXIpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG5vdGUgPSBwbHVnaW4uQ29yZUFwaS5nZXRGb2xkZXJOb3RlKGFmKTtcbiAgICAgICAgICBpZiAobm90ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGV2dCxcbiAgICAgICAgICAgICAgc291cmNlOiBcImZpbGUtZXhwbG9yZXJcIixcbiAgICAgICAgICAgICAgaG92ZXJQYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICAgIHRhcmdldEVsOiBuYXZUaXRsZUVsLFxuICAgICAgICAgICAgICBsaW5rdGV4dDogbm90ZS5wYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhpcyBmaWxlIGlzIGhhbmRsZWQgYnkgbW9ua2V5IHBhdGNoXG4gICAgICAgICAgdGhpcy5fQUZOX0hPVkVSID0gYWY7XG4gICAgICAgIH0sXG4gICAgICBvbkZpbGVNb3VzZW91dDogKG5leHQpID0+XG4gICAgICAgIGZ1bmN0aW9uICh0aGlzOiBGaWxlRXhwbG9yZXJWaWV3LCBldnQsIG5hdlRpdGxlRWwpIHtcbiAgICAgICAgICBuZXh0LmNhbGwodGhpcywgZXZ0LCBuYXZUaXRsZUVsKTtcbiAgICAgICAgICBpZiAoIVJ0KGV2dCwgbmF2VGl0bGVFbCkpIHJldHVybjtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fQUZOX0hPVkVSO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIC8vIHBhdGNoIHJldmVhbCBpbiBmb2xkZXIgdG8gYWx0ZXIgZm9sZGVyIG5vdGUgdGFyZ2V0IHRvIGxpbmtlZCBmb2xkZXJcbiAgICBhcm91bmQoRmlsZUV4cGxvcmVyUGx1Z2luLnByb3RvdHlwZSwge1xuICAgICAgcmV2ZWFsSW5Gb2xkZXI6IChuZXh0KSA9PlxuICAgICAgICBmdW5jdGlvbiAodGhpczogRkVQbHVnaW5DbHMsIGZpbGU6IFRBYnN0cmFjdEZpbGUpIHtcbiAgICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIHBsdWdpbi5zZXR0aW5ncy5oaWRlTm90ZUluRXhwbG9yZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRSZXN1bHQgPSBnZXRGb2xkZXJGcm9tTm90ZShmaWxlKTtcbiAgICAgICAgICAgIGlmIChmaW5kUmVzdWx0KSBmaWxlID0gZmluZFJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5leHQuY2FsbCh0aGlzLCBmaWxlKTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBhcm91bmQoRm9sZGVySXRlbS5wcm90b3R5cGUsIHtcbiAgICAgIG9uVGl0bGVFbENsaWNrOiAobmV4dCkgPT5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEZvbGRlckl0ZW1DbHMsIGV2dCkge1xuICAgICAgICAgIC8vIGlmIGZvbGRlciBub3RlIGNsaWNrIG5vdCBzdWNjZXNzLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHRcbiAgICAgICAgICBpZiAoIShhd2FpdCBjbGlja0hhbmRsZXIodGhpcywgZXZ0KSkpIG5leHQuY2FsbCh0aGlzLCBldnQpO1xuICAgICAgICB9LFxuICAgICAgb25TZWxmQ2xpY2s6IChuZXh0KSA9PlxuICAgICAgICBhc3luYyBmdW5jdGlvbiAodGhpczogRm9sZGVySXRlbUNscywgZXZ0KSB7XG4gICAgICAgICAgLy8gaWYgZm9sZGVyIG5vdGUgY2xpY2sgbm90IHN1Y2Nlc3MsXG4gICAgICAgICAgLy8gZmFsbGJhY2sgdG8gZGVmYXVsdFxuICAgICAgICAgIGlmICghKGF3YWl0IGNsaWNrSGFuZGxlcih0aGlzLCBldnQpKSkgbmV4dC5jYWxsKHRoaXMsIGV2dCk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gIF07XG4gIHJlc2V0RmlsZUV4cGxvcmVyKHBsdWdpbik7XG4gIHBsdWdpbi5yZWdpc3RlcigoKSA9PiB7XG4gICAgLy8gdW5pbnN0YWxsIG1vbmtleSBwYXRjaGVzXG4gICAgdW5pbnN0YWxsZXJzLmZvckVhY2goKHJldmVydCkgPT4gcmV2ZXJ0KCkpO1xuICAgIHJlc2V0RmlsZUV4cGxvcmVyKHBsdWdpbik7XG4gIH0pO1xufTtcbmV4cG9ydCBkZWZhdWx0IFBhdGNoRmlsZUV4cGxvcmVyO1xuIiwgImltcG9ydCB7IEZvbGRlckl0ZW0sIFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCB0eXBlIEFMeEZvbGRlck5vdGUgZnJvbSBcIi4vZm4tbWFpblwiO1xuaW1wb3J0IHsgaXNNb2RpZmllciwgZ2V0RmlsZUl0ZW1Jbm5lclRpdGxlRWwgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCB9IGZyb20gXCIuL21vZHVsZXMvbG9uZy1wcmVzc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xpY2tIYW5kbGVyID0gKHBsdWdpbjogQUx4Rm9sZGVyTm90ZSkgPT4ge1xuICBjb25zdCB7IGdldEZvbGRlck5vdGUsIGdldEZvbGRlck5vdGVQYXRoLCBnZXROZXdGb2xkZXJOb3RlIH0gPSBwbHVnaW4uQ29yZUFwaTtcbiAgcmV0dXJuIGFzeW5jIChpdGVtOiBGb2xkZXJJdGVtLCBldnQ6IE1vdXNlRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoXG4gICAgICAhaXRlbSB8fFxuICAgICAgKFBsYXRmb3JtLmlzTW9iaWxlICYmICFwbHVnaW4uc2V0dGluZ3MubW9iaWxlQ2xpY2tUb09wZW4pIHx8XG4gICAgICAvLyBhbGxvdyBmb2xkZXIgc2hpZnQgc2VsZWN0aW9uIHRvIHdvcmtcbiAgICAgIGV2dC5zaGlmdEtleSB8fFxuICAgICAgLy8gdHJpZ2dlcmVkIG9ubHkgd2hlbiBjbGljayBvbiB0aXRsZVxuICAgICAgIShcbiAgICAgICAgZ2V0RmlsZUl0ZW1Jbm5lclRpdGxlRWwoaXRlbSkgPT09IGV2dC50YXJnZXQgfHxcbiAgICAgICAgZ2V0RmlsZUl0ZW1Jbm5lclRpdGxlRWwoaXRlbSkuY29udGFpbnMoZXZ0LnRhcmdldCBhcyBOb2RlKVxuICAgICAgKSB8fFxuICAgICAgLy8gaWdub3JlIGZpbGUgYmVpbmcgcmVuYW1lZFxuICAgICAgaXRlbS5maWxlRXhwbG9yZXIuZmlsZUJlaW5nUmVuYW1lZCA9PT0gaXRlbS5maWxlXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGV2dC50eXBlID09PSBcImF1eGNsaWNrXCIgJiYgZXZ0LmJ1dHRvbiAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gZ2V0IHRoZSBmb2xkZXIgcGF0aFxuICAgIGNvbnN0IGZvbGRlciA9IGl0ZW0uZmlsZTtcbiAgICBjb25zdCBjcmVhdGVOZXcgPVxuICAgICAgKGV2dC50eXBlID09PSBcImNsaWNrXCIgJiZcbiAgICAgICAgaXNNb2RpZmllcihldnQsIHBsdWdpbi5zZXR0aW5ncy5tb2RpZmllckZvck5ld05vdGUpKSB8fFxuICAgICAgKGV2dC50eXBlID09PSBcImF1eGNsaWNrXCIgJiYgZXZ0LmJ1dHRvbiA9PT0gMSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGNoZWNrIGlmIGZvbGRlciBub3RlIGV4aXN0c1xuICAgICAgbGV0IGZvbGRlck5vdGUgPSBnZXRGb2xkZXJOb3RlKGZvbGRlciksXG4gICAgICAgIGZuUGF0aDtcbiAgICAgIGlmIChjcmVhdGVOZXcgJiYgIWZvbGRlck5vdGUgJiYgKGZuUGF0aCA9IGdldEZvbGRlck5vdGVQYXRoKGZvbGRlcikpKSB7XG4gICAgICAgIGZvbGRlck5vdGUgPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNyZWF0ZShcbiAgICAgICAgICBmblBhdGgucGF0aCxcbiAgICAgICAgICBnZXROZXdGb2xkZXJOb3RlKGZvbGRlciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZm9sZGVyTm90ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBzaG93IHRoZSBub3RlXG4gICAgICBhd2FpdCBwbHVnaW4uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQoXG4gICAgICAgIGZvbGRlck5vdGUucGF0aCxcbiAgICAgICAgXCJcIixcbiAgICAgICAgY3JlYXRlTmV3IHx8IGV2dC50eXBlID09PSBcImF1eGNsaWNrXCIsXG4gICAgICAgIHsgYWN0aXZlOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5leHBhbmRGb2xkZXJPbkNsaWNrICYmIGl0ZW0uY29sbGFwc2VkKVxuICAgICAgICBhd2FpdCBpdGVtLnNldENvbGxhcHNlZChmYWxzZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBwcmVzc0hhbmRsZXIgPSAoXG4gIGl0ZW06IEZvbGRlckl0ZW0sXG4gIF9ldnQ6IExvbmdQcmVzc0V2ZW50LFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmICghaXRlbSB8fCBpdGVtLmZpbGVFeHBsb3Jlci5maWxlQmVpbmdSZW5hbWVkID09PSBpdGVtLmZpbGUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZm9sZGVyID0gaXRlbS5maWxlO1xuICBpdGVtLmZpbGVFeHBsb3Jlci5mb2xkZXJOb3RlVXRpbHM/LmZvbGRlckZvY3VzLnRvZ2dsZUZvY3VzRm9sZGVyKGZvbGRlcik7XG4gIHJldHVybiB0cnVlO1xufTtcbiIsICJpbXBvcnQgYXNzZXJ0TmV2ZXIgZnJvbSBcImFzc2VydC1uZXZlclwiO1xuaW1wb3J0IHtcbiAgQUZJdGVtLFxuICBBcHAsXG4gIEZvbGRlckl0ZW0sXG4gIE1vZGlmaWVyLFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVmlldyxcbiAgV29ya3NwYWNlTGVhZixcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyBOb3RpY2UsIFBsYXRmb3JtLCBURm9sZGVyLCBGaWxlSXRlbSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgZGlybmFtZSwgZXh0bmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIGFmSXRlbU1hcmsgPSBBRkl0ZW0gJiB7XG4gIGV2dERvbmU/OiB0cnVlO1xuICBpc0ZvbGRlck5vdGU/OiB0cnVlO1xuICBpc0ZvbGRlcldpdGhOb3RlPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3T2ZUeXBlID0gPFYgZXh0ZW5kcyBWaWV3ID0gVmlldz4oXG4gIHR5cGU6IHN0cmluZyxcbiAgYXBwOiBBcHAsXG4pOiBWIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHZjID0gYXBwLnZpZXdSZWdpc3RyeS5nZXRWaWV3Q3JlYXRvckJ5VHlwZSh0eXBlKTtcbiAgcmV0dXJuIHZjID8gKHZjKG5ldyAoV29ya3NwYWNlTGVhZiBhcyBhbnkpKGFwcCkpIGFzIFYpIDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0ZvbGRlciA9IChpdGVtOiBBRkl0ZW0pOiBpdGVtIGlzIEZvbGRlckl0ZW0gPT5cbiAgKGl0ZW0gYXMgRm9sZGVySXRlbSkuZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXI7XG5cbmV4cG9ydCBjb25zdCBpc01kID0gKGZpbGU6IFRGaWxlIHwgc3RyaW5nKSA9PlxuICB0eXBlb2YgZmlsZSA9PT0gXCJzdHJpbmdcIiA/IGV4dG5hbWUoZmlsZSkgPT09IFwiLm1kXCIgOiBmaWxlLmV4dGVuc2lvbiA9PT0gXCJtZFwiO1xuXG5leHBvcnQgZW51bSBOb3RlTG9jIHtcbiAgSW5kZXgsXG4gIEluc2lkZSxcbiAgT3V0c2lkZSxcbn1cblxuZXhwb3J0IGNvbnN0IGlzTW9kaWZpZXIgPSAoZXZ0OiBNb3VzZUV2ZW50LCBwcmVmOiBNb2RpZmllcik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IGFsdEtleSwgbWV0YUtleSwgY3RybEtleSwgc2hpZnRLZXkgfSA9IGV2dDtcbiAgc3dpdGNoIChwcmVmKSB7XG4gICAgY2FzZSBcIk1vZFwiOlxuICAgICAgcmV0dXJuIFBsYXRmb3JtLmlzTWFjT1MgPyBtZXRhS2V5IDogY3RybEtleTtcbiAgICBjYXNlIFwiQ3RybFwiOlxuICAgICAgcmV0dXJuIGN0cmxLZXk7XG4gICAgY2FzZSBcIk1ldGFcIjpcbiAgICAgIHJldHVybiBtZXRhS2V5O1xuICAgIGNhc2UgXCJTaGlmdFwiOlxuICAgICAgcmV0dXJuIHNoaWZ0S2V5O1xuICAgIGNhc2UgXCJBbHRcIjpcbiAgICAgIHJldHVybiBhbHRLZXk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKHByZWYpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSBuZXdOYW1lIGluY2x1ZGUgZXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZW5hbWVkUGF0aCA9IChhZjogVEFic3RyYWN0RmlsZSwgbmV3TmFtZTogc3RyaW5nKSA9PlxuICBqb2luKGdldFBhcmVudFBhdGgoYWYucGF0aCksIG5ld05hbWUpO1xuXG5leHBvcnQgY29uc3QgZ2V0UGFyZW50UGF0aCA9IChzcmM6IHN0cmluZykgPT4ge1xuICBjb25zdCBwYXRoID0gZGlybmFtZShzcmMpO1xuICBpZiAocGF0aCA9PT0gXCIuXCIpIHJldHVybiBcIi9cIjtcbiAgZWxzZSByZXR1cm4gcGF0aDtcbn07XG5cbmV4cG9ydCBjbGFzcyBDbGlja05vdGljZSBleHRlbmRzIE5vdGljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8ICgoZGVzYzogRG9jdW1lbnRGcmFnbWVudCkgPT4gdm9pZCksXG4gICAgYWN0aW9uOiAoZXZ0OiBNb3VzZUV2ZW50KSA9PiBhbnksXG4gICAgdGltZW91dD86IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogXCJcIiwgdGltZW91dCk7XG4gICAgdGhpcy5ub3RpY2VFbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYWN0aW9uKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5ub3RpY2VFbC5lbXB0eSgpO1xuICAgICAgbGV0IGZyYWcgPSBuZXcgRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgbWVzc2FnZShmcmFnKTtcbiAgICAgIHRoaXMubm90aWNlRWwuYXBwZW5kKGZyYWcpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZUl0ZW1UaXRsZUVsKGZpbGVJdGVtOiBGaWxlSXRlbSk6IEhUTUxFbGVtZW50IHtcbiAgcmV0dXJuIGZpbGVJdGVtLnRpdGxlRWwgPz8gZmlsZUl0ZW0uc2VsZkVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZUl0ZW1Jbm5lclRpdGxlRWwoZmlsZUl0ZW06IEZpbGVJdGVtKTogSFRNTEVsZW1lbnQge1xuICByZXR1cm4gZmlsZUl0ZW0udGl0bGVJbm5lckVsID8/IGZpbGVJdGVtLmlubmVyRWw7XG59XG4iLCAiaW1wb3J0IHtcbiAgRmlsZUV4cGxvcmVyVmlldyxcbiAgTWFya2Rvd25WaWV3LFxuICBURm9sZGVyLFxuICBXb3Jrc3BhY2VMZWFmLFxufSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHR5cGUgQUx4Rm9sZGVyTm90ZSBmcm9tIFwiLi4vZm4tbWFpblwiO1xuaW1wb3J0IEZFSGFuZGxlcl9CYXNlIGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IGdldEZpbGVJdGVtVGl0bGVFbCB9IGZyb20gJy4uL21pc2MnO1xuXG5jb25zdCBpc0FjdGl2ZUNsYXNzID0gXCJpcy1hY3RpdmVcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aXZlRm9sZGVyIGV4dGVuZHMgRkVIYW5kbGVyX0Jhc2Uge1xuICBxdWV1ZXMgPSB7fTtcbiAgY29uc3RydWN0b3IocGx1Z2luOiBBTHhGb2xkZXJOb3RlLCBmaWxlRXhwbG9yZXI6IEZpbGVFeHBsb3JlclZpZXcpIHtcbiAgICBzdXBlcihwbHVnaW4sIGZpbGVFeHBsb3Jlcik7XG4gICAgY29uc3QgeyB3b3Jrc3BhY2UgfSA9IHBsdWdpbi5hcHA7XG4gICAgdGhpcy5oYW5kbGVBY3RpdmVMZWFmQ2hhbmdlKHdvcmtzcGFjZS5hY3RpdmVMZWFmKTtcbiAgICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICAgIHdvcmtzcGFjZS5vbihcbiAgICAgICAgXCJhY3RpdmUtbGVhZi1jaGFuZ2VcIixcbiAgICAgICAgdGhpcy5oYW5kbGVBY3RpdmVMZWFmQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXIoKCkgPT4gKHRoaXMuYWN0aXZlRm9sZGVyID0gbnVsbCkpO1xuICB9XG4gIHByaXZhdGUgX2FjdGl2ZUZvbGRlcjogVEZvbGRlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgc2V0IGFjdGl2ZUZvbGRlcihmb2xkZXI6IFRGb2xkZXIgfCBudWxsKSB7XG4gICAgY29uc3QgZ2V0VGl0bGVFbCA9IChmb2xkZXI6IFRGb2xkZXIgfCBudWxsKSA9PlxuICAgICAgZm9sZGVyICYmIHRoaXMuZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1tmb2xkZXIucGF0aF0gPyBnZXRGaWxlSXRlbVRpdGxlRWwodGhpcy5maWxlRXhwbG9yZXIuZmlsZUl0ZW1zW2ZvbGRlci5wYXRoXSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgIGdldFRpdGxlRWwodGhpcy5fYWN0aXZlRm9sZGVyKT8ucmVtb3ZlQ2xhc3MoaXNBY3RpdmVDbGFzcyk7XG4gICAgfSBlbHNlIGlmIChmb2xkZXIgIT09IHRoaXMuX2FjdGl2ZUZvbGRlcikge1xuICAgICAgZ2V0VGl0bGVFbCh0aGlzLl9hY3RpdmVGb2xkZXIpPy5yZW1vdmVDbGFzcyhpc0FjdGl2ZUNsYXNzKTtcbiAgICAgIGdldFRpdGxlRWwoZm9sZGVyKT8uYWRkQ2xhc3MoaXNBY3RpdmVDbGFzcyk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUZvbGRlciA9IGZvbGRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZvbGRlcigpOiBURm9sZGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZvbGRlcjtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUFjdGl2ZUxlYWZDaGFuZ2UobGVhZjogV29ya3NwYWNlTGVhZiB8IG51bGwpIHtcbiAgICBsZXQgZm9sZGVyO1xuICAgIGlmIChcbiAgICAgIGxlYWYgJiZcbiAgICAgIGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJlxuICAgICAgKGZvbGRlciA9IHRoaXMuZm5jQXBpLmdldEZvbGRlckZyb21Ob3RlKGxlYWYudmlldy5maWxlKSlcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aXZlRm9sZGVyID0gZm9sZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZUZvbGRlciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IFwiLi9maWxlLWV4cGxvcmVyLmxlc3NcIjtcblxuaW1wb3J0IHsgQUZJdGVtLCBkZWJvdW5jZSwgRmlsZUV4cGxvcmVyVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgQUx4Rm9sZGVyTm90ZSBmcm9tIFwiLi4vZm4tbWFpblwiO1xuaW1wb3J0IHsgYWZJdGVtTWFyayB9IGZyb20gXCIuLi9taXNjXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIEZFSGFuZGxlcl9CYXNlIHtcbiAgbG9uZ1ByZXNzUmVnaXN0ZXJlZCA9IG5ldyBXZWFrU2V0PEZpbGVFeHBsb3JlclZpZXc+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwbHVnaW46IEFMeEZvbGRlck5vdGUsXG4gICAgcHVibGljIGZpbGVFeHBsb3JlcjogRmlsZUV4cGxvcmVyVmlldyxcbiAgKSB7fVxuICBnZXQgZm5jQXBpKCkge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5Db3JlQXBpO1xuICB9XG4gIGdldCBhcHAoKSB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuICBnZXQgZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUV4cGxvcmVyLmZpbGVzO1xuICB9XG4gIGdldEFmSXRlbSA9IChwYXRoOiBzdHJpbmcpOiBhZkl0ZW1NYXJrIHwgbnVsbCA9PlxuICAgIHRoaXMuZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1twYXRoXSA/PyBudWxsO1xuICBpdGVyYXRlSXRlbXMgPSAoY2FsbGJhY2s6IChpdGVtOiBBRkl0ZW0pID0+IGFueSk6IHZvaWQgPT5cbiAgICBPYmplY3QudmFsdWVzKHRoaXMuZmlsZUV4cGxvcmVyLmZpbGVJdGVtcykuZm9yRWFjaChjYWxsYmFjayk7XG5cbiAgYWJzdHJhY3QgcXVldWVzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIGFjdGlvbjogKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgICBxdWV1ZTogU2V0PHN0cmluZz4gfCBNYXA8c3RyaW5nLCBhbnlbXT47XG4gICAgfVxuICA+O1xuICBwcml2YXRlIGRlYm91bmNlcnMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCAoKSA9PiBhbnk+O1xuICBwcml2YXRlIF9leGVjUXVldWUocXVldWVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgcXVldWUgfSA9IHRoaXMucXVldWVzW3F1ZXVlTmFtZV07XG4gICAgaWYgKHF1ZXVlLnNpemUgPD0gMCkgcmV0dXJuO1xuICAgIGlmIChxdWV1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgcXVldWUuZm9yRWFjaCgoaWQpID0+IGFjdGlvbihpZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZS5mb3JFYWNoKChhcmdzLCBpZCkgPT4gYWN0aW9uKGlkLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHF1ZXVlLmNsZWFyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGV4ZWNRdWV1ZShxdWV1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5xdWV1ZXMpLmluY2x1ZGVzKHF1ZXVlTmFtZSkpIHJldHVybjtcbiAgICBjb25zdCBkZWJvdW5jZXIgPVxuICAgICAgdGhpcy5kZWJvdW5jZXJzW3F1ZXVlTmFtZV0gPz9cbiAgICAgICh0aGlzLmRlYm91bmNlcnNbcXVldWVOYW1lXSA9IGRlYm91bmNlKFxuICAgICAgICAoKSA9PiB0aGlzLl9leGVjUXVldWUocXVldWVOYW1lKSxcbiAgICAgICAgMjAwLFxuICAgICAgICB0cnVlLFxuICAgICAgKSk7XG4gICAgZGVib3VuY2VyKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgXCIuL2ZvY3VzLmxlc3NcIjtcblxuaW1wb3J0IHsgRmlsZUV4cGxvcmVyVmlldywgRm9sZGVySXRlbSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgdHlwZSBBTHhGb2xkZXJOb3RlIGZyb20gXCIuLi9mbi1tYWluXCI7XG5pbXBvcnQgRkVIYW5kbGVyX0Jhc2UgZnJvbSBcIi4vYmFzZVwiO1xuXG5jb25zdCBmb2N1c2VkRm9sZGVyQ2xzID0gXCJhbHgtZm9jdXNlZC1mb2xkZXJcIjtcbmNvbnN0IGZvY3VzTW9kZUNscyA9IFwiYWx4LWZvbGRlci1mb2N1c1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb2xkZXJGb2N1cyBleHRlbmRzIEZFSGFuZGxlcl9CYXNlIHtcbiAgcXVldWVzID0ge307XG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQUx4Rm9sZGVyTm90ZSwgZmlsZUV4cGxvcmVyOiBGaWxlRXhwbG9yZXJWaWV3KSB7XG4gICAgc3VwZXIocGx1Z2luLCBmaWxlRXhwbG9yZXIpO1xuICAgIGNvbnN0IHsgd29ya3NwYWNlIH0gPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyKFxuICAgICAgKCkgPT4gdGhpcy5mb2N1c2VkRm9sZGVyICYmIHRoaXMudG9nZ2xlRm9jdXNGb2xkZXIobnVsbCksXG4gICAgKTtcblxuICAgIFtcbiAgICAgIHdvcmtzcGFjZS5vbihcImZpbGUtbWVudVwiLCAobWVudSwgYWYpID0+IHtcbiAgICAgICAgaWYgKCEoYWYgaW5zdGFuY2VvZiBURm9sZGVyKSB8fCBhZi5pc1Jvb3QoKSkgcmV0dXJuO1xuICAgICAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbVxuICAgICAgICAgICAgLnNldFRpdGxlKFwiVG9nZ2xlIEZvY3VzXCIpXG4gICAgICAgICAgICAuc2V0SWNvbihcImNyb3NzZWQtc3RhclwiKVxuICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4gdGhpcy50b2dnbGVGb2N1c0ZvbGRlcihhZikpLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgXS5mb3JFYWNoKHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQuYmluZCh0aGlzLnBsdWdpbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZm9jdXNlZEZvbGRlcjoge1xuICAgIGZvbGRlcjogRm9sZGVySXRlbTtcbiAgICBjb2xsYXBzZWRDYWNoZTogYm9vbGVhbjtcbiAgfSB8IG51bGwgPSBudWxsO1xuICBnZXQgZm9jdXNlZEZvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZEZvbGRlcj8uZm9sZGVyID8/IG51bGw7XG4gIH1cbiAgc2V0IGZvY3VzZWRGb2xkZXIoaXRlbTogRm9sZGVySXRlbSB8IG51bGwpIHtcbiAgICAvLyByZXN0b3JlIHByZXZpb3VzIGZvbGRlciBjb2xsYXBzZSBzdGF0ZVxuICAgIGlmICh0aGlzLl9mb2N1c2VkRm9sZGVyKSB7XG4gICAgICBjb25zdCB7IGZvbGRlciwgY29sbGFwc2VkQ2FjaGUgfSA9IHRoaXMuX2ZvY3VzZWRGb2xkZXI7XG4gICAgICBpZiAoZm9sZGVyLmNvbGxhcHNlZCAhPT0gY29sbGFwc2VkQ2FjaGUpXG4gICAgICAgIGZvbGRlci5zZXRDb2xsYXBzZWQoY29sbGFwc2VkQ2FjaGUpO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c2VkRm9sZGVyID0gaXRlbVxuICAgICAgPyB7IGZvbGRlcjogaXRlbSwgY29sbGFwc2VkQ2FjaGU6IGl0ZW0uY29sbGFwc2VkIH1cbiAgICAgIDogbnVsbDtcbiAgICAvLyB1bmZvbGQgZm9sZGVyIGlmIGl0J3MgY29sbGFwc2VkXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5jb2xsYXBzZWQpIHtcbiAgICAgIGl0ZW0uc2V0Q29sbGFwc2VkKGZhbHNlKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucGx1Z2luLmFwcC5uZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZmlsZUV4cGxvcmVyLmRvbS5pbmZpbml0eVNjcm9sbC5jb21wdXRlU3luYygpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZmlsZUV4cGxvcmVyLmRvbS5pbmZpbml0eVNjcm9sbC5zY3JvbGxJbnRvVmlldyhpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmZpbGVFeHBsb3Jlci5kb20ubmF2RmlsZUNvbnRhaW5lckVsLnRvZ2dsZUNsYXNzKGZvY3VzTW9kZUNscywgISFpdGVtKTtcbiAgfVxuICB0b2dnbGVGb2N1c0ZvbGRlcihmb2xkZXI6IFRGb2xkZXIgfCBudWxsKSB7XG4gICAgY29uc3QgZm9sZGVySXRlbSA9IGZvbGRlclxuICAgICAgPyAodGhpcy5nZXRBZkl0ZW0oZm9sZGVyLnBhdGgpIGFzIEZvbGRlckl0ZW0gfCBudWxsKVxuICAgICAgOiBudWxsO1xuICAgIGlmICh0aGlzLmZvY3VzZWRGb2xkZXIpIHtcbiAgICAgIHRoaXMuX2ZvY3VzRm9sZGVyKHRoaXMuZm9jdXNlZEZvbGRlciwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGlmIGdpdmVuIHNhbWUgZm9sZGVyIGFzIGN1cnJlbnQgY2FjaGVkLCB0b2dnbGUgaXQgb2ZmXG4gICAgaWYgKGZvbGRlckl0ZW0gJiYgZm9sZGVySXRlbS5maWxlLnBhdGggPT09IHRoaXMuZm9jdXNlZEZvbGRlcj8uZmlsZS5wYXRoKSB7XG4gICAgICB0aGlzLmZvY3VzZWRGb2xkZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb2xkZXJJdGVtICYmIHRoaXMuX2ZvY3VzRm9sZGVyKGZvbGRlckl0ZW0sIGZhbHNlKTtcbiAgICAgIHRoaXMuZm9jdXNlZEZvbGRlciA9IGZvbGRlckl0ZW07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2ZvY3VzRm9sZGVyKGZvbGRlcjogRm9sZGVySXRlbSwgcmV2ZXJ0ID0gZmFsc2UpIHtcbiAgICBpZiAoZm9sZGVyLmZpbGUuaXNSb290KCkpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmb2N1cyBvbiByb290IGRpclwiKTtcbiAgICBmb2xkZXIuZWwudG9nZ2xlQ2xhc3MoZm9jdXNlZEZvbGRlckNscywgIXJldmVydCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgXCIuL2ZvbGRlci1pY29uLmxlc3NcIjtcblxuaW1wb3J0IHtcbiAgQUZJdGVtLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgRmlsZUV4cGxvcmVyVmlldyxcbiAgRm9sZGVySXRlbSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXIsXG59IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB0eXBlIEFMeEZvbGRlck5vdGUgZnJvbSBcIi4uL2ZuLW1haW5cIjtcbmltcG9ydCB7IGFmSXRlbU1hcmssIGlzRm9sZGVyIH0gZnJvbSBcIi4uL21pc2NcIjtcbmltcG9ydCBGRUhhbmRsZXJfQmFzZSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjb25zdCBmb2xkZXJJY29uTWFyayA9IFwiYWx4LWZvbGRlci1pY29uc1wiO1xuXG5jb25zdCBmb2xkZXJOb3RlQ2xhc3MgPSBcImFseC1mb2xkZXItbm90ZVwiO1xuY29uc3QgZm9sZGVyQ2xhc3MgPSBcImFseC1mb2xkZXItd2l0aC1ub3RlXCI7XG5jb25zdCBlbXB0eUZvbGRlckNsYXNzID0gXCJhbHgtZW1wdHktZm9sZGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvbGRlck1hcmsgZXh0ZW5kcyBGRUhhbmRsZXJfQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQUx4Rm9sZGVyTm90ZSwgZmlsZUV4cGxvcmVyOiBGaWxlRXhwbG9yZXJWaWV3KSB7XG4gICAgc3VwZXIocGx1Z2luLCBmaWxlRXhwbG9yZXIpO1xuICAgIHRoaXMuaW5pdEZvbGRlck1hcmsoKTtcbiAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVySWNvbikge1xuICAgICAgdGhpcy5pbml0Rm9sZGVySWNvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZUNvbGxhcHNlSW5kaWNhdG9yKSB7XG4gICAgICB0aGlzLmluaXRIaWRlQ29sbGFwc2VJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cbiAgcXVldWVzID0ge1xuICAgIG1hcms6IHtcbiAgICAgIHF1ZXVlOiBuZXcgTWFwPHN0cmluZywgW3JldmVydDogYm9vbGVhbl0+KCksXG4gICAgICBhY3Rpb246IChwYXRoOiBzdHJpbmcsIHJldmVydDogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRBZkl0ZW0ocGF0aCk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIm5vIGFmaXRlbSBmb3VuZCBmb3IgcGF0aCAlcywgZXNjYXBpbmcuLi5cIiwgcGF0aCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0ZvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGlmIChyZXZlcnQgPT09ICEhaXRlbS5pc0ZvbGRlcldpdGhOb3RlKSB7XG4gICAgICAgICAgICBpdGVtLmVsLnRvZ2dsZUNsYXNzKGZvbGRlckNsYXNzLCAhcmV2ZXJ0KTtcbiAgICAgICAgICAgIGl0ZW0uaXNGb2xkZXJXaXRoTm90ZSA9IHJldmVydCA/IHVuZGVmaW5lZCA6IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlkZUNvbGxhcHNlSW5kaWNhdG9yKVxuICAgICAgICAgICAgICBpdGVtLmVsLnRvZ2dsZUNsYXNzKFxuICAgICAgICAgICAgICAgIGVtcHR5Rm9sZGVyQ2xhc3MsXG4gICAgICAgICAgICAgICAgcmV2ZXJ0ID8gZmFsc2UgOiBpdGVtLmZpbGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl91cGRhdGVJY29uKHBhdGgsIHJldmVydCwgaXRlbSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmV2ZXJ0ID09PSAhIWl0ZW0uaXNGb2xkZXJOb3RlKSB7XG4gICAgICAgICAgaXRlbS5lbC50b2dnbGVDbGFzcyhmb2xkZXJOb3RlQ2xhc3MsICFyZXZlcnQpO1xuICAgICAgICAgIGl0ZW0uaXNGb2xkZXJOb3RlID0gcmV2ZXJ0ID8gdW5kZWZpbmVkIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIGNoYW5nZWRGb2xkZXI6IHtcbiAgICAgIHF1ZXVlOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGFjdGlvbjogKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgbm90ZSA9IHRoaXMuZm5jQXBpLmdldEZvbGRlck5vdGUocGF0aCk7XG4gICAgICAgIGlmIChub3RlKSB7XG4gICAgICAgICAgKHRoaXMuZ2V0QWZJdGVtKHBhdGgpIGFzIEZvbGRlckl0ZW0pPy5lbC50b2dnbGVDbGFzcyhcbiAgICAgICAgICAgIGVtcHR5Rm9sZGVyQ2xhc3MsXG4gICAgICAgICAgICBub3RlLnBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBwcml2YXRlIGluaXRGb2xkZXJNYXJrKCkge1xuICAgIGNvbnN0IHsgdmF1bHQsIG1ldGFkYXRhQ2FjaGUgfSA9IHRoaXMuYXBwO1xuICAgIHRoaXMubWFya0FsbCgpO1xuICAgIC8vI3JlZ2lvbiBmb2xkZXIgbm90ZSBldmVudHMgc2V0dXBcbiAgICBbXG4gICAgICB2YXVsdC5vbihcImZvbGRlci1ub3RlOmNyZWF0ZVwiLCAobm90ZTogVEZpbGUsIGZvbGRlcjogVEZvbGRlcikgPT4ge1xuICAgICAgICB0aGlzLnNldE1hcmsobm90ZSk7XG4gICAgICAgIHRoaXMuc2V0TWFyayhmb2xkZXIpO1xuICAgICAgfSksXG4gICAgICB2YXVsdC5vbihcImZvbGRlci1ub3RlOmRlbGV0ZVwiLCAobm90ZTogVEZpbGUsIGZvbGRlcjogVEZvbGRlcikgPT4ge1xuICAgICAgICB0aGlzLnNldE1hcmsobm90ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0TWFyayhmb2xkZXIsIHRydWUpO1xuICAgICAgfSksXG4gICAgICB2YXVsdC5vbihcImZvbGRlci1ub3RlOnJlbmFtZVwiLCAoKSA9PiB7XG4gICAgICAgIC8vIGZlLWl0ZW0gaW4gZG9tIHdpbGwgYmUgcmV1c2VkLCBkbyBub3RoaW5nIGZvciBub3dcbiAgICAgIH0pLFxuICAgICAgdmF1bHQub24oXCJmb2xkZXItbm90ZTpjZmctY2hhbmdlZFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMubWFya0FsbCh0cnVlKTtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5tYXJrQWxsLCAyMDApO1xuICAgICAgfSksXG4gICAgICBtZXRhZGF0YUNhY2hlLm9uKFwiY2hhbmdlZFwiLCAoZmlsZSkgPT4ge1xuICAgICAgICBsZXQgZm9sZGVyO1xuICAgICAgICBpZiAoKGZvbGRlciA9IHRoaXMuZm5jQXBpLmdldEZvbGRlckZyb21Ob3RlKGZpbGUpKSkge1xuICAgICAgICAgIHRoaXMuc2V0TWFyayhmb2xkZXIpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICBdLmZvckVhY2godGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudC5iaW5kKHRoaXMucGx1Z2luKSk7XG4gIH1cbiAgLy8jcmVnaW9uIHNldCBjbGFzcyBtYXJrIGZvciBmb2xkZXIgbm90ZXMgYW5kIGZvbGRlcnNcbiAgcHVibGljIHNldE1hcmsgPSAoXG4gICAgdGFyZ2V0OiBBRkl0ZW0gfCBUQWJzdHJhY3RGaWxlIHwgc3RyaW5nLFxuICAgIHJldmVydCA9IGZhbHNlLFxuICApID0+IHtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgcXVldWUgfSA9IHRoaXMucXVldWVzLm1hcms7XG4gICAgbGV0IHBhdGg6IHN0cmluZztcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVEFic3RyYWN0RmlsZSkge1xuICAgICAgcGF0aCA9IHRhcmdldC5wYXRoO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcGF0aCA9IHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IHRhcmdldC5maWxlLnBhdGg7XG4gICAgfVxuICAgIHF1ZXVlLnNldChwYXRoLCBbcmV2ZXJ0XSk7XG4gICAgdGhpcy5leGVjUXVldWUoXCJtYXJrXCIpO1xuICB9O1xuICBwdWJsaWMgbWFya0FsbCA9IChyZXZlcnQgPSBmYWxzZSkgPT4ge1xuICAgIHRoaXMuaXRlcmF0ZUl0ZW1zKChpdGVtOiBBRkl0ZW0pID0+IHtcbiAgICAgIGlmIChpc0ZvbGRlcihpdGVtKSAmJiAhcmV2ZXJ0KSB7XG4gICAgICAgIHRoaXMubWFya0ZvbGRlck5vdGUoaXRlbS5maWxlKTtcbiAgICAgIH0gZWxzZSBpZiAocmV2ZXJ0KSB7XG4gICAgICAgIHRoaXMuc2V0TWFyayhpdGVtLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgbWFya0ZvbGRlck5vdGUgPSAoYWY6IFRBYnN0cmFjdEZpbGUpOiBib29sZWFuID0+IHtcbiAgICBpZiAoYWYgaW5zdGFuY2VvZiBURm9sZGVyICYmIGFmLmlzUm9vdCgpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgeyBnZXRGb2xkZXJOb3RlLCBnZXRGb2xkZXJGcm9tTm90ZSB9ID0gdGhpcy5mbmNBcGk7XG5cbiAgICBsZXQgZm91bmQ6IFRBYnN0cmFjdEZpbGUgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoYWYgaW5zdGFuY2VvZiBURmlsZSkgZm91bmQgPSBnZXRGb2xkZXJGcm9tTm90ZShhZik7XG4gICAgZWxzZSBpZiAoYWYgaW5zdGFuY2VvZiBURm9sZGVyKSBmb3VuZCA9IGdldEZvbGRlck5vdGUoYWYpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aGlzLnNldE1hcmsoZm91bmQpO1xuICAgICAgdGhpcy5zZXRNYXJrKGFmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRNYXJrKGFmLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuICEhZm91bmQ7XG4gIH07XG4gIC8vICNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIGZvbGRlciBpY29uIHNldHVwXG4gIHByaXZhdGUgaW5pdEZvbGRlckljb24oKSB7XG4gICAgZG9jdW1lbnQuYm9keS50b2dnbGVDbGFzcyhmb2xkZXJJY29uTWFyaywgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVySWNvbik7XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gdGhpcy5hcHA7XG4gICAgY29uc3QgdXBkYXRlSWNvbiA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmZvbGRlcnNXaXRoSWNvbikge1xuICAgICAgICB0aGlzLnNldE1hcmsocGF0aCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBbXG4gICAgICB2YXVsdC5vbihcImljb25zYzppbml0aWFsaXplZFwiLCB1cGRhdGVJY29uKSxcbiAgICAgIHZhdWx0Lm9uKFwiaWNvbnNjOmNoYW5nZWRcIiwgdXBkYXRlSWNvbiksXG4gICAgXS5mb3JFYWNoKHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQuYmluZCh0aGlzLnBsdWdpbikpO1xuICB9XG4gIGZvbGRlcnNXaXRoSWNvbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF91cGRhdGVJY29uKHBhdGg6IHN0cmluZywgcmV2ZXJ0OiBib29sZWFuLCBpdGVtOiBhZkl0ZW1NYXJrKSB7XG4gICAgY29uc3QgYXBpID0gdGhpcy5wbHVnaW4uSWNvblNDQVBJO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICBsZXQgZm9sZGVyTm90ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIG1ldGFkYXRhOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXZlcnRJY29uID0gKCkgPT4ge1xuICAgICAgZGVsZXRlIGl0ZW0uZWwuZGF0YXNldC5pY29uO1xuICAgICAgZGVsZXRlIGl0ZW0uZWwuZGF0YXNldFtcImljb24tdHlwZVwiXTtcbiAgICAgIHRoaXMuZm9sZGVyc1dpdGhJY29uLmRlbGV0ZShwYXRoKTtcbiAgICAgIGl0ZW0uZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCItLWFseC1mb2xkZXItaWNvbi10eHRcIik7XG4gICAgICBpdGVtLmVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KFwiLS1hbHgtZm9sZGVyLWljb24tdXJsXCIpO1xuICAgIH07XG4gICAgaWYgKHJldmVydCkge1xuICAgICAgcmV2ZXJ0SWNvbigpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAoZm9sZGVyTm90ZVBhdGggPSB0aGlzLmZuY0FwaS5nZXRGb2xkZXJOb3RlUGF0aChwYXRoKT8ucGF0aCkgJiZcbiAgICAgIChtZXRhZGF0YSA9IHRoaXMucGx1Z2luLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZvbGRlck5vdGVQYXRoKSlcbiAgICApIHtcbiAgICAgIGxldCBpY29uSWQgPSBtZXRhZGF0YS5mcm9udG1hdHRlcj8uaWNvbixcbiAgICAgICAgaWNvbjtcbiAgICAgIGlmIChcbiAgICAgICAgaWNvbklkICYmXG4gICAgICAgIHR5cGVvZiBpY29uSWQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgKGljb24gPSBhcGkuZ2V0SWNvbihpY29uSWQsIHRydWUpKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZm9sZGVyc1dpdGhJY29uLmFkZChwYXRoKTtcbiAgICAgICAgaXRlbS5lbC5kYXRhc2V0Lmljb24gPSBpY29uSWQucmVwbGFjZSgvXjp8OiQvZywgXCJcIik7XG4gICAgICAgIGlmICghYXBpLmlzRW1vamkoaWNvbklkKSkge1xuICAgICAgICAgIGl0ZW0uZWwuZGF0YXNldC5pY29uVHlwZSA9IFwic3ZnXCI7XG4gICAgICAgICAgaXRlbS5lbC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tYWx4LWZvbGRlci1pY29uLXVybFwiLCBgdXJsKFwiJHtpY29ufVwiKWApO1xuICAgICAgICAgIGl0ZW0uZWwuc3R5bGUuc2V0UHJvcGVydHkoXCItLWFseC1mb2xkZXItaWNvbi10eHRcIiwgJ1wiICBcIicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uZWwuZGF0YXNldC5pY29uVHlwZSA9IFwiZW1vamlcIjtcbiAgICAgICAgICBpdGVtLmVsLnN0eWxlLnNldFByb3BlcnR5KFwiLS1hbHgtZm9sZGVyLWljb24tdXJsXCIsICdcIlwiJyk7XG4gICAgICAgICAgaXRlbS5lbC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tYWx4LWZvbGRlci1pY29uLXR4dFwiLCBgXCIke2ljb259XCJgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLmVsLmRhdGFzZXQuaWNvbikge1xuICAgICAgICByZXZlcnRJY29uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxuICAvLyNyZWdpb24gc2V0IGhpZGUgY29sbGFwc2UgaW5kaWNhdG9yXG4gIHByaXZhdGUgaW5pdEhpZGVDb2xsYXBzZUluZGljYXRvcigpIHtcbiAgICBpZiAoIXRoaXMucGx1Z2luLnNldHRpbmdzLmhpZGVDb2xsYXBzZUluZGljYXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHRoaXMuYXBwO1xuICAgIFtcbiAgICAgIHZhdWx0Lm9uKFwiY3JlYXRlXCIsIChmaWxlKSA9PiB0aGlzLnNldENoYW5nZWRGb2xkZXIoZmlsZS5wYXJlbnQucGF0aCkpLFxuICAgICAgdmF1bHQub24oXCJkZWxldGVcIiwgKGZpbGUpID0+IHtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRpcm5hbWUoZmlsZS5wYXRoKTtcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2VkRm9sZGVyKHBhcmVudCA9PT0gXCIuXCIgPyBcIi9cIiA6IHBhcmVudCk7XG4gICAgICB9KSxcbiAgICAgIHZhdWx0Lm9uKFwicmVuYW1lXCIsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Q2hhbmdlZEZvbGRlcihmaWxlLnBhcmVudC5wYXRoKTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRpcm5hbWUob2xkUGF0aCk7XG4gICAgICAgIHRoaXMuc2V0Q2hhbmdlZEZvbGRlcihwYXJlbnQgPT09IFwiLlwiID8gXCIvXCIgOiBwYXJlbnQpO1xuICAgICAgfSksXG4gICAgXS5mb3JFYWNoKHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQuYmluZCh0aGlzLnBsdWdpbikpO1xuICB9XG5cbiAgc2V0Q2hhbmdlZEZvbGRlciA9IChmb2xkZXJQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWZvbGRlclBhdGggfHwgZm9sZGVyUGF0aCA9PT0gXCIvXCIpIHJldHVybjtcbiAgICB0aGlzLnF1ZXVlcy5jaGFuZ2VkRm9sZGVyLnF1ZXVlLmFkZChmb2xkZXJQYXRoKTtcbiAgICB0aGlzLmV4ZWNRdWV1ZShcImNoYW5nZWRGb2xkZXJcIik7XG4gIH07XG4gIC8vI2VuZHJlZ2lvblxufVxuIiwgImltcG9ydCB0eXBlIHsgRmlsZUV4cGxvcmVyVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgdHlwZSBBTHhGb2xkZXJOb3RlIGZyb20gXCIuLi9mbi1tYWluXCI7XG5pbXBvcnQgQWN0aXZlRm9sZGVyIGZyb20gXCIuL2FjdGl2ZS1mb2xkZXJcIjtcbmltcG9ydCBGb2xkZXJGb2N1cyBmcm9tIFwiLi9mb2xkZXItZm9jdXNcIjtcbmltcG9ydCBGb2xkZXJNYXJrIGZyb20gXCIuL2ZvbGRlci1tYXJrXCI7XG5cbmNvbnN0IGdldEZpbGVFeHBsb3JlckhhbmRsZXJzID0gKFxuICBwbHVnaW46IEFMeEZvbGRlck5vdGUsXG4gIGZpbGVFeHBsb3JlcjogRmlsZUV4cGxvcmVyVmlldyxcbikgPT4gKHtcbiAgLy8gaW5pdGlhbGl6ZWQgKG1hcmsgZm9sZGVycywgaG9vayBldnQgaGFuZGxlcnMuLi4pIHdoZW4gY29uc3RydWN0ZWRcbiAgcGx1Z2luLFxuICBmb2xkZXJGb2N1czogbmV3IEZvbGRlckZvY3VzKHBsdWdpbiwgZmlsZUV4cGxvcmVyKSxcbiAgZm9sZGVyTWFyazogbmV3IEZvbGRlck1hcmsocGx1Z2luLCBmaWxlRXhwbG9yZXIpLFxuICBhY3RpdmVGb2xkZXI6IG5ldyBBY3RpdmVGb2xkZXIocGx1Z2luLCBmaWxlRXhwbG9yZXIpLFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGdldEZpbGVFeHBsb3JlckhhbmRsZXJzO1xuIiwgIi8qIVxuICogbG9uZy1wcmVzcy1ldmVudFxuICogUHVyZSBKYXZhU2NyaXB0IGxvbmctcHJlc3MtZXZlbnRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qb2huLWRvaGVydHkvbG9uZy1wcmVzcy1ldmVudFxuICogQGF1dGhvciBKb2huIERvaGVydHkgPHd3dy5qb2huZG9oZXJ0eS5pbmZvPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IEFMeEZvbGRlck5vdGUgZnJvbSBcIi4uL2ZuLW1haW5cIjtcblxuLy8gbG9jYWwgdGltZXIgb2JqZWN0IGJhc2VkIG9uIHJBRlxubGV0IHRpbWVyOiB7XG4gIHZhbHVlOiBudW1iZXI7XG59IHwgbnVsbCA9IG51bGw7XG5cbi8vIHRyYWNrIG51bWJlciBvZiBwaXhlbHMgdGhlIG1vdXNlIG1vdmVzIGR1cmluZyBsb25nIHByZXNzXG5sZXQgc3RhcnRYID0gMDsgLy8gbW91c2UgeCBwb3NpdGlvbiB3aGVuIHRpbWVyIHN0YXJ0ZWRcbmxldCBzdGFydFkgPSAwOyAvLyBtb3VzZSB5IHBvc2l0aW9uIHdoZW4gdGltZXIgc3RhcnRlZFxubGV0IG1heERpZmZYID0gMTA7IC8vIG1heCBudW1iZXIgb2YgWCBwaXhlbHMgdGhlIG1vdXNlIGNhbiBtb3ZlIGR1cmluZyBsb25nIHByZXNzIGJlZm9yZSBpdCBpcyBjYW5jZWxlZFxubGV0IG1heERpZmZZID0gMTA7IC8vIG1heCBudW1iZXIgb2YgWSBwaXhlbHMgdGhlIG1vdXNlIGNhbiBtb3ZlIGR1cmluZyBsb25nIHByZXNzIGJlZm9yZSBpdCBpcyBjYW5jZWxlZFxuXG4vKipcbiAqIEJlaGF2ZXMgdGhlIHNhbWUgYXMgc2V0VGltZW91dCBleGNlcHQgdXNlcyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSB3aGVyZSBwb3NzaWJsZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBwYXJhbSB7aW50fSBkZWxheSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBoYW5kbGUgdG8gdGhlIHRpbWVvdXQgb2JqZWN0XG4gKi9cbmNvbnN0IHJlcXVlc3RUaW1lb3V0ID0gKGZuOiBGdW5jdGlvbiwgZGVsYXk6IG51bWJlcik6IHsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgbGV0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGxldCBoYW5kbGU6IHsgdmFsdWU/OiBudW1iZXIgfSA9IHt9O1xuXG4gIGxldCBsb29wID0gKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgbGV0IGRlbHRhID0gY3VycmVudCAtIHN0YXJ0O1xuXG4gICAgaWYgKGRlbHRhID49IGRlbGF5KSB7XG4gICAgICBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcblxuICByZXR1cm4gaGFuZGxlIGFzIFJlcXVpcmVkPHR5cGVvZiBoYW5kbGU+O1xufTtcblxuLyoqXG4gKiBCZWhhdmVzIHRoZSBzYW1lIGFzIGNsZWFyVGltZW91dCBleGNlcHQgdXNlcyBjYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSB3aGVyZSBwb3NzaWJsZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKiBAcGFyYW0ge29iamVjdH0gaGFuZGxlIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGNsZWFyUmVxdWVzdFRpbWVvdXQgPSAoaGFuZGxlOiB0eXBlb2YgdGltZXIpID0+IHtcbiAgaGFuZGxlICYmIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZS52YWx1ZSk7XG59O1xuXG4vKipcbiAqIG1ldGhvZCByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgYSBwZW5kaW5nIGxvbmcgcHJlc3MgdGltZXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBjbGVhckxvbmdQcmVzc1RpbWVyID0gKCkgPT4ge1xuICBjbGVhclJlcXVlc3RUaW1lb3V0KHRpbWVyKTtcbiAgdGltZXIgPSBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgTG9uZ1ByZXNzRXZlbnQgPSBDdXN0b21FdmVudDx7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0+O1xuXG4vKipcbiAqIEZpcmVzIHRoZSAnbG9uZy1wcmVzcycgZXZlbnQgb24gZWxlbWVudFxuICogQHBhcmFtIG9yaWdpbmFsRXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50IGJlaW5nIGZpcmVkXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZmlyZUxvbmdQcmVzc0V2ZW50ID0gKG9yaWdpbmFsRXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICBjbGVhckxvbmdQcmVzc1RpbWVyKCk7XG5cbiAgLy8gZmlyZSB0aGUgbG9uZy1wcmVzcyBldmVudFxuICBsZXQgYWxsb3dDbGlja0V2ZW50ID0gb3JpZ2luYWxFdmVudC50YXJnZXQ/LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KFwibG9uZy1wcmVzc1wiLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcblxuICAgICAgLy8gY3VzdG9tIGV2ZW50IGRhdGEgKGxlZ2FjeSlcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBjbGllbnRYOiBvcmlnaW5hbEV2ZW50LmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IG9yaWdpbmFsRXZlbnQuY2xpZW50WSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIGFkZCBjb29yZGluYXRlIGRhdGEgdGhhdCB3b3VsZCB0eXBpY2FsbHkgYWNvbXBhbnkgYSB0b3VjaC9jbGljayBldmVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY2xpZW50WDogb3JpZ2luYWxFdmVudC5jbGllbnRYLFxuICAgICAgY2xpZW50WTogb3JpZ2luYWxFdmVudC5jbGllbnRZLFxuICAgICAgb2Zmc2V0WDogb3JpZ2luYWxFdmVudC5vZmZzZXRYLFxuICAgICAgb2Zmc2V0WTogb3JpZ2luYWxFdmVudC5vZmZzZXRZLFxuICAgICAgcGFnZVg6IG9yaWdpbmFsRXZlbnQucGFnZVgsXG4gICAgICBwYWdlWTogb3JpZ2luYWxFdmVudC5wYWdlWSxcbiAgICAgIHNjcmVlblg6IG9yaWdpbmFsRXZlbnQuc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IG9yaWdpbmFsRXZlbnQuc2NyZWVuWSxcbiAgICB9KSBhcyBMb25nUHJlc3NFdmVudCxcbiAgKTtcblxuICBpZiAoIWFsbG93Q2xpY2tFdmVudCkge1xuICAgIGNvbnN0IHN1cHByZXNzRXZlbnQgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIG1vbml0ZXJJbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHN1cHByZXNzRXZlbnQsIHRydWUpO1xuICAgICAgY2FuY2VsRXZlbnQoZSk7XG4gICAgfTtcblxuICAgIC8vIHN1cHByZXNzIHRoZSBuZXh0IGNsaWNrIGV2ZW50IGlmIGUucHJldmVudERlZmF1bHQoKSB3YXMgY2FsbGVkIGluIGxvbmctcHJlc3MgaGFuZGxlclxuICAgIG1vbml0ZXJJbj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHN1cHByZXNzRXZlbnQsIHRydWUpO1xuICB9XG59O1xuXG4vKipcbiAqIG1ldGhvZCByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdGhlIGxvbmcgcHJlc3MgdGltZXJcbiAqIEBwYXJhbSB7ZXZlbnR9IGUgLSBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBzdGFydExvbmdQcmVzc1RpbWVyID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICBjbGVhckxvbmdQcmVzc1RpbWVyKCk7XG5cbiAgbGV0IGVsID0gZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQ7XG5cbiAgLy8gZ2V0IGRlbGF5IGZyb20gaHRtbCBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgZGVmYXVsdCB0byA4MDBcbiAgbGV0IGxvbmdQcmVzc0RlbGF5SW5NcyA9IHBhcnNlSW50KFxuICAgIGdldE5lYXJlc3RBdHRyaWJ1dGUoZWwsIFwiZGF0YS1sb25nLXByZXNzLWRlbGF5XCIsIFwiODAwXCIpLFxuICAgIDEwLFxuICApOyAvLyBkZWZhdWx0IDgwMFxuXG4gIC8vIHN0YXJ0IHRoZSB0aW1lclxuICB0aW1lciA9IHJlcXVlc3RUaW1lb3V0KGZpcmVMb25nUHJlc3NFdmVudC5iaW5kKGVsLCBlKSwgbG9uZ1ByZXNzRGVsYXlJbk1zKTtcbn07XG5cbi8qKlxuICogQ2FuY2VscyB0aGUgY3VycmVudCBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IGUgLSBicm93c2VyIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGNhbmNlbEV2ZW50ID0gKGU6IEV2ZW50KSA9PiB7XG4gIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbi8qKlxuICogU3RhcnRzIHRoZSB0aW1lciBvbiBtb3VzZSBkb3duIGFuZCBsb2dzIGN1cnJlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBlIC0gYnJvd3NlciBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBtb3VzZURvd25IYW5kbGVyID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICBzdGFydFggPSBlLmNsaWVudFg7XG4gIHN0YXJ0WSA9IGUuY2xpZW50WTtcbiAgc3RhcnRMb25nUHJlc3NUaW1lcihlKTtcbn07XG5cbi8qKlxuICogSWYgdGhlIG1vdXNlIG1vdmVzIG4gcGl4ZWxzIGR1cmluZyBsb25nLXByZXNzLCBjYW5jZWwgdGhlIHRpbWVyXG4gKiBAcGFyYW0ge29iamVjdH0gZSAtIGJyb3dzZXIgZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgbW91c2VNb3ZlSGFuZGxlciA9IChlOiBEcmFnRXZlbnQpID0+IHtcbiAgY2xlYXJMb25nUHJlc3NUaW1lcigpO1xuICAvLyAvLyBjYWxjdWxhdGUgdG90YWwgbnVtYmVyIG9mIHBpeGVscyB0aGUgcG9pbnRlciBoYXMgbW92ZWRcbiAgLy8gbGV0IGRpZmZYID0gTWF0aC5hYnMoc3RhcnRYIC0gZS5jbGllbnRYKTtcbiAgLy8gbGV0IGRpZmZZID0gTWF0aC5hYnMoc3RhcnRZIC0gZS5jbGllbnRZKTtcblxuICAvLyBjb25zb2xlLmxvZyhkaWZmWCA+PSBtYXhEaWZmWCB8fCBkaWZmWSA+PSBtYXhEaWZmWSwgZGlmZlgsIGRpZmZZKTtcbiAgLy8gLy8gaWYgcG9pbnRlciBoYXMgbW92ZWQgbW9yZSB0aGFuIGFsbG93ZWQsIGNhbmNlbCB0aGUgbG9uZy1wcmVzcyB0aW1lciBhbmQgdGhlcmVmb3JlIHRoZSBldmVudFxuICAvLyBpZiAoZGlmZlggPj0gbWF4RGlmZlggfHwgZGlmZlkgPj0gbWF4RGlmZlkpIHtcbiAgLy8gICBjbGVhckxvbmdQcmVzc1RpbWVyKCk7XG4gIC8vIH1cbn07XG5cbi8qKlxuICogR2V0cyBhdHRyaWJ1dGUgb2ZmIEhUTUwgZWxlbWVudCBvciBuZWFyZXN0IHBhcmVudFxuICogQHBhcmFtIHtvYmplY3R9IGVsIC0gSFRNTCBlbGVtZW50IHRvIHJldHJpZXZlIGF0dHJpYnV0ZSBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxuICogQHBhcmFtIHthbnl9IGRlZmF1bHRWYWx1ZSAtIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIG1hdGNoIGZvdW5kXG4gKiBAcmV0dXJucyB7YW55fSBhdHRyaWJ1dGUgdmFsdWUgb3IgZGVmYXVsdFZhbHVlXG4gKi9cbmNvbnN0IGdldE5lYXJlc3RBdHRyaWJ1dGUgPSAoXG4gIGVsOiBFdmVudFRhcmdldCB8IG51bGwsXG4gIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgZGVmYXVsdFZhbHVlOiBzdHJpbmcsXG4pID0+IHtcbiAgLy8gd2FsayB1cCB0aGUgZG9tIHRyZWUgbG9va2luZyBmb3IgZGF0YS1hY3Rpb24gYW5kIGRhdGEtdHJpZ2dlclxuICB3aGlsZSAoZWwgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICBsZXQgYXR0cmlidXRlVmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTtcbiAgICB9XG5cbiAgICBlbCA9IGVsLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xufTtcblxubGV0IG1vbml0ZXJJbjogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG5jb25zdCByZW1vdmVFdnRMaXN0ZW5lciA9IChlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgbW9uaXRlckluID0gbnVsbDtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBjbGVhckxvbmdQcmVzc1RpbWVyLCB0cnVlKTtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRyYWdcIiwgbW91c2VNb3ZlSGFuZGxlciwgdHJ1ZSk7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBjbGVhckxvbmdQcmVzc1RpbWVyLCB0cnVlKTtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBjbGVhckxvbmdQcmVzc1RpbWVyLCB0cnVlKTtcblxuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgbW91c2VEb3duSGFuZGxlciwgdHJ1ZSk7IC8vIDwtIHN0YXJ0XG59O1xuXG5jb25zdCBBZGRMb25nUHJlc3NFdnQgPSAocGx1Z2luOiBBTHhGb2xkZXJOb3RlLCBlbDogSFRNTEVsZW1lbnQpID0+IHtcbiAgLy8gZGlzYWJsZSBvbiBtb2JpbGUgKGNvbmZsaWN0IHdpdGggZmlsZS1tZW51KVxuICBpZiAoIXBsdWdpbi5zZXR0aW5ncy5sb25nUHJlc3NGb2N1cyB8fCBQbGF0Zm9ybS5pc01vYmlsZSkgcmV0dXJuO1xuICBpZiAobW9uaXRlckluKSB7XG4gICAgcmVtb3ZlRXZ0TGlzdGVuZXIobW9uaXRlckluKTtcbiAgfVxuICBtb25pdGVySW4gPSBlbDtcbiAgLy8gaG9vayBldmVudHMgdGhhdCBjbGVhciBhIHBlbmRpbmcgbG9uZyBwcmVzcyBldmVudFxuICBlbC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGNsZWFyTG9uZ1ByZXNzVGltZXIsIHRydWUpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ1wiLCBtb3VzZU1vdmVIYW5kbGVyLCB0cnVlKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIGNsZWFyTG9uZ1ByZXNzVGltZXIsIHRydWUpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGNsZWFyTG9uZ1ByZXNzVGltZXIsIHRydWUpO1xuXG4gIC8vIGhvb2sgZXZlbnRzIHRoYXQgY2FuIHRyaWdnZXIgYSBsb25nIHByZXNzIGV2ZW50XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBtb3VzZURvd25IYW5kbGVyLCB0cnVlKTsgLy8gPC0gc3RhcnRcblxuICBwbHVnaW4ucmVnaXN0ZXIoKCkgPT4gcmVtb3ZlRXZ0TGlzdGVuZXIoZWwpKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFkZExvbmdQcmVzc0V2dDtcbiIsICJpbXBvcnQgdHlwZSB7IEljb25JbmZvIH0gZnJvbSBcIkBhaWRlbmx4L29ic2lkaWFuLWljb24tc2hvcnRjb2Rlcy9saWIvaWNvbi1wYWNrcy90eXBlc1wiO1xuaW1wb3J0IG1hdHRlciBmcm9tIFwiZ3JheS1tYXR0ZXJcIjtcbmltcG9ydCB7IE1hcmtkb3duVmlldywgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHR5cGUgQUx4Rm9sZGVyTm90ZSBmcm9tIFwiLi4vZm4tbWFpblwiO1xuXG5jb25zdCByZWdpc3RlclNldEZvbGRlckljb25DbWQgPSAocGx1Z2luOiBBTHhGb2xkZXJOb3RlKSA9PiB7XG4gIGNvbnN0IHsgd29ya3NwYWNlLCB2YXVsdCB9ID0gcGx1Z2luLmFwcDtcbiAgY29uc3Qgc2V0SWNvbkZpZWxkID0gYXN5bmMgKGljb246IEljb25JbmZvIHwgbnVsbCwgZmlsZTogVEZpbGUpID0+XG4gICAgaWNvbiAmJlxuICAgIHZhdWx0Lm1vZGlmeShcbiAgICAgIGZpbGUsXG4gICAgICAobWF0dGVyKGF3YWl0IHZhdWx0LnJlYWQoZmlsZSkpLnN0cmluZ2lmeSBhcyBhbnkpKFxuICAgICAgICB7IGljb246IGljb24uaWQgfSxcbiAgICAgICAgeyBmbG93TGV2ZWw6IDMsIGluZGVudDogNCB9LFxuICAgICAgKSxcbiAgICApO1xuICBwbHVnaW4uYWRkQ29tbWFuZCh7XG4gICAgaWQ6IFwic2V0LWZvbGRlci1pY29uXCIsXG4gICAgbmFtZTogXCJTZXQgRm9sZGVyIEljb25cIixcbiAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmcpID0+IHtcbiAgICAgIGNvbnN0IGlzY0FQSSA9IHBsdWdpbi5JY29uU0NBUEk7XG4gICAgICBpZiAoIWlzY0FQSSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgbWRWaWV3ID0gd29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgIGlmICghbWRWaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBmb2xkZXIgPSBwbHVnaW4uQ29yZUFwaS5nZXRGb2xkZXJGcm9tTm90ZShtZFZpZXcuZmlsZSk7XG4gICAgICBpZiAoIWZvbGRlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlzY0FQSS5nZXRJY29uRnJvbVVzZXIoKS50aGVuKChpY29uKSA9PiBzZXRJY29uRmllbGQoaWNvbiwgbWRWaWV3LmZpbGUpKTtcbiAgICB9LFxuICB9KTtcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgd29ya3NwYWNlLm9uKFwiZmlsZS1tZW51XCIsIChtZW51LCBhZiwgc3JjKSA9PiB7XG4gICAgICBjb25zdCBpc2NBUEkgPSBwbHVnaW4uSWNvblNDQVBJO1xuICAgICAgaWYgKCFpc2NBUEkpIHJldHVybjtcbiAgICAgIGxldCBub3RlO1xuICAgICAgaWYgKFxuICAgICAgICAoYWYgaW5zdGFuY2VvZiBURm9sZGVyICYmIChub3RlID0gcGx1Z2luLkNvcmVBcGkuZ2V0Rm9sZGVyTm90ZShhZikpKSB8fFxuICAgICAgICAoYWYgaW5zdGFuY2VvZiBURmlsZSAmJlxuICAgICAgICAgICgobm90ZSA9IGFmKSwgcGx1Z2luLkNvcmVBcGkuZ2V0Rm9sZGVyRnJvbU5vdGUoYWYpKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmb2xkZXJOb3RlID0gbm90ZTtcbiAgICAgICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PlxuICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgIC5zZXRJY29uKFwiaW1hZ2UtZ2x5cGhcIilcbiAgICAgICAgICAgIC5zZXRUaXRsZShcIlNldCBGb2xkZXIgSWNvblwiKVxuICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT5cbiAgICAgICAgICAgICAgc2V0SWNvbkZpZWxkKGF3YWl0IGlzY0FQSS5nZXRJY29uRnJvbVVzZXIoKSwgZm9sZGVyTm90ZSksXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pLFxuICApO1xufTtcbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyU2V0Rm9sZGVySWNvbkNtZDtcbiIsICJpbXBvcnQgXCIuL3NldHRpbmdzLmxlc3NcIjtcblxuaW1wb3J0IHsgZ2V0QXBpIH0gZnJvbSBcIkBhaWRlbmx4L29ic2lkaWFuLWljb24tc2hvcnRjb2Rlc1wiO1xuaW1wb3J0IHsgQXBwLCBNb2RpZmllciwgUGxhdGZvcm0sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgZm9sZGVySWNvbk1hcmsgfSBmcm9tIFwiLi9mZS1oYW5kbGVyL2ZvbGRlci1tYXJrXCI7XG5pbXBvcnQgQUx4Rm9sZGVyTm90ZSBmcm9tIFwiLi9mbi1tYWluXCI7XG5pbXBvcnQgeyBOb3RlTG9jIH0gZnJvbSBcIi4vbWlzY1wiO1xuXG5leHBvcnQgY29uc3Qgbm9IaWRlTm90ZU1hcmsgPSBcImFseC1uby1oaWRlLW5vdGVcIjtcbmV4cG9ydCBjb25zdCBNb2JpbGVOb0NsaWNrTWFyayA9IFwiYWx4LW5vLWNsaWNrLW9uLW1vYmlsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFMeEZvbGRlck5vdGVTZXR0aW5ncyB7XG4gIG1vZGlmaWVyRm9yTmV3Tm90ZTogTW9kaWZpZXI7XG4gIGhpZGVOb3RlSW5FeHBsb3JlcjogYm9vbGVhbjtcbiAgaGlkZUNvbGxhcHNlSW5kaWNhdG9yOiBib29sZWFuO1xuICBsb25nUHJlc3NGb2N1czogYm9vbGVhbjtcbiAgZm9sZGVySWNvbjogYm9vbGVhbjtcbiAgZm9sZGVyTm90ZVByZWY6IE5vdGVMb2MgfCBudWxsO1xuICBkZWxldGVPdXRzaWRlTm90ZVdpdGhGb2xkZXI6IGJvb2xlYW4gfCBudWxsO1xuICBpbmRleE5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF1dG9SZW5hbWU6IGJvb2xlYW4gfCBudWxsO1xuICBmb2xkZXJOb3RlVGVtcGxhdGU6IHN0cmluZyB8IG51bGw7XG4gIG1vYmlsZUNsaWNrVG9PcGVuOiBib29sZWFuO1xuICBsb25nUHJlc3NEZWxheTogbnVtYmVyO1xuICBleHBhbmRGb2xkZXJPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogQUx4Rm9sZGVyTm90ZVNldHRpbmdzID0ge1xuICBtb2RpZmllckZvck5ld05vdGU6IFwiTW9kXCIsXG4gIGhpZGVOb3RlSW5FeHBsb3JlcjogdHJ1ZSxcbiAgaGlkZUNvbGxhcHNlSW5kaWNhdG9yOiBmYWxzZSxcbiAgbG9uZ1ByZXNzRm9jdXM6IGZhbHNlLFxuICBmb2xkZXJJY29uOiB0cnVlLFxuICBmb2xkZXJOb3RlUHJlZjogbnVsbCxcbiAgZGVsZXRlT3V0c2lkZU5vdGVXaXRoRm9sZGVyOiBudWxsLFxuICBpbmRleE5hbWU6IG51bGwsXG4gIGF1dG9SZW5hbWU6IG51bGwsXG4gIGZvbGRlck5vdGVUZW1wbGF0ZTogbnVsbCxcbiAgbW9iaWxlQ2xpY2tUb09wZW46IHRydWUsXG4gIGxvbmdQcmVzc0RlbGF5OiA4MDAsXG4gIGV4cGFuZEZvbGRlck9uQ2xpY2s6IGZhbHNlLFxufTtcblxudHlwZSBTZXR0aW5nS2V5V2l0aFR5cGU8VD4gPSB7XG4gIFtLIGluIGtleW9mIEFMeEZvbGRlck5vdGVTZXR0aW5nc106IEFMeEZvbGRlck5vdGVTZXR0aW5nc1tLXSBleHRlbmRzIFRcbiAgICA/IEtcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBBTHhGb2xkZXJOb3RlU2V0dGluZ3NdO1xuXG5jb25zdCBvbGQgPSBbXG4gIFwiZm9sZGVyTm90ZVByZWZcIixcbiAgXCJkZWxldGVPdXRzaWRlTm90ZVdpdGhGb2xkZXJcIixcbiAgXCJpbmRleE5hbWVcIixcbiAgXCJhdXRvUmVuYW1lXCIsXG4gIFwiZm9sZGVyTm90ZVRlbXBsYXRlXCIsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgQUx4Rm9sZGVyTm90ZVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcGx1Z2luOiBBTHhGb2xkZXJOb3RlO1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEFMeEZvbGRlck5vdGUpIHtcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gIH1cblxuICBjaGVja01pZ3JhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvbGQuZXZlcnkoKGtleSkgPT4gdGhpcy5wbHVnaW4uc2V0dGluZ3Nba2V5XSA9PT0gbnVsbCk7XG4gIH1cblxuICBnZXRJbml0R3VpZGUoXG4gICAgZGVzYzogc3RyaW5nLFxuICAgIHRhcmdldFBsdWdpbklEOiBzdHJpbmcsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgKTogU2V0dGluZyB7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5nKGNvbnRhaW5lcilcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICBkZXNjICtcbiAgICAgICAgICBcInVzZSB0aGUgYnV0dG9ucyB0byBpbnN0YWxsICYgZW5hYmxlIGl0IHRoZW4gcmVsb2FkIGFseC1mb2xkZXItbm90ZSB0byB0YWtlIGVmZmVjdHNcIixcbiAgICAgIClcbiAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgYnRuXG4gICAgICAgICAgLnNldEljb24oXCJkb3duLWFycm93LXdpdGgtdGFpbFwiKVxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiR28gdG8gUGx1Z2luIFBhZ2VcIilcbiAgICAgICAgICAub25DbGljaygoKSA9PlxuICAgICAgICAgICAgd2luZG93Lm9wZW4oYG9ic2lkaWFuOi8vc2hvdy1wbHVnaW4/aWQ9JHt0YXJnZXRQbHVnaW5JRH1gKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLmFkZEJ1dHRvbigoYnRuKSA9PlxuICAgICAgICBidG5cbiAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJSZWxvYWQgYWx4LWZvbGRlci1ub3RlXCIpXG4gICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luKHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luKHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQodGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgbGV0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXRIZWFkaW5nKCkuc2V0TmFtZShcIkNvcmVcIik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucGx1Z2luLkNvcmVBcGk7IC8vIHRocm93IGVycm9yIHdoZW4gbm90IGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuY2hlY2tNaWdyYXRlZCgpKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLkNvcmVBcGkucmVuZGVyQ29yZVNldHRpbmdzKGNvbnRhaW5lckVsKTtcbiAgICAgIH0gZWxzZSB0aGlzLnNldE1pZ3JhdGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5nZXRJbml0R3VpZGUoXG4gICAgICAgIFwiU2VlbXMgbGlrZSBGb2xkZXIgTm90ZSBDb3JlIGlzIG5vdCBlbmFibGVkLCBcIixcbiAgICAgICAgXCJmb2xkZXItbm90ZS1jb3JlXCIsXG4gICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldEZvbGRlckljb24oKTtcbiAgICB0aGlzLnNldE1vZGlmaWVyKCk7XG4gICAgdGhpcy5zZXRIaWRlKCk7XG4gICAgdGhpcy5hZGRUb2dnbGUodGhpcy5jb250YWluZXJFbCwgXCJleHBhbmRGb2xkZXJPbkNsaWNrXCIpXG4gICAgICAuc2V0TmFtZShcIkV4cGFuZCBGb2xkZXIgb24gQ2xpY2tcIilcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICBcIkV4cGFuZCBjb2xsYXBzZWQgZm9sZGVycyB3aXRoIG5vdGUgd2hpbGUgb3BlbmluZyB0aGVtIGJ5IGNsaWNraW5nIG9uIGZvbGRlciB0aXRsZVwiLFxuICAgICAgKTtcbiAgICB0aGlzLnNldE1vYmlsZSgpO1xuICAgIHRoaXMuc2V0Rm9jdXMoKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXRIZWFkaW5nKCkuc2V0TmFtZShcIkZvbGRlciBPdmVydmlld1wiKTtcbiAgICBjb25zdCBmb2xkZXJ2ID0gdGhpcy5hcHAucGx1Z2lucy5wbHVnaW5zW1wiYWx4LWZvbGRlci1ub3RlLWZvbGRlcnZcIl07XG4gICAgaWYgKGZvbGRlcnY/LnJlbmRlckZvbGRlcnZTZXR0aW5ncykge1xuICAgICAgZm9sZGVydi5yZW5kZXJGb2xkZXJ2U2V0dGluZ3MoY29udGFpbmVyRWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldEluaXRHdWlkZShcbiAgICAgICAgXCJGb2xkZXIgT3ZlcnZpZXcgKGZvbGRlcnYpIGlzIG5vdyBhbiBvcHRpb25hbCBjb21wb25lbnQsIFwiLFxuICAgICAgICBcImFseC1mb2xkZXItbm90ZS1mb2xkZXJ2XCIsXG4gICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0SGVhZGluZygpLnNldE5hbWUoXCJEZWJ1Z1wiKTtcbiAgICB0aGlzLnBsdWdpbi5Db3JlQXBpLnJlbmRlckxvZ0xldmVsKGNvbnRhaW5lckVsKTtcbiAgfVxuXG4gIHNldE1pZ3JhdGUoKSB7XG4gICAgbmV3IFNldHRpbmcodGhpcy5jb250YWluZXJFbClcbiAgICAgIC5zZXROYW1lKFwiTWlncmF0ZSBzZXR0aW5ncyB0byBGb2xkZXIgTm90ZSBDb3JlXCIpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJTb21lIHNldHRpbmdzIGhhcyBub3QgYmVlbiBtaWdyYXRlZCB0byBGb2xkZXIgTm90ZSBDb3JlLCBcIiArXG4gICAgICAgICAgXCJjbGljayBNaWdyYXRlIHRvIG1pZ3JhdGUgb2xkIGNvbmZpZyBcIiArXG4gICAgICAgICAgXCJvciBDYW5jZWwgdG8gdXNlIGNvbmZpZyBpbiBGb2xkZXIgTm90ZSBDb3JlIGluIGZhdm9yIG9mIG9sZCBjb25maWdcIixcbiAgICAgIClcbiAgICAgIC5hZGRCdXR0b24oKGNiKSA9PlxuICAgICAgICBjYi5zZXRCdXR0b25UZXh0KFwiTWlncmF0ZVwiKS5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0b0ltcG9ydCA9IG9sZC5yZWR1Y2UoXG4gICAgICAgICAgICAob2JqLCBrKSA9PiAoKG9ialtrXSA9IHRoaXMucGx1Z2luLnNldHRpbmdzW2tdID8/IHVuZGVmaW5lZCksIG9iaiksXG4gICAgICAgICAgICB7fSBhcyBhbnksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnBsdWdpbi5Db3JlQXBpLmltcG9ydFNldHRpbmdzKHRvSW1wb3J0KTtcbiAgICAgICAgICBvbGQuZm9yRWFjaCgoaykgPT4gKCh0aGlzLnBsdWdpbi5zZXR0aW5ncyBhcyBhbnkpW2tdID0gbnVsbCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5hZGRCdXR0b24oKGNiKSA9PlxuICAgICAgICBjYi5zZXRCdXR0b25UZXh0KFwiQ2FuY2VsXCIpLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIG9sZC5mb3JFYWNoKChrKSA9PiAoKHRoaXMucGx1Z2luLnNldHRpbmdzIGFzIGFueSlba10gPSBudWxsKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHNldE1vYmlsZSgpIHtcbiAgICBpZiAoIVBsYXRmb3JtLmlzTW9iaWxlKSByZXR1cm47XG4gICAgdGhpcy5hZGRUb2dnbGUodGhpcy5jb250YWluZXJFbCwgXCJtb2JpbGVDbGlja1RvT3BlblwiLCAodmFsdWUpID0+XG4gICAgICBkb2N1bWVudC5ib2R5LnRvZ2dsZUNsYXNzKE1vYmlsZU5vQ2xpY2tNYXJrLCAhdmFsdWUpLFxuICAgIClcbiAgICAgIC5zZXROYW1lKFwiQ2xpY2sgZm9sZGVyIHRpdGxlIHRvIG9wZW4gZm9sZGVyIG5vdGUgb24gbW9iaWxlXCIpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJEaXNhYmxlIHRoaXMgaWYgeW91IHdhbnQgdG8gdGhlIGRlZmF1bHQgYWN0aW9uLiBZb3UgY2FuIHN0aWxsIHVzZSBjb250ZXh0IG1lbnUgdG8gb3BlbiBmb2xkZXIgbm90ZVwiLFxuICAgICAgKTtcbiAgfVxuXG4gIHNldE1vZGlmaWVyID0gKCkgPT4ge1xuICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwpXG4gICAgICAuc2V0TmFtZShcIk1vZGlmaWVyIGZvciBOZXcgTm90ZVwiKVxuICAgICAgLnNldERlc2MoXCJDaG9vc2UgYSBtb2RpZmllciB0byBjbGljayBmb2xkZXJzIHdpdGggdG8gY3JlYXRlIGZvbGRlciBub3Rlc1wiKVxuICAgICAgLmFkZERyb3Bkb3duKChkcm9wRG93bikgPT4ge1xuICAgICAgICB0eXBlIE5vU2hpZnQgPSBFeGNsdWRlPE1vZGlmaWVyLCBcIlNoaWZ0XCI+O1xuICAgICAgICBjb25zdCB3aW5kb3dzT3B0czogUmVjb3JkPE5vU2hpZnQsIHN0cmluZz4gPSB7XG4gICAgICAgICAgTW9kOiBcIkN0cmwgKENtZCBpbiBtYWNPUylcIixcbiAgICAgICAgICBDdHJsOiBcIkN0cmwgKEN0cmwgaW4gbWFjT1MpXCIsXG4gICAgICAgICAgTWV0YTogXCJcdTIyOUUgV2luXCIsXG4gICAgICAgICAgLy8gU2hpZnQ6IFwiU2hpZnRcIixcbiAgICAgICAgICBBbHQ6IFwiQWx0XCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hY09TT3B0czogUmVjb3JkPE5vU2hpZnQsIHN0cmluZz4gPSB7XG4gICAgICAgICAgTW9kOiBcIlx1MjMxOCBDbWQgKEN0cmwgaW4gV2luZG93cylcIixcbiAgICAgICAgICBDdHJsOiBcIlx1MjMwMyBDb250cm9sXCIsXG4gICAgICAgICAgTWV0YTogXCJcdTIzMTggQ21kIChXaW4gaW4gV2luZG93cylcIixcbiAgICAgICAgICAvLyBTaGlmdDogXCJcdTIxRTcgU2hpZnRcIixcbiAgICAgICAgICBBbHQ6IFwiXHUyMzI1IE9wdGlvblwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBQbGF0Zm9ybS5pc01hY09TID8gbWFjT1NPcHRzIDogd2luZG93c09wdHM7XG5cbiAgICAgICAgZHJvcERvd25cbiAgICAgICAgICAuYWRkT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb2RpZmllckZvck5ld05vdGUpXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb2RpZmllckZvck5ld05vdGUgPSB2YWx1ZSBhcyBOb1NoaWZ0O1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBzZXRIaWRlKCkge1xuICAgIHRoaXMuYWRkVG9nZ2xlKHRoaXMuY29udGFpbmVyRWwsIFwiaGlkZU5vdGVJbkV4cGxvcmVyXCIsICh2YWx1ZSkgPT5cbiAgICAgIGRvY3VtZW50LmJvZHkudG9nZ2xlQ2xhc3Mobm9IaWRlTm90ZU1hcmssICF2YWx1ZSksXG4gICAgKVxuICAgICAgLnNldE5hbWUoXCJIaWRlIEZvbGRlciBOb3RlXCIpXG4gICAgICAuc2V0RGVzYyhcIkhpZGUgZm9sZGVyIG5vdGUgZmlsZXMgZnJvbSBmaWxlIGV4cGxvcmVyXCIpO1xuICAgIHRoaXMuYWRkVG9nZ2xlKHRoaXMuY29udGFpbmVyRWwsIFwiaGlkZUNvbGxhcHNlSW5kaWNhdG9yXCIpXG4gICAgICAuc2V0TmFtZShcIkhpZGUgQ29sbGFwc2UgSW5kaWNhdG9yXCIpXG4gICAgICAuc2V0RGVzYyhcbiAgICAgICAgXCJIaWRlIGNvbGxhcHNlIGluZGljYXRvciB3aGVuIGZvbGRlciBjb250YWlucyBvbmx5IGZvbGRlciBub3RlLCByZWxvYWQgb2JzaWRpYW4gdG8gdGFrZSBlZmZlY3RzXCIsXG4gICAgICApO1xuICB9XG4gIHNldEZvbGRlckljb24oKSB7XG4gICAgdGhpcy5hZGRUb2dnbGUodGhpcy5jb250YWluZXJFbCwgXCJmb2xkZXJJY29uXCIsICh2YWx1ZSkgPT5cbiAgICAgIGRvY3VtZW50LmJvZHkudG9nZ2xlQ2xhc3MoZm9sZGVySWNvbk1hcmssIHZhbHVlKSxcbiAgICApXG4gICAgICAuc2V0TmFtZShcIlNldCBGb2xkZXIgSWNvbiBpbiBGb2xkZXIgTm90ZXNcIilcbiAgICAgIC5zZXREZXNjKFxuICAgICAgICBjcmVhdGVGcmFnbWVudCgoZWwpID0+IHtcbiAgICAgICAgICBlbC5hcHBlbmRUZXh0KFxuICAgICAgICAgICAgXCJTZXQgYGljb25gIGZpZWxkIHdpdGggaWNvbiBzaG9ydGNvZGUgaW4gZnJvbnRtYXR0ZXIgb2YgZm9sZXIgbm90ZSB0byBzcGVjaWZ5IGxpbmtlZCBmb2xkZXIncyBpY29uXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC5jcmVhdGVFbChcImJyXCIpO1xuXG4gICAgICAgICAgZWwuY3JlYXRlRWwoXCJhXCIsIHtcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FpZGVubHgvb2JzaWRpYW4taWNvbi1zaG9ydGNvZGVzXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIkljb24gU2hvcnRjb2RlcyB2MC41LjErXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZWwuYXBwZW5kVGV4dChcIiBSZXF1aXJlZC4gXCIpO1xuICAgICAgICAgIGlmICghZ2V0QXBpKHRoaXMucGx1Z2luKSkgZWwuYXBwZW5kVGV4dChcIihDdXJyZW50bHkgbm90IGVuYWJsZWQpXCIpO1xuICAgICAgICAgIGVsLmNyZWF0ZUVsKFwiYnJcIik7XG5cbiAgICAgICAgICBlbC5hcHBlbmRUZXh0KFwiUmVzdGFydCBvYnNpZGlhbiB0byB0YWtlIGVmZmVjdHNcIik7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuICBzZXRGb2N1cygpIHtcbiAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgLnNldEhlYWRpbmcoKVxuICAgICAgLnNldE5hbWUoXCJGb2N1c1wiKVxuICAgICAgLnNldERlc2MoXG4gICAgICAgIGBZb3UgY2FuIHVzZSBcIlRvZ2dsZSBGb2N1c1wiIG9wdGlvbiBpbiBmb2xkZXIgY29udGV4dCBtZW51JHtcbiAgICAgICAgICBQbGF0Zm9ybS5pc01vYmlsZSA/IFwiXCIgOiBcIiBvciBsb25nIHByZXNzIG9uIGZvbGRlciB0aXRsZVwiXG4gICAgICAgIH0gdG8gZm9jdXMgb24gYSBzcGVjaWZpYyBmb2xkZXJgLFxuICAgICAgKTtcbiAgICBpZiAoIVBsYXRmb3JtLmlzTW9iaWxlKVxuICAgICAgdGhpcy5hZGRUb2dnbGUodGhpcy5jb250YWluZXJFbCwgXCJsb25nUHJlc3NGb2N1c1wiKVxuICAgICAgICAuc2V0TmFtZShcIkxvbmcgUHJlc3Mgb24gRm9sZGVyIHRvIEZvY3VzXCIpXG4gICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgIFwiTG9uZyBwcmVzcyB3aXRoIG1vdXNlIG9uIGZvbGRlciBuYW1lIGluc2lkZSBmaWxlIGV4cGxvcmVyIHRvIGZvY3VzIHRoZSBmb2xkZXIuIFwiICtcbiAgICAgICAgICAgIFwiT25seSB3b3JrIG9uIERlc2t0b3AsIHJlbG9hZCBvYnNpZGlhbiB0byB0YWtlIGVmZmVjdHNcIixcbiAgICAgICAgKTtcbiAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxuICAgICAgLmFkZFRleHQoKHRleHQpID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0ZXh0LmlucHV0RWwsIHtcbiAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgIG1pbjogXCIwLjJcIixcbiAgICAgICAgICBzdGVwOiBcIjAuMVwiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dC5pbnB1dEVsLmFkZENsYXNzKFwiaW5wdXQtc2hvcnRcIik7XG4gICAgICAgIHRleHQuaW5wdXRFbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAgICAgXCJhZnRlcmVuZFwiLFxuICAgICAgICAgIGNyZWF0ZVNwYW4oeyBjbHM6IFtcInZhbGlkaXR5XCIsIFwidW5pdFwiXSwgdGV4dDogXCJzZWNvbmQocylcIiB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGV4dFxuICAgICAgICAgIC5zZXRWYWx1ZShgJHt0aGlzLnBsdWdpbi5sb25nUHJlc3NEZWxheSAvIDFlM31gKVxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWxheSA9ICt2YWwgKiAxZTM7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb25nUHJlc3NEZWxheSA9IGRlbGF5O1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnNldE5hbWUoXCJMb25nIFByZXNzIERlbGF5XCIpO1xuICB9XG5cbiAgYWRkVG9nZ2xlKFxuICAgIGFkZFRvOiBIVE1MRWxlbWVudCxcbiAgICBrZXk6IFNldHRpbmdLZXlXaXRoVHlwZTxib29sZWFuPixcbiAgICBvblNldD86ICh2YWx1ZTogYm9vbGVhbikgPT4gYW55LFxuICApOiBTZXR0aW5nIHtcbiAgICByZXR1cm4gbmV3IFNldHRpbmcoYWRkVG8pLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICB0b2dnbGVcbiAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzW2tleV0pXG4gICAgICAgIC5vbkNoYW5nZShcbiAgICAgICAgICAodmFsdWUpID0+IChcbiAgICAgICAgICAgICh0aGlzLnBsdWdpbi5zZXR0aW5nc1trZXldID0gdmFsdWUpLFxuICAgICAgICAgICAgb25TZXQgJiYgb25TZXQodmFsdWUpLFxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUEsNkVBQUFBLFVBQUE7QUFBQTtBQUNBLFdBQU8sZUFBZUEsVUFBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUEwQjVELGFBQVNDLGFBQVksT0FBTyxTQUFTO0FBQ2pDLFVBQUksU0FBUztBQUNULGVBQU87QUFBQSxNQUNYO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMkNBQTJDLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQSxJQUNwRjtBQUNBLElBQUFELFNBQVEsY0FBY0M7QUFDdEIsSUFBQUQsU0FBUSxVQUFVQztBQUFBO0FBQUE7OztBQ2xDbEI7QUFBQSxtRkFBQUMsVUFBQUMsU0FBQTtBQUFBO0FBMEJBLGFBQVMsV0FBVyxNQUFNO0FBQ3hCLFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsY0FBTSxJQUFJLFVBQVUscUNBQXFDLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQSxNQUMvRTtBQUFBLElBQ0Y7QUFHQSxhQUFTLHFCQUFxQixNQUFNLGdCQUFnQjtBQUNsRCxVQUFJLE1BQU07QUFDVixVQUFJLG9CQUFvQjtBQUN4QixVQUFJLFlBQVk7QUFDaEIsVUFBSSxPQUFPO0FBQ1gsVUFBSTtBQUNKLGVBQVMsSUFBSSxHQUFHLEtBQUssS0FBSyxRQUFRLEVBQUUsR0FBRztBQUNyQyxZQUFJLElBQUksS0FBSztBQUNYLGlCQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsaUJBQ2pCLFNBQVM7QUFDaEI7QUFBQTtBQUVBLGlCQUFPO0FBQ1QsWUFBSSxTQUFTLElBQVU7QUFDckIsY0FBSSxjQUFjLElBQUksS0FBSyxTQUFTLEdBQUc7QUFBQSxVQUV2QyxXQUFXLGNBQWMsSUFBSSxLQUFLLFNBQVMsR0FBRztBQUM1QyxnQkFBSSxJQUFJLFNBQVMsS0FBSyxzQkFBc0IsS0FB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LFVBQVUsR0FBSSxNQUFNLEtBQUssU0FBUyxFQUFHO0FBQy9ELFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNuQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNuQztBQUFBLEVBRUEsSUFBSSxpQkFBeUI7QUFDM0IsV0FBTyxLQUFLLFNBQVM7QUFBQSxFQUN2QjtBQUFBLEVBQ0EsSUFBSSxlQUFlLE9BQWU7QUFDaEMsU0FBSyxTQUFTLGlCQUFpQjtBQUMvQixhQUFTLEtBQUssUUFBUSxxQkFBcUIsSUFBSSxHQUFHO0FBQUEsRUFDcEQ7QUFBQSxFQUNBLHNCQUFzQjtBQUVwQixTQUFLLGlCQUFpQixLQUFLO0FBQzNCLFNBQUssU0FBUyxNQUFNLE9BQU8sU0FBUyxLQUFLLFFBQVEscUJBQXFCLENBQUM7QUFBQSxFQUN6RTtBQUNGO0FBRUEsSUFBTSx3QkFBd0I7IiwKICAibmFtZXMiOiBbImV4cG9ydHMiLCAiYXNzZXJ0TmV2ZXIiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiam9pbiIsICJkaXJuYW1lIiwgImV4dG5hbWUiLCAicGFyc2UiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAib3B0aW9ucyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJvcHRpb25zIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIm9wdGlvbnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAib3B0aW9ucyIsICJzdHIiLCAic3RyaW5nIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfanNfeWFtbCIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJ5YW1sIiwgIm9wdGlvbnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAic3RyIiwgImV4cG9ydHMiLCAic3RyIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgImVuZ2luZXMiLCAib3B0aW9ucyIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJvcHRpb25zIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIm9wdGlvbnMiLCAic3RyIiwgIm1hdHRlciIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJvcHRpb25zIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIm9wdGlvbnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAic3RyIiwgIm9wdGlvbnMiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZW5naW5lcyIsICJwYXJzZSIsICJtYXR0ZXIiLCAib3B0aW9ucyIsICJzdHIiLCAiTm90ZUxvYyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiZ2V0QXBpIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImUiLCAidCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJhcHAiLCAiYXNzZXJ0TmV2ZXIiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJmb2xkZXIiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiRmlsZUV4cGxvcmVyVmlldyIsICJGb2xkZXJJdGVtIiwgImltcG9ydF9vYnNpZGlhbiIsICJtYXR0ZXIiLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJvcHRpb25zIiwgImdldEFwaSIsICJnZXRBcGkiXQp9Cg==