diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index af74adc2..289c4966 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,7 +1,7 @@ { "theme": "obsidian", "cssTheme": "Minimal", - "baseFontSize": 19, + "baseFontSize": 20, "enabledCssSnippets": [ "pdf_darkmode", "query_header_title", diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index aaf3d4e6..e0760963 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -58,5 +58,6 @@ "obsidian-vimrc-support", "note-aliases", "obsidian-style-settings", - "number-headings-obsidian" + "number-headings-obsidian", + "calctex" ] \ No newline at end of file diff --git a/.obsidian/plugins/calctex/main.js b/.obsidian/plugins/calctex/main.js new file mode 100644 index 00000000..aa2f89b9 --- /dev/null +++ b/.obsidian/plugins/calctex/main.js @@ -0,0 +1,26114 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => CalctexPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian = require("obsidian"); + +// src/editor.ts +var import_language = require("@codemirror/language"); +var import_state = require("@codemirror/state"); +var import_view2 = require("@codemirror/view"); + +// src/widget.ts +var import_view = require("@codemirror/view"); +var ResultWidget = class extends import_view.WidgetType { + constructor(view, index, text) { + super(); + this.view = view; + this.index = index; + this.text = text; + } + toDOM(view) { + const div2 = document.createElement("span"); + div2.className = "result-text"; + div2.innerText = this.text; + div2.onclick = () => { + const transaction = view.state.update({ + changes: { + from: this.index, + to: this.index, + insert: this.text + } + }); + view.dispatch(transaction); + }; + return div2; + } +}; + +// node_modules/@cortex-js/compute-engine/dist/compute-engine.min.esm.js +var __create = Object.create; +var __defProp2 = Object.defineProperty; +var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; +var __getOwnPropNames2 = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp2 = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod2) => function __require() { + return mod2 || (0, cb[__getOwnPropNames2(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; +}; +var __copyProps2 = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps2( + // 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 || !mod2 || !mod2.__esModule ? __defProp2(target, "default", { value: mod2, enumerable: true }) : target, + mod2 +)); +var require_complex = __commonJS({ + "node_modules/complex.js/complex.js"(exports, module2) { + (function(root) { + "use strict"; + var cosh2 = Math.cosh || function(x) { + return Math.abs(x) < 1e-9 ? 1 - x : (Math.exp(x) + Math.exp(-x)) * 0.5; + }; + var sinh2 = Math.sinh || function(x) { + return Math.abs(x) < 1e-9 ? x : (Math.exp(x) - Math.exp(-x)) * 0.5; + }; + var cosm1 = function(x) { + var b = Math.PI / 4; + if (-b > x || x > b) { + return Math.cos(x) - 1; + } + var xx = x * x; + return xx * (xx * (xx * (xx * (xx * (xx * (xx * (xx / 20922789888e3 - 1 / 87178291200) + 1 / 479001600) - 1 / 3628800) + 1 / 40320) - 1 / 720) + 1 / 24) - 1 / 2); + }; + var hypot2 = function(x, y) { + var a = Math.abs(x); + var b = Math.abs(y); + if (a < 3e3 && b < 3e3) { + return Math.sqrt(a * a + b * b); + } + if (a < b) { + a = b; + b = x / y; + } else { + b = y / x; + } + return a * Math.sqrt(1 + b * b); + }; + var parser_exit = function() { + throw SyntaxError("Invalid Param"); + }; + function logHypot(a, b) { + var _a = Math.abs(a); + var _b = Math.abs(b); + if (a === 0) { + return Math.log(_b); + } + if (b === 0) { + return Math.log(_a); + } + if (_a < 3e3 && _b < 3e3) { + return Math.log(a * a + b * b) * 0.5; + } + a = a / 2; + b = b / 2; + return 0.5 * Math.log(a * a + b * b) + Math.LN2; + } + var parse = function(a, b) { + var z = { "re": 0, "im": 0 }; + if (a === void 0 || a === null) { + z["re"] = z["im"] = 0; + } else if (b !== void 0) { + z["re"] = a; + z["im"] = b; + } else + switch (typeof a) { + case "object": + if ("im" in a && "re" in a) { + z["re"] = a["re"]; + z["im"] = a["im"]; + } else if ("abs" in a && "arg" in a) { + if (!Number.isFinite(a["abs"]) && Number.isFinite(a["arg"])) { + return Complex20["INFINITY"]; + } + z["re"] = a["abs"] * Math.cos(a["arg"]); + z["im"] = a["abs"] * Math.sin(a["arg"]); + } else if ("r" in a && "phi" in a) { + if (!Number.isFinite(a["r"]) && Number.isFinite(a["phi"])) { + return Complex20["INFINITY"]; + } + z["re"] = a["r"] * Math.cos(a["phi"]); + z["im"] = a["r"] * Math.sin(a["phi"]); + } else if (a.length === 2) { + z["re"] = a[0]; + z["im"] = a[1]; + } else { + parser_exit(); + } + break; + case "string": + z["im"] = /* void */ + z["re"] = 0; + var tokens = a.match(/\d+\.?\d*e[+-]?\d+|\d+\.?\d*|\.\d+|./g); + var plus = 1; + var minus = 0; + if (tokens === null) { + parser_exit(); + } + for (var i = 0; i < tokens.length; i++) { + var c = tokens[i]; + if (c === " " || c === " " || c === "\n") { + } else if (c === "+") { + plus++; + } else if (c === "-") { + minus++; + } else if (c === "i" || c === "I") { + if (plus + minus === 0) { + parser_exit(); + } + if (tokens[i + 1] !== " " && !isNaN(tokens[i + 1])) { + z["im"] += parseFloat((minus % 2 ? "-" : "") + tokens[i + 1]); + i++; + } else { + z["im"] += parseFloat((minus % 2 ? "-" : "") + "1"); + } + plus = minus = 0; + } else { + if (plus + minus === 0 || isNaN(c)) { + parser_exit(); + } + if (tokens[i + 1] === "i" || tokens[i + 1] === "I") { + z["im"] += parseFloat((minus % 2 ? "-" : "") + c); + i++; + } else { + z["re"] += parseFloat((minus % 2 ? "-" : "") + c); + } + plus = minus = 0; + } + } + if (plus + minus > 0) { + parser_exit(); + } + break; + case "number": + z["im"] = 0; + z["re"] = a; + break; + default: + parser_exit(); + } + if (isNaN(z["re"]) || isNaN(z["im"])) { + } + return z; + }; + function Complex20(a, b) { + if (!(this instanceof Complex20)) { + return new Complex20(a, b); + } + var z = parse(a, b); + this["re"] = z["re"]; + this["im"] = z["im"]; + } + Complex20.prototype = { + "re": 0, + "im": 0, + /** + * Calculates the sign of a complex number, which is a normalized complex + * + * @returns {Complex} + */ + "sign": function() { + var abs2 = this["abs"](); + return new Complex20( + this["re"] / abs2, + this["im"] / abs2 + ); + }, + /** + * Adds two complex numbers + * + * @returns {Complex} + */ + "add": function(a, b) { + var z = new Complex20(a, b); + if (this["isInfinite"]() && z["isInfinite"]()) { + return Complex20["NAN"]; + } + if (this["isInfinite"]() || z["isInfinite"]()) { + return Complex20["INFINITY"]; + } + return new Complex20( + this["re"] + z["re"], + this["im"] + z["im"] + ); + }, + /** + * Subtracts two complex numbers + * + * @returns {Complex} + */ + "sub": function(a, b) { + var z = new Complex20(a, b); + if (this["isInfinite"]() && z["isInfinite"]()) { + return Complex20["NAN"]; + } + if (this["isInfinite"]() || z["isInfinite"]()) { + return Complex20["INFINITY"]; + } + return new Complex20( + this["re"] - z["re"], + this["im"] - z["im"] + ); + }, + /** + * Multiplies two complex numbers + * + * @returns {Complex} + */ + "mul": function(a, b) { + var z = new Complex20(a, b); + if (this["isInfinite"]() && z["isZero"]() || this["isZero"]() && z["isInfinite"]()) { + return Complex20["NAN"]; + } + if (this["isInfinite"]() || z["isInfinite"]()) { + return Complex20["INFINITY"]; + } + if (z["im"] === 0 && this["im"] === 0) { + return new Complex20(this["re"] * z["re"], 0); + } + return new Complex20( + this["re"] * z["re"] - this["im"] * z["im"], + this["re"] * z["im"] + this["im"] * z["re"] + ); + }, + /** + * Divides two complex numbers + * + * @returns {Complex} + */ + "div": function(a, b) { + var z = new Complex20(a, b); + if (this["isZero"]() && z["isZero"]() || this["isInfinite"]() && z["isInfinite"]()) { + return Complex20["NAN"]; + } + if (this["isInfinite"]() || z["isZero"]()) { + return Complex20["INFINITY"]; + } + if (this["isZero"]() || z["isInfinite"]()) { + return Complex20["ZERO"]; + } + a = this["re"]; + b = this["im"]; + var c = z["re"]; + var d = z["im"]; + var t, x; + if (0 === d) { + return new Complex20(a / c, b / c); + } + if (Math.abs(c) < Math.abs(d)) { + x = c / d; + t = c * x + d; + return new Complex20( + (a * x + b) / t, + (b * x - a) / t + ); + } else { + x = d / c; + t = d * x + c; + return new Complex20( + (a + b * x) / t, + (b - a * x) / t + ); + } + }, + /** + * Calculate the power of two complex numbers + * + * @returns {Complex} + */ + "pow": function(a, b) { + var z = new Complex20(a, b); + a = this["re"]; + b = this["im"]; + if (z["isZero"]()) { + return Complex20["ONE"]; + } + if (z["im"] === 0) { + if (b === 0 && a > 0) { + return new Complex20(Math.pow(a, z["re"]), 0); + } else if (a === 0) { + switch ((z["re"] % 4 + 4) % 4) { + case 0: + return new Complex20(Math.pow(b, z["re"]), 0); + case 1: + return new Complex20(0, Math.pow(b, z["re"])); + case 2: + return new Complex20(-Math.pow(b, z["re"]), 0); + case 3: + return new Complex20(0, -Math.pow(b, z["re"])); + } + } + } + if (a === 0 && b === 0 && z["re"] > 0 && z["im"] >= 0) { + return Complex20["ZERO"]; + } + var arg = Math.atan2(b, a); + var loh = logHypot(a, b); + a = Math.exp(z["re"] * loh - z["im"] * arg); + b = z["im"] * loh + z["re"] * arg; + return new Complex20( + a * Math.cos(b), + a * Math.sin(b) + ); + }, + /** + * Calculate the complex square root + * + * @returns {Complex} + */ + "sqrt": function() { + var a = this["re"]; + var b = this["im"]; + var r = this["abs"](); + var re, im; + if (a >= 0) { + if (b === 0) { + return new Complex20(Math.sqrt(a), 0); + } + re = 0.5 * Math.sqrt(2 * (r + a)); + } else { + re = Math.abs(b) / Math.sqrt(2 * (r - a)); + } + if (a <= 0) { + im = 0.5 * Math.sqrt(2 * (r - a)); + } else { + im = Math.abs(b) / Math.sqrt(2 * (r + a)); + } + return new Complex20(re, b < 0 ? -im : im); + }, + /** + * Calculate the complex exponent + * + * @returns {Complex} + */ + "exp": function() { + var tmp = Math.exp(this["re"]); + if (this["im"] === 0) { + } + return new Complex20( + tmp * Math.cos(this["im"]), + tmp * Math.sin(this["im"]) + ); + }, + /** + * Calculate the complex exponent and subtracts one. + * + * This may be more accurate than `Complex(x).exp().sub(1)` if + * `x` is small. + * + * @returns {Complex} + */ + "expm1": function() { + var a = this["re"]; + var b = this["im"]; + return new Complex20( + Math.expm1(a) * Math.cos(b) + cosm1(b), + Math.exp(a) * Math.sin(b) + ); + }, + /** + * Calculate the natural log + * + * @returns {Complex} + */ + "log": function() { + var a = this["re"]; + var b = this["im"]; + if (b === 0 && a > 0) { + } + return new Complex20( + logHypot(a, b), + Math.atan2(b, a) + ); + }, + /** + * Calculate the magnitude of the complex number + * + * @returns {number} + */ + "abs": function() { + return hypot2(this["re"], this["im"]); + }, + /** + * Calculate the angle of the complex number + * + * @returns {number} + */ + "arg": function() { + return Math.atan2(this["im"], this["re"]); + }, + /** + * Calculate the sine of the complex number + * + * @returns {Complex} + */ + "sin": function() { + var a = this["re"]; + var b = this["im"]; + return new Complex20( + Math.sin(a) * cosh2(b), + Math.cos(a) * sinh2(b) + ); + }, + /** + * Calculate the cosine + * + * @returns {Complex} + */ + "cos": function() { + var a = this["re"]; + var b = this["im"]; + return new Complex20( + Math.cos(a) * cosh2(b), + -Math.sin(a) * sinh2(b) + ); + }, + /** + * Calculate the tangent + * + * @returns {Complex} + */ + "tan": function() { + var a = 2 * this["re"]; + var b = 2 * this["im"]; + var d = Math.cos(a) + cosh2(b); + return new Complex20( + Math.sin(a) / d, + sinh2(b) / d + ); + }, + /** + * Calculate the cotangent + * + * @returns {Complex} + */ + "cot": function() { + var a = 2 * this["re"]; + var b = 2 * this["im"]; + var d = Math.cos(a) - cosh2(b); + return new Complex20( + -Math.sin(a) / d, + sinh2(b) / d + ); + }, + /** + * Calculate the secant + * + * @returns {Complex} + */ + "sec": function() { + var a = this["re"]; + var b = this["im"]; + var d = 0.5 * cosh2(2 * b) + 0.5 * Math.cos(2 * a); + return new Complex20( + Math.cos(a) * cosh2(b) / d, + Math.sin(a) * sinh2(b) / d + ); + }, + /** + * Calculate the cosecans + * + * @returns {Complex} + */ + "csc": function() { + var a = this["re"]; + var b = this["im"]; + var d = 0.5 * cosh2(2 * b) - 0.5 * Math.cos(2 * a); + return new Complex20( + Math.sin(a) * cosh2(b) / d, + -Math.cos(a) * sinh2(b) / d + ); + }, + /** + * Calculate the complex arcus sinus + * + * @returns {Complex} + */ + "asin": function() { + var a = this["re"]; + var b = this["im"]; + var t1 = new Complex20( + b * b - a * a + 1, + -2 * a * b + )["sqrt"](); + var t2 = new Complex20( + t1["re"] - b, + t1["im"] + a + )["log"](); + return new Complex20(t2["im"], -t2["re"]); + }, + /** + * Calculate the complex arcus cosinus + * + * @returns {Complex} + */ + "acos": function() { + var a = this["re"]; + var b = this["im"]; + var t1 = new Complex20( + b * b - a * a + 1, + -2 * a * b + )["sqrt"](); + var t2 = new Complex20( + t1["re"] - b, + t1["im"] + a + )["log"](); + return new Complex20(Math.PI / 2 - t2["im"], t2["re"]); + }, + /** + * Calculate the complex arcus tangent + * + * @returns {Complex} + */ + "atan": function() { + var a = this["re"]; + var b = this["im"]; + if (a === 0) { + if (b === 1) { + return new Complex20(0, Infinity); + } + if (b === -1) { + return new Complex20(0, -Infinity); + } + } + var d = a * a + (1 - b) * (1 - b); + var t1 = new Complex20( + (1 - b * b - a * a) / d, + -2 * a / d + ).log(); + return new Complex20(-0.5 * t1["im"], 0.5 * t1["re"]); + }, + /** + * Calculate the complex arcus cotangent + * + * @returns {Complex} + */ + "acot": function() { + var a = this["re"]; + var b = this["im"]; + if (b === 0) { + return new Complex20(Math.atan2(1, a), 0); + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).atan() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).atan(); + }, + /** + * Calculate the complex arcus secant + * + * @returns {Complex} + */ + "asec": function() { + var a = this["re"]; + var b = this["im"]; + if (a === 0 && b === 0) { + return new Complex20(0, Infinity); + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).acos() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).acos(); + }, + /** + * Calculate the complex arcus cosecans + * + * @returns {Complex} + */ + "acsc": function() { + var a = this["re"]; + var b = this["im"]; + if (a === 0 && b === 0) { + return new Complex20(Math.PI / 2, Infinity); + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).asin() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).asin(); + }, + /** + * Calculate the complex sinh + * + * @returns {Complex} + */ + "sinh": function() { + var a = this["re"]; + var b = this["im"]; + return new Complex20( + sinh2(a) * Math.cos(b), + cosh2(a) * Math.sin(b) + ); + }, + /** + * Calculate the complex cosh + * + * @returns {Complex} + */ + "cosh": function() { + var a = this["re"]; + var b = this["im"]; + return new Complex20( + cosh2(a) * Math.cos(b), + sinh2(a) * Math.sin(b) + ); + }, + /** + * Calculate the complex tanh + * + * @returns {Complex} + */ + "tanh": function() { + var a = 2 * this["re"]; + var b = 2 * this["im"]; + var d = cosh2(a) + Math.cos(b); + return new Complex20( + sinh2(a) / d, + Math.sin(b) / d + ); + }, + /** + * Calculate the complex coth + * + * @returns {Complex} + */ + "coth": function() { + var a = 2 * this["re"]; + var b = 2 * this["im"]; + var d = cosh2(a) - Math.cos(b); + return new Complex20( + sinh2(a) / d, + -Math.sin(b) / d + ); + }, + /** + * Calculate the complex coth + * + * @returns {Complex} + */ + "csch": function() { + var a = this["re"]; + var b = this["im"]; + var d = Math.cos(2 * b) - cosh2(2 * a); + return new Complex20( + -2 * sinh2(a) * Math.cos(b) / d, + 2 * cosh2(a) * Math.sin(b) / d + ); + }, + /** + * Calculate the complex sech + * + * @returns {Complex} + */ + "sech": function() { + var a = this["re"]; + var b = this["im"]; + var d = Math.cos(2 * b) + cosh2(2 * a); + return new Complex20( + 2 * cosh2(a) * Math.cos(b) / d, + -2 * sinh2(a) * Math.sin(b) / d + ); + }, + /** + * Calculate the complex asinh + * + * @returns {Complex} + */ + "asinh": function() { + var tmp = this["im"]; + this["im"] = -this["re"]; + this["re"] = tmp; + var res = this["asin"](); + this["re"] = -this["im"]; + this["im"] = tmp; + tmp = res["re"]; + res["re"] = -res["im"]; + res["im"] = tmp; + return res; + }, + /** + * Calculate the complex acosh + * + * @returns {Complex} + */ + "acosh": function() { + var res = this["acos"](); + if (res["im"] <= 0) { + var tmp = res["re"]; + res["re"] = -res["im"]; + res["im"] = tmp; + } else { + var tmp = res["im"]; + res["im"] = -res["re"]; + res["re"] = tmp; + } + return res; + }, + /** + * Calculate the complex atanh + * + * @returns {Complex} + */ + "atanh": function() { + var a = this["re"]; + var b = this["im"]; + var noIM = a > 1 && b === 0; + var oneMinus = 1 - a; + var onePlus = 1 + a; + var d = oneMinus * oneMinus + b * b; + var x = d !== 0 ? new Complex20( + (onePlus * oneMinus - b * b) / d, + (b * oneMinus + onePlus * b) / d + ) : new Complex20( + a !== -1 ? a / 0 : 0, + b !== 0 ? b / 0 : 0 + ); + var temp = x["re"]; + x["re"] = logHypot(x["re"], x["im"]) / 2; + x["im"] = Math.atan2(x["im"], temp) / 2; + if (noIM) { + x["im"] = -x["im"]; + } + return x; + }, + /** + * Calculate the complex acoth + * + * @returns {Complex} + */ + "acoth": function() { + var a = this["re"]; + var b = this["im"]; + if (a === 0 && b === 0) { + return new Complex20(0, Math.PI / 2); + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).atanh() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).atanh(); + }, + /** + * Calculate the complex acsch + * + * @returns {Complex} + */ + "acsch": function() { + var a = this["re"]; + var b = this["im"]; + if (b === 0) { + return new Complex20( + a !== 0 ? Math.log(a + Math.sqrt(a * a + 1)) : Infinity, + 0 + ); + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).asinh() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).asinh(); + }, + /** + * Calculate the complex asech + * + * @returns {Complex} + */ + "asech": function() { + var a = this["re"]; + var b = this["im"]; + if (this["isZero"]()) { + return Complex20["INFINITY"]; + } + var d = a * a + b * b; + return d !== 0 ? new Complex20( + a / d, + -b / d + ).acosh() : new Complex20( + a !== 0 ? a / 0 : 0, + b !== 0 ? -b / 0 : 0 + ).acosh(); + }, + /** + * Calculate the complex inverse 1/z + * + * @returns {Complex} + */ + "inverse": function() { + if (this["isZero"]()) { + return Complex20["INFINITY"]; + } + if (this["isInfinite"]()) { + return Complex20["ZERO"]; + } + var a = this["re"]; + var b = this["im"]; + var d = a * a + b * b; + return new Complex20(a / d, -b / d); + }, + /** + * Returns the complex conjugate + * + * @returns {Complex} + */ + "conjugate": function() { + return new Complex20(this["re"], -this["im"]); + }, + /** + * Gets the negated complex number + * + * @returns {Complex} + */ + "neg": function() { + return new Complex20(-this["re"], -this["im"]); + }, + /** + * Ceils the actual complex number + * + * @returns {Complex} + */ + "ceil": function(places) { + places = Math.pow(10, places || 0); + return new Complex20( + Math.ceil(this["re"] * places) / places, + Math.ceil(this["im"] * places) / places + ); + }, + /** + * Floors the actual complex number + * + * @returns {Complex} + */ + "floor": function(places) { + places = Math.pow(10, places || 0); + return new Complex20( + Math.floor(this["re"] * places) / places, + Math.floor(this["im"] * places) / places + ); + }, + /** + * Ceils the actual complex number + * + * @returns {Complex} + */ + "round": function(places) { + places = Math.pow(10, places || 0); + return new Complex20( + Math.round(this["re"] * places) / places, + Math.round(this["im"] * places) / places + ); + }, + /** + * Compares two complex numbers + * + * **Note:** new Complex(Infinity).equals(Infinity) === false + * + * @returns {boolean} + */ + "equals": function(a, b) { + var z = new Complex20(a, b); + return Math.abs(z["re"] - this["re"]) <= Complex20["EPSILON"] && Math.abs(z["im"] - this["im"]) <= Complex20["EPSILON"]; + }, + /** + * Clones the actual object + * + * @returns {Complex} + */ + "clone": function() { + return new Complex20(this["re"], this["im"]); + }, + /** + * Gets a string of the actual complex number + * + * @returns {string} + */ + "toString": function() { + var a = this["re"]; + var b = this["im"]; + var ret = ""; + if (this["isNaN"]()) { + return "NaN"; + } + if (this["isInfinite"]()) { + return "Infinity"; + } + if (Math.abs(a) < Complex20["EPSILON"]) { + a = 0; + } + if (Math.abs(b) < Complex20["EPSILON"]) { + b = 0; + } + if (b === 0) { + return ret + a; + } + if (a !== 0) { + ret += a; + ret += " "; + if (b < 0) { + b = -b; + ret += "-"; + } else { + ret += "+"; + } + ret += " "; + } else if (b < 0) { + b = -b; + ret += "-"; + } + if (1 !== b) { + ret += b; + } + return ret + "i"; + }, + /** + * Returns the actual number as a vector + * + * @returns {Array} + */ + "toVector": function() { + return [this["re"], this["im"]]; + }, + /** + * Returns the actual real value of the current object + * + * @returns {number|null} + */ + "valueOf": function() { + if (this["im"] === 0) { + return this["re"]; + } + return null; + }, + /** + * Determines whether a complex number is not on the Riemann sphere. + * + * @returns {boolean} + */ + "isNaN": function() { + return isNaN(this["re"]) || isNaN(this["im"]); + }, + /** + * Determines whether or not a complex number is at the zero pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + "isZero": function() { + return this["im"] === 0 && this["re"] === 0; + }, + /** + * Determines whether a complex number is not at the infinity pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + "isFinite": function() { + return isFinite(this["re"]) && isFinite(this["im"]); + }, + /** + * Determines whether or not a complex number is at the infinity pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + "isInfinite": function() { + return !(this["isNaN"]() || this["isFinite"]()); + } + }; + Complex20["ZERO"] = new Complex20(0, 0); + Complex20["ONE"] = new Complex20(1, 0); + Complex20["I"] = new Complex20(0, 1); + Complex20["PI"] = new Complex20(Math.PI, 0); + Complex20["E"] = new Complex20(Math.E, 0); + Complex20["INFINITY"] = new Complex20(Infinity, Infinity); + Complex20["NAN"] = new Complex20(NaN, NaN); + Complex20["EPSILON"] = 1e-15; + if (typeof define === "function" && define["amd"]) { + define([], function() { + return Complex20; + }); + } else if (typeof exports === "object") { + Object.defineProperty(Complex20, "__esModule", { "value": true }); + Complex20["default"] = Complex20; + Complex20["Complex"] = Complex20; + module2["exports"] = Complex20; + } else { + root["Complex"] = Complex20; + } + })(exports); + } +}); +function isSymbolEntry(entry) { + return "kind" in entry && entry.kind === "symbol"; +} +function isMatchfixEntry(entry) { + return "kind" in entry && entry.kind === "matchfix"; +} +function isInfixEntry(entry) { + return "kind" in entry && entry.kind === "infix"; +} +function isPrefixEntry(entry) { + return "kind" in entry && entry.kind === "prefix"; +} +function isPostfixEntry(entry) { + return "kind" in entry && entry.kind === "postfix"; +} +function isEnvironmentEntry(entry) { + return "kind" in entry && entry.kind === "environment"; +} +var EXP_LIMIT = 9e15; +var MAX_DIGITS = 1e9; +var NUMERALS = "0123456789abcdef"; +var LN10 = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058"; +var PI = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789"; +var DEFAULTS = { + // These values must be integers within the stated ranges (inclusive). + // Most of these values can be changed at run-time using the `Decimal.config` method. + // The maximum number of significant digits of the result of a calculation or base conversion. + // E.g. `Decimal.config({ precision: 20 });` + precision: 20, + // 1 to MAX_DIGITS + // The rounding mode used when rounding to `precision`. + // + // ROUND_UP 0 Away from zero. + // ROUND_DOWN 1 Towards zero. + // ROUND_CEIL 2 Towards +Infinity. + // ROUND_FLOOR 3 Towards -Infinity. + // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + // + // E.g. + // `Decimal.rounding = 4;` + // `Decimal.rounding = Decimal.ROUND_HALF_UP;` + rounding: 4, + // 0 to 8 + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 The IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. + // + // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian + // division (9) are commonly used for the modulus operation. The other rounding modes can also + // be used, but they may not give useful results. + modulo: 1, + // 0 to 9 + // The exponent value at and beneath which `toString` returns exponential notation. + // JavaScript numbers: -7 + toExpNeg: -7, + // 0 to -EXP_LIMIT + // The exponent value at and above which `toString` returns exponential notation. + // JavaScript numbers: 21 + toExpPos: 21, + // 0 to EXP_LIMIT + // The minimum exponent value, beneath which underflow to zero occurs. + // JavaScript numbers: -324 (5e-324) + minE: -EXP_LIMIT, + // -1 to -EXP_LIMIT + // The maximum exponent value, above which overflow to Infinity occurs. + // JavaScript numbers: 308 (1.7976931348623157e+308) + maxE: EXP_LIMIT, + // 1 to EXP_LIMIT + // Whether to use cryptographically-secure random number generation, if available. + crypto: false + // true/false +}; +var inexact; +var quadrant; +var external = true; +var decimalError = "[DecimalError] "; +var invalidArgument = decimalError + "Invalid argument: "; +var precisionLimitExceeded = decimalError + "Precision limit exceeded"; +var cryptoUnavailable = decimalError + "crypto unavailable"; +var tag = "[object Decimal]"; +var mathfloor = Math.floor; +var mathpow = Math.pow; +var isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i; +var isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i; +var isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i; +var isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; +var BASE = 1e7; +var LOG_BASE = 7; +var MAX_SAFE_INTEGER = 9007199254740991; +var LN10_PRECISION = LN10.length - 1; +var PI_PRECISION = PI.length - 1; +var P = { toStringTag: tag }; +P.absoluteValue = P.abs = function() { + var x = new this.constructor(this); + if (x.s < 0) + x.s = 1; + return finalise(x); +}; +P.ceil = function() { + return finalise(new this.constructor(this), this.e + 1, 2); +}; +P.clampedTo = P.clamp = function(min2, max2) { + var k, x = this, Ctor = x.constructor; + min2 = new Ctor(min2); + max2 = new Ctor(max2); + if (!min2.s || !max2.s) + return new Ctor(NaN); + if (min2.gt(max2)) + throw Error(invalidArgument + max2); + k = x.cmp(min2); + return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x); +}; +P.comparedTo = P.cmp = function(y) { + var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s; + if (!xd || !yd) { + return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; + } + if (!xd[0] || !yd[0]) + return xd[0] ? xs : yd[0] ? -ys : 0; + if (xs !== ys) + return xs; + if (x.e !== y.e) + return x.e > y.e ^ xs < 0 ? 1 : -1; + xdL = xd.length; + ydL = yd.length; + for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { + if (xd[i] !== yd[i]) + return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; + } + return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; +}; +P.cosine = P.cos = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.d) + return new Ctor(NaN); + if (!x.d[0]) + return new Ctor(1); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); +}; +P.cubeRoot = P.cbrt = function() { + var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) + return new Ctor(x); + external = false; + s = x.s * mathpow(x.s * x, 1 / 3); + if (!s || Math.abs(s) == 1 / 0) { + n = digitsToString(x.d); + e = x.e; + if (s = (e - n.length + 1) % 3) + n += s == 1 || s == -2 ? "0" : "00"; + s = mathpow(n, 1 / 3); + e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); + if (s == 1 / 0) { + n = "5e" + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf("e") + 1) + e; + } + r = new Ctor(n); + r.s = x.s; + } else { + r = new Ctor(s.toString()); + } + sd = (e = Ctor.precision) + 3; + for (; ; ) { + t = r; + t3 = t.times(t).times(t); + t3plusx = t3.plus(x); + r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + if (n == "9999" || !rep && n == "4999") { + if (!rep) { + finalise(t, e + 1, 0); + if (t.times(t).times(t).eq(x)) { + r = t; + break; + } + } + sd += 4; + rep = 1; + } else { + if (!+n || !+n.slice(1) && n.charAt(0) == "5") { + finalise(r, e + 1, 1); + m = !r.times(r).times(r).eq(x); + } + break; + } + } + } + external = true; + return finalise(r, e, Ctor.rounding, m); +}; +P.decimalPlaces = P.dp = function() { + var w, d = this.d, n = NaN; + if (d) { + w = d.length - 1; + n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; + w = d[w]; + if (w) + for (; w % 10 == 0; w /= 10) + n--; + if (n < 0) + n = 0; + } + return n; +}; +P.dividedBy = P.div = function(y) { + return divide(this, new this.constructor(y)); +}; +P.dividedToIntegerBy = P.divToInt = function(y) { + var x = this, Ctor = x.constructor; + return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); +}; +P.equals = P.eq = function(y) { + return this.cmp(y) === 0; +}; +P.floor = function() { + return finalise(new this.constructor(this), this.e + 1, 3); +}; +P.greaterThan = P.gt = function(y) { + return this.cmp(y) > 0; +}; +P.greaterThanOrEqualTo = P.gte = function(y) { + var k = this.cmp(y); + return k == 1 || k === 0; +}; +P.hyperbolicCosine = P.cosh = function() { + var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1); + if (!x.isFinite()) + return new Ctor(x.s ? 1 / 0 : NaN); + if (x.isZero()) + return one; + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + if (len < 32) { + k = Math.ceil(len / 3); + n = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + n = "2.3283064365386962890625e-10"; + } + x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); + var cosh2_x, i = k, d8 = new Ctor(8); + for (; i--; ) { + cosh2_x = x.times(x); + x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); + } + return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); +}; +P.hyperbolicSine = P.sinh = function() { + var k, pr, rm, len, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + if (len < 3) { + x = taylorSeries(Ctor, 2, x, x, true); + } else { + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x, true); + var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); + for (; k--; ) { + sinh2_x = x.times(x); + x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); + } + } + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(x, pr, rm, true); +}; +P.hyperbolicTangent = P.tanh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) + return new Ctor(x.s); + if (x.isZero()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 7; + Ctor.rounding = 1; + return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); +}; +P.inverseCosine = P.acos = function() { + var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding; + if (k !== -1) { + return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN); + } + if (x.isZero()) + return getPi(Ctor, pr + 4, rm).times(0.5); + Ctor.precision = pr + 6; + Ctor.rounding = 1; + x = x.asin(); + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + Ctor.precision = pr; + Ctor.rounding = rm; + return halfPi.minus(x); +}; +P.inverseHyperbolicCosine = P.acosh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (x.lte(1)) + return new Ctor(x.eq(1) ? 0 : NaN); + if (!x.isFinite()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; + Ctor.rounding = 1; + external = false; + x = x.times(x).minus(1).sqrt().plus(x); + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + return x.ln(); +}; +P.inverseHyperbolicSine = P.asinh = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite() || x.isZero()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; + Ctor.rounding = 1; + external = false; + x = x.times(x).plus(1).sqrt().plus(x); + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + return x.ln(); +}; +P.inverseHyperbolicTangent = P.atanh = function() { + var pr, rm, wpr, xsd, x = this, Ctor = x.constructor; + if (!x.isFinite()) + return new Ctor(NaN); + if (x.e >= 0) + return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); + pr = Ctor.precision; + rm = Ctor.rounding; + xsd = x.sd(); + if (Math.max(xsd, pr) < 2 * -x.e - 1) + return finalise(new Ctor(x), pr, rm, true); + Ctor.precision = wpr = xsd - x.e; + x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); + Ctor.precision = pr + 4; + Ctor.rounding = 1; + x = x.ln(); + Ctor.precision = pr; + Ctor.rounding = rm; + return x.times(0.5); +}; +P.inverseSine = P.asin = function() { + var halfPi, k, pr, rm, x = this, Ctor = x.constructor; + if (x.isZero()) + return new Ctor(x); + k = x.abs().cmp(1); + pr = Ctor.precision; + rm = Ctor.rounding; + if (k !== -1) { + if (k === 0) { + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + halfPi.s = x.s; + return halfPi; + } + return new Ctor(NaN); + } + Ctor.precision = pr + 6; + Ctor.rounding = 1; + x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); + Ctor.precision = pr; + Ctor.rounding = rm; + return x.times(2); +}; +P.inverseTangent = P.atan = function() { + var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding; + if (!x.isFinite()) { + if (!x.s) + return new Ctor(NaN); + if (pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.5); + r.s = x.s; + return r; + } + } else if (x.isZero()) { + return new Ctor(x); + } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.25); + r.s = x.s; + return r; + } + Ctor.precision = wpr = pr + 10; + Ctor.rounding = 1; + k = Math.min(28, wpr / LOG_BASE + 2 | 0); + for (i = k; i; --i) + x = x.div(x.times(x).plus(1).sqrt().plus(1)); + external = false; + j = Math.ceil(wpr / LOG_BASE); + n = 1; + x2 = x.times(x); + r = new Ctor(x); + px = x; + for (; i !== -1; ) { + px = px.times(x2); + t = r.minus(px.div(n += 2)); + px = px.times(x2); + r = t.plus(px.div(n += 2)); + if (r.d[j] !== void 0) + for (i = j; r.d[i] === t.d[i] && i--; ) + ; + } + if (k) + r = r.times(2 << k - 1); + external = true; + return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); +}; +P.isFinite = function() { + return !!this.d; +}; +P.isInteger = P.isInt = function() { + return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; +}; +P.isNaN = function() { + return !this.s; +}; +P.isNegative = P.isNeg = function() { + return this.s < 0; +}; +P.isPositive = P.isPos = function() { + return this.s > 0; +}; +P.isZero = function() { + return !!this.d && this.d[0] === 0; +}; +P.lessThan = P.lt = function(y) { + return this.cmp(y) < 0; +}; +P.lessThanOrEqualTo = P.lte = function(y) { + return this.cmp(y) < 1; +}; +P.logarithm = P.log = function(base) { + var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5; + if (base == null) { + base = new Ctor(10); + isBase10 = true; + } else { + base = new Ctor(base); + d = base.d; + if (base.s < 0 || !d || !d[0] || base.eq(1)) + return new Ctor(NaN); + isBase10 = base.eq(10); + } + d = arg.d; + if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { + return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); + } + if (isBase10) { + if (d.length > 1) { + inf = true; + } else { + for (k = d[0]; k % 10 === 0; ) + k /= 10; + inf = k !== 1; + } + } + external = false; + sd = pr + guard; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + if (checkRoundingDigits(r.d, k = pr, rm)) { + do { + sd += 10; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + if (!inf) { + if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + break; + } + } while (checkRoundingDigits(r.d, k += 10, rm)); + } + external = true; + return finalise(r, pr, rm); +}; +P.minus = P.sub = function(y) { + var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.d) { + if (!x.s || !y.s) + y = new Ctor(NaN); + else if (x.d) + y.s = -y.s; + else + y = new Ctor(y.d || x.s !== y.s ? x : NaN); + return y; + } + if (x.s != y.s) { + y.s = -y.s; + return x.plus(y); + } + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + if (!xd[0] || !yd[0]) { + if (yd[0]) + y.s = -y.s; + else if (xd[0]) + y = new Ctor(x); + else + return new Ctor(rm === 3 ? -0 : 0); + return external ? finalise(y, pr, rm) : y; + } + e = mathfloor(y.e / LOG_BASE); + xe = mathfloor(x.e / LOG_BASE); + xd = xd.slice(); + k = xe - e; + if (k) { + xLTy = k < 0; + if (xLTy) { + d = xd; + k = -k; + len = yd.length; + } else { + d = yd; + e = xe; + len = xd.length; + } + i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; + if (k > i) { + k = i; + d.length = 1; + } + d.reverse(); + for (i = k; i--; ) + d.push(0); + d.reverse(); + } else { + i = xd.length; + len = yd.length; + xLTy = i < len; + if (xLTy) + len = i; + for (i = 0; i < len; i++) { + if (xd[i] != yd[i]) { + xLTy = xd[i] < yd[i]; + break; + } + } + k = 0; + } + if (xLTy) { + d = xd; + xd = yd; + yd = d; + y.s = -y.s; + } + len = xd.length; + for (i = yd.length - len; i > 0; --i) + xd[len++] = 0; + for (i = yd.length; i > k; ) { + if (xd[--i] < yd[i]) { + for (j = i; j && xd[--j] === 0; ) + xd[j] = BASE - 1; + --xd[j]; + xd[i] += BASE; + } + xd[i] -= yd[i]; + } + for (; xd[--len] === 0; ) + xd.pop(); + for (; xd[0] === 0; xd.shift()) + --e; + if (!xd[0]) + return new Ctor(rm === 3 ? -0 : 0); + y.d = xd; + y.e = getBase10Exponent(xd, e); + return external ? finalise(y, pr, rm) : y; +}; +P.modulo = P.mod = function(y) { + var q, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.s || y.d && !y.d[0]) + return new Ctor(NaN); + if (!y.d || x.d && !x.d[0]) { + return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); + } + external = false; + if (Ctor.modulo == 9) { + q = divide(x, y.abs(), 0, 3, 1); + q.s *= y.s; + } else { + q = divide(x, y, 0, Ctor.modulo, 1); + } + q = q.times(y); + external = true; + return x.minus(q); +}; +P.naturalExponential = P.exp = function() { + return naturalExponential(this); +}; +P.naturalLogarithm = P.ln = function() { + return naturalLogarithm(this); +}; +P.negated = P.neg = function() { + var x = new this.constructor(this); + x.s = -x.s; + return finalise(x); +}; +P.plus = P.add = function(y) { + var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor; + y = new Ctor(y); + if (!x.d || !y.d) { + if (!x.s || !y.s) + y = new Ctor(NaN); + else if (!x.d) + y = new Ctor(y.d || x.s === y.s ? x : NaN); + return y; + } + if (x.s != y.s) { + y.s = -y.s; + return x.minus(y); + } + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + if (!xd[0] || !yd[0]) { + if (!yd[0]) + y = new Ctor(x); + return external ? finalise(y, pr, rm) : y; + } + k = mathfloor(x.e / LOG_BASE); + e = mathfloor(y.e / LOG_BASE); + xd = xd.slice(); + i = k - e; + if (i) { + if (i < 0) { + d = xd; + i = -i; + len = yd.length; + } else { + d = yd; + e = k; + len = xd.length; + } + k = Math.ceil(pr / LOG_BASE); + len = k > len ? k + 1 : len + 1; + if (i > len) { + i = len; + d.length = 1; + } + d.reverse(); + for (; i--; ) + d.push(0); + d.reverse(); + } + len = xd.length; + i = yd.length; + if (len - i < 0) { + i = len; + d = yd; + yd = xd; + xd = d; + } + for (carry = 0; i; ) { + carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; + xd[i] %= BASE; + } + if (carry) { + xd.unshift(carry); + ++e; + } + for (len = xd.length; xd[--len] == 0; ) + xd.pop(); + y.d = xd; + y.e = getBase10Exponent(xd, e); + return external ? finalise(y, pr, rm) : y; +}; +P.precision = P.sd = function(z) { + var k, x = this; + if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) + throw Error(invalidArgument + z); + if (x.d) { + k = getPrecision(x.d); + if (z && x.e + 1 > k) + k = x.e + 1; + } else { + k = NaN; + } + return k; +}; +P.round = function() { + var x = this, Ctor = x.constructor; + return finalise(new Ctor(x), x.e + 1, Ctor.rounding); +}; +P.sine = P.sin = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) + return new Ctor(NaN); + if (x.isZero()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + x = sine(Ctor, toLessThanHalfPi(Ctor, x)); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); +}; +P.squareRoot = P.sqrt = function() { + var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor; + if (s !== 1 || !d || !d[0]) { + return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); + } + external = false; + s = Math.sqrt(+x); + if (s == 0 || s == 1 / 0) { + n = digitsToString(d); + if ((n.length + e) % 2 == 0) + n += "0"; + s = Math.sqrt(n); + e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); + if (s == 1 / 0) { + n = "5e" + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf("e") + 1) + e; + } + r = new Ctor(n); + } else { + r = new Ctor(s.toString()); + } + sd = (e = Ctor.precision) + 3; + for (; ; ) { + t = r; + r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + if (n == "9999" || !rep && n == "4999") { + if (!rep) { + finalise(t, e + 1, 0); + if (t.times(t).eq(x)) { + r = t; + break; + } + } + sd += 4; + rep = 1; + } else { + if (!+n || !+n.slice(1) && n.charAt(0) == "5") { + finalise(r, e + 1, 1); + m = !r.times(r).eq(x); + } + break; + } + } + } + external = true; + return finalise(r, e, Ctor.rounding, m); +}; +P.tangent = P.tan = function() { + var pr, rm, x = this, Ctor = x.constructor; + if (!x.isFinite()) + return new Ctor(NaN); + if (x.isZero()) + return new Ctor(x); + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 10; + Ctor.rounding = 1; + x = x.sin(); + x.s = 1; + x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); + Ctor.precision = pr; + Ctor.rounding = rm; + return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); +}; +P.times = P.mul = function(y) { + var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d; + y.s *= x.s; + if (!xd || !xd[0] || !yd || !yd[0]) { + return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0); + } + e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); + xdL = xd.length; + ydL = yd.length; + if (xdL < ydL) { + r = xd; + xd = yd; + yd = r; + rL = xdL; + xdL = ydL; + ydL = rL; + } + r = []; + rL = xdL + ydL; + for (i = rL; i--; ) + r.push(0); + for (i = ydL; --i >= 0; ) { + carry = 0; + for (k = xdL + i; k > i; ) { + t = r[k] + yd[i] * xd[k - i - 1] + carry; + r[k--] = t % BASE | 0; + carry = t / BASE | 0; + } + r[k] = (r[k] + carry) % BASE | 0; + } + for (; !r[--rL]; ) + r.pop(); + if (carry) + ++e; + else + r.shift(); + y.d = r; + y.e = getBase10Exponent(r, e); + return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; +}; +P.toBinary = function(sd, rm) { + return toStringBinary(this, 2, sd, rm); +}; +P.toDecimalPlaces = P.toDP = function(dp, rm) { + var x = this, Ctor = x.constructor; + x = new Ctor(x); + if (dp === void 0) + return x; + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + return finalise(x, dp + x.e + 1, rm); +}; +P.toExponential = function(dp, rm) { + var str, x = this, Ctor = x.constructor; + if (dp === void 0) { + str = finiteToString(x, true); + } else { + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + x = finalise(new Ctor(x), dp + 1, rm); + str = finiteToString(x, true, dp + 1); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; +}; +P.toFixed = function(dp, rm) { + var str, y, x = this, Ctor = x.constructor; + if (dp === void 0) { + str = finiteToString(x); + } else { + checkInt32(dp, 0, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + y = finalise(new Ctor(x), dp + x.e + 1, rm); + str = finiteToString(y, false, dp + y.e + 1); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; +}; +P.toFraction = function(maxD) { + var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor; + if (!xd) + return new Ctor(x); + n1 = d0 = new Ctor(1); + d1 = n0 = new Ctor(0); + d = new Ctor(d1); + e = d.e = getPrecision(xd) - x.e - 1; + k = e % LOG_BASE; + d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); + if (maxD == null) { + maxD = e > 0 ? d : n1; + } else { + n = new Ctor(maxD); + if (!n.isInt() || n.lt(n1)) + throw Error(invalidArgument + n); + maxD = n.gt(d) ? e > 0 ? d : n1 : n; + } + external = false; + n = new Ctor(digitsToString(xd)); + pr = Ctor.precision; + Ctor.precision = e = xd.length * LOG_BASE * 2; + for (; ; ) { + q = divide(n, d, 0, 1, 1); + d2 = d0.plus(q.times(d1)); + if (d2.cmp(maxD) == 1) + break; + d0 = d1; + d1 = d2; + d2 = n1; + n1 = n0.plus(q.times(d2)); + n0 = d2; + d2 = d; + d = n.minus(q.times(d2)); + n = d2; + } + d2 = divide(maxD.minus(d0), d1, 0, 1, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0]; + Ctor.precision = pr; + external = true; + return r; +}; +P.toHexadecimal = P.toHex = function(sd, rm) { + return toStringBinary(this, 16, sd, rm); +}; +P.toNearest = function(y, rm) { + var x = this, Ctor = x.constructor; + x = new Ctor(x); + if (y == null) { + if (!x.d) + return x; + y = new Ctor(1); + rm = Ctor.rounding; + } else { + y = new Ctor(y); + if (rm === void 0) { + rm = Ctor.rounding; + } else { + checkInt32(rm, 0, 8); + } + if (!x.d) + return y.s ? x : y; + if (!y.d) { + if (y.s) + y.s = x.s; + return y; + } + } + if (y.d[0]) { + external = false; + x = divide(x, y, 0, rm, 1).times(y); + external = true; + finalise(x); + } else { + y.s = x.s; + x = y; + } + return x; +}; +P.toNumber = function() { + return +this; +}; +P.toOctal = function(sd, rm) { + return toStringBinary(this, 8, sd, rm); +}; +P.toPower = P.pow = function(y) { + var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y)); + if (!x.d || !y.d || !x.d[0] || !y.d[0]) + return new Ctor(mathpow(+x, yn)); + x = new Ctor(x); + if (x.eq(1)) + return x; + pr = Ctor.precision; + rm = Ctor.rounding; + if (y.eq(1)) + return finalise(x, pr, rm); + e = mathfloor(y.e / LOG_BASE); + if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { + r = intPow(Ctor, x, k, pr); + return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); + } + s = x.s; + if (s < 0) { + if (e < y.d.length - 1) + return new Ctor(NaN); + if ((y.d[e] & 1) == 0) + s = 1; + if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { + x.s = s; + return x; + } + } + k = mathpow(+x, yn); + e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log("0." + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + "").e; + if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) + return new Ctor(e > 0 ? s / 0 : 0); + external = false; + Ctor.rounding = x.s = 1; + k = Math.min(12, (e + "").length); + r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); + if (r.d) { + r = finalise(r, pr + 5, 1); + if (checkRoundingDigits(r.d, pr, rm)) { + e = pr + 10; + r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); + if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + } + } + r.s = s; + external = true; + Ctor.rounding = rm; + return finalise(r, pr, rm); +}; +P.toPrecision = function(sd, rm) { + var str, x = this, Ctor = x.constructor; + if (sd === void 0) { + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + } else { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + x = finalise(new Ctor(x), sd, rm); + str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); + } + return x.isNeg() && !x.isZero() ? "-" + str : str; +}; +P.toSignificantDigits = P.toSD = function(sd, rm) { + var x = this, Ctor = x.constructor; + if (sd === void 0) { + sd = Ctor.precision; + rm = Ctor.rounding; + } else { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + } + return finalise(new Ctor(x), sd, rm); +}; +P.toString = function() { + var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + return x.isNeg() && !x.isZero() ? "-" + str : str; +}; +P.truncated = P.trunc = function() { + return finalise(new this.constructor(this), this.e + 1, 1); +}; +P.valueOf = P.toJSON = function() { + var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + return x.isNeg() ? "-" + str : str; +}; +function digitsToString(d) { + var i, k, ws, indexOfLastWord = d.length - 1, str = "", w = d[0]; + if (indexOfLastWord > 0) { + str += w; + for (i = 1; i < indexOfLastWord; i++) { + ws = d[i] + ""; + k = LOG_BASE - ws.length; + if (k) + str += getZeroString(k); + str += ws; + } + w = d[i]; + ws = w + ""; + k = LOG_BASE - ws.length; + if (k) + str += getZeroString(k); + } else if (w === 0) { + return "0"; + } + for (; w % 10 === 0; ) + w /= 10; + return str + w; +} +function checkInt32(i, min2, max2) { + if (i !== ~~i || i < min2 || i > max2) { + throw Error(invalidArgument + i); + } +} +function checkRoundingDigits(d, i, rm, repeating) { + var di, k, r, rd; + for (k = d[0]; k >= 10; k /= 10) + --i; + if (--i < 0) { + i += LOG_BASE; + di = 0; + } else { + di = Math.ceil((i + 1) / LOG_BASE); + i %= LOG_BASE; + } + k = mathpow(10, LOG_BASE - i); + rd = d[di] % k | 0; + if (repeating == null) { + if (i < 3) { + if (i == 0) + rd = rd / 100 | 0; + else if (i == 1) + rd = rd / 10 | 0; + r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0; + } else { + r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; + } + } else { + if (i < 4) { + if (i == 0) + rd = rd / 1e3 | 0; + else if (i == 1) + rd = rd / 100 | 0; + else if (i == 2) + rd = rd / 10 | 0; + r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; + } else { + r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1; + } + } + return r; +} +function convertBase(str, baseIn, baseOut) { + var j, arr = [0], arrL, i = 0, strL = str.length; + for (; i < strL; ) { + for (arrL = arr.length; arrL--; ) + arr[arrL] *= baseIn; + arr[0] += NUMERALS.indexOf(str.charAt(i++)); + for (j = 0; j < arr.length; j++) { + if (arr[j] > baseOut - 1) { + if (arr[j + 1] === void 0) + arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + return arr.reverse(); +} +function cosine(Ctor, x) { + var k, len, y; + if (x.isZero()) + return x; + len = x.d.length; + if (len < 32) { + k = Math.ceil(len / 3); + y = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + y = "2.3283064365386962890625e-10"; + } + Ctor.precision += k; + x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); + for (var i = k; i--; ) { + var cos2x = x.times(x); + x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); + } + Ctor.precision -= k; + return x; +} +var divide = function() { + function multiplyInteger(x, k, base) { + var temp, carry = 0, i = x.length; + for (x = x.slice(); i--; ) { + temp = x[i] * k + carry; + x[i] = temp % base | 0; + carry = temp / base | 0; + } + if (carry) + x.unshift(carry); + return x; + } + function compare(a, b, aL, bL) { + var i, r; + if (aL != bL) { + r = aL > bL ? 1 : -1; + } else { + for (i = r = 0; i < aL; i++) { + if (a[i] != b[i]) { + r = a[i] > b[i] ? 1 : -1; + break; + } + } + } + return r; + } + function subtract2(a, b, aL, base) { + var i = 0; + for (; aL--; ) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + for (; !a[0] && a.length > 1; ) + a.shift(); + } + return function(x, y, pr, rm, dp, base) { + var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d; + if (!xd || !xd[0] || !yd || !yd[0]) { + return new Ctor( + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : ( + // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. + xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0 + ) + ); + } + if (base) { + logBase = 1; + e = x.e - y.e; + } else { + base = BASE; + logBase = LOG_BASE; + e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); + } + yL = yd.length; + xL = xd.length; + q = new Ctor(sign2); + qd = q.d = []; + for (i = 0; yd[i] == (xd[i] || 0); i++) + ; + if (yd[i] > (xd[i] || 0)) + e--; + if (pr == null) { + sd = pr = Ctor.precision; + rm = Ctor.rounding; + } else if (dp) { + sd = pr + (x.e - y.e) + 1; + } else { + sd = pr; + } + if (sd < 0) { + qd.push(1); + more = true; + } else { + sd = sd / logBase + 2 | 0; + i = 0; + if (yL == 1) { + k = 0; + yd = yd[0]; + sd++; + for (; (i < xL || k) && sd--; i++) { + t = k * base + (xd[i] || 0); + qd[i] = t / yd | 0; + k = t % yd | 0; + } + more = k || i < xL; + } else { + k = base / (yd[0] + 1) | 0; + if (k > 1) { + yd = multiplyInteger(yd, k, base); + xd = multiplyInteger(xd, k, base); + yL = yd.length; + xL = xd.length; + } + xi = yL; + rem = xd.slice(0, yL); + remL = rem.length; + for (; remL < yL; ) + rem[remL++] = 0; + yz = yd.slice(); + yz.unshift(0); + yd0 = yd[0]; + if (yd[1] >= base / 2) + ++yd0; + do { + k = 0; + cmp = compare(yd, rem, yL, remL); + if (cmp < 0) { + rem0 = rem[0]; + if (yL != remL) + rem0 = rem0 * base + (rem[1] || 0); + k = rem0 / yd0 | 0; + if (k > 1) { + if (k >= base) + k = base - 1; + prod = multiplyInteger(yd, k, base); + prodL = prod.length; + remL = rem.length; + cmp = compare(prod, rem, prodL, remL); + if (cmp == 1) { + k--; + subtract2(prod, yL < prodL ? yz : yd, prodL, base); + } + } else { + if (k == 0) + cmp = k = 1; + prod = yd.slice(); + } + prodL = prod.length; + if (prodL < remL) + prod.unshift(0); + subtract2(rem, prod, remL, base); + if (cmp == -1) { + remL = rem.length; + cmp = compare(yd, rem, yL, remL); + if (cmp < 1) { + k++; + subtract2(rem, yL < remL ? yz : yd, remL, base); + } + } + remL = rem.length; + } else if (cmp === 0) { + k++; + rem = [0]; + } + qd[i++] = k; + if (cmp && rem[0]) { + rem[remL++] = xd[xi] || 0; + } else { + rem = [xd[xi]]; + remL = 1; + } + } while ((xi++ < xL || rem[0] !== void 0) && sd--); + more = rem[0] !== void 0; + } + if (!qd[0]) + qd.shift(); + } + if (logBase == 1) { + q.e = e; + inexact = more; + } else { + for (i = 1, k = qd[0]; k >= 10; k /= 10) + i++; + q.e = i + e * logBase - 1; + finalise(q, dp ? pr + q.e + 1 : pr, rm, more); + } + return q; + }; +}(); +function finalise(x, sd, rm, isTruncated) { + var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor; + out: + if (sd != null) { + xd = x.d; + if (!xd) + return x; + for (digits = 1, k = xd[0]; k >= 10; k /= 10) + digits++; + i = sd - digits; + if (i < 0) { + i += LOG_BASE; + j = sd; + w = xd[xdi = 0]; + rd = w / mathpow(10, digits - j - 1) % 10 | 0; + } else { + xdi = Math.ceil((i + 1) / LOG_BASE); + k = xd.length; + if (xdi >= k) { + if (isTruncated) { + for (; k++ <= xdi; ) + xd.push(0); + w = rd = 0; + digits = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + w = k = xd[xdi]; + for (digits = 1; k >= 10; k /= 10) + digits++; + i %= LOG_BASE; + j = i - LOG_BASE + digits; + rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; + } + } + isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); + roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd. + (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7)); + if (sd < 1 || !xd[0]) { + xd.length = 0; + if (roundUp) { + sd -= x.e + 1; + xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); + x.e = -sd || 0; + } else { + xd[0] = x.e = 0; + } + return x; + } + if (i == 0) { + xd.length = xdi; + k = 1; + xdi--; + } else { + xd.length = xdi + 1; + k = mathpow(10, LOG_BASE - i); + xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; + } + if (roundUp) { + for (; ; ) { + if (xdi == 0) { + for (i = 1, j = xd[0]; j >= 10; j /= 10) + i++; + j = xd[0] += k; + for (k = 1; j >= 10; j /= 10) + k++; + if (i != k) { + x.e++; + if (xd[0] == BASE) + xd[0] = 1; + } + break; + } else { + xd[xdi] += k; + if (xd[xdi] != BASE) + break; + xd[xdi--] = 0; + k = 1; + } + } + } + for (i = xd.length; xd[--i] === 0; ) + xd.pop(); + } + if (external) { + if (x.e > Ctor.maxE) { + x.d = null; + x.e = NaN; + } else if (x.e < Ctor.minE) { + x.e = 0; + x.d = [0]; + } + } + return x; +} +function finiteToString(x, isExp, sd) { + if (!x.isFinite()) + return nonFiniteToString(x); + var k, e = x.e, str = digitsToString(x.d), len = str.length; + if (isExp) { + if (sd && (k = sd - len) > 0) { + str = str.charAt(0) + "." + str.slice(1) + getZeroString(k); + } else if (len > 1) { + str = str.charAt(0) + "." + str.slice(1); + } + str = str + (x.e < 0 ? "e" : "e+") + x.e; + } else if (e < 0) { + str = "0." + getZeroString(-e - 1) + str; + if (sd && (k = sd - len) > 0) + str += getZeroString(k); + } else if (e >= len) { + str += getZeroString(e + 1 - len); + if (sd && (k = sd - e - 1) > 0) + str = str + "." + getZeroString(k); + } else { + if ((k = e + 1) < len) + str = str.slice(0, k) + "." + str.slice(k); + if (sd && (k = sd - len) > 0) { + if (e + 1 === len) + str += "."; + str += getZeroString(k); + } + } + return str; +} +function getBase10Exponent(digits, e) { + var w = digits[0]; + for (e *= LOG_BASE; w >= 10; w /= 10) + e++; + return e; +} +function getLn10(Ctor, sd, pr) { + if (sd > LN10_PRECISION) { + external = true; + if (pr) + Ctor.precision = pr; + throw Error(precisionLimitExceeded); + } + return finalise(new Ctor(LN10), sd, 1, true); +} +function getPi(Ctor, sd, rm) { + if (sd > PI_PRECISION) + throw Error(precisionLimitExceeded); + return finalise(new Ctor(PI), sd, rm, true); +} +function getPrecision(digits) { + var w = digits.length - 1, len = w * LOG_BASE + 1; + w = digits[w]; + if (w) { + for (; w % 10 == 0; w /= 10) + len--; + for (w = digits[0]; w >= 10; w /= 10) + len++; + } + return len; +} +function getZeroString(k) { + var zs = ""; + for (; k--; ) + zs += "0"; + return zs; +} +function intPow(Ctor, x, n, pr) { + var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4); + external = false; + for (; ; ) { + if (n % 2) { + r = r.times(x); + if (truncate(r.d, k)) + isTruncated = true; + } + n = mathfloor(n / 2); + if (n === 0) { + n = r.d.length - 1; + if (isTruncated && r.d[n] === 0) + ++r.d[n]; + break; + } + x = x.times(x); + truncate(x.d, k); + } + external = true; + return r; +} +function isOdd(n) { + return n.d[n.d.length - 1] & 1; +} +function maxOrMin(Ctor, args, ltgt) { + var y, x = new Ctor(args[0]), i = 0; + for (; ++i < args.length; ) { + y = new Ctor(args[i]); + if (!y.s) { + x = y; + break; + } else if (x[ltgt](y)) { + x = y; + } + } + return x; +} +function naturalExponential(x, sd) { + var denominator, guard, j, pow3, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; + if (!x.d || !x.d[0] || x.e > 17) { + return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0); + } + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + t = new Ctor(0.03125); + while (x.e > -2) { + x = x.times(t); + k += 5; + } + guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; + wpr += guard; + denominator = pow3 = sum2 = new Ctor(1); + Ctor.precision = wpr; + for (; ; ) { + pow3 = finalise(pow3.times(x), wpr, 1); + denominator = denominator.times(++i); + t = sum2.plus(divide(pow3, denominator, wpr, 1)); + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { + j = k; + while (j--) + sum2 = finalise(sum2.times(sum2), wpr, 1); + if (sd == null) { + if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += 10; + denominator = pow3 = t = new Ctor(1); + i = 0; + rep++; + } else { + return finalise(sum2, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum2; + } + } + sum2 = t; + } +} +function naturalLogarithm(y, sd) { + var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; + if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { + return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); + } + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + Ctor.precision = wpr += guard; + c = digitsToString(xd); + c0 = c.charAt(0); + if (Math.abs(e = x.e) < 15e14) { + while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { + x = x.times(y); + c = digitsToString(x.d); + c0 = c.charAt(0); + n++; + } + e = x.e; + if (c0 > 1) { + x = new Ctor("0." + c); + e++; + } else { + x = new Ctor(c0 + "." + c.slice(1)); + } + } else { + t = getLn10(Ctor, wpr + 2, pr).times(e + ""); + x = naturalLogarithm(new Ctor(c0 + "." + c.slice(1)), wpr - guard).plus(t); + Ctor.precision = pr; + return sd == null ? finalise(x, pr, rm, external = true) : x; + } + x1 = x; + sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = 3; + for (; ; ) { + numerator = finalise(numerator.times(x2), wpr, 1); + t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1)); + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { + sum2 = sum2.times(2); + if (e !== 0) + sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + "")); + sum2 = divide(sum2, new Ctor(n), wpr, 1); + if (sd == null) { + if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += guard; + t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = rep = 1; + } else { + return finalise(sum2, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum2; + } + } + sum2 = t; + denominator += 2; + } +} +function nonFiniteToString(x) { + return String(x.s * x.s / 0); +} +function parseDecimal(x, str) { + var e, i, len; + if ((e = str.indexOf(".")) > -1) + str = str.replace(".", ""); + if ((i = str.search(/e/i)) > 0) { + if (e < 0) + e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + e = str.length; + } + for (i = 0; str.charCodeAt(i) === 48; i++) + ; + for (len = str.length; str.charCodeAt(len - 1) === 48; --len) + ; + str = str.slice(i, len); + if (str) { + len -= i; + x.e = e = e - i - 1; + x.d = []; + i = (e + 1) % LOG_BASE; + if (e < 0) + i += LOG_BASE; + if (i < len) { + if (i) + x.d.push(+str.slice(0, i)); + for (len -= LOG_BASE; i < len; ) + x.d.push(+str.slice(i, i += LOG_BASE)); + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + for (; i--; ) + str += "0"; + x.d.push(+str); + if (external) { + if (x.e > x.constructor.maxE) { + x.d = null; + x.e = NaN; + } else if (x.e < x.constructor.minE) { + x.e = 0; + x.d = [0]; + } + } + } else { + x.e = 0; + x.d = [0]; + } + return x; +} +function parseOther(x, str) { + var base, Ctor, divisor, i, isFloat, len, p, xd, xe; + if (str.indexOf("_") > -1) { + str = str.replace(/(\d)_(?=\d)/g, "$1"); + if (isDecimal.test(str)) + return parseDecimal(x, str); + } else if (str === "Infinity" || str === "NaN") { + if (!+str) + x.s = NaN; + x.e = NaN; + x.d = null; + return x; + } + if (isHex.test(str)) { + base = 16; + str = str.toLowerCase(); + } else if (isBinary.test(str)) { + base = 2; + } else if (isOctal.test(str)) { + base = 8; + } else { + throw Error(invalidArgument + str); + } + i = str.search(/p/i); + if (i > 0) { + p = +str.slice(i + 1); + str = str.substring(2, i); + } else { + str = str.slice(2); + } + i = str.indexOf("."); + isFloat = i >= 0; + Ctor = x.constructor; + if (isFloat) { + str = str.replace(".", ""); + len = str.length; + i = len - i; + divisor = intPow(Ctor, new Ctor(base), i, i * 2); + } + xd = convertBase(str, base, BASE); + xe = xd.length - 1; + for (i = xe; xd[i] === 0; --i) + xd.pop(); + if (i < 0) + return new Ctor(x.s * 0); + x.e = getBase10Exponent(xd, xe); + x.d = xd; + external = false; + if (isFloat) + x = divide(x, divisor, len * 4); + if (p) + x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); + external = true; + return x; +} +function sine(Ctor, x) { + var k, len = x.d.length; + if (len < 3) { + return x.isZero() ? x : taylorSeries(Ctor, 2, x, x); + } + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x); + var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); + for (; k--; ) { + sin2_x = x.times(x); + x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); + } + return x; +} +function taylorSeries(Ctor, n, x, y, isHyperbolic) { + var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE); + external = false; + x2 = x.times(x); + u = new Ctor(y); + for (; ; ) { + t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); + u = isHyperbolic ? y.plus(t) : y.minus(t); + y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); + t = u.plus(y); + if (t.d[k] !== void 0) { + for (j = k; t.d[j] === u.d[j] && j--; ) + ; + if (j == -1) + break; + } + j = u; + u = y; + y = t; + t = j; + i++; + } + external = true; + t.d.length = k + 1; + return t; +} +function tinyPow(b, e) { + var n = b; + while (--e) + n *= b; + return n; +} +function toLessThanHalfPi(Ctor, x) { + var t, isNeg2 = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5); + x = x.abs(); + if (x.lte(halfPi)) { + quadrant = isNeg2 ? 4 : 1; + return x; + } + t = x.divToInt(pi); + if (t.isZero()) { + quadrant = isNeg2 ? 3 : 2; + } else { + x = x.minus(t.times(pi)); + if (x.lte(halfPi)) { + quadrant = isOdd(t) ? isNeg2 ? 2 : 3 : isNeg2 ? 4 : 1; + return x; + } + quadrant = isOdd(t) ? isNeg2 ? 1 : 4 : isNeg2 ? 3 : 2; + } + return x.minus(pi).abs(); +} +function toStringBinary(x, baseOut, sd, rm) { + var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0; + if (isExp) { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) + rm = Ctor.rounding; + else + checkInt32(rm, 0, 8); + } else { + sd = Ctor.precision; + rm = Ctor.rounding; + } + if (!x.isFinite()) { + str = nonFiniteToString(x); + } else { + str = finiteToString(x); + i = str.indexOf("."); + if (isExp) { + base = 2; + if (baseOut == 16) { + sd = sd * 4 - 3; + } else if (baseOut == 8) { + sd = sd * 3 - 2; + } + } else { + base = baseOut; + } + if (i >= 0) { + str = str.replace(".", ""); + y = new Ctor(1); + y.e = str.length - i; + y.d = convertBase(finiteToString(y), 10, base); + y.e = y.d.length; + } + xd = convertBase(str, 10, base); + e = len = xd.length; + for (; xd[--len] == 0; ) + xd.pop(); + if (!xd[0]) { + str = isExp ? "0p+0" : "0"; + } else { + if (i < 0) { + e--; + } else { + x = new Ctor(x); + x.d = xd; + x.e = e; + x = divide(x, y, sd, rm, 0, base); + xd = x.d; + e = x.e; + roundUp = inexact; + } + i = xd[sd]; + k = base / 2; + roundUp = roundUp || xd[sd + 1] !== void 0; + roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7)); + xd.length = sd; + if (roundUp) { + for (; ++xd[--sd] > base - 1; ) { + xd[sd] = 0; + if (!sd) { + ++e; + xd.unshift(1); + } + } + } + for (len = xd.length; !xd[len - 1]; --len) + ; + for (i = 0, str = ""; i < len; i++) + str += NUMERALS.charAt(xd[i]); + if (isExp) { + if (len > 1) { + if (baseOut == 16 || baseOut == 8) { + i = baseOut == 16 ? 4 : 3; + for (--len; len % i; len++) + str += "0"; + xd = convertBase(str, base, baseOut); + for (len = xd.length; !xd[len - 1]; --len) + ; + for (i = 1, str = "1."; i < len; i++) + str += NUMERALS.charAt(xd[i]); + } else { + str = str.charAt(0) + "." + str.slice(1); + } + } + str = str + (e < 0 ? "p" : "p+") + e; + } else if (e < 0) { + for (; ++e; ) + str = "0" + str; + str = "0." + str; + } else { + if (++e > len) + for (e -= len; e--; ) + str += "0"; + else if (e < len) + str = str.slice(0, e) + "." + str.slice(e); + } + } + str = (baseOut == 16 ? "0x" : baseOut == 2 ? "0b" : baseOut == 8 ? "0o" : "") + str; + } + return x.s < 0 ? "-" + str : str; +} +function truncate(arr, len) { + if (arr.length > len) { + arr.length = len; + return true; + } +} +function abs(x) { + return new this(x).abs(); +} +function acos(x) { + return new this(x).acos(); +} +function acosh(x) { + return new this(x).acosh(); +} +function add(x, y) { + return new this(x).plus(y); +} +function asin(x) { + return new this(x).asin(); +} +function asinh(x) { + return new this(x).asinh(); +} +function atan(x) { + return new this(x).atan(); +} +function atanh(x) { + return new this(x).atanh(); +} +function atan2(y, x) { + y = new this(y); + x = new this(x); + var r, pr = this.precision, rm = this.rounding, wpr = pr + 4; + if (!y.s || !x.s) { + r = new this(NaN); + } else if (!y.d && !x.d) { + r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); + r.s = y.s; + } else if (!x.d || y.isZero()) { + r = x.s < 0 ? getPi(this, pr, rm) : new this(0); + r.s = y.s; + } else if (!y.d || x.isZero()) { + r = getPi(this, wpr, 1).times(0.5); + r.s = y.s; + } else if (x.s < 0) { + this.precision = wpr; + this.rounding = 1; + r = this.atan(divide(y, x, wpr, 1)); + x = getPi(this, wpr, 1); + this.precision = pr; + this.rounding = rm; + r = y.s < 0 ? r.minus(x) : r.plus(x); + } else { + r = this.atan(divide(y, x, wpr, 1)); + } + return r; +} +function cbrt(x) { + return new this(x).cbrt(); +} +function ceil(x) { + return finalise(x = new this(x), x.e + 1, 2); +} +function clamp(x, min2, max2) { + return new this(x).clamp(min2, max2); +} +function config(obj) { + if (!obj || typeof obj !== "object") + throw Error(decimalError + "Object expected"); + var i, p, v, useDefaults = obj.defaults === true, ps = [ + "precision", + 1, + MAX_DIGITS, + "rounding", + 0, + 8, + "toExpNeg", + -EXP_LIMIT, + 0, + "toExpPos", + 0, + EXP_LIMIT, + "maxE", + 0, + EXP_LIMIT, + "minE", + -EXP_LIMIT, + 0, + "modulo", + 0, + 9 + ]; + for (i = 0; i < ps.length; i += 3) { + if (p = ps[i], useDefaults) + this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) + this[p] = v; + else + throw Error(invalidArgument + p + ": " + v); + } + } + if (p = "crypto", useDefaults) + this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (v === true || v === false || v === 0 || v === 1) { + if (v) { + if (typeof crypto != "undefined" && crypto && (crypto.getRandomValues || crypto.randomBytes)) { + this[p] = true; + } else { + throw Error(cryptoUnavailable); + } + } else { + this[p] = false; + } + } else { + throw Error(invalidArgument + p + ": " + v); + } + } + return this; +} +function cos(x) { + return new this(x).cos(); +} +function cosh(x) { + return new this(x).cosh(); +} +function clone(obj) { + var i, p, ps; + function Decimal2(v) { + var e, i2, t, x = this; + if (!(x instanceof Decimal2)) + return new Decimal2(v); + x.constructor = Decimal2; + if (isDecimalInstance(v)) { + x.s = v.s; + if (external) { + if (!v.d || v.e > Decimal2.maxE) { + x.e = NaN; + x.d = null; + } else if (v.e < Decimal2.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = v.e; + x.d = v.d.slice(); + } + } else { + x.e = v.e; + x.d = v.d ? v.d.slice() : v.d; + } + return; + } + t = typeof v; + if (t === "number") { + if (v === 0) { + x.s = 1 / v < 0 ? -1 : 1; + x.e = 0; + x.d = [0]; + return; + } + if (v < 0) { + v = -v; + x.s = -1; + } else { + x.s = 1; + } + if (v === ~~v && v < 1e7) { + for (e = 0, i2 = v; i2 >= 10; i2 /= 10) + e++; + if (external) { + if (e > Decimal2.maxE) { + x.e = NaN; + x.d = null; + } else if (e < Decimal2.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = e; + x.d = [v]; + } + } else { + x.e = e; + x.d = [v]; + } + return; + } else if (v * 0 !== 0) { + if (!v) + x.s = NaN; + x.e = NaN; + x.d = null; + return; + } + return parseDecimal(x, v.toString()); + } else if (t !== "string") { + throw Error(invalidArgument + v); + } + if ((i2 = v.charCodeAt(0)) === 45) { + v = v.slice(1); + x.s = -1; + } else { + if (i2 === 43) + v = v.slice(1); + x.s = 1; + } + return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); + } + Decimal2.prototype = P; + Decimal2.ROUND_UP = 0; + Decimal2.ROUND_DOWN = 1; + Decimal2.ROUND_CEIL = 2; + Decimal2.ROUND_FLOOR = 3; + Decimal2.ROUND_HALF_UP = 4; + Decimal2.ROUND_HALF_DOWN = 5; + Decimal2.ROUND_HALF_EVEN = 6; + Decimal2.ROUND_HALF_CEIL = 7; + Decimal2.ROUND_HALF_FLOOR = 8; + Decimal2.EUCLID = 9; + Decimal2.config = Decimal2.set = config; + Decimal2.clone = clone; + Decimal2.isDecimal = isDecimalInstance; + Decimal2.abs = abs; + Decimal2.acos = acos; + Decimal2.acosh = acosh; + Decimal2.add = add; + Decimal2.asin = asin; + Decimal2.asinh = asinh; + Decimal2.atan = atan; + Decimal2.atanh = atanh; + Decimal2.atan2 = atan2; + Decimal2.cbrt = cbrt; + Decimal2.ceil = ceil; + Decimal2.clamp = clamp; + Decimal2.cos = cos; + Decimal2.cosh = cosh; + Decimal2.div = div; + Decimal2.exp = exp; + Decimal2.floor = floor; + Decimal2.hypot = hypot; + Decimal2.ln = ln; + Decimal2.log = log; + Decimal2.log10 = log10; + Decimal2.log2 = log2; + Decimal2.max = max; + Decimal2.min = min; + Decimal2.mod = mod; + Decimal2.mul = mul; + Decimal2.pow = pow; + Decimal2.random = random; + Decimal2.round = round; + Decimal2.sign = sign; + Decimal2.sin = sin; + Decimal2.sinh = sinh; + Decimal2.sqrt = sqrt; + Decimal2.sub = sub; + Decimal2.sum = sum; + Decimal2.tan = tan; + Decimal2.tanh = tanh; + Decimal2.trunc = trunc; + if (obj === void 0) + obj = {}; + if (obj) { + if (obj.defaults !== true) { + ps = ["precision", "rounding", "toExpNeg", "toExpPos", "maxE", "minE", "modulo", "crypto"]; + for (i = 0; i < ps.length; ) + if (!obj.hasOwnProperty(p = ps[i++])) + obj[p] = this[p]; + } + } + Decimal2.config(obj); + return Decimal2; +} +function div(x, y) { + return new this(x).div(y); +} +function exp(x) { + return new this(x).exp(); +} +function floor(x) { + return finalise(x = new this(x), x.e + 1, 3); +} +function hypot() { + var i, n, t = new this(0); + external = false; + for (i = 0; i < arguments.length; ) { + n = new this(arguments[i++]); + if (!n.d) { + if (n.s) { + external = true; + return new this(1 / 0); + } + t = n; + } else if (t.d) { + t = t.plus(n.times(n)); + } + } + external = true; + return t.sqrt(); +} +function isDecimalInstance(obj) { + return obj instanceof Decimal || obj && obj.toStringTag === tag || false; +} +function ln(x) { + return new this(x).ln(); +} +function log(x, y) { + return new this(x).log(y); +} +function log2(x) { + return new this(x).log(2); +} +function log10(x) { + return new this(x).log(10); +} +function max() { + return maxOrMin(this, arguments, "lt"); +} +function min() { + return maxOrMin(this, arguments, "gt"); +} +function mod(x, y) { + return new this(x).mod(y); +} +function mul(x, y) { + return new this(x).mul(y); +} +function pow(x, y) { + return new this(x).pow(y); +} +function random(sd) { + var d, e, k, n, i = 0, r = new this(1), rd = []; + if (sd === void 0) + sd = this.precision; + else + checkInt32(sd, 1, MAX_DIGITS); + k = Math.ceil(sd / LOG_BASE); + if (!this.crypto) { + for (; i < k; ) + rd[i++] = Math.random() * 1e7 | 0; + } else if (crypto.getRandomValues) { + d = crypto.getRandomValues(new Uint32Array(k)); + for (; i < k; ) { + n = d[i]; + if (n >= 429e7) { + d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; + } else { + rd[i++] = n % 1e7; + } + } + } else if (crypto.randomBytes) { + d = crypto.randomBytes(k *= 4); + for (; i < k; ) { + n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24); + if (n >= 214e7) { + crypto.randomBytes(4).copy(d, i); + } else { + rd.push(n % 1e7); + i += 4; + } + } + i = k / 4; + } else { + throw Error(cryptoUnavailable); + } + k = rd[--i]; + sd %= LOG_BASE; + if (k && sd) { + n = mathpow(10, LOG_BASE - sd); + rd[i] = (k / n | 0) * n; + } + for (; rd[i] === 0; i--) + rd.pop(); + if (i < 0) { + e = 0; + rd = [0]; + } else { + e = -1; + for (; rd[0] === 0; e -= LOG_BASE) + rd.shift(); + for (k = 1, n = rd[0]; n >= 10; n /= 10) + k++; + if (k < LOG_BASE) + e -= LOG_BASE - k; + } + r.e = e; + r.d = rd; + return r; +} +function round(x) { + return finalise(x = new this(x), x.e + 1, this.rounding); +} +function sign(x) { + x = new this(x); + return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN; +} +function sin(x) { + return new this(x).sin(); +} +function sinh(x) { + return new this(x).sinh(); +} +function sqrt(x) { + return new this(x).sqrt(); +} +function sub(x, y) { + return new this(x).sub(y); +} +function sum() { + var i = 0, args = arguments, x = new this(args[i]); + external = false; + for (; x.s && ++i < args.length; ) + x = x.plus(args[i]); + external = true; + return finalise(x, this.precision, this.rounding); +} +function tan(x) { + return new this(x).tan(); +} +function tanh(x) { + return new this(x).tanh(); +} +function trunc(x) { + return finalise(x = new this(x), x.e + 1, 1); +} +P[Symbol.for("nodejs.util.inspect.custom")] = P.toString; +P[Symbol.toStringTag] = "Decimal"; +var Decimal = P.constructor = clone(DEFAULTS); +LN10 = new Decimal(LN10); +PI = new Decimal(PI); +var decimal_default = Decimal; +var import_complex20 = __toESM(require_complex()); +function stringToCodepoints(string) { + const result = []; + for (let i = 0; i < string.length; i++) { + let code = string.charCodeAt(i); + if (code >= 55296 && code <= 56319) { + const nextCode = string.charCodeAt(i + 1); + if (nextCode >= 56320 && nextCode <= 57343) { + const lead = code - 55296; + const trail = nextCode - 56320; + code = 2 ** 16 + lead * 2 ** 10 + trail; + i++; + } + } + result.push(code); + } + return result; +} +var ZWJ = 8205; +var REGIONAL_INDICATOR = [127462, 127487]; +function isEmojiCombinator(code) { + if (code === ZWJ) + return true; + if (code === 65038 || code === 65039) + return true; + if (code >= 127995 && code <= 127995 + 5) + return true; + if (code >= 129456 && code <= 129456 + 4) + return true; + if (code >= 917536 && code <= 917536 + 96) + return true; + return false; +} +function isRegionalIndicator(code) { + return code >= REGIONAL_INDICATOR[0] && code <= REGIONAL_INDICATOR[1]; +} +function splitGraphemes(string) { + if (/^[\u0020-\u00FF]*$/.test(string)) + return string; + const result = []; + const codePoints = stringToCodepoints(string); + let index = 0; + while (index < codePoints.length) { + const code = codePoints[index++]; + const next = codePoints[index]; + if (next === ZWJ) { + const baseIndex = index - 1; + index += 2; + while (codePoints[index] === ZWJ) { + index += 2; + } + result.push( + String.fromCodePoint( + ...codePoints.slice(baseIndex, 2 * index - baseIndex + 1) + ) + ); + } else if (isEmojiCombinator(next)) { + const baseIndex = index - 1; + while (isEmojiCombinator(codePoints[index])) { + index += codePoints[index] === ZWJ ? 2 : 1; + } + result.push( + String.fromCodePoint( + ...codePoints.slice(baseIndex, 2 * index - baseIndex - 1) + ) + ); + } else if (isRegionalIndicator(code)) { + index += 1; + result.push(String.fromCodePoint(...codePoints.slice(index - 2, 2))); + } else { + result.push(String.fromCodePoint(code)); + } + } + return result; +} +var Tokenizer = class { + constructor(s) { + this.obeyspaces = false; + s = s.replace(/[\u200E\u200F\u2066-\u2069\u202A-\u202E]/g, ""); + this.s = splitGraphemes(s); + this.pos = 0; + } + /** + * @return True if we reached the end of the stream + */ + end() { + return this.pos >= this.s.length; + } + /** + * Return the next char and advance + */ + get() { + return this.pos < this.s.length ? this.s[this.pos++] : ""; + } + /** + * Return the next char, but do not advance + */ + peek() { + return this.s[this.pos]; + } + /** + * Return the next substring matching regEx and advance. + */ + match(regEx) { + let execResult; + if (typeof this.s === "string") { + execResult = regEx.exec(this.s.slice(this.pos)); + } else { + execResult = regEx.exec(this.s.slice(this.pos).join("")); + } + if (execResult == null ? void 0 : execResult[0]) { + this.pos += execResult[0].length; + return execResult[0]; + } + return null; + } + /** + * Return the next token, or null. + */ + next() { + if (this.end()) + return null; + if (!this.obeyspaces && this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]+/)) { + return ""; + } else if (this.obeyspaces && this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]/)) { + return ""; + } + const next = this.get(); + if (next === "\\") { + if (!this.end()) { + let command = this.match(/^[a-zA-Z*]+/); + if (command) { + this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]*/); + } else { + command = this.get(); + if (command === " ") { + return ""; + } + } + return "\\" + command; + } + } else if (next === "{") { + return "<{>"; + } else if (next === "}") { + return "<}>"; + } else if (next === "^") { + if (this.peek() === "^") { + this.get(); + const hex = this.match( + /^(\^(\^(\^(\^[0-9a-f])?[0-9a-f])?[0-9a-f])?[0-9a-f])?[0-9a-f][0-9a-f]/ + ); + if (hex) { + return String.fromCodePoint( + parseInt(hex.slice(hex.lastIndexOf("^") + 1), 16) + ); + } + } + return next; + } else if (next === "#") { + if (!this.end()) { + let isParam = false; + if (/[0-9?]/.test(this.peek())) { + isParam = true; + if (this.pos + 1 < this.s.length) { + const after = this.s[this.pos + 1]; + isParam = /[^0-9A-Za-z]/.test(after); + } + } + if (isParam) { + return "#" + this.get(); + } + return "#"; + } + } else if (next === "$") { + if (this.peek() === "$") { + this.get(); + return "<$$>"; + } + return "<$>"; + } + return next; + } +}; +function expand(lex2, args) { + var _a, _b, _c, _d; + let token = lex2.next(); + if (!token) + return []; + let result = []; + if (token === "\\relax") { + } else if (token === "\\noexpand") { + token = lex2.next(); + if (token) { + result.push(token); + } + } else if (token === "\\obeyspaces") { + lex2.obeyspaces = true; + } else if (token === "\\space" || token === "~") { + result.push(""); + } else if (token === "\\bgroup") { + result.push("<{>"); + } else if (token === "\\egroup") { + result.push("<}>"); + } else if (token === "\\string") { + token = lex2.next(); + if (token) { + if (token[0] === "\\") { + Array.from(token).forEach( + (x) => result.push(x === "\\" ? "\\backslash" : x) + ); + } else if (token === "<{>") { + result.push("\\{"); + } else if (token === "") { + result.push("~"); + } else if (token === "<}>") { + result.push("\\}"); + } + } + } else if (token === "\\csname") { + while (lex2.peek() === "") { + lex2.next(); + } + let command = ""; + let done = false; + let tokens = []; + do { + if (tokens.length === 0) { + if (/^#[0-9?]$/.test(lex2.peek())) { + const param = lex2.get().slice(1); + tokens = tokenize( + (_b = (_a = args == null ? void 0 : args[param]) != null ? _a : args == null ? void 0 : args["?"]) != null ? _b : "\\placeholder{}", + args + ); + token = tokens[0]; + } else { + token = lex2.next(); + tokens = token ? [token] : []; + } + } + done = tokens.length === 0; + if (!done && token === "\\endcsname") { + done = true; + tokens.shift(); + } + if (!done) { + done = token === "<$>" || token === "<$$>" || token === "<{>" || token === "<}>" || !!token && token.length > 1 && token[0] === "\\"; + } + if (!done) { + command += tokens.shift(); + } + } while (!done); + if (command) { + result.push("\\" + command); + } + result = result.concat(tokens); + } else if (token === "\\endcsname") { + } else if (token.length > 1 && token[0] === "#") { + const param = token.slice(1); + result = result.concat( + tokenize((_d = (_c = args == null ? void 0 : args[param]) != null ? _c : args == null ? void 0 : args["?"]) != null ? _d : "\\placeholder{}", args) + ); + } else { + result.push(token); + } + return result; +} +function tokenize(s, args) { + const lines = s.toString().split(/\r?\n/); + let stream = ""; + let sep = ""; + for (const line of lines) { + stream += sep; + sep = " "; + const m = line.match(/((?:\\%)|[^%])*/); + if (m !== null) + stream += m[0]; + } + const tokenizer = new Tokenizer(stream); + const result = []; + do + result.push(...expand(tokenizer, args)); + while (!tokenizer.end()); + return result; +} +function countTokens(s) { + return tokenize(s, []).length; +} +function joinLatex(segments) { + let sep = ""; + let result = ""; + for (const segment of segments) { + if (segment) { + if (/[a-zA-Z*]/.test(segment[0])) { + result += sep; + } + if (/\\[a-zA-Z]+\*?$/.test(segment)) { + sep = " "; + } else { + sep = ""; + } + result += segment; + } + } + return result; +} +function tokensToString(tokens) { + let flat = []; + if (Array.isArray(tokens)) { + for (const item of tokens) { + if (Array.isArray(item)) { + flat = [...flat, ...item]; + } else { + flat.push(item); + } + } + } else { + flat = [tokens]; + } + const result = joinLatex( + flat.map((token) => { + var _a; + return (_a = { + "": " ", + "<$$>": "$$", + "<$>": "$", + "<{>": "{", + "<}>": "}" + }[token]) != null ? _a : token; + }) + ); + return result; +} +var DEFINITIONS_ALGEBRA = [ + { + name: "To", + latexTrigger: ["\\to"], + kind: "infix", + precedence: 270 + // MathML rightwards arrow + } +]; +var MISSING = ["Error", "'missing'"]; +function isNumberExpression(expr) { + if (expr === null) + return false; + if (typeof expr === "number" || isNumberObject(expr)) + return true; + if (typeof expr === "string" && /^[+-]?[0-9\.]/.test(expr)) + return true; + return false; +} +function isNumberObject(expr) { + return expr !== null && typeof expr === "object" && "num" in expr; +} +function isSymbolObject(expr) { + return expr !== null && typeof expr === "object" && "sym" in expr; +} +function isStringObject(expr) { + return expr !== null && typeof expr === "object" && "str" in expr; +} +function isFunctionObject(expr) { + return expr !== null && typeof expr === "object" && "fn" in expr; +} +var recommendedScriptsRegex; +function isRecommendedScripts(text) { + if (!recommendedScriptsRegex) { + const recommendedScripts = [ + "Zyyy", + "Zinh", + "Arab", + "Armn", + "Beng", + "Bopo", + "Cyrl", + "Deva", + "Ethi", + "Geor", + "Grek", + "Gujr", + "Guru", + "Hang", + "Hani", + "Hebr", + "Hira", + "Kana", + "Knda", + "Khmr", + "Laoo", + "Latn", + "Mlym", + "Mymr", + "Orya", + "Sinh", + "Taml", + "Telu", + "Thaa", + "Thai", + "Tibt" + ]; + const regexPattern = `^[${recommendedScripts.map((x) => `\\p{Script=${x}}`).join("")}]*$`; + recommendedScriptsRegex = new RegExp(regexPattern, "u"); + } + return recommendedScriptsRegex.test(text); +} +function isValidIdentifier(s) { + if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s)) + return true; + if (ONLY_EMOJIS.test(s)) + return true; + if (!isRecommendedScripts(s)) + return false; + return /^[\p{XIDS}_]\p{XIDC}*$/u.test(s); +} +var VS16 = "\\u{FE0F}"; +var KEYCAP = "\\u{20E3}"; +var ZWJ2 = "\\u{200D}"; +var FLAG_SEQUENCE = "\\p{RI}\\p{RI}"; +var TAG_MOD = `(?:[\\u{E0020}-\\u{E007E}]+\\u{E007F})`; +var EMOJI_MOD = `(?:\\p{EMod}|${VS16}${KEYCAP}?|${TAG_MOD})`; +var EMOJI_NOT_IDENTIFIER = `(?:(?=\\P{XIDC})\\p{Emoji})`; +var ZWJ_ELEMENT = `(?:${EMOJI_NOT_IDENTIFIER}${EMOJI_MOD}*|\\p{Emoji}${EMOJI_MOD}+|${FLAG_SEQUENCE})`; +var POSSIBLE_EMOJI = `(?:${ZWJ_ELEMENT})(${ZWJ2}${ZWJ_ELEMENT})*`; +var SOME_EMOJI = new RegExp(`(?:${POSSIBLE_EMOJI})+`, "u"); +var ONLY_EMOJIS = new RegExp(`^(?:${POSSIBLE_EMOJI})+$`, "u"); +function validateIdentifier(s) { + if (typeof s !== "string") + return "not-a-string"; + if (s === "") + return "empty-string"; + if (s.normalize() !== s) + return "expected-nfc"; + if (/[\u200E\u200F\u2066-\u2069\u202A-\u202E]/.test(s)) + return "unexpected-bidi-marker"; + if (ONLY_EMOJIS.test(s)) + return "valid"; + if (/\p{XIDC}/u.test(s) && SOME_EMOJI.test(s)) + return "unexpected-mixed-emoji"; + if (!isRecommendedScripts(s)) + return "unexpected-script"; + if (!isValidIdentifier(s)) { + if (!isValidIdentifier(s[0])) + return "invalid-first-char"; + return "invalid-char"; + } + return "valid"; +} +function stringValue(expr) { + if (expr === null || expr === void 0) + return null; + if (typeof expr === "object" && "str" in expr) + return expr.str; + if (typeof expr !== "string") + return null; + if (expr.length < 2) + return null; + if (expr[0] !== "'" || expr[expr.length - 1] !== "'") + return null; + return expr.substring(1, expr.length - 1); +} +function stripText(expr) { + var _a; + if (expr === null || expr === void 0 || stringValue(expr) !== null) + return null; + const h = head(expr); + if (h !== null) { + return [ + h, + ...((_a = ops(expr)) != null ? _a : []).map((x) => stripText(x)).filter((x) => x !== null) + ]; + } + return expr; +} +function head(expr) { + if (expr === null || expr === void 0) + return null; + if (Array.isArray(expr)) { + if (typeof expr[0] === "string" && !isValidIdentifier(expr[0])) { + console.error( + `Invalid identifier "${expr[0]}": ${validateIdentifier(expr[0])}` + ); + return null; + } + return expr[0]; + } + if (isFunctionObject(expr)) + return expr.fn[0]; + return null; +} +function headName(expr) { + const h = head(expr); + return typeof h === "string" ? h : ""; +} +function ops(expr) { + if (expr === null || expr === void 0) + return null; + if (Array.isArray(expr)) + return expr.slice(1); + if (isFunctionObject(expr)) + return expr.fn.slice(1); + return null; +} +function op(expr, n) { + var _a, _b; + if (expr === null || expr === void 0) + return null; + if (Array.isArray(expr)) + return (_a = expr[n]) != null ? _a : null; + if (isFunctionObject(expr)) + return (_b = expr.fn[n]) != null ? _b : null; + return null; +} +function op1(expr) { + return op(expr, 1); +} +function op2(expr) { + return op(expr, 2); +} +function nops(expr) { + if (expr === null || expr === void 0) + return 0; + if (Array.isArray(expr)) + return Math.max(0, expr.length - 1); + if (isFunctionObject(expr)) + return Math.max(0, expr.fn.length - 1); + return 0; +} +function symbol(expr) { + if (expr === null || expr === void 0) + return null; + if (typeof expr === "string") { + if (/^[+\-\.0-9]/.test(expr)) + return null; + if (expr.length >= 2 && expr[0] === "'" && expr[expr.length - 1] === "'") + return null; + } + const s = isSymbolObject(expr) ? expr.sym : expr; + if (typeof s !== "string") + return null; + return s; +} +function isListLike(expr) { + if (expr === null) + return false; + const h = head(expr); + if (!h || typeof h !== "string") + return false; + return /^(List|Sequence|Tuple|Single|Pair|Triple)$/.test(h); +} +function keyValuePair(expr) { + var _a; + const h = head(expr); + if (h === "KeyValuePair" || h === "Tuple" || h === "Pair") { + const key = stringValue(op1(expr)); + if (!key) + return null; + return [key, (_a = op2(expr)) != null ? _a : "Nothing"]; + } + return null; +} +function dictionary(expr) { + if (expr === null) + return null; + if (typeof expr === "object" && "dict" in expr) + return expr.dict; + const kv = keyValuePair(expr); + if (kv) + return { [kv[0]]: kv[1] }; + const h = head(expr); + if (h === "Dictionary") { + const result = {}; + for (let i = 1; i < nops(expr); i++) { + const kv2 = keyValuePair(op(expr, i)); + if (kv2) + result[kv2[0]] = kv2[1]; + } + return result; + } + return null; +} +function machineValueOfString(s) { + var _a; + s = s.toLowerCase().replace(/[nd]$/g, "").replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); + if (s === "nan") + return NaN; + if (s === "+infinity") + return Infinity; + if (s === "-infinity") + return -Infinity; + if (/\([0-9]+\)/.test(s)) { + const [_, body, repeat, trail] = (_a = s.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; + s = body + repeat.repeat(Math.ceil(16 / repeat.length)) + (trail != null ? trail : ""); + } + return parseFloat(s); +} +function machineValue(expr) { + if (expr === null || expr === void 0) + return null; + if (typeof expr === "number") + return expr; + if (typeof expr === "string") + return machineValueOfString(expr); + if (isNumberObject(expr)) + return machineValue(expr.num); + return null; +} +function rationalValue(expr) { + var _a, _b; + if (expr === void 0 || expr === null) + return null; + if (symbol(expr) === "Half") + return [1, 2]; + const h = head(expr); + if (!h) + return null; + let numer = null; + let denom = null; + if (h === "Negate") { + const r = rationalValue(op1(expr)); + if (r) + return [-r[0], r[1]]; + } + if (h === "Rational" || h === "Divide") { + numer = (_a = machineValue(op1(expr))) != null ? _a : NaN; + denom = (_b = machineValue(op2(expr))) != null ? _b : NaN; + } + if (h === "Power") { + const exponent = machineValue(op2(expr)); + if (exponent === 1) { + numer = machineValue(op1(expr)); + denom = 1; + } else if (exponent === -1) { + numer = 1; + denom = machineValue(op1(expr)); + } + } + if (h === "Multiply" && head(op2(expr)) === "Power" && machineValue(op2(op2(expr))) === -1) { + numer = machineValue(op1(expr)); + denom = machineValue(op1(op2(expr))); + } + if (numer === null || denom === null) + return null; + if (Number.isInteger(numer) && Number.isInteger(denom)) + return [numer, denom]; + return null; +} +function subs(expr, s) { + var _a; + const h = head(expr); + if (h !== null) + return [subs(h, s), ...((_a = ops(expr)) != null ? _a : []).map((x) => subs(x, s))]; + const dict = dictionary(expr); + if (dict !== null) { + const keys = Object.keys(dict); + const result = {}; + for (const key of keys) + result[key] = subs(dict[key], s); + return { dict: result }; + } + const sym = symbol(expr); + if (sym && s[sym]) + return s[sym]; + return expr; +} +function mapArgs(expr, fn) { + let args = null; + if (Array.isArray(expr)) + args = expr; + if (isFunctionObject(expr)) + args = expr.fn; + if (args === null) + return []; + let i = 1; + const result = []; + while (i < args.length) { + result.push(fn(args[i])); + i += 1; + } + return result; +} +function applyAssociativeOperator(op3, lhs, rhs, associativity = "both") { + var _a, _b, _c, _d, _e, _f; + if (associativity === "non") + return [op3, lhs, rhs]; + const lhsName = head(lhs); + const rhsName = head(rhs); + if (associativity === "left") { + if (lhsName === op3) + return [op3, ...(_a = ops(lhs)) != null ? _a : [], rhs]; + return [op3, lhs, rhs]; + } + if (associativity === "right") { + if (rhsName === op3) + return [op3, lhs, ...(_b = ops(rhs)) != null ? _b : []]; + return [op3, lhs, rhs]; + } + if (lhsName === op3 && rhsName === op3) { + return [op3, ...(_c = ops(lhs)) != null ? _c : [], ...(_d = ops(rhs)) != null ? _d : []]; + } + if (lhsName === op3) + return [op3, ...(_e = ops(lhs)) != null ? _e : [], rhs]; + if (rhsName === op3) + return [op3, lhs, ...(_f = ops(rhs)) != null ? _f : []]; + return [op3, lhs, rhs]; +} +function getSequence(expr) { + var _a; + if (expr === null) + return null; + let h = head(expr); + if (h === "Delimiter") { + expr = op(expr, 1); + if (expr === null) + return []; + if (head(expr) !== "Sequence") + return [expr]; + } + h = head(expr); + if (h !== "Sequence") + return null; + return (_a = ops(expr)) != null ? _a : []; +} +function isEmptySequence(expr) { + return expr !== null && head(expr) === "Sequence" && nops(expr) === 0; +} +function missingIfEmpty(expr) { + if (expr === null || isEmptySequence(expr)) + return MISSING; + return expr; +} +function countFunctionLeaves(xs) { + if (xs[0] === "Square") { + return countFunctionLeaves(xs.slice(1)) + 2; + } + return xs.reduce((acc, x) => acc + countLeaves(x), 0); +} +function countLeaves(expr) { + if (expr === null) + return 0; + if (typeof expr === "number" || typeof expr === "string") + return 1; + if (isNumberExpression(expr) || isSymbolObject(expr) || isStringObject(expr)) + return 1; + if (Array.isArray(expr)) + return countFunctionLeaves(expr); + if ("fn" in expr) + return countFunctionLeaves(expr.fn); + const dict = dictionary(expr); + if (dict) { + const keys = Object.keys(dict); + return 1 + keys.length + keys.reduce((acc, x) => acc + countLeaves(dict[x]), 0); + } + return 0; +} +function getApplyFunctionStyle(_expr, _level) { + return "paren"; +} +function getGroupStyle(_expr, _level) { + return "paren"; +} +function getRootStyle(_expr, level) { + return level > 2 ? "solidus" : "radical"; +} +function getFractionStyle(expr, level) { + if (level > 3) + return "inline-solidus"; + if (head(expr) === "Divide") { + const [n, d] = [countLeaves(op1(expr)), countLeaves(op2(expr))]; + if (d <= 2 && n > 5) + return "factor"; + if (n <= 2 && d > 5) + return "reciprocal"; + } + return "quotient"; +} +function getLogicStyle(_expr, _level) { + return "boolean"; +} +function getPowerStyle(_expr, _level) { + return "solidus"; +} +function getNumericSetStyle(_expr, _level) { + return "compact"; +} +function numeratorDenominator(expr) { + var _a, _b; + if (head(expr) !== "Multiply") + return [[], []]; + const numerator = []; + const denominator = []; + const args = (_a = ops(expr)) != null ? _a : []; + for (const arg of args) { + if (head(arg) === "Power") { + const op12 = op(arg, 1); + const op22 = op(arg, 2); + if (head(op22) === "Negate") { + const b = op(op22, 1); + if (op12 && b) + denominator.push(["Power", op12, b]); + } else { + const exponentVal = (_b = machineValue(op22)) != null ? _b : NaN; + if (exponentVal === -1) { + if (op12) + denominator.push(op12); + } else if (exponentVal < 0) { + if (op12) + denominator.push(["Power", op12, -exponentVal]); + } else { + numerator.push(arg); + } + } + } else if (head(arg) === "Rational" && nops(arg) === 2) { + const op12 = op(arg, 1); + const op22 = op(arg, 2); + if (machineValue(op12) !== 1) + numerator.push(op12); + if (machineValue(op22) !== 1) + denominator.push(op22); + } else { + const r = rationalValue(arg); + if (r !== null) { + if (r[0] !== 1) + numerator.push(r[0]); + denominator.push(r[1]); + } else + numerator.push(arg); + } + } + return [numerator, denominator]; +} +function parseRoot(parser) { + var _a; + const degree = parser.parseOptionalGroup(); + const base = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); + if (base === null || isEmptySequence(base)) { + if (degree !== null) + return ["Root", MISSING, missingIfEmpty(degree)]; + return ["Sqrt", MISSING]; + } + if (degree !== null) + return ["Root", base, degree]; + return ["Sqrt", base]; +} +function serializeRoot(serializer, style, base, degree) { + if (base === null) + return "\\sqrt{}"; + degree = degree != null ? degree : 2; + if (style === "solidus") { + return serializer.wrapShort(base) + "^{1\\/" + serializer.serialize(degree) + "}"; + } else if (style === "quotient") { + return serializer.wrapShort(base) + "^{\\frac{1}{" + serializer.serialize(degree) + "}}"; + } + const degreeValue = machineValue(degree); + if (degreeValue === 2) + return "\\sqrt{" + serializer.serialize(base) + "}"; + return "\\sqrt[" + serializer.serialize(degree) + "]{" + serializer.serialize(base) + "}"; +} +function serializeAdd(serializer, expr) { + var _a, _b; + serializer.level -= 1; + const name = head(expr); + let result = ""; + let arg = op(expr, 1); + if (name === "Negate") { + result = "-" + serializer.wrap(arg, 276); + } else if (name === "Add") { + if (serializer.canonical && nops(expr) === 2 && serializer.options.invisiblePlus !== "+") { + const [op12, op22] = [op(expr, 1), op(expr, 2)]; + let [lhs, rhs] = [op12, op22]; + let lhsValue = machineValue(lhs); + let rhsValue = rationalValue(rhs); + if (lhsValue === null || rhsValue === null) { + [lhs, rhs] = [op22, op12]; + lhsValue = machineValue(lhs); + rhsValue = rationalValue(rhs); + } + if (lhsValue !== null && rhsValue !== null) { + if (isFinite(lhsValue) && Number.isInteger(lhsValue) && lhsValue >= 0 && lhsValue <= 1e3 && isFinite(rhsValue[0]) && isFinite(rhsValue[1]) && rhsValue[0] > 0 && rhsValue[0] <= 100 && rhsValue[1] <= 100) { + result = joinLatex([ + serializer.serialize(lhs), + serializer.options.invisiblePlus, + serializer.serialize(rhs) + ]); + serializer.level += 1; + return result; + } + } + } + let val = (_a = machineValue(arg)) != null ? _a : NaN; + result = serializer.serialize(arg); + const last = nops(expr) + 1; + for (let i = 2; i < last; i++) { + arg = op(expr, i); + val = (_b = machineValue(arg)) != null ? _b : NaN; + if (val < 0) { + result += serializer.serialize(arg); + } else if (head(arg) === "Negate") { + result += serializer.wrap(arg, 275); + } else { + const term = serializer.wrap(arg, 275); + if (term[0] === "-" || term[0] === "+") + result += term; + else + result += "+" + term; + } + } + } else if (name === "Subtract") { + result = serializer.wrap(arg, 275); + const arg2 = op(expr, 2); + if (arg2 !== null) { + const term = serializer.wrap(arg2, 275); + if (term[0] === "-") + result += "+" + term.slice(1); + else if (term[0] === "+") + result += "-" + term.slice(1); + else + result = result + "-" + term; + } + } + serializer.level += 1; + return result; +} +function serializeMultiply(serializer, expr) { + var _a; + if (expr === null) + return ""; + serializer.level -= 1; + let result = ""; + if (serializer.canonical === true) { + const [numer, denom] = numeratorDenominator(expr); + if (denom.length > 0) { + if (denom.length === 1 && denom[0] === 1) { + if (numer.length === 0) + result = "1"; + else if (numer.length === 1) + result = serializer.serialize(numer[0]); + else + result = serializeMultiply(serializer, ["Multiply", ...numer]); + } else { + result = serializer.serialize([ + "Divide", + numer.length === 1 ? numer[0] : ["Multiply", ...numer], + denom.length === 1 ? denom[0] : ["Multiply", ...denom] + ]); + } + } + } + if (result) { + serializer.level += 1; + return result; + } + let isNegative = false; + let arg = null; + const count = nops(expr) + 1; + let prevWasNumber = false; + for (let i = 1; i < count; i++) { + arg = op(expr, i); + if (arg === null) + continue; + let term; + if (isNumberExpression(arg)) { + term = serializer.serialize(arg); + if (term === "-1" && !result) { + result = ""; + isNegative = !isNegative; + } else { + if (term[0] === "-") { + term = term.slice(1); + isNegative = !isNegative; + } + result = !result ? term : joinLatex([result, serializer.options.multiply, term]); + } + prevWasNumber = true; + continue; + } + if (head(arg) === "Power") { + const r = rationalValue(op(arg, 2)); + if (r) { + const [n, d] = r; + if (n === 1 && d !== null) { + result += serializeRoot( + serializer, + getRootStyle(arg, serializer.level), + op(arg, 1), + d + ); + prevWasNumber = false; + continue; + } + } + } + if (head(arg) === "Power" && !isNaN((_a = machineValue(op(arg, 1))) != null ? _a : NaN)) { + term = serializer.serialize(arg); + result = !result ? term : joinLatex([result, serializer.options.multiply, term]); + prevWasNumber = true; + continue; + } + if (head(arg) === "Negate") { + arg = op(arg, 1); + isNegative = !isNegative; + } + term = serializer.wrap(arg, 390); + if (!result) { + result = term; + } else { + const h = head(arg); + if (prevWasNumber && (h === "Divide" || h === "Rational")) { + result = joinLatex([result, serializer.options.multiply, term]); + } else if (!serializer.options.invisibleMultiply) { + result = joinLatex([result, term]); + } else { + result = joinLatex([ + result, + serializer.options.invisibleMultiply, + term + ]); + } + } + prevWasNumber = false; + } + serializer.level += 1; + return isNegative ? "-" + result : result; +} +function parseFraction(parser) { + var _a, _b; + let numer = parser.parseGroup(); + let denom = null; + if (numer === null) { + numer = parser.parseToken(); + denom = parser.parseToken(); + } else { + denom = parser.parseGroup(); + } + numer = missingIfEmpty(numer); + denom = missingIfEmpty(denom); + if (head(numer) === "PartialDerivative" && (head(denom) === "PartialDerivative" || head(denom) === "Multiply" && head(op(denom, 1)) === "PartialDerivative")) { + const degree = (_a = op(numer, 3)) != null ? _a : null; + let fn = op(numer, 1); + if (fn === null) + fn = missingIfEmpty(parser.parseExpression()); + let vars = []; + if (head(denom) === "Multiply") { + for (const arg of (_b = ops(denom)) != null ? _b : []) { + if (head(arg) === "PartialDerivative") { + const v = op(arg, 2); + if (v) + vars.push(v); + } + } + } else { + const v = op(denom, 2); + if (v) + vars.push(v); + } + if (vars.length > 1) { + vars = ["List", ...vars]; + } + return ["PartialDerivative", fn, ...vars, degree === null ? 1 : degree]; + } + return ["Divide", numer, denom]; +} +function serializeFraction(serializer, expr) { + if (expr === null) + return ""; + const numer = missingIfEmpty(op(expr, 1)); + const denom = missingIfEmpty(op(expr, 2)); + const style = serializer.canonical ? getFractionStyle(expr, serializer.level) : "quotient"; + if (style === "inline-solidus" || style === "nice-solidus") { + const numerStr = serializer.wrapShort(numer); + const denomStr = serializer.wrapShort(denom); + if (style === "inline-solidus") + return `${numerStr}\\/${denomStr}`; + return `{}^{${numerStr}}\\!\\!/\\!{}_{${denomStr}}`; + } else if (style === "reciprocal") { + if (machineValue(numer) === 1) + return serializer.wrap(denom) + "^{-1}"; + return serializer.wrap(numer) + serializer.wrap(denom) + "^{-1}"; + } else if (style === "factor") { + if (machineValue(denom) === 1) + return serializer.wrap(numer); + return "\\frac{1}{" + serializer.serialize(denom) + "}{" + serializer.wrap(numer) + "}"; + } + const numerLatex = serializer.serialize(numer); + const denomLatex = serializer.serialize(denom); + return `\\frac{${numerLatex}}{${denomLatex}}`; +} +function serializePower(serializer, expr) { + var _a; + const name = head(expr); + const base = missingIfEmpty(op(expr, 1)); + if (name === "Sqrt") { + return serializeRoot( + serializer, + getRootStyle(expr, serializer.level - 1), + base, + 2 + ); + } + const exp2 = missingIfEmpty(op(expr, 2)); + if (name === "Root") + return serializeRoot( + serializer, + getRootStyle(expr, serializer.level - 1), + base, + exp2 + ); + if (serializer.canonical) { + const val2 = (_a = machineValue(exp2)) != null ? _a : 1; + if (val2 === -1) { + return serializer.serialize(["Divide", "1", base]); + } else if (val2 < 0) { + return serializer.serialize(["Divide", "1", ["Power", base, -val2]]); + } else if (head(exp2) === "Divide" || head(exp2) === "Rational") { + if (machineValue(op(exp2, 1)) === 1) { + const style = getRootStyle(expr, serializer.level); + return serializeRoot(serializer, style, base, op(exp2, 2)); + } + if (machineValue(op(exp2, 2)) === 2) { + return `${serializer.serialize(["Sqrt", base])}^{${serializer.serialize( + op(exp2, 1) + )}}`; + } + } else if (head(exp2) === "Power") { + if (machineValue(op(exp2, 2)) === -1) { + const style = getRootStyle(expr, serializer.level); + return serializeRoot(serializer, style, base, op(exp2, 1)); + } + } + } + return serializer.wrapShort(base) + "^{" + serializer.serialize(exp2) + "}"; +} +var DEFINITIONS_ARITHMETIC = [ + // Constants + { name: "CatalanConstant", serialize: "G" }, + { name: "GoldenRatio", serialize: "\\varphi" }, + { name: "EulerGamma", serialize: "\\gamma" }, + { + name: "Degrees", + latexTrigger: ["\\degree"], + kind: "postfix", + precedence: 880, + parse: (_parser, lhs) => ["Degrees", lhs], + serialize: (serializer, expr) => { + return joinLatex([serializer.serialize(op(expr, 1)), "\\degree"]); + } + }, + { + latexTrigger: ["\\degree"], + kind: "postfix", + precedence: 880, + parse: (_parser, lhs) => ["Degrees", lhs] + }, + { + latexTrigger: ["^", "<{>", "\\circ", "<}>"], + kind: "postfix", + parse: (_parser, lhs) => ["Degrees", lhs] + }, + { + latexTrigger: ["^", "\\circ"], + kind: "postfix", + parse: (_parser, lhs) => ["Degrees", lhs] + }, + { + latexTrigger: ["\xB0"], + kind: "postfix", + precedence: 880, + parse: (_parser, lhs) => ["Degrees", lhs] + }, + { + latexTrigger: ["\\ang"], + parse: (parser) => { + const arg = parser.parseGroup(); + return arg === null ? ["Degrees"] : ["Degrees", arg]; + } + }, + { + latexTrigger: ["\\infty"], + parse: { num: "+Infinity" } + }, + { + name: "ComplexInfinity", + latexTrigger: ["\\tilde", "\\infty"], + serialize: "\\tilde\\infty" + }, + { + latexTrigger: ["\\tilde", "<{>", "\\infty", "<}>"], + parse: "ComplexInfinity" + }, + { name: "Pi", kind: "symbol", latexTrigger: ["\\pi"] }, + { latexTrigger: ["\u03C0"], parse: "Pi" }, + { + name: "ExponentialE", + latexTrigger: ["\\exponentialE"], + parse: "ExponentialE", + serialize: "\\exponentialE" + }, + { + latexTrigger: "\\operatorname{e}", + parse: "ExponentialE" + }, + { + latexTrigger: "\\mathrm{e}", + parse: "ExponentialE" + }, + { + kind: "function", + identifierTrigger: "exp", + parse: "Exp" + }, + { + latexTrigger: "\\exp", + parse: "Exp" + }, + { + name: "ImaginaryUnit", + latexTrigger: ["\\imaginaryI"] + }, + { + latexTrigger: "\\operatorname{i}", + parse: "ImaginaryUnit" + }, + { + latexTrigger: "\\mathrm{i}", + parse: "ImaginaryUnit" + }, + // Operations + { + /** Could be the determinant if the argument is a matrix */ + /** @todo: domain check */ + /** If a literal matrix, the `serialize` should be custom, the parens are + * replaced with bars */ + name: "Abs", + kind: "matchfix", + openTrigger: "|", + closeTrigger: "|", + parse: (_parser, body) => isEmptySequence(body) ? null : ["Abs", body] + }, + { + identifierTrigger: "abs", + kind: "function", + parse: "Abs" + }, + { + name: "Add", + latexTrigger: ["+"], + kind: "infix", + associativity: "both", + precedence: 275, + parse: (parser, lhs, until) => { + if (until && 275 < until.minPrec) + return null; + const rhs = parser.parseExpression({ ...until, minPrec: 275 }); + if (rhs === null) + return null; + return applyAssociativeOperator("Add", lhs, rhs); + }, + serialize: serializeAdd + }, + { + kind: "prefix", + latexTrigger: ["+"], + precedence: 275, + parse: (parser, until) => { + if (until && 275 < until.minPrec) + return null; + return parser.parseExpression({ ...until, minPrec: 400 }); + } + }, + { + name: "Ceil", + kind: "matchfix", + openTrigger: "\\lceil", + closeTrigger: "\\rceil", + parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body] + }, + { + kind: "matchfix", + openTrigger: ["\u2308"], + closeTrigger: ["\u2309"], + parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body] + }, + { + identifierTrigger: "ceil", + kind: "function", + parse: "Ceil" + }, + { name: "Chop", identifierTrigger: "chop", kind: "function", parse: "Chop" }, + { + name: "Complex", + precedence: 274, + // One less than precedence of `Add`: used for correct wrapping + serialize: (serializer, expr) => { + const re = machineValue(op(expr, 1)); + const im = machineValue(op(expr, 2)); + if (im === 0) + return serializer.serialize(op(expr, 1)); + const imPart = im === 1 ? "\\imaginaryI" : im === -1 ? "-\\imaginaryI" : joinLatex([serializer.serialize(op(expr, 2)), "\\imaginaryI"]); + if (re === 0) + return imPart; + if (im !== null && im < 0) + return joinLatex([serializer.serialize(op(expr, 1)), imPart]); + return joinLatex([serializer.serialize(op(expr, 1)), "+", imPart]); + } + }, + { + name: "Divide", + latexTrigger: "\\frac", + precedence: 660, + // For \frac specifically, not for \div, etc.. + // handles Leibnitz notation for partial derivatives + parse: parseFraction, + serialize: serializeFraction + }, + { + kind: "infix", + latexTrigger: "\\over", + precedence: 660, + parse: "Divide" + }, + { + latexTrigger: ["\\/"], + kind: "infix", + associativity: "non", + precedence: 660, + // ??? MathML has 265, but it's wrong. + // It has to be at least higher than multiply + // e.g. `1/2+3*x` -> `1/2 + 3*x` , not `1/(2+3*x)` + parse: "Divide" + }, + { + latexTrigger: ["/"], + kind: "infix", + associativity: "non", + precedence: 660, + parse: "Divide" + }, + { + latexTrigger: ["\\div"], + kind: "infix", + associativity: "non", + precedence: 660, + // ??? according to MathML + parse: "Divide" + }, + { + name: "Exp", + serialize: (serializer, expr) => { + const op12 = op(expr, 1); + if (symbol(op12) || machineValue(op12) !== null) + return joinLatex(["\\exponentialE^{", serializer.serialize(op12)]); + return joinLatex(["\\exp", serializer.wrap(missingIfEmpty(op12))]); + } + }, + { + name: "Factorial", + latexTrigger: ["!"], + kind: "postfix", + precedence: 810 + }, + { + name: "Factorial2", + latexTrigger: ["!", "!"], + kind: "postfix", + precedence: 810 + }, + { + name: "Floor", + kind: "matchfix", + openTrigger: "\\lfloor", + closeTrigger: "\\rfloor", + parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body] + }, + { + kind: "matchfix", + openTrigger: ["\u230A"], + closeTrigger: ["\u230B"], + parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body] + }, + { + identifierTrigger: "floor", + kind: "function", + parse: "Floor" + }, + { + latexTrigger: ["\\Gamma"], + parse: "Gamma" + }, + { + name: "Gcd", + identifierTrigger: "gcd", + kind: "function" + }, + { + name: "Half", + serialize: "\\frac12" + }, + { + name: "Lg", + latexTrigger: ["\\lg"], + serialize: (serializer, expr) => "\\log_{10}" + serializer.wrapArguments(expr), + parse: (parser) => { + const args = parser.parseArguments("implicit"); + if (args === null) + return "Lg"; + return ["Log", ...args, 10]; + } + }, + { + name: "Lb", + latexTrigger: "\\lb", + parse: (parser) => { + const args = parser.parseArguments("implicit"); + if (args === null) + return "Log"; + return ["Log", ...args, 2]; + } + }, + { + name: "Ln", + latexTrigger: ["\\ln"], + serialize: (serializer, expr) => "\\ln" + serializer.wrapArguments(expr), + parse: (parser) => parseLog("Ln", parser) + }, + { + name: "Log", + latexTrigger: ["\\log"], + parse: (parser) => parseLog("Log", parser), + serialize: (serializer, expr) => { + const base = op2(expr); + if (base) + return joinLatex([ + "\\log_{", + base.toString(), + "}", + serializer.wrap(op1(expr)) + ]); + return "\\log" + serializer.wrapArguments(expr); + } + }, + { + name: "Lcm", + identifierTrigger: "lcm", + kind: "function" + }, + { name: "Max", identifierTrigger: "max", kind: "function" }, + { name: "Min", identifierTrigger: "min", kind: "function" }, + { + name: "MinusPlus", + latexTrigger: ["\\mp"], + kind: "infix", + associativity: "both", + precedence: 270 + }, + { + name: "Multiply", + latexTrigger: ["\\times"], + kind: "infix", + associativity: "both", + precedence: 390, + serialize: serializeMultiply + }, + { + latexTrigger: ["\\cdot"], + kind: "infix", + associativity: "both", + precedence: 390, + parse: (parser, lhs, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 392 }); + if (rhs === null) + return ["Multiply", lhs, MISSING]; + return applyAssociativeOperator("Multiply", lhs, rhs); + } + }, + { + latexTrigger: ["*"], + kind: "infix", + associativity: "both", + precedence: 390, + parse: (parser, lhs, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 392 }); + if (rhs === null) + return ["Multiply", lhs, MISSING]; + return applyAssociativeOperator("Multiply", lhs, rhs); + } + }, + { + name: "Negate", + latexTrigger: ["-"], + kind: "prefix", + parse: (parser, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); + return ["Negate", missingIfEmpty(rhs)]; + }, + precedence: 275 + }, + // { + // /** If the argument is a vector */ + // /** @todo: domain check */ + // name: 'Norm', + // kind: 'matchfix', + // openDelimiter: '|', + // closeDelimiter: '|', + // }, + // { + // /** If the argument is a set */ + // /** @todo: domain check */ + // name: 'Cardinality', + // kind: 'matchfix', + // openDelimiter: '|', + // closeDelimiter: '|', + // }, + { + // /** If the argument is a vector */ + /** @todo: domain check */ + kind: "matchfix", + openTrigger: "||", + closeTrigger: "||", + parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr] + }, + { + // /** If the argument is a vector */ + /** @todo: domain check */ + name: "Norm", + kind: "matchfix", + openTrigger: ["\\left", "\\Vert"], + closeTrigger: ["\\right", "\\Vert"], + parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr] + }, + { + name: "PlusMinus", + latexTrigger: ["\\pm"], + kind: "infix", + associativity: "both", + precedence: 270, + serialize: (serializer, expr) => { + const op12 = op(expr, 1); + if (op12 === null) + return "\\pm"; + if (nops(expr) === 1) + return joinLatex(["\\pm", serializer.serialize(op12)]); + const op22 = op(expr, 2); + return joinLatex([ + serializer.serialize(op12), + "\\pm", + serializer.serialize(op22) + ]); + } + }, + { + latexTrigger: ["\\pm"], + kind: "prefix", + precedence: 270, + parse: (parser, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); + return ["PlusMinus", missingIfEmpty(rhs)]; + } + }, + { + latexTrigger: ["\\plusmn"], + kind: "infix", + associativity: "both", + precedence: 270, + parse: (parser, lhs, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); + return ["PlusMinus", lhs, missingIfEmpty(rhs)]; + } + }, + { + latexTrigger: ["\\plusmn"], + kind: "prefix", + precedence: 270, + parse: (parser, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); + return ["PlusMinus", missingIfEmpty(rhs)]; + } + }, + { + name: "Power", + latexTrigger: ["^"], + kind: "infix", + serialize: serializePower + }, + { + latexTrigger: "\\prod", + precedence: 390, + name: "Product", + parse: parseBigOp("Product", 390), + serialize: serializeBigOp("\\prod") + }, + // { + // trigger: ['*', '*'], + // kind: 'infix', + // associativity: 'non', + // precedence: 720, + // }, + { + name: "Rational", + precedence: 660, + serialize: (serializer, expr) => { + if (expr && nops(expr) === 1) + return "\\operatorname{Rational}" + serializer.wrapArguments(expr); + return serializeFraction(serializer, expr); + } + }, + { + name: "Root", + serialize: serializePower + }, + { + name: "Round", + identifierTrigger: "round", + kind: "function" + }, + { + name: "Square", + precedence: 720, + serialize: (serializer, expr) => serializer.wrapShort(op(expr, 1)) + "^2" + }, + { + latexTrigger: ["\\sum"], + precedence: 275, + name: "Sum", + parse: parseBigOp("Sum", 275), + serialize: serializeBigOp("\\sum") + }, + { + name: "Sign", + // As per ISO 80000-2, "signum" is 'sgn' + identifierTrigger: "sgn", + kind: "function" + }, + { + name: "Sqrt", + latexTrigger: ["\\sqrt"], + parse: parseRoot, + serialize: serializePower + }, + { + name: "Subtract", + latexTrigger: ["-"], + kind: "infix", + associativity: "both", + precedence: 275, + parse: (parser, lhs, terminator) => { + const rhs = parser.parseExpression({ ...terminator, minPrec: 277 }); + return ["Subtract", lhs, missingIfEmpty(rhs)]; + } + } +]; +function parseBigOp(name, prec) { + return (parser) => { + var _a, _b, _c, _d; + parser.skipSpace(); + let sup = null; + let sub2 = null; + while (!(sub2 && sup) && (parser.peek === "_" || parser.peek === "^")) { + if (parser.match("_")) + sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); + else if (parser.match("^")) + sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); + parser.skipSpace(); + } + if (sub2 === "Nothing" || isEmptySequence(sub2)) + sub2 = null; + if (sup === "Nothing" || isEmptySequence(sup)) + sup = null; + let index = null; + let lower = null; + if (head(sub2) === "Equal") { + index = op(sub2, 1); + lower = op(sub2, 2); + } else { + index = sub2; + } + const sym = symbol(index); + if (sym) + (_c = parser.computeEngine) == null ? void 0 : _c.pushScope({ [sym]: { domain: "Integer" } }); + const fn = parser.parseExpression({ minPrec: prec + 1 }); + if (sym) + (_d = parser.computeEngine) == null ? void 0 : _d.popScope(); + if (!fn) + return [name]; + if (sup) + return [ + name, + fn, + ["Tuple", index ? ["Hold", index] : "Nothing", lower != null ? lower : 1, sup] + ]; + if (lower) + return [name, fn, ["Tuple", index ? ["Hold", index] : "Nothing", lower]]; + if (index) + return [name, fn, ["Tuple", ["Hold", index]]]; + return [name, fn]; + }; +} +function serializeBigOp(command) { + return (serializer, expr) => { + if (!op(expr, 1)) + return command; + let arg = op(expr, 2); + const h = head(arg); + if (h !== "Tuple" && h !== "Triple" && h !== "Pair" && h !== "Single") + arg = null; + let index = op(arg, 1); + if (index && head(index) === "Hold") + index = op(index, 1); + const fn = op(expr, 1); + if (!arg) { + if (!op(expr, 2)) + return joinLatex([command, "_n", serializer.serialize(fn)]); + return joinLatex([ + command, + "_{", + serializer.serialize(op(expr, 2)), + "}", + serializer.serialize(fn) + ]); + } + const lower = op(arg, 2); + let sub2 = []; + if (index && symbol(index) !== "Nothing" && lower) + sub2 = [serializer.serialize(index), "=", serializer.serialize(lower)]; + else if (index && symbol(index) !== "Nothing") + sub2 = [serializer.serialize(index)]; + else if (lower) + sub2 = [serializer.serialize(lower)]; + if (sub2.length > 0) + sub2 = ["_{", ...sub2, "}"]; + let sup = []; + if (op(arg, 3)) + sup = ["^{", serializer.serialize(op(arg, 3)), "}"]; + return joinLatex([command, ...sup, ...sub2, serializer.serialize(fn)]); + }; +} +function parseLog(command, parser) { + var _a, _b; + let sub2 = null; + let base = null; + if (parser.match("_")) { + sub2 = (_b = (_a = parser.parseStringGroup()) == null ? void 0 : _a.trim()) != null ? _b : parser.nextToken(); + base = Number.parseFloat(sub2 != null ? sub2 : "10"); + } + const args = parser.parseArguments("implicit"); + if (args === null) + return [command]; + if (base === 10) + return ["Log", args[0]]; + if (base === 2) + return ["Lb", ...args]; + if (sub2 === null) + return [command, ...args]; + return ["Log", ...args, sub2]; +} +function parseSequence(parser, terminator, lhs, prec, sep) { + /* @__PURE__ */ console.assert(lhs !== null); + if (terminator.minPrec >= prec) + return null; + const result = [lhs]; + let done = false; + while (!done) { + done = true; + parser.skipSpace(); + while (parser.match(sep)) { + result.push("Nothing"); + parser.skipSpace(); + } + if (parser.atTerminator(terminator)) { + result.push("Nothing"); + } else { + const rhs = parser.parseExpression({ ...terminator, minPrec: prec }); + result.push(rhs != null ? rhs : "Nothing"); + done = rhs === null; + } + if (!done) { + parser.skipSpace(); + done = !parser.match(sep); + } + } + return result; +} +function serializeOps(sep = "") { + return (serializer, expr) => { + var _a; + return ((_a = ops(expr)) != null ? _a : []).map((x) => serializer.serialize(x)).join(sep); + }; +} +var DEFINITIONS_CORE = [ + // + // Constants + // + { + latexTrigger: ["\\placeholder"], + kind: "symbol", + parse: (parser) => { + while (parser.match("")) { + } + if (parser.match("[")) + while (!parser.match("]") && !parser.atBoundary) + parser.nextToken(); + while (parser.match("")) { + } + if (parser.match("<{>")) + while (!parser.match("<}>") && !parser.atBoundary) + parser.nextToken(); + return "Nothing"; + } + }, + // + // Functions + // + { + name: "Apply", + kind: "function", + identifierTrigger: "apply", + serialize: (serializer, expr) => serializer.serializeFunction(ops(expr)) + }, + { + latexTrigger: "\\rhd", + kind: "infix", + precedence: 20, + parse: "Apply" + }, + { + latexTrigger: "\\lhd", + kind: "infix", + precedence: 20, + parse: (parser, lhs) => { + var _a; + const rhs = (_a = parser.parseExpression({ minPrec: 20 })) != null ? _a : "Nothing"; + return ["Apply", rhs, lhs]; + } + }, + { + name: "BaseForm", + serialize: (serializer, expr) => { + var _a, _b; + const radix = (_a = machineValue(op(expr, 2))) != null ? _a : NaN; + if (isFinite(radix) && radix >= 2 && radix <= 36) { + const num = (_b = machineValue(op(expr, 1))) != null ? _b : NaN; + if (isFinite(num) && Number.isInteger(num)) { + let digits = Number(num).toString(radix); + let groupLength = 0; + if (radix === 2) { + groupLength = 4; + } else if (radix === 10) { + groupLength = 4; + } else if (radix === 16) { + groupLength = 2; + } else if (radix > 16) { + groupLength = 4; + } + if (groupLength > 0) { + const oldDigits = digits; + digits = ""; + for (let i = 0; i < oldDigits.length; i++) { + if (i > 0 && i % groupLength === 0) + digits = "\\, " + digits; + digits = oldDigits[oldDigits.length - i - 1] + digits; + } + } + return `(\\text{${digits}}_{${radix}}`; + } + } + return "\\operatorname{BaseForm}(" + serializer.serialize(op(expr, 1)) + ", " + serializer.serialize(op(expr, 2)) + ")"; + } + }, + { + name: "Delimiter", + serialize: (serializer, expr) => { + var _a, _b, _c, _d, _e, _f, _g, _h; + const argCount = nops(expr); + if (argCount === 0) + return ""; + const style = serializer.options.groupStyle(expr, serializer.level + 1); + const arg1 = op(expr, 1); + const h1 = head(arg1); + const defaultFence = (_a = { List: "[],", Sequence: "" }[typeof h1 === "string" ? h1 : ""]) != null ? _a : "(),"; + let open = (_b = defaultFence[0]) != null ? _b : ""; + let close = (_c = defaultFence[1]) != null ? _c : ""; + let sep = (_d = defaultFence[2]) != null ? _d : ""; + if (argCount > 1) { + const op22 = (_e = stringValue(op(expr, 2))) != null ? _e : ""; + open = (_f = op22[0]) != null ? _f : defaultFence[0]; + close = (_g = op22[1]) != null ? _g : defaultFence[1]; + sep = (_h = op22[2]) != null ? _h : defaultFence[2]; + } + const body = isListLike(arg1) ? serializeOps(sep)(serializer, arg1) : serializer.serialize(arg1); + return serializer.wrapString(body, style, open + close); + } + }, + { + name: "Domain", + serialize: (serializer, expr) => { + if (head(expr) === "Error") + return serializer.serialize(expr); + return `\\mathbf{${serializer.serialize(op(expr, 1))}}`; + } + }, + { + latexTrigger: ["\\mathtip"], + parse: (parser) => { + const op12 = parser.parseGroup(); + const op22 = parser.parseGroup(); + return op12; + } + }, + { + latexTrigger: ["\\texttip"], + parse: (parser) => { + const op12 = parser.parseGroup(); + const op22 = parser.parseGroup(); + return op12; + } + }, + { + latexTrigger: ["\\error"], + parse: (parser) => ["Error", parser.parseGroup()] + }, + { + name: "Error", + serialize: (serializer, expr) => { + var _a; + if (stringValue(op(expr, 1)) === "missing") + return `\\error{${(_a = serializer.options.missingSymbol) != null ? _a : "\\placeholder{}"}}`; + const where = errorContextAsLatex(serializer, expr) || "\\blacksquare"; + const op12 = op(expr, 1); + const code = head(op12) === "ErrorCode" ? stringValue(op(op12, 1)) : stringValue(op12); + if (code === "incompatible-domain") { + return `\\mathtip{\\error{${where}}}{\\in ${serializer.serialize( + op(op12, 3) + )}\\notin ${serializer.serialize(op(op12, 2))}}`; + } + if (typeof code === "string") + return `\\error{${where}}`; + return `\\error{${where}}`; + } + }, + { + name: "ErrorCode", + serialize: (serializer, expr) => { + var _a; + const code = stringValue(op(expr, 1)); + if (code === "missing") + return (_a = serializer.options.missingSymbol) != null ? _a : "\\placeholder{}"; + if (code === "unexpected-command" || code === "unexpected-operator" || code === "unexpected-token" || code === "invalid-identifier" || code === "unknown-environment" || code === "unexpected-base" || code === "incompatible-domain" || code === "invalid-domain") { + return ""; + } + return `\\texttip{\\error{\\blacksquare}}{\\mathtt{${code}}}`; + } + }, + { + name: "FromLatex", + serialize: (_serializer, expr) => { + return `\\texttt{${sanitizeLatex(stringValue(op(expr, 1)))}}`; + } + }, + { + name: "Latex", + serialize: (serializer, expr) => { + if (expr === null) + return ""; + return joinLatex( + mapArgs(expr, (x) => { + var _a; + return (_a = stringValue(x)) != null ? _a : serializer.serialize(x); + }) + ); + } + }, + { + name: "LatexString", + serialize: (serializer, expr) => { + if (expr === null) + return ""; + return joinLatex(mapArgs(expr, (x) => serializer.serialize(x))); + } + }, + { name: "LatexTokens", serialize: serializeLatexTokens }, + { + name: "List", + kind: "matchfix", + openTrigger: "\\lbrack", + closeTrigger: "\\rbrack", + parse: parseList, + serialize: (serializer, expr) => { + return joinLatex([ + "\\lbrack", + serializeOps(", ")(serializer, expr), + "\\rbrack" + ]); + } + }, + // Synonyms for List + { + kind: "matchfix", + openTrigger: "[", + closeTrigger: "]", + parse: parseList + }, + { + kind: "matchfix", + openTrigger: "\\[", + closeTrigger: "\\]", + parse: parseList + }, + // Synonyms for Delimiter + { + kind: "matchfix", + openTrigger: "(", + closeTrigger: ")", + parse: parseDelimiter + }, + { + kind: "matchfix", + openTrigger: "\\lparen", + closeTrigger: "\\rparen", + parse: parseDelimiter + }, + { + latexTrigger: [","], + kind: "infix", + precedence: 20, + // Unlike the matchfix version of List, + // when the comma operator is used, the lhs and rhs are flattened, + // i.e. `1,2,3` -> `["Delimiter", ["List", 1, 2, 3], ","]`, + // and `1, (2, 3)` -> `["Delimiter", + // ["Sequence", 1, ["Delimiter", ["List", 2, 3], "()", ","]]], + parse: (parser, lhs, terminator) => { + const seq = parseSequence(parser, terminator, lhs, 20, ","); + if (seq === null) + return null; + return ["Sequence", ...seq]; + } + }, + { + name: "Sequence", + serialize: serializeOps("") + }, + { + latexTrigger: [";"], + kind: "infix", + precedence: 19, + parse: (parser, lhs, terminator) => { + const seq = parseSequence(parser, terminator, lhs, 19, ";"); + if (seq === null) + return null; + return [ + "Sequence", + ...seq.map( + (x) => { + var _a; + return head(x) === "Sequence" ? ["List", ...(_a = ops(x)) != null ? _a : []] : x; + } + ) + ]; + } + }, + { + name: "String", + latexTrigger: ["\\text"], + parse: (scanner) => parseTextRun(scanner), + serialize: (serializer, expr) => { + const args = ops(expr); + if (args === null || args.length === 0) + return "\\text{}"; + return joinLatex([ + "\\text{", + args.map((x) => serializer.serialize(x)).join(""), + "}" + ]); + } + }, + { + name: "Subscript", + latexTrigger: ["_"], + kind: "infix", + serialize: (serializer, expr) => { + if (nops(expr) === 2) { + return serializer.serialize(op(expr, 1)) + "_{" + serializer.serialize(op(expr, 2)) + "}"; + } + return "_{" + serializer.serialize(op(expr, 1)) + "}"; + } + }, + { name: "Superplus", latexTrigger: ["^", "+"], kind: "postfix" }, + { name: "Subplus", latexTrigger: ["_", "+"], kind: "postfix" }, + { name: "Superminus", latexTrigger: ["^", "-"], kind: "postfix" }, + { name: "Subminus", latexTrigger: ["_", "-"], kind: "postfix" }, + { + latexTrigger: ["^", "*"], + kind: "postfix", + parse: (_parser, lhs) => ["Superstar", lhs] + }, + // { name: 'Superstar', latexTrigger: ['^', '\\star'], kind: 'postfix' }, + { + latexTrigger: ["_", "*"], + kind: "postfix", + parse: (_parser, lhs) => ["Substar", lhs] + }, + { name: "Substar", latexTrigger: ["_", "\\star"], kind: "postfix" }, + { name: "Superdagger", latexTrigger: ["^", "\\dagger"], kind: "postfix" }, + { + latexTrigger: ["^", "\\dag"], + kind: "postfix", + parse: (_parser, lhs) => ["Superdagger", lhs] + }, + { + name: "Prime", + latexTrigger: ["^", "\\prime"], + // Note: we don't need a precedence because the trigger is '^' + // and '^' (and '_') are treated specially by the parser. + kind: "postfix", + parse: (parser, lhs) => parsePrime(parser, lhs, 1), + serialize: (serializer, expr) => { + var _a; + const n2 = (_a = machineValue(op(expr, 2))) != null ? _a : 1; + const base = serializer.serialize(op(expr, 1)); + if (n2 === 1) + return base + "^\\prime"; + if (n2 === 2) + return base + "^\\doubleprime"; + if (n2 === 3) + return base + "^\\tripleprime"; + return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}"; + } + }, + { + latexTrigger: "^{\\prime\\prime}", + kind: "postfix", + parse: (parser, lhs) => parsePrime(parser, lhs, 2) + }, + { + latexTrigger: "^{\\prime\\prime\\prime}", + kind: "postfix", + parse: (parser, lhs) => parsePrime(parser, lhs, 3) + }, + { + latexTrigger: ["^", "\\doubleprime"], + kind: "postfix", + parse: (parser, lhs) => parsePrime(parser, lhs, 2) + }, + { + latexTrigger: ["^", "\\tripleprime"], + kind: "postfix", + parse: (parser, lhs) => parsePrime(parser, lhs, 3) + }, + { + latexTrigger: "'", + kind: "postfix", + precedence: 810, + parse: (parser, lhs) => parsePrime(parser, lhs, 1) + }, + { + latexTrigger: "\\prime", + kind: "postfix", + precedence: 810, + parse: (parser, lhs) => parsePrime(parser, lhs, 1) + }, + { + latexTrigger: "\\doubleprime", + kind: "postfix", + precedence: 810, + parse: (parser, lhs) => parsePrime(parser, lhs, 2) + }, + { + latexTrigger: "\\tripleprime", + kind: "postfix", + precedence: 810, + parse: (parser, lhs) => parsePrime(parser, lhs, 3) + }, + { + latexTrigger: ["^", "<{>", "("], + kind: "postfix", + parse: (parser, lhs) => { + var _a, _b; + if (!((_b = (_a = parser.computeEngine) == null ? void 0 : _a.box(lhs)) == null ? void 0 : _b.domain.isFunction)) + return null; + const start = parser.index; + parser.addBoundary([")"]); + const expr = parser.parseExpression(); + if (!parser.matchBoundary()) { + parser.index = start; + return null; + } + if (!parser.match("<}>")) { + parser.index = start; + return null; + } + return ["Derivative", lhs, expr]; + } + }, + { + name: "InverseFunction", + latexTrigger: "^{-1}", + kind: "postfix", + parse: (parser, lhs) => { + var _a, _b; + if ((_b = (_a = parser.computeEngine) == null ? void 0 : _a.box(lhs)) == null ? void 0 : _b.domain.isFunction) + return ["InverseFunction", lhs]; + return ["Power", missingIfEmpty(lhs), -1]; + }, + serialize: (serializer, expr) => serializer.serialize(op(expr, 1)) + "^{-1}" + }, + { + name: "Derivative", + serialize: (serializer, expr) => { + var _a; + const degree = (_a = machineValue(op(expr, 2))) != null ? _a : 1; + const base = serializer.serialize(op(expr, 1)); + if (degree === 1) + return base + "^{\\prime}"; + if (degree === 2) + return base + "^{\\doubleprime}"; + if (degree === 3) + return base + "^{\\tripleprime}"; + return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}"; + } + }, + { + kind: "environment", + name: "Which", + identifierTrigger: "cases", + parse: (parser) => { + var _a; + const tabular = parser.parseTabular(); + if (!tabular) + return ["Which"]; + const result = ["Which"]; + for (const row of tabular) { + if (row.length === 1) { + result.push("True"); + result.push(row[0]); + } else if (row.length === 2) { + const s = stringValue(row[1]); + result.push(s ? "True" : (_a = stripText(row[1])) != null ? _a : "True"); + result.push(row[0]); + } + } + return result; + }, + serialize: (serialize2, expr) => { + const rows = []; + const args = ops(expr); + if (args) { + for (let i = 0; i <= args.length - 2; i += 2) { + const row = []; + row.push(serialize2.serialize(args[i + 1])); + row.push(serialize2.serialize(args[i])); + rows.push(row.join("&")); + } + } + return joinLatex(["\\begin{cases}", rows.join("\\\\"), "\\end{cases}"]); + } + } +]; +function parseTextRun(parser, style) { + var _a, _b, _c; + if (!parser.match("<{>")) + return "''"; + const runs = []; + let text = ""; + let runinStyle = null; + while (!parser.atEnd && !parser.match("<}>")) { + if (parser.peek === "<{>") { + runs.push(parseTextRun(parser)); + } else if (parser.match("\\textbf") && parser.match("<{>")) { + runs.push(parseTextRun(parser, { "font-weight": "bold" })); + } else if (parser.match("\\color")) { + const color = parser.parseStringGroup(); + if (color !== null) { + if (runinStyle !== null && text) { + runs.push(["Style", text, { dict: runinStyle }]); + } else if (text) { + runs.push(["String", text]); + } + text = ""; + runinStyle = { color }; + } + } else if (parser.match("")) { + text += " "; + } else if (parser.match("<$>")) { + const index = parser.index; + const expr = (_a = parser.parseExpression()) != null ? _a : ["Sequence"]; + parser.skipSpace(); + if (parser.match("<$>")) { + runs.push(expr); + } else { + text += "$"; + parser.index = index; + } + } else if (parser.match("<$$>")) { + const index = parser.index; + const expr = (_b = parser.parseExpression()) != null ? _b : ["Sequence"]; + parser.skipSpace(); + if (parser.match("<$$>")) { + runs.push(expr); + } else { + text += "$$"; + parser.index = index; + } + } else + text += (_c = parser.matchChar()) != null ? _c : parser.nextToken(); + } + if (runinStyle !== null && text) { + runs.push(["Style", `'${text}'`, { dict: runinStyle }]); + } else if (text) { + runs.push(`'${text}'`); + } + let body; + if (runs.length === 1) + body = runs[0]; + else { + if (runs.every((x) => stringValue(x) !== null)) + body = "'" + runs.map((x) => stringValue(x)).join() + "'"; + else + body = ["String", ...runs]; + } + return style ? ["Style", body, { dict: style }] : body; +} +function serializeLatexTokens(serializer, expr) { + if (expr === null) + return ""; + return joinLatex( + mapArgs(expr, (x) => { + const s = stringValue(x); + if (s === null) + return serializer.serialize(x); + if (s === "<{>") + return "{"; + if (s === "<}>") + return "}"; + if (s === "<$>") + return "$"; + if (s === "<$$>") + return "$$"; + if (s === "") + return " "; + return s; + }) + ); +} +function sanitizeLatex(s) { + if (s === null) + return ""; + return s.replace( + /[{}\[\]\\:\-\$%]/g, + (c) => { + var _a; + return (_a = { + "{": "\\lbrace ", + "}": "\\rbrace ", + "[": "\\lbrack ", + "]": "\\rbrack ", + ":": "\\colon ", + "\\": "\\backslash " + }[c]) != null ? _a : "\\" + c; + } + ); +} +function errorContextAsLatex(serializer, error) { + var _a; + const arg = op(error, 2); + if (!arg) + return ""; + if (head(arg) === "Latex") + return `\\texttt{${sanitizeLatex((_a = stringValue(op(arg, 1))) != null ? _a : "")}}`; + if (head(arg) === "Hold") + return serializer.serialize(op(arg, 1)); + return serializer.serialize(arg); +} +function parsePrime(parser, lhs, order2) { + var _a, _b, _c; + const lhsh = head(lhs); + if (lhsh === "Derivative" || lhsh === "Prime") { + const n = (_a = machineValue(op(lhs, 2))) != null ? _a : 1; + return [lhsh, missingIfEmpty(op(lhs, 1)), n + order2]; + } + if ((_c = (_b = parser.computeEngine) == null ? void 0 : _b.box(lhs)) == null ? void 0 : _c.domain.isFunction) { + if (order2 === 1) + return ["Derivative", lhs]; + return ["Derivative", lhs, order2]; + } + if (order2 === 1) + return ["Prime", missingIfEmpty(lhs)]; + return ["Prime", missingIfEmpty(lhs), order2]; +} +function parseDelimiter(parser, body) { + var _a; + if (body === null || isEmptySequence(body)) + return ["Sequence"]; + if (head(body) === "Sequence") { + if (nops(body) === 0) + return ["Delimiter"]; + return ["Delimiter", ["Sequence", ...(_a = ops(body)) != null ? _a : []]]; + } + return ["Delimiter", body]; +} +function parseList(_parser, body) { + var _a; + if (body === null || isEmptySequence(body)) + return ["List"]; + if (head(body) !== "Sequence" && head(body) !== "List") + return ["List", body]; + return ["List", ...(_a = ops(body)) != null ? _a : []]; +} +var DEFINITIONS_INEQUALITIES = [ + { + latexTrigger: ["\\not", "<"], + kind: "infix", + associativity: "right", + precedence: 246, + parse: "NotLess" + }, + { + name: "NotLess", + latexTrigger: ["\\nless"], + kind: "infix", + associativity: "right", + precedence: 246 + }, + { + latexTrigger: ["<"], + kind: "infix", + associativity: "right", + precedence: 245, + parse: "Less" + }, + { + name: "Less", + latexTrigger: ["\\lt"], + kind: "infix", + associativity: "right", + precedence: 245 + }, + { + latexTrigger: ["<", "="], + kind: "infix", + associativity: "right", + precedence: 241, + parse: "LessEqual" + }, + { + name: "LessEqual", + latexTrigger: ["\\le"], + kind: "infix", + associativity: "right", + precedence: 241 + }, + { + latexTrigger: ["\\leq"], + kind: "infix", + associativity: "right", + precedence: 241, + parse: "LessEqual" + }, + { + latexTrigger: ["\\leqslant"], + kind: "infix", + associativity: "right", + precedence: 265, + // Note different precedence than `<=` as per MathML + parse: "LessEqual" + }, + { + name: "LessNotEqual", + latexTrigger: ["\\lneqq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotLessNotEqual", + latexTrigger: ["\\nleqq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "LessOverEqual", + latexTrigger: ["\\leqq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "GreaterOverEqual", + latexTrigger: ["\\geqq"], + kind: "infix", + associativity: "right", + precedence: 265, + parse: "GreaterEqual" + }, + { + name: "Equal", + latexTrigger: ["="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + latexTrigger: ["*", "="], + kind: "infix", + associativity: "right", + precedence: 260, + parse: "StarEqual" + }, + { + name: "StarEqual", + latexTrigger: ["\\star", "="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "PlusEqual", + latexTrigger: ["+", "="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "MinusEqual", + latexTrigger: ["-", "="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "SlashEqual", + latexTrigger: ["/", "="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "EqualEqual", + latexTrigger: ["=", "="], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "EqualEqualEqual", + latexTrigger: ["=", "=", "="], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "TildeFullEqual", + // MathML: approximately equal to + latexTrigger: ["\\cong"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotTildeFullEqual", + // MathML: approximately but not actually equal to + latexTrigger: ["\\ncong"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + latexTrigger: [":", "="], + kind: "infix", + associativity: "right", + precedence: 260, + parse: "Assign" + }, + { + name: "Assign", + latexTrigger: ["\\coloneq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "Approx", + // Note: Mathematica TildeTilde + latexTrigger: ["\\approx"], + kind: "infix", + associativity: "right", + precedence: 247 + }, + { + name: "NotApprox", + // Note: Mathematica TildeTilde + latexTrigger: ["\\not", "\\approx"], + kind: "infix", + associativity: "right", + precedence: 247 + }, + { + name: "ApproxEqual", + // Note: Mathematica TildeEqual, MathML: `asymptotically equal to` + latexTrigger: ["\\approxeq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotApproxEqual", + // Note: Mathematica NotTildeEqual + latexTrigger: ["\\not", "\\approxeq"], + kind: "infix", + // Note: no LaTeX symbol for char U+2249 + associativity: "right", + precedence: 250 + }, + { + name: "NotEqual", + latexTrigger: ["\\ne"], + kind: "infix", + associativity: "right", + precedence: 255 + }, + { + name: "Unequal", + latexTrigger: ["!", "="], + kind: "infix", + associativity: "right", + precedence: 260 + // Note different precendence than \\ne per MathML + }, + { + name: "GreaterEqual", + latexTrigger: ["\\ge"], + kind: "infix", + associativity: "right", + precedence: 242 + // Note: different precendence than `>=` as per MathML + }, + { + latexTrigger: ["\\geq"], + kind: "infix", + associativity: "right", + precedence: 242, + // Note: different precendence than `>=` as per MathML + parse: "GreaterEqual" + }, + { + latexTrigger: [">", "="], + kind: "infix", + associativity: "right", + precedence: 243, + parse: "GreaterEqual" + }, + { + latexTrigger: ["\\geqslant"], + kind: "infix", + associativity: "right", + precedence: 265, + // Note: different precendence than `>=` as per MathML + parse: "GreaterEqual" + }, + { + name: "GreaterNotEqual", + latexTrigger: ["\\gneqq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotGreaterNotEqual", + latexTrigger: ["\\ngeqq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + latexTrigger: [">"], + kind: "infix", + associativity: "right", + precedence: 245, + parse: "Greater" + }, + { + name: "Greater", + latexTrigger: ["\\gt"], + kind: "infix", + associativity: "right", + precedence: 245 + }, + { + name: "NotGreater", + latexTrigger: ["\\ngtr"], + kind: "infix", + associativity: "right", + precedence: 244 + }, + { + latexTrigger: ["\\not", ">"], + kind: "infix", + associativity: "right", + precedence: 244, + parse: "NotGreater" + }, + { + name: "RingEqual", + latexTrigger: ["\\circeq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "TriangleEqual", + // MathML: delta equal to + latexTrigger: ["\\triangleq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "DotEqual", + // MathML: approaches the limit + latexTrigger: ["\\doteq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "DotEqualDot", + // MathML: Geometrically equal + latexTrigger: ["\\doteqdot"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "FallingDotEqual", + // MathML: approximately equal to or the image of + latexTrigger: ["\\fallingdotseq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "RisingDotEqual", + // MathML: image of or approximately equal to + latexTrigger: ["\\fallingdotseq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "QuestionEqual", + latexTrigger: ["\\questeq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "MuchLess", + latexTrigger: ["\\ll"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "MuchGreater", + latexTrigger: ["\\gg"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "Precedes", + latexTrigger: ["\\prec"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "Succeeds", + latexTrigger: ["\\succ"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "PrecedesEqual", + latexTrigger: ["\\preccurlyeq"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "SucceedsEqual", + latexTrigger: ["\\curlyeqprec"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotPrecedes", + latexTrigger: ["\\nprec"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "NotSucceeds", + latexTrigger: ["\\nsucc"], + kind: "infix", + associativity: "right", + precedence: 260 + }, + { + name: "Between", + latexTrigger: ["\\between"], + kind: "infix", + associativity: "right", + precedence: 265 + } +]; +var DEFINITIONS_LOGIC = [ + // Constants + { + name: "True", + kind: "symbol", + latexTrigger: ["\\top"] + // ⊤ U+22A4 + }, + { + kind: "symbol", + latexTrigger: "\\mathrm{True}", + parse: "True" + }, + { + kind: "symbol", + latexTrigger: "\\operator{True}", + parse: "True" + }, + { + kind: "symbol", + latexTrigger: "\\mathsf{T}", + parse: "True" + }, + { + name: "False", + kind: "symbol", + latexTrigger: ["\\bot"] + // ⊥ U+22A5 + }, + { + kind: "symbol", + latexTrigger: "\\operator{False}", + parse: "True" + }, + { + kind: "symbol", + latexTrigger: "\\mathsf{F}", + parse: "True" + }, + { + name: "Maybe", + kind: "symbol", + latexTrigger: "\\operatorname{Maybe}", + serialize: "\\operatorname{Maybe}" + }, + { + kind: "symbol", + latexTrigger: "\\mathrm{Maybe}", + parse: "Maybe" + }, + // Operators + { + name: "And", + kind: "infix", + latexTrigger: ["\\land"], + precedence: 317 + // serialize: '\\land', + }, + { kind: "infix", latexTrigger: ["\\wedge"], parse: "And", precedence: 317 }, + { kind: "infix", latexTrigger: "\\&", parse: "And", precedence: 317 }, + { + kind: "infix", + latexTrigger: "\\operatorname{and}", + parse: "And", + precedence: 317 + }, + { + name: "Or", + kind: "infix", + latexTrigger: ["\\lor"], + precedence: 310 + }, + { kind: "infix", latexTrigger: ["\\vee"], parse: "Or", precedence: 310 }, + { kind: "infix", latexTrigger: "\\parallel", parse: "Or", precedence: 310 }, + { + kind: "infix", + latexTrigger: "\\operatorname{or}", + parse: "And", + precedence: 310 + }, + { + name: "Xor", + kind: "infix", + latexTrigger: ["\\veebar"], + precedence: 315 + }, + // Possible alt: \oplus ⊕ U+2295 + { + name: "Not", + kind: "prefix", + latexTrigger: ["\\lnot"], + precedence: 880 + }, + { + name: "Nand", + kind: "infix", + latexTrigger: ["\\barwedge"], + precedence: 315 + // serialize: '\\mid', + }, + { + name: "Nor", + kind: "infix", + latexTrigger: ["\u22BD"], + // bar vee + precedence: 315 + // serialize: '\\downarrow', + }, + // Functions + { + kind: "function", + identifierTrigger: "and", + parse: "And" + }, + { + kind: "function", + identifierTrigger: "or", + parse: "Or" + }, + { + kind: "function", + identifierTrigger: "not", + parse: "Not" + }, + // Relations + { + name: "Implies", + kind: "infix", + precedence: 220, + associativity: "right", + latexTrigger: ["\\implies"], + serialize: "\\implies" + }, + { + latexTrigger: ["\\Rightarrow"], + kind: "infix", + precedence: 220, + associativity: "right", + parse: "Implies" + }, + { + name: "Equivalent", + // MathML: identical to, Mathematica: Congruent + latexTrigger: ["\\iff"], + kind: "infix", + associativity: "right", + precedence: 219 + }, + { + latexTrigger: ["\\Leftrightarrow"], + kind: "infix", + associativity: "right", + precedence: 219, + parse: "Equivalent" + }, + { + latexTrigger: ["\\equiv"], + kind: "infix", + associativity: "right", + precedence: 219, + parse: "Equivalent" + }, + { + name: "Proves", + kind: "infix", + latexTrigger: ["\\vdash"], + precedence: 220, + associativity: "right", + serialize: "\\vdash" + }, + { + name: "Entails", + kind: "infix", + latexTrigger: ["\\vDash"], + precedence: 220, + associativity: "right", + serialize: "\\vDash" + }, + { + name: "Satisfies", + kind: "infix", + latexTrigger: ["\\models"], + precedence: 220, + associativity: "right", + serialize: "\\models" + } +]; +function parseSingleArg(cmd) { + return (parser) => { + const arg = parser.parseGroup(); + return arg === null ? [cmd] : [cmd, arg]; + }; +} +var DEFINITIONS_OTHERS = [ + { + name: "Overscript", + latexTrigger: ["\\overset"], + kind: "infix", + precedence: 700 + // @todo: not in MathML + }, + { + name: "Underscript", + latexTrigger: ["\\underset"], + kind: "infix", + precedence: 700 + // @todo: not in MathML + }, + { + name: "Increment", + latexTrigger: ["+", "+"], + kind: "postfix", + precedence: 880 + }, + { + name: "Decrement", + latexTrigger: ["-", "-"], + kind: "postfix", + precedence: 880 + }, + { + name: "PreIncrement", + latexTrigger: ["+", "+"], + kind: "prefix", + precedence: 880 + }, + { + name: "PreDecrement", + latexTrigger: ["-", "-"], + kind: "prefix", + precedence: 880 + }, + { + name: "Ring", + // Aka 'Composition', i.e. function composition + latexTrigger: ["\\circ"], + kind: "infix", + precedence: 265 + // @todo: MathML is 950 + // @todo: check lhs and rhs are functions + }, + { + name: "Transpose", + latexTrigger: ["^", "T"], + kind: "postfix" + // @todo: if lhs is a list/tensor + }, + { + // @todo: if lhs is a list/tensor + name: "ConjugateTranspose", + latexTrigger: ["^", "H"], + kind: "postfix" + }, + { + name: "StringJoin", + // @todo From Mathematica...? + latexTrigger: ["\\lt", "\\gt"], + kind: "infix", + precedence: 780 + }, + { + name: "Starstar", + latexTrigger: ["\\star", "\\star"], + kind: "infix", + precedence: 780 + }, + { + // Partial derivative using a variation of the Euler notation: `∂_xf(x)` + // (the Euler notation uses `D_1f(x)` where "1" is for the first variable + // For the Leibniz notation see 'Divide' that handles `∂f/∂x` + name: "PartialDerivative", + // PartialDerivative(expr, {lists of vars}, degree) + latexTrigger: ["\\partial"], + kind: "prefix", + parse: (parser) => { + var _a, _b, _c, _d; + let done = false; + let sup = "Nothing"; + let sub2 = "Nothing"; + while (!done) { + parser.skipSpace(); + if (parser.match("_")) { + sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); + } else if (parser.match("^")) { + sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); + } else { + done = true; + } + } + const seq = getSequence(sub2); + if (seq) + sub2 = ["List", ...seq]; + if (sub2 === null || sup === null) + return null; + let rhs = (_c = parser.parseGroup()) != null ? _c : "Nothing"; + if (rhs !== "Nothing" && !isEmptySequence(rhs)) { + const args = (_d = parser.parseArguments()) != null ? _d : ["Nothing"]; + rhs = [rhs, ...args]; + } + return ["PartialDerivative", rhs, sub2, sup]; + }, + serialize: (serializer, expr) => { + var _a; + let result = "\\partial"; + const fn = op(expr, 1); + const vars = op(expr, 2); + const degree = op(expr, 3); + if (vars !== null && vars !== "Nothing") { + if (head(vars) === "List") { + result += "_{" + serializer.serialize(["Sequence", ...(_a = ops(vars)) != null ? _a : []]) + "}"; + } else { + result += "_{" + serializer.serialize(vars) + "}"; + } + } + if (degree !== null && degree !== "Nothing") + result += "^{" + serializer.serialize(degree) + "}"; + if (fn !== null && fn !== "Nothing") + result += serializer.serialize(fn); + return result; + }, + precedence: 740 + }, + { + name: "OverBar", + latexTrigger: ["\\overline"], + parse: parseSingleArg("OverBar") + }, + { + name: "UnderBar", + latexTrigger: ["\\underline"], + parse: parseSingleArg("UnderBar") + }, + { + name: "OverVector", + latexTrigger: ["\\vec"], + parse: parseSingleArg("OverVector") + }, + { + name: "OverTilde", + latexTrigger: ["\\tilde"], + parse: parseSingleArg("OverTilde") + }, + { + name: "OverHat", + latexTrigger: ["\\hat"], + parse: parseSingleArg("OverHat") + }, + { + name: "OverRightArrow", + latexTrigger: ["\\overrightarrow"], + parse: parseSingleArg("OverRightArrow") + }, + { + name: "OverLeftArrow", + latexTrigger: ["\\overleftarrow"], + parse: parseSingleArg("OverLeftArrow") + }, + { + name: "OverRightDoubleArrow", + latexTrigger: ["\\Overrightarrow"], + parse: parseSingleArg("OverRightDoubleArrow") + }, + { + name: "OverLeftHarpoon", + latexTrigger: ["\\overleftharpoon"], + parse: parseSingleArg("OverLeftHarpoon") + }, + { + name: "OverRightHarpoon", + latexTrigger: ["\\overrightharpoon"], + parse: parseSingleArg("OverRightHarpoon") + }, + { + name: "OverLeftRightArrow", + latexTrigger: ["\\overleftrightarrow"], + parse: parseSingleArg("OverLeftRightArrow") + }, + { + name: "OverBrace", + latexTrigger: ["\\overbrace"], + parse: parseSingleArg("OverBrace") + }, + { + name: "OverLineSegment", + latexTrigger: ["\\overlinesegment"], + parse: parseSingleArg("OverLineSegment") + }, + { + name: "OverGroup", + latexTrigger: ["\\overgroup"], + parse: parseSingleArg("OverGroup") + }, + { + latexTrigger: ["\\displaystyle"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\textstyle"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\scriptstyle"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\scriptscriptstyle"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\tiny"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\scriptsize"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\footnotesize"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\small"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\normalsize"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\large"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\Large"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\LARGE"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\huge"], + parse: () => ["Sequence"] + }, + { + latexTrigger: ["\\Huge"], + parse: () => ["Sequence"] + }, + { + name: "Style", + serialize: (serializer, expr) => { + let result = serializer.serialize(op(expr, 1)); + const dict = dictionary(op(expr, 2)); + if (dict === null) + return result; + if (stringValue(dict.display) === "block") + result = joinLatex(["{\\displaystyle", result, "}"]); + else if (stringValue(dict.display) === "inline") + result = joinLatex(["{\\textstyle", result, "}"]); + else if (stringValue(dict.display) === "script") + result = joinLatex(["{\\scriptstyle", result, "}"]); + else if (stringValue(dict.display) === "scriptscript") + result = joinLatex(["{\\scriptscriptstyle", result, "}"]); + const v = machineValue(dict.size); + if (v !== null && v >= 1 && v <= 10) { + result = joinLatex([ + "{", + { + 1: "\\tiny", + 2: "\\scriptsize", + 3: "\\footnotesize", + 4: "\\small", + 5: "\\normalsize", + 6: "\\large", + 7: "\\Large", + 8: "\\LARGE", + 9: "\\huge", + 10: "\\Huge" + }[v], + result, + "}" + ]); + } + return result; + } + }, + { + latexTrigger: ["\\!"], + parse: () => ["HorizontalSpacing", -3] + }, + { + latexTrigger: ["\\ "], + parse: () => ["HorizontalSpacing", 6] + }, + { + latexTrigger: ["\\:"], + parse: () => ["HorizontalSpacing", 4] + }, + { + latexTrigger: ["\\enskip"], + parse: () => ["HorizontalSpacing", 9] + }, + { + latexTrigger: ["\\quad"], + parse: () => ["HorizontalSpacing", 18] + }, + { + latexTrigger: ["\\qquad"], + parse: () => ["HorizontalSpacing", 36] + }, + { + latexTrigger: ["\\,"], + parse: () => ["HorizontalSpacing", 3] + }, + { + latexTrigger: ["\\;"], + parse: () => ["HorizontalSpacing", 5] + }, + { + latexTrigger: ["\\enspace"], + parse: () => ["HorizontalSpacing", 9] + }, + { + name: "HorizontalSpacing", + // The `HorizontalSpacing` function has two forms + // `["HorizontalSpacing", number]` -> indicate a space of mu units + // `["HorizontalSpacing", expr, 'op'|'bin'|rel]` -> indicate a spacing around and expression, i.e. `\mathbin{x}`, etc... + serialize: (serializer, expr) => { + var _a; + if (op(expr, 2)) { + return serializer.serialize(op(expr, 1)); + } + const v = machineValue(op(expr, 1)); + if (v === null) + return ""; + return (_a = { + "-3": "\\!", + 6: "\\ ", + 3: "\\,", + 4: "\\:", + 5: "\\;", + 9: "\\enspace", + 18: "\\quad", + 36: "\\qquad" + }[v]) != null ? _a : ""; + } + } + // if ( + // [ + // '\\!', + // '\\:', + // '\\enskip', + // '\\quad', + // '\\,', + // '\\;', + // '\\enspace', + // '\\qquad', + // '\\selectfont', + // ].includes(token) + // ) { + // return 'skip'; + // } + // { + // name: '', + // trigger: '\\mathring', + // }, + // { + // name: '', + // trigger: '\\check', + // }, +]; +function parseTrig(op3) { + return (parser, until) => { + var _a, _b; + const head2 = (_b = (_a = { + "\\arcsin": "Arcsin", + "\\arccos": "Arccos", + "\\arctan": "Arctan", + "\\arctg": "Arctan", + "\\arcctg": "Arctan", + "\\arcsec": "Arcsec", + "\\arccsc": " Arccsc", + "\\arsinh": "Arsinh", + "\\arcosh": "Arcosh", + "\\artanh": "Artanh", + "\\arcsech": "Arcsech", + "\\arccsch": "Arcsch", + // '\\arg', + "\\ch": "Cosh", + "\\cos": "Cos", + "\\cosec": "Csc", + "\\cosh": "Csch", + "\\cot": "Cot", + "\\cotg": "Cot", + "\\coth": "Coth", + "\\csc": "Csc", + "\\ctg": "Cot", + "\\cth": "Coth", + "\\sec": "Sec", + "\\sin": "Sin", + "\\sinh": "Sinh", + "\\sh": "Sinh", + "\\tan": "Tan", + "\\tanh": "Tanh", + "\\tg": "Tan", + "\\th": "Tanh" + }[op3 != null ? op3 : ""]) != null ? _a : op3) != null ? _b : ""; + if (parser.atTerminator(until)) + return head2; + const fn = parser.parsePostfixOperator(head2, until); + if (fn !== null) + return fn; + const args = parser.parseArguments("implicit", until); + return args === null ? head2 : [head2, ...args]; + }; +} +var DEFINITIONS_TRIGONOMETRY = [ + { + name: "Arcsin", + latexTrigger: ["\\arcsin"], + parse: parseTrig("Arcsin") + }, + { + name: "Arccos", + latexTrigger: ["\\arccos"], + parse: parseTrig("Arccos") + }, + { + name: "Arctan", + latexTrigger: ["\\arctan"], + parse: parseTrig("Arctan") + }, + { + latexTrigger: ["\\arctg"], + parse: parseTrig("Arctan") + }, + { + name: "Arccot", + latexTrigger: ["\\arcctg"], + parse: parseTrig("Arccot") + }, + { + name: "Arcsec", + latexTrigger: "arcsec", + parse: parseTrig("Arcsec") + }, + { + name: "Arccsc", + latexTrigger: ["\\arccsc"], + parse: parseTrig("Arccsc") + }, + { + name: "Arsinh", + latexTrigger: ["\\arsinh"], + parse: parseTrig("Arsinh") + }, + { + name: "Arcosh", + latexTrigger: ["\\arcosh"], + parse: parseTrig("Arcosh") + }, + { + name: "Artanh", + latexTrigger: ["\\artanh"], + parse: parseTrig("Artanh") + }, + { + name: "Arsech", + latexTrigger: ["\\arsech"], + parse: parseTrig("Arsech") + }, + { + name: "Arcsch", + latexTrigger: ["\\arcsch"], + parse: parseTrig("Arcsch") + }, + { + // Rusian hyperbolic cosine + latexTrigger: ["\\ch"], + parse: parseTrig("Cosh") + }, + { + name: "Cosec", + latexTrigger: ["\\cosec"], + parse: parseTrig("Cosec") + }, + { + name: "Cosh", + latexTrigger: ["\\cosh"], + parse: parseTrig("Cosh") + }, + { + name: "Cot", + latexTrigger: ["\\cot"], + parse: parseTrig("Cot") + }, + { + latexTrigger: ["\\cotg"], + parse: parseTrig("Cot") + }, + { + name: "Coth", + latexTrigger: ["\\coth"], + parse: parseTrig("Coth") + }, + { + name: "Csc", + latexTrigger: ["\\csc"], + parse: parseTrig("Csc") + }, + { + // Rusian cotangent + latexTrigger: ["\\ctg"], + parse: parseTrig("Cot") + }, + { + latexTrigger: ["\\cth"], + parse: parseTrig("Cotanh") + }, + { + name: "Sec", + latexTrigger: ["\\sec"], + parse: parseTrig("Sec") + }, + { + name: "Sinh", + latexTrigger: ["\\sinh"], + parse: parseTrig("Sinh") + }, + { + latexTrigger: ["\\sh"], + parse: parseTrig("Sinh") + }, + { + name: "Tan", + latexTrigger: ["\\tan"], + parse: parseTrig("Tan") + }, + { + latexTrigger: ["\\tg"], + parse: parseTrig("Tan") + }, + { + name: "Tanh", + latexTrigger: ["\\tanh"], + parse: parseTrig("Tanh") + }, + { + latexTrigger: ["\\th"], + parse: parseTrig("Tanh") + }, + { + name: "Cos", + latexTrigger: ["\\cos"], + parse: parseTrig("Cos") + }, + { + name: "Sin", + latexTrigger: ["\\sin"], + parse: parseTrig("Sin") + } +]; +var DEFINITIONS_SETS = [ + // Constants + { name: "AlgebraicNumber", latexTrigger: "\\bar\\Q" }, + { name: "ComplexNumber", latexTrigger: ["\\C"] }, + { latexTrigger: "\\mathbb{C}", parse: "ComplexNumber" }, + { name: "ImaginaryNumber", latexTrigger: ["\\imaginaryI", "\\R"] }, + { name: "ExtendedComplexNumber", latexTrigger: ["\\bar", "\\C"] }, + { name: "EmptySet", latexTrigger: ["\\emptyset"] }, + { latexTrigger: ["\\varnothing"], parse: "EmptySet" }, + // Parsing only + { name: "Integer", latexTrigger: ["\\Z"] }, + { latexTrigger: "\\mathbb{Z}", parse: "Integer" }, + { name: "RationalNumber", latexTrigger: ["\\Q"] }, + { name: "RealNumber", latexTrigger: ["\\R"] }, + { latexTrigger: "\\mathbb{R}", parse: "RealNumber" }, + { name: "ExtendedRealNumber", latexTrigger: ["\\bar", "\\R"] }, + { name: "TranscendentalNumber", latexTrigger: "\\R-\\bar\\Q" }, + { latexTrigger: "\\R\\backslash\\bar\\Q", parse: "TranscendentalNumber" }, + // Real numbers < 0 + { name: "NegativeNumber", latexTrigger: "\\R^-" }, + { latexTrigger: "\\R^{-}", parse: "NegativeNumber" }, + { latexTrigger: "\\R_-", parse: "NegativeNumber" }, + { latexTrigger: "\\R_{-}", parse: "NegativeNumber" }, + { latexTrigger: "\\R^{\\lt}", parse: "NegativeNumber" }, + // Real numbers > 0 + { name: "PositiveNumber", latexTrigger: "\\R^+" }, + { latexTrigger: "\\R^{+}", parse: "PositiveNumber" }, + { latexTrigger: "\\R_+", parse: "PositiveNumber" }, + { latexTrigger: "\\R_{+}", parse: "PositiveNumber" }, + { latexTrigger: "\\R^{\\gt}", parse: "PositiveNumber" }, + // Real numbers <= 0 + { name: "NonPositiveNumber", latexTrigger: "\\R^{0-}" }, + { latexTrigger: "\\R^{-0}", parse: "NonPositiveNumber" }, + { latexTrigger: "\\R^{\\leq}", parse: "NonPositiveNumber" }, + // Integers < 0 + { name: "NegativeInteger", latexTrigger: "\\Z^-" }, + { latexTrigger: "\\Z^-", parse: "NegativeInteger" }, + { latexTrigger: "\\Z^{-}", parse: "NegativeInteger" }, + { latexTrigger: "\\Z_-", parse: "NegativeInteger" }, + { latexTrigger: "\\Z_{-}", parse: "NegativeInteger" }, + { latexTrigger: "\\Z^{\\lt}", parse: "NegativeInteger" }, + // Integers > 0 + { name: "PositiveInteger", latexTrigger: "\\Z^+" }, + { latexTrigger: "\\Z^{+}", parse: "PositiveInteger" }, + { latexTrigger: "\\Z_+", parse: "PositiveInteger" }, + { latexTrigger: "\\Z_{+}", parse: "PositiveInteger" }, + { latexTrigger: "\\Z^{\\gt}", parse: "PositiveInteger" }, + { latexTrigger: "\\Z^{\\gt0}", parse: "PositiveInteger" }, + { latexTrigger: "\\N^+", parse: "PositiveInteger" }, + { latexTrigger: "\\N^{+}", parse: "PositiveInteger" }, + { latexTrigger: "\\N^*", parse: "PositiveInteger" }, + { latexTrigger: "\\N^{*}", parse: "PositiveInteger" }, + { latexTrigger: "\\N^\\star", parse: "PositiveInteger" }, + { latexTrigger: "\\N^{\\star}", parse: "PositiveInteger" }, + { latexTrigger: "\\N_1", parse: "PositiveInteger" }, + { latexTrigger: "\\N_{1}", parse: "PositiveInteger" }, + // https://mathvault.ca/hub/higher-math/math-symbols/algebra-symbols/ + // Integers >= 0 + { name: "NonNegativeInteger", latexTrigger: ["\\N"] }, + { latexTrigger: "\\Z^{+0}", parse: "NonNegativeInteger" }, + { latexTrigger: "\\Z^{\\geq}", parse: "NonNegativeInteger" }, + { latexTrigger: "\\Z^{\\geq0}", parse: "NonNegativeInteger" }, + { latexTrigger: "\\Z^{0+}", parse: "NonNegativeInteger" }, + { latexTrigger: "\\mathbb{N}", parse: "NonNegativeInteger" }, + { latexTrigger: "\\N_0", parse: "NonNegativeInteger" }, + { latexTrigger: "\\N_{0}", parse: "NonNegativeInteger" }, + // + // Set Expressions + // + // @todo: could also have a `CartesianPower` function with a number `rhs` + { + name: "CartesianProduct", + latexTrigger: ["\\times"], + kind: "infix", + associativity: "right", + // Caution: cartesian product is not associative + precedence: 390, + // Same as Multiply? + parse: (parser, lhs, until) => { + if (390 < until.minPrec) + return null; + const ce = parser.computeEngine; + if (!ce || !ce.box(lhs).domain.isCompatible("Set")) + return null; + const index = parser.index; + const rhs = parser.parseExpression({ ...until, minPrec: 390 }); + if (rhs === null || ce.box(lhs).domain.isCompatible("Set") !== true) { + parser.index = index; + return null; + } + return ["CartesianProduct", lhs, rhs]; + } + }, + { + latexTrigger: ["^", "\\complement"], + kind: "postfix", + parse: (_parser, lhs) => { + return ["Complement", lhs]; + } + // precedence: 240, + // @todo: serialize for the multiple argument case + }, + { + name: "Complement", + latexTrigger: ["^", "<{>", "\\complement", "<}>"], + kind: "postfix" + // precedence: 240, + // @todo: serialize for the multiple argument case + }, + { + name: "Intersection", + latexTrigger: ["\\cap"], + kind: "infix", + precedence: 350 + }, + { + name: "Interval", + // @todo: parse opening '[' or ']' or '(' + serialize: serializeSet + }, + { + name: "Multiple", + // @todo: parse + serialize: serializeSet + }, + { + name: "Union", + latexTrigger: ["\\cup"], + kind: "infix", + precedence: 350 + }, + { + name: "Range", + // @todo: parse opening '[' or ']' or '(' + serialize: serializeSet + }, + // { + // name: 'Set', + // kind: 'matchfix', + // openDelimiter: '{', + // closeDelimiter: '}', + // precedence: 20, + // // @todo: the set syntax can also include conditions... + // }, + { + name: "SetMinus", + latexTrigger: ["\\setminus"], + kind: "infix", + precedence: 650 + }, + { + name: "SymmetricDifference", + latexTrigger: ["\\triangle"], + // or \\ominus + kind: "infix", + // @todo: parser could check that lhs and rhs are sets + precedence: 260 + }, + // Predicates/Relations + { + latexTrigger: ["\\ni"], + kind: "infix", + associativity: "right", + precedence: 160, + // As per MathML, lower precedence + parse: (parser, lhs, terminator) => { + const rhs = parser.parseExpression(terminator); + return rhs === null ? null : ["Element", rhs, lhs]; + } + }, + { + name: "Element", + latexTrigger: ["\\in"], + kind: "infix", + precedence: 240 + }, + { + name: "NotElement", + latexTrigger: ["\\notin"], + kind: "infix", + precedence: 240 + }, + { + name: "NotSubset", + latexTrigger: ["\\nsubset"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + name: "NotSuperset", + latexTrigger: ["\\nsupset"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + name: "NotSubsetNotEqual", + latexTrigger: ["\\nsubseteq"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + name: "NotSupersetNotEqual", + latexTrigger: ["\\nsupseteq"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + name: "SquareSubset", + // MathML: square image of + latexTrigger: ["\\sqsubset"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "SquareSubsetEqual", + // MathML: square image of or equal to + latexTrigger: ["\\sqsubseteq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "SquareSuperset", + // MathML: square original of + latexTrigger: ["\\sqsupset"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "SquareSupersetEqual", + // MathML: square original of or equal + latexTrigger: ["\\sqsupseteq"], + kind: "infix", + associativity: "right", + precedence: 265 + }, + { + name: "Subset", + latexTrigger: ["\\subset"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + latexTrigger: ["\\subsetneq"], + kind: "infix", + associativity: "right", + precedence: 240, + parse: "Subset" + }, + { + latexTrigger: ["\\varsubsetneqq"], + kind: "infix", + associativity: "right", + precedence: 240, + parse: "Subset" + }, + { + name: "SubsetEqual", + latexTrigger: ["\\subseteq"], + kind: "infix", + precedence: 240 + }, + { + name: "Superset", + latexTrigger: ["\\supset"], + kind: "infix", + associativity: "right", + precedence: 240 + }, + { + latexTrigger: ["\\supsetneq"], + kind: "infix", + associativity: "right", + precedence: 240, + parse: "Superset" + }, + { + latexTrigger: ["\\varsupsetneq"], + kind: "infix", + associativity: "right", + precedence: 240, + parse: "Superset" + }, + { + name: "SupersetEqual", + latexTrigger: ["\\supseteq"], + kind: "infix", + associativity: "right", + precedence: 240 + } +]; +function serializeSet(serializer, expr) { + var _a; + if (expr === null) + return ""; + const h = head(expr); + if (h === null) + return ""; + if (h === "Set") { + if (nops(expr) === 0) + return "\\emptyset"; + if (nops(expr) === 2 && head(op(expr, 2)) === "Condition") { + return joinLatex([ + "\\left\\lbrace", + serializer.serialize(op(expr, 1)), + "\\middle\\mid", + serializer.serialize(op(expr, 2)), + "\\right\\rbrace" + ]); + } + return joinLatex([ + "\\left\\lbrace", + ...((_a = ops(expr)) != null ? _a : []).map((x) => serializer.serialize(x) + " ,"), + "\\right\\rbrace" + ]); + } + if (h === "Multiple") { + } + if (h === "Range") { + return joinLatex([ + "\\mathopen\\lbrack", + serializer.serialize(op(expr, 1)), + ", ", + serializer.serialize(op(expr, 2)), + "\\mathclose\\rbrack" + ]); + } + if (h === "Interval") { + let op12 = op(expr, 1); + let op22 = op(expr, 2); + let openLeft = false; + let openRight = false; + if (head(op12) === "Open") { + op12 = op(op12, 1); + openLeft = true; + } + if (head(op22) === "Open") { + op22 = op(op22, 1); + openRight = true; + } + return joinLatex([ + `\\mathopen${openLeft ? "\\rbrack" : "\\lbrack"}`, + serializer.serialize(op12), + ", ", + serializer.serialize(op22), + `\\mathclose${openRight ? "\\lbrack" : "\\rbrack"}` + ]); + } + const style = serializer.numericSetStyle(expr, serializer.level); + if (style === "compact") { + } else if (style === "interval") { + } else if (style === "regular") { + } else if (style === "set-builder") { + } + return ""; +} +function parseIntegral(command, n = 1) { + return (parser) => { + var _a, _b, _c; + parser.skipSpace(); + let sup = null; + let sub2 = null; + while (!(sub2 !== null && sup !== null) && (parser.peek === "_" || parser.peek === "^")) { + if (parser.match("_")) + sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); + else if (parser.match("^")) { + sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); + } + parser.skipSpace(); + } + if (sub2 === "Nothing" || isEmptySequence(sub2)) + sub2 = null; + if (sup === "Nothing" || isEmptySequence(sup)) + sup = null; + let [fn, index] = parseIntegralBody(parser, n); + if (fn && !index) { + if (head(fn) === "Add" || head(fn) === "Subtract") { + const newOp = []; + const rest = []; + for (const op3 of (_c = ops(fn)) != null ? _c : []) { + if (index) + rest.push(op3); + else { + let op22; + [op22, index] = parseIntegralBodyExpression(op3); + newOp.push(op22 != null ? op22 : op3); + } + } + if (index !== null && rest.length > 0) { + return [ + "Add", + makeIntegral( + parser, + command, + ["Add", ...newOp], + [{ index, sub: sub2, sup }] + ), + ...rest + ]; + } + } else if (head(fn) === "Divide") { + let altNumerator; + [altNumerator, index] = parseIntegralBodyExpression(op(fn, 1)); + if (altNumerator !== null && index !== null) { + fn = ["Divide", altNumerator, op(fn, 2)]; + } + } + } + return makeIntegral(parser, command, fn, [{ index, sub: sub2, sup }]); + }; +} +function makeIntegral(parser, command, fn, ranges) { + if (fn && ranges.length === 0) + return [command, fn]; + fn != null ? fn : fn = "Nothing"; + if (parser.computeEngine) { + const ce = parser.computeEngine; + let hasIndex = false; + const idTable = {}; + for (const r of ranges) + if (r.index) { + hasIndex = true; + idTable[r.index] = { domain: "ExtendedRealNumber" }; + } + if (hasIndex) + ce.pushScope(idTable); + fn = ce.box(fn).json; + if (hasIndex) + ce.popScope(); + } + return [command, fn, ...ranges.map((r) => makeRange(r))]; +} +function makeRange(range) { + var _a; + const heldIndex = range.index ? ["Hold", range.index] : "Nothing"; + if (range.sup !== null) + return ["Tuple", heldIndex, (_a = range.sub) != null ? _a : "Nothing", range.sup]; + if (range.sub !== null) + return ["Tuple", heldIndex, range.sub]; + return heldIndex; +} +function parseIntegralBody(parser, n = 1) { + var _a; + const start = parser.index; + let found = false; + let fn = parser.parseExpression({ + minPrec: 266, + condition: () => { + if (parser.matchAll(["\\mathrm", "<{>", "d", "<}>"])) + found = true; + else if (parser.matchAll(["\\operatorname", "<{>", "d", "<}>"])) + found = true; + return found; + } + }); + if (!found) { + parser.index = start; + fn = parser.parseExpression({ + minPrec: 266, + condition: () => { + if (parser.match("d")) + found = true; + return found; + } + }); + } + if (fn && !found) + return parseIntegralBodyExpression(fn); + const indexes = parseIndexes(parser, n); + return [fn, (_a = indexes[0]) != null ? _a : null]; +} +function parseIndexes(parser, n = 1) { + parser.skipSpace(); + const result = []; + const index = symbol(parser.parseSymbol()); + if (index === null) + return []; + result.push(index); + return result; +} +function parseIntegralBodyExpression(expr) { + const h = head(expr); + const op12 = op(expr, 1); + if (!op12) + return [expr, null]; + if (h === "Multiply") { + const args = ops(expr); + if (args && args.length > 1) { + const sym = symbol(args[args.length - 2]); + if (sym === "d" || sym === "d_upright") { + if (args.length === 2) + return [null, symbol(args[1])]; + if (args.length === 3) + return [args[0], symbol(args[2])]; + return [ + ["Multiply", ...args.slice(0, -2)], + symbol(args[args.length - 1]) + ]; + } + const [fn2, index] = parseIntegralBodyExpression(args[args.length - 1]); + if (fn2) + return [["Multiply", ...args.slice(0, -1), fn2], index]; + } + } else if (h === "Delimiter") { + const [fn2, index] = parseIntegralBodyExpression(op12); + if (index) { + if (!fn2) + return [null, index]; + return [["Delimiter", fn2, ...ops(expr).slice(1)], index]; + } + } else if (h === "Add") { + const args = ops(expr); + if (args && args.length > 0) { + const [fn2, index] = parseIntegralBodyExpression(args[args.length - 1]); + if (index) { + if (fn2) + return [["Add", ...args.slice(0, -1), fn2], index]; + if (args.length > 2) + return [["Add", ...args.slice(0, -1)], index]; + if (args.length > 2) + return [args[0], index]; + } + } + } else if (h === "Negate") { + const [fn2, index] = parseIntegralBodyExpression(op12); + if (index) + return [fn2 ? ["Negate", fn2] : null, index]; + } else if (h === "Divide") { + const [fn2, index] = parseIntegralBodyExpression(op12); + if (index) + return [["Divide", fn2 != null ? fn2 : 1, op(expr, 2)], index]; + } else { + const args = ops(expr); + if ((args == null ? void 0 : args.length) === 1) { + const [arg2, index] = parseIntegralBodyExpression(args[0]); + if (index) + return [[head(expr), arg2], index]; + } + } + return [expr, null]; +} +function serializeIntegral(command) { + return (serializer, expr) => { + var _a; + if (!op(expr, 1)) + return command; + let arg = op(expr, 2); + const h = head(arg); + let indexExpr = null; + if (h === "Tuple" || h === "Triple" || h === "Pair" || h === "Single") { + indexExpr = op(arg, 1); + } else if (h === "Hold") { + indexExpr = op(arg, 1); + } else { + indexExpr = (_a = op(arg, 1)) != null ? _a : "x"; + arg = null; + } + if (head(indexExpr) === "Hold") + indexExpr = op(indexExpr, 1); + const index = indexExpr !== null ? symbol(indexExpr) : null; + let fn = op(expr, 1); + if (head(fn) === "Lambda" && op(fn, 1)) + fn = subs(op(fn, 1), { _: index != null ? index : "x", _1: index != null ? index : "x" }); + if (!arg) { + if (!index || index === "Nothing") + return joinLatex([command, "\\!", serializer.serialize(fn)]); + return joinLatex([ + command, + "\\!", + serializer.serialize(fn), + "\\,\\operatorname{d}", + serializer.serialize(index) + ]); + } + const subSymbol = op(arg, 2) ? symbol(op(arg, 2)) : null; + let sub2 = arg && subSymbol !== "Nothing" ? serializer.serialize(op(arg, 2)) : ""; + if (sub2.length > 0) + sub2 = `_{${sub2}}`; + let sup = ""; + const supSymbol = op(arg, 3) ? symbol(op(arg, 3)) : null; + if (op(arg, 3) && supSymbol !== "Nothing") + sup = `^{${serializer.serialize(op(arg, 3))}}`; + return joinLatex([ + command, + sup, + sub2, + "\\!", + serializer.serialize(fn), + ...index && symbol(index) !== "Nothing" ? ["\\,\\operatorname{d}", serializer.serialize(index)] : [] + ]); + }; +} +var DEFINITIONS_CALCULUS = [ + { + kind: "expression", + name: "Integrate", + latexTrigger: ["\\int"], + parse: parseIntegral("Integrate"), + serialize: serializeIntegral("\\int") + }, + { + kind: "expression", + latexTrigger: ["\\iint"], + parse: parseIntegral("Integrate", 2) + }, + { + kind: "expression", + latexTrigger: ["\\iiint"], + parse: parseIntegral("Integrate", 3) + }, + { + kind: "expression", + name: "CircularIntegrate", + latexTrigger: ["\\oint"], + parse: parseIntegral("CircularIntegrate"), + serialize: serializeIntegral("\\oint") + }, + { + kind: "expression", + latexTrigger: ["\\oiint"], + parse: parseIntegral("CircularIntegrate", 2) + }, + { + kind: "expression", + latexTrigger: ["\\oiiint"], + parse: parseIntegral("CircularIntegrate", 3) + } +]; +var SYMBOLS = [ + // Greek + ["alpha", "\\alpha", 945], + ["beta", "\\beta", 946], + ["gamma", "\\gamma", 947], + ["delta", "\\delta", 948], + ["epsilon", "\\epsilon", 949], + ["epsilonSymbol", "\\varepsilon", 1013], + // GREEK LUNATE EPSILON SYMBOL + ["zeta", "\\zeta", 950], + ["eta", "\\eta", 951], + ["theta", "\\theta", 952], + ["thetaSymbol", "\\vartheta", 977], + // Unicode GREEK THETA SYMBOL + ["iota", "\\iota", 953], + ["kappa", "\\kappa", 954], + ["kappaSymbol", "\\varkappa", 1008], + // GREEK KAPPA SYMBOL + ["lambda", "\\lambda", 955], + ["mu", "\\mu", 956], + ["nu", "\\nu", 957], + ["xi", "\\xi", 958], + ["omicron", "\\omicron", 959], + ["pi", "\\pi", 960], + ["piSymbol", "\\varpi", 982], + // GREEK PI SYMBOL + ["rho", "\\rho", 961], + ["rhoSymbol", "\\varrho", 1009], + // GREEK RHO SYMBOL + ["sigma", "\\sigma", 963], + ["finalSigma", "\\varsigma", 962], + //GREEK SMALL LETTER FINAL SIGMA + ["tau", "\\tau", 964], + ["phi", "\\phi", 981], + // Note GREEK PHI SYMBOL, but common usage in math + ["phiLetter", "\\varphi", 966], + ["upsilon", "\\upsilon", 965], + ["chi", "\\chi", 967], + ["psi", "\\psi", 968], + ["omega", "\\omega", 969], + ["Alpha", "\\Alpha", 913], + ["Beta", "\\Beta", 914], + ["Gamma", "\\Gamma", 915], + ["Delta", "\\Delta", 916], + ["Epsilon", "\\Epsilon", 917], + ["Zeta", "\\Zeta", 918], + ["Eta", "\\Eta", 919], + ["Theta", "\\Theta", 920], + ["Iota", "\\Iota", 921], + ["Kappa", "\\Kappa", 922], + ["Lambda", "\\Lambda", 923], + ["Mu", "\\Mu", 924], + ["Nu", "\\Nu", 925], + ["Xi", "\\Xi", 926], + ["Omicron", "\\Omicron", 927], + // ['Pi', '\\Pi', 0x03a0], + ["Rho", "\\Rho", 929], + ["Sigma", "\\Sigma", 931], + ["Tau", "\\Tau", 932], + ["Phi", "\\Phi", 934], + ["Upsilon", "\\Upsilon", 933], + ["Chi", "\\Chi", 935], + ["Psi", "\\Psi", 936], + ["Omega", "\\Omega", 937], + ["digamma", "\\digamma", 989], + // Hebrew + ["aleph", "\\aleph", 8501], + // Unicode ALEF SYMBOL + ["bet", "\\beth", 8502], + ["gimel", "\\gimel", 8503], + ["dalet", "\\daleth", 8504], + // Letter-like + ["ell", "\\ell", 8499], + // Unicode SCRIPT SMALL L + ["turnedCapitalF", "\\Finv", 8498], + // Unicode TURNED CAPITAL F' + ["turnedCapitalG", "\\Game", 8513], + // TURNED SANS-SERIF CAPITAL G + ["weierstrass", "\\wp", 8472], + // Unicode SCRIPT CAPITAL P + ["eth", "\\eth", 240], + ["invertedOhm", "\\mho", 8487], + // Unicode INVERTED OHM SIGN + ["hBar", "\\hbar", 295], + // Unicode LATIN SMALL LETTER H WITH STROKE + ["hSlash", "\\hslash", 8463], + // Unicode PLANCK CONSTANT OVER TWO PI + // Symbols + ["blackClubSuit", "\\clubsuit", 9827], + ["whiteHeartSuit", "\\heartsuit", 9825], + ["blackSpadeSuit", "\\spadesuit", 9824], + ["whiteDiamondSuit", "\\diamondsuit", 9826], + ["sharp", "\\sharp", 9839], + ["flat", "\\flat", 9837], + ["natural", "\\natural", 9838] +]; +var DEFINITIONS_SYMBOLS = [ + ...SYMBOLS.map(([symbol2, latex, _codepoint]) => { + return { + kind: "symbol", + name: symbol2, + latexTrigger: [latex], + parse: symbol2 + }; + }), + ...SYMBOLS.map(([symbol2, _latex, codepoint]) => { + return { + kind: "symbol", + latexTrigger: [String.fromCodePoint(codepoint)], + parse: symbol2 + }; + }) +]; +var DEFINITIONS_COMPLEX = [ + { + name: "Real", + kind: "function", + latexTrigger: ["\\Re"] + }, + { + name: "Imaginary", + kind: "function", + latexTrigger: ["\\Im"] + }, + { + name: "Argument", + kind: "function", + latexTrigger: ["\\arg"] + }, + { + name: "Conjugate", + latexTrigger: ["^", "\\star"], + kind: "postfix" + } +]; +var DEFINITIONS_STATISTICS = [ + { + name: "Mean", + kind: "function", + identifierTrigger: "mean" + }, + { + name: "Median", + kind: "function", + identifierTrigger: "median" + }, + { + name: "StandarDeviation", + kind: "function", + identifierTrigger: "stddev" + }, + { + latexTrigger: ["\\bar"], + kind: "expression", + parse: (parser, _until) => { + var _a; + const expr = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); + if (!expr || !symbol(expr)) + return null; + return ["Mean", expr]; + } + } +]; +var DEFAULT_DELIMITER = { + "(": "(", + ")": ")", + "[": "\\lbrack", + "]": "\\rbrack", + "{": "\\lbrace", + "}": "\\rbrace", + "<": "\\langle", + ">": "\\rangle", + "|": "\\vert", + "||": "\\Vert", + "\\lceil": "\\lceil", + "\\lfloor": "\\lfloor", + "\\rceil": "\\rceil", + "\\rfloor": "\\rfloor" +}; +function addEntry(result, entry, onError) { + const indexedEntry = makeIndexedEntry(entry, onError); + if (indexedEntry === null) + return; + const kind = "kind" in entry ? entry.kind : "expression"; + const latexTrigger = indexedEntry.latexTrigger; + if (typeof latexTrigger === "string") + result.lookahead = Math.max(result.lookahead, countTokens(latexTrigger)); + const tokensTrigger = tokenize(latexTrigger != null ? latexTrigger : "", []); + if ((latexTrigger == null ? void 0 : latexTrigger[1]) === "\\prime") + ; + if (tokensTrigger.length === 2 && /[_^]/.test(tokensTrigger[0]) && tokensTrigger[1] !== "<{>" && kind !== "function" && kind !== "environment" && kind !== "matchfix") { + let parse = entry.parse; + if (!parse && entry.name) { + if (kind === "postfix" || kind === "prefix") + parse = (_parser, expr) => [entry.name, expr]; + else + parse = entry.name; + } + addEntry( + result, + { + ...entry, + kind, + name: void 0, + serialize: void 0, + parse, + latexTrigger: [tokensTrigger[0], "<{>", tokensTrigger[1], "<}>"] + }, + onError + ); + } + result.defs.push(indexedEntry); + if (indexedEntry.name !== void 0) { + if (result.ids.has(indexedEntry.name)) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + indexedEntry.name, + "Duplicate definition. The name (MathJSON identifier) must be unique, but triggers can be shared by multiple definitions." + ] + }); + } + result.ids.set(indexedEntry.name, indexedEntry); + } +} +function indexLatexDictionary(dic, onError) { + const result = { + lookahead: 1, + ids: /* @__PURE__ */ new Map(), + defs: [] + }; + for (const entry of dic) + addEntry(result, entry, onError); + return result; +} +function makeIndexedEntry(entry, onError) { + var _a, _b, _c, _d; + if (!isValidEntry(entry, onError)) + return null; + const result = { + kind: "kind" in entry ? entry.kind : "expression" + }; + let tokensTrigger = null; + if ("latexTrigger" in entry) { + if (typeof entry.latexTrigger === "string") + tokensTrigger = tokenize(entry.latexTrigger, []); + else + tokensTrigger = entry.latexTrigger; + } + let idTrigger = null; + if ("identifierTrigger" in entry) { + idTrigger = entry.identifierTrigger; + } + if (tokensTrigger !== null) + result.latexTrigger = tokensToString(tokensTrigger); + if (idTrigger !== null) + result.identifierTrigger = idTrigger; + if (entry.name) { + result.name = entry.name; + result.serialize = makeSerializeHandler(entry, tokensTrigger, idTrigger); + } + if (result.kind === "matchfix" && isMatchfixEntry(entry)) { + result.openDelimiter = entry.openTrigger; + result.closeDelimiter = entry.closeTrigger; + } + if (result.kind === "symbol" && isSymbolEntry(entry)) { + result.precedence = (_a = entry.precedence) != null ? _a : 1e4; + } + if ((result.kind === "prefix" || result.kind === "postfix") && (isPrefixEntry(entry) || isPostfixEntry(entry))) { + if (tokensTrigger && (tokensTrigger[0] === "^" || tokensTrigger[0] === "_")) { + result.precedence = 720; + /* @__PURE__ */ console.assert( + entry.precedence === void 0, + "'precedence' is fixed and cannot be modified with ^ and _ triggers" + ); + } else + result.precedence = (_b = entry.precedence) != null ? _b : 1e4; + } + if (result.kind === "infix" && isInfixEntry(entry)) { + /* @__PURE__ */ console.assert( + !tokensTrigger || tokensTrigger[0] !== "^" && tokensTrigger[0] !== "_" || !entry.associativity || entry.associativity === "non" + ); + result.associativity = (_c = entry.associativity) != null ? _c : "non"; + result.precedence = (_d = entry.precedence) != null ? _d : 1e4; + } + const parse = makeParseHandler(entry, tokensTrigger, idTrigger); + if (parse) + result.parse = parse; + return result; +} +function makeSerializeHandler(entry, latexTrigger, idTrigger) { + var _a, _b, _c, _d; + if (typeof entry.serialize === "function") + return entry.serialize; + const kind = (_a = entry["kind"]) != null ? _a : "expression"; + if (kind === "environment") { + const envName = (_c = (_b = entry["identifierTrigger"]) != null ? _b : entry.name) != null ? _c : "unknown"; + return (serializer, expr) => joinLatex([ + `\\begin{${envName}}`, + serializer.serialize(op(expr, 1)), + `\\end{${envName}}` + ]); + } + if (isMatchfixEntry(entry)) { + const openDelim = typeof entry.openTrigger === "string" ? DEFAULT_DELIMITER[entry.openTrigger] : tokensToString(entry["openDelimiter"]); + const closeDelim = typeof entry.closeTrigger === "string" ? DEFAULT_DELIMITER[entry.closeTrigger] : tokensToString(entry["closeDelimiter"]); + return (serializer, expr) => joinLatex([openDelim, serializer.serialize(op(expr, 1)), closeDelim]); + } + let latex = entry.serialize; + if (latex === void 0 && latexTrigger) + latex = tokensToString(latexTrigger); + if (latex) { + if (kind === "postfix") + return (serializer, expr) => joinLatex([serializer.serialize(op(expr, 1)), latex]); + if (kind === "prefix") + return (serializer, expr) => joinLatex([latex, serializer.serialize(op(expr, 1))]); + if (kind === "infix") { + return (serializer, expr) => { + var _a2; + return joinLatex( + ((_a2 = ops(expr)) != null ? _a2 : []).flatMap( + (val, i) => i < nops(expr) - 1 ? [serializer.serialize(val), latex] : [serializer.serialize(val)] + ) + ); + }; + } + return (serializer, expr) => head(expr) ? joinLatex([latex, serializer.wrapArguments(expr)]) : latex; + } + const id = (_d = idTrigger != null ? idTrigger : entry.name) != null ? _d : "unknown"; + if (kind === "postfix") + return (serializer, expr) => joinLatex([ + serializer.serialize(op(expr, 1)), + serializer.serializeSymbol(id) + ]); + if (kind === "prefix") + return (serializer, expr) => joinLatex([ + serializer.serializeSymbol(id), + serializer.serialize(op(expr, 1)) + ]); + if (kind === "infix") + return (serializer, expr) => joinLatex([ + serializer.serialize(op(expr, 1)), + serializer.serializeSymbol(id), + serializer.serialize(op(expr, 2)) + ]); + return (serializer, expr) => head(expr) ? joinLatex([ + serializer.serializeSymbol(id), + serializer.wrapArguments(expr) + ]) : serializer.serializeSymbol(id); +} +function makeParseHandler(entry, latexTrigger, idTrigger) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s; + if ("parse" in entry && typeof entry.parse === "function") + return entry.parse; + const kind = "kind" in entry ? entry.kind : "expression"; + if (kind === "environment") { + const envName = (_b = (_a = entry.parse) != null ? _a : entry.name) != null ? _b : idTrigger; + if (envName) + return (parser, _until) => { + const array = parser.parseTabular(); + if (array === null) + return null; + return [envName, ["List", array.map((row) => ["List", ...row])]]; + }; + } + if (kind === "function") { + const fnName = (_d = (_c = entry.parse) != null ? _c : entry.name) != null ? _d : idTrigger; + if (fnName) + return (parser, until) => { + const args = parser.parseArguments("enclosure", until); + return args === null ? fnName : [fnName, ...args]; + }; + } + if (kind === "symbol") { + const symName = (_f = (_e = entry.parse) != null ? _e : entry.name) != null ? _f : idTrigger; + if (symName) + return (_parser, _terminator) => symName; + } + if (kind === "prefix") { + const h = (_h = (_g = entry.parse) != null ? _g : entry.name) != null ? _h : idTrigger; + if (h) { + const prec = (_i = entry["precedence"]) != null ? _i : 1e4; + return (parser, until) => { + const rhs = parser.parseExpression({ + ...until != null ? until : [], + minPrec: prec + }); + return rhs === null ? null : [h, rhs]; + }; + } + } + if (kind === "postfix") { + const h = (_j = entry.parse) != null ? _j : entry.name; + if (h) + return (_parser, lhs) => lhs === null ? null : [h, lhs]; + } + if (kind === "infix") { + if (/[_^]/.test((_k = latexTrigger == null ? void 0 : latexTrigger[0]) != null ? _k : "")) { + const h2 = (_l = entry.name) != null ? _l : entry.parse; + return (_parser, arg) => [ + h2, + missingIfEmpty(op(arg, 1)), + missingIfEmpty(op(arg, 2)) + ]; + } + const h = (_n = (_m = entry.parse) != null ? _m : entry.name) != null ? _n : idTrigger; + const prec = (_o = entry["precedence"]) != null ? _o : 1e4; + const associativity = (_p = entry["associativity"]) != null ? _p : "non"; + if (h) + return (parser, lhs, until) => { + if (lhs === null) + return null; + if (prec < until.minPrec) + return null; + const rhs = missingIfEmpty( + parser.parseExpression({ ...until, minPrec: prec }) + ); + return typeof h === "string" ? applyAssociativeOperator(h, lhs, rhs, associativity) : [h, lhs, rhs]; + }; + } + if (kind === "matchfix") { + const h = (_q = entry.parse) != null ? _q : entry.name; + if (h) + return (_parser, body) => { + if (body === null || isEmptySequence(body)) + return null; + return [h, body]; + }; + } + if (kind === "expression") { + const parseResult = (_s = (_r = entry.parse) != null ? _r : entry.name) != null ? _s : idTrigger; + if (parseResult) + return () => parseResult; + } + if ("parse" in entry) { + const parseResult = entry.parse; + return () => parseResult; + } + return void 0; +} +function isValidEntry(entry, onError) { + var _a, _b, _c; + let subject = (_c = (_b = (_a = entry.name) != null ? _a : entry["latexTrigger"]) != null ? _b : entry["identifierTrigger"]) != null ? _c : entry["openDelimiter"]; + if (!subject) { + try { + subject = JSON.stringify(entry); + } catch (e) { + subject = "???"; + } + } + if (Array.isArray(subject)) + subject = tokensToString(subject); + if ("trigger" in entry) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `The 'trigger' property is deprecated. Use 'latexTrigger' or 'identifierTrigger' instead` + ] + }); + } + if ("kind" in entry && ![ + "expression", + "symbol", + "function", + "infix", + "postfix", + "prefix", + "matchfix", + "environment" + ].includes(entry.kind)) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `The 'kind' property must be one of 'expression', 'symbol', 'function', 'infix', 'postfix', 'prefix', 'matchfix', 'environment'` + ] + }); + } + if (entry.serialize !== void 0 && !entry.name) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `A 'name' property must be provided if a 'serialize' handler is provided` + ] + }); + return false; + } + if ("identifierTrigger" in entry) { + if (typeof entry.identifierTrigger !== "string" || !isValidIdentifier(entry.identifierTrigger)) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `The 'identifierTrigger' property must be a valid identifier` + ] + }); + } + } + if ("name" in entry) { + if (typeof entry.name !== "string") { + if (entry.name !== void 0) + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `The 'name' property must be a string` + ] + }); + } else if (!isValidIdentifier(entry.name)) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + entry.name, + `The 'name' property must be a valid identifier` + ] + }); + } + } + if (isMatchfixEntry(entry)) { + if ("latexTrigger" in entry || "identifierTrigger" in isPrefixEntry) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `'matchfix' operators use a 'openDelimiter' and 'closeDelimiter' instead of a 'latexTrigger' or 'identifierTrigger'. ` + ] + }); + return false; + } + if (!entry.openTrigger || !entry.closeTrigger) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + "Expected `openDelimiter` and a `closeDelimiter` for matchfix operator" + ] + }); + return false; + } + if (typeof entry.openTrigger !== typeof entry.closeTrigger) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + "Expected `openDelimiter` and `closeDelimiter` to both be strings or array of LatexToken" + ] + }); + return false; + } + } + if (isInfixEntry(entry) || isPostfixEntry(entry) || isPrefixEntry(entry)) { + if (Array.isArray(entry.latexTrigger) && (entry.latexTrigger[0] === "_" || entry.latexTrigger[0] === "^") || typeof entry.latexTrigger === "string" && (entry.latexTrigger.startsWith("^") || entry.latexTrigger.startsWith("_"))) { + if (entry.precedence !== void 0 || entry["associativity"] !== void 0) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `Unexpected "precedence" or "associativity" for superscript/subscript operator` + ] + }); + return false; + } + } else if (entry.precedence === void 0) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `Expected a "precedence" for ${entry.kind} operator` + ] + }); + return false; + } + } else { + if (entry["associativity"] !== void 0) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + 'Unexpected "associativity" operator' + ] + }); + return false; + } + } + if (!isMatchfixEntry(entry) && !isEnvironmentEntry(entry)) { + if (!entry.latexTrigger && !entry.identifierTrigger && !entry.name) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `Expected a 'name', a 'latexTrigger' or a 'identifierTrigger'` + ] + }); + return false; + } + } + if (entry["parse"] === void 0 && entry.name === void 0) { + onError({ + severity: "warning", + message: [ + "invalid-dictionary-entry", + subject, + `Expected a 'parse' or 'name'` + ] + }); + return false; + } + return true; +} +var DEFAULT_LATEX_DICTIONARY = { + algebra: DEFINITIONS_ALGEBRA, + arithmetic: DEFINITIONS_ARITHMETIC, + calculus: DEFINITIONS_CALCULUS, + complex: DEFINITIONS_COMPLEX, + core: DEFINITIONS_CORE, + logic: DEFINITIONS_LOGIC, + relop: DEFINITIONS_INEQUALITIES, + other: DEFINITIONS_OTHERS, + physics: [ + { + name: "mu0", + kind: "symbol", + latexTrigger: "\\mu_0" + } + ], + sets: DEFINITIONS_SETS, + statistics: DEFINITIONS_STATISTICS, + symbols: DEFINITIONS_SYMBOLS, + trigonometry: DEFINITIONS_TRIGONOMETRY +}; +var IDENTIFIER_PREFIX = { + // Those are "grouping" prefix that also specify spacing + // around the symbol. We ignore the spacing, though. + "\\mathord": "", + "\\mathop": "", + "\\mathbin": "", + "\\mathrel": "", + "\\mathopen": "", + "\\mathclose": "", + "\\mathpunct": "", + "\\mathinner": "", + // This is the preferred way to specify an identifier + // it defines both spacing and font. By default, identifiers + // are wrapper with `\\operatorname{}`. + "\\operatorname": "", + // These styling commands are used to change the font of an identifier + // They may be problematic, as adjacent identifiers may be merged + // into a single identifier when used in editors, such a MathLive. + // For example `\mathrm{speed}\mathrm{sound}` can be confused with `\mathrm{speedsound}` + "\\mathrm": "_upright", + "\\mathit": "_italic", + "\\mathbf": "_bold", + "\\mathscr": "_script", + "\\mathcal": "_calligraphic", + "\\mathfrak": "_fraktur", + "\\mathsf": "_sansserif", + "\\mathtt": "_monospace", + "\\mathbb": "_doublestruck" +}; +var IDENTIFIER_MODIFIER = { + "\\mathring": "_ring", + "\\hat": "_hat", + "\\tilde": "_tilde", + "\\vec": "_vec", + "\\overline": "_bar", + "\\underline": "_underbar", + "\\dot": "_dot", + "\\ddot": "_ddot", + "\\dddot": "_dddot", + "\\ddddot": "_ddddot", + "\\acute": "_acute", + "\\grave": "_grave", + "\\breve": "_breve", + "\\check": "_check" +}; +function parseIdentifierToken(parser, options) { + var _a; + if (parser.atEnd) + return null; + const token = parser.peek; + let special = { + "\\_": "_", + "\\#": "hash" + }[token]; + if (!special && !options.toplevel) { + special = { + "+": "plus", + "-": "minus", + "\\plusmn": "pm", + "\\pm": "pm", + "\\ast": "ast", + "\\dag": "dag", + "\\ddag": "ddag", + "\\bot": "bottom", + "\\top": "top", + "\\bullet": "bullet", + "\\cir": "circle", + "\\diamond": "diamond", + "\\times": "times", + "\\square": "square", + "\\star": "star" + }[token]; + } + if (special) { + parser.nextToken(); + return special; + } + const i = SYMBOLS.findIndex((x) => x[1] === token); + if (i >= 0) { + parser.nextToken(); + return SYMBOLS[i][0]; + } + return (_a = parser.matchChar()) != null ? _a : parser.nextToken(); +} +function parseIdentifierBody(parser) { + var _a; + let id = matchPrefixedIdentifier(parser); + const start = parser.index; + const prefix = (_a = IDENTIFIER_MODIFIER[parser.peek]) != null ? _a : null; + if (prefix) { + parser.nextToken(); + if (!parser.match("<{>")) { + parser.index = start; + return null; + } + const body = parseIdentifierBody(parser); + if (body === null || !parser.match("<}>")) { + parser.index = start; + return null; + } + id = `${body}${prefix}`; + } + if (id === null) { + id = ""; + while (!parser.atEnd) { + const token = parser.peek; + if (token === "<}>" || token === "_" || token === "^") + break; + const next = parseIdentifierToken(parser, { toplevel: false }); + if (next === null) { + parser.index = start; + return null; + } + id += next; + } + while (!parser.atEnd && /\d/.test(parser.peek)) + id += parser.nextToken(); + } + while (!parser.atEnd) { + if (parser.match("\\degree")) + id += "_deg"; + else if (parser.matchAll(["^", "\\prime"])) + id += "_prime"; + else if (parser.matchAll(["^", "<{>", "\\prime", "<}>"])) + id += "_prime"; + else if (parser.matchAll(["^", "<{>", "\\doubleprime", "<}>"])) + id += "_dprime"; + else if (parser.matchAll(["^", "<{>", "\\prime", "\\prime", "<}>"])) + id += "_dprime"; + else + break; + } + const sups = []; + const subs2 = []; + while (!parser.atEnd) { + if (parser.match("_")) { + const hasBrace = parser.match("<{>"); + const sub2 = parseIdentifierBody(parser); + if (hasBrace && !parser.match("<}>") || sub2 === null) { + parser.index = start; + return null; + } + subs2.push(sub2); + } else if (parser.match("^")) { + const hasBrace = parser.match("<{>"); + const sup = parseIdentifierBody(parser); + if (hasBrace && !parser.match("<}>") || sup === null) { + parser.index = start; + return null; + } + sups.push(sup); + } else + break; + } + if (sups.length > 0) + id += "__" + sups.join(""); + if (subs2.length > 0) + id += "_" + subs2.join(""); + return id; +} +function matchPrefixedIdentifier(parser) { + var _a, _b; + const start = parser.index; + const prefix = (_a = IDENTIFIER_PREFIX[parser.peek]) != null ? _a : null; + if (prefix === null) + return null; + parser.nextToken(); + if (parser.match("<{>")) { + let body = ""; + const digit = (_b = { + 0: "zero", + 1: "one", + 2: "two", + 3: "three", + 4: "four", + 5: "five", + 6: "six", + 7: "seven", + 8: "eight", + 9: "nine" + }[parser.peek]) != null ? _b : ""; + if (digit) { + body = digit; + parser.nextToken(); + } + body += parseIdentifierBody(parser); + if (body === null || !parser.match("<}>")) { + parser.index = start; + return null; + } + if (prefix === "_upright" && body.length > 1) + return body; + return body + prefix; + } + parser.index = start; + return null; +} +function parseInvalidIdentifier(parser) { + const start = parser.index; + const id = matchPrefixedIdentifier(parser); + if (id === null || isValidIdentifier(id)) { + parser.index = start; + return null; + } + return parser.error( + ["invalid-identifier", { str: validateIdentifier(id) }], + start + ); +} +function parseIdentifier(parser) { + if (/^[a-zA-Z]$/.test(parser.peek) || /^\p{XIDS}$/u.test(parser.peek)) + return parser.nextToken(); + const start = parser.index; + let id = matchPrefixedIdentifier(parser); + if (!id) { + id = ""; + while (!parser.atEnd && ONLY_EMOJIS.test(id + parser.peek)) + id += parser.nextToken(); + if (!id) + id = null; + } + id != null ? id : id = parseIdentifierToken(parser, { toplevel: true }); + if (id) { + id = id.normalize(); + if (isValidIdentifier(id)) + return id; + } + parser.index = start; + return null; +} +var DELIMITER_SHORTHAND = { + "(": ["\\lparen", "("], + ")": ["\\rparen", ")"], + "[": ["\\lbrack"], + "]": ["\\rbrack"], + "<": ["<", "\\langle"], + ">": [">", "\\rangle"], + "{": ["\\{", "\\lbrace"], + "}": ["\\}", "\\rbrace"], + ":": [":", "\\colon"], + "|": ["|", "\\|", "\\lvert", "\\rvert"], + //special: '\lvert` when open, `\rvert` when close + "||": ["||", "\\Vert", "\\lVert", "\\rVert"], + // special: `\lVert` when open, `\rVert` when close + "\\lfloor": ["\\lfloor"], + "\\rfloor": ["\\rfloor"], + "\\lceil": ["\\lceil"], + "\\rceil": ["\\rceil"], + "\\ulcorner": ["\\ulcorner"], + "\\urcorner": ["\\urcorner"], + "\\llcorner": ["\\llcorner"], + "\\lrcorner": ["\\lrcorner"], + "\\lgroup": ["\\lgroup"], + "\\rgroup": ["\\rgroup"], + "\\lmoustache": ["\\lmoustache"], + "\\rmoustache": ["\\rmoustache"] +}; +var OPEN_DELIMITER_PREFIX = { + "\\left": "\\right", + "\\bigl": "\\bigr", + "\\Bigl": "\\Bigr", + "\\biggl": "\\biggr", + "\\Biggl": "\\Biggr", + "\\big": "\\big", + "\\Big": "\\Big", + "\\bigg": "\\bigg", + "\\Bigg": "\\Bigg" +}; +var CLOSE_DELIMITER = { + "(": ")", + "[": "]", + "\\{": "\\}", + "\\lbrace": "\\rbrace", + "\\lparen": "\\rparen", + "\\langle": "\\rangle", + "\\lfloor": "\\rfloor", + "\\lceil": "\\rceil", + "\\vert": "\\vert", + "\\lvert": "\\rvert", + "\\Vert": "\\Vert", + "\\lVert": "\\rVert", + "\\lbrack": "\\rbrack", + "\\ulcorner": "\\urcorner", + "\\llcorner": "\\lrcorner", + "\\lgroup": "\\rgroup", + "\\lmoustache": "\\rmoustache" +}; +var DEFAULT_LATEX_NUMBER_OPTIONS = { + precision: 6, + // with machine numbers, up to 15 assuming 2^53 bits floating points + positiveInfinity: "\\infty", + negativeInfinity: "-\\infty", + notANumber: "\\operatorname{NaN}", + decimalMarker: ".", + // Use `{,}` for comma as a decimal marker + groupSeparator: "\\,", + // for thousands, etc... + exponentProduct: "\\cdot", + beginExponentMarker: "10^{", + // could be 'e' + endExponentMarker: "}", + notation: "auto", + truncationMarker: "\\ldots", + beginRepeatingDigits: "\\overline{", + endRepeatingDigits: "}", + imaginaryUnit: "\\imaginaryI", + avoidExponentsInRange: [-7, 20] +}; +var DEFAULT_PARSE_LATEX_OPTIONS = { + applyInvisibleOperator: "auto", + skipSpace: true, + parseArgumentsOfUnknownLatexCommands: true, + parseNumbers: true, + parseUnknownIdentifier: (id, parser) => { + var _a; + return ((_a = parser.computeEngine) == null ? void 0 : _a.lookupFunction(id)) !== void 0 ? "function" : "symbol"; + }, + preserveLatex: false +}; +var _Parser = class { + constructor(tokens, options, dictionary2, computeEngine) { + this.index = 0; + this._boundaries = []; + this._lastPeek = ""; + this._peekCounter = 0; + this._tokens = tokens; + this.options = { + ...DEFAULT_LATEX_NUMBER_OPTIONS, + ...DEFAULT_PARSE_LATEX_OPTIONS, + ...options + }; + this._dictionary = dictionary2; + this.computeEngine = computeEngine; + this._positiveInfinityTokens = tokenize(this.options.positiveInfinity, []); + this._negativeInfinityTokens = tokenize(this.options.negativeInfinity, []); + this._notANumberTokens = tokenize(this.options.notANumber, []); + this._decimalMarkerTokens = tokenize(this.options.decimalMarker, []); + this._groupSeparatorTokens = tokenize(this.options.groupSeparator, []); + this._exponentProductTokens = tokenize(this.options.exponentProduct, []); + this._beginExponentMarkerTokens = tokenize( + this.options.beginExponentMarker, + [] + ); + this._endExponentMarkerTokens = tokenize( + this.options.endExponentMarker, + [] + ); + this._truncationMarkerTokens = tokenize(this.options.truncationMarker, []); + this._beginRepeatingDigitsTokens = tokenize( + this.options.beginRepeatingDigits, + [] + ); + this._endRepeatingDigitsTokens = tokenize( + this.options.endRepeatingDigits, + [] + ); + this._imaginaryNumberTokens = tokenize(this.options.imaginaryUnit, []); + } + updateOptions(opt) { + for (const [k, v] of Object.entries(opt)) + if (k in this.options) { + this.options[k] = v; + if (typeof v === "string") { + if (k === "positiveInfinity") + this._positiveInfinityTokens = tokenize(v, []); + if (k === "negativeInfinity") + this._negativeInfinityTokens = tokenize(v, []); + if (k === "notANumber") + this._notANumberTokens = tokenize(v, []); + if (k === "decimalMarker") + this._decimalMarkerTokens = tokenize(v, []); + if (k === "groupSeparator") + this._groupSeparatorTokens = tokenize(v, []); + if (k === "exponentProduct") + this._exponentProductTokens = tokenize(v, []); + if (k === "beginExponentMarker") + this._beginExponentMarkerTokens = tokenize(v, []); + if (k === "endExponentMarker") + this._endExponentMarkerTokens = tokenize(v, []); + if (k === "truncationMarker") + this._truncationMarkerTokens = tokenize(v, []); + if (k === "beginRepeatingDigits") + this._beginRepeatingDigitsTokens = tokenize(v, []); + if (k === "endRepeatingDigits") + this._endRepeatingDigitsTokens = tokenize(v, []); + if (k === "imaginaryNumber") + this._imaginaryNumberTokens = tokenize(v, []); + } + } else + throw Error(`Unexpected option "${k}"`); + } + get atEnd() { + return this.index >= this._tokens.length; + } + get peek() { + const peek = this._tokens[this.index]; + if (peek === this._lastPeek) + this._peekCounter += 1; + else + this._peekCounter = 0; + if (this._peekCounter >= 1024) { + console.error( + `Infinite loop detected while parsing "${this.latex(0)}" at "${this._lastPeek}" (index ${this.index})` + ); + throw new Error( + `Infinite loop detected while parsing "${this.latex(0)}" at ${this._lastPeek} (index ${this.index})` + ); + } + this._lastPeek = peek; + return peek; + } + nextToken() { + return this._tokens[this.index++]; + } + /** + * Return true if + * - at end of the token stream + * - the `t.condition` function returns true + * Note: the `minPrec` condition is not checked. It should be checked separately. + */ + atTerminator(t) { + var _a; + return this.atBoundary || ((_a = (t == null ? void 0 : t.condition) && t.condition(this)) != null ? _a : false); + } + /** + * True if the current token matches any of the boundaries we are + * waiting for. + */ + get atBoundary() { + if (this.atEnd) + return true; + const start = this.index; + for (const boundary of this._boundaries) { + if (this.matchAll(boundary.tokens)) { + this.index = start; + return true; + } + } + return false; + } + addBoundary(boundary) { + this._boundaries.push({ index: this.index, tokens: boundary }); + } + removeBoundary() { + this._boundaries.pop(); + } + matchBoundary() { + const currentBoundary = this._boundaries[this._boundaries.length - 1]; + const match2 = currentBoundary && this.matchAll(currentBoundary.tokens); + if (match2) + this._boundaries.pop(); + return match2; + } + boundaryError(msg) { + const currentBoundary = this._boundaries[this._boundaries.length - 1]; + this._boundaries.pop(); + return this.error(msg, currentBoundary.index); + } + latex(start, end) { + return tokensToString(this._tokens.slice(start, end)); + } + latexAhead(n) { + return this.latex(this.index, this.index + n); + } + // latexBefore(): string { + // return this.latex(0, this.index); + // } + // latexAfter(): string { + // return this.latex(this.index); + // } + /** + * Return at most `this._dictionary.lookahead` LaTeX tokens. + * + * The index in the returned array correspond to the number of tokens. + * Note that since a token can be longer than one char ('\\pi', but also + * some astral plane unicode characters), the length of the string + * does not match that index. However, knowing the index is important + * to know by how many tokens to advance. + * + * For example: + * + * `[empty, '\\sqrt', '\\sqrt{', '\\sqrt{2', '\\sqrt{2}']` + * + */ + lookAhead() { + let n = Math.min( + this._dictionary.lookahead, + this._tokens.length - this.index + ); + if (n <= 0) + return []; + const result = []; + while (n > 0) + result.push([n, this.latexAhead(n--)]); + return result; + } + peekDefinitions(kind) { + const result = []; + const defs = [...this.getDefs(kind)]; + for (const def of defs) + if (def.latexTrigger === "") + result.push([def, 0]); + for (const [n, tokens] of this.lookAhead()) { + for (const def of defs) + if (def.latexTrigger === tokens) + result.push([def, n]); + } + for (const def of defs) { + if (def.identifierTrigger) { + const n = parseComplexId(this, def.identifierTrigger); + if (n > 0) + result.push([def, n]); + } + } + return result; + } + /** Skip strictly `` tokens. + * To also skip `{}` see `skipSpace()`. + * To skip visual space (e.g. `\,`) see `skipVisualSpace()`. + */ + skipSpaceTokens() { + while (this.match("")) { + } + } + /** While parsing in math mode, skip applicable spaces, which includes `{}`. + * Do not use to skip spaces while parsing a string. See `skipSpaceTokens()` + * instead. + */ + skipSpace() { + if (!this.atEnd && this.peek === "<{>") { + const index = this.index; + this.nextToken(); + while (this.match("")) { + } + if (this.nextToken() === "<}>") { + this.skipSpace(); + return true; + } + this.index = index; + } + if (!this.options.skipSpace) + return false; + let result = false; + while (this.match("")) + result = true; + if (result) + this.skipSpace(); + return result; + } + skipVisualSpace() { + if (!this.options.skipSpace) + return; + this.skipSpace(); + if ([ + "\\!", + "\\,", + "\\:", + "\\;", + "\\enskip", + "\\enspace", + "\\space", + "\\quad", + "\\qquad" + ].includes(this.peek)) { + this.nextToken(); + this.skipVisualSpace(); + } + this.skipSpace(); + } + match(token) { + if (this._tokens[this.index] === token) { + this.index++; + return true; + } + return false; + } + matchAll(tokens) { + /* @__PURE__ */ console.assert(Array.isArray(tokens)); + if (tokens.length === 0) + return false; + let matched = true; + let i = 0; + do { + matched = this._tokens[this.index + i] === tokens[i++]; + } while (matched && i < tokens.length); + if (matched) + this.index += i; + return matched; + } + matchAny(tokens) { + if (tokens.includes(this._tokens[this.index])) + return this._tokens[this.index++]; + return ""; + } + matchChar() { + var _a; + const index = this.index; + let caretCount = 0; + while (this.match("^")) + caretCount += 1; + if (caretCount < 2) + this.index = index; + if (caretCount >= 2) { + let digits = ""; + let n = 0; + while (n != caretCount) { + const digit = this.matchAny([ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f" + ]); + if (!digit) + break; + digits += digit; + n += 1; + } + if (digits.length === caretCount) + return String.fromCodePoint(Number.parseInt(digits, 16)); + } else if (this.match("\\char")) { + let codepoint = Math.floor((_a = this.matchLatexNumber()) != null ? _a : Number.NaN); + if (!Number.isFinite(codepoint) || codepoint < 0 || codepoint > 1114111) { + codepoint = 10067; + } + return String.fromCodePoint(codepoint); + } else if (this.match("\\unicode")) { + this.skipSpaceTokens(); + if (this.match("<{>")) { + const codepoint = this.matchLatexNumber(); + if (this.match("<}>") && codepoint !== null && codepoint >= 0 && codepoint <= 1114111) { + return String.fromCodePoint(codepoint); + } + } else { + const codepoint = this.matchLatexNumber(); + if (codepoint !== null && codepoint >= 0 && codepoint <= 1114111) + return String.fromCodePoint(codepoint); + } + } + this.index = index; + return null; + } + /** If the next token matches the open delimiter, set a boundary with + * the close token and return true. + * + * Note this method handles generic delimiters, i.e. '(' will math both + * '(', '\left(', '\bigl(', etc... + * + * Note that the definitions for matchfix may need to include synonyms + * for example: + * + * { + * openDelimiter: '(', + * closeDelimiter: ')' + * } + * + * and + * + * { + * openDelimiter: '\\lparen', + * closeDelimiter: '\\rparen' + * } + * + * For: + * - '[': '\\lbrack' and '\\[' + * - ']': '\\rbrack' and '\\]' + * - '{': '\\lbrace' and '\\}' + * - '}': '\\rbrace' and '\\}' + * - '<': '\\langle' + * - '>': '\\rangle' + * - '|': '\\vert' + * - '||': '\\Vert' + * - '|': '\\lvert' and '\\rvert' + * - '||': '\\lVert' and '\\rVert' + */ + matchDelimiter(open, close) { + if (this.peek === "[") + return false; + if (Array.isArray(open)) { + /* @__PURE__ */ console.assert(Array.isArray(close)); + if (this.matchAll(open)) { + this.addBoundary(close); + return true; + } + return false; + } + const start = this.index; + const closePrefix = OPEN_DELIMITER_PREFIX[this.peek]; + if (closePrefix) + this.nextToken(); + if (open === "||" && this.matchAll(["|", "|"])) { + this.addBoundary(["|", "|"]); + return true; + } + if (!this.match(open)) { + this.index = start; + return false; + } + this.addBoundary(closePrefix ? [closePrefix, close] : [close]); + return true; + } + parseGroup() { + const start = this.index; + this.skipSpaceTokens(); + if (this.match("<{>")) { + this.addBoundary(["<}>"]); + const expr = this.parseExpression(); + this.skipSpace(); + if (this.matchBoundary()) + return expr != null ? expr : ["Sequence"]; + const from = this.index; + while (!this.matchBoundary() && !this.atEnd) + this.nextToken(); + const err = this.error("syntax-error", from); + return expr ? ["Sequence", expr, err] : err; + } + this.index = start; + return null; + } + // Some LaTeX commands (but not all) can accept an argument without braces, + // for example `^` , `\sqrt` or `\frac`. + // This argument will usually be a single token, but can be a sequence of + // tokens (e.g. `\sqrt\frac12` or `\sqrt\operatorname{speed}`). + parseToken() { + var _a; + const excluding = [ + ...'!"#$%&(),/;:?@[]\\`|~'.split(""), + "\\left", + "\\bigl" + ]; + if (excluding.includes(this.peek)) + return null; + if (/^[0-9]$/.test(this.peek)) + return parseInt(this.nextToken()); + const result = (_a = this.parseGenericExpression()) != null ? _a : this.parseSymbol(); + if (!result) + return null; + return result; + } + parseOptionalGroup() { + const index = this.index; + this.skipSpaceTokens(); + if (this.match("[")) { + this.addBoundary(["]"]); + const expr = this.parseExpression(); + this.skipSpace(); + if (this.matchBoundary()) + return expr; + return this.boundaryError("expected-closing-delimiter"); + } + this.index = index; + return null; + } + /** + * Parse an expression in a tabular format, where rows are separated by `\\` + * and columns by `&`. + * + * Return rows of sparse columns: empty rows are indicated with `Nothing`, + * and empty cells are also indicated with `Nothing`. + */ + parseTabular() { + var _a; + const result = []; + let row = []; + let expr = null; + while (!this.atBoundary) { + this.skipSpace(); + if (this.match("&")) { + row.push(expr != null ? expr : "Nothing"); + expr = null; + } else if (this.match("\\\\") || this.match("\\cr")) { + this.skipSpace(); + this.parseOptionalGroup(); + if (expr !== null) + row.push(expr); + result.push(row); + row = []; + expr = null; + } else { + const cell = []; + let peek = this.peek; + while (peek !== "&" && peek !== "\\\\" && peek !== "\\cr" && !this.atBoundary) { + expr = this.parseExpression({ + minPrec: 0, + condition: (p) => { + const peek2 = p.peek; + return peek2 === "&" || peek2 === "\\\\" || peek2 === "\\cr"; + } + }); + if (expr) + cell.push(expr); + else { + cell.push(["Error", ["'unexpected-token'", peek]]); + this.nextToken(); + } + this.skipSpace(); + peek = this.peek; + } + if (cell.length > 1) + expr = ["Sequence", ...cell]; + else + expr = (_a = cell[0]) != null ? _a : "Nothing"; + } + } + if (expr !== null) + row.push(expr); + if (row.length > 0) + result.push(row); + return result; + } + /** Parse a group as a a string, for example for `\operatorname` or `\begin` */ + parseStringGroup() { + const start = this.index; + while (this.match("")) { + } + if (this.match("<{>")) { + this.addBoundary(["<}>"]); + const arg = this.parseStringGroupContent(); + if (this.matchBoundary()) + return arg; + this.removeBoundary(); + } + this.index = start; + return null; + } + /** Parse an environment: `\begin{env}...\end{end}` + */ + parseEnvironment(until) { + var _a; + const index = this.index; + if (!this.match("\\begin")) + return null; + const name = (_a = this.parseStringGroup()) == null ? void 0 : _a.trim(); + if (!name) + return this.error("expected-environment-name", index); + this.addBoundary(["\\end", "<{>", ...name.split(""), "<}>"]); + for (const def of this.getDefs("environment")) + if (def.identifierTrigger === name) { + const expr = def.parse(this, until); + this.skipSpace(); + if (!this.matchBoundary()) + return this.boundaryError("unbalanced-environment"); + if (expr !== null) + return this.decorate(expr, index); + this.index = index; + return null; + } + this.parseTabular(); + this.skipSpace(); + if (!this.matchBoundary()) + return this.boundaryError("unbalanced-environment"); + return this.error(["unknown-environment", { str: name }], index); + } + /** If the next token matches a `+` or `-` sign, return it and advance the index. + * Otherwise return `''` and do not advance */ + parseOptionalSign() { + let isNegative = !!this.matchAny(["-", "\u2212"]); + while (this.matchAny(["+", "\uFE62"]) || this.skipSpace()) + if (this.matchAny(["-", "\u2212"])) + isNegative = !isNegative; + return isNegative ? "-" : "+"; + } + parseDecimalDigits(options) { + var _a; + options != null ? options : options = {}; + (_a = options.withGrouping) != null ? _a : options.withGrouping = false; + const result = []; + let done = false; + while (!done) { + while (/^[0-9]$/.test(this.peek)) { + result.push(this.nextToken()); + this.skipVisualSpace(); + } + done = true; + if (options.withGrouping && this.options.groupSeparator) { + const savedIndex = this.index; + this.skipVisualSpace(); + if (this.matchAll(this._groupSeparatorTokens)) { + this.skipVisualSpace(); + if (/^[0-9]$/.test(this.peek)) + done = false; + else + this.index = savedIndex; + } + } + } + return result.join(""); + } + parseSignedInteger(options) { + var _a; + options != null ? options : options = {}; + (_a = options.withGrouping) != null ? _a : options.withGrouping = false; + const start = this.index; + const sign2 = this.parseOptionalSign(); + const result = this.parseDecimalDigits(options); + if (result) + return sign2 === "-" ? "-" + result : result; + this.index = start; + return ""; + } + parseExponent() { + const start = this.index; + if (this.matchAny(["e", "E"])) { + const exponent = this.parseSignedInteger({ withGrouping: false }); + if (exponent) + return "e" + exponent; + } + this.index = start; + if (this.match("\\times")) { + this.skipSpaceTokens(); + if (this.match("1") && this.match("0") && this.match("^")) { + if (/^[0-9]$/.test(this.peek)) + return "e" + this.nextToken(); + if (this.match("<{>")) { + this.skipSpaceTokens(); + const exponent = this.parseSignedInteger(); + this.skipSpaceTokens(); + if (this.match("<}>") && exponent) + return "e" + exponent; + } + } + } + this.index = start; + this.skipSpaceTokens(); + if (this.match("\\%")) + return `e-2`; + this.index = start; + if (this.matchAll(this._exponentProductTokens)) { + this.skipSpaceTokens(); + if (this.matchAll(this._beginExponentMarkerTokens)) { + this.skipSpaceTokens(); + const exponent = this.parseSignedInteger(); + this.skipSpaceTokens(); + if (this.matchAll(this._endExponentMarkerTokens) && exponent) + return "e" + exponent; + } + } + this.index = start; + return ""; + } + parseRepeatingDecimal() { + const start = this.index; + let repeatingDecimals2 = ""; + if (this.match("(")) { + repeatingDecimals2 = this.parseDecimalDigits(); + if (repeatingDecimals2 && this.match(")")) + return "(" + repeatingDecimals2 + ")"; + this.index = start; + return ""; + } + this.index = start; + if (this.matchAll([`\\left`, "("])) { + repeatingDecimals2 = this.parseDecimalDigits(); + if (repeatingDecimals2 && this.matchAll([`\\right`, ")"])) + return "(" + repeatingDecimals2 + ")"; + this.index = start; + return ""; + } + this.index = start; + if (this.matchAll([`\\overline`, "<{>"])) { + repeatingDecimals2 = this.parseDecimalDigits(); + if (repeatingDecimals2 && this.match("<}>")) + return "(" + repeatingDecimals2 + ")"; + this.index = start; + return ""; + } + this.index = start; + if (this.matchAll(this._beginRepeatingDigitsTokens)) { + repeatingDecimals2 = this.parseDecimalDigits(); + if (repeatingDecimals2 && this.matchAll(this._endRepeatingDigitsTokens)) + return "(" + repeatingDecimals2 + ")"; + this.index = start; + return ""; + } + this.index = start; + return ""; + } + /** + * Parse a number, with an optional sign, exponent, decimal marker, + * repeating decimals, etc... + */ + parseNumber() { + if (!this.options.parseNumbers) + return null; + const start = this.index; + this.skipVisualSpace(); + this.match("+"); + let result = ""; + let dotPrefix = false; + if (this.match(".") || this.matchAll(this._decimalMarkerTokens)) { + const peek = this.peek; + if (peek !== "\\overline" && peek !== this._beginRepeatingDigitsTokens[0] && !/[0-9\(]/.test(peek)) { + this.index = start; + return null; + } + dotPrefix = true; + } else { + result = this.parseDecimalDigits({ withGrouping: true }); + if (!result) { + this.index = start; + return null; + } + } + let hasDecimal = true; + if (!dotPrefix && (this.match(".") || this.matchAll(this._decimalMarkerTokens))) + result += "." + this.parseDecimalDigits({ withGrouping: true }); + else if (dotPrefix) + result = "0." + this.parseDecimalDigits({ withGrouping: true }); + else + hasDecimal = false; + if (hasDecimal) { + const repeat = this.parseRepeatingDecimal(); + if (repeat) + result += repeat; + else if (this.match("\\ldots") || this.matchAll(this._truncationMarkerTokens)) { + } + } + this.skipVisualSpace(); + return result + this.parseExponent(); + } + /** + * A Latex number can be a decimal, hex or octal number. + * It is used in some Latex commands, such as `\char` + * + * From TeX:8695 (scan_int): + * > An integer number can be preceded by any number of spaces and `+' or + * > `-' signs. Then comes either a decimal constant (i.e., radix 10), an + * > octal constant (i.e., radix 8, preceded by '), a hexadecimal constant + * > (radix 16, preceded by "), an alphabetic constant (preceded by `), or + * > an internal variable. + */ + matchLatexNumber(isInteger = true) { + var _a, _b; + let negative = false; + let token = this.peek; + while (token === "" || token === "+" || token === "-") { + if (token === "-") + negative = !negative; + this.nextToken(); + token = this.peek; + } + let radix = 10; + let digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; + if (this.match("'")) { + radix = 8; + digits = ["0", "1", "2", "3", "4", "5", "6", "7"]; + isInteger = true; + } else if (this.match('"') || this.match("x")) { + radix = 16; + digits = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "A", + "B", + "C", + "D", + "E", + "F" + ]; + isInteger = true; + } else if (this.match("`")) { + token = this.nextToken(); + if (token) { + if (token.startsWith("\\") && token.length === 2) { + return (negative ? -1 : 1) * ((_a = token.codePointAt(1)) != null ? _a : 0); + } + return (negative ? -1 : 1) * ((_b = token.codePointAt(0)) != null ? _b : 0); + } + return null; + } + let value = ""; + while (digits.includes(this.peek)) { + value += this.nextToken(); + } + if (!isInteger && this.match(".")) { + value += "."; + while (digits.includes(this.peek)) { + value += this.nextToken(); + } + } + const result = isInteger ? Number.parseInt(value, radix) : Number.parseFloat(value); + if (Number.isNaN(result)) + return null; + return negative ? -result : result; + } + parsePrefixOperator(until) { + if (!until) + until = { minPrec: 0 }; + if (!until.minPrec) + until = { ...until, minPrec: 0 }; + const start = this.index; + for (const [def, n] of this.peekDefinitions("prefix")) { + this.index = start + n; + const rhs = def.parse(this, until); + if (rhs) + return rhs; + } + this.index = start; + return null; + } + parseInfixOperator(lhs, until) { + until != null ? until : until = { minPrec: 0 }; + /* @__PURE__ */ console.assert(until.minPrec !== void 0); + if (until.minPrec === void 0) + until = { ...until, minPrec: 0 }; + const start = this.index; + for (const [def, n] of this.peekDefinitions("infix")) { + if (def.precedence >= until.minPrec) { + this.index = start + n; + const rhs = def.parse(this, lhs, until); + if (rhs) + return rhs; + } + } + this.index = start; + return null; + } + /** + * This returns an array of arguments (as in a function application), + * or null if there is no match. + * + * - 'enclosure' : will look for an argument inside an enclosure + * (open/close fence) + * - 'implicit': either an expression inside a pair of `()`, or just a product + * (i.e. we interpret `\cos 2x + 1` as `\cos(2x) + 1`) + * + */ + parseArguments(kind = "enclosure", until) { + var _a, _b; + if (this.atTerminator(until)) + return null; + const savedIndex = this.index; + const group = this.parseEnclosure(); + if (kind === "enclosure") { + if (group === null) + return null; + return (_a = getSequence(group)) != null ? _a : []; + } + if (kind === "implicit") { + if (head(group) === "Delimiter") + return (_b = getSequence(group)) != null ? _b : []; + if (group !== null) + return [group]; + const primary = this.parseExpression({ ...until, minPrec: 390 }); + return primary === null ? null : [primary]; + } + this.index = savedIndex; + return null; + } + /** If matches the normalized open delimiter, return the + * expected closing delimiter. + * + * For example, if `delimiter` is `(`, it would match `\left\lparen` and + * return `['\right', '\rparen']`, which can be matched with `matchAll()` + * + * If you need to match several tokens, use `matchAll()` + * + * @internal + */ + matchOpenDelimiter(openDelim, closeDelim) { + var _a; + const index = this.index; + const closePrefix = OPEN_DELIMITER_PREFIX[this.peek]; + if (closePrefix) + this.nextToken(); + const alternatives = (_a = DELIMITER_SHORTHAND[openDelim]) != null ? _a : [openDelim]; + const result = closePrefix ? [closePrefix] : []; + if (alternatives.includes("||") && this.matchAll(["|", "|"])) { + result.push("|"); + result.push("|"); + return result; + } + if (!alternatives.includes(this.peek)) { + this.index = index; + return null; + } + if (CLOSE_DELIMITER[openDelim] === closeDelim) { + result.push(CLOSE_DELIMITER[this.peek]); + } else { + result.push(closeDelim); + } + this.nextToken(); + return result; + } + // matchMiddleDelimiter(delimiter: '|' | ':' | LatexToken): boolean { + // const delimiters = MIDDLE_DELIMITER[delimiter] ?? [delimiter]; + // if (MIDDLE_DELIMITER_PREFIX.includes(this.peek)) { + // const index = this.index; + // this.nextToken(); + // if (delimiters.includes(this.peek)) { + // this.nextToken(); + // return true; + // } + // this.index = index; + // return false; + // } else if (delimiters.include(this.peek)) { + // this.nextToken(); + // return true; + // } + // return false; + // } + /** For error handling, when there is potentially a mismatched delimiter. + * Return a LaTeX fragment of the expected closing delimiter + * + * @internal + */ + matchEnclosureOpen() { + const defs = this.getDefs("matchfix"); + const start = this.index; + for (const def of defs) { + this.index = start; + if (Array.isArray(def.openDelimiter)) { + if (this.matchAll(def.openDelimiter)) + return tokensToString(def.closeDelimiter); + continue; + } + const closeDelimiter = this.matchOpenDelimiter( + def.openDelimiter, + def.closeDelimiter + ); + if (closeDelimiter !== null) + return tokensToString(closeDelimiter); + } + this.index = start; + return null; + } + /** + * Used for error handling + * @internal */ + matchEnclosureClose() { + const defs = this.getDefs("matchfix"); + const start = this.index; + for (const def of defs) { + this.index = start; + if (Array.isArray(def.closeDelimiter)) { + if (this.matchAll(def.closeDelimiter)) + return tokensToString(def.openDelimiter); + continue; + } + this.index = start; + let peek = this.peek; + const prefix = Object.keys(OPEN_DELIMITER_PREFIX).find( + (x) => OPEN_DELIMITER_PREFIX[x] === peek + ); + if (prefix) + this.nextToken(); + let openDelimiter = []; + peek = this.peek; + const matchingDelim = Object.keys(CLOSE_DELIMITER).find( + (x) => CLOSE_DELIMITER[x] === peek + ); + if (matchingDelim) + openDelimiter = [matchingDelim]; + if (prefix) + openDelimiter = [prefix, ...openDelimiter]; + if (openDelimiter.length > 0) { + this.nextToken(); + return tokensToString(openDelimiter); + } + } + this.index = start; + return null; + } + /** + * An enclosure is an opening matchfix operator, an optional expression, + * optionally followed multiple times by a separator and another expression, + * and finally a closing matching operator. + */ + parseEnclosure() { + const defs = this.getDefs("matchfix"); + const start = this.index; + for (const def of defs) { + this.index = start; + if (!this.matchDelimiter(def.openDelimiter, def.closeDelimiter)) + continue; + const bodyStart = this.index; + this.skipSpace(); + let body = this.parseExpression(); + this.skipSpace(); + if (!this.matchBoundary()) { + const boundary = this._boundaries[this._boundaries.length - 1].tokens; + this.removeBoundary(); + this.index = bodyStart; + this.skipSpace(); + body = this.parseExpression(); + this.skipSpace(); + if (!this.matchAll(boundary)) { + if (!this.atEnd) + continue; + this.index = start; + return null; + } + } + const result = def.parse(this, body != null ? body : ["Sequence"]); + if (result !== null) + return result; + } + this.index = start; + return null; + } + /** + * A generic expression is used for dictionary entries that take do + * some complex (non-standard) parsing. This includes trig functions (to + * parse implicit arguments), and integrals (to parse the integrand and + * limits and the "dx" terminator). + */ + parseGenericExpression(until) { + var _a; + if (this.atTerminator(until)) + return null; + const start = this.index; + let expr = null; + const fnDefs = (_a = this.peekDefinitions("expression")) != null ? _a : []; + for (const [def, tokenCount] of fnDefs) { + this.index = start + tokenCount; + if (typeof def.parse === "function") { + expr = def.parse(this, until); + if (expr !== null) + return expr; + } else { + return def.name; + } + } + this.index = start; + return null; + } + /** + * A function is an identifier followed by postfix operators + * (`\prime`...) and some arguments. + */ + parseFunction(until) { + if (this.atTerminator(until)) + return null; + const start = this.index; + let fn = null; + for (const [def, tokenCount] of this.peekDefinitions("function")) { + this.index = start + tokenCount; + if (typeof def.parse === "function") { + fn = def.parse(this, until); + if (fn !== null) + break; + } else { + fn = def.name; + break; + } + } + if (fn === null) { + this.index = start; + fn = parseIdentifier(this); + if (!this.isFunctionHead(fn)) { + this.index = start; + return null; + } + } + do { + const pf = this.parsePostfixOperator(fn); + if (pf === null) + break; + fn = pf; + } while (true); + const seq = this.isFunctionHead(fn) ? this.parseArguments() : null; + return seq ? [fn, ...seq] : fn; + } + parseSymbol(until) { + var _a, _b; + if (this.atTerminator(until)) + return null; + const start = this.index; + for (const [def, tokenCount] of this.peekDefinitions("symbol")) { + this.index = start + tokenCount; + if (typeof def.parse === "function") { + const result = def.parse(this, until); + if (result) + return result; + } else + return def.name; + } + this.index = start; + const id = parseIdentifier(this); + if (id === null) + return null; + if (((_b = (_a = this.options).parseUnknownIdentifier) == null ? void 0 : _b.call(_a, id, this)) === "symbol") + return id; + this.index = start; + return null; + } + /** + * Parse a sequence superfix/subfix operator, e.g. `^{*}` + * + * Superfix and subfix need special handling: + * + * - they act mostly like an infix operator, but they are commutative, i.e. + * `x_a^b` should be parsed identically to `x^b_a`. + * + * - furthermore, in LaTeX `x^a^b` parses the same as `x^a{}^b`. + * + */ + parseSupsub(lhs) { + var _a, _b, _c; + /* @__PURE__ */ console.assert(lhs !== null); + const index = this.index; + this.skipSpace(); + const superscripts = []; + const subscripts = []; + let subIndex = index; + while (this.peek === "_" || this.peek === "^") { + if (this.match("_")) { + subIndex = this.index; + if (this.match("_") || this.match("^")) + subscripts.push(this.error("syntax-error", subIndex)); + else { + const sub2 = (_b = (_a = this.parseGroup()) != null ? _a : this.parseToken()) != null ? _b : this.parseStringGroup(); + if (sub2 === null) + return this.error("missing", index); + subscripts.push(sub2); + } + } else if (this.match("^")) { + subIndex = this.index; + if (this.match("_") || this.match("^")) + superscripts.push(this.error("syntax-error", subIndex)); + else { + const sup = (_c = this.parseGroup()) != null ? _c : this.parseToken(); + if (sup === null) + return this.error("missing", index); + superscripts.push(sup); + } + } + subIndex = this.index; + this.skipSpace(); + } + if (superscripts.length === 0 && subscripts.length === 0) { + this.index = index; + return lhs; + } + let result = lhs; + if (subscripts.length > 0) { + const defs = [...this.getDefs("infix")].filter( + (x) => x.latexTrigger === "_" + ); + if (defs) { + const arg = [ + "Subscript", + result, + subscripts.length === 1 ? subscripts[0] : ["List", ...subscripts] + ]; + for (const def of defs) { + if (typeof def.parse === "function") + result = def.parse(this, arg, { minPrec: 0 }); + else + result = arg; + if (result) + break; + } + } + } + if (superscripts.length > 0) { + const defs = [...this.getDefs("infix")].filter( + (x) => x.latexTrigger === "^" + ); + if (defs) { + const arg = [ + "Superscript", + result, + superscripts.length === 1 ? superscripts[0] : ["List", ...superscripts] + ]; + for (const def of defs) { + if (typeof def.parse === "function") + result = def.parse(this, arg, { minPrec: 0 }); + else + result = arg; + if (result) + break; + } + } + } + if (result === null) + this.index = index; + return result; + } + parsePostfixOperator(lhs, until) { + /* @__PURE__ */ console.assert(lhs !== null); + if (lhs === null) + return null; + const start = this.index; + for (const [def, n] of this.peekDefinitions("postfix")) { + this.index = start + n; + const result = def.parse(this, lhs, until); + if (result !== null) + return result; + } + this.index = start; + return null; + } + /** Match a string used as a LaTeX identifier, for example an environment + * name. + * Not suitable for general purpose text, e.g. argument of a `\text{} + * command. See `matchChar()` instead. + */ + parseStringGroupContent() { + const start = this.index; + let result = ""; + let level = 0; + while (!this.atBoundary || level > 0) { + const token = this.nextToken(); + if (token === "<$>" || token === "<$$>") { + this.index = start; + return ""; + } + if (token === "<{>") { + level += 1; + result += "\\{"; + } else if (token === "<}>") { + level -= 1; + result += "\\}"; + } else if (token === "") { + result += " "; + } else if (token[0] === "\\") { + result += token; + } else { + result += token; + } + } + return result; + } + /** + * Apply an invisible operator between two expressions. + * + * If the `lhs` is an literal integer and the `rhs` is a literal rational + * -> 'invisible plus' + * + * That is '2 3/4' -> ['Add', 2, ['Rational', 3, 4]] + * + * If `lhs` is a number and `rhs` is a number but not a literal -> 'invisible multiply'. + * - 2x + * - 2(x+1) + * - x(x+1) + * - f(x)g(y) + * - 2 sin(x) + * - 2 f(x) + * - x f(x) + * - (x-1)(x+1) + * - (x+1)2 -> no + * - x2 -> no + * => lhs is a number, rhs is a number, but not a literal + */ + applyInvisibleOperator(until, lhs) { + var _a; + if (lhs === null || this.options.applyInvisibleOperator === null || head(lhs) === "Error" || symbol(lhs) === "Nothing" || isEmptySequence(lhs) || this.atTerminator(until)) + return null; + if (this.peekDefinitions("operator").length > 0) + return null; + if (this.isFunctionHead(lhs)) { + const args = this.parseArguments("enclosure", { ...until, minPrec: 0 }); + if (args === null) + return null; + return [lhs, ...args]; + } + const start = this.index; + const rhs = this.parseExpression({ ...until, minPrec: 390 }); + if (rhs === null || symbol(rhs) === "Nothing" || isEmptySequence(rhs)) { + this.index = start; + return null; + } + if (head(rhs) === "Error") + return applyAssociativeOperator("Sequence", lhs, rhs); + if (typeof this.options.applyInvisibleOperator === "function") + return this.options.applyInvisibleOperator(this, lhs, rhs); + if (this.isFunctionHead(lhs)) { + const seq = getSequence(rhs); + return seq ? [lhs, ...seq] : lhs; + } + const lhsNumber = machineValue(lhs); + if (lhsNumber !== null && Number.isInteger(lhsNumber)) { + const rhsHead = head(rhs); + if (rhsHead === "Divide" || rhsHead === "Rational") { + const [n, d] = [machineValue(op(rhs, 1)), machineValue(op(rhs, 2))]; + if (n !== null && d !== null && n > 0 && n <= 1e3 && d > 1 && d <= 1e3 && Number.isInteger(n) && Number.isInteger(d)) + return ["Add", lhs, rhs]; + } + } + if (head(rhs) === "Delimiter") { + if (head(op(rhs, 1)) === "Sequence") + return [lhs, ...(_a = ops(op(rhs, 1))) != null ? _a : []]; + if (!op(rhs, 1) || symbol(op(rhs, 1)) === "Nothing") + return applyAssociativeOperator( + "Sequence", + lhs, + this.error("expected-expression", start) + ); + } + if (head(rhs) === "Sequence" || head(lhs) === "Sequence" || stringValue(lhs) !== null || stringValue(rhs) !== null || dictionary(lhs) !== null || dictionary(rhs) !== null) + return applyAssociativeOperator("Sequence", lhs, rhs); + return applyAssociativeOperator("Multiply", lhs, rhs); + } + /** + * This is an error handling method. We've encountered a LaTeX command + * but were not able to match it to any entry in the LaTeX dictionary, + * or ran into it in an unexpected context (postfix operator lacking an + * argument, for example) + */ + parseUnexpectedLatexCommand() { + var _a, _b; + const start = this.index; + let opDefs = this.peekDefinitions("operator"); + if (opDefs.length > 0) { + opDefs = this.peekDefinitions("postfix"); + if (opDefs.length > 0) { + const [def, n] = opDefs[0]; + this.index += n; + if (typeof def.parse === "function") { + const result = def.parse(this, this.error("missing", start)); + if (result) + return result; + } + if (def.name) + return [def.name, this.error("missing", start)]; + return this.error("unexpected-operator", start); + } + opDefs = this.peekDefinitions("prefix"); + if (opDefs.length > 0) { + const [def, n] = opDefs[0]; + this.index += n; + if (typeof def.parse === "function") { + const result = def.parse(this, { minPrec: 0 }); + if (result) + return result; + } + if (def.name) + return [ + def.name, + // @todo: pass a precedence? + (_a = this.parseExpression()) != null ? _a : this.error("missing", start) + ]; + return this.error("unexpected-operator", start); + } + opDefs = this.peekDefinitions("infix"); + if (opDefs.length > 0) { + const [def, n] = opDefs[0]; + this.index += n; + if (typeof def.parse === "function") { + const result = def.parse(this, this.error("missing", start), { + minPrec: 0 + }); + if (result) + return result; + } + if (def.name) + return [ + def.name, + this.error("missing", start), + (_b = this.parseExpression()) != null ? _b : this.error("missing", start) + ]; + return this.error("unexpected-operator", start); + } + } + const command = this.peek; + if (!command || command[0] !== "\\") + return null; + this.nextToken(); + this.skipSpaceTokens(); + if (command === "\\end") { + const name = this.parseStringGroup(); + if (name === null) + return this.error("expected-environment-name", start); + return this.error(["unbalanced-environment", { str: name }], start); + } + while (this.match("[")) { + let level = 0; + while (!this.atEnd && level === 0 && this.peek !== "]") { + if (this.peek === "[") + level += 1; + if (this.peek === "]") + level -= 1; + this.nextToken(); + } + this.match("]"); + } + const index = this.index; + this.index = start; + const closeDelimiter = this.matchEnclosureOpen(); + if (closeDelimiter) + return this.error( + ["expected-close-delimiter", { str: closeDelimiter }], + index + ); + const openDelimiter = this.matchEnclosureClose(); + if (openDelimiter) + return this.error( + ["expected-open-delimiter", { str: openDelimiter }], + start + ); + this.index = index; + while (this.match("<{>")) { + let level = 0; + while (!this.atEnd && level === 0 && this.peek !== "<}>") { + if (this.peek === "<{>") + level += 1; + if (this.peek === "<}>") + level -= 1; + this.nextToken(); + } + this.match("<}>"); + } + return this.error(["unexpected-command", { str: command }], start); + } + /** + * := + * ( | | | ) + * * * + * + * ::= + * ( | ()) + * + * := + * + * + * ( )* + * + * + */ + parsePrimary(until) { + var _a, _b, _c; + if (this.atBoundary) + return null; + if (this.atTerminator(until)) + return null; + let result = null; + const start = this.index; + if (this.match("<}>")) + return this.error("unexpected-closing-delimiter", start); + if (this.match("<{>")) { + result = this.parseExpression({ + minPrec: 0, + condition: (p) => p.peek === "<}>" + }); + if (result === null) + return this.error("expected-expression", start); + if (!this.match("<}>")) { + return this.decorate( + ["Sequence", result, this.error("expected-closing-delimiter", start)], + start + ); + } + } + if (result === null) { + const num = this.parseNumber(); + if (num !== null) + result = { num }; + } + result != null ? result : result = this.parseEnclosure(); + result != null ? result : result = this.parseEnvironment(until); + if (result === null && this.matchAll(this._positiveInfinityTokens)) + result = { num: "+Infinity" }; + if (result === null && this.matchAll(this._negativeInfinityTokens)) + result = { num: "-Infinity" }; + if (result === null && this.matchAll(this._notANumberTokens)) + result = { num: "NaN" }; + result != null ? result : result = (_c = (_b = (_a = this.parseGenericExpression(until)) != null ? _a : this.parseFunction(until)) != null ? _b : this.parseSymbol(until)) != null ? _c : parseInvalidIdentifier(this); + if (result !== null) { + result = this.decorate(result, start); + let postfix = null; + let index = this.index; + do { + postfix = this.parsePostfixOperator(result, until); + result = postfix != null ? postfix : result; + if (this.index === index && postfix !== null) { + /* @__PURE__ */ console.assert(this.index !== index, "No token consumed"); + break; + } + index = this.index; + } while (postfix !== null); + } + if (result !== null) + result = this.parseSupsub(result); + return this.decorate(result, start); + } + /** + * Parse an expression: + * + * ::= + * | + * | + * | + * + * Stop when an operator of precedence less than `until.minPrec` + * is encountered + */ + parseExpression(until) { + const start = this.index; + this.skipSpace(); + if (this.atBoundary) { + this.index = start; + return null; + } + until != null ? until : until = { minPrec: 0 }; + /* @__PURE__ */ console.assert(until.minPrec !== void 0); + if (until.minPrec === void 0) + until = { ...until, minPrec: 0 }; + let lhs = this.parsePrefixOperator({ ...until, minPrec: 0 }); + if (lhs === null) { + lhs = this.parsePrimary(until); + if (head(lhs) === "Sequence" && nops(lhs) === 0) + lhs = null; + } + if (lhs) { + let done = false; + while (!done && !this.atTerminator(until)) { + this.skipSpace(); + let result = this.parseInfixOperator(lhs, until); + if (result === null) { + result = this.applyInvisibleOperator(until, lhs); + } + if (result !== null) { + lhs = result; + } else { + done = true; + } + } + } + lhs != null ? lhs : lhs = this.parseUnexpectedLatexCommand(); + return this.decorate(lhs, start); + } + /** + * Add LaTeX or other requested metadata to the expression + */ + decorate(expr, start) { + if (expr === null) + return null; + if (!this.options.preserveLatex) + return expr; + const latex = this.latex(start, this.index); + if (Array.isArray(expr)) { + expr = { latex, fn: expr }; + } else if (typeof expr === "number") { + expr = { latex, num: Number(expr).toString() }; + } else if (typeof expr === "string") { + expr = { latex, sym: expr }; + } else if (typeof expr === "object" && expr !== null) { + expr.latex = latex; + } + return expr; + } + error(code, fromToken) { + let msg; + if (typeof code === "string") { + /* @__PURE__ */ console.assert(!code.startsWith("'")); + msg = { str: code }; + } else { + /* @__PURE__ */ console.assert(!code[0].startsWith("'")); + msg = ["ErrorCode", { str: code[0] }, ...code.slice(1)]; + } + const latex = this.latex(fromToken, this.index); + return latex ? ["Error", msg, ["Latex", { str: latex }]] : ["Error", msg]; + } + isFunctionHead(expr) { + var _a, _b; + if (expr === null) + return false; + const s = symbol(expr); + if (!s) + return this.computeEngine.box(expr).domain.isFunction; + if (this.computeEngine && this.computeEngine.lookupFunction(s) !== void 0) + return true; + if (((_b = (_a = this.options).parseUnknownIdentifier) == null ? void 0 : _b.call(_a, s, this)) === "function") + return true; + return false; + } + /** Return all defs of the specified kind */ + *getDefs(kind) { + if (kind === "operator") { + for (const def of this._dictionary.defs) + if (/^prefix|infix|postfix/.test(def.kind)) + yield def; + } else { + for (const def of this._dictionary.defs) + if (def.kind === kind) + yield def; + } + } +}; +function parseComplexId(parser, id) { + var _a; + const start = parser.index; + const candidate = (_a = parseIdentifier(parser)) == null ? void 0 : _a.trim(); + if (candidate === null) + return 0; + const result = candidate !== id ? 0 : parser.index - start; + parser.index = start; + return result; +} +function formatFractionalPart(m, options) { + const originalLength = m.length; + const originalM = m; + if (options.beginRepeatingDigits && options.endRepeatingDigits) { + m = m.slice(0, -1); + for (let i = 0; i < m.length - 16; i++) { + const offset = m.substring(0, i); + for (let j = 0; j < 17; j++) { + const cycle = m.substring(i, i + j + 1); + const times = Math.floor((m.length - offset.length) / cycle.length); + if (times <= 3) + break; + if ((offset + cycle.repeat(times + 1)).startsWith(m)) { + if (cycle === "0") { + return offset.replace(/(\d{3})/g, "$1" + options.groupSeparator); + } + return offset.replace(/(\d{3})/g, "$1" + options.groupSeparator) + options.beginRepeatingDigits + cycle + options.endRepeatingDigits; + } + } + } + } + const extraDigits = originalLength > options.precision - 1; + m = originalM; + if (extraDigits) + m = m.substring(0, options.precision - 1); + if (options.groupSeparator) { + m = m.replace(/(\d{3})/g, "$1" + options.groupSeparator); + if (m.endsWith(options.groupSeparator)) { + m = m.slice(0, -options.groupSeparator.length); + } + } + if (extraDigits) + return m + options.truncationMarker; + return m; +} +function formatExponent(exp2, options) { + var _a; + if (!exp2) + return ""; + if (options.beginExponentMarker) { + return options.beginExponentMarker + exp2 + ((_a = options.endExponentMarker) != null ? _a : ""); + } + return "10^{" + exp2 + "}"; +} +function serializeNumber(expr, options) { + var _a; + if (expr === null) + return ""; + let num; + if (typeof expr === "number" || typeof expr === "string") { + num = expr; + } else if (typeof expr === "object" && "num" in expr) { + num = expr.num; + } else + return ""; + if (typeof num === "number") { + if (num === Infinity) + return options.positiveInfinity; + else if (num === -Infinity) + return options.negativeInfinity; + else if (Number.isNaN(num)) + return options.notANumber; + let result2 = void 0; + if (options.notation === "engineering") + result2 = serializeScientificNotationNumber( + num.toExponential(), + options, + 3 + ); + else if (options.notation === "scientific") + result2 = serializeScientificNotationNumber(num.toExponential(), options); + return result2 != null ? result2 : serializeAutoNotationNumber(num.toString(), options); + } + num = num.toLowerCase().replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); + if (num === "infinity" || num === "+infinity") + return options.positiveInfinity; + else if (num === "-infinity") + return options.negativeInfinity; + else if (num === "nan") + return options.notANumber; + if (!/^[-+\.]?[0-9]/.test(num)) + return ""; + num = num.replace(/[nd]$/, ""); + if (/\([0-9]+\)/.test(num)) { + const [_, body, repeat, trail] = (_a = num.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; + num = body + repeat.repeat(Math.ceil(options.precision / repeat.length)) + trail; + } + let sign2 = ""; + if (num[0] === "-") { + sign2 = "-"; + num = num.substring(1); + } else if (num[0] === "+") { + num = num.substring(1); + } + while (num[0] === "0") + num = num.substring(1); + if (num.length === 0) + num = "0"; + else if (num[0] === ".") + num = "0" + num; + let result = void 0; + if (options.notation === "engineering") + result = serializeScientificNotationNumber(num, options, 3); + else if (options.notation === "scientific") + result = serializeScientificNotationNumber(num, options); + return sign2 + (result != null ? result : serializeAutoNotationNumber(num, options)); +} +function serializeScientificNotationNumber(valString, options, expMultiple = 1) { + var _a; + let m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/); + if (!m) { + let sign2 = ""; + if (valString[0] === "-") { + sign2 = "-"; + valString = valString.substring(1); + } else if (valString[0] === "+") { + valString = valString.substring(1); + } + if (valString.indexOf(".") < 0) { + if (valString.length === 1) { + valString = sign2 + valString + "e+0"; + } else { + valString = sign2 + valString[0] + "." + valString.slice(1) + "e+" + (valString.length - 1).toString(); + } + } else { + let [_, whole, fraction] = valString.match(/^(.*)\.(.*)$/); + if (!fraction) + fraction = ""; + while (whole.startsWith("0")) + whole = whole.substring(1); + if (!whole) { + valString = sign2 + "0." + fraction + "e+0"; + } else { + valString = sign2 + whole[0] + "." + whole.slice(1) + fraction + "e+" + (whole.length - 1).toString(); + } + } + m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/); + } + /* @__PURE__ */ console.assert(m); + if (!m) + return serializeAutoNotationNumber(valString, options); + let exponent = parseInt(m[2]); + let mantissa = m[1]; + if (Math.abs(exponent) % expMultiple !== 0) { + const adjust = exponent > 0 ? exponent % expMultiple : -((expMultiple + exponent) % expMultiple); + exponent = exponent >= 0 ? exponent - adjust : exponent + adjust; + let [_, whole, fraction] = (_a = mantissa.match(/^(.*)\.(.*)$/)) != null ? _a : [ + "", + mantissa, + "" + ]; + mantissa = whole + (fraction + "00000000000000000").slice(0, Math.abs(adjust)) + "." + fraction.slice(Math.abs(adjust)); + } + const avoid = options.avoidExponentsInRange; + if (avoid && exponent >= avoid[0] && exponent <= avoid[1]) + return void 0; + let fractionalPart = ""; + let wholePart = mantissa; + m = wholePart.match(/^(.*)\.(.*)$/); + if (m) { + wholePart = m[1]; + fractionalPart = m[2]; + } + const expString = exponent !== 0 ? formatExponent(Number(exponent).toString(), options) : ""; + if (options.groupSeparator) { + wholePart = wholePart.replace( + /\B(?=(\d{3})+(?!\d))/g, + options.groupSeparator + ); + fractionalPart = formatFractionalPart(fractionalPart, options); + } + if (fractionalPart) + fractionalPart = options.decimalMarker + fractionalPart; + if (!expString) + return wholePart + fractionalPart; + if (wholePart === "1" && !fractionalPart) + return expString; + return wholePart + fractionalPart + options.exponentProduct + expString; +} +function serializeAutoNotationNumber(valString, options) { + var _a; + let m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/i); + let exponent = void 0; + if ((m == null ? void 0 : m[1]) && m[2]) { + exponent = formatExponent(m[2], options); + } + let wholePart = (_a = m == null ? void 0 : m[1]) != null ? _a : valString; + let fractionalPart = ""; + m = (exponent ? m[1] : valString).match(/^(.*)\.(.*)$/); + if ((m == null ? void 0 : m[1]) && m[2]) { + wholePart = m[1]; + fractionalPart = m[2]; + } + if (options.groupSeparator) { + wholePart = wholePart.replace( + /\B(?=(\d{3})+(?!\d))/g, + options.groupSeparator + ); + fractionalPart = formatFractionalPart(fractionalPart, options); + } + if (fractionalPart) + fractionalPart = options.decimalMarker + fractionalPart; + if (!exponent) + return wholePart + fractionalPart; + if (wholePart === "1" && !fractionalPart) + return exponent; + return wholePart + fractionalPart + options.exponentProduct + exponent; +} +var ACCENT_MODIFIERS = { + deg: (s) => `${s}\\degree`, + prime: (s) => `${s}^{\\prime}`, + dprime: (s) => `${s}^{\\doubleprime}`, + ring: (s) => `\\mathring{${s}}`, + hat: (s) => `\\hat{${s}}`, + tilde: (s) => `\\tilde{${s}}`, + vec: (s) => `\\vec{${s}}`, + bar: (s) => `\\overline{${s}}`, + underbar: (s) => `\\underline{${s}}`, + dot: (s) => `\\dot{${s}}`, + ddot: (s) => `\\ddot{${s}}`, + tdot: (s) => `\\dddot{${s}}`, + qdot: (s) => `\\ddddot{${s}}`, + // Supplemental + acute: (s) => `\\acute{${s}}`, + grave: (s) => `\\grave{${s}}`, + breve: (s) => `\\breve{${s}}`, + check: (s) => `\\check{${s}}` +}; +var STYLE_MODIFIERS = { + upright: (s) => `\\mathrm{${s}}`, + italic: (s) => `\\mathit{${s}}`, + bold: (s) => `\\mathbf{${s}}`, + script: (s) => `\\mathscr{${s}}`, + fraktur: (s) => `\\mathfrak{${s}}`, + // Note Unicode uses 'fraktur' for 'gothic' + doublestruck: (s) => `\\mathbb{${s}}`, + // Unicode uses 'double-struck' for 'blackboard' + // Supplemental + blackboard: (s) => `\\mathbb{${s}}`, + calligraphic: (s) => `\\mathcal{${s}}`, + gothic: (s) => `\\mathfrak{${s}}`, + sansserif: (s) => `\\mathsf{${s}}`, + monospace: (s) => `\\mathtt{${s}}` +}; +var Serializer = class { + constructor(options, dictionary2, onError) { + this.level = -1; + this.options = options; + if (options.invisibleMultiply) { + if (!/#1/.test(options.invisibleMultiply) || !/#2/.test(options.invisibleMultiply)) { + onError([ + { + severity: "warning", + message: ["expected-argument", "invisibleMultiply"] + } + ]); + } + } + this.onError = onError; + this.dictionary = dictionary2; + this.canonical = void 0; + } + updateOptions(opt) { + for (const k of Object.keys(this.options)) + if (k in opt) + this.options[k] = opt[k]; + } + /** + * Serialize the expression, and if the expression is an operator + * of precedence less than or equal to prec, wrap it in some paren. + * @todo: don't wrap Abs, Floor, Ceil, Delimiter + */ + wrap(expr, prec) { + if (expr === null) + return ""; + if (prec === void 0) { + return this.wrapString( + this.serialize(expr), + this.options.groupStyle(expr, this.level + 1) + ); + } + if (typeof expr === "number" || isNumberObject(expr) || typeof expr === "string" || isSymbolObject(expr)) { + return this.serialize(expr); + } + const name = head(expr); + if (typeof name === "string" && name !== "Delimiter" && name !== "Subscript") { + const def = this.dictionary.ids.get(name); + if (def && (def.kind === "symbol" || def.kind === "prefix" || def.kind === "infix" || def.kind === "postfix") && def.precedence < prec) + return this.wrapString( + this.serialize(expr), + this.options.applyFunctionStyle(expr, this.level) + ); + } + return this.serialize(expr); + } + /** + * If this is a "short" expression, wrap it. + * Do not wrap identifiers, positive numbers or functions. + * + * This is called by the serializer for power and division (i.e. "(a+1)/b") + * + */ + wrapShort(expr) { + if (expr === null) + return ""; + const exprStr = this.serialize(expr); + if (symbol(expr) !== null) + return exprStr; + if (head(expr) === "Delimiter" && nops(expr) === 1) + return exprStr; + const isNum = isNumberExpression(expr); + if (isNum && !/^(-|\.)/.test(exprStr)) + return exprStr; + const h = head(expr); + if (h !== "Add" && h !== "Negate" && h !== "Subtract" && h !== "PlusMinus" && h !== "Multiply") + return exprStr; + return this.wrapString( + exprStr, + this.options.groupStyle(expr, this.level + 1) + ); + } + wrapString(s, style, fence) { + var _a, _b; + if (style === "none") + return s; + if (fence === void 0) + fence = "()"; + const openFence = (_a = fence == null ? void 0 : fence[0]) != null ? _a : "."; + const closeFence = (_b = fence == null ? void 0 : fence[1]) != null ? _b : "."; + if ((openFence === "." || closeFence === ".") && style === "paren") + style = "leftright"; + if (style === "leftright") + return `\\left${openFence}${s}\\right${closeFence}}`; + if (style === "big") + return `${openFence === "." ? "" : `\\Bigl${openFence}`}${s}${closeFence === "." ? "" : `\\Bigr${closeFence}`})`; + return openFence + s + closeFence; + } + wrapArguments(expr) { + var _a; + return this.wrapString( + ((_a = ops(expr)) != null ? _a : []).map((x) => this.serialize(x)).join(", "), + this.options.applyFunctionStyle(expr, this.level) + ); + } + serializeSymbol(expr, def) { + var _a, _b, _c, _d, _e; + /* @__PURE__ */ console.assert(typeof expr === "string" || isSymbolObject(expr)); + if ((def == null ? void 0 : def.kind) === "function") { + return (_b = serializeIdentifier((_a = symbol(expr)) != null ? _a : "")) != null ? _b : ""; + } + return (_e = (_d = (_c = def == null ? void 0 : def.serialize) == null ? void 0 : _c.call(def, this, expr)) != null ? _d : serializeIdentifier(symbol(expr))) != null ? _e : ""; + } + serializeFunction(expr, def) { + var _a; + if (def == null ? void 0 : def.serialize) + return def.serialize(this, expr); + const h = head(expr); + if (typeof h === "string") + return serializeIdentifier(h, "auto") + this.wrapArguments(expr); + const args = (_a = ops(expr)) != null ? _a : []; + if (args.length === 1) { + return joinLatex([ + this.serialize(args[0]), + "\\rhd", + this.wrapString( + this.serialize(h), + this.options.applyFunctionStyle(expr, this.level) + ) + ]); + } + const style = this.options.applyFunctionStyle(expr, this.level); + return joinLatex([ + "\\operatorname{apply}", + this.wrapString( + this.serialize(h) + ", " + this.serialize(["List", ...args]), + style + ) + ]); + } + serializeDictionary(dict) { + return `\\left\\lbrack\\begin{array}{lll}${Object.keys(dict).map((x) => { + return `\\textbf{${x}} & \\rightarrow & ${this.serialize(dict[x])}`; + }).join("\\\\")}\\end{array}\\right\\rbrack`; + } + serialize(expr, options) { + if (expr === null || expr === void 0) + return ""; + options != null ? options : options = {}; + options = { ...options }; + if (!("canonical" in options)) + options.canonical = true; + const savedCanonical = this.canonical; + if (this.canonical === void 0) + this.canonical = options.canonical; + this.level += 1; + try { + const result = (() => { + const numericValue = serializeNumber(expr, this.options); + if (numericValue) + return numericValue; + const s = stringValue(expr); + if (s !== null) + return `\\text{${s}}`; + const dict = dictionary(expr); + if (dict !== null) + return this.serializeDictionary(dict); + const symbolName = symbol(expr); + if (symbolName !== null) { + return this.serializeSymbol( + expr, + this.dictionary.ids.get(symbolName) + ); + } + const fnName = headName(expr); + if (fnName) { + return this.serializeFunction(expr, this.dictionary.ids.get(fnName)); + } + if (head(expr) !== null) + return this.serializeFunction(expr); + this.onError([ + { + severity: "warning", + message: [ + "syntax-error", + expr ? JSON.stringify(expr) : "undefined" + ] + } + ]); + })(); + this.level -= 1; + this.canonical = savedCanonical; + return result != null ? result : ""; + } catch (e) { + } + this.level -= 1; + this.canonical = savedCanonical; + return ""; + } + applyFunctionStyle(expr, level) { + return this.options.applyFunctionStyle(expr, level); + } + groupStyle(expr, level) { + return this.options.groupStyle(expr, level); + } + rootStyle(expr, level) { + return this.options.rootStyle(expr, level); + } + fractionStyle(expr, level) { + return this.options.fractionStyle(expr, level); + } + logicStyle(expr, level) { + return this.options.logicStyle(expr, level); + } + powerStyle(expr, level) { + return this.options.powerStyle(expr, level); + } + numericSetStyle(expr, level) { + return this.options.numericSetStyle(expr, level); + } +}; +function specialName(s) { + var _a, _b; + const prefix = (_b = (_a = s.match(/^([^_]+)/)) == null ? void 0 : _a[1]) != null ? _b : ""; + let i = SYMBOLS.findIndex((x) => prefix === x[0]); + if (i >= 0) + return [SYMBOLS[i][1], s.substring(SYMBOLS[i][0].length)]; + const DIGITS = { + zero: "0", + one: "1", + two: "2", + three: "3", + four: "4", + five: "5", + six: "6", + seven: "7", + eight: "8", + nine: "9", + ten: "10" + }; + i = Object.keys(DIGITS).findIndex((x) => s.startsWith(x)); + if (i >= 0) { + const key = Object.keys(DIGITS)[i]; + return [DIGITS[key], s.substring(key.length)]; + } + const code = s.codePointAt(0); + i = SYMBOLS.findIndex((x) => x[2] === code); + if (i >= 0) + return [SYMBOLS[i][1], s.substring(1)]; + const EXTRA_SYMBOLS = { + plus: "+", + minus: "-", + pm: "\\pm", + ast: "\\ast", + dag: "\\dag", + ddag: "\\ddag", + hash: "\\#", + bottom: "\\bot", + top: "\\top", + bullet: "\\bullet", + circle: "\\circ", + diamond: "\\diamond", + times: "\\times", + square: "\\square", + star: "\\star" + }; + i = Object.keys(EXTRA_SYMBOLS).findIndex((x) => prefix === x); + if (i >= 0) { + const key = Object.keys(EXTRA_SYMBOLS)[i]; + return [EXTRA_SYMBOLS[key], s.substring(key.length)]; + } + return [prefix, s.substring(prefix.length)]; +} +function parseModifiers(s) { + let [body, rest] = specialName(s); + const accent = []; + while (rest.length > 0) { + const m = rest.match(/^_([a-zA-Z]+)(.*)/); + if (!m) + break; + if (!ACCENT_MODIFIERS[m[1]]) + break; + accent.push(m[1]); + rest = m[2]; + } + const styles = []; + while (rest.length > 0) { + const m = rest.match(/^_([a-zA-Z]+)(.*)/); + if (!m) + break; + if (!STYLE_MODIFIERS[m[1]]) + break; + styles.push(m[1]); + rest = m[2]; + } + return [body, accent, styles, rest]; +} +function parseIdentifierBody2(s, topLevel = true, style = "auto") { + let [body, accents, styles, rest] = parseModifiers(s); + for (const accent of accents) { + if (ACCENT_MODIFIERS[accent]) + body = ACCENT_MODIFIERS[accent](body); + } + if (topLevel) { + const sups = []; + const subs2 = []; + const m = body.match(/^([^\d].*?)(\d+)$/); + if (m) { + subs2.push(m[2]); + body = m[1]; + } + while (rest.length > 0) { + if (rest.startsWith("__")) { + const [sup, rest2] = parseIdentifierBody2( + rest.substring(2), + false, + "none" + ); + sups.push(sup); + rest = rest2; + } else if (rest.startsWith("_")) { + const [sub2, rest2] = parseIdentifierBody2( + rest.substring(1), + false, + "none" + ); + subs2.push(sub2); + rest = rest2; + } else { + break; + } + } + if (sups.length > 0) + body = `${body}^{${sups.join(",")}}`; + if (subs2.length > 0) + body = `${body}_{${subs2.join(",")}}`; + } + for (const style2 of styles) { + if (STYLE_MODIFIERS[style2]) + body = STYLE_MODIFIERS[style2](body); + } + if (styles.length === 0 && style !== "none") { + switch (style) { + case "auto": + if (countTokens(body) > 1) + body = `\\mathrm{${body}}`; + break; + case "operator": + body = `\\operatorname{${body}}`; + break; + case "italic": + body = `\\mathit{${body}}`; + break; + case "upright": + body = `\\mathrm{${body}}`; + break; + } + } + return [body, rest]; +} +function serializeIdentifier(s, style = "auto") { + if (s === null) + return null; + if (ONLY_EMOJIS.test(s)) + return s; + const m = s.match(/^(_+)(.*)/); + if (m) { + const [body2, rest2] = parseIdentifierBody2(m[2], true, "none"); + return `\\operatorname{${"\\_".repeat(m[1].length) + body2 + rest2}}`; + } + const [body, rest] = parseIdentifierBody2(s, true, style); + if (rest.length > 0) + return `\\operatorname{${s}}`; + return body; +} +var DEFAULT_SERIALIZE_LATEX_OPTIONS = { + invisibleMultiply: "", + // '\\cdot', + invisiblePlus: "", + // '+', + // invisibleApply: '', + multiply: "\\times", + missingSymbol: "\\blacksquare", + // openGroup: '(', + // closeGroup: ')', + // divide: '\\frac{#1}{#2}', + // subtract: '#1-#2', + // add: '#1+#2', + // negate: '-#1', + // squareRoot: '\\sqrt{#1}', + // nthRoot: '\\sqrt[#2]{#1}', + applyFunctionStyle: getApplyFunctionStyle, + groupStyle: getGroupStyle, + rootStyle: getRootStyle, + fractionStyle: getFractionStyle, + logicStyle: getLogicStyle, + powerStyle: getPowerStyle, + numericSetStyle: getNumericSetStyle +}; +var LatexSyntax = class _LatexSyntax { + constructor(options) { + var _a, _b; + const onError = (warnings) => { + if (typeof window !== "undefined") { + for (const warning of warnings) + console.warn(warning.message); + } + return; + }; + this.onError = (_a = options.onError) != null ? _a : onError; + this.computeEngine = options.computeEngine; + const opts = { ...options }; + delete opts.dictionary; + delete opts.onError; + this.options = { + ...DEFAULT_LATEX_NUMBER_OPTIONS, + ...DEFAULT_PARSE_LATEX_OPTIONS, + ...DEFAULT_SERIALIZE_LATEX_OPTIONS, + ...opts + }; + this._dictionaryInput = (_b = options.dictionary) != null ? _b : _LatexSyntax.getDictionary(); + this._dictionary = indexLatexDictionary( + this._dictionaryInput, + (sig) => this.onError([sig]) + ); + } + get dictionary() { + return this._dictionaryInput; + } + set dictionary(val) { + this._dictionaryInput = val; + this._dictionary = indexLatexDictionary(val, (sig) => this.onError([sig])); + } + updateOptions(opt) { + for (const k of Object.keys(this.options)) + if (k in opt) + this.options[k] = opt[k]; + this.serializer.updateOptions(opt); + } + static getDictionary(category = "all") { + if (category === "all") { + const result = []; + for (const domain of Object.keys(DEFAULT_LATEX_DICTIONARY)) + if (DEFAULT_LATEX_DICTIONARY[domain]) + result.push(...DEFAULT_LATEX_DICTIONARY[domain]); + return result; + } + if (!DEFAULT_LATEX_DICTIONARY[category]) + return []; + return Object.freeze([...DEFAULT_LATEX_DICTIONARY[category]]); + } + parse(latex) { + const parser = new _Parser( + tokenize(latex, []), + this.options, + this._dictionary, + this.computeEngine + ); + let expr = parser.parseExpression(); + if (!parser.atEnd) { + const opDefs = parser.peekDefinitions("infix"); + if (opDefs.length > 0) { + const start = parser.index; + const [def, n] = opDefs[0]; + parser.index += n; + const result = def.parse( + parser, + expr != null ? expr : parser.error("missing", start), + { minPrec: 0 } + ); + if (result) + return result; + if (def.name) { + return [ + def.name, + expr != null ? expr : parser.error("missing", start), + parser.error("missing", start) + ]; + } + parser.index = start; + } + const index = parser.index; + const id = parseIdentifier(parser); + if (id) { + const idError = parser.error(["unexpected-identifier", id], index); + return expr ? ["Sequence", expr, idError] : idError; + } + let openDelimiter = parser.peek; + const closeDelimiter = parser.matchEnclosureOpen(); + if (closeDelimiter) { + parser.parseExpression(); + parser.match(closeDelimiter); + const enclosureError = parser.error( + ["unexpected-open-delimiter", { str: openDelimiter }], + index + ); + return expr ? ["Sequence", expr, enclosureError] : enclosureError; + } + openDelimiter = parser.matchEnclosureClose(); + if (openDelimiter) { + const enclosureError = parser.error( + ["expected-open-delimiter", { str: openDelimiter }], + index + ); + return expr ? ["Sequence", expr, enclosureError] : enclosureError; + } + const rest = parser.index; + const token = parser.nextToken(); + while (!parser.atEnd) + parser.nextToken(); + if (!token) + return parser.error("syntax-error", rest); + const error = parser.error( + [ + token.length > 1 && token.startsWith("\\") ? "unexpected-command" : "unexpected-token", + { str: tokensToString([token]) } + ], + rest + ); + expr = expr ? ["Sequence", expr, error] : error; + } + expr != null ? expr : expr = ["Sequence"]; + if (this.options.preserveLatex) { + if (Array.isArray(expr)) + expr = { latex, fn: expr }; + else if (typeof expr === "number") + expr = { latex, num: Number(expr).toString() }; + else if (typeof expr === "string") + expr = { latex, sym: expr }; + else if (typeof expr === "object" && expr !== null) + expr.latex = latex; + } + return expr != null ? expr : ["Sequence"]; + } + serialize(expr, options) { + return this.serializer.serialize(expr, options); + } + get serializer() { + if (this._serializer) + return this._serializer; + this._serializer = new Serializer( + this.options, + this._dictionary, + this.onError + ); + return this._serializer; + } +}; +var import_complex2 = __toESM(require_complex()); +var import_complex = __toESM(require_complex()); +var MACHINE_PRECISION_BITS = 53; +var MACHINE_PRECISION = Math.log10( + Math.pow(2, MACHINE_PRECISION_BITS) +); +var MACHINE_TOLERANCE_BITS = 7; +var MACHINE_TOLERANCE = Math.pow( + 2, + -(MACHINE_PRECISION_BITS - MACHINE_TOLERANCE_BITS) +); +var NUMERIC_TOLERANCE = Math.pow(10, -10); +var SMALL_INTEGER = 1e6; +var MAX_ITERATION = 1e6; +var MAX_SYMBOLIC_TERMS = 200; +var SMALL_PRIMES = /* @__PURE__ */ new Set([ + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 127, + 131, + 137, + 139, + 149, + 151, + 157, + 163, + 167, + 173, + 179, + 181, + 191, + 193, + 197, + 199, + 211, + 223, + 227, + 229, + 233, + 239, + 241, + 251, + 257, + 263, + 269, + 271, + 277, + 281, + 283, + 293, + 307, + 311, + 313, + 317, + 331, + 337, + 347, + 349, + 353, + 359, + 367, + 373, + 379, + 383, + 389, + 397, + 401, + 409, + 419, + 421, + 431, + 433, + 439, + 443, + 449, + 457, + 461, + 463, + 467, + 479, + 487, + 491, + 499, + 503, + 509, + 521, + 523, + 541, + 547, + 557, + 563, + 569, + 571, + 577, + 587, + 593, + 599, + 601, + 607, + 613, + 617, + 619, + 631, + 641, + 643, + 647, + 653, + 659, + 661, + 673, + 677, + 683, + 691, + 701, + 709, + 719, + 727, + 733, + 739, + 743, + 751, + 757, + 761, + 769, + 773, + 787, + 797, + 809, + 811, + 821, + 823, + 827, + 829, + 839, + 853, + 857, + 859, + 863, + 877, + 881, + 883, + 887, + 907, + 911, + 919, + 929, + 937, + 941, + 947, + 953, + 967, + 971, + 977, + 983, + 991, + 997, + 1009, + 1013, + 1019, + 1021, + 1031, + 1033, + 1039, + 1049, + 1051, + 1061, + 1063, + 1069, + 1087, + 1091, + 1093, + 1097, + 1103, + 1109, + 1117, + 1123, + 1129, + 1151, + 1153, + 1163, + 1171, + 1181, + 1187, + 1193, + 1201, + 1213, + 1217, + 1223, + 1229, + 1231, + 1237, + 1249, + 1259, + 1277, + 1279, + 1283, + 1289, + 1291, + 1297, + 1301, + 1303, + 1307, + 1319, + 1321, + 1327, + 1361, + 1367, + 1373, + 1381, + 1399, + 1409, + 1423, + 1427, + 1429, + 1433, + 1439, + 1447, + 1451, + 1453, + 1459, + 1471, + 1481, + 1483, + 1487, + 1489, + 1493, + 1499, + 1511, + 1523, + 1531, + 1543, + 1549, + 1553, + 1559, + 1567, + 1571, + 1579, + 1583, + 1597, + 1601, + 1607, + 1609, + 1613, + 1619, + 1621, + 1627, + 1637, + 1657, + 1663, + 1667, + 1669, + 1693, + 1697, + 1699, + 1709, + 1721, + 1723, + 1733, + 1741, + 1747, + 1753, + 1759, + 1777, + 1783, + 1787, + 1789, + 1801, + 1811, + 1823, + 1831, + 1847, + 1861, + 1867, + 1871, + 1873, + 1877, + 1879, + 1889, + 1901, + 1907, + 1913, + 1931, + 1933, + 1949, + 1951, + 1973, + 1979, + 1987, + 1993, + 1997, + 1999, + 2003, + 2011, + 2017, + 2027, + 2029, + 2039, + 2053, + 2063, + 2069, + 2081, + 2083, + 2087, + 2089, + 2099, + 2111, + 2113, + 2129, + 2131, + 2137, + 2141, + 2143, + 2153, + 2161, + 2179, + 2203, + 2207, + 2213, + 2221, + 2237, + 2239, + 2243, + 2251, + 2267, + 2269, + 2273, + 2281, + 2287, + 2293, + 2297, + 2309, + 2311, + 2333, + 2339, + 2341, + 2347, + 2351, + 2357, + 2371, + 2377, + 2381, + 2383, + 2389, + 2393, + 2399, + 2411, + 2417, + 2423, + 2437, + 2441, + 2447, + 2459, + 2467, + 2473, + 2477, + 2503, + 2521, + 2531, + 2539, + 2543, + 2549, + 2551, + 2557, + 2579, + 2591, + 2593, + 2609, + 2617, + 2621, + 2633, + 2647, + 2657, + 2659, + 2663, + 2671, + 2677, + 2683, + 2687, + 2689, + 2693, + 2699, + 2707, + 2711, + 2713, + 2719, + 2729, + 2731, + 2741, + 2749, + 2753, + 2767, + 2777, + 2789, + 2791, + 2797, + 2801, + 2803, + 2819, + 2833, + 2837, + 2843, + 2851, + 2857, + 2861, + 2879, + 2887, + 2897, + 2903, + 2909, + 2917, + 2927, + 2939, + 2953, + 2957, + 2963, + 2969, + 2971, + 2999, + 3001, + 3011, + 3019, + 3023, + 3037, + 3041, + 3049, + 3061, + 3067, + 3079, + 3083, + 3089, + 3109, + 3119, + 3121, + 3137, + 3163, + 3167, + 3169, + 3181, + 3187, + 3191, + 3203, + 3209, + 3217, + 3221, + 3229, + 3251, + 3253, + 3257, + 3259, + 3271, + 3299, + 3301, + 3307, + 3313, + 3319, + 3323, + 3329, + 3331, + 3343, + 3347, + 3359, + 3361, + 3371, + 3373, + 3389, + 3391, + 3407, + 3413, + 3433, + 3449, + 3457, + 3461, + 3463, + 3467, + 3469, + 3491, + 3499, + 3511, + 3517, + 3527, + 3529, + 3533, + 3539, + 3541, + 3547, + 3557, + 3559, + 3571, + 3581, + 3583, + 3593, + 3607, + 3613, + 3617, + 3623, + 3631, + 3637, + 3643, + 3659, + 3671, + 3673, + 3677, + 3691, + 3697, + 3701, + 3709, + 3719, + 3727, + 3733, + 3739, + 3761, + 3767, + 3769, + 3779, + 3793, + 3797, + 3803, + 3821, + 3823, + 3833, + 3847, + 3851, + 3853, + 3863, + 3877, + 3881, + 3889, + 3907, + 3911, + 3917, + 3919, + 3923, + 3929, + 3931, + 3943, + 3947, + 3967, + 3989, + 4001, + 4003, + 4007, + 4013, + 4019, + 4021, + 4027, + 4049, + 4051, + 4057, + 4073, + 4079, + 4091, + 4093, + 4099, + 4111, + 4127, + 4129, + 4133, + 4139, + 4153, + 4157, + 4159, + 4177, + 4201, + 4211, + 4217, + 4219, + 4229, + 4231, + 4241, + 4243, + 4253, + 4259, + 4261, + 4271, + 4273, + 4283, + 4289, + 4297, + 4327, + 4337, + 4339, + 4349, + 4357, + 4363, + 4373, + 4391, + 4397, + 4409, + 4421, + 4423, + 4441, + 4447, + 4451, + 4457, + 4463, + 4481, + 4483, + 4493, + 4507, + 4513, + 4517, + 4519, + 4523, + 4547, + 4549, + 4561, + 4567, + 4583, + 4591, + 4597, + 4603, + 4621, + 4637, + 4639, + 4643, + 4649, + 4651, + 4657, + 4663, + 4673, + 4679, + 4691, + 4703, + 4721, + 4723, + 4729, + 4733, + 4751, + 4759, + 4783, + 4787, + 4789, + 4793, + 4799, + 4801, + 4813, + 4817, + 4831, + 4861, + 4871, + 4877, + 4889, + 4903, + 4909, + 4919, + 4931, + 4933, + 4937, + 4943, + 4951, + 4957, + 4967, + 4969, + 4973, + 4987, + 4993, + 4999, + 5003, + 5009, + 5011, + 5021, + 5023, + 5039, + 5051, + 5059, + 5077, + 5081, + 5087, + 5099, + 5101, + 5107, + 5113, + 5119, + 5147, + 5153, + 5167, + 5171, + 5179, + 5189, + 5197, + 5209, + 5227, + 5231, + 5233, + 5237, + 5261, + 5273, + 5279, + 5281, + 5297, + 5303, + 5309, + 5323, + 5333, + 5347, + 5351, + 5381, + 5387, + 5393, + 5399, + 5407, + 5413, + 5417, + 5419, + 5431, + 5437, + 5441, + 5443, + 5449, + 5471, + 5477, + 5479, + 5483, + 5501, + 5503, + 5507, + 5519, + 5521, + 5527, + 5531, + 5557, + 5563, + 5569, + 5573, + 5581, + 5591, + 5623, + 5639, + 5641, + 5647, + 5651, + 5653, + 5657, + 5659, + 5669, + 5683, + 5689, + 5693, + 5701, + 5711, + 5717, + 5737, + 5741, + 5743, + 5749, + 5779, + 5783, + 5791, + 5801, + 5807, + 5813, + 5821, + 5827, + 5839, + 5843, + 5849, + 5851, + 5857, + 5861, + 5867, + 5869, + 5879, + 5881, + 5897, + 5903, + 5923, + 5927, + 5939, + 5953, + 5981, + 5987, + 6007, + 6011, + 6029, + 6037, + 6043, + 6047, + 6053, + 6067, + 6073, + 6079, + 6089, + 6091, + 6101, + 6113, + 6121, + 6131, + 6133, + 6143, + 6151, + 6163, + 6173, + 6197, + 6199, + 6203, + 6211, + 6217, + 6221, + 6229, + 6247, + 6257, + 6263, + 6269, + 6271, + 6277, + 6287, + 6299, + 6301, + 6311, + 6317, + 6323, + 6329, + 6337, + 6343, + 6353, + 6359, + 6361, + 6367, + 6373, + 6379, + 6389, + 6397, + 6421, + 6427, + 6449, + 6451, + 6469, + 6473, + 6481, + 6491, + 6521, + 6529, + 6547, + 6551, + 6553, + 6563, + 6569, + 6571, + 6577, + 6581, + 6599, + 6607, + 6619, + 6637, + 6653, + 6659, + 6661, + 6673, + 6679, + 6689, + 6691, + 6701, + 6703, + 6709, + 6719, + 6733, + 6737, + 6761, + 6763, + 6779, + 6781, + 6791, + 6793, + 6803, + 6823, + 6827, + 6829, + 6833, + 6841, + 6857, + 6863, + 6869, + 6871, + 6883, + 6899, + 6907, + 6911, + 6917, + 6947, + 6949, + 6959, + 6961, + 6967, + 6971, + 6977, + 6983, + 6991, + 6997, + 7001, + 7013, + 7019, + 7027, + 7039, + 7043, + 7057, + 7069, + 7079, + 7103, + 7109, + 7121, + 7127, + 7129, + 7151, + 7159, + 7177, + 7187, + 7193, + 7207, + 7211, + 7213, + 7219, + 7229, + 7237, + 7243, + 7247, + 7253, + 7283, + 7297, + 7307, + 7309, + 7321, + 7331, + 7333, + 7349, + 7351, + 7369, + 7393, + 7411, + 7417, + 7433, + 7451, + 7457, + 7459, + 7477, + 7481, + 7487, + 7489, + 7499, + 7507, + 7517, + 7523, + 7529, + 7537, + 7541, + 7547, + 7549, + 7559, + 7561, + 7573, + 7577, + 7583, + 7589, + 7591, + 7603, + 7607, + 7621, + 7639, + 7643, + 7649, + 7669, + 7673, + 7681, + 7687, + 7691, + 7699, + 7703, + 7717, + 7723, + 7727, + 7741, + 7753, + 7757, + 7759, + 7789, + 7793, + 7817, + 7823, + 7829, + 7841, + 7853, + 7867, + 7873, + 7877, + 7879, + 7883, + 7901, + 7907, + 7919 +]); +var LARGEST_SMALL_PRIME = 7919; +function primeFactors(n) { + var _a, _b; + /* @__PURE__ */ console.assert( + Number.isInteger(n) && n >= 0 && n < Number.MAX_SAFE_INTEGER, + n + ); + if (n <= 3) + return { [n]: 1 }; + const result = {}; + let count = 0; + while (n % 2 === 0) { + count += 1; + n /= 2; + } + if (count > 0) + result[2] = count; + count = 0; + while (n % 3 === 0) { + count += 1; + n /= 3; + } + if (count > 0) + result[3] = count; + let done = false; + while (!done) { + if (n === 1) + return result; + const sr = Math.sqrt(n); + done = true; + for (let i = 6; i <= sr + 6; i += 6) { + if (n % (i - 1) === 0) { + result[i - 1] = ((_a = result[i - 1]) != null ? _a : 0) + 1; + n /= i - 1; + done = false; + break; + } + if (n % (i + 1) === 0) { + result[i + 1] = ((_b = result[i + 1]) != null ? _b : 0) + 1; + n /= i + 1; + done = false; + break; + } + } + } + if (result[n] !== void 0) + result[n] += 1; + else + result[n] = 1; + return result; +} +function factorPower(n, exponent) { + if (n >= Number.MAX_SAFE_INTEGER) + return [1, n]; + /* @__PURE__ */ console.assert(Number.isInteger(n) && n > 0 && n < Number.MAX_SAFE_INTEGER); + const factors = primeFactors(n); + let f = 1; + let r = 1; + for (const k of Object.keys(factors)) { + const v = parseInt(k); + f = f * Math.pow(v, Math.floor(factors[k] / exponent)); + r = r * Math.pow(v, factors[k] % exponent); + } + return [f, r]; +} +function gcd(a, b) { + if (a === 0) + return b; + if (b === 0) + return a; + if (a === b) + return a; + if (!Number.isInteger(a) || !Number.isInteger(b)) + return NaN; + while (b !== 0) + [a, b] = [b, a % b]; + return a < 0 ? -a : a; +} +function lcm(a, b) { + return a * b / gcd(a, b); +} +function factorial(n) { + if (!Number.isInteger(n) || n < 0) + return NaN; + let val = 1; + for (let i = 2; i <= n; i++) + val = val * i; + return val; +} +var gammaG = 7; +var lanczos_7_c = [ + 0.9999999999998099, + 676.5203681218851, + -1259.1392167224028, + 771.3234287776531, + -176.6150291621406, + 12.507343278686905, + -0.13857109526572012, + 9984369578019572e-21, + 15056327351493116e-23 +]; +var gammaGLn = 607 / 128; +var gammaPLn = [ + 0.999999999999997, + 57.15623566586292, + -59.59796035547549, + 14.13609797474174, + -0.4919138160976202, + 3399464998481188e-20, + 4652362892704857e-20, + -9837447530487956e-20, + 1580887032249125e-19, + -21026444172410488e-20, + 2174396181152126e-19, + -1643181065367639e-19, + 8441822398385274e-20, + -261908384015814e-19, + 3689918265953162e-21 +]; +function lngamma(z) { + if (z < 0) + return NaN; + let x = gammaPLn[0]; + for (let i = gammaPLn.length - 1; i > 0; --i) + x += gammaPLn[i] / (z + i); + const t = z + gammaGLn + 0.5; + return 0.5 * Math.log(2 * Math.PI) + (z + 0.5) * Math.log(t) - t + Math.log(x) - Math.log(z); +} +function gamma(z) { + if (z < 0.5) + return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); + if (z > 100) + return Math.exp(lngamma(z)); + z -= 1; + let x = lanczos_7_c[0]; + for (let i = 1; i < gammaG + 2; i++) + x += lanczos_7_c[i] / (z + i); + const t = z + gammaG + 0.5; + return Math.sqrt(2 * Math.PI) * Math.pow(t, z + 0.5) * Math.exp(-t) * x; +} +function fromDigits(s, base = 10) { + let value = 0; + for (let i = 0; i < s.length; i++) { + const k = { + " ": -1, + "\xA0": -1, + // NBS + "\u2000": -1, + // EN QUAD + "\u2001": -1, + // EM QUAD + "\u2002": -1, + // EN SPACE + "\u2003": -1, + // EM SPACE + "\u2004": -1, + // THREE-PER-EM SPACE + "\u2005": -1, + // FOUR-PER-EM SPACE + "\u2006": -1, + // SIX-PER-EM SPACE + "\u2007": -1, + // FIGURE SPACE + "\u2008": -1, + // PUNCTUATION SPACE + "\u2009": -1, + // THIN SPACE + "\u200A": -1, + // HAIR SPACE + "\u200B": -1, + // ZWS + "\u202F": -1, + // NARROW NBS + "\u205F": -1, + // MEDIUM MATHEMATICAL SPACE + "_": -1, + ",": -1, + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15, + "g": 16, + "h": 17, + "i": 18, + "j": 19, + "k": 20, + "l": 21, + "m": 22, + "n": 23, + "o": 24, + "p": 25, + "q": 26, + "r": 27, + "s": 28, + "t": 29, + "u": 30, + "v": 31, + "w": 32, + "x": 33, + "y": 34, + "z": 35 + }[s[i]]; + if (k !== -1) { + if (k === void 0) + return [value, s.substring(i)]; + if (k >= base) + return [value, s.substring(i)]; + value = value * base + k; + } + } + return [value, ""]; +} +function asFloat(expr) { + const num = expr.numericValue; + if (num === null) + return null; + if (typeof num === "number") + return num; + if (num instanceof decimal_default) + return num.toNumber(); + if (Array.isArray(num)) { + const [n, d] = num; + if (typeof n === "number" && typeof d === "number") + return n / d; + return Number(n) / Number(d); + } + /* @__PURE__ */ console.assert(!(num instanceof import_complex.default) || num.im !== 0); + return null; +} +function asBignum(expr) { + const num = expr.numericValue; + if (num === null) + return null; + if (num instanceof decimal_default) + return num; + if (typeof num === "number") + return expr.engine.bignum(num); + if (Array.isArray(num)) { + const [n, d] = num; + if (typeof n === "number" && typeof d === "number") + return expr.engine.bignum(n / d); + return expr.engine.bignum(n).div(d.toString()); + } + /* @__PURE__ */ console.assert(!(num instanceof import_complex.default) || num.im !== 0); + return null; +} +function asSmallInteger(expr) { + const num = expr.numericValue; + if (num === null) + return null; + if (typeof num === "number") { + if (Number.isInteger(num) && num >= -SMALL_INTEGER && num <= SMALL_INTEGER) + return num; + return null; + } + if (num instanceof decimal_default) { + if (num.isInteger()) { + const n = num.toNumber(); + if (n >= -SMALL_INTEGER && n <= SMALL_INTEGER) + return n; + } + return null; + } + if (expr.isCanonical) + return null; + const r = num; + if (Array.isArray(r)) { + const [n, d] = r; + let v; + if (typeof n === "number" && typeof d === "number") + v = n / d; + else + v = Number(n) / Number(d); + if (Number.isInteger(v) && v >= -SMALL_INTEGER && v <= SMALL_INTEGER) + return v; + return null; + } + return null; +} +function chop(n, tolerance) { + if (typeof n === "number" && Math.abs(n) <= tolerance) + return 0; + if (n instanceof decimal_default && n.abs().lte(tolerance)) + return 0; + if (n instanceof import_complex.default && Math.abs(n.re) <= tolerance && Math.abs(n.im) <= tolerance) + return 0; + return n; +} +function erf(x) { + const a1 = 0.254829592; + const a2 = -0.284496736; + const a3 = 1.421413741; + const a4 = -1.453152027; + const a5 = 1.061405429; + const p = 0.3275911; + const sign2 = x < 0 ? -1 : 1; + x = Math.abs(x); + const t = 1 / (1 + p * x); + const y = ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t; + return sign2 * (1 - y * Math.exp(-x * x)); +} +function bigint(a) { + var _a; + if (typeof a === "bigint") + return a; + if (a instanceof decimal_default) + return bigint(a.toString()); + let s = a.toString(); + const m = s.match(/([^\.]+)(?:\.([0-9]+))?e(.+)$/); + if (m) { + s = m[1] + ((_a = m[2]) != null ? _a : "") + "0".repeat(parseInt(m[3]) - (m[2] ? m[2].length : 0)); + } + return BigInt(s); +} +function gcd2(a, b) { + while (b !== BigInt(0)) + [a, b] = [b, a % b]; + return a < 0 ? -a : a; +} +var PRIME_WHEEL_INC = [ + BigInt(4), + BigInt(2), + BigInt(4), + BigInt(2), + BigInt(4), + BigInt(6), + BigInt(2), + BigInt(6) +]; +function primeFactors2(d) { + var _a, _b; + if (d < Number.MAX_SAFE_INTEGER) { + const factors = primeFactors(Number(d)); + const result2 = /* @__PURE__ */ new Map(); + for (const f of Object.keys(factors)) + result2.set(bigint(f), factors[f]); + return result2; + } + let n = d; + const result = /* @__PURE__ */ new Map(); + let count2 = 0; + let count3 = 0; + let count5 = 0; + let k = BigInt(10); + while (n % k === BigInt(0)) { + count2 += 1; + count5 += 1; + n = n / k; + } + k = BigInt(5); + while (n % k === BigInt(0)) { + count5 += 1; + n = n / k; + } + k = BigInt(3); + while (n % k === BigInt(0)) { + count3 += 1; + n = n / k; + } + k = BigInt(2); + while (n % k === BigInt(0)) { + count2 += 1; + n = n / k; + } + if (count2 > 0) + result.set("2", count2); + if (count3 > 0) + result.set("3", count3); + if (count5 > 0) + result.set("5", count5); + k = BigInt(7); + let kIndex = ""; + let i = 0; + while (k * k < n) { + if (n % k === BigInt(0)) { + if (!kIndex) + kIndex = k.toString(); + result.set(kIndex, ((_a = result.get(kIndex)) != null ? _a : 0) + 1); + n = n / k; + } else { + k = k + PRIME_WHEEL_INC[i]; + kIndex = ""; + i = i < 7 ? i + 1 : 0; + } + } + if (n !== BigInt(1)) + result.set(n.toString(), ((_b = result.get(n.toString())) != null ? _b : 0) + 1); + const r = /* @__PURE__ */ new Map(); + for (const [k2, v] of result) + r.set(bigint(k2), v); + return r; +} +function factorPower2(n, exponent) { + const factors = primeFactors2(n); + let f = BigInt(1); + let r = BigInt(1); + const exp2 = bigint(exponent); + for (const [k, v] of factors) { + const v2 = bigint(v); + f = f * k ** (v2 / exp2); + r = r * k ** (v2 % exp2); + } + return [f, r]; +} +function isLatexString(s) { + if (typeof s === "string") + return s.startsWith("$") && s.endsWith("$"); + return false; +} +function latexString(s) { + if (typeof s === "string" && s.startsWith("$") && s.endsWith("$")) + return s.slice(1, -1); + return null; +} +function getImaginaryCoef(expr) { + if (expr.symbol === "ImaginaryUnit") + return 1; + const z = expr.numericValue; + if (z !== null && z instanceof import_complex2.default && z.re === 0) + return z.im; + if (expr.head === "Negate") { + const v = getImaginaryCoef(expr.op1); + if (v === null) + return null; + return -v; + } + if (expr.head === "Multiply" && expr.nops === 2) { + if (expr.op1.symbol === "ImaginaryUnit") + return asFloat(expr.op2); + if (expr.op2.symbol === "ImaginaryUnit") + return asFloat(expr.op1); + } + return 0; +} +function getFreeVars(expr, set) { + if (expr.symbol) { + const def = expr.engine.lookupSymbol(expr.symbol); + if ((def == null ? void 0 : def.value) === void 0) + set.add(expr.symbol); + return; + } + if (!expr.ops && !expr.keys) + return; + if (expr.ops) + for (const op3 of expr.ops) + getFreeVars(op3, set); + if (expr.keys) + for (const key of expr.keys) + getFreeVars(expr.getKey(key), set); + return; +} +function getSymbols(expr, set) { + if (expr.symbol) { + set.add(expr.symbol); + return; + } + if (!expr.ops && !expr.keys) + return; + if (expr.ops) + for (const op3 of expr.ops) + getSymbols(op3, set); + if (expr.keys) + for (const key of expr.keys) + getSymbols(expr.getKey(key), set); + return; +} +function getSubexpressions(expr, head2) { + const result = !head2 || expr.head === head2 ? [expr] : []; + if (expr.ops) { + for (const op3 of expr.ops) + result.push(...getSubexpressions(op3, head2)); + } else if (expr.keys) { + for (const op3 of expr.keys) + result.push(...getSubexpressions(expr.getKey(op3), head2)); + } + return result; +} +function bignumPreferred(ce) { + return ce.numericMode === "bignum" || ce.numericMode === "auto"; +} +function complexAllowed(ce) { + return ce.numericMode === "auto" || ce.numericMode === "complex"; +} +function hashCode(s) { + let hash2 = 0; + for (let i = 0; i < s.length; i++) + hash2 = Math.imul(31, hash2) + s.charCodeAt(i) | 0; + return Math.abs(hash2); +} +function bigintValue(ce, expr) { + var _a; + if (expr === null || expr === void 0) + return null; + if (typeof expr === "number") + return Number.isInteger(expr) ? bigint(expr) : null; + if (isNumberExpression(expr)) { + const num = isNumberObject(expr) ? expr.num.toString() : expr; + let s = num.toLowerCase().replace(/[nd]$/g, "").replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); + if (/\([0-9]+\)/.test(s)) { + const [_, body, repeat, trail] = (_a = s.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; + s = body + repeat.repeat(Math.ceil(ce.precision / repeat.length)) + (trail != null ? trail : ""); + } + if (s === "nan") + return null; + if (s === "infinity" || s === "+infinity") + return null; + if (s === "-infinity") + return null; + if (s.includes(".")) + return null; + return bigint(s); + } + return null; +} +function asBigint(expr) { + const num = expr.numericValue; + if (num === null) + return null; + if (typeof num === "number" && Number.isInteger(num)) + return bigint(num); + if (num instanceof decimal_default && num.isInteger()) + return bigint(num); + return null; +} +function matchRules(expr, rules, sub2) { + const result = []; + for (const rule of rules) { + const r = applyRule(rule, expr, sub2); + if (r !== null) + result.push(r); + } + return result; +} +function boxRules(ce, rs) { + var _a; + const result = /* @__PURE__ */ new Set(); + for (const [rawLhs, rawRhs, options] of rs) { + let cond; + const latex = latexString(options == null ? void 0 : options.condition); + if (latex) { + const condPattern = ce.pattern(latex); + cond = (x) => { + var _a2; + return ((_a2 = condPattern.subs(x).value) == null ? void 0 : _a2.symbol) === "True"; + }; + } else + cond = options == null ? void 0 : options.condition; + result.add([ + ce.pattern(rawLhs), + ce.pattern(rawRhs), + (_a = options == null ? void 0 : options.priority) != null ? _a : 0, + cond + ]); + } + return result; +} +function applyRule([lhs, rhs, _priority, condition], expr, substitution, options) { + const sub2 = lhs.match(expr, { substitution, ...options }); + if (sub2 === null) + return null; + if (typeof condition === "function" && !condition(sub2)) + return null; + return rhs.subs(sub2, { canonical: true }); +} +function replace(expr, ruleSet, options) { + var _a, _b; + const iterationLimit = (_a = options == null ? void 0 : options.iterationLimit) != null ? _a : 1; + let iterationCount = 0; + const once = (_b = options == null ? void 0 : options.once) != null ? _b : false; + let done = false; + let atLeastOneRule = false; + try { + while (!done && iterationCount < iterationLimit) { + done = true; + for (const rule of ruleSet) { + const result = applyRule(rule, expr, {}, options); + if (result !== null && result !== expr) { + if (once) + return result; + done = false; + atLeastOneRule = true; + expr = result; + } + } + iterationCount += 1; + } + } catch (e) { + console.error(e); + } + return atLeastOneRule ? expr : null; +} +function getWildcardName(s) { + const m = s.match(/^(__?_?[a-zA-Z0-9]+)/); + if (m === null) + return ""; + return m[1]; +} +var import_complex3 = __toESM(require_complex()); +function totalDegree(expr) { + if (expr.head === "Power" && expr.op2.numericValue !== null) { + const deg = asSmallInteger(expr.op2); + if (deg !== null && deg > 0) + return deg; + return 1; + } + if (expr.head === "Multiply") { + let deg = 1; + for (const arg of expr.ops) { + const t = totalDegree(arg); + if (t > 1) + deg = deg + t; + } + return deg; + } + return 1; +} +function maxDegree(expr) { + if (expr.head === "Power" && expr.op2.numericValue !== null) { + const deg = asSmallInteger(expr.op2); + if (deg !== null && deg > 0) + return deg; + return 1; + } + if (expr.head === "Multiply") { + let deg = 1; + for (const arg of expr.ops) + deg = Math.max(deg, totalDegree(arg)); + return deg; + } + return 1; +} +function lex(expr) { + if (expr.symbol) + return expr.symbol; + if (expr.ops) { + const h = typeof expr.head === "string" ? expr.head : lex(expr.head); + return h + '"' + expr.ops.map((x) => lex(x)).filter((x) => x.length > 0).join('"'); + } + return ""; +} +var DEFAULT_COMPLEXITY = 1e5; +function sortAdd(ce, ops2) { + return ops2.sort((a, b) => { + const aLex = lex(a); + const bLex = lex(b); + if (!aLex && !bLex) + return order(a, b); + if (!aLex) + return 1; + if (!bLex) + return -1; + if (aLex < bLex) + return -1; + if (aLex > bLex) + return 1; + const aTotalDeg = totalDegree(a); + const bTotalDeg = totalDegree(b); + if (aTotalDeg !== bTotalDeg) + return bTotalDeg - aTotalDeg; + const aMaxDeg = maxDegree(a); + const bMaxDeg = maxDegree(b); + if (aMaxDeg !== bMaxDeg) + return aMaxDeg - bMaxDeg; + return order(a, b); + }); +} +function order(a, b) { + var _a, _b, _c, _d, _e, _f, _g, _h; + if (a === b) + return 0; + if (a.numericValue !== null && a.numericValue === b.numericValue) + return 0; + const af = asFloat(a); + if (af !== null) { + const bf = asFloat(b); + if (bf !== null) + return af - bf; + return -1; + } + if (a.numericValue instanceof import_complex3.default) { + if (b.numericValue instanceof import_complex3.default) { + if (a.numericValue.re === b.numericValue.re) { + if (Math.abs(a.numericValue.im) === Math.abs(b.numericValue.im)) { + return a.numericValue.im - b.numericValue.im; + } + return Math.abs(a.numericValue.im) - Math.abs(b.numericValue.im); + } + return a.numericValue.re - b.numericValue.re; + } + if (b.numericValue !== null) + return 1; + return -1; + } + if (a.numericValue) { + if (b.numericValue) { + return 1; + } + return -1; + } + if (a.head === "Sqrt" && a.op1.numericValue) { + if (b.head === "Sqrt" && b.op1.numericValue) + return order(a.op1, b.op1); + return -1; + } + if (a.symbol) { + if (b.symbol) { + if (a.symbol === b.symbol) + return 0; + return a.symbol > b.symbol ? 1 : -1; + } + if (b.numericValue !== null) + return 1; + return -1; + } + if (a.ops) { + if (b.ops) { + const aComplexity = (_b = (_a = a.functionDefinition) == null ? void 0 : _a.complexity) != null ? _b : DEFAULT_COMPLEXITY; + const bComplexity = (_d = (_c = b.functionDefinition) == null ? void 0 : _c.complexity) != null ? _d : DEFAULT_COMPLEXITY; + if (aComplexity === bComplexity) { + if (typeof a.head === "string" && typeof b.head === "string") { + if (a.head === b.head) { + return getLeafCount(a) - getLeafCount(b); + } + if (a.head < b.head) + return 1; + return -1; + } + return getLeafCount(a) - getLeafCount(b); + } + return aComplexity - bComplexity; + } + if (b.numericValue !== null || b.symbol) + return 1; + return -1; + } + if (a.string) { + if (b.string) { + if (a.string.length !== b.string.length) + return b.string.length - a.string.length; + if (b.string < a.string) + return -1; + if (a.string > b.string) + return 1; + return 0; + } + if (b.keys) + return -1; + return 1; + } + if (a.keys && b.keys) { + if (a.keysCount !== b.keysCount) + return b.keysCount - a.keysCount; + let bComplexity = 0; + let aComplexity = 0; + for (const key of b.keys) + bComplexity += (_e = b.getKey(key).complexity) != null ? _e : DEFAULT_COMPLEXITY; + for (const key of a.keys) + aComplexity += (_f = a.getKey(key).complexity) != null ? _f : DEFAULT_COMPLEXITY; + return aComplexity - bComplexity; + } + return ((_g = a.complexity) != null ? _g : DEFAULT_COMPLEXITY) - ((_h = b.complexity) != null ? _h : DEFAULT_COMPLEXITY); +} +function getLeafCount(expr) { + if (expr.keys !== null) + return 1 + expr.keysCount; + if (!expr.ops) + return 1; + return (typeof expr.head === "string" ? 1 : getLeafCount(expr.head)) + [...expr.ops].reduce((acc, x) => acc + getLeafCount(x), 0); +} +function flattenOps(ops2, head2) { + if (!head2) + return ops2; + if (ops2.every((x) => !x.ops || x.head !== head2)) + return ops2; + const result = []; + for (const arg of ops2) { + if (!arg.ops || arg.head !== head2) + result.push(arg); + else { + result.push(...flattenOps(arg.ops, head2)); + } + } + /* @__PURE__ */ console.assert(result.length !== ops2.length); + if (result.length === ops2.length) + return ops2; + return result; +} +function flattenSequence(xs) { + if (xs.every((x) => x.head !== "Sequence")) + return xs; + const ys = []; + for (const x of xs) { + if (x.isValid && x.head === "Sequence") { + if (x.ops) + ys.push(...x.ops); + } else + ys.push(x); + } + return ys; +} +function canonical(xs) { + return xs.every((x) => x.isCanonical) ? xs : xs.map((x) => x.canonical); +} +var import_complex4 = __toESM(require_complex()); +function isRational(x) { + return x !== null && Array.isArray(x); +} +function isMachineRational(x) { + return x !== null && Array.isArray(x) && typeof x[0] === "number"; +} +function isBigRational(x) { + return x !== null && Array.isArray(x) && typeof x[0] === "bigint"; +} +function isRationalZero(x) { + return x[0] == 0; +} +function isRationalOne(x) { + return x[0] === x[1]; +} +function isRationalNegativeOne(x) { + return x[0] === -x[1]; +} +function machineNumerator(x) { + return Number(x[0]); +} +function machineDenominator(x) { + return Number(x[1]); +} +function isNeg(x) { + return x[0] < 0; +} +function neg(x) { + return [-x[0], x[1]]; +} +function inverse(x) { + return x[0] < 0 ? [-x[1], -x[0]] : [x[1], x[0]]; +} +function asRational(expr) { + const num = expr.numericValue; + if (num === null) + return void 0; + if (Array.isArray(num)) + return num; + if (typeof num === "number" && Number.isInteger(num)) + return [num, 1]; + if (num instanceof decimal_default && num.isInteger()) + return [bigint(num), BigInt(1)]; + return void 0; +} +function asMachineRational(r) { + return [Number(r[0]), Number(r[1])]; +} +function add2(lhs, rhs) { + /* @__PURE__ */ console.assert( + Array.isArray(rhs) || rhs.numericValue !== null && !(rhs instanceof import_complex4.default) + ); + if (typeof lhs[0] === "number" && !Number.isFinite(lhs[0])) + return lhs; + const rhsNum = Array.isArray(rhs) ? rhs : rhs.numericValue; + if (rhsNum === null) + return lhs; + if (Array.isArray(rhsNum)) { + if (isBigRational(rhsNum)) { + lhs = [bigint(lhs[0]), bigint(lhs[1])]; + return [rhsNum[1] * lhs[0] + rhsNum[0] * lhs[1], rhsNum[1] * lhs[1]]; + } + if (!Number.isFinite(rhsNum[0])) + return rhsNum; + if (isBigRational(lhs)) { + const bigRhs = [bigint(rhsNum[0]), bigint(rhsNum[1])]; + return [bigRhs[1] * lhs[0] + bigRhs[0] * lhs[1], bigRhs[1] * lhs[1]]; + } + return [rhsNum[1] * lhs[0] + rhsNum[0] * lhs[1], rhsNum[1] * lhs[1]]; + } + if (rhsNum instanceof decimal_default) { + if (rhsNum.isNaN()) + return [Number.NaN, 1]; + if (!rhsNum.isFinite()) + return [rhsNum.isNegative() ? -Infinity : Infinity, 1]; + /* @__PURE__ */ console.assert(rhsNum.isInteger()); + if (isMachineRational(lhs)) + lhs = [bigint(lhs[0]), bigint(lhs[1])]; + return [lhs[0] + lhs[1] * bigint(rhsNum.toString()), lhs[1]]; + } + if (rhsNum instanceof import_complex4.default) + return [Number.NaN, 1]; + /* @__PURE__ */ console.assert(!Number.isFinite(rhsNum) || Number.isInteger(rhsNum)); + if (!Number.isFinite(rhsNum)) + return [rhsNum, 1]; + if (isMachineRational(lhs)) + return [lhs[0] + lhs[1] * rhsNum, lhs[1]]; + return [lhs[0] + lhs[1] * bigint(rhsNum), lhs[1]]; +} +function mul2(lhs, rhs) { + /* @__PURE__ */ console.assert( + Array.isArray(rhs) || rhs.numericValue !== null && !(rhs instanceof import_complex4.default) + ); + if (Array.isArray(rhs)) { + if (isMachineRational(lhs) && isMachineRational(rhs)) + return [lhs[0] * rhs[0], lhs[1] * rhs[1]]; + if (isMachineRational(lhs)) + lhs = [bigint(lhs[0]), bigint(lhs[1])]; + if (isMachineRational(rhs)) + rhs = [bigint(rhs[0]), bigint(rhs[1])]; + return [lhs[0] * rhs[0], lhs[1] * rhs[1]]; + } + const rhsNum = rhs.numericValue; + if (rhsNum !== null && typeof rhsNum === "number") { + /* @__PURE__ */ console.assert(Number.isInteger(rhsNum)); + if (isMachineRational(lhs)) + return [lhs[0] * rhsNum, lhs[1]]; + return [lhs[0] * bigint(rhsNum), lhs[1]]; + } + if (rhsNum instanceof decimal_default) { + /* @__PURE__ */ console.assert(rhsNum.isInteger()); + if (isMachineRational(lhs)) + return [bigint(rhsNum.toString()) * bigint(lhs[0]), bigint(lhs[1])]; + return [bigint(rhsNum.toString()) * lhs[0], lhs[1]]; + } + if (Array.isArray(rhsNum)) { + if (isBigRational(rhsNum)) + return [rhsNum[0] * bigint(lhs[0]), rhsNum[1] * bigint(lhs[1])]; + else if (isMachineRational(lhs)) + return [lhs[0] * rhsNum[0], lhs[1] * rhsNum[1]]; + return [lhs[0] * bigint(rhsNum[0]), lhs[1] * bigint(rhsNum[1])]; + } + return lhs; +} +function pow2(r, exp2) { + /* @__PURE__ */ console.assert(Number.isInteger(exp2)); + if (exp2 === 0) + return [1, 1]; + if (exp2 < 0) { + r = inverse(r); + exp2 = -exp2; + } + if (exp2 === 1) + return r; + if (isMachineRational(r)) + return [Math.pow(r[0], exp2), Math.pow(r[1], exp2)]; + const bigexp = bigint(exp2); + return [r[0] ** bigexp, r[1] ** bigexp]; +} +function reducedRational(r) { + if (isMachineRational(r)) { + if (r[0] === 1 || r[1] === 1) + return r; + if (r[1] < 0) + r = [-r[0], -r[1]]; + if (!Number.isFinite(r[1])) + return [0, 1]; + const g2 = gcd(r[0], r[1]); + return g2 <= 1 ? r : [r[0] / g2, r[1] / g2]; + } + if (r[0] === BigInt(1) || r[1] === BigInt(1)) + return r; + if (r[1] < 0) + r = [-r[0], -r[1]]; + const g = gcd2(r[0], r[1]); + if (g <= 1) + return r; + return [r[0] / g, r[1] / g]; +} +function rationalize(x) { + if (!Number.isFinite(x)) + return x; + const fractional = x % 1; + if (fractional === 0) + return x; + const eps = 1e-15; + let a = Math.floor(x); + let h1 = 1; + let k1 = 0; + let h = a; + let k = 1; + while (x - a > eps * k * k) { + x = 1 / (x - a); + a = Math.floor(x); + const h2 = h1; + h1 = h; + const k2 = k1; + k1 = k; + h = h2 + a * h1; + k = k2 + a * k1; + } + return [h, k]; +} +function asCoefficient(expr) { + /* @__PURE__ */ console.assert(expr.isCanonical); + const ce = expr.engine; + if (expr.head === "Multiply") { + const rest = []; + let coef = [1, 1]; + for (const arg of expr.ops) { + const n2 = arg.numericValue; + if (n2 !== null && (typeof n2 === "number" && Number.isInteger(n2) || n2 instanceof decimal_default && n2.isInteger() || isRational(n2))) + coef = mul2(coef, arg); + else + rest.push(arg); + } + coef = reducedRational(coef); + if (isRationalOne(coef)) + return [[1, 1], expr]; + if (rest.length === 0) + return [coef, ce._ONE]; + if (rest.length === 1) + return [coef, rest[0]]; + return [coef, ce.mul(rest)]; + } + if (expr.head === "Divide") { + let [coef1, numer] = asCoefficient(expr.op1); + const [coef2, denom] = asCoefficient(expr.op2); + const coef = reducedRational(mul2(coef1, inverse(coef2))); + if (denom.isOne) + return [coef, numer]; + return [coef, ce.div(numer, denom)]; + } + if (expr.head === "Power") { + if (expr.op2.numericValue === null) + return [[1, 1], expr]; + let [coef, base] = asCoefficient(expr.op1); + if (isRationalOne(coef)) + return [[1, 1], expr]; + const exponent = expr.op2; + const e = asSmallInteger(exponent); + if (e === -1) + return [inverse(coef), ce.inv(base)]; + if (e !== null) + return [pow2(coef, e), ce.pow(base, exponent)]; + if (exponent.numericValue !== null && Array.isArray(exponent.numericValue)) { + const [en, ed] = asMachineRational(exponent.numericValue); + const [numer, denom] = asMachineRational(coef); + if (numer > 0 && Math.abs(en) === 1) { + const [nCoef, nRest] = factorPower(numer, ed); + const [dCoef, dRest] = factorPower(denom, ed); + if (nCoef === 1 && dCoef === 1) + return [[1, 1], expr]; + return [ + en === 1 ? [nCoef, dCoef] : [dCoef, nCoef], + ce.pow(ce.mul([ce.number([nRest, dRest]), base]), exponent) + ]; + } + } + return [[1, 1], expr]; + } + if (expr.head === "Add") { + } + if (expr.head === "Negate") { + const [coef, rest] = asCoefficient(expr.op1); + return [neg(coef), rest]; + } + const n = expr.numericValue; + if (n !== null) { + if (n instanceof decimal_default) { + if (n.isInteger()) + return [[bigint(n.toString()), BigInt(1)], ce._ONE]; + if (n.isNegative()) + return [[-1, 1], ce.number(n.neg())]; + } + if (typeof n === "number") { + if (Number.isInteger(n)) + return [[n, 1], ce._ONE]; + if (n < 0) + return [[-1, 1], ce.number(-n)]; + } + if (isRational(n)) + return [n, ce._ONE]; + if (n instanceof import_complex4.default && n.re < 0) + return [[-1, 1], ce.number(ce.complex(-n.re, -n.im))]; + } + return [[1, 1], expr]; +} +function signDiff(lhs, rhs, tolerance) { + if (lhs === rhs) + return 0; + const lhsN = lhs.N(); + const rhsN = rhs.N(); + const lhsNum = lhsN.numericValue; + const rhsNum = rhsN.numericValue; + if (lhsNum === null || rhsNum === null) { + const lhsS = lhs.sgn; + const rhsS = rhs.sgn; + if (typeof lhsS !== "number" || typeof rhsS !== "number") + return void 0; + if (lhsS === 0 && rhsS === 0) + return 0; + if (lhsS < 0 && rhsS > 0) + return -1; + if (lhsS > 0 && rhsS < 0) + return 1; + return void 0; + } + tolerance != null ? tolerance : tolerance = lhs.engine.tolerance; + if (lhsNum instanceof import_complex4.default && rhsNum instanceof import_complex4.default) + return chop(lhsNum.re - rhsNum.re, tolerance) === 0 && chop(lhsNum.im - rhsNum.im, tolerance) === 0 ? 0 : void 0; + if (lhsNum instanceof import_complex4.default || rhsNum instanceof import_complex4.default) + return void 0; + if (isRational(lhsNum) || isRational(rhsNum)) + return void 0; + if (typeof lhsNum === "number" && typeof rhsNum === "number") { + if (chop(rhsNum - lhsNum, tolerance) === 0) + return 0; + return lhsNum < rhsNum ? -1 : 1; + } + const ce = lhs.engine; + const delta = ce.bignum(rhsNum).sub(ce.bignum(lhsNum)); + if (chop(delta, tolerance) === 0) + return 0; + return delta.isPos() ? 1 : -1; +} +var import_complex5 = __toESM(require_complex()); +var Sum = class { + constructor(ce, xs, options) { + this._isCanonical = true; + this._imaginary = 0; + this._posInfinityCount = 0; + this._negInfinityCount = 0; + this._naNCount = 0; + this._terms = []; + options != null ? options : options = {}; + if (!("canonical" in options)) + this._isCanonical = true; + else + this._isCanonical = options.canonical; + this.engine = ce; + this._rational = bignumPreferred(ce) ? [BigInt(0), BigInt(1)] : [0, 1]; + this._bignum = ce._BIGNUM_ZERO; + this._number = 0; + if (xs) + for (const x of xs) + this.addTerm(x); + } + get isEmpty() { + if (!this._isCanonical) + return this._terms.length === 0; + return this._terms.length === 0 && isRationalZero(this._rational) && this._imaginary === 0 && this._number === 0 && this._bignum.isZero() && this._negInfinityCount === 0 && this._posInfinityCount === 0 && this._naNCount === 0; + } + /** + * Add a term to the sum. + * + * A term is a rational coefficient and an expression. + * Optionally, the term is multiplied by the constant `c` before being added. + * + * If the sum already has this term, the coefficient is added + * to the previous one. Otherwise, a new entry is added. + * + * E.g. "2x + x + 1/5 y" + * -> [['x', [3, 1]], ['y', [1, 5]]] + */ + addTerm(term, c) { + if (term.isNothing) + return; + if (term.isNaN || term.isImaginary && !complexAllowed(this.engine)) { + this._naNCount += 1; + return; + } + if (this._isCanonical) { + if (term.numericValue !== null) { + if (term.isInfinity) { + if (term.isPositive) + this._posInfinityCount += 1; + else + this._negInfinityCount += 1; + return; + } + const r = asRational(term); + if (r) { + this._rational = add2(this._rational, c === void 0 ? r : mul2(r, c)); + return; + } + const num = term.numericValue; + if (num !== null && typeof num === "number") { + /* @__PURE__ */ console.assert(!Number.isInteger(num)); + if (bignumPreferred(this.engine)) + this._bignum = this._bignum.add(num); + else + this._number += num; + return; + } + if (num !== null && num instanceof decimal_default) { + /* @__PURE__ */ console.assert(!num.isInteger()); + this._bignum = this._bignum.add(num); + return; + } + if (num !== null && num instanceof import_complex5.default) { + let re = num.re; + let im = num.im; + if (Number.isInteger(re)) { + this._rational = add2(this._rational, mul2([re, 1], c != null ? c : [1, 1])); + re = 0; + } else { + if (bignumPreferred(this.engine)) + this._bignum = this._bignum.add(re); + else + this._number += re; + re = 0; + } + if (Number.isInteger(im)) { + if (c === void 0) + this._imaginary += im; + else if (isMachineRational(c)) + this._imaginary += im * c[0] / c[1]; + else + this._imaginary += this.engine.bignum(c[0]).mul(im).div(this.engine.bignum(c[1])).toNumber(); + im = 0; + } + if (re === 0 && im === 0) + return; + term = this.engine.number(this.engine.complex(re, im)); + } + } + } + let coef; + [coef, term] = asCoefficient(term); + if (isRationalZero(coef)) + return; + if (c !== void 0) + coef = mul2(coef, c); + if (term.head === "Negate") { + this.addTerm(term.op1, neg(coef)); + return; + } + if (term.head === "Add") { + for (const x of term.ops) + this.addTerm(x, coef); + return; + } + let hasTerm = false; + if (term.numericValue === null) { + if (this._terms.length > 500) { + const h = term.hash; + for (let i = 0; i < this._terms.length; i++) { + if (this._terms[i].term.numericValue === null && h === this._terms[i].term.hash && term.isSame(this._terms[i].term)) { + this._terms[i].coef = add2(this._terms[i].coef, coef); + hasTerm = true; + break; + } + } + } else { + for (let i = 0; i < this._terms.length; i++) { + if (this._terms[i].term.numericValue === null && term.isSame(this._terms[i].term)) { + this._terms[i].coef = add2(this._terms[i].coef, coef); + hasTerm = true; + break; + } + } + } + } + if (!hasTerm) + this._terms.push({ term, coef }); + } + // For debugging + toString() { + const xs = this.terms("expression"); + if (xs.length === 0) + return "0"; + return xs.map((x) => x.toString()).join("\\n"); + } + terms(mode) { + const ce = this.engine; + if (this._naNCount > 0) + return [ce._NAN]; + if (this._imaginary !== 0 && !complexAllowed(ce)) + return [ce._NAN]; + if (this._posInfinityCount > 0 && this._negInfinityCount > 0) + return [ce._NAN]; + if (this._posInfinityCount > 0) + return [ce._POSITIVE_INFINITY]; + if (this._negInfinityCount > 0) + return [ce._NEGATIVE_INFINITY]; + const xs = []; + for (const { coef, term } of this._terms) { + if (!isRationalZero(coef)) { + if (isRationalOne(coef)) + xs.push(term); + else if (isRationalNegativeOne(coef)) + xs.push(ce.neg(term)); + else if (machineDenominator(coef) === 1) + xs.push(ce.mul([ce.number(coef[0]), term])); + else if (machineNumerator(coef) === 1) + xs.push(ce.div(term, ce.number(coef[1]))); + else + xs.push(ce.mul([ce.number(coef), term])); + } + } + if (mode === "numeric") { + if (bignumPreferred(this.engine)) { + let sum2 = this._bignum.add(this._number); + if (!isRationalZero(this._rational)) + sum2 = sum2.add( + ce.bignum(this._rational[0]).div(ce.bignum(this._rational[1])) + ); + if (this._imaginary !== 0) + xs.push(ce.number(ce.complex(sum2.toNumber(), this._imaginary))); + else if (!sum2.isZero()) + xs.push(ce.number(sum2)); + } else { + let sum2 = this._bignum.toNumber() + this._number; + if (!isRationalZero(this._rational)) + sum2 += machineNumerator(this._rational) / machineDenominator(this._rational); + if (this._imaginary !== 0) + xs.push(ce.number(ce.complex(sum2, this._imaginary))); + else if (sum2 !== 0) + xs.push(ce.number(sum2)); + } + } else { + if (!isRationalZero(this._rational)) + xs.push(ce.number(this._rational)); + if (this._imaginary !== 0) { + if (!complexAllowed(ce)) + return [ce._NAN]; + xs.push(ce.number(ce.complex(0, this._imaginary))); + } + if (bignumPreferred(this.engine)) { + const sum2 = this._bignum.add(this._number); + if (!sum2.isZero()) + xs.push(ce.number(sum2)); + } else { + if (!this._bignum.isZero()) + xs.push(ce.number(this._bignum)); + if (this._number !== 0) + xs.push(ce.number(this._number)); + } + } + return flattenOps(xs, "Add"); + } + asExpression(mode) { + const ce = this.engine; + const xs = this.terms(mode); + if (xs.length === 0) + return ce._ZERO; + if (xs.length === 1) + return xs[0]; + return ce._fn("Add", sortAdd(ce, xs)); + } +}; +var DOMAIN_CONSTRUCTORS = [ + "InvalidDomain", + "Dictionary", + "Function", + "List", + "Tuple", + "Intersection", + "Union", + "Maybe", + "Sequence", + "Interval", + "Range", + "Head", + "Symbol", + "Value" +]; +var DOMAIN_ALIAS = { + // Function: ['Function', ['Sequence', 'Anything'], 'Anything'], + NumericFunction: ["Function", ["Sequence", "Number"], "Number"], + RealFunction: [ + "Function", + ["Sequence", "ExtendedRealNumber"], + "ExtendedRealNumber" + ], + TrigonometricFunction: ["Function", "Number", "Number"], + // HyperbolicFunction: ['Function', 'Number', 'Number'], + LogicOperator: [ + "Function", + "MaybeBoolean", + ["Maybe", "MaybeBoolean"], + "MaybeBoolean" + ], + Predicate: ["Function", ["Sequence", "Anything"], "MaybeBoolean"], + RelationalOperator: ["Function", "Anything", "Anything", "MaybeBoolean"] + // PositiveInteger: ['Range', 1, +Infinity], + // NonNegativeInteger: ['Range', 0, +Infinity], + // NegativeInteger: ['Range', -Infinity, -1], + // NonPositiveInteger: ['Range', -Infinity, 0], + // PositiveNumber: ['Interval', ['Open', 0], +Infinity], + // NonNegativeNumber: ['Interval', 0, +Infinity], + // NegativeNumber: ['Interval', -Infinity, ['Open', 0]], + // NonPositiveNumber: ['Interval', -Infinity, 0], +}; +var DOMAIN_LITERAL = { + Anything: [], + Value: "Anything", + Domain: "Anything", + DomainExpression: "Domain", + Void: "Nothing", + Nothing: [ + "DomainExpression", + "Boolean", + "String", + "Symbol", + "Tuple", + "List", + "Dictionary", + "InfiniteSet", + "FiniteSet", + "ImaginaryNumber", + "TranscendentalNumber", + "PositiveInteger", + "NegativeInteger", + "NonPositiveInteger", + "NonNegativeInteger", + "PositiveNumber", + "NegativeNumber", + "NonPositiveNumber", + "NonNegativeNumber", + "Scalar", + "TrigonometricFunction", + "LogicOperator", + "RelationalOperator" + ], + MaybeBoolean: "Value", + Boolean: "MaybeBoolean", + String: "Boolean", + Symbol: "Boolean", + Collection: "Value", + List: "Collection", + Dictionary: "Collection", + Sequence: "Collection", + Tuple: "Sequence", + Set: "Collection", + InfiniteSet: "Set", + FiniteSet: "Set", + // + // Functional Domains + // + Function: "Anything", + Predicate: "Function", + LogicOperator: "Predicate", + RelationalOperator: "Predicate", + // https://en.wikipedia.org/wiki/List_of_mathematical_functions + NumericFunction: "Function", + RealFunction: "NumericFunction", + TrigonometricFunction: "RealFunction", + // + // Numeric Domains + // + // https://en.wikipedia.org/wiki/Category_of_sets + Number: "Value", + ExtendedComplexNumber: "Number", + ComplexNumber: "ExtendedComplexNumber", + ImaginaryNumber: "ComplexNumber", + ExtendedRealNumber: "ExtendedComplexNumber", + RealNumber: ["ComplexNumber", "ExtendedRealNumber"], + PositiveNumber: "NonNegativeNumber", + NonNegativeNumber: "RealNumber", + NonPositiveNumber: "NegativeNumber", + NegativeNumber: "RealNumber", + TranscendentalNumber: "RealNumber", + AlgebraicNumber: "RealNumber", + RationalNumber: "AlgebraicNumber", + // NaturalNumber: 'Integer', + Integer: "RationalNumber", + PositiveInteger: "NonNegativeInteger", + NonNegativeInteger: "Integer", + NonPositiveInteger: "NegativeInteger", + NegativeInteger: "Integer", + // + // Tensorial Domains + // + Tensor: "Value", + Matrix: "Tensor", + Scalar: ["Row", "Column"], + Row: "Vector", + Column: "Vector", + Vector: "Matrix" + // https://en.wikipedia.org/wiki/List_of_named_matrices + // ComplexTensor: 'Tensor', + // RealTensor: 'ComplexTensor', + // IntegerTensor: 'RealTensor', + // LogicalTensor: 'IntegerTensor', + // SquareMatrix: 'Matrix', + // MonomialMatrix: 'SquareMatrix', + // TriangularMatrix: 'SquareMatrix', + // UpperTriangularMatrix: 'TriangularMatrix', + // LowerTriangularMatrix: 'TriangularMatrix', + // PermutationMatrix: ['MonomialMatrix', 'LogicalTensor', 'OrthogonalMatrix'], + // OrthogonalMatrix: ['SquareMatrix', 'RealTensor'], + // DiagonalMatrix: ['UpperTriangularMatrix', 'LowerTriangularMatrix'], + // IdentityMatrix: ['DiagonalMatrix', 'SymmetricMatrix', 'PermutationMatrix'], + // ZeroMatrix: ['DiagonalMatrix', 'SymmetricMatrix', 'PermutationMatrix'], + // SymmetricMatrix: ['HermitianMatrix', 'SquareMatrix', 'RealTensor'], + // HermitianMatrix: 'ComplexTensor', + // Quaternion: ['SquareMatrix', 'ComplexTensor'], +}; +var gDomainLiterals; +function isDomainLiteral(s) { + if (!s) + return false; + return DOMAIN_LITERAL[s] !== void 0; +} +function ancestors(dom) { + if (!gDomainLiterals) { + gDomainLiterals = {}; + ancestors("Void"); + } + if (gDomainLiterals[dom]) + return Array.from(gDomainLiterals[dom]); + let result = []; + if (typeof dom !== "string" || !DOMAIN_LITERAL[dom]) { + if (!Array.isArray(dom)) + throw Error(`Unknown domain literal ${dom}`); + if (!DOMAIN_CONSTRUCTORS.includes(dom[0])) + throw Error(`Unknown domain constructor ${dom[0]}`); + if (dom[0] === "Function" || dom[0] === "Head") + return ancestors("Function"); + if (dom[0] === "Symbol") + return ancestors("Symbol"); + if (dom[0] === "Tuple") + return ancestors("Tuple"); + if (dom[0] === "List") + return ancestors("List"); + if (dom[0] === "Dictionary") + return ancestors("Dictionary"); + if (dom[0] === "Range") + return ancestors("Integer"); + if (dom[0] === "Interval") + return ancestors("RealNumberExtended"); + if (dom[0] === "Maybe" || dom[0] === "Sequence") + return ancestors(dom[1]); + if (dom[0] === "Literal") + return ["Anything"]; + if (dom[0] === "Union") + return ["Anything"]; + if (dom[0] === "Intersection") + return ["Anything"]; + return ["Anything"]; + } + if (typeof DOMAIN_LITERAL[dom] === "string") + result = [DOMAIN_LITERAL[dom], ...ancestors(DOMAIN_LITERAL[dom])]; + else if (Array.isArray(DOMAIN_LITERAL[dom])) + for (const parent of DOMAIN_LITERAL[dom]) { + result.push(parent); + result.push(...ancestors(parent)); + } + gDomainLiterals[dom] = new Set(result); + return result; +} +function domainSetsLibrary() { + const table = {}; + for (const dom of Object.keys(DOMAIN_LITERAL)) { + if (dom !== "Domain" && dom !== "Nothing" && dom !== "String" && dom !== "Symbol" && dom !== "List" && dom !== "Tuple" && dom !== "Sequence") + table[dom] = { domain: "Set" }; + } + return table; +} +var import_complex6 = __toESM(require_complex()); +function isSymbolDefinition(def) { + return !!def && typeof def === "object" && ("domain" in def || "value" in def || "constant" in def); +} +function isFunctionDefinition(def) { + if (def === void 0 || def === null) + return false; + if (typeof def !== "object") + return false; + if ("complexity" in def || "numeric" in def || "signature" in def) + return true; + if (!("domain" in def)) + return false; + if (def.domain === void 0) + return false; + if (typeof def.domain === "string") + return def.domain === "Function"; + return def.domain.isFunction; +} +function normalizeLimits(range) { + var _a, _b; + let lower = 1; + let upper = lower + MAX_ITERATION; + let index = "Nothing"; + let isFinite2 = true; + if (range.head === "Tuple" || range.head === "Triple" || range.head === "Pair" || range.head === "Single") { + index = (_a = range.op1.head === "Hold" ? range.op1.op1.symbol : range.op1.symbol) != null ? _a : "Nothing"; + lower = (_b = asSmallInteger(range.op2)) != null ? _b : 1; + if (!Number.isFinite(lower)) + isFinite2 = false; + if (range.op3.isNothing || range.op3.isInfinity) { + isFinite2 = false; + } else { + const u = asSmallInteger(range.op3); + if (u === null) + isFinite2 = false; + else { + upper = u; + if (!Number.isFinite(upper)) + isFinite2 = false; + } + } + if (!isFinite2 && Number.isFinite(lower)) + upper = lower + MAX_ITERATION; + } + return [index, lower, upper, isFinite2]; +} +var ComputeEngineFunction = class extends Function { + constructor(body) { + super("_SYS", "_", `return ${body}`); + this.sys = { + factorial, + gamma, + lngamma, + gcd, + lcm, + chop + }; + return new Proxy(this, { + apply: (target, thisArg, argumentsList) => super.apply(thisArg, [this.sys, ...argumentsList]), + get: (target, prop) => { + if (prop === "toString") + return () => body; + return target[prop]; + } + }); + } +}; +function compileToJavascript(expr) { + const js = compile(expr, expr.freeVars); + try { + return new ComputeEngineFunction(js); + } catch (e) { + console.error(`${e} +${expr.latex} +${js}`); + } + return void 0; +} +function compile(expr, freeVars = [], prec = 0) { + var _a; + const f = asFloat(expr); + if (f !== null) + return f.toString(); + const s = expr.symbol; + if (s !== null) { + const result = { + True: "true", + False: "false", + Pi: "Math.PI", + ExponentialE: "Math.E", + I: "Math.I", + NaN: "Number.NaN", + ImaginaryUnit: "NaN", + Half: "0.5", + MachineEpsilon: "Number.EPSILON", + GoldenRatio: "((1 + Math.sqrt(5)) / 2)", + CatalanConstant: "0.91596559417721901", + EulerGamma: "0.57721566490153286" + }[s]; + if (result !== void 0) + return result; + if (freeVars.includes(s)) + return `_.${s}`; + return s; + } + const str = expr.string; + if (str !== null) + return JSON.stringify(str); + const keys = expr.keys; + if (keys !== null) { + const result = []; + for (const key of keys) { + const value = expr.getKey(key); + if (value) + result.push(`${key}: ${compile(value, freeVars, 0)}`); + } + return `{${result.join(", ")}}`; + } + const h = expr.head; + if (typeof h === "string") { + if (h === "Negate") { + const arg = expr.op1; + if (arg === null) + return ""; + return `-${compile(arg, freeVars, 3)}`; + } + if (h === "Error") + throw new Error("Error"); + if (h === "Sum") + return compileLoop(expr, "+"); + if (h === "Product") + return compileLoop(expr, "*"); + if (h === "Root") { + const arg = expr.op1; + if (arg === null) + throw new Error("Root: no argument"); + const exp2 = expr.op2; + if (exp2 === null) + return `Math.sqrt(${compile(arg, freeVars, 0)})`; + return `Math.pow(${compile(arg, freeVars)}, 1/${compile(exp2, freeVars)}`; + } + if (h === "Factorial") { + const arg = expr.op1; + if (arg === null) + throw new Error("Factorial: no argument"); + return `_SYS.factorial(${compile(arg, freeVars)})`; + } + if (h === "Power") { + const arg = expr.op1; + if (arg === null) + throw new Error("Power: no argument"); + const exp2 = asFloat(expr.op2); + if (exp2 === 0.5) + return `Math.sqrt(${compile(arg, freeVars)})`; + if (exp2 === 1 / 3) + return `Math.cbrt(${compile(arg, freeVars)})`; + if (exp2 === 1) + return compile(arg, freeVars); + if (exp2 === -1) + return `1 / ${compile(arg, freeVars)}`; + if (exp2 === -0.5) + return `1 / Math.sqrt(${compile(arg, freeVars)})`; + } + if (h === "Square") { + const arg = expr.op1; + if (arg === null) + throw new Error("Square: no argument"); + return `Math.pow(${compile(arg, freeVars)}, 2)`; + } + const OPS = { + Add: ["+", 11], + Negate: ["-", 14], + // Unary operator + Subtract: ["-", 11], + Multiply: ["*", 12], + Divide: ["/", 13], + Equal: ["===", 8], + NotEqual: ["!==", 8], + LessEqual: ["<=", 9], + GreaterEqual: [">=", 9], + Less: ["<", 9], + Greater: [">", 9], + And: ["&&", 4], + Or: ["||", 3], + Not: ["!", 14] + // Unary operator + // Xor: ['^', 6], // That's bitwise XOR, not logical XOR + // Possible solution is to use `a ? !b : b` instead of `a ^ b` + }; + const op3 = OPS[h]; + if (op3 !== void 0) { + const args2 = expr.ops; + if (args2 === null) + return ""; + let resultStr; + if (args2.length === 1) { + resultStr = `${op3[0]}${compile(args2[0], freeVars, op3[1])}`; + } else { + resultStr = args2.map((arg) => compile(arg, freeVars, op3[1])).join(` ${op3[0]} `); + } + return op3[1] < prec ? `(${resultStr})` : resultStr; + } + const fn = (_a = { + Abs: "Math.abs", + Arccos: "Math.acos", + Arcosh: "Math.acosh", + Arsin: "Math.asin", + Arsinh: "Math.asinh", + Arctan: "Math.atan", + Artanh: "Math.atanh", + // Math.cbrt + Ceiling: "Math.ceil", + Chop: "_SYS.chop", + Cos: "Math.cos", + Cosh: "Math.cosh", + Exp: "Math.exp", + Floor: "Math.floor", + Gamma: "_SYS.gamma", + Gcd: "_SYS.gcd", + // Math.hypot + Lcm: "_SYS.lcm", + Ln: "Math.log", + Log: "Math.log10", + LogGamma: "_SYS.lngamma", + Lb: "Math.log2", + Max: "Math.max", + Min: "Math.min", + Power: "Math.pow", + Random: "Math.random", + Round: "Math.round", + Sgn: "Math.sign", + Sin: "Math.sin", + Sinh: "Math.sinh", + Sqrt: "Math.sqrt", + Tan: "Math.tan", + Tanh: "Math.tanh" + // Factorial: 'factorial', // TODO: implement + // Hallucinated by Copilot, but interesting ideas... + // Cot: 'Math.cot', + // Sec: 'Math.sec', + // Csc: 'Math.csc', + // ArcCot: 'Math.acot', + // ArcSec: 'Math.asec', + // ArcCsc: 'Math.acsc', + // Coth: 'Math.coth', + // Sech: 'Math.sech', + // Csch: 'Math.csch', + // ArcCoth: 'Math.acoth', + // ArcSech: 'Math.asech', + // ArcCsch: 'Math.acsch', + // Root: 'Math.root', + // Gamma: 'Math.gamma', + // Erf: 'Math.erf', + // Erfc: 'Math.erfc', + // Erfi: 'Math.erfi', + // Zeta: 'Math.zeta', + // PolyGamma: 'Math.polygamma', + // HurwitzZeta: 'Math.hurwitzZeta', $$\zeta (s,a)=\sum _{n=0}^{\infty }{\frac {1}{(n+a)^{s}}}$$ + // DirichletEta: 'Math.dirichletEta', + // Beta: 'Math.beta', + // Binomial: 'Math.binomial', + // Mod: 'Math.mod', + // Quotient: 'Math.quotient', + // GCD: 'Math.gcd', + // LCM: 'Math.lcm', + // Divisors: 'Math.divisors', + // PrimeQ: 'Math.isPrime', + // PrimePi: 'Math.primePi', + // Prime: 'Math.prime', + // NextPrime: 'Math.nextPrime', + // PreviousPrime: 'Math.prevPrime', + // PrimePowerQ: 'Math.isPrimePower', + // PrimePowerPi: 'Math.primePowerPi', + // PrimePower: 'Math.primePower', + // NextPrimePower: 'Math.nextPrimePower', + // PreviousPrimePower: 'Math.prevPrimePower', + // PrimeFactors: 'Math.primeFactors', + // DivisorSigma: 'Math.divisorSigma', + // DivisorSigma0: 'Math.divisorSigma0', + // DivisorSigma1: 'Math.divisorSigma1', + // DivisorSigma2: 'Math.divisorSigma2', + // DivisorSigma3: 'Math.divisorSigma3', + // DivisorSigma4: 'Math.divisorSigma4', + // DivisorCount: 'Math.divisorCount', + // DivisorSum: 'Math.divisorSum', + // MoebiusMu: 'Math.moebiusMu', + // LiouvilleLambda: 'Math.liouvilleLambda', + // CarmichaelLambda: 'Math.carmichaelLambda', + // EulerPhi: 'Math.eulerPhi', + // EulerPsi: 'Math.eulerPsi', + // EulerGamma: 'Math.eulerGamma', + // HarmonicNumber: 'Math.harmonicNumber', + // BernoulliB: 'Math.bernoulliB', + // StirlingS1: 'Math.stirlingS1', + // StirlingS2: 'Math.stirlingS2', + // BellB: 'Math.bellB', + // BellNumber: 'Math.bellNumber', + // LahS: 'Math.lahS', + // LahL: 'Math.lahL', + // RiemannR: 'Math.riemannR', + // RiemannZeta: 'Math.riemannZeta', + // RiemannXi: 'Math.riemannXi', + // RiemannH: 'Math.riemannH', + // RiemannZ: 'Math.riemannZ', + // RiemannS: 'Math.riemannS', + // RiemannXiZero: 'Math.riemannXiZero', + // RiemannZetaZero: 'Math.riemannZetaZero', + // RiemannHZero: 'Math.riemannHZero', + // RiemannSZero: 'Math.riemannSZero', + // RiemannPrimeCount: 'Math.riemannPrimeCount', + // RiemannRLog: 'Math.riemannRLog', + // RiemannRLogDerivative: 'Math.riemannRLogDerivative', + // RiemannRLogZero: 'Math.riemannRLogZero', + // RiemannRLogZeroDerivative: 'Math.riemannRLogZeroDerivative', + // RiemannRZero: 'Math.riemannRZero', + // RiemannRDerivative: 'Math.riemannRDerivative', + // RiemannXiZeroDerivative: 'Math.riemannXiZeroDerivative', + // RiemannZetaZeroDerivative: 'Math.riemannZetaZeroDerivative', + // RiemannHZeroDerivative: 'Math.riemannHZeroDerivative', + // RiemannSZeroDerivative: 'Math.riemannSZeroDerivative', + // RiemannSZeroDerivative2: 'Math.riemannSZeroDerivative2', + // RiemannSZeroDerivative3: 'Math.riemannSZeroDerivative3', + // RiemannSZeroDerivative4: 'Math.riemannSZeroDerivative4', + // RiemannSZeroDerivative5: 'Math.riemannSZeroDerivative5', + // RiemannSZeroDerivative6: 'Math.riemannSZeroDerivative6', + }[h]) != null ? _a : h; + const args = expr.ops; + if (args !== null) { + const result = []; + for (const arg of args) + result.push(compile(arg, freeVars)); + return `${fn}(${result.join(", ")})`; + } + } + return ""; +} +function compileLoop(expr, op3) { + const args = expr.ops; + if (args === null) + throw new Error("Sum: no arguments"); + if (!expr.op1 || !expr.op2) + throw new Error("Sum: no limits"); + const [index, lower, upper, isFinite2] = normalizeLimits(expr.op2); + const fn = compile(expr.op1, [...expr.op1.freeVars, index], 0); + return `(() => { + let acc = ${op3 === "+" ? "0" : "1"}; + const fn = (_) => ${fn}; + for (let i = ${lower}; i <= ${upper}; i++) + acc ${op3}= fn({ ..._, ${index}: i }); + return acc; +})()`; +} +var AbstractBoxedExpression = class { + constructor(ce, metadata) { + this.engine = ce; + if ((metadata == null ? void 0 : metadata.latex) !== void 0) + this._latex = metadata.latex; + if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) + this._wikidata = metadata.wikidata; + } + /** `Object.valueOf()`: return a primitive value for the object + * + */ + valueOf() { + var _a, _b, _c; + if (this.symbol === "True") + return true; + if (this.symbol === "False") + return false; + return (_c = (_b = (_a = asFloat(this)) != null ? _a : this.string) != null ? _b : this.symbol) != null ? _c : JSON.stringify(this.json); + } + /** Object.toString() */ + toString() { + if (this.symbol) + return this.symbol; + if (this.string) + return this.string; + const num = this.numericValue; + if (num !== null) { + if (typeof num === "number") + return num.toString(); + if (isMachineRational(num)) + return `${num[0].toString()}/${num[1].toString()}`; + if (isBigRational(num)) + return `${num[0].toString()}/${num[1].toString()}`; + if (num instanceof import_complex6.Complex) { + const im = num.im === 1 ? "" : num.im === -1 ? "-" : num.im.toString(); + if (num.re === 0) + return im + "i"; + if (num.im < 0) + return `${num.re.toString()}${im}i`; + return `${num.re.toString()}+${im}i`; + } + } + return JSON.stringify(this.json); + } + [Symbol.toPrimitive](hint) { + if (hint === "number") { + const v = this.valueOf(); + return typeof v === "number" ? v : null; + } + return this.toString(); + } + /** Called by `JSON.stringify()` when serializing to json */ + toJSON() { + return this.json; + } + /** @internal */ + get rawJson() { + return this.json; + } + get scope() { + return null; + } + /** Object.is() */ + is(rhs) { + if (rhs === null || rhs === void 0) + return false; + return this.isSame(this.engine.box(rhs)); + } + get latex() { + var _a; + return (_a = this._latex) != null ? _a : this.engine.serialize(this); + } + set latex(val) { + this._latex = val; + } + get symbol() { + return null; + } + get isNothing() { + return false; + } + get string() { + return null; + } + getSubexpressions(head2) { + return getSubexpressions(this, head2); + } + get subexpressions() { + return this.getSubexpressions(""); + } + get symbols() { + const set = /* @__PURE__ */ new Set(); + getSymbols(this, set); + return Array.from(set); + } + get freeVars() { + const set = /* @__PURE__ */ new Set(); + getFreeVars(this, set); + return Array.from(set); + } + get errors() { + return this.getSubexpressions("Error"); + } + // Only return non-null for functions + get ops() { + return null; + } + get nops() { + return 0; + } + get op1() { + return this.engine.symbol("Nothing"); + } + get op2() { + return this.engine.symbol("Nothing"); + } + get op3() { + return this.engine.symbol("Nothing"); + } + get isValid() { + return true; + } + get isPure() { + return false; + } + get isExact() { + return true; + } + /** For a symbol, true if the symbol is a free variable (no value) */ + get isFree() { + return false; + } + /** For a symbol, true if the symbol is a constant (unchangeable value) */ + get isConstant() { + return false; + } + get canonical() { + return this; + } + apply(_fn, _head) { + return this; + } + subs(_sub, options) { + if (options == null ? void 0 : options.canonical) + return this.canonical; + return this; + } + solve(_vars) { + return null; + } + replace(_rules) { + return null; + } + has(_v) { + return false; + } + get isNaN() { + return void 0; + } + get isZero() { + return void 0; + } + get isNotZero() { + return void 0; + } + get isOne() { + return void 0; + } + get isNegativeOne() { + return void 0; + } + get isInfinity() { + return void 0; + } + // Not +- Infinity, not NaN + get isFinite() { + return void 0; + } + get isEven() { + return void 0; + } + get isOdd() { + return void 0; + } + get isPrime() { + return void 0; + } + get isComposite() { + return void 0; + } + get numericValue() { + return null; + } + get sgn() { + return null; + } + isLess(_rhs) { + return void 0; + } + isLessEqual(_rhs) { + return void 0; + } + isGreater(_rhs) { + return void 0; + } + isGreaterEqual(_rhs) { + return void 0; + } + // x > 0 + get isPositive() { + return void 0; + } + // x >= 0 + get isNonNegative() { + return void 0; + } + // x < 0 + get isNegative() { + return void 0; + } + // x <= 0 + get isNonPositive() { + return void 0; + } + // + // + // + // + // + isCompatible(_dom, _kind) { + return false; + } + get description() { + return void 0; + } + get url() { + return void 0; + } + get wikidata() { + return this._wikidata; + } + set wikidata(val) { + this._wikidata = val; + } + get complexity() { + return void 0; + } + get basedDefinition() { + return void 0; + } + get symbolDefinition() { + return void 0; + } + get functionDefinition() { + return void 0; + } + bind(_scope) { + return; + } + unbind() { + return; + } + get keys() { + return null; + } + get keysCount() { + return 0; + } + getKey(_key) { + return void 0; + } + hasKey(_key) { + return false; + } + get value() { + return void 0; + } + set value(_value) { + throw new Error(`Can't change the value of \\(${this.latex}\\)`); + } + get domain() { + return this.engine.domain("Void"); + } + set domain(_domain) { + throw new Error(`Can't change the domain of \\(${this.latex}\\)`); + } + get explicitDomain() { + return this.domain; + } + get isNumber() { + return void 0; + } + get isInteger() { + return void 0; + } + get isRational() { + return void 0; + } + get isAlgebraic() { + return false; + } + get isReal() { + return void 0; + } + // Real or +-Infinity + get isExtendedReal() { + return void 0; + } + get isComplex() { + return void 0; + } + get isImaginary() { + return void 0; + } + get isExtendedComplex() { + return void 0; + } + simplify(_options) { + return this; + } + evaluate(options) { + return this.simplify(options); + } + N(_options) { + return this.evaluate(); + } + compile(to = "javascript", options) { + if (to !== "javascript") + return void 0; + options != null ? options : options = { optimize: ["simplify", "evaluate"] }; + let expr = this; + if (options.optimize.includes("simplify")) + expr = expr.simplify(); + if (options.optimize.includes("evaluate")) + expr = expr.evaluate(); + try { + return compileToJavascript(expr); + } catch (e) { + } + return void 0; + } +}; +var import_complex8 = __toESM(require_complex()); +function factorial2(ce, n) { + if (!n.isInteger() || n.isNegative()) + return ce._BIGNUM_NAN; + if (n.lessThan(10)) + return ce.bignum( + [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800][n.toNumber()] + ); + if (n.gt(Number.MAX_SAFE_INTEGER)) { + let val2 = ce._BIGNUM_ONE; + let i = ce._BIGNUM_TWO; + while (i.lessThan(n)) { + val2 = val2.mul(i); + i = i.add(1); + } + return val2; + } + if (n.modulo(2).eq(1)) { + return n.times(factorial2(ce, n.minus(1))); + } + let loop = n.toNumber(); + let sum2 = n; + let val = n; + while (loop > 2) { + loop -= 2; + sum2 = sum2.add(loop); + val = val.mul(sum2); + } + return val; +} +var gammaG2 = 7; +function lngamma2(ce, z) { + if (z.isNegative()) + return ce._BIGNUM_NAN; + const GAMMA_P_LN = ce.cache("gamma-p-ln", () => { + return [ + "0.99999999999999709182", + "57.156235665862923517", + "-59.597960355475491248", + "14.136097974741747174", + "-0.49191381609762019978", + "0.33994649984811888699e-4", + "0.46523628927048575665e-4", + "-0.98374475304879564677e-4", + "0.15808870322491248884e-3", + "-0.21026444172410488319e-3", + "0.2174396181152126432e-3", + "-0.16431810653676389022e-3", + "0.84418223983852743293e-4", + "-0.2619083840158140867e-4", + "0.36899182659531622704e-5" + ].map((x2) => ce.bignum(x2)); + }); + let x = GAMMA_P_LN[0]; + for (let i = GAMMA_P_LN.length - 1; i > 0; --i) { + x = x.add(GAMMA_P_LN[i].div(z.add(i))); + } + const GAMMA_G_LN = ce.cache("gamma-g-ln", () => ce.bignum(607).div(128)); + const t = z.add(GAMMA_G_LN).add(ce._BIGNUM_HALF); + return ce._BIGNUM_NEGATIVE_ONE.acos().mul(ce._BIGNUM_TWO).log().mul(ce._BIGNUM_HALF).add( + t.log().mul(z.add(ce._BIGNUM_HALF)).minus(t).add(x.log()).minus(z.log()) + ); +} +function gamma2(ce, z) { + if (z.lessThan(ce._BIGNUM_HALF)) { + const pi = ce._BIGNUM_NEGATIVE_ONE.acos(); + return pi.div( + pi.mul(z).sin().mul(gamma2(ce, ce._BIGNUM_ONE.sub(z))) + ); + } + if (z.greaterThan(100)) + return lngamma2(ce, z).exp(); + z = z.sub(1); + const LANCZOS_7_C = ce.cache("lanczos-7-c", () => { + return [ + "0.99999999999980993227684700473478", + "676.520368121885098567009190444019", + "-1259.13921672240287047156078755283", + "771.3234287776530788486528258894", + "-176.61502916214059906584551354", + "12.507343278686904814458936853", + "-0.13857109526572011689554707", + "9.984369578019570859563e-6", + "1.50563273514931155834e-7" + ].map((x2) => ce.bignum(x2)); + }); + let x = LANCZOS_7_C[0]; + for (let i = 1; i < gammaG2 + 2; i++) + x = x.add(LANCZOS_7_C[i].div(z.add(i))); + const t = z.add(gammaG2).add(ce._BIGNUM_HALF); + return ce._BIGNUM_NEGATIVE_ONE.acos().times(ce._BIGNUM_TWO).sqrt().mul(x.mul(t.neg().exp()).mul(t.pow(z.add(ce._BIGNUM_HALF)))); +} +function isInMachineRange(d) { + if (!d.isFinite()) + return true; + if (d.d.length > 3 || d.d.length === 3 && d.d[0] >= 90) + return false; + /* @__PURE__ */ console.assert(d.precision() <= 16); + return d.e < 308 && d.e > -306; +} +var import_complex7 = __toESM(require_complex()); +var Product = class { + constructor(ce, xs, options) { + this.options = options; + this._terms = []; + this._hasInfinity = false; + this._hasZero = false; + this._isCanonical = true; + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + this._isCanonical = options.canonical; + this.engine = ce; + this._sign = 1; + this._rational = bignumPreferred(ce) ? [BigInt(1), BigInt(1)] : [1, 1]; + this._complex = import_complex7.default.ONE; + this._bignum = ce._BIGNUM_ONE; + this._number = 1; + if (xs) + for (const x of xs) + this.addTerm(x); + } + get isEmpty() { + if (!this._isCanonical) + return this._terms.length === 0; + return this._terms.length === 0 && this._hasInfinity === false && this._hasZero === false && this._sign === 1 && isRationalOne(this._rational) && // isRationalOne(this._squareRootRational) && + this._complex.re === 1 && this._complex.im === 0 && this._bignum.eq(this.engine._BIGNUM_ONE) && this._number === 1; + } + /** + * Add a term to the product. + * + * If `this._isCanonical` a running product of exact terms is kept. + * Otherwise, terms and their exponent are tallied. + */ + addTerm(term) { + /* @__PURE__ */ console.assert(term.isCanonical); + if (term.head === "Multiply") { + for (const t of term.ops) + this.addTerm(t); + return; + } + if (this._isCanonical) { + if (term.isNothing) + return; + if (term.numericValue !== null) { + if (term.isOne) + return; + if (term.isZero) { + this._hasZero = true; + return; + } + if (term.isNegativeOne) { + this._sign *= -1; + return; + } + if (term.isInfinity) { + this._hasInfinity = true; + if (term.isNegative) + this._sign *= -1; + return; + } + let num = term.numericValue; + if (typeof num === "number") { + if (num < 0) { + this._sign *= -1; + num = -num; + } + if (Number.isInteger(num)) + this._rational = mul2(this._rational, [num, 1]); + else if (bignumPreferred(this.engine)) + this._bignum = this._bignum.mul(num); + else + this._number *= num; + return; + } + if (num instanceof decimal_default) { + if (num.isNegative()) { + this._sign *= -1; + num = num.neg(); + } + if (num.isInteger()) + this._rational = mul2(this._rational, [bigint(num), BigInt(1)]); + else if (bignumPreferred(this.engine)) + this._bignum = this._bignum.mul(num); + else + this._number *= num.toNumber(); + return; + } + if (num instanceof import_complex7.default) { + this._complex = this._complex.mul(num); + return; + } + if (isRational(num)) { + this._rational = mul2(this._rational, num); + if (isNeg(this._rational)) { + this._sign *= -1; + this._rational = neg(this._rational); + } + return; + } + } + } + let rest = term; + if (this._isCanonical) { + let coef; + [coef, rest] = asCoefficient(term); + this._rational = mul2(this._rational, coef); + if (isNeg(this._rational)) { + this._sign *= -1; + this._rational = neg(this._rational); + } + } + if (rest.numericValue !== null && rest.isOne) + return; + let exponent = [1, 1]; + if (rest.head === "Power") { + const r = asRational(rest.op2); + if (r) { + exponent = r; + rest = rest.op1; + } + } else if (rest.head === "Divide") { + this.addTerm(rest.op1); + exponent = [-1, 1]; + rest = rest.op2; + } + let found = false; + for (const x of this._terms) { + if (x.term.isSame(rest)) { + x.exponent = add2(x.exponent, exponent); + found = true; + break; + } + } + if (!found) + this._terms.push({ term: rest, exponent }); + } + unitTerms(mode) { + const ce = this.engine; + if (mode === "numeric") { + if (!complexAllowed(ce) && this._complex.im !== 0) + return null; + if (bignumPreferred(ce)) { + let b2 = ce._BIGNUM_ONE; + if (!isRationalOne(this._rational)) { + if (isBigRational(this._rational)) + b2 = ce.bignum(this._rational[0].toString()).div(ce.bignum(this._rational[1].toString())); + else + b2 = ce.bignum(this._rational[0]).div(this._rational[1]); + } + b2 = b2.mul(this._bignum).mul(this._sign * this._number); + if (this._complex.im !== 0) { + const z = this._complex.mul(b2.toNumber()); + if (z.equals(1)) + return []; + return [{ exponent: [1, 1], terms: [ce.number(z)] }]; + } + b2 = b2.mul(this._complex.re); + if (b2.equals(1)) + return []; + return [{ exponent: [1, 1], terms: [ce.number(b2)] }]; + } + let n2 = 1; + if (!isRationalOne(this._rational)) { + if (isBigRational(this._rational)) + n2 = Number(this._rational[0]) / Number(this._rational[1]); + else + n2 = this._rational[0] / this._rational[1]; + } + n2 *= this._sign * this._number * this._bignum.toNumber(); + if (this._complex.im !== 0) { + const z = this._complex.mul(n2); + if (z.equals(1)) + return []; + return [{ exponent: [1, 1], terms: [ce.number(z)] }]; + } + n2 *= this._complex.re; + if (n2 === 1) + return []; + return [{ exponent: [1, 1], terms: [ce.number(n2)] }]; + } + const xs = []; + const unitTerms = []; + if (this._hasInfinity) + unitTerms.push(ce._POSITIVE_INFINITY); + this._rational = reducedRational(this._rational); + if (this._complex.re !== 1 || this._complex.im !== 0) { + if (this._complex.im === 0) + this._number *= Math.abs(this._complex.re); + if (this._complex.re < 0) + this._rational = neg(this._rational); + else { + unitTerms.push(ce.number(this._complex)); + } + } + let n = this._sign * this._number; + let b = this._bignum; + if (!isRationalOne(this._rational)) { + if (mode === "rational") { + if (machineNumerator(this._rational) !== 1) { + if (isBigRational(this._rational)) + b = b.mul(ce.bignum(this._rational[0])); + else + n *= this._rational[0]; + } + if (machineDenominator(this._rational) !== 1) + xs.push({ + exponent: [-1, 1], + terms: [ce.number(this._rational[1])] + }); + } else { + if (n === -1) { + unitTerms.push(ce.number(neg(this._rational))); + n = 1; + } else + unitTerms.push(ce.number(this._rational)); + } + } + if (!b.equals(ce._BIGNUM_ONE)) + unitTerms.push(ce.number(b.mul(n))); + else if (n !== 1) + unitTerms.push(ce.number(n)); + if (unitTerms.length > 0) + xs.push({ exponent: [1, 1], terms: unitTerms }); + return xs; + } + /** The terms of the product, grouped by degrees. + * + * If `mode` is `rational`, rationals are split into separate numerator and + * denominator, so that a rational expression can be created later + * If `mode` is `expression`, a regular expression is returned, without + * splitting rationals + * If `mode` is `numeric`, the literals are combined into one expression + * + */ + groupedByDegrees(options) { + var _a; + options != null ? options : options = {}; + if (!("mode" in options)) + options.mode = "expression"; + const ce = this.engine; + if (options.mode === "numeric") { + if (this._complex.im !== 0 && !complexAllowed(ce)) + return null; + if (this._hasInfinity) + return [{ exponent: [1, 1], terms: [ce._POSITIVE_INFINITY] }]; + } + const xs = this.unitTerms((_a = options.mode) != null ? _a : "expression"); + if (xs === null) + return null; + for (const t of this._terms) { + const exponent = reducedRational(t.exponent); + if (exponent[0] === 0) + continue; + let found = false; + for (const x of xs) { + if (exponent[0] === x.exponent[0] && exponent[1] === x.exponent[1]) { + x.terms.push(t.term); + found = true; + break; + } + } + if (!found) + xs.push({ exponent, terms: [t.term] }); + } + return xs; + } + asExpression(mode = "evaluate") { + const ce = this.engine; + if (this._hasInfinity) { + if (this._hasZero) + return ce._NAN; + if (this._terms.length === 0) { + if (machineNumerator(this._rational) > 0) + return ce._POSITIVE_INFINITY; + return ce._NEGATIVE_INFINITY; + } + } + if (this._hasZero) + return ce._ZERO; + const groupedTerms = this.groupedByDegrees({ + mode: mode === "N" ? "numeric" : "expression" + }); + if (groupedTerms === null) + return ce._NAN; + const terms = termsAsExpressions(ce, groupedTerms); + if (terms.length === 0) + return ce._ONE; + if (terms.length === 1) + return terms[0]; + return this.engine._fn("Multiply", terms); + } + /** The product, expressed as a numerator and denominator */ + asNumeratorDenominator() { + const xs = this.groupedByDegrees({ mode: "rational" }); + if (xs === null) + return [this.engine._NAN, this.engine._NAN]; + const xsNumerator = []; + const xsDenominator = []; + for (const x of xs) + if (x.exponent[0] >= 0) + xsNumerator.push(x); + else + xsDenominator.push({ + exponent: neg(x.exponent), + terms: x.terms + }); + const ce = this.engine; + const numeratorTerms = termsAsExpressions(ce, xsNumerator); + let numerator = ce._ONE; + if (numeratorTerms.length === 1) + numerator = numeratorTerms[0]; + else if (numeratorTerms.length > 0) + numerator = ce._fn("Multiply", numeratorTerms); + const denominatorTerms = termsAsExpressions(ce, xsDenominator); + let denominator = ce._ONE; + if (denominatorTerms.length === 1) + denominator = denominatorTerms[0]; + else if (denominatorTerms.length > 0) + denominator = ce._fn("Multiply", denominatorTerms); + return [numerator, denominator]; + } + asRationalExpression() { + const [numerator, denominator] = this.asNumeratorDenominator(); + if (denominator.numericValue !== null) { + if (denominator.isOne) + return numerator; + if (denominator.isNegativeOne) + return this.engine.neg(numerator); + } + return this.engine._fn("Divide", [numerator, denominator]); + } +}; +function degreeKey(exponent) { + if (isRationalOne(exponent)) + return 0; + const [n, d] = [machineNumerator(exponent), machineDenominator(exponent)]; + if (n > 0 && Number.isInteger(n / d)) + return 1; + if (n > 0) + return 2; + if (Number.isInteger(n / d)) + return 3; + return 4; +} +function degreeOrder(a, b) { + const keyA = degreeKey(a.exponent); + const keyB = degreeKey(b.exponent); + if (keyA !== keyB) + return keyA - keyB; + const [a_n, a_d] = [ + machineNumerator(a.exponent), + machineDenominator(a.exponent) + ]; + const [b_n, b_d] = [ + machineNumerator(b.exponent), + machineDenominator(b.exponent) + ]; + return a_n / a_d - b_n / b_d; +} +function termsAsExpressions(ce, terms) { + var _a; + const result = terms.sort(degreeOrder).map((x) => { + const t = flattenOps(x.terms, "Multiply"); + const base = t.length <= 1 ? t[0] : ce._fn("Multiply", t.sort(order)); + if (isRationalOne(x.exponent)) + return base; + return ce.pow(base, x.exponent); + }); + return (_a = flattenOps(result, "Multiply")) != null ? _a : result; +} +function subtract(ce, a, b, metadata) { + if (a.numericValue !== null) { + if (isRational(a.numericValue)) { + if (machineNumerator(a.numericValue) < 0) { + return serializeJsonFunction( + ce, + "Subtract", + [b, ce.number(neg(a.numericValue))], + metadata + ); + } + return null; + } + const t0 = asSmallInteger(a); + if (t0 !== null && t0 < 0) + return serializeJsonFunction( + ce, + "Subtract", + [b, ce.number(-t0)], + metadata + ); + } + if (a.head === "Negate") + return serializeJsonFunction(ce, "Subtract", [b, a.op1], metadata); + return null; +} +function serializeJsonCanonicalFunction(ce, head2, args, metadata) { + var _a, _b, _c; + const exclusions = ce.jsonSerializationOptions.exclude; + if (head2 === "Add" && args.length === 2 && !exclusions.includes("Subtract")) { + const sub2 = (_a = subtract(ce, args[0], args[1], metadata)) != null ? _a : subtract(ce, args[1], args[0], metadata); + if (sub2) + return sub2; + } + if (head2 === "Divide" && args.length === 2 && exclusions.includes("Divide")) { + return serializeJsonFunction( + ce, + "Multiply", + [args[0], ce._fn("Power", [args[1], ce._NEGATIVE_ONE])], + metadata + ); + } + if (head2 === "Multiply" && !exclusions.includes("Negate")) { + if (asFloat(args[0]) === -1) { + if (args.length === 2) + return serializeJsonFunction(ce, "Negate", [args[1]]); + return serializeJsonFunction( + ce, + "Negate", + [ce._fn("Multiply", args.slice(1))], + metadata + ); + } + } + if (head2 === "Multiply" && !exclusions.includes("Divide")) { + const result = new Product(ce, args, { + canonical: false + }).asRationalExpression(); + if (result.head === "Divide") + return serializeJsonFunction(ce, result.head, result.ops, metadata); + } + if (head2 === "Power") { + if (!exclusions.includes("Exp") && ((_b = args[0]) == null ? void 0 : _b.symbol) === "ExponentialE") + return serializeJsonFunction(ce, "Exp", [args[1]], metadata); + if (((_c = args[1]) == null ? void 0 : _c.numericValue) !== null) { + const exp2 = asSmallInteger(args[1]); + if (exp2 === 2 && !exclusions.includes("Square")) + return serializeJsonFunction(ce, "Square", [args[0]], metadata); + if (exp2 !== null && exp2 < 0 && !exclusions.includes("Divide")) { + return serializeJsonFunction( + ce, + "Divide", + [ce._ONE, exp2 === -1 ? args[0] : ce.pow(args[0], -exp2)], + metadata + ); + } + const r = args[1].numericValue; + if (!exclusions.includes("Sqrt") && r === 0.5) + return serializeJsonFunction(ce, "Sqrt", [args[0]], metadata); + if (!exclusions.includes("Sqrt") && r === -0.5) + return serializeJsonFunction( + ce, + "Divide", + [ce._ONE, ce._fn("Sqrt", [args[0]])], + metadata + ); + if (isRational(r)) { + const n = machineNumerator(r); + const d = machineDenominator(r); + if (n === 1) { + if (!exclusions.includes("Sqrt") && d === 2) + return serializeJsonFunction(ce, "Sqrt", [args[0]], metadata); + if (!exclusions.includes("Root")) + return serializeJsonFunction( + ce, + "Root", + [args[0], ce.number(r[1])], + metadata + ); + } + if (n === -1) { + if (!exclusions.includes("Sqrt") && d === 2) + return serializeJsonFunction( + ce, + "Divide", + [ce._ONE, ce._fn("Sqrt", [args[0]])], + metadata + ); + if (!exclusions.includes("Root")) + return serializeJsonFunction( + ce, + "Divide", + [ce._ONE, ce._fn("Root", [args[0], ce.number(r[1])])], + metadata + ); + } + } + } + } + return serializeJsonFunction(ce, head2, args, metadata); +} +function serializeJsonFunction(ce, head2, args, metadata) { + var _a; + const exclusions = ce.jsonSerializationOptions.exclude; + if ((head2 === "Rational" || head2 === "Divide") && args.length === 2 && asSmallInteger(args[0]) === 1 && asSmallInteger(args[1]) === 2 && !exclusions.includes("Half")) { + return serializeJsonSymbol(ce, "Half", { + ...metadata, + wikidata: "Q39373172" + }); + } + if (args.length === 1) { + const num0 = args[0].numericValue; + if (head2 === "Negate" && num0 !== null) { + if (typeof num0 === "number") + return serializeJsonNumber(ce, -num0); + if (num0 instanceof decimal_default) + return serializeJsonNumber(ce, num0.neg()); + if (num0 instanceof import_complex8.Complex) + return serializeJsonNumber(ce, num0.neg()); + if (isRational(num0)) + return serializeJsonNumber(ce, neg(num0)); + } + } + if (typeof head2 === "string" && exclusions.includes(head2)) { + if (head2 === "Rational" && args.length === 2) + return serializeJsonFunction(ce, "Divide", args, metadata); + if (head2 === "Complex" && args.length === 2) + return serializeJsonFunction( + ce, + "Add", + [args[0], ce._fn("Multiply", [args[1], ce.symbol("ImaginaryUnit")])], + metadata + ); + if (head2 === "Sqrt" && args.length === 1) + return serializeJsonFunction( + ce, + "Power", + [args[0], exclusions.includes("Half") ? ce.number([1, 2]) : ce._HALF], + metadata + ); + if (head2 === "Root" && args.length === 2 && args[1].numericValue !== null) { + const n = asSmallInteger(args[1]); + if (n === 2) + return serializeJsonFunction(ce, "Sqrt", [args[0]]); + if (n !== null) { + if (n < 0) + return serializeJsonFunction( + ce, + "Divide", + [ce._ONE, ce._fn("Power", [args[0], ce.number([1, -n])])], + metadata + ); + return serializeJsonFunction( + ce, + "Power", + [args[0], ce.number([1, -n])], + metadata + ); + } + } + if (head2 === "Square" && args.length === 1) + return serializeJsonFunction( + ce, + "Power", + [args[0], ce.number(2)], + metadata + ); + if (head2 === "Exp" && args.length === 1) + return serializeJsonFunction( + ce, + "Power", + [ce.symbol("ExponentialE"), args[0]], + metadata + ); + if (head2 === "Subtract" && args.length === 2) + return serializeJsonFunction( + ce, + "Add", + [args[0], ce._fn("Negate", [args[1]])], + metadata + ); + if (head2 === "Subtract" && args.length === 1) + return serializeJsonFunction(ce, "Negate", args, metadata); + } + if (head2 === "Add" && args.length === 2 && !exclusions.includes("Subtract")) { + if (args[1].numericValue !== null) { + const t1 = asSmallInteger(args[1]); + if (t1 !== null && t1 < 0) + return serializeJsonFunction( + ce, + "Subtract", + [args[0], ce.number(-t1)], + metadata + ); + } + if (args[1].head === "Negate") { + return serializeJsonFunction( + ce, + "Subtract", + [args[0], args[1].op1], + metadata + ); + } + } + if (head2 === "Tuple") { + if (args.length === 1 && !exclusions.includes("Single")) + return serializeJsonFunction(ce, "Single", args, metadata); + if (args.length === 2 && !exclusions.includes("Pair")) + return serializeJsonFunction(ce, "Pair", args, metadata); + if (args.length === 3 && !exclusions.includes("Triple")) + return serializeJsonFunction(ce, "Triple", args, metadata); + } + const jsonHead = typeof head2 === "string" ? _escapeJsonString(head2) : head2.json; + const fn = [jsonHead, ...args.map((x) => x.json)]; + const md = { ...metadata != null ? metadata : {} }; + if (ce.jsonSerializationOptions.metadata.includes("latex")) { + md.latex = _escapeJsonString((_a = md.latex) != null ? _a : ce.serialize({ fn })); + } else + md.latex = ""; + if (!ce.jsonSerializationOptions.metadata.includes("wikidata")) + md.wikidata = ""; + if (!md.latex && !md.wikidata && ce.jsonSerializationOptions.shorthands.includes("function")) + return fn; + if (md.latex && md.wikidata) + return { fn, latex: md.latex, wikidata: md.wikidata }; + if (md.latex) + return { fn, latex: md.latex }; + if (md.wikidata) + return { fn, wikidata: md.wikidata }; + return { fn }; +} +function serializeJsonString(ce, s) { + s = _escapeJsonString(s); + if (ce.jsonSerializationOptions.shorthands.includes("string")) + return `'${s}'`; + return { str: s }; +} +function serializeJsonSymbol(ce, sym, metadata) { + var _a, _b; + if (sym === "Half" && ce.jsonSerializationOptions.exclude.includes("Half")) { + return serializeJsonNumber(ce, [1, 2], metadata); + } + metadata = { ...metadata }; + if (ce.jsonSerializationOptions.metadata.includes("latex")) { + metadata.latex = (_a = metadata.latex) != null ? _a : ce.serialize({ sym }); + if (metadata.latex !== void 0) + metadata.latex = _escapeJsonString(metadata.latex); + } else + metadata.latex = void 0; + if (ce.jsonSerializationOptions.metadata.includes("wikidata")) { + if (metadata.wikidata === void 0) { + const wikidata = (_b = ce.lookupSymbol(sym)) == null ? void 0 : _b.wikidata; + if (wikidata !== void 0) + metadata.wikidata = _escapeJsonString(wikidata); + } + } else + metadata.wikidata = void 0; + sym = _escapeJsonString(sym); + if (metadata.latex === void 0 && metadata.wikidata === void 0 && ce.jsonSerializationOptions.shorthands.includes("symbol")) + return sym; + if (metadata.latex !== void 0 && metadata.wikidata !== void 0) + return { sym, latex: metadata.latex, wikidata: metadata.wikidata }; + if (metadata.latex !== void 0) + return { sym, latex: metadata.latex }; + if (metadata.wikidata !== void 0) + return { sym, wikidata: metadata.wikidata }; + return { sym }; +} +function serializeJsonNumber(ce, value, metadata) { + var _a, _b, _c; + metadata = { ...metadata }; + if (!ce.jsonSerializationOptions.metadata.includes("latex")) + metadata.latex = void 0; + const shorthandAllowed = metadata.latex === void 0 && metadata.wikidata === void 0 && !ce.jsonSerializationOptions.metadata.includes("latex") && ce.jsonSerializationOptions.shorthands.includes("number"); + const exclusions = ce.jsonSerializationOptions.exclude; + let num = ""; + if (value instanceof decimal_default) { + if (value.isNaN()) + num = "NaN"; + else if (!value.isFinite()) + num = value.isPositive() ? "+Infinity" : "-Infinity"; + else { + if (shorthandAllowed && isInMachineRange(value)) + return value.toNumber(); + if (value.isInteger() && value.e < value.precision() + 4) + num = value.toFixed(0); + else { + const precision = ce.jsonSerializationOptions.precision; + const s = precision === "max" ? value.toString() : value.toPrecision( + precision === "auto" ? ce.precision : precision + ); + num = repeatingDecimals(ce, s); + if (shorthandAllowed) { + const val = value.toNumber(); + if (val.toString() === num) + return val; + } + } + } + if (ce.jsonSerializationOptions.metadata.includes("latex")) + metadata.latex = (_a = metadata.latex) != null ? _a : ce.serialize({ num }); + return metadata.latex !== void 0 ? { num, latex: metadata.latex } : shorthandAllowed ? num : { num }; + } + if (value instanceof import_complex8.Complex) { + if (value.isInfinite()) + return serializeJsonSymbol(ce, "ComplexInfinity", metadata); + if (value.isNaN()) { + num = "NaN"; + if (ce.jsonSerializationOptions.metadata.includes("latex")) + metadata.latex = (_b = metadata.latex) != null ? _b : ce.serialize({ num }); + return metadata.latex !== void 0 ? { num, latex: metadata.latex } : { num }; + } + return serializeJsonFunction( + ce, + "Complex", + [ce.number(value.re), ce.number(value.im)], + { + ...metadata, + wikidata: "Q11567" + } + ); + } + if (isRational(value)) { + const allowRational = !exclusions.includes("Rational"); + if (shorthandAllowed && ce.jsonSerializationOptions.shorthands.includes("function") && isMachineRational(value)) { + if (value[0] === 1 && value[1] === 2 && !exclusions.includes("Half")) + return serializeJsonSymbol(ce, "Half", metadata); + return [allowRational ? "Rational" : "Divide", value[0], value[1]]; + } + return serializeJsonFunction( + ce, + allowRational ? "Rational" : "Divide", + [ce.number(value[0]), ce.number(value[1])], + { ...metadata } + ); + } + if (Number.isNaN(value)) + num = "NaN"; + else if (!Number.isFinite(value)) + num = value > 0 ? "+Infinity" : "-Infinity"; + else { + if (shorthandAllowed) + return value; + num = repeatingDecimals(ce, value.toString()); + } + if (ce.jsonSerializationOptions.metadata.includes("latex")) + metadata.latex = (_c = metadata.latex) != null ? _c : ce.serialize({ num }); + return metadata.latex !== void 0 ? { num, latex: metadata.latex } : { num }; +} +function _escapeJsonString(s) { + return s; +} +function repeatingDecimals(ce, s) { + var _a; + if (!ce.jsonSerializationOptions.repeatingDecimals) + return s; + let [_, wholepart, fractionalPart, exponent] = (_a = s.match(/^(.*)\.([0-9]+)([e|E][-+]?[0-9]+)?$/)) != null ? _a : []; + if (!fractionalPart) + return s.toLowerCase(); + const lastDigit = fractionalPart[fractionalPart.length - 1]; + fractionalPart = fractionalPart.slice(0, -1); + const MAX_REPEATING_PATTERN_LENGTH = 16; + let prefix = ""; + for (let i = 0; i < fractionalPart.length - MAX_REPEATING_PATTERN_LENGTH; i++) { + prefix = fractionalPart.substring(0, i); + for (let j = 0; j <= MAX_REPEATING_PATTERN_LENGTH; j++) { + const repetend = fractionalPart.substring(i, i + j + 1); + const times = Math.floor( + (fractionalPart.length - prefix.length) / repetend.length + ); + if (times < 3) + break; + if ((prefix + repetend.repeat(times + 1)).startsWith(fractionalPart)) { + if (repetend === "0") { + if (lastDigit === "0") + return wholepart + "." + prefix + (exponent != null ? exponent : ""); + return s; + } + return wholepart + "." + prefix + "(" + repetend + ")" + (exponent != null ? exponent : ""); + } + } + } + fractionalPart += lastDigit; + while (fractionalPart.endsWith("0")) + fractionalPart = fractionalPart.slice(0, -1); + if (exponent) + return `${wholepart}.${fractionalPart}${exponent.toLowerCase()}`; + return `${wholepart}.${fractionalPart}`; +} +var _BoxedDomain = class __BoxedDomain extends AbstractBoxedExpression { + constructor(ce, dom, metadata) { + super(ce, metadata); + this._value = makeCanonical(ce, dom); + } + get isCanonical() { + return true; + } + /** Boxed domains are always canonical. */ + get canonical() { + return this; + } + get isValid() { + return this.ctor !== "InvalidDomain"; + } + get json() { + return ["Domain", serialize(this.engine, this._value)]; + } + get literal() { + if (typeof this._value === "string") + return this._value; + return null; + } + get ctor() { + if (typeof this._value === "string") + return null; + return this._value[0]; + } + get domainArgs() { + if (typeof this._value === "string") + return null; + return this._value.slice(1); + } + get domainArg1() { + if (typeof this._value === "string") + return null; + return this._value[1]; + } + get codomain() { + if (typeof this._value === "string") + return null; + return this.engine.domain(this._value[this._value.length - 1]); + } + get hash() { + if (this._hash === void 0) + this._hash = hashCode(hash(this._value)); + return this._hash; + } + isEqual(rhs) { + return isEqual(this._value, rhs); + } + isSame(rhs) { + return isEqual(this._value, rhs); + } + is(rhs) { + return isEqual(this._value, rhs); + } + isCompatible(dom, compatibility = "covariant") { + const lhs = this._value; + const rhs = dom instanceof __BoxedDomain ? dom._value : dom; + const rhsCtor = Array.isArray(rhs) ? rhs[0] : null; + if (rhsCtor) { + const rhsParam = rhs[1]; + if (rhsCtor === "Covariant") + return isSubdomainOf1(lhs, rhsParam); + if (rhsCtor === "Contravariant") + return isSubdomainOf1(rhsParam, lhs); + if (rhsCtor === "Invariant") + return !isSubdomainOf1(rhsParam, lhs) && !isSubdomainOf1(lhs, rhsParam); + if (rhsCtor === "Bivariant") + return isSubdomainOf1(lhs, rhsParam) && isSubdomainOf1(rhsParam, lhs); + } + if (compatibility === "covariant") + return isSubdomainOf1(lhs, rhs); + if (compatibility === "contravariant") + return isSubdomainOf1(rhs, lhs); + if (compatibility === "bivariant") + return isSubdomainOf1(rhs, lhs) && isSubdomainOf1(lhs, rhs); + return !isSubdomainOf1(rhs, lhs) && !isSubdomainOf1(lhs, rhs); + } + match(rhs, _options) { + if (!(rhs instanceof __BoxedDomain)) + return null; + if (this.isSame(rhs)) + return {}; + return null; + } + get head() { + return "Domain"; + } + get domain() { + return this.engine.domain("Domain"); + } + get isNothing() { + return this._value === "Nothing"; + } + get isFunction() { + return this.ctor === "Function" || this._value === "Function"; + } + // get isPredicate(): boolean { + // if (this.domainLiteral === 'Predicate') return true; + // if (this.domainConstructor !== 'Function') return false; + // const resultDomain = this._value[this._value.length]; + // if (!(resultDomain instanceof _Domain)) return false; + // return resultDomain.isBoolean; + // } + // get isNumericFunction(): boolean { + // if (this.domainLiteral === 'NumericFunction') return true; + // if (this.domainConstructor !== 'Function') return false; + // for (const arg of this.domainParams!) + // if (!isNumericSubdomain(arg, 'Number')) return false; + // return true; + // } + // get isBoolean(): boolean { + // const dom = this.domainLiteral; + // return dom === 'Boolean' || dom === 'MaybeBoolean'; + // } + // get isRealFunction(): boolean { + // if (this.domainLiteral === 'RealFunction') return true; + // if (this.domainConstructor !== 'Function') return false; + // for (const arg of this.domainParams!) + // if (!isNumericSubdomain(arg, 'ExtendedRealNumber')) return false; + // return true; + // } + get isNumeric() { + return this.isCompatible(this.engine.domain("Number")); + } + // get isLogicOperator(): boolean { + // if (this.domainLiteral === 'LogicOperator') return true; + // if (!this.codomain?.isBoolean) return false; + // const params = this.domainParams!; + // if (params.length < 1 || params.length > 2) return false; + // if (!params[0].isBoolean) return false; + // if (params.length === 1) return true; + // if (!params[1].isBoolean) return false; + // return true; + // } + get isRelationalOperator() { + if (this._value === "RelationalOperator") + return true; + if (this.ctor !== "Function") + return false; + if (this.domainArgs.length !== 2) + return false; + if (!this.codomain.isCompatible("MaybeBoolean")) + return false; + return true; + } +}; +function boxDomain(ce, dom, metadata) { + if (Array.isArray(dom) && dom[0] === "Domain") + dom = dom[1]; + if (dom instanceof _BoxedDomain) + return dom; + if (dom instanceof AbstractBoxedExpression) + dom = dom.json; + if (typeof dom === "string") { + const expr = DOMAIN_ALIAS[dom]; + if (expr) + return boxDomain(ce, expr); + if (!isDomainLiteral(dom)) + throw Error("Expected a domain literal, got " + dom); + return new _BoxedDomain(ce, dom, metadata); + } + if (!Array.isArray(dom) || dom.length === 0) + throw Error("Expected a valid domain"); + const constructor = dom[0]; + if (!DOMAIN_CONSTRUCTORS.includes(constructor)) + throw Error("Expected domain constructor, got " + constructor); + return new _BoxedDomain(ce, dom, metadata); +} +function makeCanonical(ce, dom) { + if (dom === void 0 || typeof dom === "number") + throw Error("Expected a domain expression"); + if (dom instanceof _BoxedDomain) + return dom._value; + if (typeof dom === "string") { + if (!isDomainLiteral(dom)) + throw Error("Unknown domain literal"); + return dom; + } + if (!Array.isArray(dom) && typeof dom === "object") + throw Error("Expected a domain expression"); + if (!dom) + ; + const ctor = dom[0]; + /* @__PURE__ */ console.assert(ctor); + if (ctor === "Range") { + if (dom.length === 1) + return "Integer"; + let first = 1; + let last = Infinity; + if (dom.length === 2) { + last = dom[1]; + } else if (dom.length === 3) { + first = dom[1]; + last = dom[2]; + } + const firstNum = asRangeBound(ce, first); + const lastNum = asRangeBound(ce, last); + if (firstNum === null || lastNum === null) + throw Error(`Invalid range [${firstNum}, ${lastNum}] `); + if (lastNum < firstNum) + [first, last] = [last, first]; + if (firstNum === -Infinity && lastNum === Infinity) + return "Integer"; + if (firstNum === 1 && lastNum === Infinity) + return "PositiveInteger"; + if (firstNum === 0 && lastNum === Infinity) + return "NonNegativeInteger"; + if (firstNum === -Infinity && lastNum === -1) + return "NegativeInteger"; + if (firstNum === -Infinity && lastNum === 0) + return "NonPositiveInteger"; + return ["Range", ce.number(firstNum), ce.number(lastNum)]; + } + if (ctor === "Interval") { + if (dom.length !== 3) + throw Error("Invalid range " + dom); + let [isLeftOpen, first] = maybeOpen(ce, dom[1]); + let [isRightOpen, last] = maybeOpen(ce, dom[2]); + if (first === null || last === null) + throw Error("Invalid range " + dom); + if (last < first) { + [first, last] = [last, first]; + [isLeftOpen, isRightOpen] = [isRightOpen, isLeftOpen]; + } + if (first === 0 && last === Infinity) + return isLeftOpen ? "PositiveNumber" : "NonNegativeNumber"; + if (first === -Infinity && last === 0) + return isRightOpen ? "NegativeNumber" : "NonPositiveNumber"; + return [ + "Interval", + isLeftOpen ? ["Open", ce.number(first)] : ce.number(first), + isRightOpen ? ["Open", ce.number(last)] : ce.number(last) + ]; + } + if (ctor === "Function") { + return ["Function", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; + } + if (ctor === "Dictionary") { + return ["Dictionary", makeCanonical(ce, dom[1])]; + } + if (ctor === "List") { + return ["List", makeCanonical(ce, dom[1])]; + } + if (ctor === "Tuple") { + return ["Tuple", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; + } + if (ctor === "Union") { + return ["Union", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; + } + if (ctor === "Intersection") { + return ["Intersection", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; + } + if (ctor === "Covariant" || ctor === "Contravariant" || ctor === "Invariant") { + return [ctor, makeCanonical(ce, dom[1])]; + } + if (ctor === "Maybe") { + return ["Maybe", makeCanonical(ce, dom[1])]; + } + if (ctor === "Sequence") { + return ["Sequence", makeCanonical(ce, dom[1])]; + } + if (ctor === "Head") { + return ["Head", dom[1]]; + } + if (ctor === "Symbol") { + return ["Symbol", dom[1]]; + } + if (ctor === "Value") { + return ["Value", ce.box(dom[1])]; + } + if (ctor === "InvalidDomain") { + return ["InvalidDomain", dom[1]]; + } + throw Error("Unexpected domain constructor " + ctor); +} +function asRangeBound(ce, expr) { + if (typeof expr === "number") + return expr; + const x = ce.box(expr).evaluate(); + return x.isInfinity ? x.isPositive ? Infinity : -Infinity : asSmallInteger(x); +} +function maybeOpen(ce, expr) { + if (Array.isArray(expr) && expr[0] === "Open") + return [true, asRangeBound(ce, expr[1])]; + return [false, asRangeBound(ce, expr)]; +} +function isDomain(expr) { + if (expr instanceof _BoxedDomain) + return true; + if (expr instanceof AbstractBoxedExpression) + expr = expr.json; + if (typeof expr === "string") + return isDomainLiteral(expr); + if (Array.isArray(expr)) { + if (expr.length <= 1) + return false; + const ctor = expr[0]; + if (typeof ctor !== "string" || !DOMAIN_CONSTRUCTORS.includes(ctor)) + return false; + if (ctor === "InvalidDomain") + return false; + if (ctor === "List") + return expr.length === 2 && isValidDomain(expr[1]); + if (ctor === "Tuple" || ctor === "Function" || ctor === "Maybe" || ctor === "Sequence" || ctor === "Intersection" || ctor === "Union") + return expr.slice(1, -1).every((x) => isValidDomain(x)); + return expr.every((x) => x !== null); + } + return false; +} +function isValidDomain(expr) { + if (expr instanceof _BoxedDomain) + return expr.isValid; + if (Array.isArray(expr) && expr[0] === "InvalidDomain") + return false; + return isDomain(expr); +} +function isSubdomainOf1(lhs, rhs) { + const [result, rest] = isSubdomainOf([lhs], rhs); + if (result && rest.length === 0) + return true; + return false; +} +function isSubdomainOf(xlhs, rhs) { + let lhs = xlhs.shift(); + const rhsLiteral = typeof rhs === "string" ? rhs : null; + if (rhsLiteral === "Anything") + return [true, xlhs]; + const lhsLiteral = typeof lhs === "string" ? lhs : null; + if (lhsLiteral && rhsLiteral) { + if (lhsLiteral === rhsLiteral) + return [true, xlhs]; + return [ancestors(lhsLiteral).includes(rhsLiteral), xlhs]; + } + if (rhsLiteral) { + if (!lhs) + ; + const lhsConstructor = lhs[0]; + if (lhsConstructor === "Function") + return [rhsLiteral === "Function", xlhs]; + if (lhsConstructor === "Dictionary") + return [rhsLiteral === "Dictionary", xlhs]; + if (lhsConstructor === "List") + return [rhsLiteral === "List", xlhs]; + if (lhsConstructor === "Tuple") + return [rhsLiteral === "Tuple", xlhs]; + if (lhsConstructor === "Intersection") { + } + if (lhsConstructor === "Interval") + return [isSubdomainOf1("ExtendedRealNumber", rhsLiteral), xlhs]; + if (lhsConstructor === "Range") + return [isSubdomainOf1("Integer", rhsLiteral), xlhs]; + return [true, xlhs]; + } + const rhsConstructor = rhs[0]; + if (rhsConstructor === "Function") { + if (lhsLiteral === "Function") + return [true, xlhs]; + if (lhsLiteral) + return [false, xlhs]; + if (lhs[0] !== "Function") + return [false, xlhs]; + if (lhs.length === 1 && rhs.length === 1) + return [true, xlhs]; + if (!isSubdomainOf1( + lhs[lhs.length - 1], + rhs[rhs.length - 1] + )) + return [false, xlhs]; + const lhsParams = lhs.slice(1, -1); + let rhsParams = rhs.slice(1, -1); + for (let i = 0; i <= lhsParams.length - 1; i++) { + if (rhsParams.length === 0) { + const lhsCtor = Array.isArray(lhsParams[i]) ? lhsParams[i][0] : null; + if (lhsCtor !== "Maybe") + return [false, xlhs]; + return [true, xlhs]; + } else { + let match2 = false; + [match2, rhsParams] = isSubdomainOf(rhsParams, lhsParams[i]); + if (!match2) + return [false, xlhs]; + } + } + return [rhsParams.length === 0, xlhs]; + } + if (rhsConstructor === "Intersection") { + return [ + rhs.slice(1, -1).every( + (x) => isSubdomainOf1(lhs, x) + ), + xlhs + ]; + } + if (rhsConstructor === "Union") { + return [ + rhs.slice(1, -1).some((x) => isSubdomainOf1(lhs, x)), + xlhs + ]; + } + if (rhsConstructor === "Maybe") { + if (lhsLiteral === "Nothing") + return [true, xlhs]; + return isSubdomainOf( + [lhs, ...xlhs], + rhs[1] + ); + } + if (rhsConstructor === "Sequence") { + const seq = rhs[1]; + if (!isSubdomainOf1(lhs, seq)) + return [false, xlhs]; + lhs = xlhs.shift(); + let match2 = true; + while (xlhs.length > 0 && match2) { + [match2, xlhs] = isSubdomainOf(xlhs, seq); + lhs = xlhs.shift(); + } + return [true, xlhs]; + } + if (rhsConstructor === "Tuple") { + if (!Array.isArray(lhs) || lhs[0] !== "Tuple") + return [false, xlhs]; + if (lhs.length > rhs.length) + return [false, xlhs]; + for (let i = 1; i <= rhs.length - 1; i++) { + if (!lhs[i] || !isSubdomainOf1( + lhs[i], + rhs[i] + )) + return [false, xlhs]; + } + return [true, xlhs]; + } + if (rhsConstructor === "Range") { + if (!Array.isArray(lhs) || lhs[0] !== "Range") + return [false, xlhs]; + const lhsMin = asFloat(lhs[1]); + const lhsMax = asFloat(lhs[2]); + const rhsMin = asFloat(rhs[1]); + const rhsMax = asFloat(rhs[2]); + return [ + lhsMin !== null && lhsMax !== null && rhsMin !== null && rhsMax !== null && lhsMin >= rhsMin && lhsMax <= rhsMax, + xlhs + ]; + } + if (rhsConstructor === "Interval") { + if (!Array.isArray(lhs) || lhs[0] !== "Interval") + return [false, xlhs]; + const lhsMin = asFloat(lhs[1]); + const lhsMax = asFloat(lhs[2]); + const rhsMin = asFloat(rhs[1]); + const rhsMax = asFloat(rhs[2]); + return [ + lhsMin !== null && lhsMax !== null && rhsMin !== null && rhsMax !== null && lhsMin >= rhsMin && lhsMax <= rhsMax, + xlhs + ]; + } + console.error("Unexpected domain constructor " + rhsConstructor); + return [false, xlhs]; +} +function sharedAncestorDomain(a, b) { + const aLiteral = domainLiteralAncestor(a); + const bLiteral = domainLiteralAncestor(b); + const aAncestors = [aLiteral, ...ancestors(aLiteral)]; + const bAncestors = [bLiteral, ...ancestors(bLiteral)]; + while (!bAncestors.includes(aAncestors[0])) + aAncestors.shift(); + return a.engine.domain(aAncestors[0]); +} +function domainLiteralAncestor(dom) { + let result = dom.literal; + if (result) + return result; + result = dom.ctor; + if (result === "Maybe") + return "Anything"; + if (result === "Interval") + return "RealNumber"; + if (result === "Range") + return "Integer"; + if (result === "Head") + return "Function"; + if (result === "Union") + return "Anything"; + if (result === "Intersection") + return "Anything"; + return result; +} +function serialize(ce, dom) { + if (dom instanceof AbstractBoxedExpression) + return dom.json; + if (typeof dom === "string") + return dom; + if (dom[0] === "InvalidDomain") { + return ["InvalidDomain", serialize(ce, dom[1])]; + } + const result = [serializeJsonSymbol(ce, dom[0])]; + if (dom.length > 1) + for (let i = 1; i <= dom.length - 1; i++) + result.push(serialize(ce, dom[i])); + return result; +} +function hash(dom) { + if (typeof dom === "string") + return "domain:" + dom; + let s = "domain:" + this.ctor; + for (const arg of this.domainArgs) + s += ":" + hash(arg); + return s; +} +function isEqual(lhs, rhs) { + if (typeof rhs === "string") + return this._value === rhs; + if (rhs instanceof _BoxedDomain) + return isEqual(lhs, rhs._value); + if (typeof lhs === "string") + return lhs === rhs; + /* @__PURE__ */ console.assert(Array.isArray(lhs)); + if (!Array.isArray(rhs)) + return false; + if (lhs[0] !== rhs[0]) + return false; + if (rhs.length !== lhs.length) + return false; + for (let i = 1; i <= lhs.length - 1; i++) { + if (lhs[i] instanceof AbstractBoxedExpression) { + if (!(rhs[i] instanceof AbstractBoxedExpression)) + return false; + if (!rhs[i].isEqual(rhs[i])) + return false; + } else if (typeof lhs[i] === "string") { + if (typeof rhs[i] !== "string") + return false; + if (lhs[i] !== rhs[i]) + return false; + } else if (!isEqual(lhs[i], rhs[i])) + return false; + } + return true; +} +function validateArgumentCount(ce, ops2, count) { + if (ops2.length === count) + return ops2; + const xs = [...ops2.slice(0, count)]; + let i = Math.min(count, ops2.length); + while (i < count) { + xs.push(ce.error("missing")); + i += 1; + } + while (i < ops2.length) { + xs.push(ce.error("unexpected-argument", ops2[i])); + i += 1; + } + return xs; +} +function validateNumericArgs(ce, ops2, count) { + if (!ce.strict) + return ops2; + let xs; + if (count === void 0) + xs = ops2; + else { + xs = []; + for (let i = 0; i <= Math.max(count - 1, ops2.length - 1); i++) { + if (i > count - 1) + xs.push(ce.error("unexpected-argument", ops2[i])); + else + xs.push(ops2[i] !== void 0 ? ce.box(ops2[i]) : ce.error("missing")); + } + } + return xs.map( + (op3) => op3 && !op3.isValid || op3.isNumber ? op3 : ce.error(["incompatible-domain", "Number", op3.domain], op3) + ); +} +function validateSignature(sig, ops2, codomain) { + const ce = sig.engine; + if (!ce.strict) + return ops2; + const opsDomain = ops2.map((x) => x.domain); + const targetSig = ce.domain([ + "Function", + ...opsDomain, + codomain != null ? codomain : "Anything" + ]); + if (sig.isCompatible(targetSig)) + return null; + const expectedArgs = sig.domainArgs.slice(0, -1); + const count = Math.max(expectedArgs.length, opsDomain.length); + let newOps = []; + let rest = [...ops2]; + for (let i = 0; i <= count - 1; i++) + [newOps, rest] = validateNextArgument( + ce, + expectedArgs[i], + newOps, + rest + ); + while (newOps.length > 0 && newOps[newOps.length - 1].symbol === "Nothing") + newOps.pop(); + return newOps; +} +function validateArgument(ce, arg, dom) { + if (dom === void 0) + return ce.error("unexpected-argument", arg); + if (arg === void 0) + return ce.error("missing"); + if (!arg.isValid) + return arg; + if (arg == null ? void 0 : arg.domain.isCompatible(dom)) + return arg; + return ce.error(["incompatible-domain", dom, arg.domain], arg); +} +function validateNextArgument(ce, dom, matched, ops2) { + let next = ops2.shift(); + if (dom === void 0) + return [[...matched, ce.error("unexpected-argument", next)], ops2]; + if (!Array.isArray(dom)) { + if (!next) + return [[...matched, ce.error("missing")], ops2]; + if (!next.domain.isCompatible(dom)) { + return [ + [...matched, ce.error(["incompatible-domain", dom, next.domain], next)], + ops2 + ]; + } + return [[...matched, next], ops2]; + } + const ctor = dom[0]; + if (next === void 0) { + let valid = false; + if (ctor === "Union") { + for (let k = 1; k <= dom.length - 1; k++) { + if (dom[k] === "Nothing") { + valid = true; + break; + } + } + } else if (ctor === "Maybe") + valid = true; + if (valid) + return [[...matched, ce.symbol("Nothing")], ops2]; + return [[...matched, ce.error("missing")], ops2]; + } + if (ctor === "Union") { + let found = false; + for (let k = 1; k <= dom.length - 1; k++) { + if (next.domain.isCompatible(dom[k])) { + found = true; + break; + } + } + if (found) + return [[...matched, next], ops2]; + return [ + [...matched, ce.error(["incompatible-domain", dom, next.domain], next)], + ops2 + ]; + } + if (ctor === "Sequence") { + const seq = dom[1]; + if (!next || !next.domain.isCompatible(seq)) { + return [ + [...matched, ce.error(["incompatible-domain", seq, next.domain], next)], + ops2 + ]; + } + let done = false; + const result = [...matched, next]; + while (!done) { + next = ops2.shift(); + if (!next) + done = false; + else if (!next.domain.isCompatible(seq)) { + ops2.unshift(next); + done = false; + } else + result.push(next); + } + return [result, ops2]; + } + if (ctor === "Maybe") { + if (next === void 0 || next.symbol === "Nothing") + return [[...matched, ce.symbol("Nothing")], ops2]; + return validateNextArgument(ce, dom[1], matched, [next, ...ops2]); + } + console.error("Unhandled ctor", ctor); + return [[...matched, next], ops2]; +} +function validateArguments(ce, args, doms) { + if (args.length === doms.length && args.every((x, i) => x.domain.isCompatible(doms[i]))) + return args; + const xs = []; + for (let i = 0; i <= doms.length - 1; i++) + xs.push(validateArgument(ce, args[i], doms[i])); + for (let i = doms.length; i <= args.length - 1; i++) + xs.push(ce.error("unexpected-argument", args[i])); + return xs; +} +function canonicalAdd(ce, ops2) { + /* @__PURE__ */ console.assert(ops2.every((x) => x.isCanonical)); + ops2 = ops2.filter((x) => x.numericValue === null || !x.isZero); + if (ops2.length === 0) + return ce.number(0); + if (ops2.length === 1) + return ops2[0]; + if (ops2.length === 2) { + let im = 0; + let re = 0; + re = asFloat(ops2[0]); + if (re !== null && re !== 0) + im = getImaginaryCoef(ops2[1]); + else { + im = getImaginaryCoef(ops2[0]); + if (im !== 0 && ops2[1].numericValue !== null) + re = asFloat(ops2[1]); + } + if (re !== null && im !== null && im !== 0) + return ce.number(ce.complex(re, im)); + } + if (ops2.length > 1) + ops2 = sortAdd(ce, ops2); + return ce._fn("Add", ops2); +} +function domainAdd(_ce, args) { + let dom = null; + for (const arg of args) { + if (!arg.isNumeric) + return null; + if (!dom) + dom = arg; + else + dom = sharedAncestorDomain(dom, arg); + } + return dom; +} +function simplifyAdd(ce, args) { + /* @__PURE__ */ console.assert(args.length > 1, `simplifyAdd: not enough args`); + const sum2 = new Sum(ce); + for (let arg of args) { + arg = arg.simplify(); + if (arg.isImaginary && arg.isInfinity) + return ce.symbol("ComplexInfinity"); + if (arg.isNaN || arg.symbol === "Undefined") + return ce._NAN; + if (!arg.isZero) + sum2.addTerm(arg); + } + return sum2.asExpression("expression"); +} +function evalAddNum(ops2) { + let sum2 = 0; + for (const op3 of ops2) { + const v = op3.numericValue; + if (typeof v === "number") + sum2 += v; + else + return null; + } + return sum2; +} +function evalAdd(ce, ops2, mode = "evaluate") { + if (mode === "N" && ce.numericMode === "machine") { + ops2 = ops2.map((x) => x.N()); + const sum2 = evalAddNum(ops2); + if (sum2 !== null) + return ce.number(sum2); + } + for (const arg of ops2) { + if (arg.isImaginary && arg.isInfinity) + return ce.symbol("ComplexInfinity"); + if (arg.isNaN || arg.symbol === "Undefined") + return ce._NAN; + if (!arg.isExact) + mode = "N"; + } + if (mode === "N") + ops2 = ops2.map((x) => x.N()); + else + ops2 = ops2.map((x) => x.evaluate()); + return new Sum(ce, ops2).asExpression(mode === "N" ? "numeric" : "expression"); +} +function canonicalSummation(ce, body, range) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i; + body != null ? body : body = ce.error("missing"); + let index = null; + let lower = null; + let upper = null; + if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { + index = range; + } else if (range) { + index = (_b = (_a = range.ops) == null ? void 0 : _a[0]) != null ? _b : null; + lower = (_e = (_d = (_c = range.ops) == null ? void 0 : _c[1]) == null ? void 0 : _d.canonical) != null ? _e : null; + upper = (_h = (_g = (_f = range.ops) == null ? void 0 : _f[2]) == null ? void 0 : _g.canonical) != null ? _h : null; + } + if ((index == null ? void 0 : index.head) === "Hold") + index = index.op1; + if ((index == null ? void 0 : index.head) === "ReleaseHold") + index = (_i = index.op1) == null ? void 0 : _i.evaluate(); + index != null ? index : index = ce.symbol("Nothing"); + if (!index.symbol) + index = ce.error(["incompatible-domain", "Symbol", index.domain]); + if (index.symbol) + ce.pushScope({ [index.symbol]: { domain: "Integer" } }); + const fn = body.canonical; + if (index.symbol) { + ce.popScope(); + index = index = ce.hold(index); + } + if (lower && lower.isFinite) + lower = validateArgument(ce, lower, "Integer"); + if (upper && upper.isFinite) + upper = validateArgument(ce, upper, "Integer"); + if (lower && upper) + range = ce.tuple([index, lower, upper]); + else if (upper) + range = ce.tuple([index, ce.number(1), upper]); + else if (lower) + range = ce.tuple([index, lower]); + else + range = index; + return ce._fn("Sum", [fn, range]); +} +function evalSummation(ce, expr, range, mode) { + var _a; + const [index, lower, upper, isFinite2] = normalizeLimits(range); + const fn = expr; + if (mode !== "N" && (lower >= upper || upper - lower >= MAX_SYMBOLIC_TERMS)) + return void 0; + let result = null; + const savedContext = ce.context; + ce.context = (_a = fn.scope) != null ? _a : ce.context; + if (mode === "simplify") { + const terms = []; + if (!fn.scope) + for (let i = lower; i <= upper; i++) + terms.push(fn.simplify()); + else + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + terms.push(fn.simplify()); + } + result = ce.add(terms).simplify(); + } + if (mode === "evaluate") { + const terms = []; + if (!fn.scope) + for (let i = lower; i <= upper; i++) + terms.push(fn.evaluate()); + else + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + terms.push(fn.evaluate()); + } + result = ce.add(terms).evaluate(); + } + if (mode === "N") { + if (result === null && !fn.scope) { + const n = fn.N(); + if (!isFinite2) { + if (n.isZero) + result = ce._ZERO; + else if (n.isPositive) + result = ce._POSITIVE_INFINITY; + else + result = ce._NEGATIVE_INFINITY; + } + if (result === null && fn.isPure) + result = ce.mul([ce.number(upper - lower + 1), n]); + } + if (result === null && isFinite2) { + if (bignumPreferred(ce)) { + let sum2 = ce.bignum(0); + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asBignum(fn.N()); + if (term === null) { + result = void 0; + break; + } + if (!term.isFinite()) { + sum2 = term; + break; + } + sum2 = sum2.add(term); + } + if (result === null) + result = ce.number(sum2); + } else { + const numericMode = ce.numericMode; + ce.numericMode = "machine"; + let sum2 = 0; + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asFloat(fn.N()); + if (term === null) { + result = void 0; + break; + } + if (!Number.isFinite(term)) { + sum2 = term; + break; + } + sum2 += term; + } + ce.numericMode = numericMode; + if (result === null) + result = ce.number(sum2); + } + } else if (result === null) { + ce.set({ [index]: 1e3 }); + const nMax = fn.N(); + ce.set({ [index]: 999 }); + const nMaxMinusOne = fn.N(); + const ratio = asFloat(ce.div(nMax, nMaxMinusOne).N()); + if (ratio !== null && Number.isFinite(ratio) && Math.abs(ratio) > 1) { + result = ce._POSITIVE_INFINITY; + } else { + let sum2 = 0; + const numericMode = ce.numericMode; + ce.numericMode = "machine"; + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asFloat(fn.N()); + if (term === null) { + result = void 0; + break; + } + if (Math.abs(term) < Number.EPSILON || !Number.isFinite(term)) + break; + sum2 += term; + } + ce.numericMode = numericMode; + if (result === null) + result = ce.number(sum2); + } + } + } + ce.context = savedContext; + return result != null ? result : void 0; +} +var import_complex9 = __toESM(require_complex()); +function negateLiteral(expr, metadata) { + let n = expr.numericValue; + if (n === null) + return null; + if (typeof n === "number") + n = -n; + else if (n instanceof decimal_default) + n = n.neg(); + else if (n instanceof import_complex9.Complex) + n = n.neg(); + else if (Array.isArray(n)) + n = neg(n); + return expr.engine.number(n, { metadata }); +} +function canonicalNegate(expr, metadata) { + if (expr.head === "Negate") + return expr.op1; + if (expr.numericValue !== null) + return negateLiteral(expr, metadata); + if (expr.head === "Add") { + let ops2 = expr.ops.map((x) => canonicalNegate(x)); + ops2 = flattenOps(ops2, "Add"); + return expr.engine.add(ops2, metadata); + } + if (expr.head === "Multiply") { + return negateProduct(expr.engine, expr.ops); + } + if (expr.head === "Divide") + return expr.engine._fn("Divide", [canonicalNegate(expr.op1), expr.op2]); + /* @__PURE__ */ console.assert(expr.head !== "Subtract"); + return expr.engine._fn("Negate", [expr], metadata); +} +function negateProduct(ce, args) { + let result = []; + let done = false; + for (const arg of args) { + if (!done && arg.head === "Negate") { + done = true; + result.push(arg.op1); + } else + result.push(arg); + } + if (done) + return ce.mul(result); + result = []; + for (const arg of args) { + if (done || arg.numericValue === null || !arg.isInteger) + result.push(arg); + else { + done = true; + result.push(canonicalNegate(arg)); + } + } + if (done) + return ce.mul(result); + result = []; + for (const arg of args) { + if (done || arg.numericValue === null || !arg.isNumber) + result.push(arg); + else { + done = true; + result.push(canonicalNegate(arg)); + } + } + if (done) + return ce.mul(result); + return ce._fn("Negate", [ce._fn("Multiply", args)]); +} +function processNegate(_ce, x, _mode = "simplify") { + return canonicalNegate(x); +} +function distribute2(lhs, rhs) { + if (lhs.head === "Negate" && rhs.head === "Negate") + return distribute2(lhs.op1, rhs.op1); + if (lhs.head === "Negate") + return canonicalNegate(distribute2(lhs.op1, rhs)); + if (rhs.head === "Negate") + return canonicalNegate(distribute2(lhs, rhs.op1)); + const ce = lhs.engine; + if (lhs.head === "Divide" && rhs.head === "Divide") { + const denom = ce.mul([lhs.op2, rhs.op2]); + return ce.div(distribute2(lhs.op1, rhs.op1), denom); + } + if (lhs.head === "Divide") + return ce.div(distribute2(lhs.op1, rhs), lhs.op2); + if (rhs.head === "Divide") + return ce.div(distribute2(lhs, rhs.op1), rhs.op2); + if (lhs.head === "Add") + return ce.add(lhs.ops.map((x) => distribute2(x, rhs))); + if (rhs.head === "Add") + return ce.add(rhs.ops.map((x) => distribute2(lhs, x))); + return ce.mul([lhs, rhs]); +} +function distribute(expr) { + if (expr.length === 1) + return expr[0]; + if (expr.length === 2) + return distribute2(expr[0], expr[1]); + return distribute2(expr[0], distribute(expr.slice(1))); +} +var binomials = [ + [1], + [1, 1], + [1, 2, 1], + [1, 3, 3, 1], + [1, 4, 6, 4, 1], + [1, 5, 10, 10, 5, 1], + [1, 6, 15, 20, 15, 6, 1], + [1, 7, 21, 35, 35, 21, 7, 1], + [1, 8, 28, 56, 70, 56, 28, 8, 1] +]; +function choose(n, k) { + while (n >= binomials.length) { + const s = binomials.length; + const nextRow = [1]; + const prev = binomials[s - 1]; + for (let i = 1; i < s; i++) + nextRow[i] = prev[i - 1] + prev[i]; + nextRow[s] = 1; + binomials.push(nextRow); + } + return binomials[n][k]; +} +function multinomialCoefficient(k) { + let n = k.reduce((acc, v) => acc + v, 0); + let prod = 1; + for (let i = 0; i < k.length; i += 1) { + prod *= choose(n, k[i]); + n -= k[i]; + } + return prod; +} +function* powers(n, exp2) { + if (n === 1) { + yield [exp2]; + return; + } + for (let i = 0; i <= exp2; i += 1) + for (const p of powers(n - 1, exp2 - i)) + yield [i, ...p]; +} +function expandMultinomial(expr) { + if (expr.head !== "Power") + return null; + const exp2 = asSmallInteger(expr.op2); + if (exp2 === null || exp2 < 0) + return null; + if (exp2 === 0) + return expr.engine._ONE; + if (exp2 === 1) + return expr.op1; + const ce = expr.engine; + if (expr.op1.head === "Negate") { + const sign2 = exp2 % 2 === 0 ? 1 : -1; + const result2 = expandMultinomial(ce.pow(expr.op1.op1, expr.op2)); + if (result2 === null) + return null; + if (sign2 > 0) + return result2; + return ce.neg(result2); + } + /* @__PURE__ */ console.assert(expr.op1.head !== "Subtract"); + if (expr.op1.head !== "Add") + return null; + const terms = expr.op1.ops; + const it = powers(terms.length, exp2); + const result = []; + for (const val of it) { + const product = [ce.number(multinomialCoefficient(val))]; + for (let i = 0; i < val.length; i += 1) { + if (val[i] !== 0) { + if (val[i] === 1) + product.push(terms[i]); + else + product.push(ce.pow(terms[i], val[i])); + } + } + result.push(ce.mul(product)); + } + return ce.add(result); +} +function expandNumerator(expr) { + if (expr.head !== "Divide") + return null; + const expandedNumerator = expand2(expr.op1); + if (expandedNumerator === null) + return null; + const ce = expr.engine; + if (expandedNumerator.head === "Add") { + return ce.add(expandedNumerator.ops.map((x) => ce.div(x, expr.op2))); + } + return expr.engine.div(expandedNumerator, expr.op2); +} +function expand2(expr) { + if (!expr) + return null; + let result = expandNumerator(expr); + if (result !== null) + return result; + if (expr.head === "Multiply") { + result = distribute(expr.ops); + if (result !== null) + return result; + } + if (expr.head === "Add") { + const ops2 = expr.ops.map((x) => { + var _a; + return (_a = expand2(x)) != null ? _a : x; + }); + return simplifyAdd(expr.engine, ops2); + } + if (expr.head === "Negate") { + result = expand2(expr.op1); + if (result !== null) + return expr.engine.neg(result); + } + if (expr.head === "Power") { + result = expandMultinomial(expr); + if (result !== null) + return result; + } + return null; +} +var UNIVARIATE_ROOTS = [ + // ax = 0 + [["Multiply", "_x", "_a"], 0], + // x + a = 0 + [ + ["Add", "_a", "_x"], + ["Negate", "_a"] + ], + [["Add", ["Negate", "_x"], "_a"], "_a"], + // ax + b = 0 + [ + ["Add", ["Multiply", "_x", "_a"], "_b"], + ["Divide", ["Negate", "_b"], "_a"] + ], + // Quadratic formula (real) + // ax^2 + bx + c = 0 + [ + [ + "Add", + ["Multiply", ["Power", "_x", 2], "_a"], + ["Multiply", "_x", "_b"], + "_c" + ], + [ + "Divide", + [ + "Add", + ["Negate", "_b"], + ["Sqrt", ["Subtract", ["Square", "_b"], ["Multiply", 4, "_a", "_c"]]] + ], + ["Multiply", 2, "_a"] + ] + // (_ce, vars): boolean => vars.x.isReal === true, + ], + [ + [ + "Add", + ["Multiply", ["Power", "_x", 2], "_a"], + ["Multiply", "_x", "_b"], + "_c" + ], + [ + "Divide", + [ + "Subtract", + ["Negate", "_b"], + ["Sqrt", ["Subtract", ["Square", "_b"], ["Multiply", 4, "_a", "_c"]]] + ], + ["Multiply", 2, "_a"] + ] + // (_ce, vars): boolean => vars.x.isReal === true, + ], + // ax^2 + bx = 0 + [ + ["Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"]], + 0 + // (_ce, vars): boolean => vars.x.isReal === true, + ], + [ + ["Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"]], + ["Divide", ["Negate", "_b"], "_a"] + // (_ce, vars): boolean => vars.x.isReal === true, + ], + // ax^2 + b = 0 + [ + ["Add", ["Multiply", ["Power", "_x", 2], "_a"], "_b"], + ["Sqrt", ["Divide", ["Negate", "_b"], "_a"]] + // (_ce, vars): boolean => vars.x.isReal === true, + ], + [ + ["Add", ["Multiply", ["Power", "_x", 2], "_a"], "_b"], + ["Negate", ["Sqrt", ["Divide", ["Negate", "_b"], "_a"]]] + // (_ce, vars): boolean => vars.x.isReal === true, + ] + // Quadratic formula (complex) + // [ + // '$ax^2 + bx + c$', + // [ + // '$-\\frac{b}{2a} - \\imaginaryI \\frac{\\sqrt{4ac - b^2}}{2a}$', + // '$-\\frac{b}{2a} + \\imaginaryI \\frac{\\sqrt{4ac - b^2}}{2a}$', + // ], + // (_ce, vars): boolean => vars.x.isImaginary === true, + // ], +]; +function findUnivariateRoots(expr, x) { + const ce = expr.engine; + if (expr.head === "Equal") { + expr = ce.add([expr.op1.canonical, ce.neg(expr.op2.canonical)]).simplify(); + } + const rules = ce.cache( + "univariate-roots-rules", + () => boxRules(ce, UNIVARIATE_ROOTS) + ); + let result = matchRules( + expr.subs({ [x]: "_x" }, { canonical: false }), + rules, + { _x: ce.symbol("_x") } + ); + if (result.length === 0) { + const expandedExpr = expand2(expr.canonical); + if (expandedExpr === null) + return []; + result = matchRules( + expandedExpr.subs({ [x]: "_x" }, { canonical: false }), + rules, + { + _x: ce.symbol("_x") + } + ); + } + return result.map((x2) => x2.canonical.evaluate()); +} +function assume(proposition) { + if (proposition.head === "Element") + return assumeElement(proposition); + if (proposition.head === "Equal") + return assumeEquality(proposition); + if (isInequality(proposition)) + return assumeInequality(proposition); + return "not-a-predicate"; +} +function assumeEquality(proposition) { + /* @__PURE__ */ console.assert(proposition.head === "Equal"); + const freeVars = proposition.freeVars; + if (freeVars.length === 0) { + const val = proposition.evaluate(); + if (val.symbol === "True") + return "tautology"; + if (val.symbol === "False") + return "contradiction"; + /* @__PURE__ */ console.log(proposition.canonical.evaluate()); + return "not-a-predicate"; + } + const ce = proposition.engine; + const lhs = proposition.op1.symbol; + if (lhs && !hasValue(ce, lhs) && !proposition.op2.has(lhs)) { + const val = proposition.op2.evaluate(); + if (!val.isValid) + return "not-a-predicate"; + const def = ce.lookupSymbol(lhs); + if (!def) { + ce.defineSymbol(lhs, { value: val }); + return "ok"; + } + if (def.domain && !val.domain.isCompatible(def.domain)) + return "contradiction"; + def.value = val; + return "ok"; + } + if (freeVars.length === 1) { + const lhs2 = freeVars[0]; + const sols = findUnivariateRoots(proposition, lhs2); + if (sols.length === 0) { + ce.assumptions.set( + ce.fn("Equal", [ + ce.add([proposition.op1.canonical, ce.neg(proposition.op2.canonical)]).simplify(), + 0 + ]), + true + ); + } + const val = sols.length === 1 ? sols[0] : ce.fn("List", sols); + const def = ce.lookupSymbol(lhs2); + if (!def) { + ce.defineSymbol(lhs2, { value: val }); + return "ok"; + } + if (def.domain && !sols.every((sol) => val.domain.isCompatible(sol.domain))) + return "contradiction"; + def.value = val; + return "ok"; + } + ce.assumptions.set(proposition, true); + return "ok"; +} +function assumeInequality(proposition) { + const ce = proposition.engine; + if (proposition.op1.symbol && !hasDef(ce, proposition.op1.symbol)) { + if (proposition.op2.evaluate().isZero) { + if (proposition.head === "Less") { + ce.defineSymbol(proposition.op1.symbol, { + domain: ce.domain("NegativeNumber") + }); + } else if (proposition.head === "LessEqual") { + ce.defineSymbol(proposition.op1.symbol, { + domain: ce.domain("NonPositiveNumber") + }); + } else if (proposition.head === "Greater") { + ce.defineSymbol(proposition.op1.symbol, { + domain: ce.domain("PositiveNumber") + }); + } else if (proposition.head === "GreaterEqual") { + ce.defineSymbol(proposition.op1.symbol, { + domain: ce.domain("NonNegativeNumber") + }); + } + } else { + ce.defineSymbol(proposition.op1.symbol, { + domain: ce.domain("ExtendedRealNumber") + }); + ce.assumptions.set(proposition, true); + } + return "ok"; + } + let op3 = ""; + let lhs; + let rhs; + if (proposition.head === "Less") { + lhs = proposition.op1; + rhs = proposition.op2; + op3 = "<"; + } else if (proposition.head === "LessEqual") { + lhs = proposition.op1; + rhs = proposition.op2; + op3 = "<="; + } else if (proposition.head === "Greater") { + lhs = proposition.op2; + rhs = proposition.op1; + op3 = "<"; + } else if (proposition.head === "GreaterEqual") { + lhs = proposition.op2; + rhs = proposition.op1; + op3 = "<="; + } + if (!op3) + return "internal-error"; + const p = ce.add([lhs.canonical, ce.neg(rhs.canonical)]).simplify(); + const result = ce.box([op3 === "<" ? "Less" : "LessEqual", p, 0]).evaluate(); + if (result.symbol === "True") + return "tautology"; + if (result.symbol === "False") + return "contradiction"; + const freeVars = result.freeVars; + if (freeVars.length === 0) + return "not-a-predicate"; + if (freeVars.length === 1) { + if (!ce.lookupSymbol(freeVars[0])) + ce.defineSymbol(freeVars[0], { domain: "ExtendedRealNumber" }); + } + /* @__PURE__ */ console.assert(result.head === "Less" || result.head === "LessEqual"); + ce.assumptions.set(result, true); + return "ok"; +} +function assumeElement(proposition) { + var _a; + /* @__PURE__ */ console.assert(proposition.head === "Element"); + const ce = proposition.engine; + const undefs = undefinedIdentifiers(proposition.op1); + if (undefs.length === 1) { + const dom = ce.domain(proposition.op2.evaluate().json); + if (!dom.isValid) + return "not-a-predicate"; + if (dom.isCompatible("Function")) + ce.defineFunction(undefs[0], { signature: { domain: "Function" } }); + else + ce.defineSymbol(undefs[0], { domain: dom }); + return "ok"; + } + if (proposition.op1.symbol && hasDef(ce, proposition.op1.symbol)) { + const dom = ce.domain(proposition.op2.evaluate().json); + if (!dom.isValid) + return "not-a-predicate"; + const def = ce.lookupSymbol(proposition.op1.symbol); + if (def) { + if (def.domain && !dom.isCompatible(def.domain)) + return "contradiction"; + def.domain = dom; + return "ok"; + } + const fdef = ce.lookupFunction(proposition.op1.symbol); + if ((_a = fdef == null ? void 0 : fdef.signature) == null ? void 0 : _a.domain) { + if (!dom.isCompatible(fdef.signature.domain)) + return "contradiction"; + if (dom.isCompatible(fdef.signature.domain, "bivariant")) + return "tautology"; + return "not-a-predicate"; + } + return "ok"; + } + if (undefs.length > 0) { + ce.assumptions.set(proposition, true); + return "ok"; + } + const val = proposition.evaluate(); + if (val.symbol === "True") + return "tautology"; + if (val.symbol === "False") + return "contradiction"; + return "not-a-predicate"; +} +function hasDef(ce, s) { + var _a; + return ((_a = ce.lookupSymbol(s)) != null ? _a : ce.lookupFunction(s)) !== void 0; +} +function undefinedIdentifiers(expr) { + return expr.symbols.filter((x) => !hasDef(expr.engine, x)); +} +function hasValue(ce, s) { + var _a; + if (ce.lookupFunction(s)) + return false; + return ((_a = ce.lookupSymbol(s)) == null ? void 0 : _a.value) !== void 0; +} +function isInequality(expr) { + const h = expr.head; + if (typeof h !== "string") + return false; + return ["Less", "Greater", "LessEqual", "GreaterEqual"].includes(h); +} +var import_complex13 = __toESM(require_complex()); +var BoxedDictionary = class _BoxedDictionary extends AbstractBoxedExpression { + constructor(ce, dict, options) { + var _a; + options != null ? options : options = {}; + super(ce, options.metadata); + this._value = /* @__PURE__ */ new Map(); + const canonical2 = (_a = options.canonical) != null ? _a : true; + for (const key of Object.keys(dict)) + this._value.set(key, ce.box(dict[key], { canonical: canonical2 })); + ce._register(this); + } + unbind() { + for (const [_k, v] of this._value) + v.unbind(); + return void 0; + } + get hash() { + let h = hashCode("Dictionary"); + for (const [k, v] of this._value) + h ^= hashCode(k) ^ v.hash; + return h; + } + get complexity() { + return 97; + } + get head() { + return "Dictionary"; + } + get isPure() { + return false; + } + getKey(key) { + return this._value.get(key); + } + hasKey(key) { + return this._value.has(key); + } + get keys() { + return this._value.keys(); + } + get keysCount() { + return this._value.size; + } + has(x) { + for (const [_k, v] of this._value) + if (v.has(x)) + return true; + return false; + } + get domain() { + const result = ["Dictionary"]; + for (const [k, v] of this._value) + result.push(["Tuple", k, v.domain]); + return this.engine.domain(result); + } + get json() { + if (this.engine.jsonSerializationOptions.shorthands.includes("dictionary")) { + const dict = {}; + for (const key of this._value.keys()) + dict[key] = this._value.get(key).json; + return { dict }; + } + const kvs = []; + for (const key of this._value.keys()) + kvs.push( + this.engine._fn("KeyValuePair", [ + this.engine.string(key), + this._value.get(key) + ]) + ); + return serializeJsonFunction(this.engine, "Dictionary", kvs, { + latex: this._latex + }); + } + /** Structural equality */ + isSame(rhs) { + if (this === rhs) + return true; + if (!(rhs instanceof _BoxedDictionary)) + return false; + if (this._value.size !== rhs._value.size) + return false; + for (const [k, v] of this._value) { + const rhsV = rhs.getKey(k); + if (!rhsV || !v.isSame(rhsV)) + return false; + } + return true; + } + match(rhs, _options) { + if (!(rhs instanceof _BoxedDictionary)) + return null; + if (this._value.size !== rhs._value.size) + return null; + let result = {}; + for (const [k, v] of this._value) { + const rhsV = rhs.getKey(k); + if (!rhsV) + return null; + const m = v.match(rhsV); + if (m === null) + return null; + result = { ...result, ...m }; + } + return result; + } + /** Mathematical equality */ + isEqual(rhs) { + if (this === rhs) + return true; + if (!(rhs instanceof _BoxedDictionary)) + return false; + if (!rhs.keys || this._value.size !== rhs._value.size) + return false; + for (const [k, v] of this._value) { + const rhsV = rhs.getKey(k); + if (!rhsV || !v.isEqual(rhsV)) + return false; + } + return true; + } + apply(fn, head2) { + const result = {}; + for (const key of this.keys) + result[key] = this.engine.box(fn(this.getKey(key))); + if (head2) + return this.engine.fn(head2, [{ dict: result }]); + return new _BoxedDictionary(this.engine, result); + } + evaluate(options) { + return this.apply((x) => { + var _a; + return (_a = x.evaluate(options)) != null ? _a : x; + }); + } + get isCanonical() { + return this._isCanonical; + } + set isCanonical(val) { + this._isCanonical = val; + } + get canonical() { + if (this.isCanonical) + return this; + const result = this.apply((x) => x.canonical); + result.isCanonical = true; + return result; + } + simplify(options) { + var _a; + if (!((_a = options == null ? void 0 : options.recursive) != null ? _a : true)) + return this; + return this.apply((x) => { + var _a2; + return (_a2 = x.simplify(options)) != null ? _a2 : x; + }); + } + N(options) { + return this.apply((x) => x.N(options)); + } + replace(rules, options) { + let changeCount = 0; + const result = {}; + for (const key of this.keys) { + const val = this.getKey(key); + const newVal = val.replace(rules, options); + if (newVal !== null) + changeCount += 1; + result[key] = newVal != null ? newVal : val; + } + return changeCount === 0 ? null : new _BoxedDictionary(this.engine, result); + } + subs(sub2, options) { + const result = {}; + for (const key of this.keys) + result[key] = this.getKey(key).subs(sub2, options); + return new _BoxedDictionary(this.engine, result, options); + } +}; +var import_complex10 = __toESM(require_complex()); +var SIMPLIFY_RULES = []; +function cheapest(oldExpr, newExpr) { + if (newExpr === null || newExpr === void 0) + return oldExpr; + if (oldExpr === newExpr) + return oldExpr; + const ce = oldExpr.engine; + const boxedNewExpr = ce.box(newExpr); + if (ce.costFunction(boxedNewExpr) <= 1.2 * ce.costFunction(oldExpr)) { + return boxedNewExpr; + } + return oldExpr; +} +var BoxedFunction = class _BoxedFunction extends AbstractBoxedExpression { + constructor(ce, head2, ops2, options) { + var _a, _b, _c, _d, _e; + options != null ? options : options = {}; + (_a = options.canonical) != null ? _a : options.canonical = false; + super(ce, options.metadata); + this._scope = ce.context; + this._head = head2; + this._ops = ops2; + this._def = (_b = options.def) != null ? _b : null; + if (options.canonical) { + if (!this._def) + this._def = ce.lookupFunction(head2, ce.context); + this._canonical = this; + } + this._codomain = null; + if (!options.canonical) { + this._codomain = ce.domain("Anything"); + } else { + if (typeof this._head !== "string") + this._codomain = this._head.domain.codomain; + else if (this._def) { + const sig = this._def.signature; + if (typeof sig.codomain === "function") { + this._codomain = (_c = sig.codomain(ce, this._ops)) != null ? _c : null; + } else { + this._codomain = (_d = sig.codomain) != null ? _d : null; + } + } + if (!this._codomain) + this._codomain = (_e = ce.defaultDomain) != null ? _e : ce.domain("Void"); + } + ce._register(this); + } + // + // NON-CANONICAL OR CANONICAL OPERATIONS + // + // Those operations/properties can be applied to a canonical or + // non-canonical expression + // + get hash() { + if (this._hash !== void 0) + return this._hash; + let h = 0; + for (const op3 of this._ops) + h = h << 1 ^ op3.hash | 0; + if (typeof this._head === "string") + h = h ^ hashCode(this._head) | 0; + else + h = h ^ this._head.hash | 0; + this._hash = h; + return h; + } + get isCanonical() { + return this._canonical === this; + } + set isCanonical(val) { + this._canonical = val ? this : void 0; + } + get isPure() { + var _a; + if (this._isPure !== void 0) + return this._isPure; + if (!this.isCanonical) { + this._isPure = false; + return false; + } + let result = void 0; + if (((_a = this.functionDefinition) == null ? void 0 : _a.pure) !== void 0) + result = this.functionDefinition.pure; + if (result !== false) + result = this._ops.every((x) => x.isPure); + this._isPure = result; + return result; + } + get json() { + if (this.isValid && this._canonical === this) + return serializeJsonCanonicalFunction( + this.engine, + this._head, + this._ops, + { latex: this._latex, wikidata: this._wikidata } + ); + return serializeJsonFunction(this.engine, this._head, this._ops, { + latex: this._latex, + wikidata: this._wikidata + }); + } + get rawJson() { + const head2 = typeof this._head === "string" ? this._head : this._head.json; + return [head2, ...this.ops.map((x) => x.rawJson)]; + } + get scope() { + return this._scope; + } + get head() { + return this._head; + } + get ops() { + return this._ops; + } + get nops() { + return this._ops.length; + } + get op1() { + var _a; + return (_a = this._ops[0]) != null ? _a : this.engine.symbol("Nothing"); + } + get op2() { + var _a; + return (_a = this._ops[1]) != null ? _a : this.engine.symbol("Nothing"); + } + get op3() { + var _a; + return (_a = this._ops[2]) != null ? _a : this.engine.symbol("Nothing"); + } + get isValid() { + if (this._head === "Error") + return false; + if (typeof this._head !== "string" && !this._head.isValid) + return false; + return this._ops.every((x) => x.isValid); + } + get canonical() { + if (this._canonical) + return this._canonical; + this._canonical = this.isValid ? makeCanonicalFunction(this.engine, this._head, this._ops) : this; + return this._canonical; + } + *map(fn) { + let i = 0; + while (i < this._ops.length) + yield fn(this._ops[i++]); + } + subs(sub2, options) { + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + const ops2 = this._ops.map((x) => x.subs(sub2, options)); + if (options.canonical && ops2.every((x) => x.isValid)) + return makeCanonicalFunction(this.engine, this._head, ops2); + return new _BoxedFunction(this.engine, this._head, ops2, { + canonical: false + }); + } + replace(rules, options) { + return replace(this, rules, options); + } + has(x) { + if (typeof this._head === "string") { + if (typeof x === "string") { + if (this._head === x) + return true; + } else if (x.includes(this._head)) + return true; + } + for (const arg of this._ops) + if (arg.has(x)) + return true; + return false; + } + /** `isSame` is structural/symbolic equality */ + isSame(rhs) { + if (this === rhs) + return true; + if (!(rhs instanceof _BoxedFunction)) + return false; + if (this.nops !== rhs.nops) + return false; + if (typeof this.head === "string") { + if (this.head !== rhs.head) + return false; + } else { + if (typeof rhs.head === "string") + return false; + else if (!rhs.head || !this.head.isSame(rhs.head)) + return false; + } + const lhsTail = this._ops; + const rhsTail = rhs._ops; + for (let i = 0; i < lhsTail.length; i++) + if (!lhsTail[i].isSame(rhsTail[i])) + return false; + return true; + } + match(rhs, options) { + if (!(rhs instanceof _BoxedFunction)) + return null; + let result = {}; + if (typeof this.head === "string") { + if (this.head !== rhs.head) + return null; + } else { + if (typeof rhs.head === "string") + return null; + else { + if (!rhs.head) + return null; + const m = this.head.match(rhs.head, options); + if (m === null) + return null; + result = { ...result, ...m }; + } + } + const lhsTail = this._ops; + const rhsTail = rhs._ops; + for (let i = 0; i < lhsTail.length; i++) { + const m = lhsTail[i].match(rhsTail[i], options); + if (m === null) + return null; + result = { ...result, ...m }; + } + return result; + } + // + // CANONICAL OPERATIONS + // + // These operations apply only to canonical expressions + // + unbind() { + this._value = void 0; + this._numericValue = void 0; + } + get wikidata() { + var _a, _b, _c; + if (!this.isCanonical) + return void 0; + return (_c = (_b = this._wikidata) != null ? _b : (_a = this.functionDefinition) == null ? void 0 : _a.wikidata) != null ? _c : void 0; + } + get description() { + if (!this.isCanonical) + return void 0; + const def = this.functionDefinition; + if (!def) + return []; + if (!def.description) + return void 0; + if (typeof def.description === "string") + return [def.description]; + return def.description; + } + get url() { + var _a, _b; + if (!this.isCanonical) + return ""; + return (_b = (_a = this.functionDefinition) == null ? void 0 : _a.url) != null ? _b : void 0; + } + get complexity() { + var _a, _b; + if (!this.isCanonical) + return void 0; + return (_b = (_a = this.functionDefinition) == null ? void 0 : _a.complexity) != null ? _b : DEFAULT_COMPLEXITY; + } + get functionDefinition() { + if (!this.isCanonical) + return void 0; + if (this._def !== null) + return this._def; + return void 0; + } + bind(_scope) { + } + get value() { + if (!this.isCanonical || !this.isPure) + return void 0; + if (!this._value) + this._value = this.evaluate(); + return this._value; + } + /** `isEqual` is mathematical equality */ + isEqual(rhs) { + const s = signDiff(this, rhs); + if (s === 0) + return true; + if (s !== void 0) + return false; + const diff = this.engine.box(["Subtract", this, rhs]).simplify(); + if (diff.isZero) + return true; + return this.isSame(rhs); + } + isLess(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s < 0; + } + isLessEqual(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s <= 0; + } + isGreater(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s > 0; + } + isGreaterEqual(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s >= 0; + } + get isZero() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s === 0; + return void 0; + } + get isNotZero() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s !== 0; + return void 0; + } + get isOne() { + return this.isEqual(this.engine._ONE); + } + get isNegativeOne() { + return this.isEqual(this.engine._NEGATIVE_ONE); + } + // x > 0 + get isPositive() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s > 0; + return void 0; + } + // x <= 0 + get isNonPositive() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s <= 0; + return void 0; + } + // x < 0 + get isNegative() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s < 0; + return void 0; + } + // x >= 0 + get isNonNegative() { + const s = this.sgn; + if (s === null) + return false; + if (typeof s === "number") + return s >= 0; + return void 0; + } + get isNumber() { + return this.domain.isCompatible("Number"); + } + get isInteger() { + return this.domain.isCompatible("Integer"); + } + get isRational() { + return this.domain.isCompatible("RationalNumber"); + } + get isAlgebraic() { + return this.domain.isCompatible("AlgebraicNumber"); + } + get isReal() { + return this.domain.isCompatible("RealNumber"); + } + get isExtendedReal() { + return this.domain.isCompatible("ExtendedRealNumber"); + } + get isComplex() { + return this.domain.isCompatible("ComplexNumber"); + } + get isImaginary() { + return this.domain.isCompatible("ImaginaryNumber"); + } + get sgn() { + var _a, _b, _c, _d, _e, _f, _g, _h; + if (!this.isCanonical) + return void 0; + const head2 = this.head; + if (head2 === "Negate") { + const s = (_a = this._ops[0]) == null ? void 0 : _a.sgn; + if (s === void 0) + return void 0; + if (s === null) + return null; + return s === 0 ? 0 : s > 0 ? -1 : 1; + } + if (head2 === "Multiply") { + const total = this._ops.reduce((acc, x) => { + var _a2; + return acc * ((_a2 = x.sgn) != null ? _a2 : NaN); + }, 1); + if (isNaN(total)) + return null; + if (total > 0) + return 1; + if (total < 0) + return -1; + return 0; + } + if (head2 === "Add") { + let posCount = 0; + let negCount = 0; + let zeroCount = 0; + const count = this._ops.length; + for (const op3 of this._ops) { + const s = op3.sgn; + if (s === null || s === void 0) + break; + if (s === 0) + zeroCount += 1; + if (s > 0) + posCount += 1; + if (s < 0) + negCount += 1; + } + if (zeroCount === count) + return 0; + if (posCount === count) + return 1; + if (negCount === count) + return -1; + return null; + } + if (head2 === "Divide") { + const n = (_b = this._ops[0]) == null ? void 0 : _b.sgn; + const d = (_c = this._ops[1]) == null ? void 0 : _c.sgn; + if (n === null || d === null || n === void 0 || d === void 0) + return null; + if (n === 0) + return 0; + if (n > 0 && d > 0 || n < 0 && d < 0) + return 1; + return -1; + } + if (head2 === "Square") { + if ((_d = this._ops[0]) == null ? void 0 : _d.isImaginary) + return -1; + if ((_e = this._ops[0]) == null ? void 0 : _e.isZero) + return 0; + return 1; + } + if (head2 === "Abs") { + if ((_f = this._ops[0]) == null ? void 0 : _f.isZero) + return 0; + return 1; + } + if (head2 === "Sqrt") { + if ((_g = this._ops[0]) == null ? void 0 : _g.isZero) + return 0; + if ((_h = this._ops[0]) == null ? void 0 : _h.isImaginary) + return null; + return 1; + } + if (head2 === "Power") { + } + if (head2 === "Root") { + } + if (head2 === "Ln") { + } + if (head2 === "Floor") { + } + if (head2 === "Ceil") { + } + if (head2 === "Round") { + } + const v = asFloat(this.N()); + if (v === null) + return void 0; + if (v === 0) + return 0; + if (v < 0) + return -1; + return 1; + } + // + // AUTO-CANONICAL OPERATIONS + // + // The operations are automatically done on the canonical form of the + // expression + // + get domain() { + return this._codomain; + } + // simplify(options?: SimplifyOptions): BoxedExpression { + // const result = this.simplifyAll(options); + // if (result.length === 1) return result[0]; + // const ce = this.engine; + // result.sort((a, b) => { + // if (a === b) return 0; + // return ce.costFunction(a) - ce.costFunction(b); + // }); + // return result[0]; + // } + simplify(options) { + var _a, _b, _c, _d, _e; + if (!this.isValid) + return this; + if (!this.isCanonical) { + const canonical2 = this.canonical; + if (!canonical2.isCanonical || !canonical2.isValid) + return this; + return canonical2.simplify(options); + } + const recursive = (_a = options == null ? void 0 : options.recursive) != null ? _a : true; + let expr; + if (recursive) { + expr = expand2(this); + if (expr !== null) { + expr = expr.simplify({ ...options, recursive: false }); + return cheapest(this, expr); + } + } + const def = this.functionDefinition; + const tail = recursive ? holdMap( + this._ops, + (_b = def == null ? void 0 : def.hold) != null ? _b : "none", + (def == null ? void 0 : def.associative) ? def.name : "", + (x) => x.simplify(options) + ) : this._ops; + if (typeof this._head !== "string") { + const expr2 = apply(this._head, tail); + if (typeof expr2.head !== "string") + return expr2; + return expr2.simplify(options); + } + if (def) { + if (def.inert) + expr = (_d = (_c = tail[0]) == null ? void 0 : _c.canonical) != null ? _d : this; + else { + const sig = def.signature; + if (sig == null ? void 0 : sig.simplify) + expr = sig.simplify(this.engine, tail); + } + } + if (!expr) + expr = this.engine.fn(this._head, tail); + else + expr = cheapest(this.engine.fn(this._head, tail), expr); + expr = cheapest(this, expr); + const rules = (_e = options == null ? void 0 : options.rules) != null ? _e : this.engine.cache( + "standard-simplification-rules", + () => boxRules(this.engine, SIMPLIFY_RULES), + (rules2) => { + for (const [lhs, rhs, _priority, _condition] of rules2) { + lhs.unbind(); + rhs.unbind(); + } + return rules2; + } + ); + let iterationCount = 0; + let done = false; + do { + const newExpr = expr.replace(rules); + if (newExpr !== null) { + expr = cheapest(expr, newExpr); + if (expr === newExpr) + done = true; + } else + done = true; + iterationCount += 1; + } while (!done && iterationCount < this.engine.iterationLimit); + return cheapest(this, expr); + } + evaluate(options) { + var _a, _b, _c; + if (!this.isValid) + return this; + if (!this.isCanonical) { + const canonical2 = this.canonical; + if (!canonical2.isCanonical || !canonical2.isValid) + return this; + return canonical2.evaluate(options); + } + const def = this.functionDefinition; + const tail = holdMap( + this._ops, + (_a = def == null ? void 0 : def.hold) != null ? _a : "none", + (def == null ? void 0 : def.associative) ? def.name : "", + (x) => x.evaluate(options) + ); + if (typeof this._head !== "string") { + const expr = apply(this._head, tail); + if (typeof expr.head !== "string") + return expr; + return expr.evaluate(options); + } + if (!def) + return this.engine.fn(this._head, tail); + if (def.inert) + return (_b = tail[0]) != null ? _b : this; + const sig = def.signature; + if (!sig || !sig.evaluate) + return this.engine.fn(this._head, tail); + if (typeof sig.evaluate !== "function") + return apply(sig.evaluate, tail); + return (_c = sig.evaluate(this.engine, tail)) != null ? _c : this.engine.fn(this._head, tail); + } + N(options) { + var _a, _b, _c, _d; + if (this._numericValue) + return this._numericValue; + if (this.engine.strict && !this.isValid) + return this; + if (!this.isCanonical) { + const canonical2 = this.canonical; + if (!canonical2.isCanonical || !canonical2.isValid) + return this; + return canonical2.N(options); + } + const def = this.functionDefinition; + const tail = holdMap( + this._ops, + (_a = def == null ? void 0 : def.hold) != null ? _a : "none", + (def == null ? void 0 : def.associative) ? def.name : "", + (x) => x.N(options) + ); + if (typeof this._head !== "string") { + const expr = apply(this._head, tail); + if (typeof expr.head !== "string") + return expr; + return expr.N(options); + } + if (!def) + return this.engine.fn(this._head, tail); + if (def.inert) + return (_b = tail[0]) != null ? _b : this; + const sig = def.signature; + let result = (_d = (_c = sig == null ? void 0 : sig.N) == null ? void 0 : _c.call(sig, this.engine, tail)) != null ? _d : this.engine.fn(this._head, tail).evaluate(); + const num = result.numericValue; + if (num !== null) { + if (!complexAllowed(this.engine) && num instanceof import_complex10.default) + result = this.engine._NAN; + else if (!bignumPreferred(this.engine) && num instanceof decimal_default) + result = this.engine.number(num.toNumber()); + } + if (this.isPure) + this._numericValue = result; + return result; + } + solve(vars) { + if (vars.length !== 1) + return null; + const roots = findUnivariateRoots(this.simplify(), vars[0]); + return roots; + } +}; +function makeNumericFunction(ce, head2, semiOps, metadata) { + var _a; + let ops2 = []; + if (head2 === "Add" || head2 === "Multiply") + ops2 = validateNumericArgs( + ce, + flattenOps(flattenSequence(ce.canonical(semiOps)), head2) + ); + else if (head2 === "Negate" || head2 === "Square" || head2 === "Sqrt") + ops2 = validateNumericArgs(ce, flattenSequence(ce.canonical(semiOps)), 1); + else if (head2 === "Divide" || head2 === "Power") + ops2 = validateNumericArgs(ce, flattenSequence(ce.canonical(semiOps)), 2); + else + return null; + if (!ops2.every((x) => x.isValid)) + return new BoxedFunction(ce, head2, ops2, { metadata, canonical: false }); + if (head2 === "Add") + return ce.add(ops2, metadata); + if (head2 === "Negate") + return ce.neg((_a = ops2[0]) != null ? _a : ce.error("missing"), metadata); + if (head2 === "Multiply") + return ce.mul(ops2, metadata); + if (head2 === "Divide") + return ce.div(ops2[0], ops2[1], metadata); + if (head2 === "Power") + return ce.pow(ops2[0], ops2[1], metadata); + if (head2 === "Square") + return ce.pow(ops2[0], ce.number(2), metadata); + if (head2 === "Sqrt") { + const op3 = ops2[0].canonical; + if (isRational(op3.numericValue)) + return new BoxedFunction(ce, "Sqrt", [op3], { metadata, canonical: true }); + return ce.pow(op3, ce._HALF, metadata); + } + return null; +} +function makeCanonicalFunction(ce, head2, ops2, metadata) { + var _a, _b; + if (typeof head2 !== "string") + head2 = (_a = head2.evaluate().symbol) != null ? _a : head2; + if (typeof head2 === "string") { + const result = makeNumericFunction(ce, head2, ops2, metadata); + if (result) + return result; + } else { + if (!head2.isValid) + return new BoxedFunction( + ce, + head2, + ops2.map((x) => ce.box(x, { canonical: false })), + { metadata, canonical: false } + ); + } + const def = ce.lookupFunction(head2, ce.context); + if (typeof head2 !== "string" || !def) { + return new BoxedFunction( + ce, + head2, + flattenSequence(ops2.map((x) => ce.box(x))), + { metadata, canonical: true } + ); + } + let xs = []; + for (let i = 0; i < ops2.length; i++) { + if (applicable(def.hold, ops2.length - 1, i)) { + xs.push(ce.box(ops2[i])); + } else { + const y = ce.box(ops2[i], { canonical: false }); + if (y.head === "ReleaseHold") + xs.push(y.op1.canonical); + else + xs.push(y); + } + } + if (!xs.every((x) => x.isValid)) + return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); + const sig = def.signature; + if (sig.canonical) { + try { + const result = sig.canonical(ce, xs); + if (result) + return result; + } catch (e) { + console.error(e); + } + return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); + } + xs = flattenSequence(xs); + if (def.associative) + xs = flattenOps(xs, head2); + if (!xs.every((x) => x.isValid)) + return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); + xs = (_b = validateSignature(sig.domain, xs)) != null ? _b : xs; + if (!xs.every((x) => x.isValid)) + return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); + if (xs.length === 1 && xs[0].head === head2) { + if (def.involution) + return xs[0].op1; + if (def.idempotent) + xs = xs[0].ops; + } + if (xs.length > 1 && def.commutative === true) + xs = xs.sort(order); + return new BoxedFunction(ce, head2, xs, { metadata, def, canonical: true }); +} +function apply(fn, args) { + var _a; + const ce = fn.engine; + if (fn.head !== "Lambda") + return ce._fn(fn.evaluate(), args); + const subs2 = { + "__": ce.tuple(args), + "_#": ce.number(args.length) + }; + let n = 1; + for (const op3 of args) + subs2[`_${n++}`] = op3; + subs2["_"] = subs2["_1"]; + const savedContext = ce.context; + ce.context = (_a = fn.scope) != null ? _a : null; + const result = fn.subs(subs2); + ce.context = savedContext; + return result.op1.evaluate(); +} +function holdMap(xs, skip, associativeHead, f) { + if (xs.length === 0) + return []; + xs = flattenOps(xs, associativeHead); + if (skip === "all") + return xs; + if (skip === "none") { + const result2 = []; + for (const x of xs) { + const h = x.head; + if (h === "Hold") + result2.push(x); + else { + const op3 = h === "ReleaseHold" ? x.op1 : x; + if (op3) { + const y = f(op3); + if (y !== null) + result2.push(y); + } + } + } + return flattenOps(result2, associativeHead); + } + const result = []; + for (let i = 0; i < xs.length; i++) { + if (xs[i].head === "Hold") { + result.push(xs[i]); + } else { + let y = void 0; + if (xs[i].head === "ReleaseHold") + y = xs[i].op1; + else if (applicable(skip, xs.length - 1, i)) + y = xs[i]; + else + result.push(xs[i]); + if (y) { + const x = f(y); + if (x !== null) + result.push(x); + } + } + } + return flattenOps(result, associativeHead); +} +function applicable(skip, count, index) { + if (skip === "all") + return false; + if (skip === "none") + return true; + if (skip === "first") + return index !== 0; + if (skip === "rest") + return index === 0; + if (skip === "last") + return index !== count; + if (skip === "most") + return index === count; + return false; +} +var import_complex12 = __toESM(require_complex()); +var import_complex11 = __toESM(require_complex()); +function inferNumericDomain(value) { + if (typeof value === "number" && !isNaN(value)) { + if (!isFinite(value)) + return "ExtendedRealNumber"; + if (Number.isInteger(value)) { + if (value > 0) + return "PositiveInteger"; + if (value < 0) + return "NegativeInteger"; + return "Integer"; + } + if (value > 0) + return "PositiveNumber"; + if (value < 0) + return "NegativeNumber"; + return "RealNumber"; + } + if (value instanceof Decimal) { + if (value.isNaN()) + return "Number"; + if (!value.isFinite()) + return "ExtendedRealNumber"; + if (value.isInteger()) { + if (value.isPositive()) + return "PositiveInteger"; + if (value.isNegative()) + return "NegativeInteger"; + return "Integer"; + } + if (value.isPositive()) + return "PositiveNumber"; + if (value.isNegative()) + return "NegativeNumber"; + return "RealNumber"; + } + if (value instanceof import_complex11.Complex) { + const c = value; + /* @__PURE__ */ console.assert(c.im !== 0); + if (c.re === 0) + return "ImaginaryNumber"; + return "ComplexNumber"; + } + if (isRational(value)) { + const [numer, denom] = value; + /* @__PURE__ */ console.assert( + typeof numer !== "number" || !Number.isNaN(numer) && !Number.isNaN(denom) + ); + return "RationalNumber"; + } + return "Number"; +} +var LARGE_PRIME = 1125899906842597; +function isPrime(n) { + if (!Number.isInteger(n) || !Number.isFinite(n) || Number.isNaN(n) || n <= 1) { + return false; + } + if (n <= LARGEST_SMALL_PRIME) + return SMALL_PRIMES.has(n); + for (const smallPrime of SMALL_PRIMES) { + if (n % smallPrime === 0) + return false; + } + if (n >= LARGE_PRIME) { + return probablyPrime(n, 30) ? void 0 : false; + } + return n === leastFactor(n); +} +function leastFactor(n) { + if (n === 1) + return 1; + if (n % 2 === 0) + return 2; + if (n % 3 === 0) + return 3; + if (n % 5 === 0) + return 5; + const m = Math.floor(Math.sqrt(n)); + let i = 7; + while (i <= m) { + if (n % i === 0) + return i; + if (n % (i + 4) === 0) + return i + 4; + if (n % (i + 6) === 0) + return i + 6; + if (n % (i + 10) === 0) + return i + 10; + if (n % (i + 12) === 0) + return i + 12; + if (n % (i + 16) === 0) + return i + 16; + if (n % (i + 22) === 0) + return i + 22; + if (n % (i + 24) === 0) + return i + 24; + i += 30; + } + return n; +} +function probablyPrime(n, k) { + let s = 0, d = n - 1; + while (d % 2 === 0) { + d /= 2; + ++s; + } + WitnessLoop: + do { + let x = Math.pow(2 + Math.floor(Math.random() * (n - 3)), d) % n; + if (x === 1 || x === n - 1) + continue; + for (let i = s - 1; i--; ) { + x = x * x % n; + if (x === 1) + return false; + if (x === n - 1) + continue WitnessLoop; + } + return false; + } while (--k); + return true; +} +var BoxedNumber = class _BoxedNumber extends AbstractBoxedExpression { + /** + * By the time the constructor is called, the `value` should have been + * screened for cases where it's a well-known value (0, NaN, +Infinity, + * etc...) or non-normal (complex number with im = 0, rational with + * denom = 1, etc...). + * + * This is done in `ce.number()`. In general, use `ce.number()` rather + * than calling this constructor directly. + * + * We may store as a machine number if a Decimal is passed that is in machine + * range + */ + constructor(ce, value, options) { + var _a; + super(ce, options == null ? void 0 : options.metadata); + if (typeof value === "number") { + this._value = value; + this._isCanonical = true; + return; + } + if (isRational(value)) { + const [n, d] = value; + /* @__PURE__ */ console.assert( + typeof n !== "number" || Number.isInteger(n) && Number.isInteger(d) && d !== n && d !== 1 + ); + /* @__PURE__ */ console.assert( + !(typeof n === "bigint" && typeof d == "bigint") || d !== n && d !== BigInt(1) + ); + if ((_a = options == null ? void 0 : options.canonical) != null ? _a : true) { + this._value = canonicalNumber(ce, value); + this._isCanonical = true; + } else { + this._value = value; + this._isCanonical = false; + } + } else { + /* @__PURE__ */ console.assert( + !(value instanceof import_complex12.Complex) || !Number.isNaN(value.re) && !Number.isNaN(value.im) && ce.chop(value.im) !== 0 + ); + this._value = canonicalNumber(ce, value); + this._isCanonical = true; + } + } + get hash() { + if (this._hash !== void 0) + return this._hash; + let h = 0; + if (typeof this._value === "number") + h = hashCode(this._value.toString()); + else if (this._value instanceof import_complex12.Complex) + h = hashCode( + this._value.re.toString() + " +i " + this._value.im.toString() + ); + else if (this._value instanceof Decimal) + h = hashCode(this._value.toString()); + else + h = hashCode( + this._value[0].toString() + " / " + this._value[1].toString() + ); + this._hash = h; + return h; + } + get head() { + return "Number"; + } + get isPure() { + return true; + } + get isExact() { + if (typeof this._value === "number") + return Number.isInteger(this._value); + if (this._value instanceof Decimal) + return this._value.isInteger(); + if (this._value instanceof import_complex12.Complex) + return Number.isInteger(this._value.re) && Number.isInteger(this._value.im); + return isRational(this._value); + } + get isCanonical() { + return this._isCanonical; + } + set isCanonical(val) { + this._isCanonical = val; + } + get complexity() { + return 1; + } + get value() { + return this; + } + get numericValue() { + return this._value; + } + get domain() { + if (this._domain === void 0) + this._domain = this.engine.domain(inferNumericDomain(this._value)); + return this._domain; + } + get json() { + return serializeJsonNumber(this.engine, this._value, { + latex: this._latex + }); + } + get sgn() { + if (this._value === 0) + return 0; + if (typeof this._value === "number") { + if (this._value < 0) + return -1; + if (this._value > 0) + return 1; + return null; + } + if (this._value instanceof Decimal) { + if (this._value.isZero()) + return 0; + if (this._value.isNegative()) + return -1; + if (this._value.isPositive()) + return 1; + return null; + } + if (Array.isArray(this._value)) { + const [numer, denom] = this._value; + if (numer === 0 && denom !== 0) + return 0; + if (numer < 0) + return -1; + if (numer > 0) + return 1; + return null; + } + return null; + } + isSame(rhs) { + if (this === rhs) + return true; + if (!(rhs instanceof _BoxedNumber)) + return false; + if (typeof this._value === "number") { + if (typeof rhs._value !== "number") + return false; + return this._value === rhs._value; + } + if (this._value instanceof Decimal) { + if (!(rhs._value instanceof Decimal)) + return false; + return this._value.eq(rhs._value); + } + if (Array.isArray(this._value)) { + if (!Array.isArray(rhs._value)) + return false; + const [rhsN, rhsD] = rhs._value; + return this._value[0] === rhsN && this._value[1] === rhsD; + } + if (this._value instanceof import_complex12.Complex) { + if (!(rhs._value instanceof import_complex12.Complex)) + return false; + return this._value.equals(rhs._value); + } + return false; + } + isEqual(rhs) { + return this.isSame(rhs); + } + match(rhs, options) { + var _a; + if (this.isEqualWithTolerance(rhs, (_a = options == null ? void 0 : options.numericTolerance) != null ? _a : 0)) + return {}; + return null; + } + /** Compare this with another BoxedNumber. + * `rhs` must be a BoxedNumber. Use `isEqualWithTolerance(rhs.N())` + * if necessary. + */ + isEqualWithTolerance(rhs, tolerance) { + return rhs instanceof _BoxedNumber && signDiff(this, rhs, tolerance) === 0; + } + isLess(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s < 0; + } + isLessEqual(rhs) { + const s = signDiff(this, rhs); + if (s === void 0) + return void 0; + return s <= 0; + } + isGreater(rhs) { + return rhs.isLessEqual(this); + } + isGreaterEqual(rhs) { + return rhs.isLess(this); + } + /** x > 0, same as `isGreater(0)` */ + get isPositive() { + if (typeof this._value === "number") + return this._value > 0; + const s = this.sgn; + if (s === void 0 || s === null) + return void 0; + return s > 0; + } + /** x >= 0, same as `isGreaterEqual(0)` */ + get isNonNegative() { + if (typeof this._value === "number") + return this._value >= 0; + const s = this.sgn; + if (s === void 0 || s === null) + return void 0; + return s >= 0; + } + /** x < 0, same as `isLess(0)` */ + get isNegative() { + if (typeof this._value === "number") + return this._value < 0; + const s = this.sgn; + if (s === void 0 || s === null) + return void 0; + return s < 0; + } + /** x <= 0, same as `isLessEqual(0)` */ + get isNonPositive() { + if (typeof this._value === "number") + return this._value <= 0; + const s = this.sgn; + if (s === void 0 || s === null) + return void 0; + return s <= 0; + } + get isZero() { + if (this._value === 0) + return true; + if (this._value instanceof Decimal) + return this._value.isZero(); + if (this._value instanceof import_complex12.Complex) + return this._value.isZero(); + return false; + } + get isNotZero() { + if (this._value === 0) + return false; + if (this._value instanceof Decimal) + return !this._value.isZero(); + if (this._value instanceof import_complex12.Complex) + return !this._value.isZero(); + return true; + } + get isOne() { + if (this._value === 1) + return true; + if (typeof this._value === "number") + return false; + if (this._value instanceof Decimal) + return this._value.equals(this.engine._BIGNUM_ONE); + if (this._value instanceof import_complex12.Complex) + return this._value.im === 0 && this._value.re === 1; + return isRationalOne(this._value); + } + get isNegativeOne() { + if (this._value === -1) + return true; + if (typeof this._value === "number") + return false; + if (this._value instanceof Decimal) + return this._value.equals(this.engine._BIGNUM_NEGATIVE_ONE); + if (Array.isArray(this._value)) + return isRationalNegativeOne(this._value); + return this._value.equals(-1); + } + get isOdd() { + if (this.isOne || this.isNegativeOne) + return true; + if (this.isZero) + return false; + if (!this.isInteger) + return false; + if (typeof this._value === "number") + return this._value % 2 !== 0; + if (this._value instanceof Decimal) + return !this._value.mod(2).isZero(); + return void 0; + } + get isEven() { + if (this.isOne || this.isNegativeOne) + return false; + if (this.isZero) + return true; + if (!this.isInteger) + return false; + if (typeof this._value === "number") + return this._value % 2 === 0; + if (this._value instanceof Decimal) + return this._value.mod(2).isZero(); + return void 0; + } + get isPrime() { + if (!this.isInteger || !this.isFinite || this.isNonPositive || this.isOne || this.isZero) + return false; + if (typeof this._value === "number") + return isPrime(this._value); + if (this._value instanceof Decimal) + return isPrime(this._value.toNumber()); + return void 0; + } + get isComposite() { + if (!this.isInteger || !this.isFinite || this.isNonPositive || this.isOne || this.isZero) + return false; + if (typeof this._value === "number") + return !isPrime(this._value); + if (this._value instanceof Decimal) + return !isPrime(this._value.toNumber()); + return void 0; + } + get isInfinity() { + if (typeof this._value === "number") + return !Number.isFinite(this._value) && !Number.isNaN(this._value); + if (this._value instanceof Decimal) + return !this._value.isFinite() && !this._value.isNaN(); + if (this._value instanceof import_complex12.Complex) + return !this._value.isFinite() && !this._value.isNaN(); + return false; + } + get isNaN() { + if (typeof this._value === "number") + return Number.isNaN(this._value); + if (this._value instanceof Decimal) + return this._value.isNaN(); + if (this._value instanceof import_complex12.Complex) + return this._value.isNaN(); + return false; + } + get isFinite() { + return !this.isInfinity && !this.isNaN; + } + get isNumber() { + return true; + } + get isInteger() { + if (typeof this._value === "number") + return Number.isInteger(this._value); + if (this._value instanceof Decimal) + return this._value.isInteger(); + return false; + } + get isRational() { + if (Array.isArray(this._value)) + return true; + return this.isInteger; + } + get isAlgebraic() { + if (this.isRational) + return true; + return void 0; + } + get isReal() { + if (!this.isFinite) + return false; + if (this._value instanceof import_complex12.Complex) + return this.engine.chop(this._value.im) === 0; + return true; + } + // Real or +-Infinity + get isExtendedReal() { + return this.isInfinity || this.isReal; + } + get isComplex() { + return !this.isNaN; + } + get isImaginary() { + if (this._value instanceof import_complex12.Complex) { + /* @__PURE__ */ console.assert(this._value.im !== 0); + return true; + } + return false; + } + get isExtendedComplex() { + return this.isInfinity || !this.isNaN; + } + get canonical() { + if (this._isCanonical) + return this; + return this.engine.number(canonicalNumber(this.engine, this._value)); + } + simplify(_options) { + return this.canonical; + } + N(_options) { + if (!Array.isArray(this._value)) + return this; + const ce = this.engine; + const [numer, denom] = this._value; + if (typeof numer === "number" && typeof denom === "number" && !bignumPreferred(ce)) + return ce.number(numer / denom); + return ce.number(ce.bignum(numer).div(ce.bignum(denom))); + } +}; +function canonicalNumber(ce, value) { + if (value instanceof Decimal && isInMachineRange(value)) + return value.toNumber(); + if (!isRational(value)) + return value; + value = reducedRational(value); + if (isBigRational(value)) { + let [n2, d2] = value; + if (n2 > Number.MIN_SAFE_INTEGER && n2 < Number.MAX_SAFE_INTEGER && d2 > Number.MIN_SAFE_INTEGER && d2 < Number.MAX_SAFE_INTEGER) + value = [Number(n2), Number(d2)]; + else { + if (d2 < 0) + [n2, d2] = [-n2, -d2]; + if (d2 === BigInt(1)) + return ce.bignum(n2); + if (d2 === BigInt(0)) { + if (n2 === d2) + return NaN; + return n2 < 0 ? -Infinity : Infinity; + } + return [n2, d2]; + } + } + let [n, d] = value; + if (Number.isNaN(n) || Number.isNaN(d)) + return NaN; + if (d < 0) + [n, d] = [-n, -d]; + if (d === 1) + return n; + if (d === 0) { + if (n === 0 || !Number.isFinite(n)) + return NaN; + if (n < 0) + return -Infinity; + return Infinity; + } + if (n === 0) + return n; + return [n, d]; +} +var BoxedString = class _BoxedString extends AbstractBoxedExpression { + constructor(ce, expr, metadata) { + super(ce, metadata); + this._string = expr.normalize(); + ce._register(this); + } + get hash() { + return hashCode("String" + this._string); + } + get json() { + return serializeJsonString(this.engine, this._string); + } + get head() { + return "String"; + } + get isPure() { + return true; + } + get isCanonical() { + return true; + } + set isCanonical(_va) { + return; + } + get domain() { + return this.engine.domain("String"); + } + get complexity() { + return 19; + } + get string() { + return this._string; + } + isEqual(rhs) { + return rhs.string === this._string; + } + isSame(rhs) { + return rhs.string === this._string; + } + match(rhs, _options) { + if (!(rhs instanceof _BoxedString)) + return null; + if (this._string === rhs._string) + return {}; + return null; + } +}; +function boxNumber(ce, num, options) { + var _a; + if (typeof num === "number" || num instanceof Decimal) + return new BoxedNumber(ce, num, options); + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + if (Array.isArray(num) && num.length === 2 && num[0] instanceof Decimal && num[1] instanceof Decimal) { + if (!num[0].isInteger() || !num[1].isInteger()) + throw new Error("Array argument to `boxNumber()` should be two integers"); + num = [bigint(num[0].toString()), bigint(num[1].toString())]; + } + if (isRational(num)) { + if (num.length !== 2) + throw new Error( + "Array argument to `boxNumber()` should be two integers or two bignums" + ); + const [n, d] = num; + if (typeof n === "bigint" && typeof d === "bigint") { + if (n === d) + return d === BigInt(0) ? ce._NAN : ce._ONE; + if (n === BigInt(0)) + return ce._ZERO; + if (d === BigInt(1)) + return ce.number(n, options); + if (d === BigInt(-1)) + return ce.number(-n, options); + if (n === BigInt(1) && d === BigInt(2)) + return ce._HALF; + return new BoxedNumber(ce, [n, d], options); + } + if (typeof n !== "number" || typeof d !== "number") + throw new Error( + "Array argument to `boxNumber()` should be two integers or two bignums" + ); + if (!Number.isInteger(n) || !Number.isInteger(d)) + throw new Error("Array argument to `boxNumber()` should be two integers"); + if (d === n) + return d === 0 ? ce._NAN : ce._ONE; + if (n === 0) + return ce._ZERO; + if (d === 1) + return ce.number(n, options); + if (d === -1) + return ce.number(-n, options); + if (n === 1 && d === 2) + return ce._HALF; + return new BoxedNumber(ce, [n, d], options); + } + if (num instanceof import_complex13.Complex) { + if (num.isNaN()) + return ce._NAN; + if (num.isZero()) + return ce._ZERO; + if (num.isInfinite()) + return ce._COMPLEX_INFINITY; + if (ce.chop(num.im) === 0) + return ce.number(num.re, options); + return new BoxedNumber(ce, num, options); + } + let strNum = ""; + if (typeof num === "string") + strNum = num; + else if (typeof num === "object" && "num" in num) { + if (typeof num.num === "number") + return ce.number(num.num, options); + if (typeof num.num !== "string") + throw new Error("MathJSON `num` property should be a string of digits"); + strNum = num.num; + } + if (strNum) { + strNum = strNum.toLowerCase(); + if (/[0-9][nd]$/.test(strNum)) + strNum = strNum.slice(0, -1); + strNum = strNum.replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); + if (strNum === "nan") + return ce._NAN; + if (strNum === "infinity" || strNum === "+infinity") + return ce._POSITIVE_INFINITY; + if (strNum === "-infinity") + return ce._NEGATIVE_INFINITY; + if (strNum === "0") + return ce._ZERO; + if (strNum === "1") + return ce._ONE; + if (strNum === "-1") + return ce._NEGATIVE_ONE; + if (/\([0-9]+\)/.test(strNum)) { + const [_, body, repeat, trail] = (_a = strNum.match(/(.+)\(([0-9]+)\)(.+)?$/)) != null ? _a : []; + strNum = body + repeat.repeat(Math.ceil(ce.precision / repeat.length)) + (trail != null ? trail : ""); + } + return boxNumber(ce, ce.bignum(strNum), options); + } + return null; +} +function boxHold(ce, expr, options) { + if (expr === null) + return ce.error("missing"); + if (typeof expr === "object" && expr instanceof AbstractBoxedExpression) + return expr; + expr = missingIfEmpty(expr); + if (typeof expr === "string") + return box(ce, expr, options); + if (Array.isArray(expr)) { + const boxed = expr.map((x) => boxHold(ce, x, options)); + return new BoxedFunction(ce, boxed[0], boxed.slice(1)); + } + if (typeof expr === "object") { + if ("dict" in expr) + return new BoxedDictionary(ce, expr.dict); + if ("fn" in expr) + return boxHold(ce, expr.fn, options); + if ("str" in expr) + return new BoxedString(ce, expr.str); + if ("sym" in expr) + return box(ce, expr.sym, options); + if ("num" in expr) + return box(ce, expr.num, options); + } + return box(ce, expr, options); +} +function boxFunction(ce, head2, ops2, options) { + var _a; + if (head2 === "Hold") { + return new BoxedFunction(ce, "Hold", [boxHold(ce, ops2[0], options)], { + ...options, + canonical: true + }); + } + if (head2 === "Error" || head2 === "ErrorCode") { + return ce._fn( + head2, + ops2.map((x) => ce.box(x, { canonical: false })), + options.metadata + ); + } + if (head2 === "Domain") + return ce.domain(ops2[0], options.metadata); + if (head2 === "Number" && ops2.length === 1) + return box(ce, ops2[0], options); + if (head2 === "String") { + if (ops2.length === 0) + return new BoxedString(ce, "", options.metadata); + return new BoxedString( + ce, + ops2.map((x) => { + var _a2; + return (_a2 = asString(x)) != null ? _a2 : ""; + }).join(""), + options.metadata + ); + } + if (head2 === "Symbol" && ops2.length > 0) { + return ce.symbol(ops2.map((x) => { + var _a2; + return (_a2 = asString(x)) != null ? _a2 : ""; + }).join(""), options); + } + if ((head2 === "Divide" || head2 === "Rational") && ops2.length === 2) { + if (ops2[0] instanceof AbstractBoxedExpression && ops2[1] instanceof AbstractBoxedExpression) { + if (ce.numericMode === "machine") { + const [fn, fd] = [asFloat(ops2[0]), asFloat(ops2[1])]; + if (fn !== null && Number.isInteger(fn) && fd !== null && Number.isInteger(fd)) + return ce.number([fn, fd], options); + } + const [n, d] = [asBigint(ops2[0]), asBigint(ops2[1])]; + if (n !== null && d !== null) + return ce.number([n, d], options); + } else { + const [n, d] = [ + bigintValue(ce, ops2[0]), + bigintValue(ce, ops2[1]) + ]; + if (n !== null && d !== null) + return ce.number([n, d], options); + } + head2 = "Divide"; + } + if (head2 === "Complex") { + if (ops2.length === 1) { + const op12 = box(ce, ops2[0], options); + const im = asFloat(op12); + if (im !== null && im !== 0) + return ce.number(ce.complex(0, im), options); + return ce.mul([op12, ce._I]); + } + if (ops2.length === 2) { + const op12 = box(ce, ops2[0], options); + const op22 = box(ce, ops2[1], options); + const re = asFloat(op12); + const im = asFloat(op22); + if (im !== null && re !== null) { + if (im === 0 && re === 0) + return ce._ZERO; + if (im !== null && im !== 0) + return ce.number(ce.complex(re, im), options); + return op12; + } + return ce.add([op12, ce.mul([op22, ce._I])], options.metadata); + } + } + if (head2 === "Negate" && ops2.length === 1) { + const op12 = ops2[0]; + if (typeof op12 === "number") + return ce.number(-op12, options); + if (op12 instanceof Decimal) + return ce.number(op12.neg(), options); + const num = ce.box(op12, options).numericValue; + if (num !== null) { + if (typeof num === "number") + return ce.number(-num, options); + if (num instanceof Decimal) + return ce.number(num.neg(), options); + if (num instanceof import_complex13.Complex) + return ce.number(num.neg()); + if (isRational(num)) + return ce.number(neg(num)); + } + } + if (head2 === "Dictionary") { + const dict = {}; + for (const op3 of ops2) { + const arg = ce.box(op3); + const head3 = arg.head; + if (head3 === "KeyValuePair" || head3 === "Pair" || head3 === "Tuple" && arg.nops === 2) { + const key = arg.op1; + if (key.isValid && !key.isNothing) { + const value = arg.op2; + let k = (_a = key.symbol) != null ? _a : key.string; + if (!k && (key.numericValue !== null || key.string)) { + const n = typeof key.numericValue === "number" ? key.numericValue : asSmallInteger(key); + if (n && Number.isFinite(n) && Number.isInteger(n)) + k = n.toString(); + } + if (k) + dict[k] = value; + } + } + } + return new BoxedDictionary(ce, dict, options); + } + if (options.canonical) + return makeCanonicalFunction(ce, head2, ops2, options.metadata); + return new BoxedFunction( + ce, + head2, + ops2.map((x) => box(ce, x, { canonical: false })), + options + ); +} +function box(ce, expr, options) { + if (expr === null || expr === void 0) + return ce._fn("Sequence", []); + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + if (expr instanceof AbstractBoxedExpression) + return options.canonical ? expr.canonical : expr; + if (Array.isArray(expr)) { + if (isMachineRational(expr)) { + if (Number.isInteger(expr[0]) && Number.isInteger(expr[1])) + return ce.number(expr); + return boxFunction(ce, "Divide", expr, options); + } + if (isBigRational(expr)) + return ce.number(expr); + if (typeof expr[0] === "string") + return boxFunction(ce, expr[0], expr.slice(1), options); + const ops2 = expr.slice(1).map((x) => box(ce, x, options)); + const head2 = box(ce, expr[0], options); + if (head2.symbol) + return new BoxedFunction(ce, head2.symbol, ops2); + return apply(head2, ops2); + } + if (typeof expr === "number" || expr instanceof import_complex13.Complex || expr instanceof Decimal) + return ce.number(expr); + if (typeof expr === "string") { + if (expr.startsWith("'") && expr.endsWith("'")) + return new BoxedString(ce, expr.slice(1, -1)); + if (/^[+-]?[0-9]/.test(expr)) + return ce.number(expr); + if (!isValidIdentifier(expr)) + return ce.error("invalid-identifier", { str: expr }); + return ce.symbol(expr, options); + } + if (typeof expr === "object") { + const metadata = { + latex: expr.latex, + wikidata: expr.wikidata + }; + if ("dict" in expr) + return new BoxedDictionary(ce, expr.dict, { canonical: true, metadata }); + if ("fn" in expr) { + if (typeof expr.fn[0] === "string") + return boxFunction(ce, expr.fn[0], expr.fn.slice(1), options); + return new BoxedFunction( + ce, + box(ce, expr.fn[0], options), + expr.fn.slice(1).map((x) => box(ce, x, options)), + { metadata } + ); + } + if ("str" in expr) + return new BoxedString(ce, expr.str, metadata); + if ("sym" in expr) + return ce.symbol(expr.sym, options); + if ("num" in expr) + return ce.number(expr, options); + } + return ce.symbol("Undefined"); +} +function asString(expr) { + var _a, _b; + if (typeof expr === "string") + return expr; + if (expr instanceof AbstractBoxedExpression) { + return (_b = (_a = expr.string) != null ? _a : expr.symbol) != null ? _b : expr.toString(); + } + if (typeof expr === "object") { + if ("str" in expr) + return expr.str; + if ("fn" in expr && expr.fn[0] === "String" && typeof expr.fn[1] === "string") + return expr.fn[1]; + } + if (Array.isArray(expr)) { + if (expr[0] === "String" && typeof expr[1] === "string") + return expr[1]; + } + return null; +} +function gamma3(c) { + return c; +} +function lngamma3(c) { + return c; +} +var import_complex15 = __toESM(require_complex()); +var import_complex14 = __toESM(require_complex()); +function makePositive(expr) { + if (expr.head === "Negate") + return [-1, expr.op1]; + const n = expr.numericValue; + if (n === null) + return [1, expr]; + const ce = expr.engine; + if (typeof n === "number" && n < 0) + return [-1, ce.number(-n)]; + if (n instanceof decimal_default && n.isNegative()) + return [-1, ce.number(n.neg())]; + if (n instanceof import_complex14.default && n.re < 0) + return [-1, ce.number(ce.complex(-n.re, -n.im))]; + if (isMachineRational(n) && n[0] < 0) + return [-1, ce.number([-n[0], n[1]])]; + if (isBigRational(n) && n[0] < 0) + return [-1, ce.number([-n[0], n[1]])]; + return [1, expr]; +} +function apply2(expr, fn, bigFn, complexFn) { + var _a; + const n = expr.numericValue; + const ce = expr.engine; + /* @__PURE__ */ console.assert(n !== null); + if (typeof n === "number") { + if (bignumPreferred(ce) && bigFn) + return ce.chop(bigFn(ce.bignum(n))); + return ce.chop(fn(n)); + } + if (n instanceof decimal_default) + return ce.chop((_a = bigFn == null ? void 0 : bigFn(n)) != null ? _a : fn(n.toNumber())); + if (isMachineRational(n)) { + if (!bignumPreferred(ce) || !bigFn) + return ce.chop(fn(n[0] / n[1])); + return ce.chop(bigFn(ce.bignum(n[0]).div(n[1]))); + } + if (isBigRational(n)) { + if (bigFn) + return ce.chop(bigFn(ce.bignum(n[0]).div(ce.bignum(n[1])))); + return ce.chop(fn(Number(n[0]) / Number(n[1]))); + } + if (n instanceof import_complex14.default) { + if (!complexFn || !complexAllowed(ce)) + return NaN; + return ce.chop(complexFn(n)); + } + return NaN; +} +function applyN(expr, fn, bigFn, complexFn) { + var _a; + if (((_a = expr == null ? void 0 : expr.numericValue) != null ? _a : null) === null) + return void 0; + return expr.engine.number(apply2(expr, fn, bigFn, complexFn)); +} +function apply22(expr1, expr2, fn, bigFn, complexFn) { + var _a, _b, _c; + /* @__PURE__ */ console.assert(expr1.numericValue !== null && expr2.numericValue !== null); + const ce = expr1.engine; + let m1 = expr1.numericValue; + if (isMachineRational(m1)) + m1 = m1[0] / m1[1]; + let m2 = expr2.numericValue; + if (isMachineRational(m2)) + m2 = m2[0] / m2[1]; + if (!bignumPreferred(ce) && typeof m1 === "number" && typeof m2 === "number") + return fn(m1, m2); + let b1 = void 0; + if (m1 instanceof decimal_default) + b1 = m1; + else if (isBigRational(m1)) + b1 = ce.bignum(m1[0]).div(ce.bignum(m1[1])); + else if (m1 !== null && typeof m1 === "number") + b1 = ce.bignum(m1); + let b2 = void 0; + if (m2 instanceof decimal_default) + b2 = m2; + else if (isBigRational(m2)) + b1 = ce.bignum(m2[0]).div(ce.bignum(m2[1])); + else if (m2 !== null && typeof m2 === "number") + b2 = ce.bignum(m2); + if (b1 && b2) + return (_a = bigFn == null ? void 0 : bigFn(b1, b2)) != null ? _a : fn(b1.toNumber(), b2.toNumber()); + if (m1 instanceof import_complex14.default || m2 instanceof import_complex14.default) { + if (!complexFn || !complexAllowed(ce)) + return NaN; + return complexFn( + ce.complex((_b = m1 != null ? m1 : b1 == null ? void 0 : b1.toNumber()) != null ? _b : NaN), + ce.complex((_c = m2 != null ? m2 : b2 == null ? void 0 : b2.toNumber()) != null ? _c : NaN) + ); + } + return NaN; +} +function apply2N(expr1, expr2, fn, bigFn, complexFn) { + if (expr1.numericValue === null || expr2.numericValue === null) + return void 0; + return expr1.engine.number(apply22(expr1, expr2, fn, bigFn, complexFn)); +} +function canonicalPower(ce, base, exponent, metadata) { + if (exponent.symbol === "ComplexInfinity") + return ce._NAN; + if (exponent.isZero) + return ce._ONE; + if (exponent.isOne) + return base; + if (exponent.isNegativeOne) + return ce.inv(base); + if (exponent.numericValue !== null) { + if (base.numericValue !== null) { + const numBase = asFloat(base); + if (numBase === 1) + return ce._ONE; + if (numBase === 0) { + if (exponent.isPositive) + return ce._ZERO; + if (exponent.isNegative) + return ce._COMPLEX_INFINITY; + } + if (exponent.isNegativeOne) + return ce.inv(base); + const e = asFloat(exponent); + if (e === 0.5 || e === -0.5) { + const b = asSmallInteger(base); + if (b !== null && b > 0) { + const [coef, radicand] = factorPower(b, 2); + if (radicand === 1 && coef === 1) + return ce._ONE; + if (coef !== 1) { + if (radicand === 1) + return ce.number(e >= 0 ? coef : [1, coef]); + return ce.mul([ + ce.number(coef), + ce._fn("Sqrt", [ce.number(radicand)]) + ]); + } + if (e > 0) + return ce._fn("Sqrt", [base], metadata); + return ce.inv(ce._fn("Sqrt", [base]), metadata); + } + if (e > 0) + return ce._fn("Power", [base, ce._HALF], metadata); + return ce._fn("Power", [base, ce.number([-1, 2])], metadata); + } + if (base.isInfinity) { + if (exponent.numericValue instanceof import_complex15.default) { + const re = exponent.numericValue.re; + if (re === 0) + return ce._NAN; + if (re < 0) + return ce._ZERO; + if (re > 0) + return ce._COMPLEX_INFINITY; + } + if (base.isNegative) { + if (exponent.isInfinity) + return ce._NAN; + } else if (base.isPositive) { + if (exponent.isNegativeOne) + return ce._ZERO; + if (exponent.isInfinity) + return exponent.isNegative ? ce._ZERO : ce._POSITIVE_INFINITY; + } + } + if (exponent.isInfinity && (base.isOne || base.isNegativeOne)) + return ce._NAN; + } + } + if (base.head === "Power" && base.op1.isReal) { + const a = asSmallInteger(exponent); + if (a !== null) { + const b = asSmallInteger(base.op2); + if (b !== null) { + return ce.pow(base.op1, ce.number(a * b)); + } + } + if (base.op1.isNonNegative) { + const ar = asRational(exponent); + if (ar) { + const br = asRational(base.op2); + if (br) + return ce.pow(base.op1, ce.number(mul2(ar, br))); + } + } + } + if (base.head === "Multiply") { + const e = asSmallInteger(exponent); + if (e !== null) + return ce._fn( + "Multiply", + base.ops.map((x) => ce.pow(x, exponent)) + ); + } + return ce._fn("Power", [base, exponent], metadata); +} +function square(ce, base) { + const num = base.numericValue; + if (typeof num === "number") + return ce.number(num * num); + if (num instanceof decimal_default) + return ce.number(num.pow(2)); + if (num instanceof import_complex15.default) + return ce.number(num.pow(2)); + if (isMachineRational(num)) + return ce.number([num[1] * num[1], num[0] * num[0]]); + if (isBigRational(num)) + return ce.number([num[1] * num[1], num[0] * num[0]]); + if (base.head === "Multiply") + return ce._fn( + "Multiply", + base.ops.map((x) => square(ce, x)) + ); + if (base.head === "Power") { + const exp2 = asSmallInteger(base.op2); + if (exp2 !== null) + return ce.pow(base.op1, ce.number(exp2 * 2)); + return ce.pow(base.op1, ce.mul([ce.number(2), base.op2])); + } + return ce.pow(base, ce.number(2)); +} +function numEvalPower(ce, base, exponent) { + var _a, _b, _c, _d; + if (base.numericValue === null || exponent.numericValue === null) + return void 0; + if (base.numericValue instanceof import_complex15.default) { + if (exponent.numericValue instanceof import_complex15.default) + return ce.number(base.numericValue.pow(exponent.numericValue)); + return ce.number(base.numericValue.pow((_a = asFloat(exponent)) != null ? _a : NaN)); + } + if (exponent.numericValue instanceof import_complex15.default) { + const b = (_b = asFloat(base)) != null ? _b : null; + if (b !== null) + return ce.number(ce.complex(b).pow(exponent.numericValue)); + return void 0; + } + const invExp = rootExp(exponent); + if (bignumPreferred(ce) || base.numericValue instanceof decimal_default || exponent.numericValue instanceof decimal_default) { + const bigBase = asBignum(base); + const bigExp = asBignum(exponent); + if (!bigBase || !bigExp) + return void 0; + if (invExp === 2) { + if (bigBase.isNeg()) + return complexAllowed(ce) ? ce.number(ce.complex(0, bigBase.neg().sqrt().toNumber())) : ce._NAN; + return ce.number(bigBase.sqrt()); + } + if (!bigExp.isInteger() && bigBase.isNeg()) { + if (!complexAllowed(ce)) + return ce._NAN; + const zBase = ce.complex(bigBase.toNumber()); + const zExp = ce.complex(bigExp.toNumber()); + return ce.number(zBase.pow(zExp)); + } + return ce.number(bigBase.pow(bigExp)); + } + const floatExp = (_c = asFloat(exponent)) != null ? _c : NaN; + const floatBase = (_d = asFloat(base)) != null ? _d : NaN; + if (invExp === 2) { + if (floatBase < 0) { + return complexAllowed(ce) ? ce.mul([ce._I, ce.number(Math.sqrt(-floatBase))]) : ce._NAN; + } + return ce.number(Math.sqrt(floatBase)); + } + if (!Number.isInteger(floatExp) && floatBase < 0) { + if (!complexAllowed(ce)) + return ce._NAN; + const zBase = ce.complex(floatBase); + const zExp = ce.complex(floatExp); + return ce.number(zBase.pow(zExp)); + } + return ce.number(Math.pow(floatBase, floatExp)); +} +function processPower(ce, base, exponent, mode) { + var _a, _b; + if (base.head === "Multiply") { + let c = bignumPreferred(ce) ? [BigInt(1), BigInt(1)] : [1, 1]; + const xs = []; + for (const op3 of base.ops) { + const r = asRational(op3); + if (r) + c = mul2(c, r); + else + xs.push(op3); + } + if (!isRationalOne(c)) + return ce.mul([ + (_a = processSqrt(ce, ce.number(c), mode)) != null ? _a : ce._ONE, + ce.pow( + (_b = processPower(ce, ce.mul(xs), exponent, mode)) != null ? _b : ce.mul(xs), + exponent + ) + ]); + } + if (base.head === "Power") { + if (asSmallInteger(base.op2) === -1 && asSmallInteger(exponent) === -1) + return base.op1; + const e1 = asRational(base.op2); + const e2 = asRational(exponent); + if (e1 && e2) { + const e = mul2(e1, e2); + if (isRationalZero(e)) + return ce._ONE; + if (isRationalOne(e)) + return base.op1; + return ce.pow(base.op1, e); + } + if (mode === "N") { + const ef1 = asFloat(base.op2); + const ef2 = asFloat(exponent); + if (ef1 !== null && ef2 !== null) { + const ef = ef1 * ef2; + if (ef === 0) + return ce._ONE; + if (ef === 1) + return base.op1; + return ce.pow(base.op1, ef); + } + } + } + if (mode !== "N" && base.numericValue !== null && base.isInteger) { + const smallExpr = asSmallInteger(exponent); + if (smallExpr) + return numEvalPower(ce, base, exponent); + const r = asRational(exponent); + if (r) { + const [n, d] = [machineNumerator(r), machineDenominator(r)]; + if ((n === 1 || n === -1) && (d === 2 || d === 3)) { + if (bignumPreferred(ce) || base.numericValue instanceof decimal_default) { + const bigBase = asBigint(base); + if (d % 2 === 0 && bigBase < 0 && !complexAllowed(ce)) + return ce._NAN; + const sign2 = bigBase < 0 ? d % 2 === 0 ? ce._I : ce._NEGATIVE_ONE : ce._ONE; + const [factor, root] = factorPower2( + bigBase > 0 ? bigBase : -bigBase, + d + ); + if (root === BigInt(1) && factor === BigInt(1)) + return sign2; + if (factor !== BigInt(1)) { + if (root === BigInt(1)) + return ce.mul([ + sign2, + ce.number(n >= 0 ? factor : [BigInt(1), factor]) + ]); + return ce.mul([ + sign2, + ce.number(factor), + ce.pow(ce.number(root), exponent) + ]); + } + } else if (typeof base.numericValue === "number") { + if (base.numericValue < 0 && d % 2 === 0 && !complexAllowed(ce)) + return ce._NAN; + const [factor, root] = factorPower(Math.abs(base.numericValue), d); + const sign2 = base.numericValue < 0 ? d % 2 === 0 ? ce._I : ce._NEGATIVE_ONE : ce._ONE; + if (root === 1 && factor === 1) + return sign2; + if (factor !== 1) { + if (root === 1) + return ce.mul([sign2, ce.number(n >= 0 ? factor : [1, factor])]); + return ce.mul([ + sign2, + ce.number(factor), + ce.pow(ce.number(root), exponent) + ]); + } + } else { + } + } + if (base.isNegative) { + if (!complexAllowed) + return ce._NAN; + return ce.mul([ce._I, ce.fn("Sqrt", [ce.neg(base)])]); + } + return void 0; + } + } + if (mode !== "simplify" && base.numericValue !== null && exponent.numericValue !== null) + return numEvalPower(ce, base, exponent); + return void 0; +} +function processSqrt(ce, base, mode) { + if (base.isOne) + return ce._ONE; + if (base.isZero) + return ce._ZERO; + if (base.isNegativeOne) + return complexAllowed(ce) ? ce._I : ce._NAN; + if (base.isNegative && !complexAllowed(ce)) + return ce._NAN; + const r = asRational(base); + if (mode === "N" || mode === "evaluate" && !r) + return applyN( + base, + (x) => x < 0 ? ce.complex(x).sqrt() : Math.sqrt(x), + (x) => x.isNeg() ? ce.complex(x.toNumber()).sqrt() : x.sqrt(), + (x) => x.sqrt() + ); + const n = asSmallInteger(base); + if (n !== null) { + const [factor, root] = factorPower(Math.abs(n), 2); + if (n < 0) { + if (root === 1) + ce.mul([ce.number(ce.complex(0, factor))]); + return ce.mul([ + ce.number(ce.complex(0, factor)), + ce.sqrt(ce.number(root)) + ]); + } + if (root === 1) + return ce.number(factor); + return ce.mul([ce.number(factor), ce.sqrt(ce.number(root))]); + } + if (r) { + if (isMachineRational(r) && !bignumPreferred(ce)) { + const [n2, d] = r; + if (Math.abs(n2) < Number.MAX_SAFE_INTEGER && d < Number.MAX_SAFE_INTEGER) { + const [nFactor, nRoot] = factorPower(Math.abs(n2), 2); + const [dFactor, dRoot] = factorPower(d, 2); + if (n2 < 0) + return ce.mul([ + ce.number([nFactor, dFactor]), + ce.sqrt(ce.number([nRoot, dRoot])), + ce._I + ]); + return ce.mul([ + ce.number([nFactor, dFactor]), + ce.sqrt(ce.number([nRoot, dRoot])) + ]); + } + } + if (isBigRational(r) || bignumPreferred(ce)) { + const n2 = bigint(r[0]); + const [nFactor, nRoot] = factorPower2(n2 > 0 ? n2 : -n2, 2); + const [dFactor, dRoot] = factorPower2(bigint(r[1]), 2); + if (n2 < 0) + return ce.mul([ + ce.number([nFactor, dFactor]), + ce.sqrt(ce.number([nRoot, dRoot])), + ce._I + ]); + return ce.mul([ + ce.number([nFactor, dFactor]), + ce.sqrt(ce.number([nRoot, dRoot])) + ]); + } + } + return void 0; +} +function rootExp(exponent) { + if (typeof exponent.numericValue === "number") { + const inv = 1 / exponent.numericValue; + if (Number.isInteger(inv)) + return inv; + return null; + } + if (exponent.numericValue instanceof decimal_default) { + const inv = exponent.engine._BIGNUM_ONE.div(exponent.numericValue); + if (inv.isInt()) + return inv.toNumber(); + return null; + } + if (!isRational(exponent.numericValue)) + return null; + const [n, d] = [ + machineNumerator(exponent.numericValue), + machineDenominator(exponent.numericValue) + ]; + if (n !== 1 && n !== -1) + return null; + return n * d; +} +function canonicalMultiply(ce, ops2) { + /* @__PURE__ */ console.assert(ops2.every((x) => x.isCanonical)); + if (ops2.length === 0) + return ce.number(1); + if (ops2.length === 1) + return ops2[0]; + if (ops2.length === 2) + return multiply2(ops2[0], ops2[1]); + const product = new Product(ce); + for (const op3 of ops2) { + if (op3.isNaN || op3.symbol === "Undefined") + return ce._NAN; + product.addTerm(op3); + } + return product.asExpression(); +} +function simplifyMultiply(ce, ops2) { + /* @__PURE__ */ console.assert(ops2.every((x) => x.head !== "Multiply")); + const product = new Product(ce); + for (let op3 of ops2) { + op3 = op3.simplify(); + if (op3.isNaN || op3.symbol === "Undefined") + return ce._NAN; + product.addTerm(op3); + } + return product.asExpression(); +} +function evalMultiply(ce, ops2, mode = "evaluate") { + /* @__PURE__ */ console.assert(ops2.length > 1, "evalMultiply(): no arguments"); + if (mode === "N") { + ops2 = ops2.map((x) => x.N()); + if ((ce.numericMode === "machine" || ce.numericMode === "auto") && ops2.every((x) => typeof x.numericValue === "number")) { + let prod = 1; + for (const op3 of ops2) + prod *= op3.numericValue; + return ce.number(prod); + } + } + for (const op3 of ops2) { + if (op3.isNaN || op3.symbol === "Undefined") + return ce._NAN; + if (!op3.isExact) + mode = "N"; + } + /* @__PURE__ */ console.assert(ops2.every((x) => x.head !== "Multiply")); + if (mode === "N") + ops2 = ops2.map((x) => x.N()); + else + ops2 = ops2.map((x) => x.evaluate()); + return new Product(ce, ops2).asExpression(mode); +} +function multiply2(op12, op22, metadata) { + var _a; + /* @__PURE__ */ console.assert(op12.isCanonical); + /* @__PURE__ */ console.assert(op22.isCanonical); + const ce = op12.engine; + if (op12.symbol === "ImaginaryUnit") { + const f = asFloat(op22); + if (f !== null) + return ce.number(ce.complex(0, f)); + } + if (op22.symbol === "ImaginaryUnit") { + const f = asFloat(op12); + if (f !== null) + return ce.number(ce.complex(0, f)); + } + if (op12.numericValue !== null && op22.numericValue !== null) { + const f1 = asFloat(op12); + const f2 = asFloat(op22); + if (f1 !== null && ce.isComplex(op22)) + return ce.number(ce.complex(f1 * op22.re, f1 * op22.im)); + if (f2 !== null && ce.isComplex(op12)) + return ce.number(ce.complex(f2 * op12.re, f2 * op12.im)); + } + if (op12.numericValue !== null && op22.numericValue !== null && op12.isInteger && op22.isInteger) { + return (_a = apply2N( + op12, + op22, + (a, b) => a * b, + (a, b) => a.mul(b) + )) != null ? _a : ce._NAN; + } + if (op12.isNaN || op22.isNaN || op12.symbol === "Undefined" || op22.symbol === "Undefined") + return ce._NAN; + if (op12.isNothing) + return op22; + if (op22.isNothing) + return op12; + if (op12.numericValue !== null) { + if (op12.isOne) + return op22; + if (op12.isNegativeOne) + return canonicalNegate(op22); + } + if (op22.numericValue !== null) { + if (op22.isOne) + return op12; + if (op22.isNegativeOne) + return canonicalNegate(op12); + } + let sign2 = 1; + let [t, c] = op12.numericValue !== null ? [op12, op22] : [op22, op12]; + /* @__PURE__ */ console.assert(t.head !== "Subtract"); + if (t.head === "Negate") { + t = t.op1; + sign2 = -sign2; + } + if (c.numericValue !== null) { + const r = asRational(c); + if (r) { + if (isRationalOne(r)) + return t; + if (isRationalZero(r)) + return ce._ZERO; + if (t.head === "Add") { + if (sign2 < 0) + c = canonicalNegate(c); + return ce.add( + t.ops.map((x) => multiply2(c, x)), + metadata + ); + } + const tr = asRational(t); + if (tr) { + const p = mul2(r, tr); + return ce.number(sign2 < 0 ? neg(p) : p, { metadata }); + } + if (sign2 < 0) + return ce._fn("Multiply", [canonicalNegate(c), t], metadata); + return ce._fn("Multiply", [c, t], metadata); + } + } + if (c.hash === t.hash && c.isSame(t)) + return square(ce, c); + const product = new Product(ce, [c, t]); + if (sign2 > 0) + return product.asExpression(); + return canonicalNegate(product.asExpression(), metadata); +} +function canonicalProduct(ce, body, range) { + var _a, _b, _c, _d, _e, _f, _g, _h; + body != null ? body : body = ce.error("missing"); + let index = null; + let lower = null; + let upper = null; + if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { + index = range; + } else if (range) { + index = (_b = (_a = range.ops) == null ? void 0 : _a[0]) != null ? _b : null; + lower = (_e = (_d = (_c = range.ops) == null ? void 0 : _c[1]) == null ? void 0 : _d.canonical) != null ? _e : null; + upper = (_h = (_g = (_f = range.ops) == null ? void 0 : _f[2]) == null ? void 0 : _g.canonical) != null ? _h : null; + } + if (index && index.head === "Hold") + index = index.op1; + if (index && index.head === "ReleaseHold") + index = index.op1.evaluate(); + index != null ? index : index = ce.symbol("Nothing"); + if (!index.symbol) + index = ce.error(["incompatible-domain", "Symbol", index.domain]); + else + index = ce.hold(index); + if (lower && lower.isFinite) + lower = validateArgument(ce, lower, "Integer"); + if (upper && upper.isFinite) + upper = validateArgument(ce, upper, "Integer"); + if (lower && upper) + range = ce.tuple([index, lower, upper]); + else if (upper) + range = ce.tuple([index, ce.number(1), upper]); + else if (lower) + range = ce.tuple([index, lower]); + else + range = index; + return ce._fn("Product", [body.canonical, range]); +} +function evalMultiplication(ce, expr, range, mode) { + var _a; + const [index, lower, upper, isFinite2] = normalizeLimits(range); + const fn = expr; + if (mode !== "N" && (lower >= upper || upper - lower >= MAX_SYMBOLIC_TERMS)) + return void 0; + let result = null; + const savedContext = ce.context; + ce.context = (_a = fn.scope) != null ? _a : ce.context; + if (mode === "simplify") { + const terms = []; + if (!fn.scope) + for (let i = lower; i <= upper; i++) + terms.push(fn.simplify()); + else + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + terms.push(fn.simplify()); + } + result = ce.mul(terms).simplify(); + } + if (mode === "evaluate") { + const terms = []; + if (!fn.scope) + for (let i = lower; i <= upper; i++) + terms.push(fn.evaluate()); + else + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + terms.push(fn.evaluate()); + } + result = ce.mul(terms).evaluate(); + } + if (mode === "N") { + if (result === null && !fn.scope) { + const n = fn.N(); + if (!isFinite2) { + if (n.isZero) + result = ce._ZERO; + else if (n.isPositive) + result = ce._POSITIVE_INFINITY; + else + result = ce._NEGATIVE_INFINITY; + } + if (result === null && fn.isPure) + result = ce.pow(n, ce.number(upper - lower + 1)); + } + if (result === null && isFinite2) { + if (bignumPreferred(ce)) { + let product2 = ce.bignum(1); + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asBignum(fn.N()); + if (term === null || !term.isFinite()) { + result = term !== null ? ce.number(term) : void 0; + break; + } + product2 = product2.mul(term); + } + if (result === null) + result = ce.number(product2); + } + let product = 1; + const numericMode = ce.numericMode; + ce.numericMode = "machine"; + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asFloat(fn.N()); + if (term === null || !Number.isFinite(term)) { + result = term !== null ? ce.number(term) : void 0; + break; + } + product *= term; + } + ce.numericMode = numericMode; + if (result === null) + result = ce.number(product); + } + if (result === null) { + ce.set({ [index]: 1e3 }); + const nMax = fn.N(); + ce.set({ [index]: 999 }); + const nMaxMinusOne = fn.N(); + const ratio = asFloat(ce.div(nMax, nMaxMinusOne).N()); + if (ratio !== null && Number.isFinite(ratio) && Math.abs(ratio) > 1) { + result = ce._POSITIVE_INFINITY; + } else { + let product = 1; + const numericMode = ce.numericMode; + ce.numericMode = "machine"; + for (let i = lower; i <= upper; i++) { + ce.set({ [index]: i }); + const term = asFloat(fn.N()); + if (term === null) { + result = void 0; + break; + } + if (Math.abs(1 - term) < Number.EPSILON || !Number.isFinite(term)) + break; + product *= term; + } + if (result === null) + result = ce.number(product); + ce.numericMode = numericMode; + } + } + } + ce.context = savedContext; + return result != null ? result : void 0; +} +function canonicalDivide(ce, op12, op22) { + if (!op12.isValid || !op22.isValid) + return ce._fn("Divide", [op12, op22]); + if (op12.head === "Negate" && op22.head === "Negate") { + op12 = op12.op1; + op22 = op22.op1; + } + if (op12.numericValue !== null && op22.numericValue !== null) { + if (op22.isOne) + return op12; + if (op22.isNegativeOne) + return ce.neg(op12); + if (op12.isOne) + return ce.inv(op22); + if (op12.isNegativeOne) + return ce.neg(ce.inv(op22)); + const r1 = asRational(op12); + const r2 = asRational(op22); + if (r1 && r2 && !isRationalZero(r2)) + return ce.number(mul2(r1, inverse(r2))); + } + if (op12.head === "Divide" && op22.head === "Divide") { + return canonicalDivide( + ce, + ce.mul([op12.op1, op22.op2]), + ce.mul([op12.op2, op22.op1]) + ); + } + if (op12.head === "Divide") + return canonicalDivide(ce, ce.mul([op12.op1, op22]), op12.op2); + if (op22.head === "Divide") + return canonicalDivide(ce, ce.mul([op12, op22.op2]), op22.op1); + const num1 = op12.numericValue; + if (num1 !== null) { + if (isMachineRational(num1)) { + const [a, b] = num1; + return canonicalDivide(ce, ce.number(a), ce.mul([ce.number(b), op22])); + } + if (isBigRational(num1)) { + const [a, b] = num1; + return canonicalDivide(ce, ce.number(a), ce.mul([ce.number(b), op22])); + } + } + const num2 = op22.numericValue; + if (num2 !== null) { + if (isMachineRational(num2)) { + const [a, b] = num2; + return canonicalDivide(ce, ce.mul([op12, ce.number(b)]), ce.number(a)); + } + if (isBigRational(num2)) { + const [a, b] = num2; + return canonicalDivide(ce, ce.mul([op12, ce.number(b)]), ce.number(a)); + } + } + const [c1, t1] = asCoefficient(op12); + const [c2, t2] = asCoefficient(op22); + if (!isRationalOne(c1) || !isRationalOne(c2)) { + const [cn, cd] = mul2(c1, inverse(c2)); + const en = ce.mul([ce.number(cn), t1]); + if (en.isZero) + return ce._ZERO; + const ed = ce.mul([ce.number(cd), t2]); + if (ed.isOne) + return en; + return ce._fn("Divide", [en, ed]); + } + let [nSign, n] = makePositive(op12); + let [dSign, d] = makePositive(op22); + n = n.canonical; + d = d.canonical; + if (d.numericValue !== null && d.isOne) + return nSign * dSign < 0 ? canonicalNegate(n) : n; + if (nSign * dSign > 0) + return ce._fn("Divide", [n, d]); + if (n.numericValue) + return ce._fn("Divide", [canonicalNegate(n), d]); + return canonicalNegate(ce._fn("Divide", [n, d])); +} +function simplifyDivide(ce, op12, op22) { + if (op12.numericValue !== null && op22.numericValue !== null) { + const r1 = asRational(op12); + const r2 = asRational(op22); + if (r1 && r2 && !isRationalZero(r2)) + return ce.number(mul2(r1, inverse(r2))); + } + return new Product(ce, [op12, ce.inv(op22)]).asRationalExpression(); +} +var import_complex16 = __toESM(require_complex()); +var ARITHMETIC_LIBRARY = [ + { + // + // Functions + // + Abs: { + wikidata: "Q3317982", + // magnitude 'Q120812 (for reals) + threadable: true, + idempotent: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "NonNegativeNumber"], + simplify: (ce, ops2) => processAbs(ce, ops2[0], "simplify"), + evaluate: (ce, ops2) => processAbs(ce, ops2[0], "evaluate"), + N: (ce, ops2) => processAbs(ce, ops2[0], "N") + } + }, + Add: { + wikidata: "Q32043", + associative: true, + commutative: true, + threadable: true, + idempotent: true, + complexity: 1300, + hold: "all", + signature: { + domain: "NumericFunction", + codomain: (ce, args) => domainAdd( + ce, + args.map((x) => x.domain) + ), + // canonical: (ce, args) => canonicalAdd(ce, args), // never called: shortpath + simplify: (ce, ops2) => simplifyAdd(ce, ops2), + evaluate: (ce, ops2) => evalAdd(ce, ops2), + N: (ce, ops2) => evalAdd(ce, ops2, "N") + } + }, + Ceil: { + description: "Rounds a number up to the next largest integer", + complexity: 1250, + signature: { + domain: ["Function", "Number", "Integer"], + evaluate: (_ce, ops2) => applyN( + ops2[0], + Math.ceil, + (x) => x.ceil(), + (z) => z.ceil(0) + ) + } + }, + Chop: { + associative: true, + threadable: true, + idempotent: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => applyN( + ops2[0], + (x) => ce.chop(x), + (x) => ce.chop(x), + (x) => ce.chop(x) + ) + } + }, + Complex: { + // This function is converted during boxing, so unlikely to encounter + wikidata: "Q11567", + complexity: 500 + }, + Divide: { + wikidata: "Q1226939", + complexity: 2500, + // - if numer product of numbers, or denom product of numbers, + // i.e. √2x/2 -> 0.707x, 2/√2x -> 1.4142x + signature: { + domain: ["Function", "Number", "Number", "Number"], + canonical: (ce, args) => { + args = validateArguments(ce, canonical(flattenSequence(args)), [ + "Number", + "Number" + ]); + if (args.length !== 2) + return ce._fn("Divide", args); + return ce.div(args[0], args[1]); + }, + simplify: (ce, args) => simplifyDivide(ce, args[0], args[1]), + evaluate: (ce, ops2) => apply2N( + ops2[0], + ops2[1], + (n, d) => n / d, + (n, d) => n.div(d), + (n, d) => n.div(d) + ) + } + }, + Exp: { + wikidata: "Q168698", + threadable: true, + complexity: 3500, + // Exp(x) -> e^x + signature: { + domain: ["Function", "Number", "Number"], + canonical: (ce, args) => { + args = validateArguments(ce, canonical(flattenSequence(args)), [ + "Number" + ]); + if (args.length !== 1) + return ce._fn("Power", args); + return ce.pow(ce.symbol("ExponentialE"), args[0]); + } + } + }, + Factorial: { + description: "Factorial Function", + wikidata: "Q120976", + complexity: 9e3, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const n = asSmallInteger(ops2[0]); + if (n !== null && n >= 0) { + if (!bignumPreferred(ce)) + return ce.number(factorial(n)); + return ce.number(factorial2(ce, ce.bignum(n))); + } + const num = ops2[0].numericValue; + if (num !== null && num instanceof import_complex16.default) + return ce.number(gamma3(num.add(1))); + const f = asFloat(ops2[0]); + if (f !== null) + return ce.number(gamma(1 + f)); + return void 0; + } + } + }, + Floor: { + wikidata: "Q56860783", + complexity: 1250, + signature: { + domain: ["Function", "Number", "ExtendedRealNumber"], + evaluate: (ce, ops2) => applyN( + ops2[0], + Math.floor, + (x) => x.floor(), + (z) => z.floor(0) + ) + } + }, + Gamma: { + wikidata: "Q190573", + complexity: 8e3, + signature: { + domain: ["Function", "Number", "Number"], + N: (ce, ops2) => applyN( + ops2[0], + (x) => gamma(x), + (x) => gamma2(ce, x), + (x) => gamma3(x) + ) + } + }, + LogGamma: { + complexity: 8e3, + signature: { + domain: ["Function", "Number", "Number"], + N: (ce, ops2) => applyN( + ops2[0], + (x) => lngamma(x), + (x) => lngamma2(ce, x), + (x) => lngamma3(x) + ) + } + }, + Ln: { + description: "Natural Logarithm", + wikidata: "Q204037", + complexity: 4e3, + signature: { + domain: ["Function", "Number", "Number"], + N: (ce, ops2) => applyN( + ops2[0], + (x) => x >= 0 ? Math.log(x) : ce.complex(x).log(), + (x) => !x.isNeg() ? x.ln() : ce.complex(x.toNumber()).log(), + (z) => z.log() + ) + } + }, + Log: { + description: "Log(z, b = 10) = Logarithm of base b", + wikidata: "Q11197", + complexity: 4100, + signature: { + domain: ["Function", "Number", ["Maybe", "Number"], "Number"], + canonical: (ce, ops2) => { + ops2 = canonical(flattenSequence(ops2)); + if (ops2.length === 1) + return ce._fn("Log", [validateArgument(ce, ops2[0], "Number")]); + if (ops2.length === 2) { + const arg = validateArgument(ce, ops2[0], "Number"); + const base = validateArgument(ce, ops2[1], "Number"); + if (base.numericValue === 10) + return ce._fn("Log", [arg]); + return ce._fn("Log", [arg, base]); + } + return ce._fn("Log", validateArgumentCount(ce, ops2, 2)); + }, + N: (ce, ops2) => { + if (ops2[1] === void 0) + return applyN( + ops2[0], + (x) => x >= 0 ? Math.log10(x) : ce.complex(x).log().div(Math.LN10), + (x) => !x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN10), + (z) => z.log().div(Math.LN10) + ); + return apply2N( + ops2[0], + ops2[1], + (a, b) => Math.log(a) / Math.log(b), + (a, b) => a.log(b), + (a, b) => a.log().div(typeof b === "number" ? Math.log(b) : b.log()) + ); + } + } + }, + Lb: { + description: "Base-2 Logarithm", + wikidata: "Q581168", + complexity: 4100, + signature: { + domain: ["Function", "Number", "Number"], + N: (ce, ops2) => applyN( + ops2[0], + (x) => x >= 0 ? Math.log2(x) : ce.complex(x).log().div(Math.LN2), + (x) => x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN2), + (z) => z.log().div(Math.LN2) + ) + } + }, + Lg: { + description: "Base-10 Logarithm", + wikidata: "Q966582", + complexity: 4100, + signature: { + domain: ["Function", "Number", "Number"], + N: (ce, ops2) => applyN( + ops2[0], + (x) => x >= 0 ? Math.log10(x) : ce.complex(x).log().div(Math.LN10), + (x) => !x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN10), + (z) => z.log().div(Math.LN10) + ) + } + }, + Max: { + description: "Maximum of two or more numbers", + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + simplify: (ce, ops2) => { + if (ops2.length === 0) + return ce._NEGATIVE_INFINITY; + if (ops2.length === 1) + return ops2[0]; + return ce.fn("Max", ops2); + }, + evaluate: (ce, ops2) => { + if (ops2.length === 0) + return ce._NEGATIVE_INFINITY; + let result = void 0; + const rest = []; + for (const op3 of ops2) { + if (!op3.isNumber || op3.numericValue === void 0) + rest.push(op3); + else if (!result || op3.isGreater(result)) + result = op3; + } + if (rest.length > 0) + return ce.box(result ? ["Max", result, ...rest] : ["Max", ...rest]); + return result != null ? result : ce._NAN; + } + } + }, + Min: { + description: "Minimum of two or more numbers", + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + simplify: (ce, ops2) => { + if (ops2.length === 0) + return ce._NEGATIVE_INFINITY; + if (ops2.length === 1) + return ops2[0]; + return ce.fn("Min", ops2); + }, + evaluate: (ce, ops2) => { + if (ops2.length === 0) + return ce._NEGATIVE_INFINITY; + let result = void 0; + const rest = []; + for (const op3 of ops2) { + if (!op3.isNumber || op3.numericValue === void 0) + rest.push(op3); + else if (!result || op3.isLess(result)) + result = op3; + } + if (rest.length > 0) + return ce.box(result ? ["Min", result, ...rest] : ["Min", ...rest]); + return result != null ? result : ce._NAN; + } + } + }, + Multiply: { + wikidata: "Q40276", + associative: true, + commutative: true, + idempotent: true, + complexity: 2100, + hold: "all", + signature: { + domain: "NumericFunction", + // Never called: fastpath + // canonical: (ce, args) => { + // return canonicalMultiply(ce, args); + // }, + simplify: (ce, ops2) => simplifyMultiply(ce, ops2), + evaluate: (ce, ops2) => evalMultiply(ce, ops2), + N: (ce, ops2) => evalMultiply(ce, ops2, "N") + } + }, + Negate: { + description: "Additive Inverse", + wikidata: "Q715358", + complexity: 2e3, + signature: { + domain: ["Function", "Number", "Number"], + codomain: (ce, args) => { + const arg = args[0].domain; + if (!arg.literal) + return arg; + const negDomain = { + PositiveNumber: "NegativeNumber", + NonNegativeNumber: "NonPositiveNumber", + NonPositiveNumber: "NonNegativeNumber", + NegativeNumber: "PositiveNumber", + PositiveInteger: "NegativeInteger", + NonNegativeInteger: "NonPositiveInteger", + NonPositiveInteger: "NonNegativeInteger", + NegativeInteger: "PositiveInteger" + }[arg.literal]; + if (negDomain) + return ce.domain(negDomain); + return arg; + }, + canonical: (ce, args) => { + args = validateArguments(ce, canonical(flattenSequence(args)), [ + "Number" + ]); + if (args.length !== 1) + return ce._fn("Negate", args); + return canonicalNegate(args[0]); + }, + simplify: (ce, ops2) => processNegate(ce, ops2[0], "simplify"), + evaluate: (ce, ops2) => processNegate(ce, ops2[0], "evaluate"), + N: (ce, ops2) => processNegate(ce, ops2[0], "N"), + sgn: (_ce, args) => { + const s = args[0].sgn; + if (s === void 0 || s === null) + return void 0; + if (s === 0) + return 0; + if (s > 0) + return -1; + if (s < 0) + return 1; + return void 0; + } + } + }, + Power: { + wikidata: "Q33456", + commutative: false, + complexity: 3500, + signature: { + domain: ["Function", "Number", "Number", "Number"], + canonical: (ce, args) => { + args = validateArguments(ce, canonical(flattenSequence(args)), [ + "Number", + "Number" + ]); + if (args.length !== 2) + return ce._fn("Power", args); + return ce.pow(args[0], args[1]); + }, + simplify: (ce, ops2) => processPower(ce, ops2[0], ops2[1], "simplify"), + evaluate: (ce, ops2) => processPower(ce, ops2[0], ops2[1], "evaluate"), + N: (ce, ops2) => { + if (ce.numericMode === "machine" && typeof ops2[0].numericValue === "number" && typeof ops2[1].numericValue === "number") + return ce.number( + Math.pow(ops2[0].numericValue, ops2[1].numericValue) + ); + return processPower(ce, ops2[0], ops2[1], "N"); + } + // Defined as RealNumber for all power in RealNumber when base > 0; + // when x < 0, only defined if n is an integer + // if x is a non-zero complex, defined as ComplexNumber + // Square root of a prime is irrational (AlgebraicNumber) + // https://proofwiki.org/wiki/Square_Root_of_Prime_is_Irrational + // evalDomain: (ce, base: BoxedExpression, power: BoxedExpression) ; + } + }, + Product: { + wikidata: "Q901718", + complexity: 1e3, + hold: "first", + signature: { + domain: [ + "Function", + "Anything", + // [ + // 'Maybe', + "Tuple", + // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], + // ], + "Number" + ], + // codomain: (ce, args) => domainAdd(ce, args), + // The 'body' and 'range' need to be interpreted by canonicalMultiplication(). Don't canonicalize them yet. + canonical: (ce, ops2) => canonicalProduct(ce, ops2[0], ops2[1]), + simplify: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "simplify"), + evaluate: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "evaluate"), + N: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "N") + } + }, + Rational: { + complexity: 2400, + signature: { + domain: ["Function", "Number", ["Maybe", "Number"], "RationalNumber"], + canonical: (ce, args) => { + args = canonical(flattenSequence(args)); + if (args.length === 0) + return ce._fn("Rational", [ce.error("missing")]); + if (args.length === 1) + return ce._fn("Rational", [ + validateArgument(ce, args[0], "ExtendedRealNumber") + ]); + args = validateArguments(ce, args, ["Integer", "Integer"]); + if (args.length !== 2) + return ce._fn("Rational", args); + return ce.div(args[0], args[1]); + }, + simplify: (ce, ops2) => { + if (ops2.length !== 2) + return void 0; + return simplifyDivide(ce, ops2[0], ops2[1]); + }, + evaluate: (ce, ops2) => { + if (ops2.length === 2) { + const [n, d] = [asSmallInteger(ops2[0]), asSmallInteger(ops2[1])]; + if (n !== null && d !== null) + return ce.number([n, d]); + return void 0; + } + const f = asFloat(ops2[0].N()); + if (f === null) + return void 0; + return ce.number(rationalize(f)); + }, + N: (ce, ops2) => { + if (ops2.length === 1) + return ops2[0]; + return apply2N( + ops2[0], + ops2[1], + (a, b) => a / b, + (a, b) => a.div(b), + (a, b) => a.div(b) + ); + } + } + }, + Root: { + complexity: 3200, + signature: { + domain: ["Function", "Number", "Number", "Number"], + canonical: (ce, args) => { + args = canonical(flattenSequence(args)); + if (args.length > 2) + return ce._fn("Root", validateArgumentCount(ce, args, 2)); + const [base, exp2] = [ + validateArgument(ce, args[0], "Number"), + validateArgument(ce, args[1], "Number") + ]; + if (!exp2.isValid || !base.isValid) + return ce._fn("Root", [base, exp2]); + return ce.pow(base, ce.inv(exp2)); + } + } + }, + Round: { + complexity: 1250, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => applyN( + ops2[0], + Math.round, + (x) => x.round(), + (x) => x.round(0) + ) + } + }, + Sign: { + complexity: 1200, + signature: { + domain: ["Function", "Number", ["Range", -1, 1]], + simplify: (ce, ops2) => { + const s = ops2[0].sgn; + if (s === 0) + return ce._ZERO; + if (s === 1) + return ce._ONE; + if (s === -1) + return ce._NEGATIVE_ONE; + return void 0; + }, + evaluate: (ce, ops2) => { + const s = ops2[0].sgn; + if (s === 0) + return ce._ZERO; + if (s === 1) + return ce._ONE; + if (s === -1) + return ce._NEGATIVE_ONE; + return void 0; + }, + N: (ce, ops2) => { + const s = ops2[0].sgn; + if (s === 0) + return ce._ZERO; + if (s === 1) + return ce._ONE; + if (s === -1) + return ce._NEGATIVE_ONE; + return void 0; + } + } + }, + SignGamma: { + description: "The sign of the gamma function: -1 or +1", + complexity: 7900 + // @todo + }, + Sqrt: { + description: "Square Root", + wikidata: "Q134237", + complexity: 3e3, + signature: { + domain: ["Function", "Number", "Number"], + canonical: (ce, args) => { + args = canonical(flattenSequence(args)); + if (args.length !== 1) + return ce._fn("Sqrt", args); + return ce.pow(args[0], ce._HALF); + }, + simplify: (ce, ops2) => processSqrt(ce, ops2[0], "simplify"), + evaluate: (ce, ops2) => processSqrt(ce, ops2[0], "evaluate"), + N: (ce, ops2) => processSqrt(ce, ops2[0], "N") + // evalDomain: Square root of a prime is irrational + // https://proofwiki.org/wiki/Square_Root_of_Prime_is_Irrational + } + }, + Square: { + wikidata: "Q3075175", + complexity: 3100, + signature: { + domain: ["Function", "Number", "Number"], + canonical: (ce, args) => { + args = canonical(flattenSequence(args)); + if (args.length !== 1) + return ce._fn("Square", args); + return ce.pow(args[0], ce.number(2)); + } + } + }, + Subtract: { + wikidata: "Q40754", + complexity: 1350, + signature: { + domain: ["Function", "Number", ["Maybe", "Number"], "Number"], + canonical: (ce, args) => { + args = canonical(flattenSequence(args)); + if (args.length === 1) + return canonicalNegate(args[0]); + args = validateArgumentCount(ce, args, 2); + if (args.length !== 2) + return ce._fn("Subtract", args); + if (!args.every((x) => x.isValid)) + return ce._fn("Subtract", args); + return ce.add([args[0], canonicalNegate(args[1])]); + } + } + }, + Sum: { + wikidata: "Q218005", + complexity: 1e3, + hold: "all", + signature: { + domain: [ + "Function", + "Anything", + // [ + // 'Maybe', + "Tuple", + // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], + // ], + "Number" + ], + canonical: (ce, ops2) => canonicalSummation(ce, ops2[0], ops2[1]), + simplify: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "simplify"), + evaluate: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "evaluate"), + N: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "N") + } + } + }, + { + // + // Constants + // Note: constants are put in a separate, subsequent, dictionary because + // some of the values (CatalanConstant) reference some function names (Add...) + // that are defined above. This avoid circular references. + // + e: { + domain: "TranscendentalNumber", + constant: true, + holdUntil: "never", + value: "ExponentialE" + }, + i: { + domain: "ImaginaryNumber", + constant: true, + holdUntil: "never", + flags: { imaginary: true }, + value: "ImaginaryUnit" + }, + MachineEpsilon: { + /** + * The difference between 1 and the next larger floating point number + * + * 2^{−52} + * + * See https://en.wikipedia.org/wiki/Machine_epsilon + */ + domain: "RealNumber", + holdUntil: "N", + constant: true, + flags: { real: true }, + value: { num: Number.EPSILON.toString() } + }, + Half: { + constant: true, + holdUntil: "evaluate", + value: ["Rational", 1, 2] + }, + ImaginaryUnit: { + domain: "ImaginaryNumber", + constant: true, + holdUntil: "evaluate", + wikidata: "Q193796", + flags: { imaginary: true }, + value: ["Complex", 0, 1] + }, + ExponentialE: { + domain: "TranscendentalNumber", + flags: { algebraic: false, real: true }, + wikidata: "Q82435", + constant: true, + holdUntil: "N", + value: (engine) => bignumPreferred(engine) ? engine._BIGNUM_ONE.exp() : Math.exp(1) + }, + GoldenRatio: { + domain: "AlgebraicNumber", + wikidata: "Q41690", + constant: true, + flags: { algebraic: true }, + holdUntil: "simplify", + value: ["Divide", ["Add", 1, ["Sqrt", 5]], 2] + }, + CatalanConstant: { + domain: "RealNumber", + flags: { algebraic: void 0 }, + // Not proven irrational or transcendental + wikidata: "Q855282", + constant: true, + holdUntil: "N", + value: { + // From http://www.fullbooks.com/Miscellaneous-Mathematical-Constants1.html + num: `0.91596559417721901505460351493238411077414937428167 + 21342664981196217630197762547694793565129261151062 + 48574422619196199579035898803325859059431594737481 + 15840699533202877331946051903872747816408786590902 + 47064841521630002287276409423882599577415088163974 + 70252482011560707644883807873370489900864775113225 + 99713434074854075532307685653357680958352602193823 + 23950800720680355761048235733942319149829836189977 + 06903640418086217941101917532743149978233976105512 + 24779530324875371878665828082360570225594194818097 + 53509711315712615804242723636439850017382875977976 + 53068370092980873887495610893659771940968726844441 + 66804621624339864838916280448281506273022742073884 + 31172218272190472255870531908685735423498539498309 + 91911596738846450861515249962423704374517773723517 + 75440708538464401321748392999947572446199754961975 + 87064007474870701490937678873045869979860644874974 + 64387206238513712392736304998503539223928787979063 + 36440323547845358519277777872709060830319943013323 + 16712476158709792455479119092126201854803963934243 + ` + } + }, + EulerGamma: { + // From http://www.fullbooks.com/Miscellaneous-Mathematical-Constants2.html + domain: "RealNumber", + flags: { algebraic: void 0 }, + // Not proven irrational or transcendental + wikidata: "Q273023", + holdUntil: "N", + constant: true, + value: { + num: `0.57721566490153286060651209008240243104215933593992359880576723488486772677766 + 467093694706329174674951463144724980708248096050401448654283622417399764492353 + 625350033374293733773767394279259525824709491600873520394816567085323315177661 + 152862119950150798479374508570574002992135478614669402960432542151905877553526 + 733139925401296742051375413954911168510280798423487758720503843109399736137255 + 306088933126760017247953783675927135157722610273492913940798430103417771778088 + 154957066107501016191663340152278935867965497252036212879226555953669628176388 + 792726801324310104765059637039473949576389065729679296010090151251959509222435 + 014093498712282479497471956469763185066761290638110518241974448678363808617494 + 551698927923018773910729457815543160050021828440960537724342032854783670151773 + 943987003023703395183286900015581939880427074115422278197165230110735658339673` + } + } + }, + { + PreIncrement: { + signature: { domain: ["Function", "Number", "Number"] } + }, + PreDecrement: { + signature: { domain: ["Function", "Number", "Number"] } + } + } +]; +function processAbs(ce, arg, mode) { + if (mode !== "simplify") { + const num = arg.numericValue; + if (num !== null) { + if (typeof num === "number") + return ce.number(Math.abs(num)); + if (num instanceof decimal_default) + return ce.number(num.abs()); + if (num instanceof import_complex16.default) + return ce.number(num.abs()); + if (isMachineRational(num)) + return ce.number( + mode === "N" ? Math.abs(num[0] / num[1]) : [Math.abs(num[0]), num[1]] + ); + if (isBigRational(num)) { + const [n, d] = num; + return ce.number( + mode === "N" ? ce.bignum(n).div(ce.bignum(d)).abs() : [n > 0 ? n : -n, d] + ); + } + } + } + if (arg.isNonNegative) + return arg; + if (arg.isNegative) + return ce.neg(arg); + return void 0; +} +var CALCULUS_LIBRARY = [ + { + // + // Functions + // + Integrate: { + wikidata: "Q80091", + hold: "all", + signature: { + domain: [ + "Function", + "Anything", + ["Union", "Nothing", "Tuple", "Symbol"], + // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], + "Number" + ], + canonical: (ce, ops2) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _i; + const body = (_a = ops2[0]) != null ? _a : ce.error("missing"); + let range = ops2[1]; + let index = null; + let lower = null; + let upper = null; + if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { + index = range; + } else if (range) { + index = (_c = (_b = range.ops) == null ? void 0 : _b[0]) != null ? _c : null; + lower = (_f = (_e = (_d = range.ops) == null ? void 0 : _d[1]) == null ? void 0 : _e.canonical) != null ? _f : null; + upper = (_i = (_h = (_g = range.ops) == null ? void 0 : _g[2]) == null ? void 0 : _h.canonical) != null ? _i : null; + } + if (index && index.head === "Hold") + index = index.op1; + if (index && index.head === "ReleaseHold") + index = index.op1.evaluate(); + index != null ? index : index = ce.symbol("Nothing"); + if (!index.symbol) + index = ce.error(["incompatible-domain", "Symbol", index.domain]); + if (lower) + lower = validateArgument(ce, lower, "Number"); + if (upper) + upper = validateArgument(ce, upper, "Number"); + if (lower && upper) + range = ce.tuple([index, lower, upper]); + else if (upper) + range = ce.tuple([index, ce._NEGATIVE_INFINITY, upper]); + else if (lower) + range = ce.tuple([index, lower]); + else + range = index; + return ce._fn("Integrate", [body.canonical, range]); + } + } + } + } +]; +var COLLECTIONS_LIBRARY = { + Sequence: { + signature: { + domain: "Function" + } + } +}; +var COMPLEX_LIBRARY = [ + { + Real: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const op3 = ops2[0].numericValue; + if (op3 === null) + return void 0; + if (ce.isComplex(op3)) + return ce.number(op3.re); + return ops2[0]; + } + } + }, + Imaginary: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const op3 = ops2[0].numericValue; + if (op3 === null) + return void 0; + if (ce.isComplex(op3)) + return ce.number(op3.im); + return ce._ZERO; + } + } + }, + Argument: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const op3 = ops2[0].numericValue; + if (op3 === null) + return void 0; + if (ce.isComplex(op3)) + return ce.number(op3.arg()); + const f = asFloat(ops2[0]); + if (f === null) + return void 0; + if (f >= 0) + return ce.number(0); + return ce.number(Math.PI); + } + } + }, + AbsArg: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Tuple"], + evaluate: (ce, ops2) => { + const op3 = ops2[0].numericValue; + if (op3 === null) + return void 0; + if (ce.isComplex(op3)) + return ce.tuple([ce.number(op3.abs()), ce.number(op3.arg())]); + const f = asFloat(ops2[0]); + if (f === null) + return void 0; + return ce.tuple([ + ce.number(Math.abs(f)), + ce.number(f >= 0 ? 0 : Math.PI) + ]); + } + } + }, + Conjugate: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const op3 = ops2[0].numericValue; + if (op3 === null || !ce.isComplex(op3)) + return void 0; + return ce.number(op3.conjugate()); + } + } + }, + ComplexRoots: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", "Number", "Number", "List"], + evaluate: (ce, ops2) => { + const x = asFloat(ops2[0]); + const n = asFloat(ops2[1]); + if (x === null || n === null || !Number.isInteger(n) || n <= 0) + return void 0; + const roots = []; + const [re, im] = ce.isComplex(x) ? [x.re, x.im] : [x, 0]; + const arg = Math.atan2(im, re); + const mod2 = Math.sqrt(re * re + im * im); + for (let k = 0; k < n; k++) { + const theta = (arg + 2 * Math.PI * k) / n; + const r = Math.pow(mod2, 1 / n); + roots.push([r * Math.cos(theta), r * Math.sin(theta)]); + } + return ce.box([ + "List", + ...roots.map( + (r) => ce.number(r[1] !== 0 ? ce.complex(r[0], r[1]) : r[0]) + ) + ]); + } + } + } + // For Abs (magnitude) see src/compute-engine/library/processAbs + } +]; +function oneOf(xs) { + return xs[Math.floor(Math.random() * xs.length)]; +} +function randomExpressionWithHead(head2, level) { + if (head2 === "Add" || head2 === "Multiply") { + const ops2 = []; + let count = 1 + Math.floor(Math.random() * 12); + while (count > 0) { + ops2.push(randomExpression(level + 1)); + count -= 1; + } + return [head2, ...ops2]; + } + if (head2 === "Divide" || head2 === "Power") { + return [head2, randomExpression(level + 1), randomExpression(level + 1)]; + } + if (head2 === "Root") { + return [head2, randomExpression(level + 1), randomExpression(10)]; + } + if (head2 === "trig") + return randomTrig(); + return [head2, randomExpression(level + 1)]; +} +function randomTrig() { + return [ + oneOf([ + "Cos", + "Sin", + "Tan", + "Sinh", + "Arccos", + "Arsinh", + ["InverseFunction", "Cos"] + ]), + oneOf([ + "Pi", + "-1", + "0", + "1", + ["Divide", "Pi", -5], + ["Multiply", -2, ["Divide", "Pi", 11]], + ["Multiply", "Half", "Pi"], + ["Multiply", 5, "Pi"], + ["Multiply", 12, "Pi"], + ["Divide", "Pi", 5], + ["Divide", "Pi", 9], + ["Multiply", 5, ["Divide", "Pi", 9]], + ["Multiply", 2, ["Divide", "Pi", 11]], + ["Multiply", 2, ["Divide", "Pi", 3]] + ]) + ]; +} +function randomExpression(level) { + level != null ? level : level = 1; + if (level === 1) { + const h = oneOf([ + [ + "Sqrt", + [ + "Multiply", + 6, + [ + "Sum", + ["Divide", 1, ["Power", "n", 2]], + ["Triple", ["Hold", "n"], 1, { num: "+Infinity" }] + ] + ] + ], + "Add", + "Add", + "Add", + "Add", + "Add", + "Multiply", + "Multiply", + "Multiply", + "Multiply", + "Divide", + "Divide", + "Divide", + "Root", + "Sqrt", + "Subtract", + "Negate", + "trig" + ]); + if (typeof h === "string") + return randomExpressionWithHead(h, 1); + return h; + } + if (level === 2) { + const r = Math.random(); + if (r > 0.75) + return randomExpression(1); + if (r > 0.5) + return randomExpression(3); + const h = oneOf([ + "Multiply", + "Multiply", + "Add", + "Power", + "trig", + "Ln", + "Exp" + ]); + return randomExpressionWithHead(h, 2); + } + return oneOf([ + -12345e-9, + -2, + -2, + -2, + -3, + -5, + -6, + -12, + -1654e-60, + 0, + 0, + 12345e-8, + 1654e-60, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 5, + 5, + 6, + 6, + 1234.5678, + 5678.1234, + 10, + 15, + 18, + 30, + 60, + 1234e54, + "123456789.12345678912345e200", + "987654321.12345678912345", + ["Rational", -6, 10], + ["Rational", -12, 15], + ["Rational", -15, 12], + ["Rational", 3, 5], + ["Rational", 12, 15], + ["Rational", 15, 12], + "ExponentialE", + // 'ImaginaryUnit', + ["Sqrt", 3], + ["Sqrt", 5], + ["Sqrt", 15], + ["Sqrt", 25], + ["Complex", -1.1, 1.1], + ["Complex", 4, 5], + "x", + "x", + "x", + "x", + ["Add", "x", 1], + ["Divide", "x", 3], + ["Square", "x"], + ["Power", "x", 3], + ["Power", "x", 4], + ["Subtract", "x", 1], + ["Add", "x", 1], + // 'a', + // 'b', + "Pi" + ]); +} +var CORE_LIBRARY = [ + { + Nothing: { domain: "Nothing" } + }, + // + // Data Structures + // + { + List: { + complexity: 8200, + signature: { + domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "List"] + } + }, + KeyValuePair: { + description: "A key/value pair", + complexity: 8200, + signature: { + domain: [ + "Function", + "String", + "Anything", + ["Tuple", "String", "Anything"] + ], + codomain: (ce, args) => ce.domain(["Tuple", "String", args[1].domain]), + canonical: (ce, args) => { + var _a, _b; + const key = validateArgument(ce, (_a = args[0]) == null ? void 0 : _a.canonical, "String"); + const value = validateArgument(ce, (_b = args[1]) == null ? void 0 : _b.canonical, "Value"); + return ce.tuple([key, value]); + } + } + }, + Single: { + description: "A tuple with a single element", + complexity: 8200, + signature: { + domain: ["Function", "Anything", ["Tuple", "Anything"]], + codomain: (ce, args) => ce.domain(["Tuple", args[0].domain]), + canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 1)) + } + }, + Pair: { + description: "A tuple of two elements", + complexity: 8200, + signature: { + domain: [ + "Function", + "Anything", + "Anything", + ["Tuple", "Anything", "Anything"] + ], + codomain: (ce, args) => ce.domain(["Tuple", args[0].domain, args[1].domain]), + canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 2)) + } + }, + Triple: { + description: "A tuple of three elements", + complexity: 8200, + signature: { + domain: [ + "Function", + "Anything", + "Anything", + "Anything", + ["Tuple", "Anything", "Anything", "Anything"] + ], + codomain: (ce, args) => ce.domain(["Tuple", args[0].domain, args[1].domain, args[2].domain]), + canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 3)) + } + }, + Tuple: { + description: "A fixed number of heterogeneous elements", + complexity: 8200, + signature: { + domain: [ + "Function", + ["Sequence", "Anything"], + ["Tuple", ["Sequence", "Anything"]] + ], + canonical: (ce, ops2) => ce.tuple(canonical(ops2)), + codomain: (ce, args) => ce.domain(["Tuple", ...args.map((x) => x.domain)]) + } + } + }, + // + // Inert functions + // + { + BaseForm: { + description: "`BaseForm(expr, base=10)`", + complexity: 9e3, + inert: true, + signature: { + domain: ["Function", "Value", ["Maybe", "Integer"], "Value"], + codomain: (_ce, args) => args[0].domain + } + }, + Delimiter: { + // Use to represent groups of expressions. Named after https://en.wikipedia.org/wiki/Delimiter + complexity: 9e3, + hold: "first", + signature: { + domain: [ + "Function", + "Anything", + ["Maybe", "String"], + ["Maybe", "String"], + "Anything" + ], + codomain: (_ce, args) => args[0].domain, + canonical: (ce, args) => { + var _a, _b; + return (_b = (_a = args[0]) == null ? void 0 : _a.canonical) != null ? _b : ce.box(["Sequence"]); + } + } + }, + Error: { + /** + * - The first argument is either a string or an `["ErrorCode"]` + * expression indicating the nature of the error. + * - The second argument, if present, indicates the context/location + * of the error. If the error occur while parsing a LaTeX string, + * for example, the argument will be a `Latex` expression. + */ + complexity: 500, + signature: { + domain: ["Function", "Anything", ["Maybe", "Anything"], "Void"], + // To make a canonical expression, don't canonicalize the args + canonical: (ce, args) => ce._fn("Error", args) + } + }, + ErrorCode: { + complexity: 500, + hold: "all", + signature: { + domain: [ + "Function", + "String", + ["Maybe", ["Sequence", "Anything"]], + "Anything" + ], + canonical: (ce, args) => { + var _a, _b; + const code = validateArgument(ce, args[0], "String").string; + if (code === "incompatible-domain") { + return ce._fn("ErrorCode", [ + ce.string(code), + ce.domain((_a = args[1]) != null ? _a : "Anything"), + ce.domain((_b = args[2]) != null ? _b : "Anything") + ]); + } + return ce._fn("ErrorCode", args); + } + } + }, + Hold: { + hold: "all", + signature: { + domain: "Function", + codomain: (ce, args) => args[0].symbol ? ce.domain("Symbol") : ce.domain("Anything"), + // To make a canonical expression, don't canonicalize the args + canonical: (ce, args) => args.length !== 1 ? ce._fn("Hold", validateArgumentCount(ce, args, 1)) : ce._fn("Hold", [validateArgument(ce, args[0], "Anything")]) + } + }, + HorizontalSpacing: { + signature: { + domain: "Function", + canonical: (ce, args) => { + if (args.length === 2) + return args[0].canonical; + return ce.box(["Sequence"]); + } + } + }, + Style: { + complexity: 9e3, + inert: true, + signature: { + domain: [ + "Function", + "Anything", + ["Maybe", "Dictionary"], + // @todo + "Anything" + ] + } + // @todo: simplify: merge Style(Style(x, s1), s2), Style(x) -> x + } + }, + { + Apply: { + signature: { + domain: "Function", + evaluate: (_ce, ops2) => apply(ops2[0], ops2.slice(1)) + } + }, + About: { signature: { domain: "Function" } }, + Block: { + /** Create a local scope. First argument is a dictionary of local variables. + * They are evaluated in the context of the parent scope. The second argument + * is an expression to be evaluated in the context of the new scope. + * ["Block", ["List", ["Equal", "x", 1]], [...]] + */ + signature: { domain: "Function" } + }, + Derivative: { + signature: { + domain: ["Function", "Function", ["Maybe", "Number"], "Function"] + } + }, + Domain: { + /** Return the domain of an expression */ + signature: { + domain: ["Function", "Anything", "Domain"], + canonical: (ce, ops2) => ce.domain(validateArgumentCount(ce, canonical(ops2), 1)[0]) + } + }, + Evaluate: { + hold: "all", + signature: { + domain: ["Function", "Anything", "Anything"], + codomain: (_ce, args) => args[0].domain, + canonical: (ce, ops2) => ce._fn("Evaluate", validateArgumentCount(ce, canonical(ops2), 1)), + evaluate: (_ce, ops2) => ops2[0].evaluate() + } + }, + Head: { + signature: { + domain: "Function", + evaluate: (ce, ops2) => { + var _a; + const op12 = ops2[0]; + if (typeof (op12 == null ? void 0 : op12.head) === "string") + return ce.symbol(op12.head); + return (_a = op12 == null ? void 0 : op12.head) != null ? _a : ce.symbol("Nothing"); + } + } + }, + Html: { + signature: { + domain: ["Function", "Value", "String"], + evaluate: (ce, ops2) => { + if (ops2.length === 0) + return ce.string(""); + return ce.string(""); + } + } + }, + Lambda: { + wikidata: "Q567612", + hold: "all", + signature: { + domain: ["Function", "Anything", "Function"], + codomain: (_ce, ops2) => ops2[0].domain, + canonical: (ce, ops2) => ce._fn("Lambda", validateArgumentCount(ce, ops2, 1)) + } + }, + Signatures: { + signature: { + domain: ["Function", "Symbol", ["Maybe", ["List", "Domain"]]], + canonical: (ce, ops2) => { + ops2 = validateArgumentCount(ce, ops2, 1); + if (!ops2[0].symbol) + return ce._fn("Signatures", [ + ce.error( + ["incompatible-domain", "Symbol", ops2[0].domain], + ops2[0] + ) + ]); + return ce._fn("Signatures", ops2); + }, + evaluate: (ce, ops2) => { + const name = ops2[0].symbol; + if (!name) + return ce.symbol("Nothing"); + const result = ce.lookupFunction(name); + if (!result) + return ce.symbol("Nothing"); + return ce.fn("List", [result.signature.domain]); + } + } + }, + Subscript: { + /** + * The `Subscript` function can take several forms: + * + * If `op1` is a string, the string is interpreted as a number in + * base `op2` (2 to 36). + * + * If `op1` is an indexable collection, `x`: + * - `x_*` -> `At(x, *)` + * + * Otherwise: + * - `x_0` -> Symbol "x_0" + * - `x_n` -> Symbol "x_n" + * - `x_{\text{max}}` -> Symbol `x_max` + * - `x_{(n+1)}` -> `At(x, n+1)` + * - `x_{n+1}` -> `Subscript(x, n+1)` + */ + // The last (subscript) argument can include a delimiter that + // needs to be interpreted. Without the hold, it would get + // removed during canonicalization. + hold: "last", + signature: { + domain: ["Function", "Anything", "Anything", "Anything"], + codomain: (_ce, args) => { + if (args[0].isFunction) + return args[0].domain; + return args[0].domain; + }, + canonical: (ce, args) => { + var _a, _b, _c, _d; + const op12 = args[0]; + const op22 = args[1]; + if (op12.string) { + const base = asSmallInteger(op22); + if (base !== null) { + if (base > 1 && base <= 36) { + const [value, rest] = fromDigits(op12.string, base); + if (rest) { + return ce.error( + ["unexpected-digit", { str: rest[0] }], + ["Latex", ce.string(op12.string)] + ); + } + return ce.number(value); + } + } + } + if (op12.symbol) { + if ((_a = op12.symbolDefinition) == null ? void 0 : _a.at) + return ce._fn("At", [op12, op22.canonical]); + const sub2 = (_d = (_b = op22.string) != null ? _b : op22.symbol) != null ? _d : (_c = asSmallInteger(op22)) == null ? void 0 : _c.toString(); + if (sub2) + return ce.symbol(op12.symbol + "_" + sub2); + } + if (op22.head === "Sequence") + ce._fn("Subscript", [op12, ce._fn("List", op22.ops)]); + return ce._fn("Subscript", args); + } + } + }, + Symbol: { + complexity: 500, + description: "Construct a new symbol with a name formed by concatenating the arguments", + threadable: true, + hold: "all", + signature: { + domain: ["Function", ["Sequence", "Anything"], "Anything"], + canonical: (ce, ops2) => { + if (ops2.length === 0) + return ce.symbol("Nothing"); + const arg = ops2.map( + (x) => { + var _a, _b, _c, _d; + return (_d = (_c = (_a = x.symbol) != null ? _a : x.string) != null ? _c : (_b = asSmallInteger(x)) == null ? void 0 : _b.toString()) != null ? _d : ""; + } + ).join(""); + if (arg.length > 0) + return ce.symbol(arg); + return ce.symbol("Nothing"); + } + // Note: a `["Symbol"]` expression is never evaluated, it gets + // transformed into something else (a symbol) during canonicalization + } + }, + Tail: { + signature: { + domain: ["Function", "Value", ["List", "Value"]], + evaluate: (ce, ops2) => { + var _a; + return ops2[0] ? ce._fn("List", (_a = ops2[0].ops) != null ? _a : []) : ce._fn("List", []); + } + } + }, + Timing: { + description: "`Timing(expr)` evaluates `expr` and return a `Pair` of the number of second elapsed for the evaluation, and the value of the evaluation", + signature: { + domain: [ + "Function", + "Value", + ["Maybe", "Integer"], + ["Tuple", "Value", "Number"] + ], + evaluate: (ce, ops2) => { + var _a; + if (ops2[1].symbol === "Nothing") { + const start = globalThis.performance.now(); + const result2 = ops2[0].evaluate(); + const timing = 1e3 * (globalThis.performance.now() - start); + return ce.pair(ce.number(timing), result2); + } + let n = Math.max(3, Math.round((_a = asSmallInteger(ops2[1])) != null ? _a : 3)); + let timings = []; + let result; + while (n > 0) { + const start = globalThis.performance.now(); + result = ops2[0].evaluate(); + timings.push(1e3 * (globalThis.performance.now() - start)); + n -= 1; + } + const max2 = Math.max(...timings); + const min2 = Math.min(...timings); + timings = timings.filter((x) => x > min2 && x < max2); + const sum2 = timings.reduce((acc, v) => acc + v, 0); + if (sum2 === 0) + return ce.pair(ce.number(max2), result); + return ce.pair(ce.number(sum2 / timings.length), result); + } + } + } + // {name: 'Pattern',}, + }, + // + // String-related + // + { + FromDigits: { + description: `\`FromDigits(s, base=10)\` return an integer representation of the string \`s\` in base \`base\`.`, + // @todo could accept `0xcafe`, `0b01010` or `(deadbeef)_16` as string formats + // @todo could accept "roman"... as base + // @todo could accept optional third parameter as the (padded) length of the output + signature: { + domain: ["Function", "String", ["Maybe", ["Range", 1, 36]], "Integer"], + evaluate: (ce, ops2) => { + const op12 = ops2[0]; + if (!op12.string) + return ce.error(["incompatible-domain", "String", op12.domain], op12); + const op22 = ops2[1]; + if (op22.isNothing) + return ce.number(Number.parseInt(op12.string, 10)); + if (op22.numericValue === null) { + return ce.error(["unexpected-base", op22.latex], op22); + } + const base = asFloat(op22); + if (!Number.isInteger(base) || base < 2 || base > 36) + return ce.error(["unexpected-base", base], op22); + const [value, rest] = fromDigits(op12.string, base); + if (rest) + return ce.error(["unexpected-digit", { str: rest[0] }], { + str: rest + }); + return ce.number(value); + } + } + }, + IntegerString: { + description: `\`IntegerString(n, base=10)\` return a string representation of the integer \`n\` in base \`base\`.`, + // @todo could accept `0xcafe`, `0b01010` or `(deadbeef)_16` as string formats + // @todo could accept "roman"... as base + // @todo could accept optional third parameter as the (padded) length of the output + signature: { + domain: ["Function", "Integer", ["Maybe", "Integer"], "String"], + evaluate: (ce, ops2) => { + var _a, _b; + const op12 = ops2[0]; + const val = (_a = asFloat(op12)) != null ? _a : NaN; + if (Number.isNaN(val) || !Number.isInteger(val)) { + return ce.error( + ["incompatible-domain", "Integer", op12.domain], + op12 + ); + } + const op22 = ops2[1]; + if (op22.isNothing) { + const op1Num = op12.numericValue; + if (typeof op1Num === "number") + return ce.string(Math.abs(op1Num).toString()); + if (op1Num instanceof decimal_default) + return ce.string(op1Num.abs().toString()); + return ce.string( + Math.abs(Math.round((_b = asFloat(op12)) != null ? _b : NaN)).toString() + ); + } + if (asSmallInteger(op22) === null) { + return ce.error( + ["incompatible-domain", "Integer", op22.domain], + op22 + ); + } + const base = asSmallInteger(op22); + if (base < 2 || base > 36) + return ce.error(["out-of-range", 2, 36, base], op22); + return ce.string(Math.abs(val).toString(base)); + } + } + }, + String: { + threadable: true, + signature: { + domain: ["Function", ["Maybe", "Anything"], "String"], + evaluate: (ce, ops2) => { + if (ops2.length === 0) + return ce.string(""); + return ce.string(ops2.map((x) => { + var _a; + return (_a = x.string) != null ? _a : x.toString(); + }).join("")); + } + } + } + }, + // + // LaTeX-related + // + { + // Join or more LatexTokens into a LaTeX string + JoinLatexTokens: { + signature: { + domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], + evaluate: (ce, ops2) => { + return ce.fn("Latex", [ + ce.string(tokensToString(ops2.map((x) => { + var _a; + return (_a = x.string) != null ? _a : x.latex; + }))) + ]); + } + } + }, + // Value preserving type conversion/tag indicating the string + // is a LaTeX string + Latex: { + signature: { + domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], + evaluate: (ce, ops2) => { + if (ops2.length === 0) + return ce.string(""); + return ce.string(joinLatex(ops2.map((x) => { + var _a; + return (_a = x.string) != null ? _a : x.toString(); + }))); + } + } + }, + // Serialize one or more expressions to LaTeX + SerializeLatex: { + hold: "all", + signature: { + domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], + evaluate: (ce, ops2) => ce.fn("Latex", [ce.string(joinLatex(ops2.map((x) => x.latex)))]) + } + }, + SplitAsLatexTokens: { + description: "Split a LaTeX string into a list of LaTeX tokens", + hold: "all", + signature: { + domain: ["Function", ["Maybe", "Anything"], ["List", "String"]], + evaluate: (ce, ops2) => { + var _a; + if (ops2.length === 0) + return ce._fn("List", []); + let latex = ""; + if (ops2[0].head === "Latex") + latex = (_a = ops2[0].op1.string) != null ? _a : ""; + else if (ops2[0].head === "LatexString") + latex = joinLatex(ops2[0].ops.map((op3) => op3.latex)); + else + latex = ops2[0].latex; + return ce._fn( + "List", + tokenize(latex, []).map((x) => ce.string(x)) + ); + } + } + }, + ParseLatex: { + description: "Parse a LaTeX string and evaluate to a corresponding expression", + signature: { + domain: ["Function", ["Maybe", "String"], "Anything"], + evaluate: (ce, ops2) => { + var _a; + if (ops2.length === 0 || !ops2[0].string) + return ce.box(["Sequence"]); + return (_a = ce.parse(ops2[0].string)) != null ? _a : ce.box(["Sequence"]); + } + } + } + }, + { + RandomExpression: { + signature: { + domain: "Function", + evaluate: (ce, _ops) => ce.box(randomExpression()) + } + } + } +]; +var LOGIC_LIBRARY = { + True: { wikidata: "Q16751793", domain: "Boolean", constant: true }, + False: { + wikidata: "Q5432619", + domain: "Boolean", + constant: true + }, + Maybe: { + wikidata: "Q781546", + domain: "MaybeBoolean", + constant: true + }, + // @todo: specify a `canonical` function that converts boolean + // expressions into CNF (Conjunctive Normal Form) + // https://en.wikipedia.org/wiki/Conjunctive_normal_form + // using rules (with a rule set that's kinda the inverse of the + // logic rules for simplify) + And: { + wikidata: "Q191081", + threadable: true, + associative: true, + commutative: true, + idempotent: true, + complexity: 1e4, + signature: { + domain: "LogicOperator", + simplify: processAnd, + evaluate: processAnd + } + }, + Or: { + wikidata: "Q1651704", + threadable: true, + associative: true, + commutative: true, + idempotent: true, + complexity: 1e4, + signature: { + domain: "LogicOperator", + simplify: processOr, + evaluate: processOr + } + }, + Not: { + wikidata: "Q190558", + involution: true, + complexity: 10100, + // @todo: this may not be needed, since we also have rules. + signature: { + domain: "LogicOperator", + simplify: processNot, + evaluate: processNot + } + }, + Equivalent: { + wikidata: "Q220433", + complexity: 10200, + signature: { + domain: "LogicOperator", + simplify: processEquivalent, + evaluate: processEquivalent + } + }, + Implies: { + wikidata: "Q7881229", + complexity: 10200, + signature: { + domain: "LogicOperator", + simplify: processImplies, + evaluate: processImplies + } + }, + Exists: { signature: { domain: "MaybeBoolean" } }, + If: { + hold: "rest", + signature: { + domain: "Function", + codomain: (ce, ops2) => ce.domain(["Union", ops2[0], ops2[1]]), + simplify: (ce, ops2) => { + const cond = ops2[0]; + if (cond && cond.symbol === "True") + return ops2[1] ? ops2[1].simplify() : ce.box("Nothing"); + return ops2[2] ? ops2[2].simplify() : ce.box("Nothing"); + }, + evaluate: (ce, ops2) => { + const cond = ops2[0]; + if (cond && cond.symbol === "True") + return ops2[1] ? ops2[1].evaluate() : ce.box("Nothing"); + return ops2[2] ? ops2[2].evaluate() : ce.box("Nothing"); + }, + // @todo: probably don't need a N() handler. Doesn't make a difference + // for the evaluation of booleans. Also, don't need to call N() on the + // arguments, the caller should have done that. Same for evaluate() + // and simplify() above + N: (ce, ops2) => { + const cond = ops2[0]; + if (cond && cond.symbol === "True") + return ops2[1] ? ops2[1].N() : ce.box("Nothing"); + return ops2[2] ? ops2[2].N() : ce.box("Nothing"); + } + } + }, + Loop: { + hold: "all", + signature: { + domain: "Function", + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = ops2[0]) == null ? void 0 : _a.simplify()) != null ? _b : ce.box("Nothing"); + }, + evaluate: (ce, ops2) => { + var _a; + const body = (_a = ops2[0]) != null ? _a : ce.box("Nothing"); + if (body.isNothing) + return body; + let result; + let i = 0; + do { + result = body.evaluate(); + i += 1; + } while (result.head !== "Return" && i < ce.iterationLimit); + if (result.head === "Return") + return result.op1; + return ce.error("iteration-limit-exceeded"); + }, + N: (ce, ops2) => { + const cond = ops2[0]; + if (cond && cond.symbol === "True") + return ops2[1] ? ops2[1].N() : ce.box("Nothing"); + return ops2[2] ? ops2[2].N() : ce.box("Nothing"); + } + } + }, + Which: { + hold: "all", + signature: { + domain: "Function", + codomain: (ce, ops2) => domainWhich(ce, ops2), + evaluate: (ce, ops2) => whichEvaluate(ce, ops2, "evaluate"), + N: (ce, ops2) => whichEvaluate(ce, ops2, "N") + } + } +}; +function processAnd(ce, args) { + if (args.length === 0) + return ce.symbol("True"); + const ops2 = []; + for (const arg of args) { + if (arg.symbol === "False") + return ce.symbol("False"); + if (arg.symbol !== "True") { + let duplicate = false; + for (const x of ops2) { + if (x.isSame(arg)) { + duplicate = true; + } else if (arg.head === "Not" && arg.op1.isSame(x) || x.head === "Not" && x.op1.isSame(arg)) { + return ce.symbol("False"); + } + } + if (!duplicate) + ops2.push(arg); + } + } + if (ops2.length === 0) + return ce.symbol("True"); + if (ops2.length === 1) + return ops2[0]; + return ce._fn("And", ops2); +} +function processOr(ce, args) { + if (args.length === 0) + return ce.symbol("True"); + const ops2 = []; + for (const arg of args) { + if (arg.symbol === "True") + return ce.symbol("True"); + if (arg.symbol !== "False") { + let duplicate = false; + for (const x of ops2) { + if (x.isSame(arg)) { + duplicate = true; + } else if (arg.head === "Not" && arg.op1.isSame(x) || x.head === "Not" && x.op1.isSame(arg)) { + return ce.symbol("True"); + } + } + if (!duplicate) + ops2.push(arg); + } + } + if (ops2.length === 0) + return ce.symbol("True"); + if (ops2.length === 1) + return ops2[0]; + return ce._fn("Or", ops2); +} +function processNot(ce, args) { + const op12 = args[0].symbol; + if (op12 === "True") + return ce.symbol("False"); + if (op12 === "False") + return ce.symbol("True"); + if (op12 === "Maybe") + return ce.symbol("Maybe"); + return void 0; +} +function processEquivalent(ce, args) { + const lhs = args[0].symbol; + const rhs = args[1].symbol; + if (lhs === "True" && rhs === "True" || lhs === "False" && rhs === "False") + return ce.symbol("True"); + if (lhs === "True" && rhs === "False" || lhs === "False" && rhs === "True") + return ce.symbol("False"); + if (lhs === "Maybe" || rhs === "Maybe") + return ce.symbol("Maybe"); + return void 0; +} +function processImplies(ce, args) { + const lhs = args[0].symbol; + const rhs = args[1].symbol; + if (lhs === "True" && rhs === "True" || lhs === "False" && rhs === "False" || lhs === "False" && rhs === "True") + return ce.symbol("True"); + if (lhs === "True" && rhs === "False") + return ce.symbol("False"); + if (lhs === "Maybe" || rhs === "Maybe") + return ce.symbol("Maybe"); + return void 0; +} +function domainWhich(ce, args) { + let dom = null; + for (let i = 1; i <= args.length - 1; i += 2) { + if (!dom) + dom = args[i].domain; + else + dom = sharedAncestorDomain(dom, args[i].domain); + } + return dom != null ? dom : ce.domain("Nothing"); +} +function whichEvaluate(ce, args, mode) { + let i = 0; + while (i < args.length - 1) { + if (args[i].evaluate().symbol === "True") { + if (!args[i + 1]) + return ce.symbol("Undefined"); + return mode === "N" ? args[i + 1].N() : args[i + 1].evaluate(); + } + i += 2; + } + return ce.symbol("Undefined"); +} +var POLYNOMIALS_LIBRARY = [ + { + Expand: { + description: "Expand out products and positive integer powers", + signature: { + domain: ["Function", "Value", "Value"], + evaluate: (_ce, ops2) => { + var _a; + return (_a = expand2(ops2[0])) != null ? _a : ops2[0]; + } + } + }, + Distribute: { + description: "Distribute multiplication over addition", + signature: { + domain: ["Function", "Value", "Value"], + evaluate: (ce, ops2) => { + var _a, _b; + const h = ops2[0].head; + if (h === "Multiply") + return (_a = distribute(ops2[0].ops)) != null ? _a : ops2[0]; + if (h === "Negate") + return (_b = distribute([ce._NEGATIVE_ONE, ...ops2[0].ops])) != null ? _b : ops2[0]; + if (h === "Divide" && ops2[0].ops[0].head === "Multiply") { + const numerator = distribute(ops2[0].ops); + const denominator = ops2[0].ops[1]; + if (numerator) { + if (numerator.head === "Add") + return ce.add( + numerator.ops.map((x) => ce.div(x, denominator)) + ); + return ce.div(numerator, denominator); + } + } + return ops2[0]; + } + } + } + } +]; +var RELOP_LIBRARY = { + Equal: { + commutative: true, + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, ops2) => { + return ce._fn( + "Equal", + flattenOps(canonical(flattenSequence(ops2)), "Equal") + ); + }, + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("True"); + let lhs = void 0; + for (const arg of ops2) { + if (!lhs) + lhs = arg; + else { + const test = lhs.isEqual(arg); + if (test !== true) + return ce.symbol("False"); + } + } + return ce.symbol("True"); + } + } + }, + NotEqual: { + wikidata: "Q28113351", + commutative: true, + complexity: 11e3, + signature: { + domain: "RelationalOperator", + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("False"); + let lhs = void 0; + for (const arg of ops2) { + if (!lhs) + lhs = arg; + else { + const test = lhs.isEqual(arg); + if (test === true) + return ce.symbol("False"); + } + } + return ce.symbol("True"); + } + } + }, + Less: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, ops2) => ce._fn("Less", flattenOps(canonical(flattenSequence(ops2)), "Less")), + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("True"); + let lhs = void 0; + for (const arg of ops2) { + if (!arg.isNumber) + return void 0; + if (!lhs) + lhs = arg; + else { + const test = ce.fn("Subtract", [arg, lhs]).N().sgn; + if (test === null || test === void 0) + return void 0; + if (test <= 0) + return ce.symbol("False"); + lhs = arg; + } + } + return ce.symbol("True"); + } + } + }, + NotLess: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("Less", args)]) + } + }, + Greater: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Less", args.reverse()), + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("True"); + let lhs = void 0; + for (const arg of ops2) { + if (!arg.isNumber) + return void 0; + if (!lhs) + lhs = arg; + else { + const test = ce.fn("Subtract", [arg, lhs]).N().sgn; + if (test === null || test === void 0) + return void 0; + if (test >= 0) + return ce.symbol("False"); + lhs = arg; + } + } + return ce.symbol("True"); + } + } + }, + NotGreater: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("Greater", args)]) + } + }, + LessEqual: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("True"); + let lhs = void 0; + for (const arg of ops2) { + if (!arg.isNumber) + return void 0; + if (!lhs) + lhs = arg; + else { + const test = ce.fn("Subtract", [arg, lhs]).N().sgn; + if (test === null || test === void 0) + return void 0; + if (test < 0) + return ce.symbol("False"); + lhs = arg; + } + } + return ce.symbol("True"); + } + } + }, + NotLessNotEqual: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("LessEqual", args)]) + } + }, + GreaterEqual: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("LessEqual", args.reverse()), + evaluate: (ce, ops2) => { + if (ops2.length < 2) + return ce.symbol("True"); + let lhs = void 0; + for (const arg of ops2) { + if (!arg.isNumber) + return void 0; + if (!lhs) + lhs = arg; + else { + const test = ce.fn("Subtract", [arg, lhs]).N().sgn; + if (test === null || test === void 0) + return void 0; + if (test > 0) + return ce.symbol("False"); + lhs = arg; + } + } + return ce.symbol("True"); + } + } + }, + NotGreaterNotEqual: { + complexity: 11e3, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("GreaterEqual", args)]) + } + }, + TildeFullEqual: { + description: "Indicate isomorphism, congruence and homotopic equivalence", + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotTildeFullEqual: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("TildeFullEqual", args)]) + } + }, + TildeEqual: { + description: "Approximately or asymptotically equal", + complexity: 11e3, + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotTildeEqual: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("TildeEqual", args)]) + } + }, + Approx: { + complexity: 11100, + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotApprox: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("Approx", args)]) + } + }, + ApproxEqual: { + complexity: 11100, + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotApproxEqual: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("ApproxEqual", args)]) + } + }, + ApproxNotEqual: { + complexity: 11100, + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotApproxNotEqual: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("ApproxNotEqual", args)]) + } + }, + Precedes: { + complexity: 11100, + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotPrecedes: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("Precedes", args)]) + } + }, + Succeeds: { + signature: { domain: "RelationalOperator" } + // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} + }, + NotSucceeds: { + complexity: 11100, + signature: { + domain: "RelationalOperator", + canonical: (ce, args) => ce._fn("Not", [ce._fn("Succeeds", args)]) + } + } +}; +var SETS_LIBRARY = { + // + // Constants + // + EmptySet: { + domain: "Set", + constant: true, + wikidata: "Q226183" + // contains: () => false, // @todo not quite true... + // includes: () => true, // The empty set is a subset of every set + }, + // + // Predicates + // + Element: { + complexity: 11200, + hold: "all", + signature: { + domain: "Predicate", + canonical: (ce, args) => { + args = validateArgumentCount(ce, flattenSequence(canonical(args)), 2); + if (args.length === 2 && isValidDomain(args[1])) + return ce._fn("Element", [args[0], ce.domain(args[1])]); + return ce._fn("Element", args); + }, + evaluate: (ce, args) => evaluateElement(ce, args) + } + }, + NotElement: { + complexity: 11200, + hold: "all", + signature: { + domain: "Predicate", + canonical: (ce, args) => ce.fn("Not", [ce.fn("Element", args)]) + } + }, + Subset: { + complexity: 11200, + signature: { domain: "Predicate" } + }, + NotSubset: { + complexity: 11200, + signature: { + domain: "Predicate", + canonical: (ce, args) => ce.fn("Not", [ce.fn("Subset", args)]) + } + }, + Superset: { + complexity: 11200, + signature: { domain: "Predicate" } + }, + SupersetEqual: { + complexity: 11200, + signature: { domain: "Predicate" } + }, + NotSuperset: { + complexity: 11200, + signature: { + domain: "Predicate", + canonical: (ce, args) => ce.fn("Not", [ce.fn("Superset", args)]) + } + }, + NotSupersetEqual: { + complexity: 11200, + signature: { + domain: "Predicate", + canonical: (ce, args) => ce.fn("Not", [ce.fn("SupersetEqual", args)]) + } + }, + SubsetEqual: { + complexity: 11200, + signature: { domain: "Predicate" } + // evaluate: subsetEqual, + }, + NotSubsetNotEqual: { + complexity: 11200, + signature: { + domain: "Predicate", + canonical: (ce, args) => ce.fn("Not", [ce.fn("SubsetEqual", args)]) + } + }, + // + // Functions + // + CartesianProduct: { + // Aka the product set, the set direct product or cross product + // Notation: \times + wikidata: "Q173740", + signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"] } + // evaluate: cartesianProduct, + }, + Complement: { + // Return the elements of the first argument that are not in any of + // the subsequent lists + wikidata: "Q242767", + signature: { domain: ["Function", "Set", "Set"] } + }, + Intersection: { + // notation: \cap + wikidata: "Q185837", + threadable: true, + associative: true, + commutative: true, + involution: true, + signature: { + domain: ["Function", "Set", ["Sequence", "Set"], "Set"], + evaluate: intersection + } + }, + Union: { + // Works on set, but can also work on lists + wikidata: "Q185359", + threadable: true, + associative: true, + commutative: true, + involution: true, + signature: { + domain: ["Function", "Set", ["Sequence", "Set"], "Set"], + evaluate: union + } + }, + // { + // name: 'Set', + // domain: ['Function', ['Sequence', 'Anything'], 'Set'], + // // @todo! set has multiple forms + // // Set(Sequence) + // // Set(Sequence, Condition) + // // Set(Set, Condition) + // }, // disjoint union Q842620 ⊔ + SetMinus: { + wikidata: "Q18192442", + signature: { + domain: ["Function", "Set", "Value", "Set"], + evaluate: setMinus + } + }, + SymmetricDifference: { + // symmetric difference = disjunctive union (circled minus) + /* = Union(Complement(a, b), Complement(b, a) */ + /* Corresponds to XOR in boolean logic */ + wikidata: "Q1147242", + signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"] } + } +}; +function union(ce, _ops) { + return ce.symbol("False"); +} +function intersection(ce, _ops) { + return ce.symbol("EmptySet"); +} +function setMinus(ce, _ops) { + return ce.symbol("EmptySet"); +} +function evaluateElement(ce, ops2) { + /* @__PURE__ */ console.assert(ops2.length === 2); + const [lhs, rhs] = ops2; + if (rhs.string) { + if (lhs.string && rhs.string.includes(lhs.string)) + return ce.symbol("True"); + return ce.symbol("False"); + } + if (rhs.keys) { + if (lhs.string) { + for (const key of rhs.keys) + if (key === lhs.string) + return ce.symbol("True"); + } + return ce.symbol("False"); + } + if (rhs.head === "List") { + if (lhs.head === "List") { + let found = false; + for (let i = 0; i < 1 + (rhs.nops - lhs.nops); ++i) { + found = true; + for (let j = 0; j < lhs.nops; ++j) { + if (!rhs.ops[i + j].isEqual(lhs.ops[j])) { + found = false; + break; + } + } + if (found) + return ce.symbol("True"); + } + return ce.symbol("False"); + } + const val = lhs.head === "Hold" ? lhs.op1 : lhs; + for (const elem of rhs.ops) + if (val.isEqual(elem)) + return ce.symbol("True"); + return ce.symbol("False"); + } + if (isValidDomain(rhs)) { + if (lhs.domain.isCompatible(ce.domain(rhs))) + return ce.symbol("True"); + return ce.symbol("False"); + } + return ce._fn("Element", [lhs, rhs]); +} +var STATISTICS_LIBRARY = [ + { + Mean: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let sum2 = 0; + let count = 0; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + sum2 += v; + count++; + } + if (count === 0) + return ce._NAN; + return ce.number(sum2 / count); + } + } + }, + Median: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + const values = []; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + values.push(v); + } + if (values.length === 0) + return ce._NAN; + values.sort((a, b) => a - b); + const mid = Math.floor(values.length / 2); + if (values.length % 2 === 0) + return ce.number((values[mid - 1] + values[mid]) / 2); + return ce.number(values[mid]); + } + } + }, + Variance: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let sum2 = 0; + let sum22 = 0; + let count = 0; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + sum2 += v; + sum22 += v * v; + count++; + } + if (count === 0) + return ce._NAN; + return ce.number((sum22 - sum2 * sum2 / count) / (count - 1)); + } + } + }, + StandardDeviation: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let sum2 = 0; + let sum22 = 0; + let count = 0; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + sum2 += v; + sum22 += v * v; + count++; + } + if (count === 0) + return ce._NAN; + return ce.number( + Math.sqrt((sum22 - sum2 * sum2 / count) / (count - 1)) + ); + } + } + }, + Kurtosis: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let sum2 = 0; + let sum22 = 0; + let sum4 = 0; + let count = 0; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + sum2 += v; + sum22 += v * v; + sum4 += v * v * v * v; + count++; + } + if (count === 0) + return ce._NAN; + const s2 = (sum22 - sum2 * sum2 / count) / (count - 1); + const s4 = (sum4 - sum22 * sum22 / count) / (count - 1); + return ce.number((s4 / (s2 * s2) - 3) * (count * (count + 1)) / 6); + } + } + }, + Skewness: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let sum2 = 0; + let sum22 = 0; + let sum3 = 0; + let count = 0; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + sum2 += v; + sum22 += v * v; + sum3 += v * v * v; + count++; + } + if (count === 0) + return ce._NAN; + const s2 = (sum22 - sum2 * sum2 / count) / (count - 1); + const s3 = (sum3 - sum22 * sum2 / count) / (count - 1); + return ce.number(s3 / Math.pow(s2, 3 / 2) * Math.sqrt(count * 1)); + } + } + }, + Mode: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + var _a; + const values = []; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + values.push(v); + } + if (values.length === 0) + return ce._NAN; + values.sort((a, b) => a - b); + const counts = {}; + for (const v of values) { + counts[v] = ((_a = counts[v]) != null ? _a : 0) + 1; + } + let max2 = 0; + let mode = values[0]; + for (const v of values) { + const c = counts[v]; + if (c > max2) { + max2 = c; + mode = v; + } + } + return ce.number(mode); + } + } + }, + Quartiles: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "List"], + evaluate: (ce, ops2) => { + const values = []; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + values.push(v); + } + if (values.length === 0) + return ce._NAN; + values.sort((a, b) => a - b); + const mid = Math.floor(values.length / 2); + const lower = values.slice(0, mid); + const upper = values.slice(mid + 1); + return ce.box([ + "List", + ce.number(values[mid]), + ce.number(lower[Math.floor(lower.length / 2)]), + ce.number(upper[Math.floor(upper.length / 2)]) + ]); + } + } + }, + InterquartileRange: { + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + const values = []; + for (const op3 of each(ops2)) { + const v = asFloat(op3); + if (v === null) + return void 0; + values.push(v); + } + if (values.length === 0) + return ce._NAN; + values.sort((a, b) => a - b); + const mid = Math.floor(values.length / 2); + const lower = values.slice(0, mid); + const upper = values.slice(mid + 1); + return ce.number( + upper[Math.floor(upper.length / 2)] - lower[Math.floor(lower.length / 2)] + ); + } + } + }, + Count: { + threadable: true, + complexity: 1200, + signature: { + domain: ["Function", ["Sequence", "Value"], "Number"], + evaluate: (ce, ops2) => { + let count = 0; + for (const _op of each(ops2)) + count++; + return ce.number(count); + } + } + }, + Erf: { + complexity: 7500, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const x = asFloat(ops2[0]); + if (x === null) + return void 0; + return ce.number(erf(x)); + } + } + }, + Erfc: { + complexity: 7500, + signature: { + domain: ["Function", "Number", "Number"], + evaluate: (ce, ops2) => { + const x = asFloat(ops2[0]); + if (x === null) + return void 0; + return ce.number(1 - erf(x)); + } + } + } + } +]; +function* each(ops2) { + var _a, _b, _c, _d, _e; + if (ops2.length === 0) + return; + const ce = ops2[0].engine; + for (const op3 of ops2) { + const h = op3.head; + if (h === "Range") { + let lower = asFloat(op3[1]); + if (lower === null) + return; + let upper = asFloat(op3[2]); + if (upper === null) { + upper = lower; + lower = 1; + } + if (lower > upper) { + const step2 = (_b = asFloat((_a = op3[3]) != null ? _a : -1)) != null ? _b : -1; + if (step2 >= 0) + return; + for (let i = lower; i <= upper; i += step2) + yield ce.number(i); + return; + } + const step = (_d = asFloat((_c = op3[3]) != null ? _c : 1)) != null ? _d : 1; + if (step <= 0) + return; + for (let i = lower; i <= upper; i += step) + yield ce.number(i); + return; + } + if (h === "Linspace") { + let start = asFloat(op3[1]); + if (start === null) + return; + let stop = asFloat(op3[2]); + if (stop === null) { + stop = start; + start = 0; + } + const num = (_e = asFloat(op3[3])) != null ? _e : 50; + if (!Number.isInteger(num)) + return; + if (num <= 0) + return; + const step = (stop - start) / (num - 1); + for (let i = start; i <= stop; i += step) + yield ce.number(i); + return; + } + if (typeof h === "string" && /^(List|Sequence|Tuple|Single|Pair|Triple)$/.test(h)) { + yield* each(op3.ops); + return; + } + yield op3; + } +} +var domainNumberToRealNumber = (_head) => { + return ["Function", "Number", "ExtendedRealNumber"]; +}; +var trigFunction = (_head) => { + return ["Function", "Number", "Number"]; +}; +var hyperbolicFunction = (_head) => { + return ["Function", "Number", "Number"]; +}; +var TRIGONOMETRY_LIBRARY = [ + { + // + // Constants + // + Pi: { + domain: "TranscendentalNumber", + flags: { algebraic: false }, + constant: true, + holdUntil: "N", + wikidata: "Q167", + value: (engine) => bignumPreferred(engine) ? engine._BIGNUM_PI : Math.PI + } + }, + { + // sqrt(x*x + y*y) + Degrees: { + /* = Pi / 180 */ + signature: { + domain: ["Function", "Number", "Number"], + canonical: (ce, ops2) => { + ops2 = validateArguments(ce, flattenSequence(canonical(ops2)), [ + "Number" + ]); + if (ops2.length !== 1) + return ce.fn("Degrees", ops2, { canonical: false }); + const arg = ops2[0]; + if (arg.numericValue === null || !arg.isValid) + return ce.fn("Degrees", ops2, { canonical: false }); + return ce.div(ce.mul([arg, ce.symbol("Pi")]), ce.number(180)); + }, + evaluate: (ce, ops2) => ce.mul([ops2[0], ce.div(ce.symbol("Pi"), ce.number(180))]) + } + }, + Hypot: { + signature: { + domain: ["Function", "Number", "Number", "NonNegativeNumber"], + simplify: (ce, ops2) => ce.box(["Sqrt", ["Add", ["Square", ops2[0]], ["Square", ops2[1]]]]).simplify(), + evaluate: [ + "Lambda", + ["Sqrt", ["Add", ["Square", "_1"], ["Square", "_2"]]] + ] + } + }, + Sin: { + complexity: 5e3, + signature: { + domain: ["Function", "Number", ["Interval", -1, 1]], + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Sin", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : complexAllowed(ce) ? ce.box([ + "Divide", + [ + "Subtract", + ["Exp", ["Multiply", "ImaginaryUnit", ops2[0]]], + ["Exp", ["Multiply", "ImaginaryUnit", ["Negate", ops2[0]]]] + ], + ["Complex", 0, 2] + ]).simplify() : void 0; + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sin", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Sin", ops2[0]) + } + } + }, + { + // + // Basic trigonometric function + // (may be used in the definition of other functions below) + // + Arctan: { + wikidata: "Q2257242", + complexity: 5200, + signature: { + domain: domainNumberToRealNumber("Arctan"), + simplify: (ce, ops2) => { + var _a; + return (_a = constructibleValues(ce, "Arctan", ops2[0])) == null ? void 0 : _a.simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arctan", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arctan", ops2[0]) + } + }, + Arctan2: { + wikidata: "Q776598", + complexity: 5200, + signature: { + domain: ["Function", "Number", "Number", "Number"], + N: (_ce, ops2) => apply2N(ops2[0], ops2[1], Math.atan2, (a, b) => Decimal.atan2(a, b)) + } + }, + Cos: { + complexity: 5050, + signature: { + domain: ["Function", "Number", ["Interval", -1, 1]], + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Cos", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Sin", ["Add", ops2[0], ["Multiply", "Half", "Pi"]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cos", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Cos", ops2[0]) + } + }, + Tan: { + // Range: 'RealNumber', + complexity: 5100, + signature: { + domain: trigFunction("Tan"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Tan", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Sin", ops2[0]], ["Cos", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Tan", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Tan", ops2[0]) + } + } + /* converts (x, y) -> (radius, angle) */ + // ToPolarCoordinates: { + // domain: 'Function', + // outputDomain: ['TupleOf', 'RealNumber', 'RealNumber'], + // } + }, + // + // Functions defined using arithmetic functions or basic + // trigonometric functions above + // + { + Arcosh: { + complexity: 6200, + signature: { + domain: hyperbolicFunction("Arcosh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Arcosh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Ln", + ["Add", ops2[0], ["Sqrt", ["Subtract", ["Square", ops2[0]], 1]]] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcosh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arcosh", ops2[0]) + } + }, + Arcsin: { + complexity: 5500, + signature: { + domain: hyperbolicFunction("Arcsin"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Arcsin", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Multiply", + 2, + [ + "Arctan2", + ops2[0], + ["Add", 1, ["Sqrt", ["Subtract", 1, ["Square", ops2[0]]]]] + ] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsin", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arcsin", ops2[0]) + } + }, + //Note: Arsinh, not ArCsinh + Arsinh: { + complexity: 6100, + signature: { + domain: hyperbolicFunction("Arsinh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Arsinh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Ln", + ["Add", ops2[0], ["Sqrt", ["Add", ["Square", ops2[0]], 1]]] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arsinh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arsinh", ops2[0]) + } + }, + Artanh: { + complexity: 6300, + signature: { + domain: hyperbolicFunction("Artanh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Artanh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Multiply", + "Half", + ["Ln", ["Divide", ["Add", 1, ops2[0]], ["Subtract", 1, ops2[0]]]] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Artanh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Artanh", ops2[0]) + } + }, + Cosh: { + complexity: 6050, + signature: { + domain: hyperbolicFunction("Cosh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Cosh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Multiply", + "Half", + ["Add", ["Exp", ops2[0]], ["Exp", ["Negate", ops2[0]]]] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cosh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Cosh", ops2[0]) + } + }, + Cot: { + complexity: 5600, + signature: { + domain: trigFunction("Cot"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Cot", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Cos", ops2[0]], ["Sin", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cot", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Cot", ops2[0]) + } + }, + Csc: { + description: "Cosecant", + complexity: 5600, + signature: { + domain: trigFunction("Csc"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Csc", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Sin", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Csc", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Csc", ops2[0]) + } + }, + /** = sin(z/2)^2 = (1 - cos z) / 2*/ + Haversine: { + wikidata: "Q2528380", + signature: { + domain: ["Function", "ExtendedRealNumber", ["Interval", 0, 1]], + evaluate: ["Lambda", ["Divide", ["Subtract", 1, ["Cos", "_1"]], 2]] + } + }, + /** = 2 * Arcsin(Sqrt(z)) */ + InverseHaversine: { + // Range ['Interval', [['Negate', 'Pi'], 'Pi'], + signature: { + domain: ["Function", "ExtendedRealNumber", "RealNumber"], + evaluate: ["Lambda", ["Multiply", 2, ["Arcsin", ["Sqrt", "_1"]]]] + } + }, + Sec: { + description: "Secant, inverse of cosine", + complexity: 5500, + signature: { + domain: trigFunction("Sec"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Sec", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Cos", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sec", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Sec", ops2[0]) + } + }, + Sinh: { + // Range: ['Interval', -Infinity, Infinity], + complexity: 6e3, + signature: { + domain: hyperbolicFunction("Sinh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Sinh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ + "Multiply", + "Half", + ["Subtract", ["Exp", ops2[0]], ["Exp", ["Negate", ops2[0]]]] + ]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sinh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Sinh", ops2[0]) + } + } + }, + { + Csch: { + complexity: 6200, + signature: { + domain: domainNumberToRealNumber("Csch"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Csch", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Sinh", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Csch", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Csch", ops2[0]) + } + }, + Sech: { + complexity: 6200, + signature: { + domain: ["Function", "Number", ["Interval", -1, 1]], + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Sech", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Cosh", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sech", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Sech", ops2[0]) + } + }, + Tanh: { + // Range: ['Interval', -Infinity, Infinity], + complexity: 6200, + signature: { + domain: hyperbolicFunction("Tanh"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Tanh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Sinh", ops2[0]], ["Cosh", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Tanh", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Tanh", ops2[0]) + } + } + }, + { + Arccos: { + complexity: 5550, + signature: { + domain: domainNumberToRealNumber("Arccos"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Arccos", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Subtract", ["Divide", "Pi", 2], ["Arcsin", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccos", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arccos", ops2[0]) + } + }, + Arccot: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arccot"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccot", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arccot", ops2[0]) + } + }, + Arcoth: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arcoth"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcoth", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arcoth", ops2[0]) + } + }, + Arcsch: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arcsch"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsch", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arcsch", ops2[0]) + } + }, + Arcsec: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arcsec"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsec", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arcsec", ops2[0]) + } + }, + Arsech: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arsech"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arsech", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arsech", ops2[0]) + } + }, + Arccsc: { + numeric: true, + signature: { + domain: domainNumberToRealNumber("Arccsc"), + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccsc", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Arccsc", ops2[0]) + } + }, + Coth: { + complexity: 6300, + signature: { + domain: hyperbolicFunction("Coth"), + simplify: (ce, ops2) => { + var _a, _b; + return (_b = (_a = constructibleValues(ce, "Coth", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Tanh", ops2[0]]]).simplify(); + }, + evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Coth", ops2[0]), + N: (ce, ops2) => evalTrig(ce, "N", "Coth", ops2[0]) + } + }, + /* converts (radius, angle) -> (x, y) */ + // FromPolarCoordinates: { + // domain: 'Function', + // outputDomain: ['TupleOf', 'RealNumber', 'RealNumber'], + // }, + InverseFunction: { + signature: { + domain: ["Function", "Function", "Function"], + canonical: (ce, ops2) => { + var _a; + ops2 = validateArgumentCount(ce, flattenSequence(canonical(ops2)), 1); + return (_a = processInverseFunction(ce, ops2)) != null ? _a : ce._fn("InverseFunction", ops2); + }, + simplify: (ce, ops2) => processInverseFunction(ce, ops2), + evaluate: (ce, ops2) => processInverseFunction(ce, ops2) + } + } + } +]; +var S2 = ["Sqrt", 2]; +var S3 = ["Sqrt", 3]; +var S5 = ["Sqrt", 5]; +var S6 = ["Sqrt", 6]; +var CONSTRUCTIBLE_VALUES = [ + [ + [0, 1], + { + Sin: 0, + Cos: 1, + Tan: 0, + Cot: NaN, + Sec: 1, + Csc: NaN + } + ], + [ + [1, 12], + { + Sin: ["Divide", ["Subtract", S6, S2], 4], + Cos: ["Divide", ["Add", S6, S2], 4], + Tan: ["Subtract", 2, S3], + Cot: ["Add", 2, S3], + Sec: ["Subtract", S6, S2], + Csc: ["Add", S6, S2] + } + ], + [ + [1, 10], + { + Sin: ["Divide", ["Subtract", S5, 1], 4], + Cos: ["Divide", ["Sqrt", ["Add", 10, ["Multiply", 2, S5]]], 4], + Tan: ["Divide", ["Sqrt", ["Subtract", 25, ["Multiply", 10, S5]]], 4], + Cot: ["Sqrt", ["Add", 5, ["Multiply", 2, S5]]], + Sec: ["Divide", ["Sqrt", ["Subtract", 50, ["Multiply", 10, S5]]], 5], + Csc: ["Add", 1, S5] + } + ], + [ + [1, 8], + { + Sin: "$\\frac{\\sqrt{2-\\sqrt2}}{2}$", + Cos: "$\\frac{\\sqrt {2+{\\sqrt {2}}}}{2}$", + Tan: "$\\sqrt{2} - 1$", + Cot: "$\\sqrt{2} + 1$", + Sec: "$\\sqrt{ 4 - 2\\sqrt{2}}$", + Csc: "$\\sqrt{ 4 + 2\\sqrt{2}}$" + } + ], + [ + [1, 6], + { + Sin: "$\\frac{1}{2}$", + Cos: "$\\frac{\\sqrt{3}}{2}$", + Tan: "$\\frac{\\sqrt{3}}{3}$", + Cot: "$\\frac{2\\sqrt{3}}{3}$", + Sec: "$\\sqrt{3}$", + Csc: 2 + } + ], + [ + [1, 5], + { + Sin: "$\\frac{\\sqrt{10- 2\\sqrt{5}}} {4}$", + Cos: "$\\frac{1+ \\sqrt{5}} {4}$", + Tan: "$\\sqrt{5-2\\sqrt5}$", + Cot: "$\\frac{\\sqrt{25+10\\sqrt5}} {5}$", + Sec: "$\\sqrt{5} - 1$", + Csc: "$\\frac{\\sqrt{50+10\\sqrt{5}}} {5}$" + } + ], + [ + [1, 4], + { + Sin: ["Divide", S2, 2], + Cos: ["Divide", S2, 2], + Tan: 1, + Cot: 1, + Sec: S2, + Csc: S2 + } + ], + [ + [3, 10], + { + Sin: "$\\frac{1+ \\sqrt{5}} {4}$", + Cos: "$\\frac{\\sqrt{10- 2\\sqrt{5}}} {4}$", + Tan: "$\\frac{\\sqrt{25+10\\sqrt5}} {5}$", + Cot: "$\\sqrt{5-2\\sqrt5}$", + Sec: "$$", + Csc: "$\\frac{\\sqrt{50+10\\sqrt{5}}} {5}$" + } + ], + [ + [1, 3], + { + Sin: ["Divide", S3, 2], + // '$\\frac{\\sqrt{3}}{2}$' + Cos: "Half", + // '$\\frac{1}{2}$' + Tan: S3, + // '$\\sqrt{3}$' + Cot: ["Divide", S3, 3], + // '$\\frac{\\sqrt{3}}{3}$' + Sec: 2, + Csc: ["Divide", ["Multiply", 2, S3], 3] + // '$\\frac{2\\sqrt{3}}{3}$' + } + ], + [ + [3, 8], + { + Sin: "$\\frac{ \\sqrt{2 + \\sqrt{2}} } {2}$", + Cos: "$\\frac{ \\sqrt{2 - \\sqrt{2}} } {2}$", + Tan: "$\\sqrt{2} + 1$", + Cot: "$\\sqrt{2} - 1$", + Sec: "$\\sqrt{ 4 + 2 \\sqrt{2} }$", + Csc: "$\\sqrt{ 4 - 2 \\sqrt{2} }$" + } + ], + [ + [2, 5], + { + Sin: "$\\frac{\\sqrt{10+ 2\\sqrt{5}}} {4}$", + Cos: "$\\frac{\\sqrt{5}-1} {4}$", + Tan: "$\\sqrt{5+2\\sqrt{5}}$", + Cot: "$\\frac{\\sqrt{25-10\\sqrt{5}}} {5}$", + Sec: "$1 + \\sqrt{5}$", + Csc: "$\\frac{\\sqrt{50-10\\sqrt{5}}} {5}$" + } + ], + [ + [5, 12], + { + Sin: "$\\frac{\\sqrt{6} + \\sqrt{2}} {4}$", + Cos: "$\\frac{ \\sqrt{6} - \\sqrt{2}} {4}$", + Tan: "$2+\\sqrt{3}$", + Cot: "$2-\\sqrt{3}$", + Sec: "$\\sqrt{6}+\\sqrt{2}$", + Csc: "$\\sqrt{6} - \\sqrt{2}$" + } + ], + [ + [1, 2], + { + Sin: 1, + Cos: 0, + Tan: NaN, + Cot: 0, + Sec: NaN, + Csc: 1 + } + ] +]; +var TRIG_IDENTITIES = { + Sin: [ + [1, "Sin"], + [1, "Cos"], + [-1, "Sin"], + [-1, "Cos"] + ], + Cos: [ + [1, "Cos"], + [-1, "Sin"], + [-1, "Cos"], + [1, "Sin"] + ], + Sec: [ + [1, "Sec"], + [-1, "Csc"], + [-1, "Sec"], + [1, "Csc"] + ], + Csc: [ + [1, "Csc"], + [1, "Sec"], + [-1, "Csc"], + [-1, "Sec"] + ], + Tan: [ + [1, "Tan"], + [-1, "Cot"], + [1, "Tan"], + [-1, "Cot"] + ], + Cot: [ + [1, "Cot"], + [-1, "Tan"], + [1, "Cot"], + [-1, "Tan"] + ] +}; +function constructibleValues(ce, head2, x) { + var _a, _b, _c; + if (!x) + return void 0; + const specialValues = ce.cache( + "constructible-trigonometric-values", + () => { + var _a2; + const values = []; + for (const [val, results] of CONSTRUCTIBLE_VALUES) { + const boxedResults = {}; + for (const head3 of Object.keys(results)) + boxedResults[head3] = (_a2 = ce.parse(latexString(results[head3]))) != null ? _a2 : ce.box(results[head3]); + values.push([val, boxedResults]); + } + return values; + }, + (cache) => { + for (const [_k, v] of cache) { + for (const v2 of Object.values(v)) + v2.unbind(); + } + return cache; + } + ); + x = x.N(); + if (x.numericValue === null) + return void 0; + let theta = (_a = asFloat(x)) != null ? _a : null; + if (theta === null) + return void 0; + theta = theta % (2 * Math.PI); + const identitySign = head2 !== "Cos" && head2 !== "Sec" ? Math.sign(theta) : 1; + theta = Math.abs(theta); + const quadrant2 = Math.floor(theta * 2 / Math.PI); + theta = theta % (Math.PI / 2); + let sign2; + [sign2, head2] = (_c = (_b = TRIG_IDENTITIES[head2]) == null ? void 0 : _b[quadrant2]) != null ? _c : [1, head2]; + sign2 = sign2 * identitySign; + for (const [[n, d], result] of specialValues) { + if (result[head2] && ce.chop(theta - Math.PI * n / d) === 0) { + return sign2 < 0 ? canonicalNegate(result[head2]) : result[head2]; + } + } + return void 0; +} +function processInverseFunction(ce, xs) { + if (xs.length !== 1) + return void 0; + const expr = xs[0]; + const head2 = expr.symbol; + if (typeof head2 !== "string") + return void 0; + if (head2 === "InverseFunction") + return expr.op1; + const newHead = { + Sin: "Arcsin", + Cos: "Arccos", + Tan: "Arctan", + Sec: "Arcsec", + Csc: " Arccsc", + Sinh: "Arsinh", + Cosh: "Arcosh", + Tanh: "Artanh", + Sech: "Arcsech", + Csch: "Arcsch", + Arcosh: "Cosh", + Arccos: "Cos", + Arccsc: "Csc", + Arcsch: "Csch", + // '??': 'Cot', + // '??': 'Coth', + Arcsec: "Sec", + Arcsin: "Sin", + Arsinh: "Sinh", + Arctan: "Tan", + Artanh: "Tanh" + }[head2]; + return newHead ? ce.symbol(newHead) : void 0; +} +function evalTrig(ce, mode, head2, op3) { + var _a; + if (!op3) + return void 0; + if (mode === "evaluate") { + const result = (_a = constructibleValues(ce, head2, op3)) == null ? void 0 : _a.evaluate(); + if (result) + return result; + if (op3.isExact) + return void 0; + } + switch (head2) { + case "Arccos": + return applyN( + op3, + Math.acos, + (x) => x.acos(), + (x) => x.acos() + ); + case "Arccot": + return applyN( + op3, + (x) => Math.atan2(1, x), + (x) => Decimal.atan2(ce._BIGNUM_ONE, x), + (x) => x.inverse().atan() + ); + case "Arccsc": + return applyN( + op3, + (x) => Math.asin(1 / x), + (x) => ce._BIGNUM_ONE.div(x).asin(), + (x) => x.inverse().asin() + ); + case "Arcosh": + return applyN( + op3, + Math.acosh, + (x) => x.acosh(), + (x) => x.acosh() + ); + case "Arcoth": + return applyN( + op3, + (x) => x, + (x) => x.acosh(), + (x) => x.acosh() + ); + case "Arcsch": + return applyN( + op3, + (x) => Math.log(1 / x + Math.sqrt(1 / (x * x) + 1)), + (x) => ce._BIGNUM_ONE.div(x.mul(x)).add(ce._BIGNUM_ONE).sqrt().add(ce._BIGNUM_ONE.div(x)).log(), + (x) => x.mul(x).inverse().add(1).sqrt().add(x.inverse()).log() + ); + case "Arcsec": + return applyN( + op3, + (x) => Math.acos(1 / x), + (x) => ce._BIGNUM_ONE.div(x).acos(), + (x) => x.inverse().acos() + ); + case "Arcsin": + return applyN( + op3, + Math.asin, + (x) => x.asin(), + (x) => x.asin() + ); + case "Arsech": + return applyN( + op3, + (x) => Math.log((1 + Math.sqrt(1 - x * x)) / x), + (x) => ce._BIGNUM_ONE.sub(x.mul(x).add(ce._BIGNUM_ONE).div(x)).log(), + (x) => ce.complex(1).sub(x.mul(x)).add(1).div(x).log() + ); + case "Arsinh": + return applyN( + op3, + Math.asinh, + (x) => x.asinh(), + (x) => x.asinh() + ); + case "Arctan": + return applyN( + op3, + Math.atan, + (x) => x.atan(), + (x) => x.atan() + ); + case "Artanh": + return applyN( + op3, + Math.atanh, + (x) => x.atanh(), + (x) => x.atanh() + ); + case "Cos": + return applyN( + op3, + Math.cos, + (x) => x.toSignificantDigits(ce.precision + 4).cos().toSignificantDigits(ce.precision), + (x) => x.cos() + ); + case "Cosh": + return applyN( + op3, + Math.cosh, + (x) => x.cosh(), + (x) => x.cosh() + ); + case "Cot": + return applyN( + op3, + (x) => 1 / Math.tan(x), + (x) => ce._BIGNUM_ONE.div(x.tan()), + (x) => x.tan().inverse() + ); + case "Coth": + return applyN( + op3, + (x) => 1 / Math.tanh(x), + (x) => ce._BIGNUM_ONE.div(x.tanh()), + (x) => x.tanh().inverse() + ); + case "Csc": + return applyN( + op3, + (x) => 1 / Math.sin(x), + (x) => ce._BIGNUM_ONE.div(x.sin()), + (x) => x.sin().inverse() + ); + case "Csch": + return applyN( + op3, + (x) => 1 / Math.sinh(x), + (x) => ce._BIGNUM_ONE.div(x.sinh()), + (x) => x.sinh().inverse() + ); + case "Sec": + return applyN( + op3, + (x) => 1 / Math.cos(x), + (x) => ce._BIGNUM_ONE.div(x.cos()), + (x) => x.cos().inverse() + ); + case "Sech": + return applyN( + op3, + (x) => 1 / Math.cosh(x), + (x) => ce._BIGNUM_ONE.div(x.cosh()), + (x) => x.cosh().inverse() + ); + case "Sin": + return applyN( + op3, + Math.sin, + (x) => x.toSignificantDigits(ce.precision + 4).sin().toSignificantDigits(ce.precision), + (x) => x.sin() + ); + case "Sinh": + return applyN( + op3, + Math.sinh, + (x) => x.sinh(), + (x) => x.sinh() + ); + case "Tan": + return applyN( + op3, + Math.tan, + (x) => x.toSignificantDigits(ce.precision + 4).tan().toSignificantDigits(ce.precision), + (x) => x.tan() + ); + case "Tanh": + return applyN( + op3, + Math.tanh, + (x) => x.tanh(), + (x) => x.tanh() + ); + } + return void 0; +} +var import_complex17 = __toESM(require_complex()); +var BoxedSymbolDefinitionImpl = class { + // @todo + constructor(ce, name, def) { + var _a, _b, _c, _d; + if (!ce.context) + throw Error("No context available"); + this.name = name; + this.wikidata = def.wikidata; + this.description = def.description; + this.url = def.url; + this._engine = ce; + this.scope = ce.context; + this.name = name; + this._flags = def.flags ? normalizeFlags(def.flags) : void 0; + this._domain = def.domain ? ce.domain(def.domain) : void 0; + this.constant = (_a = def.constant) != null ? _a : false; + this.holdUntil = (_b = def.holdUntil) != null ? _b : "evaluate"; + if (this.constant) { + this._defValue = def.value; + this._value = null; + } else { + if (def.value) { + if (isLatexString(def.value)) + this._value = (_c = ce.parse(def.value)) != null ? _c : ce.symbol("Undefined"); + else if (typeof def.value === "function") + this._value = ce.box((_d = def.value(ce)) != null ? _d : "Undefined"); + else if (def.value instanceof AbstractBoxedExpression) + this._value = def.value; + else + this._value = ce.box(def.value); + } else + this._value = void 0; + if (!this._value && this._domain && !def.flags) + this._flags = domainToFlags(this._domain); + } + } + reset() { + if (this.constant) + this._value = null; + } + // unbind() { + // this._value = null; + // this._domain = null; + // } + get value() { + var _a, _b, _c, _d; + if (this._value === null) { + const ce = this._engine; + if (isLatexString(this._defValue)) + this._value = (_a = ce.parse(this._defValue)) != null ? _a : ce.symbol("Undefined"); + else if (typeof this._defValue === "function") + this._value = ce.box((_b = this._defValue(ce)) != null ? _b : "Undefined"); + else if (this._defValue) + this._value = ce.box(this._defValue); + else + this._value = void 0; + if ((_c = this._value) == null ? void 0 : _c.numericValue) { + const val = this._value.numericValue; + if (!bignumPreferred(ce) && val instanceof decimal_default) + this._value = ce.number(val.toNumber()); + else if (!complexAllowed(ce) && val instanceof import_complex17.default) + this._value = ce._NAN; + } + } + return (_d = this._value) != null ? _d : void 0; + } + set value(val) { + if (this.constant) + throw new Error( + `The value of the constant "${this.name}" cannot be changed` + ); + /* @__PURE__ */ console.assert(this._defValue === void 0); + if (typeof val === "number") { + this._value = this._engine.number(val); + } else if (val) { + const newVal = this._engine.box(val); + if (!this._domain || newVal.domain.isCompatible(this._domain)) + this._value = newVal; + else + this._value = void 0; + } else + this._value = void 0; + if (this._value !== void 0) + this._flags = void 0; + else + this._flags = domainToFlags(this.domain); + } + get domain() { + var _a, _b, _c; + return (_c = (_b = this._domain) != null ? _b : (_a = this._value) == null ? void 0 : _a.domain) != null ? _c : void 0; + } + set domain(domain) { + var _a, _b, _c; + if (this.constant) + throw new Error( + `The domain of the constant "${this.name}" cannot be changed` + ); + if (!domain) { + this._defValue = void 0; + this._value = void 0; + this._flags = void 0; + this._domain = void 0; + return; + } + domain = this._engine.domain(domain); + if ((_a = this._domain) == null ? void 0 : _a.isNumeric) { + if (!domain.isNumeric) + throw Error("Can't change from a numeric domain to a non-numeric one"); + this._domain = domain; + if (!this._value) + this._flags = { ...(_b = this._flags) != null ? _b : {}, ...domainToFlags(domain) }; + return; + } + if (this._domain) + throw Error("Can't change a non-numeric domain"); + this._flags = void 0; + this._domain = domain; + if (!this._value && domain.isNumeric) + this._flags = { ...(_c = this._flags) != null ? _c : {}, ...domainToFlags(domain) }; + } + // + // Flags + // + get number() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNumber) != null ? _c : (_b = this._flags) == null ? void 0 : _b.number; + } + set number(val) { + this.updateFlags({ number: val }); + } + get integer() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isInteger) != null ? _c : (_b = this._flags) == null ? void 0 : _b.integer; + } + set integer(val) { + this.updateFlags({ integer: val }); + } + get rational() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isRational) != null ? _c : (_b = this._flags) == null ? void 0 : _b.rational; + } + set rational(val) { + this.updateFlags({ rational: val }); + } + get algebraic() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isAlgebraic) != null ? _c : (_b = this._flags) == null ? void 0 : _b.algebraic; + } + set algebraic(val) { + this.updateFlags({ algebraic: val }); + } + get real() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isReal) != null ? _c : (_b = this._flags) == null ? void 0 : _b.real; + } + set real(val) { + this.updateFlags({ real: val }); + } + get extendedReal() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isExtendedReal) != null ? _c : (_b = this._flags) == null ? void 0 : _b.extendedReal; + } + set extendedReal(val) { + this.updateFlags({ extendedReal: val }); + } + get complex() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isComplex) != null ? _c : (_b = this._flags) == null ? void 0 : _b.complex; + } + set complex(val) { + this.updateFlags({ complex: val }); + } + get extendedComplex() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isExtendedComplex) != null ? _c : (_b = this._flags) == null ? void 0 : _b.extendedComplex; + } + set extendedComplex(val) { + this.updateFlags({ extendedComplex: val }); + } + get imaginary() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isImaginary) != null ? _c : (_b = this._flags) == null ? void 0 : _b.imaginary; + } + set imaginary(val) { + this.updateFlags({ imaginary: val }); + } + get positive() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isPositive) != null ? _c : (_b = this._flags) == null ? void 0 : _b.positive; + } + set positive(val) { + this.updateFlags({ positive: val }); + } + get nonPositive() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNonPositive) != null ? _c : (_b = this._flags) == null ? void 0 : _b.nonPositive; + } + set nonPositive(val) { + this.updateFlags({ nonPositive: val }); + } + get negative() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNegative) != null ? _c : (_b = this._flags) == null ? void 0 : _b.negative; + } + set negative(val) { + this.updateFlags({ negative: val }); + } + get nonNegative() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNonNegative) != null ? _c : (_b = this._flags) == null ? void 0 : _b.nonNegative; + } + set nonNegative(val) { + this.updateFlags({ nonNegative: val }); + } + get zero() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isZero) != null ? _c : (_b = this._flags) == null ? void 0 : _b.zero; + } + set zero(val) { + this.updateFlags({ zero: val }); + } + get notZero() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNotZero) != null ? _c : (_b = this._flags) == null ? void 0 : _b.notZero; + } + set notZero(val) { + this.updateFlags({ notZero: val }); + } + get one() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isOne) != null ? _c : (_b = this._flags) == null ? void 0 : _b.one; + } + set one(val) { + this.updateFlags({ one: val }); + } + get negativeOne() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNegativeOne) != null ? _c : (_b = this._flags) == null ? void 0 : _b.negativeOne; + } + set negativeOne(val) { + this.updateFlags({ negativeOne: val }); + } + get infinity() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isInfinity) != null ? _c : (_b = this._flags) == null ? void 0 : _b.infinity; + } + set infinity(val) { + this.updateFlags({ infinity: val }); + } + get finite() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isFinite) != null ? _c : (_b = this._flags) == null ? void 0 : _b.finite; + } + set finite(val) { + this.updateFlags({ finite: val }); + } + get NaN() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isNaN) != null ? _c : (_b = this._flags) == null ? void 0 : _b.NaN; + } + set NaN(val) { + this.updateFlags({ NaN: val }); + } + get even() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isEven) != null ? _c : (_b = this._flags) == null ? void 0 : _b.even; + } + set even(val) { + this.updateFlags({ even: val }); + } + get odd() { + var _a, _b, _c; + return (_c = (_a = this.value) == null ? void 0 : _a.isOdd) != null ? _c : (_b = this._flags) == null ? void 0 : _b.odd; + } + set odd(val) { + this.updateFlags({ odd: val }); + } + get prime() { + var _a, _b; + const val = this._value; + if (val) { + if (!val.isInteger || val.isNonPositive) + return false; + return isPrime((_a = asFloat(val)) != null ? _a : NaN); + } + return (_b = this._flags) == null ? void 0 : _b.prime; + } + set prime(val) { + this.updateFlags({ prime: val }); + } + get composite() { + var _a, _b; + const val = this._value; + if (val) { + if (!val.isInteger || val.isNonPositive) + return false; + return !isPrime((_a = asFloat(val)) != null ? _a : NaN); + } + return (_b = this._flags) == null ? void 0 : _b.composite; + } + set composite(val) { + this.updateFlags({ composite: val }); + } + updateFlags(flags) { + var _a; + if (this.constant) + throw Error("The flags of constant cannot be changed"); + if (((_a = this.domain) == null ? void 0 : _a.isNumeric) === false) + throw Error("Flags only apply to numeric domains"); + let flagCount = 0; + let consistent = true; + for (const flag in Object.keys(flags)) { + flagCount += 1; + if (this._value && flags[flag] !== void 0) { + switch (flag) { + case "number": + consistent = this._value.isNumber === flags.number; + break; + case "integer": + consistent = this._value.isInteger === flags.integer; + break; + case "rational": + consistent = this._value.isRational === flags.rational; + break; + case "algebraic": + consistent = this._value.isAlgebraic === flags.algebraic; + break; + case "real": + consistent = this._value.isReal === flags.real; + break; + case "extendedReal": + consistent = this._value.isExtendedReal === flags.extendedReal; + break; + case "complex": + consistent = this._value.isComplex === flags.complex; + break; + case "extendedComplex": + consistent = this._value.isExtendedComplex === flags.extendedComplex; + break; + case "imaginary": + consistent = this._value.isImaginary === flags.imaginary; + break; + case "positive": + consistent = this._value.isPositive === flags.positive; + break; + case "nonPositive": + consistent = this._value.isNonPositive === flags.nonPositive; + break; + case "negative": + consistent = this._value.isNegative === flags.negative; + break; + case "nonNegative": + consistent = this._value.isNonNegative === flags.nonNegative; + break; + case "zero": + consistent = this._value.isZero === flags.zero; + break; + case "notZero": + consistent = this._value.isNotZero === flags.notZero; + break; + case "one": + consistent = this._value.isOne === flags.one; + break; + case "negativeOne": + consistent = this._value.isNegativeOne === flags.negativeOne; + break; + case "infinity": + consistent = this._value.isInfinity === flags.infinity; + break; + case "NaN": + consistent = this._value.isNaN === flags.NaN; + break; + case "finite": + consistent = this._value.isFinite === flags.finite; + break; + case "even": + consistent = this._value.isEven === flags.even; + break; + case "odd": + consistent = this._value.isOdd === flags.odd; + break; + case "prime": + consistent = this._value.isPrime === flags.prime; + break; + case "composite": + consistent = this._value.isComposite === flags.composite; + break; + } + } + } + if (flagCount > 0) { + if (!consistent) { + this._defValue = void 0; + this._value = void 0; + } + this._domain = this._engine.domain("Number"); + if (!this._flags) + this._flags = normalizeFlags(flags); + else + this._flags = { ...this._flags, ...normalizeFlags(flags) }; + } + } +}; +function definedKeys(xs) { + return Object.fromEntries( + Object.entries(xs).filter(([_k, v]) => v !== void 0) + ); +} +function normalizeFlags(flags) { + const result = { ...flags }; + if (flags.zero || flags.one || flags.negativeOne) { + result.zero = flags.zero && !flags.one && !flags.negativeOne; + result.notZero = !flags.zero || flags.one || flags.negativeOne; + result.one = flags.one && !flags.zero && !flags.negativeOne; + result.negativeOne = flags.negativeOne && !flags.zero && !flags.one; + result.infinity = false; + result.NaN = false; + result.finite = true; + result.integer = true; + result.finite = true; + result.infinity = false; + result.NaN = false; + result.even = flags.one; + result.odd = !flags.one; + result.prime = false; + result.composite = false; + } + if (result.zero) { + result.positive = false; + result.negative = false; + result.nonPositive = true; + result.nonNegative = true; + } + if (result.notZero === true) { + if (!result.imaginary) + result.real = true; + result.zero = false; + } + if (result.one) { + result.positive = true; + } + if (result.negativeOne) { + result.nonPositive = true; + } + if (result.positive || result.nonNegative) { + result.negativeOne = false; + } + if (result.positive) { + result.nonPositive = false; + result.negative = false; + result.nonNegative = true; + } else if (result.nonPositive) { + result.positive = false; + result.negative = result.notZero; + result.nonNegative = !result.zero; + } else if (result.negative) { + result.positive = false; + result.nonPositive = result.notZero; + result.nonNegative = false; + } else if (result.nonNegative) { + result.positive = result.notZero; + result.nonPositive = !result.zero; + result.negative = false; + } + if (result.positive || result.negative || result.nonPositive || result.nonNegative) { + result.number = true; + if (result.finite) + result.real = true; + else if (!result.finite) + result.complex = true; + result.imaginary = false; + } + if (result.finite) { + result.number = true; + result.complex = true; + result.infinity = false; + result.NaN = false; + } + if (result.infinity) { + result.finite = false; + result.NaN = false; + } + if (result.infinity === false) { + result.extendedComplex = false; + result.extendedReal = false; + } + if (flags.even) + result.odd = false; + if (flags.odd) + result.even = false; + if (result.integer) + result.rational = true; + if (result.rational) + result.algebraic = true; + if (result.algebraic) + result.real = true; + if (result.real) + result.complex = true; + if (result.imaginary) + result.complex = true; + if (result.complex) + result.number = true; + if (result.real && result.infinity !== false) + result.extendedReal = true; + if (result.complex && result.infinity !== false) + result.extendedComplex = true; + if (result.even || result.infinity || result.NaN || result.negative || result.imaginary || result.integer === false) + result.prime = false; + if (result.number && result.prime) + result.composite = false; + return result; +} +function domainToFlags(dom) { + if (!dom) + return {}; + const result = {}; + if (dom.isNumeric) { + const domain = dom.literal; + result.number = true; + if (domain === "Integer") + result.integer = true; + if (domain === "RationalNumber") + result.rational = true; + if (domain === "AlgebraicNumber") + result.algebraic = true; + if (domain === "TranscendentalNumber") { + result.algebraic = false; + result.real = true; + } + if (domain === "ExtendedRealNumber") + result.extendedReal = true; + if (domain === "RealNumber") + result.real = true; + if (domain === "ImaginaryNumber") + result.imaginary = true; + if (domain === "ExtendedComplexNumber") + result.extendedComplex = true; + if (domain === "ComplexNumber") + result.complex = true; + if (domain === "PositiveNumber") { + result.notZero = true; + result.real = true; + result.positive = true; + } + if (domain === "NegativeNumber") { + result.notZero = true; + result.real = true; + result.negative = true; + } + if (domain === "NonNegativeNumber") { + result.real = true; + result.positive = true; + } + if (domain === "NonPositiveNumber") { + result.real = true; + result.negative = true; + } + if (domain === "PositiveInteger") { + result.notZero = true; + result.integer = true; + result.positive = true; + } + if (domain === "NegativeNumber") { + result.notZero = true; + result.integer = true; + result.negative = true; + } + if (domain === "NonNegativeNumber") { + result.integer = true; + result.positive = true; + } + if (domain === "NonPositiveNumber") { + result.integer = true; + result.negative = true; + } + } else { + result.number = false; + result.integer = false; + result.rational = false; + result.algebraic = false; + result.real = false; + result.extendedReal = false; + result.complex = false; + result.extendedComplex = false; + result.imaginary = false; + result.positive = false; + result.nonPositive = false; + result.negative = false; + result.nonNegative = false; + result.zero = false; + result.notZero = false; + result.one = false; + result.negativeOne = false; + result.infinity = false; + result.NaN = false; + result.odd = false; + result.even = false; + result.prime = false; + result.composite = false; + } + return definedKeys(normalizeFlags(result)); +} +var BoxedFunctionDefinitionImpl = class { + constructor(ce, name, def) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; + if (!ce.context) + throw Error("No context available"); + this.engine = ce; + this.scope = ce.context; + const idempotent = (_a = def.idempotent) != null ? _a : false; + const involution = (_b = def.involution) != null ? _b : false; + if (idempotent && involution) + throw new Error( + `Function Definition "${name}": the 'idempotent' and 'involution' flags are mutually exclusive` + ); + this.name = name; + this.description = def.description; + this.wikidata = def.wikidata; + this.threadable = (_c = def.threadable) != null ? _c : false; + this.associative = (_d = def.associative) != null ? _d : false; + this.commutative = (_e = def.commutative) != null ? _e : false; + this.idempotent = idempotent; + this.involution = involution; + this.inert = (_f = def.inert) != null ? _f : false; + this.numeric = (_g = def.numeric) != null ? _g : false; + this.pure = (_h = def.pure) != null ? _h : true; + this.complexity = (_i = def.complexity) != null ? _i : DEFAULT_COMPLEXITY; + this.hold = (_j = def.hold) != null ? _j : "none"; + if (this.inert) { + if (def.hold) + throw Error( + `Function Definition "${name}": an inert function should not have a hold` + ); + this.hold = "rest"; + if (def.signature) { + const sig = def.signature; + if ("simplify" in sig || "evaluate" in sig || "N" in sig || "evalDimension" in sig || "sgn" in sig || "compile" in sig) + throw Error( + `Function Definition "${name}": an inert function should only have 'canonical' or 'codomain' handlers` + ); + } + if (this.threadable) + throw Error( + `Function Definition "${name}": an inert function should not be threadable` + ); + if (this.associative) + throw Error( + `Function Definition "${name}": an inert function should not be associative` + ); + if (this.commutative) + throw Error( + `Function Definition "${name}": an inert function should not be commutative` + ); + if (this.idempotent) + throw Error( + `Function Definition "${name}": an inert function should not be idempotent` + ); + if (this.involution) + throw Error( + `Function Definition "${name}": an inert function should not be involution` + ); + if (!this.pure) + throw Error( + `Function Definition "${name}": an inert function should be pure` + ); + } + if (def.signature) { + const sig = def.signature; + const domain = sig.domain ? ce.domain(sig.domain) : def.numeric ? ce.domain("NumericFunction") : ce.domain("Function"); + if (!domain.isValid) + throw Error( + `Function Definition "${name}": invalid domain ${JSON.stringify( + sig.domain + )}` + ); + const codomain = (_l = (_k = sig.codomain) != null ? _k : domain.codomain) != null ? _l : def.numeric ? ce.domain("Number") : ce.domain("Anything"); + this.signature = { + domain, + codomain, + canonical: sig.canonical, + simplify: sig.simplify, + evaluate: !sig.evaluate ? void 0 : typeof sig.evaluate === "function" ? sig.evaluate : ce.box(sig.evaluate, { canonical: false }), + N: sig.N, + evalDimension: sig.evalDimension, + sgn: sig.sgn, + compile: sig.compile + }; + } else if (def.numeric) { + this.signature = { + domain: ce.domain("NumericFunction"), + codomain: ce.domain("Number") + }; + } else { + this.signature = { + domain: ce.domain("Function"), + codomain: ce.domain("Anything") + }; + } + } + reset() { + return; + } +}; +function makeFunctionDefinition(engine, name, def) { + if (def instanceof BoxedFunctionDefinitionImpl) + return def; + return new BoxedFunctionDefinitionImpl( + engine, + name, + def + ); +} +function getStandardLibrary(categories) { + if (categories === "all") { + return getStandardLibrary([ + "domains", + "core", + "control-structures", + // If, Block, Loop + "logic", + "collections", + // Dictionary, List, Sets + "relop", + "numeric", + "arithmetic", + "algebra", + "calculus", + "combinatorics", + "linear-algebra", + "other", + "physics", + "polynomials", + "statistics", + "trigonometry", + "dimensions", + "units" + ]); + } else if (typeof categories === "string") + categories = [categories]; + const result = []; + for (const category of categories) { + const dict = LIBRARIES[category]; + if (!dict) + throw Error(`Unknown library category ${category}`); + if (Array.isArray(dict)) + result.push(...dict); + else + result.push(dict); + } + return result; +} +var LIBRARIES = { + "algebra": [], + // 'algebra': [ + // // polynomial([0, 2, 0, 4]:list, x:symbol) -> 2x + 4x^3 + // // polynomial(2x + 4x^3, x) -> {0, 2, 0, 4} + // // rational(2x + 4x^3, {3, 1}, x) -> (2x + 4x^3)/(3+x) + // // https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html + // // simplify-trig (macsyma) + // // - trigReduce, trigExpand, trigFactor, trigToExp (mathematica) + // // Mathematica: + // // - distribute -> (a+b)(c+d) -> ac+ ad+ bc+ bd (doesn't have to be multiply, + // // f(a+b, c+d) -> f(a, c) + f(a, d) + f(b, c) + f(b, d) + // // -- distribute(expr, over=add, with=multiply) + // // https://reference.wolfram.com/language/ref/Distribute.html + // // - expand, expand-all + // // - factor + // // - simplify + // ], + "arithmetic": [...ARITHMETIC_LIBRARY, ...COMPLEX_LIBRARY], + "calculus": CALCULUS_LIBRARY, + "combinatorics": [], + // @todo fibonacci, binomial, etc... + "control-structures": [], + // // D + // // Derivative (mathematica) + // // diff (macsyma) + // // nth-diff + // // int + // // - integrate(expression, symbol) -- indefinite integral + // // - integrate(expression, range) = {symbol, min, max} -- definite integral + // // - integrate(expression, range1, range2) -- multiple integral + // // def-int + // ], + "dimensions": [], + // @todo // volume, speed, area + "domains": [], + "core": CORE_LIBRARY, + "collections": [SETS_LIBRARY, COLLECTIONS_LIBRARY, domainSetsLibrary()], + // 'domains': getDomainsDictionary(), + "linear-algebra": [], + //@todo // 'linear-algebra': [ + // // matrix + // // transpose + // // cross-product + // // outer-product + // // determinant + // // vector + // // matrix + // // rank + // // scalar-matrix + // // constant-matrix + // // identity-matrix + // ], + "logic": LOGIC_LIBRARY, + "numeric": [], + // @todo // 'numeric': [ + // // Gamma function + // // Zeta function + // // erf function + // // numerator(fraction) + // // denominator(fraction) + // // exactFloatToRational + // // N -> eval as a number + // // random + // // hash + // ], + "other": [], + "relop": RELOP_LIBRARY, + "polynomials": POLYNOMIALS_LIBRARY, + "physics": { + Mu0: { + description: "Vaccum permeability", + constant: true, + wikidata: "Q1515261", + domain: "RealNumber", + value: 125663706212e-17 + // unit: ['Divide', 'N', ['Square', 'A']], + } + }, + "statistics": STATISTICS_LIBRARY, + "trigonometry": TRIGONOMETRY_LIBRARY, + "units": [] +}; +function validateDefinitionName(name) { + name = name.normalize(); + if (isValidIdentifier(name)) + return name; + throw new Error( + `Invalid definition name "${name}": ${validateIdentifier(name)}` + ); +} +function setCurrentContextSymbolTable(engine, table) { + var _a2; + var _a; + if (!engine.context) + throw Error("No context available"); + (_a2 = (_a = engine.context).idTable) != null ? _a2 : _a.idTable = /* @__PURE__ */ new Map(); + const idTable = engine.context.idTable; + for (let name of Object.keys(table)) { + const entry = table[name]; + name = validateDefinitionName(name); + if (isFunctionDefinition(entry)) { + const def = makeFunctionDefinition(engine, name, entry); + if (idTable.has(name)) + throw new Error( + `Duplicate function definition ${name}: +${JSON.stringify( + idTable.get(name) + )} +${JSON.stringify(entry)}` + ); + idTable.set(name, def); + } else if (isSymbolDefinition(entry)) { + const def = new BoxedSymbolDefinitionImpl(engine, name, entry); + if (engine.strict && entry.wikidata) { + for (const [_, d] of idTable) { + if (d.wikidata === entry.wikidata) + throw new Error( + `Duplicate entries with wikidata "${entry.wikidata}": "${name}" and "${d.name}"` + ); + } + } + if (idTable.has(name)) + throw new Error(`Duplicate symbol definition "${name}"`); + idTable.set(name, def); + } else { + const def = new BoxedSymbolDefinitionImpl(engine, name, { + value: engine.box(entry) + }); + /* @__PURE__ */ console.assert(def); + idTable.set(name, def); + } + } +} +var import_complex19 = __toESM(require_complex()); +function numericCostFunction(n) { + if (Number.isInteger(n) && n !== 0) { + return Math.floor(Math.log2(Math.abs(n)) / Math.log2(10)) + (n > 0 ? 1 : 2); + } + return 2; +} +function costFunction(expr) { + var _a, _b; + if (expr.symbol) + return 1; + const num = expr.numericValue; + if (num !== null) { + if (expr.isZero) + return 1; + if (expr.isInteger) + return numericCostFunction(asFloat(expr)); + if (isRational(num)) { + if (isMachineRational(num)) + return numericCostFunction(num[0]) + numericCostFunction(num[1]) + 1; + else + return numericCostFunction(Number(num[0])) + numericCostFunction(Number(num[1])) + 1; + } + if (num instanceof import_complex19.default) + return numericCostFunction(num.re) + numericCostFunction(num.im) + 1; + if (expr.isNumber) + return 2; + } + const head2 = expr.head; + let headCost = 2; + if (typeof head2 === "string") { + if (["Add", "Divide"].includes(head2)) + headCost = 3; + else if (["Subtract", "Negate"].includes(head2)) + headCost = 4; + else if (["Square", "Sqrt", "Multiply", "Root"].includes(head2)) + headCost = 5; + else if (["Power"].includes(head2)) + headCost = 6; + else if (["Ln", "Exp", "Log"].includes(head2)) + headCost = 7; + else if ([ + "Arcsin", + "Arccos", + "Arctan", + "Arcsec", + " Arccsc", + "Arsinh", + "Arcosh", + "Artanh", + "Arcsech", + "Arcsch", + "Cosh", + "Cos", + "Csc", + "Csch", + // '??': 'Cot', + // '??': 'Coth', + "Sec", + "Sin", + "Sinh", + "Tan", + "Tanh" + ].includes(head2)) + headCost = 9; + else + headCost = 10; + } else + headCost = costFunction(head2); + return headCost + ((_b = (_a = expr.ops) == null ? void 0 : _a.reduce((acc, x) => acc + costFunction(x), 0)) != null ? _b : 0); +} +var DEFAULT_COST_FUNCTION = costFunction; +var ExpressionMap = class _ExpressionMap { + constructor(source) { + if (!source) { + this._items = /* @__PURE__ */ new Map(); + } else if (source instanceof _ExpressionMap) { + this._items = new Map(source._items); + } else { + this._items = new Map( + source + ); + } + } + has(expr) { + for (const x of this._items.keys()) + if (x.isSame(expr)) + return true; + return false; + } + get(expr) { + for (const [x, v] of this._items) + if (x.isSame(expr)) + return v; + return void 0; + } + clear() { + this._items.clear(); + } + set(expr, value) { + for (const x of this._items.keys()) { + if (x.isSame(expr)) { + this._items.set(x, value); + return; + } + } + this._items.set(expr, value); + } + delete(expr) { + this._items.delete(expr); + } + [Symbol.iterator]() { + return this._items.entries(); + } + entries() { + return this._items.entries(); + } +}; +function permutations(xs) { + const result = []; + const permute = (arr, m = []) => { + if (arr.length === 0) { + result.push(m); + } else { + for (let i = 0; i < arr.length; i++) { + const curr = arr.slice(); + const next = curr.splice(i, 1); + permute(curr.slice(), m.concat(next)); + } + } + }; + permute(xs); + return result; +} +var BoxedPattern = class _BoxedPattern extends AbstractBoxedExpression { + constructor(ce, pattern, metadata) { + super(ce, metadata); + this._pattern = isLatexString(pattern) ? ce.parse(pattern, { canonical: false }) : ce.box(pattern, { canonical: false }); + } + get hash() { + return hashCode("Pattern") ^ this._pattern.hash; + } + unbind() { + this._pattern.unbind(); + } + get json() { + return serializeJsonFunction(this.engine, "Pattern", [this._pattern]); + } + get head() { + return "Pattern"; + } + get domain() { + return this.engine.domain("Pattern"); + } + get isCanonical() { + return true; + } + set isCanonical(_val) { + return; + } + isSame(rhs) { + if (this === rhs) + return true; + return rhs instanceof _BoxedPattern && this._pattern.isSame(rhs._pattern); + } + isEqual(rhs) { + return rhs instanceof _BoxedPattern && this._pattern.isEqual(rhs._pattern); + } + match(expr, options) { + var _a, _b, _c; + return match(expr, this._pattern, { + recursive: (_a = options == null ? void 0 : options.recursive) != null ? _a : false, + numericTolerance: (_b = options == null ? void 0 : options.numericTolerance) != null ? _b : 0, + substitution: (_c = options == null ? void 0 : options.substitution) != null ? _c : {} + }); + } + test(expr, options) { + return this.match(expr, options) !== null; + } + count(exprs, options) { + let result = 0; + for (const expr of exprs) { + if (this.match(expr, options) !== null) + result += 1; + } + return result; + } + subs(sub2, options) { + return this._pattern.subs(sub2, options); + } +}; +function hasWildcards(expr) { + var _a; + if (typeof expr === "string") + return expr.startsWith("_"); + if ((_a = expr.symbol) == null ? void 0 : _a.startsWith("_")) + return true; + if (expr.ops) + return hasWildcards(expr.head) || expr.ops.some(hasWildcards); + if (expr.keys) { + for (const key of expr.keys) + if (hasWildcards(expr.getKey(key))) + return true; + } + return false; +} +function captureWildcard(wildcard, expr, substitution) { + const name = getWildcardName(wildcard); + if (name === "") + return substitution; + if (substitution[name] !== void 0) { + if (!expr.isSame(substitution[name])) + return null; + return substitution; + } + if (hasWildcards(expr)) + return null; + return { ...substitution, [name]: expr }; +} +function matchOnce(expr, pattern, substitution, options) { + const ce = expr.engine; + if (pattern.head === "Pattern") + return pattern.match(expr, { substitution, ...options }); + if (pattern instanceof BoxedNumber) { + if (!(expr instanceof BoxedNumber)) + return null; + if (options.numericTolerance === 0) + return pattern.isSame(expr) ? substitution : null; + return pattern.isEqualWithTolerance(expr, options.numericTolerance) ? substitution : null; + } + const str = pattern.string; + if (str !== null) + return expr.string === str ? substitution : null; + const symbol2 = pattern.symbol; + if (symbol2 !== null) { + if (symbol2.startsWith("_")) + return captureWildcard(symbol2, expr, substitution); + return symbol2 === expr.symbol ? substitution : null; + } + if (pattern.nops !== expr.nops) + return null; + const keys = pattern.keys; + if (keys !== null) { + const exprKeys = expr.keys; + if (exprKeys === null) + return null; + for (const key of keys) { + const r = matchOnce(exprKeys[key], keys[key], substitution, options); + if (r === null) + return null; + substitution = r; + } + return substitution; + } + if (pattern.ops) { + const head2 = pattern.head; + if (typeof head2 === "string" && head2.startsWith("_")) + return captureWildcard(head2, ce.box(expr.head), substitution); + let def = void 0; + if (typeof head2 === "string" && typeof expr.head === "string") { + if (head2 !== expr.head) + return null; + def = ce.lookupFunction(head2); + } else { + const r = matchOnce( + ce.box(expr.head, { canonical: false }), + ce.box(head2, { canonical: false }), + substitution, + options + ); + if (r === null) + return null; + substitution = r; + } + return (def == null ? void 0 : def.commutative) ? matchCommutativeArguments(expr, pattern, substitution, options) : matchNonCommutativeArguments(expr, pattern, substitution, options); + } + return null; +} +function matchPermutation(ce, ops2, patterns, substitution, options) { + var _a; + let result = { ...substitution }; + ops2 = [...ops2]; + let hasRest = false; + for (const arg of patterns) { + if (arg.symbol === "__") + hasRest = true; + else { + let r = null; + if ((_a = arg.symbol) == null ? void 0 : _a.startsWith("_")) { + for (let i = 0; i <= ops2.length - 1; i++) { + r = captureWildcard(arg.symbol, ops2[i], result); + if (r !== null) { + ops2.splice(i, 1); + break; + } + } + } else { + for (let i = 0; i <= ops2.length - 1; i++) { + r = matchOnce(ops2[i], arg, result, options); + if (r !== null) { + ops2.splice(i, 1); + break; + } + } + } + if (r === null) + return null; + result = r; + } + } + if (!hasRest && ops2.length > 0) + return null; + if (result !== null && hasRest) + result["__"] = ce._fn("Sequence", ops2); + return result; +} +function matchCommutativeArguments(expr, pattern, substitution, options) { + const patterns = permutations(pattern.ops); + for (const pat of patterns) { + const result = matchPermutation( + expr.engine, + expr.ops, + pat, + substitution, + options + ); + if (result !== null) + return result; + } + return null; +} +function matchNonCommutativeArguments(expr, pattern, substitution, options) { + const ce = expr.engine; + const ops2 = [...expr.ops]; + let result = { ...substitution }; + let i = 0; + const patterns = pattern.ops; + while (i < pattern.nops) { + const pat = patterns[i]; + const argName = pat.symbol; + if (argName !== null) { + if (argName.startsWith("__")) { + let j = 0; + if (patterns[i + 1] === void 0) { + j = ops2.length + 1; + } else { + let found = false; + while (!found && j < ops2.length) { + found = matchOnce(ops2[j], patterns[i + 1], result, options) !== null; + j += 1; + } + if (!found) + return null; + } + if (!argName.startsWith("___") && j <= 1) + return null; + result = captureWildcard( + argName, + ce.fn("Sequence", ops2.splice(0, j - 1)), + result + ); + } else if (argName.startsWith("_")) { + result = captureWildcard(argName, ops2.shift(), result); + } else { + const sub2 = matchOnce(ops2.shift(), pat, result, options); + if (sub2 === null) + return null; + result = sub2; + } + } else { + const sub2 = matchOnce(ops2.shift(), pat, result, options); + if (sub2 === null) + return null; + result = sub2; + } + if (result === null) + return null; + i += 1; + } + return result; +} +function match(subject, pattern, options) { + var _a, _b; + const substitution = matchOnce(subject, pattern, (_a = options.substitution) != null ? _a : {}, { + numericTolerance: (_b = options == null ? void 0 : options.numericTolerance) != null ? _b : NUMERIC_TOLERANCE + }); + if (substitution) { + /* @__PURE__ */ console.log("match", subject.toString(), pattern.toString(), substitution); + return substitution; + } + if (!options.recursive) + return null; + return null; +} +function isSymbolDefinition2(def) { + if (def === null || def === void 0) + return false; + if ("constant" in def) + return true; + return false; +} +function isFunctionDefinition2(def) { + if (def === null || def === void 0) + return false; + if ("signature" in def) + return true; + return false; +} +var BoxedSymbol = class _BoxedSymbol extends AbstractBoxedExpression { + constructor(ce, name, options) { + var _a; + super(ce, options == null ? void 0 : options.metadata); + /* @__PURE__ */ console.assert( + name === name.normalize(), + `Symbol "${name}" must be in Unicode NFC canonical order` + ); + this._name = name; + /* @__PURE__ */ console.assert( + isValidIdentifier(this._name), + `Invalid symbol "${name}": ${validateIdentifier(this._name)}` + ); + this._scope = (options == null ? void 0 : options.canonical) ? ce.context : null; + this._def = (_a = options == null ? void 0 : options.def) != null ? _a : null; + } + get hash() { + if (this._hash === void 0) + this._hash = hashCode(this._name); + return this._hash; + } + unbind() { + var _a; + (_a = this._def) == null ? void 0 : _a.reset(); + this._def = null; + } + get isPure() { + var _a, _b, _c, _d, _e; + return (_e = (_d = ((_a = this.symbolDefinition) == null ? void 0 : _a.constant) && ((_b = this.symbolDefinition.value) == null ? void 0 : _b.isPure)) != null ? _d : (_c = this.functionDefinition) == null ? void 0 : _c.pure) != null ? _e : false; + } + get json() { + return serializeJsonSymbol(this.engine, this._name, { + latex: this._latex, + wikidata: this._wikidata + }); + } + get scope() { + return this._scope; + } + /** A free variable either has no definition, or it has a definition, but no value */ + get isFree() { + var _a; + const def = (_a = this._def) != null ? _a : this.engine.lookupSymbol(this._name, this._wikidata); + return !isSymbolDefinition2(def) || def.value === void 0; + } + get isConstant() { + var _a; + const def = (_a = this._def) != null ? _a : this.engine.lookupSymbol(this._name, this._wikidata); + return !isSymbolDefinition2(def) || def.constant; + } + get isCanonical() { + return this._scope !== null; + } + set isCanonical(val) { + this._scope = val ? this.engine.context : null; + this._def = null; + } + get canonical() { + if (this._scope) + return this; + return this.engine.box(this._name); + } + get wikidata() { + var _a, _b, _c; + return (_c = (_b = this._wikidata) != null ? _b : (_a = this.baseDefinition) == null ? void 0 : _a.wikidata) != null ? _c : void 0; + } + get description() { + if (!this.baseDefinition) + return void 0; + if (!this.baseDefinition.description) + return void 0; + if (typeof this.baseDefinition.description === "string") + return [this.baseDefinition.description]; + return this.baseDefinition.description; + } + get url() { + var _a, _b; + return (_b = (_a = this.baseDefinition) == null ? void 0 : _a.url) != null ? _b : void 0; + } + get complexity() { + return 7; + } + get head() { + return "Symbol"; + } + get symbol() { + return this._name; + } + get isNothing() { + return this._name === "Nothing"; + } + // A base definition is the base class of both symbol and function definition + get baseDefinition() { + var _a; + if (this._def === null) + this.bind(this._scope); + return (_a = this._def) != null ? _a : void 0; + } + get symbolDefinition() { + if (this._def === null) + this.bind(this._scope); + return isSymbolDefinition2(this._def) ? this._def : void 0; + } + get functionDefinition() { + if (this._def === null) + this.bind(this._scope); + return isFunctionDefinition2(this._def) ? this._def : void 0; + } + bind(scope) { + if (scope === null) { + this._def = void 0; + return; + } + let def; + def = this.engine.lookupSymbol(this._name, this._wikidata, scope); + if ((def == null ? void 0 : def.wikidata) && this._wikidata && def.wikidata !== this._wikidata) + def = void 0; + if (def) { + this._name = def.name; + this._def = def; + return; + } + def = this.engine.lookupFunction(this._name, scope); + if (def) { + this._def = def; + return; + } + if (this.engine.defaultDomain !== null) { + this._def = this.engine.defineSymbol(this._name, { + wikidata: this._wikidata, + domain: this.engine.defaultDomain + }); + this._name = this._def.name; + } + } + get value() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.value; + } + set value(value) { + var _a; + if (this._name[0] === "_") + throw new Error( + `The value of the wildcard "${this._name}" cannot be changed` + ); + this.engine.forget(this._name); + let v; + if (value !== void 0) { + const boxedValue = this.engine.box(value); + v = (_a = boxedValue.value) != null ? _a : boxedValue.evaluate(); + } + if (v == null ? void 0 : v.domain.isCompatible("Function")) { + this._def = this.engine.defineFunction(this._name, { + signature: { + domain: v.domain, + evaluate: v + // Evaluate as a lambda + } + }); + } else if (this._def && isSymbolDefinition2(this._def)) { + this._def.value = v; + } else { + let dom = v == null ? void 0 : v.domain; + if (dom == null ? void 0 : dom.isNumeric) + dom = this.engine.domain("Number"); + this._def = this.engine.defineSymbol(this._name, { + value: v, + domain: dom != null ? dom : void 0 + }); + } + } + get domain() { + var _a, _b, _c; + if (this.functionDefinition) + return this.engine.domain("Function"); + return (_c = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.domain) != null ? _b : this.engine.defaultDomain) != null ? _c : this.engine.domain("Value"); + } + set domain(inDomain) { + if (this._name[0] === "_") + throw new Error( + `The domain of the wildcard "${this._name}" cannot be changed` + ); + const d = this.engine.domain(inDomain); + if (d.isCompatible("Function")) { + this.engine.forget(this._name); + this._def = this.engine.defineFunction(this._name, { + signature: { domain: d } + }); + } else if (isSymbolDefinition2(this._def)) { + this._def.domain = d; + } else { + this.engine.forget(this._name); + this._def = this.engine.defineSymbol(this._name, { domain: d }); + } + } + get explicitDomain() { + var _a, _b; + if (this.functionDefinition) + return this.engine.domain("Function"); + return (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.domain) != null ? _b : void 0; + } + get sgn() { + const v = this.value; + if (v && v !== this) { + const s = v.sgn; + if (s !== void 0) + return s; + } + const def = this.symbolDefinition; + if (def) { + if (def.zero === true) + return 0; + if (def.positive === true) + return 1; + if (def.negative === true) + return -1; + } else + return null; + return void 0; + } + has(x) { + if (typeof x === "string") + return this._name === x; + return x.includes(this._name); + } + isSame(rhs) { + if (this === rhs) + return true; + if (!(rhs instanceof _BoxedSymbol)) + return false; + return this._name === rhs._name; + } + match(rhs, _options) { + if (!(rhs instanceof _BoxedSymbol)) + return null; + if (this._name === rhs._name) + return {}; + return null; + } + isEqual(rhs) { + var _a, _b; + if (!this.isCanonical) + return this.canonical.isEqual(rhs); + rhs = rhs.canonical; + if (this === rhs) + return true; + if (rhs.symbol !== null) + return rhs.symbol === this._name; + const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); + if (lhsVal) + return lhsVal.isEqual(rhs.N()); + if (rhs.isZero) { + if (this.isZero) + return true; + if (this.isNotZero) + return false; + } + if (this.isZero && rhs.isNotZero) + return false; + if (this.engine.ask(["Equal", this, rhs]).length > 0) + return true; + if (this.engine.ask(["NotEqual", this, rhs]).length > 0) + return false; + return false; + } + isLess(rhs) { + var _a, _b; + if (rhs.symbol !== null && rhs.symbol === this._name) + return false; + const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); + if (lhsVal) + return lhsVal.isLess(rhs.N()); + if (rhs.isZero) { + const s = this.sgn; + if (s === null) + return false; + if (s !== void 0) + return s < 0; + } + return void 0; + } + isLessEqual(rhs) { + var _a, _b; + if (rhs.symbol !== null && rhs.symbol === this._name) + return true; + const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); + if (lhsVal) + return lhsVal.isLessEqual(rhs.N()); + if (rhs.isZero) { + const s = this.sgn; + if (s === null) + return false; + if (s !== void 0) + return s <= 0; + } + return this.isLess(rhs) || this.isEqual(rhs); + } + isGreater(rhs) { + var _a, _b; + if (rhs.symbol !== null && rhs.symbol === this._name) + return false; + const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); + if (lhsVal) + return lhsVal.isGreater(rhs.N()); + if (rhs.isZero) { + const s = this.sgn; + if (s === null) + return false; + if (s !== void 0) + return s > 0; + } + return void 0; + } + isGreaterEqual(rhs) { + var _a, _b; + if (rhs.symbol !== null && rhs.symbol === this._name) + return true; + const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); + if (lhsVal) + return lhsVal.isGreaterEqual(rhs.N()); + if (rhs.isZero) { + const s = this.sgn; + if (s === null) + return false; + if (s !== void 0) + return s >= 0; + } + return this.isGreater(rhs) || this.isEqual(rhs); + } + get isFunction() { + return !!this.functionDefinition; + } + get isZero() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.zero; + } + get isNotZero() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.notZero; + } + get isOne() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.one; + } + get isNegativeOne() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.negativeOne; + } + get isOdd() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.odd; + } + get isEven() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.even; + } + get isPrime() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.prime; + } + get isComposite() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.composite; + } + get isInfinity() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.infinity; + } + get isNaN() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.NaN; + } + // x > 0 + get isPositive() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.positive; + } + get isNonPositive() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.nonPositive; + } + get isNegative() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.negative; + } + get isNonNegative() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.nonNegative; + } + get isNumber() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.number; + } + get isInteger() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.integer; + } + get isRational() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.rational; + } + get isAlgebraic() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.rational; + } + get isReal() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.real; + } + get isExtendedReal() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.extendedReal; + } + get isComplex() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.complex; + } + get isImaginary() { + var _a; + return (_a = this.symbolDefinition) == null ? void 0 : _a.imaginary; + } + simplify(options) { + var _a; + const def = this.symbolDefinition; + if ((def == null ? void 0 : def.holdUntil) === "simplify" && def.value) + return def.value.simplify(options); + return (options == null ? void 0 : options.rules) ? (_a = this.replace(options.rules)) != null ? _a : this : this; + } + evaluate(options) { + var _a, _b; + const def = this.symbolDefinition; + if (def && (def.holdUntil === "simplify" || def.holdUntil === "evaluate")) + return (_b = (_a = def.value) == null ? void 0 : _a.evaluate(options)) != null ? _b : this; + return this; + } + N(options) { + var _a, _b, _c; + const def = this.symbolDefinition; + if (def && def.holdUntil === "never") + return this; + return (_c = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(options)) != null ? _c : this; + } + replace(rules, options) { + return replace(this, rules, options); + } + subs(sub2, options) { + if (sub2[this._name] === void 0) + return (options == null ? void 0 : options.canonical) ? this.canonical : this; + return this.engine.box(sub2[this._name], options); + } +}; +function makeCanonicalSymbol(ce, name) { + const def = ce.lookupSymbol(name, void 0, ce.context); + if ((def == null ? void 0 : def.holdUntil) === "never" && def.value) + return def.value; + return new BoxedSymbol(ce, name, { canonical: true, def }); +} +var ComputeEngine = class _ComputeEngine { + /** + * Construct a new `ComputeEngine` instance. + * + * Identifier tables define functions and symbols (in `options.ids`). + * If no table is provided the standard library is used (`ComputeEngine.getStandardLibrary()`) + * + * The LaTeX syntax dictionary is defined in `options.latexDictionary`. + * + * The order of the dictionaries matter: the definitions from the later ones + * override the definitions from earlier ones. The first dictionary should + * be the `'core'` dictionary which include some basic definitions such + * as domains (`Boolean`, `Number`, etc...) that are used by later dictionaries. + * + * @param options.numericMode The default mode is `"auto"`. Use `"machine"` + * to perform numeric calculations using 64-bit floats. Use `"bignum"` to + * perform calculations using arbitrary precision floating point numbers. + * Use `"auto"` or `"complex"` to allow calculations on complex numbers. + * + * @param options.numericPrecision Specific how many digits of precision + * for the numeric calculations. Default is 100. + * + * @param options.tolerance If the absolute value of the difference of two + * numbers is less than `tolerance`, they are considered equal. Used by + * `chop()` as well. + * + * @param options.defaultDomain If an unknown symbol is encountered, assume + * this is its domain. **Default** `ExtendedRealNumber` + */ + constructor(options) { + var _a, _b, _c, _d; + this._cache = {}; + this._commonSymbols = { + True: null, + False: null, + Maybe: null, + All: null, + Nothing: null, + None: null, + Undefined: null, + Function: null, + Pi: null, + ImaginaryUnit: null + }; + this._commonNumbers = { + "-5": null, + "-4": null, + "-3": null, + "-2": null, + 2: null, + 3: null, + 4: null, + 5: null, + 6: null, + 7: null, + 8: null, + 9: null, + 10: null, + 11: null, + 12: null, + 36: null + }; + this._commonDomains = { + Anything: null, + Nothing: null, + Boolean: null, + MaybeBoolean: null, + String: null, + Domain: null, + Symbol: null, + Integer: null, + RationalNumber: null, + AlgebraicNumber: null, + RealNumber: null, + ExtendedRealNumber: null, + ImaginaryNumber: null, + ComplexNumber: null, + ExtendedComplexNumber: null, + Number: null, + PositiveInteger: null, + TranscendentalNumber: null, + PositiveNumber: null, + Function: null, + // (Anything^n) -> Anything + NumericFunction: null, + // (Number^n) -> Number + RealFunction: null, + // (ExtendedRealNumber^n) -> ExtendRealNumber + TrigonometricFunction: null, + // (ComplexNumber) -> ComplexNumber + LogicOperator: null, + // (Boolean, Boolean) -> Boolean + Predicate: null, + // (Anything^n) -> MaybeBoolean + RelationalOperator: null + // (Anything, Anything) -> MaybeBoolean + }; + if (options !== void 0 && typeof options !== "object") + throw Error("Unexpected argument"); + this.strict = true; + this._latexDictionary = options == null ? void 0 : options.latexDictionary; + this._jsonSerializationOptions = { + exclude: [], + shorthands: ["function", "symbol", "string", "dictionary", "number"], + metadata: [], + precision: "max", + repeatingDecimals: true + }; + this._useRawJsonSerializationOptions = false; + this._rawJsonSerializationOptions = { + exclude: [], + shorthands: ["function", "symbol", "string", "dictionary", "number"], + metadata: [], + precision: "max", + repeatingDecimals: false + }; + this._stats = { + highwaterMark: 0, + symbols: /* @__PURE__ */ new Set(), + expressions: /* @__PURE__ */ new Set() + }; + this._defaultDomain = null; + this._numericMode = (_a = options == null ? void 0 : options.numericMode) != null ? _a : "auto"; + this._precision = Math.max( + (_b = options == null ? void 0 : options.numericPrecision) != null ? _b : 100, + Math.floor(MACHINE_PRECISION) + ); + this._bignum = Decimal.clone({ precision: this._precision }); + this.tolerance = (_c = options == null ? void 0 : options.tolerance) != null ? _c : NUMERIC_TOLERANCE; + this._ZERO = new BoxedNumber(this, 0); + this._ONE = new BoxedNumber(this, 1); + this._HALF = new BoxedNumber(this, [1, 2]); + this._NEGATIVE_ONE = new BoxedNumber(this, -1); + this._I = new BoxedNumber(this, import_complex20.Complex.I); + this._NAN = new BoxedNumber(this, Number.NaN); + this._POSITIVE_INFINITY = new BoxedNumber(this, Number.POSITIVE_INFINITY); + this._NEGATIVE_INFINITY = new BoxedNumber(this, Number.NEGATIVE_INFINITY); + this._COMPLEX_INFINITY = new BoxedNumber(this, import_complex20.Complex.INFINITY); + this.reset(); + this.context = { + assumptions: new ExpressionMap(), + timeLimit: 2, + // execution time limit: 2.0 seconds + memoryLimit: 1, + // memory limit: 1.0 megabyte + recursionLimit: 1024, + iterationLimit: Number.POSITIVE_INFINITY + }; + const tables = (_d = options == null ? void 0 : options.ids) != null ? _d : _ComputeEngine.getStandardLibrary(); + for (const table of tables) + setCurrentContextSymbolTable(this, table); + for (const d of Object.keys(this._commonDomains)) { + if (this._commonDomains[d] && !this._commonDomains[d].symbolDefinition) + this._commonDomains[d].bind(this.context); + else + this._commonDomains[d] = boxDomain(this, d); + } + for (const sym of Object.keys(this._commonSymbols)) { + this._commonSymbols[sym] = new BoxedSymbol(this, sym, { + canonical: true + }); + this._commonSymbols[sym].bind(this.context); + } + if (options == null ? void 0 : options.defaultDomain) { + const defaultDomain = this.domain(options.defaultDomain); + if (defaultDomain.isValid) + this._defaultDomain = defaultDomain; + else + this._defaultDomain = this.domain("ExtendedRealNumber"); + } else + this._defaultDomain = this.domain("ExtendedRealNumber"); + this.pushScope(); + } + /** + * Return identifier tables suitable for the specified categories, or `"all"` + * for all categories (`"arithmetic"`, `"algebra"`, etc...). + * + * An identifier table defines how the symbols and function names in a + * MathJSON expression should be interpreted, i.e. how to evaluate and + * manipulate them. + * + */ + static getStandardLibrary(categories = "all") { + return getStandardLibrary(categories); + } + get latexDictionary() { + return this.latexSyntax.dictionary; + } + set latexDictionary(dic) { + this.latexSyntax.dictionary = dic; + } + /** After the configuration of the engine has changed, clear the caches + * so that new values can be recalculated. + * + * This needs to happen for example when the numeric precision changes. + * + * @internal + */ + reset() { + var _a; + /* @__PURE__ */ console.assert(this._bignum); + this._BIGNUM_NEGATIVE_ONE = this.bignum(-1); + this._BIGNUM_NAN = this.bignum(NaN); + this._BIGNUM_ZERO = this.bignum(0); + this._BIGNUM_ONE = this.bignum(1); + this._BIGNUM_TWO = this.bignum(2); + this._BIGNUM_HALF = this._BIGNUM_ONE.div(this._BIGNUM_TWO); + this._BIGNUM_PI = this._BIGNUM_NEGATIVE_ONE.acos(); + const symbols = this._stats.symbols.values(); + const expressions = this._stats.expressions.values(); + this._stats.symbols = /* @__PURE__ */ new Set(); + this._stats.expressions = /* @__PURE__ */ new Set(); + for (const s of symbols) + s.unbind(); + for (const s of expressions) + s.unbind(); + for (const d of Object.values(this._commonDomains)) + d == null ? void 0 : d.unbind(); + for (const d of Object.values(this._commonSymbols)) + d == null ? void 0 : d.unbind(); + let scope = this.context; + while (scope) { + if (scope.idTable) + for (const [_k, v] of scope.idTable) + v.reset(); + scope = (_a = scope.parentScope) != null ? _a : null; + } + for (const k of Object.keys(this._cache)) + if (this._cache[k].value) { + if (!this._cache[k].purge) + delete this._cache[k]; + else + this._cache[k].value = this._cache[k].purge(this._cache[k].value); + } + } + /** @internal */ + _register(_expr) { + this._stats.highwaterMark += 1; + } + /** @internal */ + _unregister(_expr) { + } + get stats() { + const expressions = this._stats.expressions; + this._stats.expressions = null; + this._stats.expressions = expressions; + return { + ...this._stats + // _dupeSymbols: topDupes, + // _popularExpressions: top10, + }; + } + /** The precision, or number of significant digits, of numeric + * calculations when the numeric mode is `"auto"` or `"bignum"`. + * + * To make calculations using more digits, at the cost of expanded memory + * usage and slower computations, set the `precision` higher. + * + * If the numeric mode is not `"auto"` or `"bignum"`, it is set to `"auto"`. + * + * Trigonometric operations are accurate for precision up to 1,000. + * + */ + get precision() { + if (this._numericMode === "machine" || this._numericMode === "complex") + return Math.floor(MACHINE_PRECISION); + return this._precision; + } + set precision(p) { + var _a; + if (p === "machine") + p = Math.floor(MACHINE_PRECISION); + const currentPrecision = this._precision; + if (p === currentPrecision) + return; + if (typeof p !== "number" || p <= 0) + throw Error('Expected "machine" or a positive number'); + (_a = this._latexSyntax) == null ? void 0 : _a.updateOptions({ + precision: p, + avoidExponentsInRange: [-6, p] + }); + this._precision = Math.max(p, Math.floor(MACHINE_PRECISION)); + if (this.jsonSerializationOptions.precision > this._precision) + this.jsonSerializationOptions = { precision: this._precision }; + if (this._numericMode !== "auto" && this._numericMode !== "bignum" && this._precision > Math.floor(MACHINE_PRECISION)) + this._numericMode = "auto"; + this._bignum = this._bignum.config({ precision: this._precision }); + this.reset(); + } + get numericMode() { + return this._numericMode; + } + set numericMode(f) { + if (f === this._numericMode) + return; + if (typeof f !== "string") + throw Error("Expected a string"); + this._numericMode = f; + if (f === "complex" || f === "machine") + this._precision = Math.floor(MACHINE_PRECISION); + if (this._latexSyntax && this.latexSyntax.options.precision > this._precision) + this.latexSyntax.updateOptions({ precision: this._precision }); + if (this.jsonSerializationOptions.precision > this._precision) + this.jsonSerializationOptions = { precision: this._precision }; + this.reset(); + } + /** @experimental */ + get timeLimit() { + var _a; + let scope = this.context; + while (scope) { + if (scope.timeLimit !== void 0) + return scope.timeLimit; + scope = (_a = scope.parentScope) != null ? _a : null; + } + return 2; + } + /** @experimental */ + get iterationLimit() { + var _a; + let scope = this.context; + while (scope) { + if (scope.iterationLimit !== void 0) + return scope.iterationLimit; + scope = (_a = scope.parentScope) != null ? _a : null; + } + return 1024; + } + /** @experimental */ + get recursionLimit() { + var _a; + let scope = this.context; + while (scope) { + if (scope.recursionLimit !== void 0) + return scope.recursionLimit; + scope = (_a = scope.parentScope) != null ? _a : null; + } + return 1024; + } + /** + * If an unknown symbol is encountered, assume it should + * be a variable in this domain. + * + * If set to `null`, unknown symbols will trigger an error. + * + * **Default:** `"ExtendedRealNumber"` + */ + get defaultDomain() { + return this._defaultDomain; + } + set defaultDomain(domain) { + if (domain === null) + this._defaultDomain = null; + else { + const defaultDomain = this.domain(domain); + if (!defaultDomain.isValid) + throw Error(`Invalid domain ${domain}`); + this._defaultDomain = defaultDomain; + } + } + /** + * Values smaller than the tolerance are considered to be zero for the + * purpose of comparison, i.e. if `|b - a| <= tolerance`, `b` is considered + * equal to `a`. + */ + get tolerance() { + return this._tolerance; + } + set tolerance(val) { + if (typeof val === "number" && Number.isFinite(val)) + this._tolerance = Math.max(val, 0); + else + this._tolerance = NUMERIC_TOLERANCE; + this._bignumTolerance = this.bignum(this._tolerance); + } + chop(n) { + if (typeof n === "number" && Math.abs(n) <= this._tolerance) + return 0; + if (n instanceof Decimal && n.abs().lte(this._bignumTolerance)) + return 0; + if (n instanceof import_complex20.Complex && Math.abs(n.re) <= this._tolerance && Math.abs(n.im) <= this._tolerance) + return 0; + return n; + } + bignum(a) { + if (typeof a === "bigint") + return new this._bignum(a.toString()); + return new this._bignum(a); + } + complex(a, b) { + if (a instanceof Decimal) + a = a.toNumber(); + if (b instanceof Decimal) + b = b.toNumber(); + return new import_complex20.Complex(a, b); + } + isBignum(a) { + return a instanceof Decimal; + } + isComplex(a) { + return a instanceof import_complex20.Complex; + } + get latexSyntax() { + if (!this._latexSyntax) + this._latexSyntax = new LatexSyntax({ + computeEngine: this, + dictionary: this._latexDictionary, + precision: this.precision, + avoidExponentsInRange: [-6, this.precision], + onError: (err) => { + throw new Error(JSON.stringify(err[0].message)); + } + }); + return this._latexSyntax; + } + static getLatexDictionary(domain = "all") { + return LatexSyntax.getDictionary(domain); + } + set costFunction(fn) { + if (typeof fn !== "function") + this._cost = DEFAULT_COST_FUNCTION; + this._cost = fn; + } + get costFunction() { + var _a; + return (_a = this._cost) != null ? _a : DEFAULT_COST_FUNCTION; + } + /** + * Return a matching symbol definition, starting with the current + * scope and going up the scope chain. Prioritize finding a match by + * wikidata, if provided. + */ + lookupSymbol(symbol2, wikidata, scope) { + var _a, _b, _c; + if (!this.strict) { + scope != null ? scope : scope = (_a = this.context) != null ? _a : void 0; + while (scope) { + const def = (_b = scope.idTable) == null ? void 0 : _b.get(symbol2); + if (isSymbolDefinition(def)) + return def; + scope = scope.parentScope; + } + return void 0; + } + if (typeof symbol2 !== "string") + throw Error("Expected a string"); + if (symbol2.length === 0 || !this.context) + return void 0; + const rootScope = scope != null ? scope : this.context; + if (wikidata) { + scope = rootScope; + while (scope) { + if (scope.idTable) + for (const [_, d] of scope.idTable) { + if (isSymbolDefinition(d) && d.wikidata === wikidata) + return d; + } + scope = scope.parentScope; + } + } + scope = rootScope; + while (scope) { + const def = (_c = scope.idTable) == null ? void 0 : _c.get(symbol2); + if (isSymbolDefinition(def)) + return def; + scope = scope.parentScope; + } + return void 0; + } + /** + * Return the definition for a function matching this head. + * + * Start looking in the current context, than up the scope chain. + * + * This is a very rough lookup, since it doesn't account for the domain + * of the argument or the codomain. However, it is useful during parsing + * to differentiate between symbols that might represent a function application, e.g. `f` vs `x`. + */ + lookupFunction(head2, scope) { + var _a; + if (typeof head2 !== "string") + return void 0; + if (!this.context) + return void 0; + scope != null ? scope : scope = this.context; + while (scope) { + const def = (_a = scope.idTable) == null ? void 0 : _a.get(head2); + if (isFunctionDefinition(def)) + return def; + scope = scope.parentScope; + } + return void 0; + } + /** + * Add (or replace) a definition for a symbol in the current scope. + */ + defineSymbol(name, def) { + if (!this.context) + throw Error("Symbol cannot be defined: no scope available"); + if (name.length === 0 || !isValidIdentifier(name)) + throw Error(`Invalid identifier "${name}": ${validateIdentifier(name)}}`); + if (!this.context.idTable) + this.context.idTable = /* @__PURE__ */ new Map(); + const boxedDef = new BoxedSymbolDefinitionImpl(this, name, def); + if (boxedDef.name) + this.context.idTable.set(boxedDef.name, boxedDef); + return boxedDef; + } + defineFunction(name, def) { + if (!this.context) + throw Error("Function cannot be defined: no scope available"); + if (name.length === 0 || !isValidIdentifier(name)) + throw Error(`Invalid identifier "${name}": ${validateIdentifier(name)}}`); + if (!this.context.idTable) + this.context.idTable = /* @__PURE__ */ new Map(); + const boxedDef = makeFunctionDefinition(this, name, def); + if (boxedDef.name) + this.context.idTable.set(name, boxedDef); + return boxedDef; + } + /** + * + * Create a new scope and add it to the top of the scope stack + * + * The `options.scope` property can be used to specify custom precision, + * etc... for this scope + * + */ + pushScope(ids, scope) { + if (this.context === null) + throw Error("No parent scope available"); + this.context = { + timeLimit: this.context.timeLimit, + memoryLimit: this.context.memoryLimit, + recursionLimit: this.context.recursionLimit, + iterationLimit: this.context.iterationLimit, + ...scope != null ? scope : {}, + parentScope: this.context, + // We always copy the current assumptions in the new scope. + // This make is much easier to deal with 'inherited' assumptions + // (and potentially modifying them later) without having to walk back + // into parent contexts. In other words, calling `ce.forget()` will + // forget everything **in the current scope**. When exiting the scope, + // the previous assumptions are restored. + assumptions: new ExpressionMap(this.context.assumptions) + }; + if (ids) { + if (Array.isArray(ids)) + for (const table of ids) + setCurrentContextSymbolTable(this, table); + else + setCurrentContextSymbolTable(this, ids); + } + } + /** Remove the topmost scope from the scope stack. + */ + popScope() { + var _a; + if (!this.context) + throw Error("No scope available"); + const parentScope = (_a = this.context) == null ? void 0 : _a.parentScope; + this.context = parentScope != null ? parentScope : null; + /* @__PURE__ */ console.assert(this.context !== null); + } + set(identifiers) { + if (!this.strict) { + for (const k of Object.keys(identifiers)) { + if (k !== "Nothing") { + const def = this.lookupSymbol(k); + const idk = identifiers[k]; + if (def) + def.value = idk != null ? idk : void 0; + else if (idk !== void 0 && idk !== null) { + const val = this.box(idk); + if (val.domain.isNumeric) + this.defineSymbol(k, { value: val, domain: "Number" }); + else + this.defineSymbol(k, { value: val }); + } + } + } + return; + } + for (const k of Object.keys(identifiers)) { + if (k !== "Nothing") { + const def = this.lookupSymbol(k); + const idk = identifiers[k]; + if (idk === void 0 || idk === null) { + if (def) + def.value = void 0; + } else { + const val = this.box(idk); + if (def) { + if (def.domain && !val.domain.isCompatible(def.domain)) + throw Error( + `Expected value with domain ${def.domain.toString()} for "${k}"` + ); + def.value = val; + } else { + if (val.domain.isNumeric) + this.defineSymbol(k, { value: val, domain: "Number" }); + else + this.defineSymbol(k, { value: val }); + } + } + } + } + } + let(identifiers) { + for (const k of Object.keys(identifiers)) { + if (k !== "Nothing") { + const def = identifiers[k]; + if (isSymbolDefinition(def)) + this.defineSymbol(k, def); + else if (isFunctionDefinition(def)) + this.defineFunction(k, def); + else + this.set({ [k]: identifiers[k] }); + } + } + } + get assumptions() { + if (!this.context) + throw Error("No scope available"); + if (this.context.assumptions) + return this.context.assumptions; + this.context.assumptions = new ExpressionMap(); + return this.context.assumptions; + } + /** + * Return false if the execution should stop. + * + * This can occur if: + * - an error has been signaled + * - the time limit or memory limit has been exceeded + * + * @internal + */ + shouldContinueExecution() { + return this.deadline === void 0 || this.deadline >= Date.now(); + } + /** @internal */ + checkContinueExecution() { + if (!this.shouldContinueExecution()) { + throw new Error("timeout"); + } + } + // assert( + // condition: boolean, + // expr: BoxedExpression, + // msg: string, + // code?: SignalMessage + // ) { + // if (!condition) this.signal(expr, msg, code); + // } + /** @internal */ + cache(cacheName, build, purge) { + var _a; + if (this._cache[cacheName] === void 0) { + try { + this._cache[cacheName] = { build, purge, value: build() }; + } catch (e) { + console.error( + `Fatal error building cache "${cacheName}": + ${e.toString()}` + ); + } + } + return (_a = this._cache[cacheName]) == null ? void 0 : _a.value; + } + box(expr, options) { + return box(this, expr, options); + } + canonical(xs) { + if (!xs.every((x) => x instanceof AbstractBoxedExpression)) + return xs.map((x) => this.box(x)); + const bxs = xs; + return bxs.every((x) => x.isCanonical) ? bxs : bxs.map((x) => x.canonical); + } + fn(head2, ops2, options) { + return boxFunction(this, head2, ops2, options != null ? options : { canonical: true }); + } + /** @internal */ + _fn(head2, ops2, metadata) { + return new BoxedFunction(this, head2, ops2, { + metadata, + canonical: true, + def: this.lookupFunction(head2, this.context) + }); + } + error(message, where) { + if (where instanceof AbstractBoxedExpression) { + where = this.rawJson(where); + } else if (where && Array.isArray(where) && where[0] === "Latex") { + if (where[1] === void 0 || !where[1]) + where = ""; + if (typeof where[1] === "object" && "str" in where[1] && !where[1].str) + where = ""; + } + let msg = void 0; + if (Array.isArray(message) && message[0] === "incompatible-domain") { + msg = new BoxedFunction(this, "ErrorCode", [ + this.string("incompatible-domain"), + boxDomain(this, message[1]), + boxDomain(this, message[2]) + ]); + } + if (typeof message === "string") + msg = this.string(message); + if (!msg && typeof message !== "string") + msg = new BoxedFunction(this, "ErrorCode", [ + this.string(message[0]), + ...message.slice(1).map((x) => { + if (typeof x === "string") + ; + /* @__PURE__ */ console.assert(typeof x !== "string"); + return this.box(x, { canonical: false }); + }) + ]); + if (!where) + return new BoxedFunction(this, "Error", [msg], { canonical: false }); + return new BoxedFunction( + this, + "Error", + [msg, this.box(where, { canonical: false })], + { canonical: false } + ); + } + hold(expr) { + return this._fn("Hold", [this.box(expr, { canonical: false })]); + } + add(ops2, metadata) { + const result = canonicalAdd(this, flattenOps(flattenSequence(ops2), "Add")); + if ((metadata == null ? void 0 : metadata.latex) !== void 0) + result.latex = metadata.latex; + if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) + result.wikidata = metadata.wikidata; + return result; + } + neg(expr, metadata) { + return canonicalNegate(expr, metadata); + } + mul(ops2, metadata) { + const result = canonicalMultiply( + this, + flattenOps(flattenSequence(ops2), " Multiply") + ); + if ((metadata == null ? void 0 : metadata.latex) !== void 0) + result.latex = metadata.latex; + if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) + result.wikidata = metadata.wikidata; + return result; + } + div(num, denom, metadata) { + const result = canonicalDivide(this, num, denom); + if ((metadata == null ? void 0 : metadata.latex) !== void 0) + result.latex = metadata.latex; + if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) + result.wikidata = metadata.wikidata; + return result; + } + sqrt(base, metadata) { + return canonicalPower(this, base, this._HALF, metadata); + } + pow(base, exponent, metadata) { + if (base.symbol === "ExponentialE" && exponent instanceof import_complex20.Complex && exponent.re === 0) { + const im = exponent.im; + return this.number(this.complex(Math.cos(im), Math.sin(im))); + } + if (exponent instanceof AbstractBoxedExpression) { + const num = exponent.numericValue; + if (num !== null) { + if (typeof num === "number") + exponent = num; + if (isRational(num)) + exponent = num; + } + } + let e = null; + if (typeof exponent === "number") + e = exponent; + else if (isRational(exponent)) { + if (isMachineRational(exponent) && exponent[1] === 1) + e = exponent[0]; + else if (isBigRational(exponent) && exponent[1] === BigInt(1)) + e = Number(exponent[0]); + } + if (e === 1) + return base; + const r = base.numericValue; + if (e === -1 && r !== null) { + if (typeof r === "number" && Number.isInteger(r)) + return this.number([1, r]); + else if (r instanceof Decimal && r.isInteger()) + return this.number([BigInt(1), bigint(r)]); + else if (isRational(r)) + return this.number([r[1], r[0]]); + } + if (typeof exponent === "number" || isRational(exponent)) + exponent = this.number(exponent); + return canonicalPower(this, base, exponent, metadata); + } + inv(expr, metadata) { + if (expr.isOne) + return this._ONE; + if (expr.isNegativeOne) + return this._NEGATIVE_ONE; + if (expr.isInfinity) + return this._ZERO; + const n = expr.numericValue; + if (n !== null) { + if (isRational(n)) + return this.number(inverse(n), { metadata }); + if (typeof n === "number" && Number.isInteger(n)) + return this.number([1, n], { metadata }); + if (n instanceof Decimal && n.isInteger()) + return this.number([BigInt(1), bigint(n)], { metadata }); + return this._fn("Divide", [this._ONE, expr], metadata); + } + if (expr.head === "Sqrt") + return this._fn("Sqrt", [this.inv(expr.op1)], metadata); + if (expr.head === "Divide") + return this._fn("Divide", [expr[1], expr[0]], metadata); + let e = this._NEGATIVE_ONE; + if (expr.head === "Power") { + if (expr.op2.isNegativeOne) + return expr.op1; + e = canonicalNegate(expr.op2); + expr = expr.op1; + } + if (e.isNegativeOne) + return this._fn("Divide", [this._ONE, expr], metadata); + return this._fn("Power", [expr, e], metadata); + } + pair(first, second, metadata) { + return new BoxedFunction(this, "Tuple", [first, second], { + metadata, + canonical: true + }); + } + tuple(elements, metadata) { + return new BoxedFunction(this, "Tuple", canonical(elements), { + metadata, + canonical: true + }); + } + string(s, metadata) { + return new BoxedString(this, s, metadata); + } + symbol(name, options) { + var _a, _b, _c; + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + name = name.normalize(); + if (name === "NaN") + return this._NAN; + if (name === "Infinity") + return this._POSITIVE_INFINITY; + if (name === "+Infinity") + return this._POSITIVE_INFINITY; + if (name === "-Infinity") + return this._NEGATIVE_INFINITY; + if (name === "Half") + return this._HALF; + if (this.strict && !isValidIdentifier(name)) { + const where = (_a = options == null ? void 0 : options.metadata) == null ? void 0 : _a.latex; + const nameStr = `'${name}'`; + return this.error( + ["invalid-identifier", { str: validateIdentifier(name) }], + where ? ["Latex", `'${where}'`] : nameStr + ); + } + if (((_b = options == null ? void 0 : options.metadata) == null ? void 0 : _b.latex) !== void 0 && !options.canonical) + return new BoxedSymbol(this, name, options); + const result = this._commonSymbols[name]; + if (result) { + if (!((_c = options == null ? void 0 : options.metadata) == null ? void 0 : _c.wikidata) || !result.wikidata || result.wikidata === options.metadata.wikidata) + return result; + if (options.canonical) + return makeCanonicalSymbol(this, name); + return new BoxedSymbol(this, name, options); + } + if (options.canonical) + return makeCanonicalSymbol(this, name); + return new BoxedSymbol(this, name, options); + } + domain(domain, metadata) { + if (domain instanceof _BoxedDomain) + return domain; + if (domain instanceof AbstractBoxedExpression && domain.symbol) + domain = domain.symbol; + if (typeof domain === "string") { + const expr = this._commonDomains[domain]; + if (expr) + return expr; + } + return boxDomain(this, domain, metadata); + } + /* + * This function tries to avoid creating a boxed number if `num` corresponds + * to a common value for which we have a shared instance (-1, 0, NaN, etc...) + */ + number(value, options) { + var _a, _b; + options = options ? { ...options } : {}; + if (!("canonical" in options)) + options.canonical = true; + if (options.metadata === void 0) { + if (typeof value === "bigint") { + if (value === BigInt(1)) + return this._ONE; + if (value === BigInt(0)) + return this._ZERO; + if (value === BigInt(-1)) + return this._NEGATIVE_ONE; + } + if (typeof value === "number") { + const n = value; + if (n === 1) + return this._ONE; + if (n === 0) + return this._ZERO; + if (n === -1) + return this._NEGATIVE_ONE; + if (Number.isInteger(n) && this._commonNumbers[n] !== void 0) { + if (this._commonNumbers[n] === null) + this._commonNumbers[n] = (_a = boxNumber(this, value)) != null ? _a : this._NAN; + return this._commonNumbers[n]; + } + if (Number.isNaN(n)) + return this._NAN; + if (!Number.isFinite(n)) + return n < 0 ? this._NEGATIVE_INFINITY : this._POSITIVE_INFINITY; + } + } + if (typeof value === "bigint") + value = this.bignum(value); + return (_b = boxNumber(this, value, options)) != null ? _b : this._NAN; + } + rules(rules) { + return boxRules(this, rules); + } + pattern(expr) { + return new BoxedPattern(this, expr); + } + parse(latex, options) { + var _a; + if (typeof latex !== "string") + return null; + const result = this.latexSyntax.parse((_a = latexString(latex)) != null ? _a : latex); + return this.box(result, options); + } + serialize(x, options) { + if (typeof x === "object" && "json" in x) { + const ce = "engine" in x ? x.engine : this; + return this.latexSyntax.serialize( + this.rawJson(ce.box(x, { canonical: false })), + options + ); + } + return this.latexSyntax.serialize(x, options); + } + get latexOptions() { + const latexSyntax = this.latexSyntax; + return new Proxy( + { + ...this.latexSyntax.options, + ...this.latexSyntax.serializer.options + }, + { + set(options, prop, value) { + if (!(prop in options)) + return false; + latexSyntax.updateOptions({ [prop]: value }); + return true; + } + } + ); + } + set latexOptions(opts) { + this.latexSyntax.updateOptions(opts); + } + get jsonSerializationOptions() { + if (this._useRawJsonSerializationOptions) { + return new Proxy(this._rawJsonSerializationOptions, { + get(options, prop) { + if (!(prop in options)) + return void 0; + return options[prop]; + } + }); + } + const self = this; + return new Proxy(this._jsonSerializationOptions, { + get(options, prop) { + if (!(prop in options)) + return void 0; + return options[prop]; + }, + set(options, prop, value) { + if (!(prop in options)) + return false; + self.jsonSerializationOptions = { [prop]: value }; + return true; + } + }); + } + set jsonSerializationOptions(val) { + if (val.exclude) + this._jsonSerializationOptions.exclude = [...val.exclude]; + if (val.shorthands) { + if (val.shorthands === "all" || val.shorthands.includes("all")) { + this._jsonSerializationOptions.shorthands = [ + "function", + "symbol", + "string", + "dictionary", + "number" + ]; + } else + this._jsonSerializationOptions.shorthands = [...val.shorthands]; + } + if (val.metadata) { + if (val.metadata === "all" || val.metadata.includes("all")) { + this._jsonSerializationOptions.metadata = ["latex", "wikidata"]; + } else + this._jsonSerializationOptions.metadata = [...val.metadata]; + } + if (typeof val.precision === "number" && val.precision > 0) { + this._jsonSerializationOptions.precision = val.precision; + } + if (typeof val.repeatingDecimals === "boolean") { + this._jsonSerializationOptions.repeatingDecimals = val.repeatingDecimals; + } + } + rawJson(expr) { + const save = this._useRawJsonSerializationOptions; + this._useRawJsonSerializationOptions = true; + const result = expr.json; + this._useRawJsonSerializationOptions = save; + return result; + } + /** + * Return a list of all the assumptions that match a pattern. + * + * ```js + * ce.assume(x, 'PositiveInteger'); + * ce.ask(['Greater', 'x', '_val']) + * // -> [{'val': 0}] + * ``` + */ + ask(pattern) { + const pat = this.pattern(pattern); + const result = []; + for (const [assumption, val] of this.assumptions) { + const m = pat.match(assumption, { + numericTolerance: this._tolerance + }); + if (m !== null && val === true) + result.push(m); + } + return result; + } + // Based on contextual usage, infer domain of a symbol + infer(symbol2, _domain) { + if (typeof symbol2 !== "string") { + if (!symbol2.symbol) + return "internal-error"; + symbol2 = symbol2.symbol; + } + return "ok"; + } + assume(arg1, arg2) { + try { + const latex = latexString(arg1); + const predicate = latex ? this.parse(latex, { canonical: false }) : this.box(arg1, { canonical: false }); + if (!arg2) + return assume(predicate); + if (isDomain(arg2)) + return assume(this.box(["Element", predicate, this.domain(arg2)])); + return assume(this.box(["Equal", predicate, arg2])); + } catch (e) { + console.error(e); + return "internal-error"; + } + } + forget(symbol2) { + var _a, _b; + if (!this.context) + throw Error("No scope available"); + if (symbol2 === void 0) { + if (this.context.idTable) + for (const k of this.context.idTable.keys()) + this.forget(k); + this.assumptions.clear(); + return; + } + if (Array.isArray(symbol2)) { + for (const x of symbol2) + this.forget(x); + return; + } + if (typeof symbol2 === "string") { + if (this.context.idTable) { + const def = this.context.idTable.get(symbol2); + if (isSymbolDefinition(def)) { + def.value = void 0; + if ((_a = def.domain) == null ? void 0 : _a.isNumeric) { + def.domain = (_b = this.defaultDomain) != null ? _b : this.domain("Number"); + } else + def.domain = void 0; + } + } + for (const [assumption, _val] of this.assumptions) { + if (assumption.symbols.includes(symbol2)) + this.assumptions.delete(assumption); + } + } + } +}; +globalThis[Symbol.for("io.cortexjs.compute-engine")] = { + ComputeEngine: ComputeEngine.prototype.constructor, + version: "0.15.0" +}; + +// src/editor.ts +var CALCULATE_TRIGGER_SYMBOL = " ="; +var CalctexHintRenderer = class { + constructor(view) { + this.decorations = this.buildDecorations(view); + } + update(update) { + this.decorations = this.buildDecorations(update.view); + } + destroy() { + } + buildDecorations(view) { + const builder = new import_state.RangeSetBuilder(); + for (let { from, to } of view.visibleRanges) { + let cursorPos = view.state.selection.main.from; + let mathBegin = null; + (0, import_language.syntaxTree)(view.state).iterate({ + from, + to, + enter(node) { + let nodeTags = node.type.name.split("_"); + if (nodeTags.contains("formatting-math-begin")) + mathBegin = node.to; + if (nodeTags.contains("formatting-math-end") && mathBegin != null) { + let mathEnd = node.from; + if (cursorPos < mathBegin || mathEnd < cursorPos) + return; + let formula = view.state.sliceDoc(mathBegin, mathEnd); + if (!formula.trim().endsWith(CALCULATE_TRIGGER_SYMBOL)) + return; + let formulaLength = formula.replace("\n", "").length; + let insertIndex = mathBegin + formulaLength; + const calculationEngine = new ComputeEngine(); + calculationEngine.latexOptions = { + multiply: "*", + groupSeparator: "'" + }; + let formattedFormula = formula.trim().slice(0, -CALCULATE_TRIGGER_SYMBOL.length).trim(); + let result = calculationEngine.parse(formattedFormula).evaluate().latex; + let resultString = ` ${result}`; + if (result.toLowerCase().contains("error")) + resultString = ` \u26A1`; + builder.add( + insertIndex, + insertIndex, + import_view2.Decoration.replace({ + widget: new ResultWidget(view, insertIndex, resultString) + }) + ); + } + } + }); + } + return builder.finish(); + } +}; +var pluginSpec = { + decorations: (value) => value.decorations +}; +var calctexHintRenderer = import_view2.ViewPlugin.fromClass( + CalctexHintRenderer, + pluginSpec +); + +// src/main.ts +var CalctexPlugin = class extends import_obsidian.Plugin { + async onload() { + this.registerEditorExtension([calctexHintRenderer]); + } + onunload() { + } +}; +/*! Bundled license information: + +@cortex-js/compute-engine/dist/compute-engine.min.esm.js: + (*! Bundled license information: + + complex.js/complex.js: + (** + * @license Complex.js v2.1.1 12/05/2020 + * + * Copyright (c) 2020, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + **) + + decimal.js/decimal.mjs: + (*! + * decimal.js v10.4.3 + * An arbitrary-precision Decimal type for JavaScript. + * https://github.com/MikeMcl/decimal.js + * Copyright (c) 2022 Michael Mclaughlin + * MIT Licence + *) + *) +*/ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2VkaXRvci50cyIsICJzcmMvd2lkZ2V0LnRzIiwgIm5vZGVfbW9kdWxlcy9AY29ydGV4LWpzL2NvbXB1dGUtZW5naW5lL2Rpc3QvY29tcHV0ZS1lbmdpbmUubWluLmVzbS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgY2FsY3RleEhpbnRSZW5kZXJlciB9IGZyb20gJy4vZWRpdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FsY3RleFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdGFzeW5jIG9ubG9hZCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKFtjYWxjdGV4SGludFJlbmRlcmVyXSk7XG5cdH1cblxuXHRvbnVubG9hZCgpIHt9XG59IiwgIi8vQHRzLWlnbm9yZVxyXG5pbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XHJcbmltcG9ydCB7IFJhbmdlU2V0QnVpbGRlciB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xyXG5pbXBvcnQge1xyXG4gIERlY29yYXRpb24sXHJcbiAgRGVjb3JhdGlvblNldCxcclxuICBFZGl0b3JWaWV3LFxyXG4gIFBsdWdpblNwZWMsXHJcbiAgUGx1Z2luVmFsdWUsXHJcbiAgVmlld1BsdWdpbixcclxuICBWaWV3VXBkYXRlXHJcbn0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcclxuaW1wb3J0IHsgUmVzdWx0V2lkZ2V0IH0gZnJvbSBcInNyYy93aWRnZXRcIjtcclxuaW1wb3J0IHsgQ29tcHV0ZUVuZ2luZSB9IGZyb20gJ0Bjb3J0ZXgtanMvY29tcHV0ZS1lbmdpbmUnO1xyXG5cclxuY29uc3QgQ0FMQ1VMQVRFX1RSSUdHRVJfU1lNQk9MID0gXCIgPVwiO1xyXG5cclxuY2xhc3MgQ2FsY3RleEhpbnRSZW5kZXJlciBpbXBsZW1lbnRzIFBsdWdpblZhbHVlIHtcclxuICBkZWNvcmF0aW9uczogRGVjb3JhdGlvblNldDtcclxuXHJcbiAgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldykge1xyXG4gICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh2aWV3KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcclxuICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjb3JhdGlvbnModXBkYXRlLnZpZXcpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpIHt9XHJcblxyXG4gIGJ1aWxkRGVjb3JhdGlvbnModmlldzogRWRpdG9yVmlldyk6IERlY29yYXRpb25TZXQge1xyXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcclxuXHJcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XHJcbiAgICAgIGxldCBjdXJzb3JQb3MgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmZyb207XHJcbiAgICAgIGxldCBtYXRoQmVnaW46IG51bWJlcnxudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIHN5bnRheFRyZWUodmlldy5zdGF0ZSkuaXRlcmF0ZSh7XHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICB0byxcclxuICAgICAgICBlbnRlcihub2RlOiBhbnkpIHtcclxuICAgICAgICAgIGxldCBub2RlVGFncyA9IG5vZGUudHlwZS5uYW1lLnNwbGl0KFwiX1wiKVxyXG5cclxuICAgICAgICAgIGlmIChub2RlVGFncy5jb250YWlucyhcImZvcm1hdHRpbmctbWF0aC1iZWdpblwiKSlcclxuICAgICAgICAgICAgbWF0aEJlZ2luID0gbm9kZS50bztcclxuICAgICAgICAgIGlmIChub2RlVGFncy5jb250YWlucyhcImZvcm1hdHRpbmctbWF0aC1lbmRcIikgJiYgbWF0aEJlZ2luICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IG1hdGhFbmQgPSBub2RlLmZyb207XHJcbiAgICAgICAgICAgIGlmIChjdXJzb3JQb3MgPCBtYXRoQmVnaW4gfHwgbWF0aEVuZCA8IGN1cnNvclBvcykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZvcm11bGEgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKG1hdGhCZWdpbiwgbWF0aEVuZCk7XHJcbiAgICAgICAgICAgIGlmICghZm9ybXVsYS50cmltKCkuZW5kc1dpdGgoQ0FMQ1VMQVRFX1RSSUdHRVJfU1lNQk9MKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgLy8gQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgZm9ybXVsYSB3aXRob3V0IG5ld2xpbmVzXHJcbiAgICAgICAgICAgIGxldCBmb3JtdWxhTGVuZ3RoID0gZm9ybXVsYS5yZXBsYWNlKFwiXFxuXCIsIFwiXCIpLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IGluc2VydEluZGV4ID0gbWF0aEJlZ2luICsgZm9ybXVsYUxlbmd0aDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0aW9uRW5naW5lID0gbmV3IENvbXB1dGVFbmdpbmUoKTtcclxuICAgICAgICAgICAgY2FsY3VsYXRpb25FbmdpbmUubGF0ZXhPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgIG11bHRpcGx5OiBcIipcIixcclxuICAgICAgICAgICAgICBncm91cFNlcGFyYXRvcjogXCInXCIsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkRm9ybXVsYSA9IGZvcm11bGEudHJpbSgpLnNsaWNlKDAsIC1DQUxDVUxBVEVfVFJJR0dFUl9TWU1CT0wubGVuZ3RoKS50cmltKCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBjYWxjdWxhdGlvbkVuZ2luZS5wYXJzZShmb3JtYXR0ZWRGb3JtdWxhKS5ldmFsdWF0ZSgpLmxhdGV4O1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdFN0cmluZyA9IGAgJHtyZXN1bHR9YDtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKFwiZXJyb3JcIikpIHJlc3VsdFN0cmluZyA9IGAgXHUyNkExYDtcclxuXHJcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkKFxyXG4gICAgICAgICAgICAgIGluc2VydEluZGV4LFxyXG4gICAgICAgICAgICAgIGluc2VydEluZGV4LFxyXG4gICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBSZXN1bHRXaWRnZXQodmlldywgaW5zZXJ0SW5kZXgsIHJlc3VsdFN0cmluZyksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBsdWdpblNwZWM6IFBsdWdpblNwZWM8Q2FsY3RleEhpbnRSZW5kZXJlcj4gPSB7XHJcbiAgZGVjb3JhdGlvbnM6ICh2YWx1ZTogQ2FsY3RleEhpbnRSZW5kZXJlcikgPT4gdmFsdWUuZGVjb3JhdGlvbnMsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY2FsY3RleEhpbnRSZW5kZXJlciA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKFxyXG4gIENhbGN0ZXhIaW50UmVuZGVyZXIsXHJcbiAgcGx1Z2luU3BlY1xyXG4pOyIsICJpbXBvcnQgeyBFZGl0b3JWaWV3LCBXaWRnZXRUeXBlIH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXN1bHRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlldzogRWRpdG9yVmlldywgcHVibGljIGluZGV4OiBudW1iZXIsIHB1YmxpYyB0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICB0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICBkaXYuY2xhc3NOYW1lID0gXCJyZXN1bHQtdGV4dFwiO1xyXG5cclxuICAgIGRpdi5pbm5lclRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICBkaXYub25jbGljayA9ICgpID0+IHtcclxuICAgICAgLy8gSW5zZXJ0IHRoZSByZXN1bHQgaW50byB0aGUgZWRpdG9yXHJcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdmlldy5zdGF0ZS51cGRhdGUoe1xyXG4gICAgICAgIGNoYW5nZXM6IHtcclxuICAgICAgICAgIGZyb206IHRoaXMuaW5kZXgsXHJcbiAgICAgICAgICB0bzogdGhpcy5pbmRleCxcclxuICAgICAgICAgIGluc2VydDogdGhpcy50ZXh0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICB2aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGRpdjtcclxuICB9XHJcbn0iLCAiLyoqIENvcnRleEpTIENvbXB1dGUgRW5naW5lIDAuMTUuMCAqL1xudmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QyKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUoKSB7XG4gIHJldHVybiBtb2QyIHx8ICgwLCBjYltfX2dldE93blByb3BOYW1lcyhjYilbMF1dKSgobW9kMiA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kMiksIG1vZDIuZXhwb3J0cztcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0VTTSA9IChtb2QyLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QyICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kMikpIDoge30sIF9fY29weVByb3BzKFxuICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNXG4gIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtXG4gIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuIFwiX19lc01vZHVsZVwiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldFxuICAvLyBcImRlZmF1bHRcIiB0byB0aGUgQ29tbW9uSlMgXCJtb2R1bGUuZXhwb3J0c1wiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuXG4gIGlzTm9kZU1vZGUgfHwgIW1vZDIgfHwgIW1vZDIuX19lc01vZHVsZSA/IF9fZGVmUHJvcCh0YXJnZXQsIFwiZGVmYXVsdFwiLCB7IHZhbHVlOiBtb2QyLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0LFxuICBtb2QyXG4pKTtcblxuLy8gbm9kZV9tb2R1bGVzL2NvbXBsZXguanMvY29tcGxleC5qc1xudmFyIHJlcXVpcmVfY29tcGxleCA9IF9fY29tbW9uSlMoe1xuICBcIm5vZGVfbW9kdWxlcy9jb21wbGV4LmpzL2NvbXBsZXguanNcIihleHBvcnRzLCBtb2R1bGUpIHtcbiAgICAoZnVuY3Rpb24ocm9vdCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgICB2YXIgY29zaDIgPSBNYXRoLmNvc2ggfHwgZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoeCkgPCAxZS05ID8gMSAtIHggOiAoTWF0aC5leHAoeCkgKyBNYXRoLmV4cCgteCkpICogMC41O1xuICAgICAgfTtcbiAgICAgIHZhciBzaW5oMiA9IE1hdGguc2luaCB8fCBmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh4KSA8IDFlLTkgPyB4IDogKE1hdGguZXhwKHgpIC0gTWF0aC5leHAoLXgpKSAqIDAuNTtcbiAgICAgIH07XG4gICAgICB2YXIgY29zbTEgPSBmdW5jdGlvbih4KSB7XG4gICAgICAgIHZhciBiID0gTWF0aC5QSSAvIDQ7XG4gICAgICAgIGlmICgtYiA+IHggfHwgeCA+IGIpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5jb3MoeCkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4eCA9IHggKiB4O1xuICAgICAgICByZXR1cm4geHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggLyAyMDkyMjc4OTg4OGUzIC0gMSAvIDg3MTc4MjkxMjAwKSArIDEgLyA0NzkwMDE2MDApIC0gMSAvIDM2Mjg4MDApICsgMSAvIDQwMzIwKSAtIDEgLyA3MjApICsgMSAvIDI0KSAtIDEgLyAyKTtcbiAgICAgIH07XG4gICAgICB2YXIgaHlwb3QyID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB2YXIgYSA9IE1hdGguYWJzKHgpO1xuICAgICAgICB2YXIgYiA9IE1hdGguYWJzKHkpO1xuICAgICAgICBpZiAoYSA8IDNlMyAmJiBiIDwgM2UzKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICBhID0gYjtcbiAgICAgICAgICBiID0geCAvIHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYiA9IHkgLyB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhICogTWF0aC5zcXJ0KDEgKyBiICogYik7XG4gICAgICB9O1xuICAgICAgdmFyIHBhcnNlcl9leGl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IFN5bnRheEVycm9yKFwiSW52YWxpZCBQYXJhbVwiKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBsb2dIeXBvdChhLCBiKSB7XG4gICAgICAgIHZhciBfYSA9IE1hdGguYWJzKGEpO1xuICAgICAgICB2YXIgX2IgPSBNYXRoLmFicyhiKTtcbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5sb2coX2IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGgubG9nKF9hKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2EgPCAzZTMgJiYgX2IgPCAzZTMpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5sb2coYSAqIGEgKyBiICogYikgKiAwLjU7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEgLyAyO1xuICAgICAgICBiID0gYiAvIDI7XG4gICAgICAgIHJldHVybiAwLjUgKiBNYXRoLmxvZyhhICogYSArIGIgKiBiKSArIE1hdGguTE4yO1xuICAgICAgfVxuICAgICAgdmFyIHBhcnNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgICAgICB2YXIgeiA9IHsgXCJyZVwiOiAwLCBcImltXCI6IDAgfTtcbiAgICAgICAgaWYgKGEgPT09IHZvaWQgMCB8fCBhID09PSBudWxsKSB7XG4gICAgICAgICAgeltcInJlXCJdID0geltcImltXCJdID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChiICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB6W1wicmVcIl0gPSBhO1xuICAgICAgICAgIHpbXCJpbVwiXSA9IGI7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGEpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgaWYgKFwiaW1cIiBpbiBhICYmIFwicmVcIiBpbiBhKSB7XG4gICAgICAgICAgICAgICAgeltcInJlXCJdID0gYVtcInJlXCJdO1xuICAgICAgICAgICAgICAgIHpbXCJpbVwiXSA9IGFbXCJpbVwiXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImFic1wiIGluIGEgJiYgXCJhcmdcIiBpbiBhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYVtcImFic1wiXSkgJiYgTnVtYmVyLmlzRmluaXRlKGFbXCJhcmdcIl0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbXCJhYnNcIl0gKiBNYXRoLmNvcyhhW1wiYXJnXCJdKTtcbiAgICAgICAgICAgICAgICB6W1wiaW1cIl0gPSBhW1wiYWJzXCJdICogTWF0aC5zaW4oYVtcImFyZ1wiXSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJyXCIgaW4gYSAmJiBcInBoaVwiIGluIGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhW1wiclwiXSkgJiYgTnVtYmVyLmlzRmluaXRlKGFbXCJwaGlcIl0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbXCJyXCJdICogTWF0aC5jb3MoYVtcInBoaVwiXSk7XG4gICAgICAgICAgICAgICAgeltcImltXCJdID0gYVtcInJcIl0gKiBNYXRoLnNpbihhW1wicGhpXCJdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbMF07XG4gICAgICAgICAgICAgICAgeltcImltXCJdID0gYVsxXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZXJfZXhpdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB6W1wiaW1cIl0gPSAvKiB2b2lkICovXG4gICAgICAgICAgICAgIHpbXCJyZVwiXSA9IDA7XG4gICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBhLm1hdGNoKC9cXGQrXFwuP1xcZCplWystXT9cXGQrfFxcZCtcXC4/XFxkKnxcXC5cXGQrfC4vZyk7XG4gICAgICAgICAgICAgIHZhciBwbHVzID0gMTtcbiAgICAgICAgICAgICAgdmFyIG1pbnVzID0gMDtcbiAgICAgICAgICAgICAgaWYgKHRva2VucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCIgXCIgfHwgYyA9PT0gXCJcdFwiIHx8IGMgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IFwiK1wiKSB7XG4gICAgICAgICAgICAgICAgICBwbHVzKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSBcIi1cIikge1xuICAgICAgICAgICAgICAgICAgbWludXMrKztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IFwiaVwiIHx8IGMgPT09IFwiSVwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGx1cyArIG1pbnVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW2kgKyAxXSAhPT0gXCIgXCIgJiYgIWlzTmFOKHRva2Vuc1tpICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgdG9rZW5zW2kgKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcGx1cyA9IG1pbnVzID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKHBsdXMgKyBtaW51cyA9PT0gMCB8fCBpc05hTihjKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZXJfZXhpdCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tpICsgMV0gPT09IFwiaVwiIHx8IHRva2Vuc1tpICsgMV0gPT09IFwiSVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgYyk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJyZVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgYyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBwbHVzID0gbWludXMgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocGx1cyArIG1pbnVzID4gMCkge1xuICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgIHpbXCJpbVwiXSA9IDA7XG4gICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcGFyc2VyX2V4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTih6W1wicmVcIl0pIHx8IGlzTmFOKHpbXCJpbVwiXSkpIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gejtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBDb21wbGV4MjAoYSwgYikge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29tcGxleDIwKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKGEsIGIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB6ID0gcGFyc2UoYSwgYik7XG4gICAgICAgIHRoaXNbXCJyZVwiXSA9IHpbXCJyZVwiXTtcbiAgICAgICAgdGhpc1tcImltXCJdID0geltcImltXCJdO1xuICAgICAgfVxuICAgICAgQ29tcGxleDIwLnByb3RvdHlwZSA9IHtcbiAgICAgICAgXCJyZVwiOiAwLFxuICAgICAgICBcImltXCI6IDAsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBzaWduIG9mIGEgY29tcGxleCBudW1iZXIsIHdoaWNoIGlzIGEgbm9ybWFsaXplZCBjb21wbGV4XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzaWduXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhYnMyID0gdGhpc1tcImFic1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdIC8gYWJzMixcbiAgICAgICAgICAgIHRoaXNbXCJpbVwiXSAvIGFiczJcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhZGRcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdICsgeltcInJlXCJdLFxuICAgICAgICAgICAgdGhpc1tcImltXCJdICsgeltcImltXCJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YnRyYWN0cyB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzdWJcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdIC0geltcInJlXCJdLFxuICAgICAgICAgICAgdGhpc1tcImltXCJdIC0geltcImltXCJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE11bHRpcGxpZXMgdHdvIGNvbXBsZXggbnVtYmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwibXVsXCI6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICB2YXIgeiA9IG5ldyBDb21wbGV4MjAoYSwgYik7XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkgJiYgeltcImlzWmVyb1wiXSgpIHx8IHRoaXNbXCJpc1plcm9cIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh6W1wiaW1cIl0gPT09IDAgJiYgdGhpc1tcImltXCJdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCh0aGlzW1wicmVcIl0gKiB6W1wicmVcIl0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIHRoaXNbXCJyZVwiXSAqIHpbXCJyZVwiXSAtIHRoaXNbXCJpbVwiXSAqIHpbXCJpbVwiXSxcbiAgICAgICAgICAgIHRoaXNbXCJyZVwiXSAqIHpbXCJpbVwiXSArIHRoaXNbXCJpbVwiXSAqIHpbXCJyZVwiXVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXZpZGVzIHR3byBjb21wbGV4IG51bWJlcnNcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImRpdlwiOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgdmFyIHogPSBuZXcgQ29tcGxleDIwKGEsIGIpO1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkgJiYgeltcImlzWmVyb1wiXSgpIHx8IHRoaXNbXCJpc0luZmluaXRlXCJdKCkgJiYgeltcImlzSW5maW5pdGVcIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIk5BTlwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkgfHwgeltcImlzWmVyb1wiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkgfHwgeltcImlzSW5maW5pdGVcIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIlpFUk9cIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgYyA9IHpbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgZCA9IHpbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgdCwgeDtcbiAgICAgICAgICBpZiAoMCA9PT0gZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoYSAvIGMsIGIgLyBjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGMpIDwgTWF0aC5hYnMoZCkpIHtcbiAgICAgICAgICAgIHggPSBjIC8gZDtcbiAgICAgICAgICAgIHQgPSBjICogeCArIGQ7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgKGEgKiB4ICsgYikgLyB0LFxuICAgICAgICAgICAgICAoYiAqIHggLSBhKSAvIHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHggPSBkIC8gYztcbiAgICAgICAgICAgIHQgPSBkICogeCArIGM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgKGEgKyBiICogeCkgLyB0LFxuICAgICAgICAgICAgICAoYiAtIGEgKiB4KSAvIHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBwb3dlciBvZiB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJwb3dcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKHpbXCJpc1plcm9cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIk9ORVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHpbXCJpbVwiXSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDAgJiYgYSA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5wb3coYSwgeltcInJlXCJdKSwgMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAgICAgc3dpdGNoICgoeltcInJlXCJdICUgNCArIDQpICUgNCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKE1hdGgucG93KGIsIHpbXCJyZVwiXSksIDApO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIE1hdGgucG93KGIsIHpbXCJyZVwiXSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKC1NYXRoLnBvdyhiLCB6W1wicmVcIl0pLCAwKTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgwLCAtTWF0aC5wb3coYiwgeltcInJlXCJdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgYiA9PT0gMCAmJiB6W1wicmVcIl0gPiAwICYmIHpbXCJpbVwiXSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiWkVST1wiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGFyZyA9IE1hdGguYXRhbjIoYiwgYSk7XG4gICAgICAgICAgdmFyIGxvaCA9IGxvZ0h5cG90KGEsIGIpO1xuICAgICAgICAgIGEgPSBNYXRoLmV4cCh6W1wicmVcIl0gKiBsb2ggLSB6W1wiaW1cIl0gKiBhcmcpO1xuICAgICAgICAgIGIgPSB6W1wiaW1cIl0gKiBsb2ggKyB6W1wicmVcIl0gKiBhcmc7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhICogTWF0aC5jb3MoYiksXG4gICAgICAgICAgICBhICogTWF0aC5zaW4oYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IHNxdWFyZSByb290XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzcXJ0XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciByID0gdGhpc1tcImFic1wiXSgpO1xuICAgICAgICAgIHZhciByZSwgaW07XG4gICAgICAgICAgaWYgKGEgPj0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5zcXJ0KGEpLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlID0gMC41ICogTWF0aC5zcXJ0KDIgKiAociArIGEpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmUgPSBNYXRoLmFicyhiKSAvIE1hdGguc3FydCgyICogKHIgLSBhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhIDw9IDApIHtcbiAgICAgICAgICAgIGltID0gMC41ICogTWF0aC5zcXJ0KDIgKiAociAtIGEpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW0gPSBNYXRoLmFicyhiKSAvIE1hdGguc3FydCgyICogKHIgKyBhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHJlLCBiIDwgMCA/IC1pbSA6IGltKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBleHBvbmVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiZXhwXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0bXAgPSBNYXRoLmV4cCh0aGlzW1wicmVcIl0pO1xuICAgICAgICAgIGlmICh0aGlzW1wiaW1cIl0gPT09IDApIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0bXAgKiBNYXRoLmNvcyh0aGlzW1wiaW1cIl0pLFxuICAgICAgICAgICAgdG1wICogTWF0aC5zaW4odGhpc1tcImltXCJdKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggZXhwb25lbnQgYW5kIHN1YnRyYWN0cyBvbmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBgQ29tcGxleCh4KS5leHAoKS5zdWIoMSlgIGlmXG4gICAgICAgICAqIGB4YCBpcyBzbWFsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImV4cG0xXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5leHBtMShhKSAqIE1hdGguY29zKGIpICsgY29zbTEoYiksXG4gICAgICAgICAgICBNYXRoLmV4cChhKSAqIE1hdGguc2luKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgbmF0dXJhbCBsb2dcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImxvZ1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYiA9PT0gMCAmJiBhID4gMCkge1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGxvZ0h5cG90KGEsIGIpLFxuICAgICAgICAgICAgTWF0aC5hdGFuMihiLCBhKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIFwiYWJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBoeXBvdDIodGhpc1tcInJlXCJdLCB0aGlzW1wiaW1cIl0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBhbmdsZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXJnXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXNbXCJpbVwiXSwgdGhpc1tcInJlXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInNpblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIE1hdGguc2luKGEpICogY29zaDIoYiksXG4gICAgICAgICAgICBNYXRoLmNvcyhhKSAqIHNpbmgyKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjb3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLmNvcyhhKSAqIGNvc2gyKGIpLFxuICAgICAgICAgICAgLU1hdGguc2luKGEpICogc2luaDIoYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSB0YW5nZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJ0YW5cIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IE1hdGguY29zKGEpICsgY29zaDIoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLnNpbihhKSAvIGQsXG4gICAgICAgICAgICBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb3RhbmdlbnRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImNvdFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IDIgKiB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSAyICogdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gTWF0aC5jb3MoYSkgLSBjb3NoMihiKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIC1NYXRoLnNpbihhKSAvIGQsXG4gICAgICAgICAgICBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzZWNhbnRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInNlY1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IDAuNSAqIGNvc2gyKDIgKiBiKSArIDAuNSAqIE1hdGguY29zKDIgKiBhKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIE1hdGguY29zKGEpICogY29zaDIoYikgLyBkLFxuICAgICAgICAgICAgTWF0aC5zaW4oYSkgKiBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NlY2Fuc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY3NjXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gMC41ICogY29zaDIoMiAqIGIpIC0gMC41ICogTWF0aC5jb3MoMiAqIGEpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5zaW4oYSkgKiBjb3NoMihiKSAvIGQsXG4gICAgICAgICAgICAtTWF0aC5jb3MoYSkgKiBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFyY3VzIHNpbnVzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2luXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciB0MSA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBiICogYiAtIGEgKiBhICsgMSxcbiAgICAgICAgICAgIC0yICogYSAqIGJcbiAgICAgICAgICApW1wic3FydFwiXSgpO1xuICAgICAgICAgIHZhciB0MiA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0MVtcInJlXCJdIC0gYixcbiAgICAgICAgICAgIHQxW1wiaW1cIl0gKyBhXG4gICAgICAgICAgKVtcImxvZ1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHQyW1wiaW1cIl0sIC10MltcInJlXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBhcmN1cyBjb3NpbnVzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY29zXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciB0MSA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBiICogYiAtIGEgKiBhICsgMSxcbiAgICAgICAgICAgIC0yICogYSAqIGJcbiAgICAgICAgICApW1wic3FydFwiXSgpO1xuICAgICAgICAgIHZhciB0MiA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0MVtcInJlXCJdIC0gYixcbiAgICAgICAgICAgIHQxW1wiaW1cIl0gKyBhXG4gICAgICAgICAgKVtcImxvZ1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKE1hdGguUEkgLyAyIC0gdDJbXCJpbVwiXSwgdDJbXCJyZVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgdGFuZ2VudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXRhblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoMCwgSW5maW5pdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIC1JbmZpbml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBkID0gYSAqIGEgKyAoMSAtIGIpICogKDEgLSBiKTtcbiAgICAgICAgICB2YXIgdDEgPSBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgKDEgLSBiICogYiAtIGEgKiBhKSAvIGQsXG4gICAgICAgICAgICAtMiAqIGEgLyBkXG4gICAgICAgICAgKS5sb2coKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgtMC41ICogdDFbXCJpbVwiXSwgMC41ICogdDFbXCJyZVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgY290YW5nZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY290XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChNYXRoLmF0YW4yKDEsIGEpLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hdGFuKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hdGFuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgc2VjYW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2VjXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChhID09PSAwICYmIGIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIEluZmluaXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hY29zKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hY29zKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgY29zZWNhbnNcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjc2NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgYiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5QSSAvIDIsIEluZmluaXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hc2luKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hc2luKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggc2luaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwic2luaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIHNpbmgyKGEpICogTWF0aC5jb3MoYiksXG4gICAgICAgICAgICBjb3NoMihhKSAqIE1hdGguc2luKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBjb3NoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjb3NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgY29zaDIoYSkgKiBNYXRoLmNvcyhiKSxcbiAgICAgICAgICAgIHNpbmgyKGEpICogTWF0aC5zaW4oYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IHRhbmhcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInRhbmhcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGNvc2gyKGEpICsgTWF0aC5jb3MoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBzaW5oMihhKSAvIGQsXG4gICAgICAgICAgICBNYXRoLnNpbihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGNvdGhcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImNvdGhcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGNvc2gyKGEpIC0gTWF0aC5jb3MoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBzaW5oMihhKSAvIGQsXG4gICAgICAgICAgICAtTWF0aC5zaW4oYikgLyBkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBjb3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjc2NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gTWF0aC5jb3MoMiAqIGIpIC0gY29zaDIoMiAqIGEpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgLTIgKiBzaW5oMihhKSAqIE1hdGguY29zKGIpIC8gZCxcbiAgICAgICAgICAgIDIgKiBjb3NoMihhKSAqIE1hdGguc2luKGIpIC8gZFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggc2VjaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwic2VjaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IE1hdGguY29zKDIgKiBiKSArIGNvc2gyKDIgKiBhKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIDIgKiBjb3NoMihhKSAqIE1hdGguY29zKGIpIC8gZCxcbiAgICAgICAgICAgIC0yICogc2luaDIoYSkgKiBNYXRoLnNpbihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFzaW5oXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2luaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdG1wID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHRoaXNbXCJpbVwiXSA9IC10aGlzW1wicmVcIl07XG4gICAgICAgICAgdGhpc1tcInJlXCJdID0gdG1wO1xuICAgICAgICAgIHZhciByZXMgPSB0aGlzW1wiYXNpblwiXSgpO1xuICAgICAgICAgIHRoaXNbXCJyZVwiXSA9IC10aGlzW1wiaW1cIl07XG4gICAgICAgICAgdGhpc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIHRtcCA9IHJlc1tcInJlXCJdO1xuICAgICAgICAgIHJlc1tcInJlXCJdID0gLXJlc1tcImltXCJdO1xuICAgICAgICAgIHJlc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYWNvc2hcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjb3NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciByZXMgPSB0aGlzW1wiYWNvc1wiXSgpO1xuICAgICAgICAgIGlmIChyZXNbXCJpbVwiXSA8PSAwKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gcmVzW1wicmVcIl07XG4gICAgICAgICAgICByZXNbXCJyZVwiXSA9IC1yZXNbXCJpbVwiXTtcbiAgICAgICAgICAgIHJlc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gcmVzW1wiaW1cIl07XG4gICAgICAgICAgICByZXNbXCJpbVwiXSA9IC1yZXNbXCJyZVwiXTtcbiAgICAgICAgICAgIHJlc1tcInJlXCJdID0gdG1wO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGF0YW5oXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhdGFuaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgbm9JTSA9IGEgPiAxICYmIGIgPT09IDA7XG4gICAgICAgICAgdmFyIG9uZU1pbnVzID0gMSAtIGE7XG4gICAgICAgICAgdmFyIG9uZVBsdXMgPSAxICsgYTtcbiAgICAgICAgICB2YXIgZCA9IG9uZU1pbnVzICogb25lTWludXMgKyBiICogYjtcbiAgICAgICAgICB2YXIgeCA9IGQgIT09IDAgPyBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgKG9uZVBsdXMgKiBvbmVNaW51cyAtIGIgKiBiKSAvIGQsXG4gICAgICAgICAgICAoYiAqIG9uZU1pbnVzICsgb25lUGx1cyAqIGIpIC8gZFxuICAgICAgICAgICkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gLTEgPyBhIC8gMCA6IDAsXG4gICAgICAgICAgICBiICE9PSAwID8gYiAvIDAgOiAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgdGVtcCA9IHhbXCJyZVwiXTtcbiAgICAgICAgICB4W1wicmVcIl0gPSBsb2dIeXBvdCh4W1wicmVcIl0sIHhbXCJpbVwiXSkgLyAyO1xuICAgICAgICAgIHhbXCJpbVwiXSA9IE1hdGguYXRhbjIoeFtcImltXCJdLCB0ZW1wKSAvIDI7XG4gICAgICAgICAgaWYgKG5vSU0pIHtcbiAgICAgICAgICAgIHhbXCJpbVwiXSA9IC14W1wiaW1cIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFjb3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY290aFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgwLCBNYXRoLlBJIC8gMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBkID0gYSAqIGEgKyBiICogYjtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gMCA/IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhIC8gZCxcbiAgICAgICAgICAgIC1iIC8gZFxuICAgICAgICAgICkuYXRhbmgoKSA6IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhICE9PSAwID8gYSAvIDAgOiAwLFxuICAgICAgICAgICAgYiAhPT0gMCA/IC1iIC8gMCA6IDBcbiAgICAgICAgICApLmF0YW5oKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYWNzY2hcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjc2NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgYSAhPT0gMCA/IE1hdGgubG9nKGEgKyBNYXRoLnNxcnQoYSAqIGEgKyAxKSkgOiBJbmZpbml0eSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hc2luaCgpIDogbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgIT09IDAgPyBhIC8gMCA6IDAsXG4gICAgICAgICAgICBiICE9PSAwID8gLWIgLyAwIDogMFxuICAgICAgICAgICkuYXNpbmgoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBhc2VjaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXNlY2hcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc1plcm9cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIklORklOSVRZXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZCA9IGEgKiBhICsgYiAqIGI7XG4gICAgICAgICAgcmV0dXJuIGQgIT09IDAgPyBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAvIGQsXG4gICAgICAgICAgICAtYiAvIGRcbiAgICAgICAgICApLmFjb3NoKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hY29zaCgpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGludmVyc2UgMS96XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpbnZlcnNlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDb21wbGV4MjBbXCJJTkZJTklUWVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDb21wbGV4MjBbXCJaRVJPXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGEgKiBhICsgYiAqIGI7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoYSAvIGQsIC1iIC8gZCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY29uanVnYXRlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHRoaXNbXCJyZVwiXSwgLXRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBuZWdhdGVkIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJuZWdcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoLXRoaXNbXCJyZVwiXSwgLXRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDZWlscyB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjZWlsXCI6IGZ1bmN0aW9uKHBsYWNlcykge1xuICAgICAgICAgIHBsYWNlcyA9IE1hdGgucG93KDEwLCBwbGFjZXMgfHwgMCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLmNlaWwodGhpc1tcInJlXCJdICogcGxhY2VzKSAvIHBsYWNlcyxcbiAgICAgICAgICAgIE1hdGguY2VpbCh0aGlzW1wiaW1cIl0gKiBwbGFjZXMpIC8gcGxhY2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsb29ycyB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJmbG9vclwiOiBmdW5jdGlvbihwbGFjZXMpIHtcbiAgICAgICAgICBwbGFjZXMgPSBNYXRoLnBvdygxMCwgcGxhY2VzIHx8IDApO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzW1wicmVcIl0gKiBwbGFjZXMpIC8gcGxhY2VzLFxuICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzW1wiaW1cIl0gKiBwbGFjZXMpIC8gcGxhY2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENlaWxzIHRoZSBhY3R1YWwgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInJvdW5kXCI6IGZ1bmN0aW9uKHBsYWNlcykge1xuICAgICAgICAgIHBsYWNlcyA9IE1hdGgucG93KDEwLCBwbGFjZXMgfHwgMCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXNbXCJyZVwiXSAqIHBsYWNlcykgLyBwbGFjZXMsXG4gICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXNbXCJpbVwiXSAqIHBsYWNlcykgLyBwbGFjZXNcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcGFyZXMgdHdvIGNvbXBsZXggbnVtYmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogbmV3IENvbXBsZXgoSW5maW5pdHkpLmVxdWFscyhJbmZpbml0eSkgPT09IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJlcXVhbHNcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoeltcInJlXCJdIC0gdGhpc1tcInJlXCJdKSA8PSBDb21wbGV4MjBbXCJFUFNJTE9OXCJdICYmIE1hdGguYWJzKHpbXCJpbVwiXSAtIHRoaXNbXCJpbVwiXSkgPD0gQ29tcGxleDIwW1wiRVBTSUxPTlwiXTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsb25lcyB0aGUgYWN0dWFsIG9iamVjdFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY2xvbmVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAodGhpc1tcInJlXCJdLCB0aGlzW1wiaW1cIl0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHN0cmluZyBvZiB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBcInRvU3RyaW5nXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciByZXQgPSBcIlwiO1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNOYU5cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTmFOXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzW1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJbmZpbml0eVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTWF0aC5hYnMoYSkgPCBDb21wbGV4MjBbXCJFUFNJTE9OXCJdKSB7XG4gICAgICAgICAgICBhID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGIpIDwgQ29tcGxleDIwW1wiRVBTSUxPTlwiXSkge1xuICAgICAgICAgICAgYiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0ICsgYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEgIT09IDApIHtcbiAgICAgICAgICAgIHJldCArPSBhO1xuICAgICAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICAgICAgaWYgKGIgPCAwKSB7XG4gICAgICAgICAgICAgIGIgPSAtYjtcbiAgICAgICAgICAgICAgcmV0ICs9IFwiLVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0ICs9IFwiK1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYiA8IDApIHtcbiAgICAgICAgICAgIGIgPSAtYjtcbiAgICAgICAgICAgIHJldCArPSBcIi1cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDEgIT09IGIpIHtcbiAgICAgICAgICAgIHJldCArPSBiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0ICsgXCJpXCI7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIGFzIGEgdmVjdG9yXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIFwidG9WZWN0b3JcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzW1wicmVcIl0sIHRoaXNbXCJpbVwiXV07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcmVhbCB2YWx1ZSBvZiB0aGUgY3VycmVudCBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcnxudWxsfVxuICAgICAgICAgKi9cbiAgICAgICAgXCJ2YWx1ZU9mXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzW1wiaW1cIl0gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW1wicmVcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29tcGxleCBudW1iZXIgaXMgbm90IG9uIHRoZSBSaWVtYW5uIHNwaGVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBcImlzTmFOXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBpc05hTih0aGlzW1wicmVcIl0pIHx8IGlzTmFOKHRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgY29tcGxleCBudW1iZXIgaXMgYXQgdGhlIHplcm8gcG9sZSBvZiB0aGVcbiAgICAgICAgICogUmllbWFubiBzcGhlcmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpc1plcm9cIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbXCJpbVwiXSA9PT0gMCAmJiB0aGlzW1wicmVcIl0gPT09IDA7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjb21wbGV4IG51bWJlciBpcyBub3QgYXQgdGhlIGluZmluaXR5IHBvbGUgb2YgdGhlXG4gICAgICAgICAqIFJpZW1hbm4gc3BoZXJlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIFwiaXNGaW5pdGVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRmluaXRlKHRoaXNbXCJyZVwiXSkgJiYgaXNGaW5pdGUodGhpc1tcImltXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBjb21wbGV4IG51bWJlciBpcyBhdCB0aGUgaW5maW5pdHkgcG9sZSBvZiB0aGVcbiAgICAgICAgICogUmllbWFubiBzcGhlcmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpc0luZmluaXRlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAhKHRoaXNbXCJpc05hTlwiXSgpIHx8IHRoaXNbXCJpc0Zpbml0ZVwiXSgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIENvbXBsZXgyMFtcIlpFUk9cIl0gPSBuZXcgQ29tcGxleDIwKDAsIDApO1xuICAgICAgQ29tcGxleDIwW1wiT05FXCJdID0gbmV3IENvbXBsZXgyMCgxLCAwKTtcbiAgICAgIENvbXBsZXgyMFtcIklcIl0gPSBuZXcgQ29tcGxleDIwKDAsIDEpO1xuICAgICAgQ29tcGxleDIwW1wiUElcIl0gPSBuZXcgQ29tcGxleDIwKE1hdGguUEksIDApO1xuICAgICAgQ29tcGxleDIwW1wiRVwiXSA9IG5ldyBDb21wbGV4MjAoTWF0aC5FLCAwKTtcbiAgICAgIENvbXBsZXgyMFtcIklORklOSVRZXCJdID0gbmV3IENvbXBsZXgyMChJbmZpbml0eSwgSW5maW5pdHkpO1xuICAgICAgQ29tcGxleDIwW1wiTkFOXCJdID0gbmV3IENvbXBsZXgyMChOYU4sIE5hTik7XG4gICAgICBDb21wbGV4MjBbXCJFUFNJTE9OXCJdID0gMWUtMTU7XG4gICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZVtcImFtZFwiXSkge1xuICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBDb21wbGV4MjA7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcGxleDIwLCBcIl9fZXNNb2R1bGVcIiwgeyBcInZhbHVlXCI6IHRydWUgfSk7XG4gICAgICAgIENvbXBsZXgyMFtcImRlZmF1bHRcIl0gPSBDb21wbGV4MjA7XG4gICAgICAgIENvbXBsZXgyMFtcIkNvbXBsZXhcIl0gPSBDb21wbGV4MjA7XG4gICAgICAgIG1vZHVsZVtcImV4cG9ydHNcIl0gPSBDb21wbGV4MjA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290W1wiQ29tcGxleFwiXSA9IENvbXBsZXgyMDtcbiAgICAgIH1cbiAgICB9KShleHBvcnRzKTtcbiAgfVxufSk7XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvcHVibGljLnRzXG5mdW5jdGlvbiBpc0V4cHJlc3Npb25FbnRyeShlbnRyeSkge1xuICByZXR1cm4gIShcImtpbmRcIiBpbiBlbnRyeSkgfHwgZW50cnkua2luZCA9PT0gXCJleHByZXNzaW9uXCI7XG59XG5mdW5jdGlvbiBpc1N5bWJvbEVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcInN5bWJvbFwiO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc01hdGNoZml4RW50cnkoZW50cnkpIHtcbiAgcmV0dXJuIFwia2luZFwiIGluIGVudHJ5ICYmIGVudHJ5LmtpbmQgPT09IFwibWF0Y2hmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzSW5maXhFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJpbmZpeFwiO1xufVxuZnVuY3Rpb24gaXNQcmVmaXhFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJwcmVmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzUG9zdGZpeEVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcInBvc3RmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzRW52aXJvbm1lbnRFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJlbnZpcm9ubWVudFwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvZGVjaW1hbC5qcy9kZWNpbWFsLm1qc1xudmFyIEVYUF9MSU1JVCA9IDllMTU7XG52YXIgTUFYX0RJR0lUUyA9IDFlOTtcbnZhciBOVU1FUkFMUyA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xudmFyIExOMTAgPSBcIjIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNDg4NjI4NzcyOTc2MDMzMzI3OTAwOTY3NTcyNjA5Njc3MzUyNDgwMjM1OTk3MjA1MDg5NTk4Mjk4MzQxOTY3Nzg0MDQyMjg2MjQ4NjMzNDA5NTI1NDY1MDgyODA2NzU2NjY2Mjg3MzY5MDk4NzgxNjg5NDgyOTA3MjA4MzI1NTU0NjgwODQzNzk5ODk0ODI2MjMzMTk4NTI4MzkzNTA1MzA4OTY1Mzc3NzMyNjI4ODQ2MTYzMzY2MjIyMjg3Njk4MjE5ODg2NzQ2NTQzNjY3NDc0NDA0MjQzMjc0MzY1MTU1MDQ4OTM0MzE0OTM5MzkxNDc5NjE5NDA0NDAwMjIyMTA1MTAxNzE0MTc0ODAwMzY4ODA4NDAxMjY0NzA4MDY4NTU2Nzc0MzIxNjIyODM1NTIyMDExNDgwNDY2MzcxNTY1OTEyMTM3MzQ1MDc0Nzg1Njk0NzY4MzQ2MzYxNjc5MjEwMTgwNjQ0NTA3MDY0ODAwMDI3NzUwMjY4NDkxNjc0NjU1MDU4Njg1NjkzNTY3MzQyMDY3MDU4MTEzNjQyOTIyNDU1NDQwNTc1ODkyNTcyNDIwODI0MTMxNDY5NTY4OTAxNjc1ODk0MDI1Njc3NjMxMTM1NjkxOTI5MjAzMzM3NjU4NzE0MTY2MDIzMDEwNTcwMzA4OTYzNDU3MjA3NTQ0MDM3MDg0NzQ2OTk0MDE2ODI2OTI4MjgwODQ4MTE4NDI4OTMxNDg0ODUyNDk0ODY0NDg3MTkyNzgwOTY3NjI3MTI3NTc3NTM5NzAyNzY2ODYwNTk1MjQ5NjcxNjY3NDE4MzQ4NTcwNDQyMjUwNzE5Nzk2NTAwNDcxNDk1MTA1MDQ5MjIxNDc3NjU2NzYzNjkzODY2Mjk3Njk3OTUyMjExMDcxODI2NDU0OTczNDc3MjY2MjQyNTcwOTQyOTMyMjU4Mjc5ODUwMjU4NTUwOTc4NTI2NTM4MzIwNzYwNjcyNjMxNzE2NDMwOTUwNTk5NTA4NzgwNzUyMzcxMDMzMzEwMTE5Nzg1NzU0NzMzMTU0MTQyMTgwODQyNzU0Mzg2MzU5MTc3ODExNzA1NDMwOTgyNzQ4MjM4NTA0NTY0ODAxOTA5NTYxMDI5OTI5MTgyNDMxODIzNzUyNTM1NzcwOTc1MDUzOTU2NTE4NzY5NzUxMDM3NDk3MDg4ODY5MjE4MDIwNTE4OTMzOTUwNzIzODUzOTIwNTE0NDYzNDE5NzI2NTI4NzI4Njk2NTExMDg2MjU3MTQ5MjE5ODg0OTk3ODc0ODg3Mzc3MTM0NTY4NjIwOTE2NzA1OFwiO1xudmFyIFBJID0gXCIzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDU5MjMwNzgxNjQwNjI4NjIwODk5ODYyODAzNDgyNTM0MjExNzA2Nzk4MjE0ODA4NjUxMzI4MjMwNjY0NzA5Mzg0NDYwOTU1MDU4MjIzMTcyNTM1OTQwODEyODQ4MTExNzQ1MDI4NDEwMjcwMTkzODUyMTEwNTU1OTY0NDYyMjk0ODk1NDkzMDM4MTk2NDQyODgxMDk3NTY2NTkzMzQ0NjEyODQ3NTY0ODIzMzc4Njc4MzE2NTI3MTIwMTkwOTE0NTY0ODU2NjkyMzQ2MDM0ODYxMDQ1NDMyNjY0ODIxMzM5MzYwNzI2MDI0OTE0MTI3MzcyNDU4NzAwNjYwNjMxNTU4ODE3NDg4MTUyMDkyMDk2MjgyOTI1NDA5MTcxNTM2NDM2Nzg5MjU5MDM2MDAxMTMzMDUzMDU0ODgyMDQ2NjUyMTM4NDE0Njk1MTk0MTUxMTYwOTQzMzA1NzI3MDM2NTc1OTU5MTk1MzA5MjE4NjExNzM4MTkzMjYxMTc5MzEwNTExODU0ODA3NDQ2MjM3OTk2Mjc0OTU2NzM1MTg4NTc1MjcyNDg5MTIyNzkzODE4MzAxMTk0OTEyOTgzMzY3MzM2MjQ0MDY1NjY0MzA4NjAyMTM5NDk0NjM5NTIyNDczNzE5MDcwMjE3OTg2MDk0MzcwMjc3MDUzOTIxNzE3NjI5MzE3Njc1MjM4NDY3NDgxODQ2NzY2OTQwNTEzMjAwMDU2ODEyNzE0NTI2MzU2MDgyNzc4NTc3MTM0Mjc1Nzc4OTYwOTE3MzYzNzE3ODcyMTQ2ODQ0MDkwMTIyNDk1MzQzMDE0NjU0OTU4NTM3MTA1MDc5MjI3OTY4OTI1ODkyMzU0MjAxOTk1NjExMjEyOTAyMTk2MDg2NDAzNDQxODE1OTgxMzYyOTc3NDc3MTMwOTk2MDUxODcwNzIxMTM0OTk5OTk5ODM3Mjk3ODA0OTk1MTA1OTczMTczMjgxNjA5NjMxODU5NTAyNDQ1OTQ1NTM0NjkwODMwMjY0MjUyMjMwODI1MzM0NDY4NTAzNTI2MTkzMTE4ODE3MTAxMDAwMzEzNzgzODc1Mjg4NjU4NzUzMzIwODM4MTQyMDYxNzE3NzY2OTE0NzMwMzU5ODI1MzQ5MDQyODc1NTQ2ODczMTE1OTU2Mjg2Mzg4MjM1Mzc4NzU5Mzc1MTk1Nzc4MTg1Nzc4MDUzMjE3MTIyNjgwNjYxMzAwMTkyNzg3NjYxMTE5NTkwOTIxNjQyMDE5ODkzODA5NTI1NzIwMTA2NTQ4NTg2MzI3ODlcIjtcbnZhciBERUZBVUxUUyA9IHtcbiAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgd2l0aGluIHRoZSBzdGF0ZWQgcmFuZ2VzIChpbmNsdXNpdmUpLlxuICAvLyBNb3N0IG9mIHRoZXNlIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSB1c2luZyB0aGUgYERlY2ltYWwuY29uZmlnYCBtZXRob2QuXG4gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgb2YgdGhlIHJlc3VsdCBvZiBhIGNhbGN1bGF0aW9uIG9yIGJhc2UgY29udmVyc2lvbi5cbiAgLy8gRS5nLiBgRGVjaW1hbC5jb25maWcoeyBwcmVjaXNpb246IDIwIH0pO2BcbiAgcHJlY2lzaW9uOiAyMCxcbiAgLy8gMSB0byBNQVhfRElHSVRTXG4gIC8vIFRoZSByb3VuZGluZyBtb2RlIHVzZWQgd2hlbiByb3VuZGluZyB0byBgcHJlY2lzaW9uYC5cbiAgLy9cbiAgLy8gUk9VTkRfVVAgICAgICAgICAwIEF3YXkgZnJvbSB6ZXJvLlxuICAvLyBST1VORF9ET1dOICAgICAgIDEgVG93YXJkcyB6ZXJvLlxuICAvLyBST1VORF9DRUlMICAgICAgIDIgVG93YXJkcyArSW5maW5pdHkuXG4gIC8vIFJPVU5EX0ZMT09SICAgICAgMyBUb3dhcmRzIC1JbmZpbml0eS5cbiAgLy8gUk9VTkRfSEFMRl9VUCAgICA0IFRvd2FyZHMgbmVhcmVzdCBuZWlnaGJvdXIuIElmIGVxdWlkaXN0YW50LCB1cC5cbiAgLy8gUk9VTkRfSEFMRl9ET1dOICA1IFRvd2FyZHMgbmVhcmVzdCBuZWlnaGJvdXIuIElmIGVxdWlkaXN0YW50LCBkb3duLlxuICAvLyBST1VORF9IQUxGX0VWRU4gIDYgVG93YXJkcyBuZWFyZXN0IG5laWdoYm91ci4gSWYgZXF1aWRpc3RhbnQsIHRvd2FyZHMgZXZlbiBuZWlnaGJvdXIuXG4gIC8vIFJPVU5EX0hBTEZfQ0VJTCAgNyBUb3dhcmRzIG5lYXJlc3QgbmVpZ2hib3VyLiBJZiBlcXVpZGlzdGFudCwgdG93YXJkcyArSW5maW5pdHkuXG4gIC8vIFJPVU5EX0hBTEZfRkxPT1IgOCBUb3dhcmRzIG5lYXJlc3QgbmVpZ2hib3VyLiBJZiBlcXVpZGlzdGFudCwgdG93YXJkcyAtSW5maW5pdHkuXG4gIC8vXG4gIC8vIEUuZy5cbiAgLy8gYERlY2ltYWwucm91bmRpbmcgPSA0O2BcbiAgLy8gYERlY2ltYWwucm91bmRpbmcgPSBEZWNpbWFsLlJPVU5EX0hBTEZfVVA7YFxuICByb3VuZGluZzogNCxcbiAgLy8gMCB0byA4XG4gIC8vIFRoZSBtb2R1bG8gbW9kZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIG1vZHVsdXM6IGEgbW9kIG4uXG4gIC8vIFRoZSBxdW90aWVudCAocSA9IGEgLyBuKSBpcyBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyByb3VuZGluZyBtb2RlLlxuICAvLyBUaGUgcmVtYWluZGVyIChyKSBpcyBjYWxjdWxhdGVkIGFzOiByID0gYSAtIG4gKiBxLlxuICAvL1xuICAvLyBVUCAgICAgICAgIDAgVGhlIHJlbWFpbmRlciBpcyBwb3NpdGl2ZSBpZiB0aGUgZGl2aWRlbmQgaXMgbmVnYXRpdmUsIGVsc2UgaXMgbmVnYXRpdmUuXG4gIC8vIERPV04gICAgICAgMSBUaGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkaXZpZGVuZCAoSmF2YVNjcmlwdCAlKS5cbiAgLy8gRkxPT1IgICAgICAzIFRoZSByZW1haW5kZXIgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRpdmlzb3IgKFB5dGhvbiAlKS5cbiAgLy8gSEFMRl9FVkVOICA2IFRoZSBJRUVFIDc1NCByZW1haW5kZXIgZnVuY3Rpb24uXG4gIC8vIEVVQ0xJRCAgICAgOSBFdWNsaWRpYW4gZGl2aXNpb24uIHEgPSBzaWduKG4pICogZmxvb3IoYSAvIGFicyhuKSkuIEFsd2F5cyBwb3NpdGl2ZS5cbiAgLy9cbiAgLy8gVHJ1bmNhdGVkIGRpdmlzaW9uICgxKSwgZmxvb3JlZCBkaXZpc2lvbiAoMyksIHRoZSBJRUVFIDc1NCByZW1haW5kZXIgKDYpLCBhbmQgRXVjbGlkaWFuXG4gIC8vIGRpdmlzaW9uICg5KSBhcmUgY29tbW9ubHkgdXNlZCBmb3IgdGhlIG1vZHVsdXMgb3BlcmF0aW9uLiBUaGUgb3RoZXIgcm91bmRpbmcgbW9kZXMgY2FuIGFsc29cbiAgLy8gYmUgdXNlZCwgYnV0IHRoZXkgbWF5IG5vdCBnaXZlIHVzZWZ1bCByZXN1bHRzLlxuICBtb2R1bG86IDEsXG4gIC8vIDAgdG8gOVxuICAvLyBUaGUgZXhwb25lbnQgdmFsdWUgYXQgYW5kIGJlbmVhdGggd2hpY2ggYHRvU3RyaW5nYCByZXR1cm5zIGV4cG9uZW50aWFsIG5vdGF0aW9uLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IC03XG4gIHRvRXhwTmVnOiAtNyxcbiAgLy8gMCB0byAtRVhQX0xJTUlUXG4gIC8vIFRoZSBleHBvbmVudCB2YWx1ZSBhdCBhbmQgYWJvdmUgd2hpY2ggYHRvU3RyaW5nYCByZXR1cm5zIGV4cG9uZW50aWFsIG5vdGF0aW9uLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IDIxXG4gIHRvRXhwUG9zOiAyMSxcbiAgLy8gMCB0byBFWFBfTElNSVRcbiAgLy8gVGhlIG1pbmltdW0gZXhwb25lbnQgdmFsdWUsIGJlbmVhdGggd2hpY2ggdW5kZXJmbG93IHRvIHplcm8gb2NjdXJzLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IC0zMjQgICg1ZS0zMjQpXG4gIG1pbkU6IC1FWFBfTElNSVQsXG4gIC8vIC0xIHRvIC1FWFBfTElNSVRcbiAgLy8gVGhlIG1heGltdW0gZXhwb25lbnQgdmFsdWUsIGFib3ZlIHdoaWNoIG92ZXJmbG93IHRvIEluZmluaXR5IG9jY3Vycy5cbiAgLy8gSmF2YVNjcmlwdCBudW1iZXJzOiAzMDggICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOClcbiAgbWF4RTogRVhQX0xJTUlULFxuICAvLyAxIHRvIEVYUF9MSU1JVFxuICAvLyBXaGV0aGVyIHRvIHVzZSBjcnlwdG9ncmFwaGljYWxseS1zZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLCBpZiBhdmFpbGFibGUuXG4gIGNyeXB0bzogZmFsc2VcbiAgLy8gdHJ1ZS9mYWxzZVxufTtcbnZhciBpbmV4YWN0O1xudmFyIHF1YWRyYW50O1xudmFyIGV4dGVybmFsID0gdHJ1ZTtcbnZhciBkZWNpbWFsRXJyb3IgPSBcIltEZWNpbWFsRXJyb3JdIFwiO1xudmFyIGludmFsaWRBcmd1bWVudCA9IGRlY2ltYWxFcnJvciArIFwiSW52YWxpZCBhcmd1bWVudDogXCI7XG52YXIgcHJlY2lzaW9uTGltaXRFeGNlZWRlZCA9IGRlY2ltYWxFcnJvciArIFwiUHJlY2lzaW9uIGxpbWl0IGV4Y2VlZGVkXCI7XG52YXIgY3J5cHRvVW5hdmFpbGFibGUgPSBkZWNpbWFsRXJyb3IgKyBcImNyeXB0byB1bmF2YWlsYWJsZVwiO1xudmFyIHRhZyA9IFwiW29iamVjdCBEZWNpbWFsXVwiO1xudmFyIG1hdGhmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbWF0aHBvdyA9IE1hdGgucG93O1xudmFyIGlzQmluYXJ5ID0gL14wYihbMDFdKyhcXC5bMDFdKik/fFxcLlswMV0rKShwWystXT9cXGQrKT8kL2k7XG52YXIgaXNIZXggPSAvXjB4KFswLTlhLWZdKyhcXC5bMC05YS1mXSopP3xcXC5bMC05YS1mXSspKHBbKy1dP1xcZCspPyQvaTtcbnZhciBpc09jdGFsID0gL14wbyhbMC03XSsoXFwuWzAtN10qKT98XFwuWzAtN10rKShwWystXT9cXGQrKT8kL2k7XG52YXIgaXNEZWNpbWFsID0gL14oXFxkKyhcXC5cXGQqKT98XFwuXFxkKykoZVsrLV0/XFxkKyk/JC9pO1xudmFyIEJBU0UgPSAxZTc7XG52YXIgTE9HX0JBU0UgPSA3O1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIExOMTBfUFJFQ0lTSU9OID0gTE4xMC5sZW5ndGggLSAxO1xudmFyIFBJX1BSRUNJU0lPTiA9IFBJLmxlbmd0aCAtIDE7XG52YXIgUCA9IHsgdG9TdHJpbmdUYWc6IHRhZyB9O1xuUC5hYnNvbHV0ZVZhbHVlID0gUC5hYnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgaWYgKHgucyA8IDApXG4gICAgeC5zID0gMTtcbiAgcmV0dXJuIGZpbmFsaXNlKHgpO1xufTtcblAuY2VpbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZmluYWxpc2UobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksIHRoaXMuZSArIDEsIDIpO1xufTtcblAuY2xhbXBlZFRvID0gUC5jbGFtcCA9IGZ1bmN0aW9uKG1pbjIsIG1heDIpIHtcbiAgdmFyIGssIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgbWluMiA9IG5ldyBDdG9yKG1pbjIpO1xuICBtYXgyID0gbmV3IEN0b3IobWF4Mik7XG4gIGlmICghbWluMi5zIHx8ICFtYXgyLnMpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmIChtaW4yLmd0KG1heDIpKVxuICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIG1heDIpO1xuICBrID0geC5jbXAobWluMik7XG4gIHJldHVybiBrIDwgMCA/IG1pbjIgOiB4LmNtcChtYXgyKSA+IDAgPyBtYXgyIDogbmV3IEN0b3IoeCk7XG59O1xuUC5jb21wYXJlZFRvID0gUC5jbXAgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBpLCBqLCB4ZEwsIHlkTCwgeCA9IHRoaXMsIHhkID0geC5kLCB5ZCA9ICh5ID0gbmV3IHguY29uc3RydWN0b3IoeSkpLmQsIHhzID0geC5zLCB5cyA9IHkucztcbiAgaWYgKCF4ZCB8fCAheWQpIHtcbiAgICByZXR1cm4gIXhzIHx8ICF5cyA/IE5hTiA6IHhzICE9PSB5cyA/IHhzIDogeGQgPT09IHlkID8gMCA6ICF4ZCBeIHhzIDwgMCA/IDEgOiAtMTtcbiAgfVxuICBpZiAoIXhkWzBdIHx8ICF5ZFswXSlcbiAgICByZXR1cm4geGRbMF0gPyB4cyA6IHlkWzBdID8gLXlzIDogMDtcbiAgaWYgKHhzICE9PSB5cylcbiAgICByZXR1cm4geHM7XG4gIGlmICh4LmUgIT09IHkuZSlcbiAgICByZXR1cm4geC5lID4geS5lIF4geHMgPCAwID8gMSA6IC0xO1xuICB4ZEwgPSB4ZC5sZW5ndGg7XG4gIHlkTCA9IHlkLmxlbmd0aDtcbiAgZm9yIChpID0gMCwgaiA9IHhkTCA8IHlkTCA/IHhkTCA6IHlkTDsgaSA8IGo7ICsraSkge1xuICAgIGlmICh4ZFtpXSAhPT0geWRbaV0pXG4gICAgICByZXR1cm4geGRbaV0gPiB5ZFtpXSBeIHhzIDwgMCA/IDEgOiAtMTtcbiAgfVxuICByZXR1cm4geGRMID09PSB5ZEwgPyAwIDogeGRMID4geWRMIF4geHMgPCAwID8gMSA6IC0xO1xufTtcblAuY29zaW5lID0gUC5jb3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICBpZiAoIXguZClcbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgaWYgKCF4LmRbMF0pXG4gICAgcmV0dXJuIG5ldyBDdG9yKDEpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyBMT0dfQkFTRTtcbiAgQ3Rvci5yb3VuZGluZyA9IDE7XG4gIHggPSBjb3NpbmUoQ3RvciwgdG9MZXNzVGhhbkhhbGZQaShDdG9yLCB4KSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGZpbmFsaXNlKHF1YWRyYW50ID09IDIgfHwgcXVhZHJhbnQgPT0gMyA/IHgubmVnKCkgOiB4LCBwciwgcm0sIHRydWUpO1xufTtcblAuY3ViZVJvb3QgPSBQLmNicnQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGUsIG0sIG4sIHIsIHJlcCwgcywgc2QsIHQsIHQzLCB0M3BsdXN4LCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBzID0geC5zICogbWF0aHBvdyh4LnMgKiB4LCAxIC8gMyk7XG4gIGlmICghcyB8fCBNYXRoLmFicyhzKSA9PSAxIC8gMCkge1xuICAgIG4gPSBkaWdpdHNUb1N0cmluZyh4LmQpO1xuICAgIGUgPSB4LmU7XG4gICAgaWYgKHMgPSAoZSAtIG4ubGVuZ3RoICsgMSkgJSAzKVxuICAgICAgbiArPSBzID09IDEgfHwgcyA9PSAtMiA/IFwiMFwiIDogXCIwMFwiO1xuICAgIHMgPSBtYXRocG93KG4sIDEgLyAzKTtcbiAgICBlID0gbWF0aGZsb29yKChlICsgMSkgLyAzKSAtIChlICUgMyA9PSAoZSA8IDAgPyAtMSA6IDIpKTtcbiAgICBpZiAocyA9PSAxIC8gMCkge1xuICAgICAgbiA9IFwiNWVcIiArIGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBzLnRvRXhwb25lbnRpYWwoKTtcbiAgICAgIG4gPSBuLnNsaWNlKDAsIG4uaW5kZXhPZihcImVcIikgKyAxKSArIGU7XG4gICAgfVxuICAgIHIgPSBuZXcgQ3RvcihuKTtcbiAgICByLnMgPSB4LnM7XG4gIH0gZWxzZSB7XG4gICAgciA9IG5ldyBDdG9yKHMudG9TdHJpbmcoKSk7XG4gIH1cbiAgc2QgPSAoZSA9IEN0b3IucHJlY2lzaW9uKSArIDM7XG4gIGZvciAoOyA7ICkge1xuICAgIHQgPSByO1xuICAgIHQzID0gdC50aW1lcyh0KS50aW1lcyh0KTtcbiAgICB0M3BsdXN4ID0gdDMucGx1cyh4KTtcbiAgICByID0gZGl2aWRlKHQzcGx1c3gucGx1cyh4KS50aW1lcyh0KSwgdDNwbHVzeC5wbHVzKHQzKSwgc2QgKyAyLCAxKTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCBzZCkgPT09IChuID0gZGlnaXRzVG9TdHJpbmcoci5kKSkuc2xpY2UoMCwgc2QpKSB7XG4gICAgICBuID0gbi5zbGljZShzZCAtIDMsIHNkICsgMSk7XG4gICAgICBpZiAobiA9PSBcIjk5OTlcIiB8fCAhcmVwICYmIG4gPT0gXCI0OTk5XCIpIHtcbiAgICAgICAgaWYgKCFyZXApIHtcbiAgICAgICAgICBmaW5hbGlzZSh0LCBlICsgMSwgMCk7XG4gICAgICAgICAgaWYgKHQudGltZXModCkudGltZXModCkuZXEoeCkpIHtcbiAgICAgICAgICAgIHIgPSB0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNkICs9IDQ7XG4gICAgICAgIHJlcCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIStuIHx8ICErbi5zbGljZSgxKSAmJiBuLmNoYXJBdCgwKSA9PSBcIjVcIikge1xuICAgICAgICAgIGZpbmFsaXNlKHIsIGUgKyAxLCAxKTtcbiAgICAgICAgICBtID0gIXIudGltZXMocikudGltZXMocikuZXEoeCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIGUsIEN0b3Iucm91bmRpbmcsIG0pO1xufTtcblAuZGVjaW1hbFBsYWNlcyA9IFAuZHAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHcsIGQgPSB0aGlzLmQsIG4gPSBOYU47XG4gIGlmIChkKSB7XG4gICAgdyA9IGQubGVuZ3RoIC0gMTtcbiAgICBuID0gKHcgLSBtYXRoZmxvb3IodGhpcy5lIC8gTE9HX0JBU0UpKSAqIExPR19CQVNFO1xuICAgIHcgPSBkW3ddO1xuICAgIGlmICh3KVxuICAgICAgZm9yICg7IHcgJSAxMCA9PSAwOyB3IC89IDEwKVxuICAgICAgICBuLS07XG4gICAgaWYgKG4gPCAwKVxuICAgICAgbiA9IDA7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuUC5kaXZpZGVkQnkgPSBQLmRpdiA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIGRpdmlkZSh0aGlzLCBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih5KSk7XG59O1xuUC5kaXZpZGVkVG9JbnRlZ2VyQnkgPSBQLmRpdlRvSW50ID0gZnVuY3Rpb24oeSkge1xuICB2YXIgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICByZXR1cm4gZmluYWxpc2UoZGl2aWRlKHgsIG5ldyBDdG9yKHkpLCAwLCAxLCAxKSwgQ3Rvci5wcmVjaXNpb24sIEN0b3Iucm91bmRpbmcpO1xufTtcblAuZXF1YWxzID0gUC5lcSA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpID09PSAwO1xufTtcblAuZmxvb3IgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLCB0aGlzLmUgKyAxLCAzKTtcbn07XG5QLmdyZWF0ZXJUaGFuID0gUC5ndCA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpID4gMDtcbn07XG5QLmdyZWF0ZXJUaGFuT3JFcXVhbFRvID0gUC5ndGUgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBrID0gdGhpcy5jbXAoeSk7XG4gIHJldHVybiBrID09IDEgfHwgayA9PT0gMDtcbn07XG5QLmh5cGVyYm9saWNDb3NpbmUgPSBQLmNvc2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGssIG4sIHByLCBybSwgbGVuLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIG9uZSA9IG5ldyBDdG9yKDEpO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5zID8gMSAvIDAgOiBOYU4pO1xuICBpZiAoeC5pc1plcm8oKSlcbiAgICByZXR1cm4gb25lO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgbGVuID0geC5kLmxlbmd0aDtcbiAgaWYgKGxlbiA8IDMyKSB7XG4gICAgayA9IE1hdGguY2VpbChsZW4gLyAzKTtcbiAgICBuID0gKDEgLyB0aW55UG93KDQsIGspKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIGsgPSAxNjtcbiAgICBuID0gXCIyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwXCI7XG4gIH1cbiAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAxLCB4LnRpbWVzKG4pLCBuZXcgQ3RvcigxKSwgdHJ1ZSk7XG4gIHZhciBjb3NoMl94LCBpID0gaywgZDggPSBuZXcgQ3Rvcig4KTtcbiAgZm9yICg7IGktLTsgKSB7XG4gICAgY29zaDJfeCA9IHgudGltZXMoeCk7XG4gICAgeCA9IG9uZS5taW51cyhjb3NoMl94LnRpbWVzKGQ4Lm1pbnVzKGNvc2gyX3gudGltZXMoZDgpKSkpO1xuICB9XG4gIHJldHVybiBmaW5hbGlzZSh4LCBDdG9yLnByZWNpc2lvbiA9IHByLCBDdG9yLnJvdW5kaW5nID0gcm0sIHRydWUpO1xufTtcblAuaHlwZXJib2xpY1NpbmUgPSBQLnNpbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGssIHByLCBybSwgbGVuLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgbGVuID0geC5kLmxlbmd0aDtcbiAgaWYgKGxlbiA8IDMpIHtcbiAgICB4ID0gdGF5bG9yU2VyaWVzKEN0b3IsIDIsIHgsIHgsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGsgPSAxLjQgKiBNYXRoLnNxcnQobGVuKTtcbiAgICBrID0gayA+IDE2ID8gMTYgOiBrIHwgMDtcbiAgICB4ID0geC50aW1lcygxIC8gdGlueVBvdyg1LCBrKSk7XG4gICAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAyLCB4LCB4LCB0cnVlKTtcbiAgICB2YXIgc2luaDJfeCwgZDUgPSBuZXcgQ3Rvcig1KSwgZDE2ID0gbmV3IEN0b3IoMTYpLCBkMjAgPSBuZXcgQ3RvcigyMCk7XG4gICAgZm9yICg7IGstLTsgKSB7XG4gICAgICBzaW5oMl94ID0geC50aW1lcyh4KTtcbiAgICAgIHggPSB4LnRpbWVzKGQ1LnBsdXMoc2luaDJfeC50aW1lcyhkMTYudGltZXMoc2luaDJfeCkucGx1cyhkMjApKSkpO1xuICAgIH1cbiAgfVxuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiBmaW5hbGlzZSh4LCBwciwgcm0sIHRydWUpO1xufTtcblAuaHlwZXJib2xpY1RhbmdlbnQgPSBQLnRhbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5zKTtcbiAgaWYgKHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyA3O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgcmV0dXJuIGRpdmlkZSh4LnNpbmgoKSwgeC5jb3NoKCksIEN0b3IucHJlY2lzaW9uID0gcHIsIEN0b3Iucm91bmRpbmcgPSBybSk7XG59O1xuUC5pbnZlcnNlQ29zaW5lID0gUC5hY29zID0gZnVuY3Rpb24oKSB7XG4gIHZhciBoYWxmUGksIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvciwgayA9IHguYWJzKCkuY21wKDEpLCBwciA9IEN0b3IucHJlY2lzaW9uLCBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmIChrICE9PSAtMSkge1xuICAgIHJldHVybiBrID09PSAwID8geC5pc05lZygpID8gZ2V0UGkoQ3RvciwgcHIsIHJtKSA6IG5ldyBDdG9yKDApIDogbmV3IEN0b3IoTmFOKTtcbiAgfVxuICBpZiAoeC5pc1plcm8oKSlcbiAgICByZXR1cm4gZ2V0UGkoQ3RvciwgcHIgKyA0LCBybSkudGltZXMoMC41KTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwciArIDY7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0geC5hc2luKCk7XG4gIGhhbGZQaSA9IGdldFBpKEN0b3IsIHByICsgNCwgcm0pLnRpbWVzKDAuNSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGhhbGZQaS5taW51cyh4KTtcbn07XG5QLmludmVyc2VIeXBlcmJvbGljQ29zaW5lID0gUC5hY29zaCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICh4Lmx0ZSgxKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5lcSgxKSA/IDAgOiBOYU4pO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeCk7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgQ3Rvci5wcmVjaXNpb24gPSBwciArIE1hdGgubWF4KE1hdGguYWJzKHguZSksIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgeCA9IHgudGltZXMoeCkubWludXMoMSkuc3FydCgpLnBsdXMoeCk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4geC5sbigpO1xufTtcblAuaW52ZXJzZUh5cGVyYm9saWNTaW5lID0gUC5hc2luaCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyAyICogTWF0aC5tYXgoTWF0aC5hYnMoeC5lKSwgeC5zZCgpKSArIDY7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICB4ID0geC50aW1lcyh4KS5wbHVzKDEpLnNxcnQoKS5wbHVzKHgpO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIHgubG4oKTtcbn07XG5QLmludmVyc2VIeXBlcmJvbGljVGFuZ2VudCA9IFAuYXRhbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgd3ByLCB4c2QsIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmUgPj0gMClcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5hYnMoKS5lcSgxKSA/IHgucyAvIDAgOiB4LmlzWmVybygpID8geCA6IE5hTik7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgeHNkID0geC5zZCgpO1xuICBpZiAoTWF0aC5tYXgoeHNkLCBwcikgPCAyICogLXguZSAtIDEpXG4gICAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBwciwgcm0sIHRydWUpO1xuICBDdG9yLnByZWNpc2lvbiA9IHdwciA9IHhzZCAtIHguZTtcbiAgeCA9IGRpdmlkZSh4LnBsdXMoMSksIG5ldyBDdG9yKDEpLm1pbnVzKHgpLCB3cHIgKyBwciwgMSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgeCA9IHgubG4oKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4geC50aW1lcygwLjUpO1xufTtcblAuaW52ZXJzZVNpbmUgPSBQLmFzaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhhbGZQaSwgaywgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgayA9IHguYWJzKCkuY21wKDEpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmIChrICE9PSAtMSkge1xuICAgIGlmIChrID09PSAwKSB7XG4gICAgICBoYWxmUGkgPSBnZXRQaShDdG9yLCBwciArIDQsIHJtKS50aW1lcygwLjUpO1xuICAgICAgaGFsZlBpLnMgPSB4LnM7XG4gICAgICByZXR1cm4gaGFsZlBpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgfVxuICBDdG9yLnByZWNpc2lvbiA9IHByICsgNjtcbiAgQ3Rvci5yb3VuZGluZyA9IDE7XG4gIHggPSB4LmRpdihuZXcgQ3RvcigxKS5taW51cyh4LnRpbWVzKHgpKS5zcXJ0KCkucGx1cygxKSkuYXRhbigpO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiB4LnRpbWVzKDIpO1xufTtcblAuaW52ZXJzZVRhbmdlbnQgPSBQLmF0YW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGksIGosIGssIG4sIHB4LCB0LCByLCB3cHIsIHgyLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIHByID0gQ3Rvci5wcmVjaXNpb24sIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKCF4LmlzRmluaXRlKCkpIHtcbiAgICBpZiAoIXgucylcbiAgICAgIHJldHVybiBuZXcgQ3RvcihOYU4pO1xuICAgIGlmIChwciArIDQgPD0gUElfUFJFQ0lTSU9OKSB7XG4gICAgICByID0gZ2V0UGkoQ3RvciwgcHIgKyA0LCBybSkudGltZXMoMC41KTtcbiAgICAgIHIucyA9IHgucztcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgfSBlbHNlIGlmICh4LmlzWmVybygpKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICB9IGVsc2UgaWYgKHguYWJzKCkuZXEoMSkgJiYgcHIgKyA0IDw9IFBJX1BSRUNJU0lPTikge1xuICAgIHIgPSBnZXRQaShDdG9yLCBwciArIDQsIHJtKS50aW1lcygwLjI1KTtcbiAgICByLnMgPSB4LnM7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgQ3Rvci5wcmVjaXNpb24gPSB3cHIgPSBwciArIDEwO1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgayA9IE1hdGgubWluKDI4LCB3cHIgLyBMT0dfQkFTRSArIDIgfCAwKTtcbiAgZm9yIChpID0gazsgaTsgLS1pKVxuICAgIHggPSB4LmRpdih4LnRpbWVzKHgpLnBsdXMoMSkuc3FydCgpLnBsdXMoMSkpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBqID0gTWF0aC5jZWlsKHdwciAvIExPR19CQVNFKTtcbiAgbiA9IDE7XG4gIHgyID0geC50aW1lcyh4KTtcbiAgciA9IG5ldyBDdG9yKHgpO1xuICBweCA9IHg7XG4gIGZvciAoOyBpICE9PSAtMTsgKSB7XG4gICAgcHggPSBweC50aW1lcyh4Mik7XG4gICAgdCA9IHIubWludXMocHguZGl2KG4gKz0gMikpO1xuICAgIHB4ID0gcHgudGltZXMoeDIpO1xuICAgIHIgPSB0LnBsdXMocHguZGl2KG4gKz0gMikpO1xuICAgIGlmIChyLmRbal0gIT09IHZvaWQgMClcbiAgICAgIGZvciAoaSA9IGo7IHIuZFtpXSA9PT0gdC5kW2ldICYmIGktLTsgKVxuICAgICAgICA7XG4gIH1cbiAgaWYgKGspXG4gICAgciA9IHIudGltZXMoMiA8PCBrIC0gMSk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIEN0b3IucHJlY2lzaW9uID0gcHIsIEN0b3Iucm91bmRpbmcgPSBybSwgdHJ1ZSk7XG59O1xuUC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gISF0aGlzLmQ7XG59O1xuUC5pc0ludGVnZXIgPSBQLmlzSW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhIXRoaXMuZCAmJiBtYXRoZmxvb3IodGhpcy5lIC8gTE9HX0JBU0UpID4gdGhpcy5kLmxlbmd0aCAtIDI7XG59O1xuUC5pc05hTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMucztcbn07XG5QLmlzTmVnYXRpdmUgPSBQLmlzTmVnID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnMgPCAwO1xufTtcblAuaXNQb3NpdGl2ZSA9IFAuaXNQb3MgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucyA+IDA7XG59O1xuUC5pc1plcm8gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICEhdGhpcy5kICYmIHRoaXMuZFswXSA9PT0gMDtcbn07XG5QLmxlc3NUaGFuID0gUC5sdCA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpIDwgMDtcbn07XG5QLmxlc3NUaGFuT3JFcXVhbFRvID0gUC5sdGUgPSBmdW5jdGlvbih5KSB7XG4gIHJldHVybiB0aGlzLmNtcCh5KSA8IDE7XG59O1xuUC5sb2dhcml0aG0gPSBQLmxvZyA9IGZ1bmN0aW9uKGJhc2UpIHtcbiAgdmFyIGlzQmFzZTEwLCBkLCBkZW5vbWluYXRvciwgaywgaW5mLCBudW0sIHNkLCByLCBhcmcgPSB0aGlzLCBDdG9yID0gYXJnLmNvbnN0cnVjdG9yLCBwciA9IEN0b3IucHJlY2lzaW9uLCBybSA9IEN0b3Iucm91bmRpbmcsIGd1YXJkID0gNTtcbiAgaWYgKGJhc2UgPT0gbnVsbCkge1xuICAgIGJhc2UgPSBuZXcgQ3RvcigxMCk7XG4gICAgaXNCYXNlMTAgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBuZXcgQ3RvcihiYXNlKTtcbiAgICBkID0gYmFzZS5kO1xuICAgIGlmIChiYXNlLnMgPCAwIHx8ICFkIHx8ICFkWzBdIHx8IGJhc2UuZXEoMSkpXG4gICAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgICBpc0Jhc2UxMCA9IGJhc2UuZXEoMTApO1xuICB9XG4gIGQgPSBhcmcuZDtcbiAgaWYgKGFyZy5zIDwgMCB8fCAhZCB8fCAhZFswXSB8fCBhcmcuZXEoMSkpIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoZCAmJiAhZFswXSA/IC0xIC8gMCA6IGFyZy5zICE9IDEgPyBOYU4gOiBkID8gMCA6IDEgLyAwKTtcbiAgfVxuICBpZiAoaXNCYXNlMTApIHtcbiAgICBpZiAoZC5sZW5ndGggPiAxKSB7XG4gICAgICBpbmYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGsgPSBkWzBdOyBrICUgMTAgPT09IDA7IClcbiAgICAgICAgayAvPSAxMDtcbiAgICAgIGluZiA9IGsgIT09IDE7XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gZmFsc2U7XG4gIHNkID0gcHIgKyBndWFyZDtcbiAgbnVtID0gbmF0dXJhbExvZ2FyaXRobShhcmcsIHNkKTtcbiAgZGVub21pbmF0b3IgPSBpc0Jhc2UxMCA/IGdldExuMTAoQ3Rvciwgc2QgKyAxMCkgOiBuYXR1cmFsTG9nYXJpdGhtKGJhc2UsIHNkKTtcbiAgciA9IGRpdmlkZShudW0sIGRlbm9taW5hdG9yLCBzZCwgMSk7XG4gIGlmIChjaGVja1JvdW5kaW5nRGlnaXRzKHIuZCwgayA9IHByLCBybSkpIHtcbiAgICBkbyB7XG4gICAgICBzZCArPSAxMDtcbiAgICAgIG51bSA9IG5hdHVyYWxMb2dhcml0aG0oYXJnLCBzZCk7XG4gICAgICBkZW5vbWluYXRvciA9IGlzQmFzZTEwID8gZ2V0TG4xMChDdG9yLCBzZCArIDEwKSA6IG5hdHVyYWxMb2dhcml0aG0oYmFzZSwgc2QpO1xuICAgICAgciA9IGRpdmlkZShudW0sIGRlbm9taW5hdG9yLCBzZCwgMSk7XG4gICAgICBpZiAoIWluZikge1xuICAgICAgICBpZiAoK2RpZ2l0c1RvU3RyaW5nKHIuZCkuc2xpY2UoayArIDEsIGsgKyAxNSkgKyAxID09IDFlMTQpIHtcbiAgICAgICAgICByID0gZmluYWxpc2UociwgcHIgKyAxLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IHdoaWxlIChjaGVja1JvdW5kaW5nRGlnaXRzKHIuZCwgayArPSAxMCwgcm0pKTtcbiAgfVxuICBleHRlcm5hbCA9IHRydWU7XG4gIHJldHVybiBmaW5hbGlzZShyLCBwciwgcm0pO1xufTtcblAubWludXMgPSBQLnN1YiA9IGZ1bmN0aW9uKHkpIHtcbiAgdmFyIGQsIGUsIGksIGosIGssIGxlbiwgcHIsIHJtLCB4ZCwgeGUsIHhMVHksIHlkLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIHkgPSBuZXcgQ3Rvcih5KTtcbiAgaWYgKCF4LmQgfHwgIXkuZCkge1xuICAgIGlmICgheC5zIHx8ICF5LnMpXG4gICAgICB5ID0gbmV3IEN0b3IoTmFOKTtcbiAgICBlbHNlIGlmICh4LmQpXG4gICAgICB5LnMgPSAteS5zO1xuICAgIGVsc2VcbiAgICAgIHkgPSBuZXcgQ3Rvcih5LmQgfHwgeC5zICE9PSB5LnMgPyB4IDogTmFOKTtcbiAgICByZXR1cm4geTtcbiAgfVxuICBpZiAoeC5zICE9IHkucykge1xuICAgIHkucyA9IC15LnM7XG4gICAgcmV0dXJuIHgucGx1cyh5KTtcbiAgfVxuICB4ZCA9IHguZDtcbiAgeWQgPSB5LmQ7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKCF4ZFswXSB8fCAheWRbMF0pIHtcbiAgICBpZiAoeWRbMF0pXG4gICAgICB5LnMgPSAteS5zO1xuICAgIGVsc2UgaWYgKHhkWzBdKVxuICAgICAgeSA9IG5ldyBDdG9yKHgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuZXcgQ3RvcihybSA9PT0gMyA/IC0wIDogMCk7XG4gICAgcmV0dXJuIGV4dGVybmFsID8gZmluYWxpc2UoeSwgcHIsIHJtKSA6IHk7XG4gIH1cbiAgZSA9IG1hdGhmbG9vcih5LmUgLyBMT0dfQkFTRSk7XG4gIHhlID0gbWF0aGZsb29yKHguZSAvIExPR19CQVNFKTtcbiAgeGQgPSB4ZC5zbGljZSgpO1xuICBrID0geGUgLSBlO1xuICBpZiAoaykge1xuICAgIHhMVHkgPSBrIDwgMDtcbiAgICBpZiAoeExUeSkge1xuICAgICAgZCA9IHhkO1xuICAgICAgayA9IC1rO1xuICAgICAgbGVuID0geWQubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkID0geWQ7XG4gICAgICBlID0geGU7XG4gICAgICBsZW4gPSB4ZC5sZW5ndGg7XG4gICAgfVxuICAgIGkgPSBNYXRoLm1heChNYXRoLmNlaWwocHIgLyBMT0dfQkFTRSksIGxlbikgKyAyO1xuICAgIGlmIChrID4gaSkge1xuICAgICAgayA9IGk7XG4gICAgICBkLmxlbmd0aCA9IDE7XG4gICAgfVxuICAgIGQucmV2ZXJzZSgpO1xuICAgIGZvciAoaSA9IGs7IGktLTsgKVxuICAgICAgZC5wdXNoKDApO1xuICAgIGQucmV2ZXJzZSgpO1xuICB9IGVsc2Uge1xuICAgIGkgPSB4ZC5sZW5ndGg7XG4gICAgbGVuID0geWQubGVuZ3RoO1xuICAgIHhMVHkgPSBpIDwgbGVuO1xuICAgIGlmICh4TFR5KVxuICAgICAgbGVuID0gaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh4ZFtpXSAhPSB5ZFtpXSkge1xuICAgICAgICB4TFR5ID0geGRbaV0gPCB5ZFtpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGsgPSAwO1xuICB9XG4gIGlmICh4TFR5KSB7XG4gICAgZCA9IHhkO1xuICAgIHhkID0geWQ7XG4gICAgeWQgPSBkO1xuICAgIHkucyA9IC15LnM7XG4gIH1cbiAgbGVuID0geGQubGVuZ3RoO1xuICBmb3IgKGkgPSB5ZC5sZW5ndGggLSBsZW47IGkgPiAwOyAtLWkpXG4gICAgeGRbbGVuKytdID0gMDtcbiAgZm9yIChpID0geWQubGVuZ3RoOyBpID4gazsgKSB7XG4gICAgaWYgKHhkWy0taV0gPCB5ZFtpXSkge1xuICAgICAgZm9yIChqID0gaTsgaiAmJiB4ZFstLWpdID09PSAwOyApXG4gICAgICAgIHhkW2pdID0gQkFTRSAtIDE7XG4gICAgICAtLXhkW2pdO1xuICAgICAgeGRbaV0gKz0gQkFTRTtcbiAgICB9XG4gICAgeGRbaV0gLT0geWRbaV07XG4gIH1cbiAgZm9yICg7IHhkWy0tbGVuXSA9PT0gMDsgKVxuICAgIHhkLnBvcCgpO1xuICBmb3IgKDsgeGRbMF0gPT09IDA7IHhkLnNoaWZ0KCkpXG4gICAgLS1lO1xuICBpZiAoIXhkWzBdKVxuICAgIHJldHVybiBuZXcgQ3RvcihybSA9PT0gMyA/IC0wIDogMCk7XG4gIHkuZCA9IHhkO1xuICB5LmUgPSBnZXRCYXNlMTBFeHBvbmVudCh4ZCwgZSk7XG4gIHJldHVybiBleHRlcm5hbCA/IGZpbmFsaXNlKHksIHByLCBybSkgOiB5O1xufTtcblAubW9kdWxvID0gUC5tb2QgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBxLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIHkgPSBuZXcgQ3Rvcih5KTtcbiAgaWYgKCF4LmQgfHwgIXkucyB8fCB5LmQgJiYgIXkuZFswXSlcbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgaWYgKCF5LmQgfHwgeC5kICYmICF4LmRbMF0pIHtcbiAgICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoeCksIEN0b3IucHJlY2lzaW9uLCBDdG9yLnJvdW5kaW5nKTtcbiAgfVxuICBleHRlcm5hbCA9IGZhbHNlO1xuICBpZiAoQ3Rvci5tb2R1bG8gPT0gOSkge1xuICAgIHEgPSBkaXZpZGUoeCwgeS5hYnMoKSwgMCwgMywgMSk7XG4gICAgcS5zICo9IHkucztcbiAgfSBlbHNlIHtcbiAgICBxID0gZGl2aWRlKHgsIHksIDAsIEN0b3IubW9kdWxvLCAxKTtcbiAgfVxuICBxID0gcS50aW1lcyh5KTtcbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4geC5taW51cyhxKTtcbn07XG5QLm5hdHVyYWxFeHBvbmVudGlhbCA9IFAuZXhwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuYXR1cmFsRXhwb25lbnRpYWwodGhpcyk7XG59O1xuUC5uYXR1cmFsTG9nYXJpdGhtID0gUC5sbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmF0dXJhbExvZ2FyaXRobSh0aGlzKTtcbn07XG5QLm5lZ2F0ZWQgPSBQLm5lZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICB4LnMgPSAteC5zO1xuICByZXR1cm4gZmluYWxpc2UoeCk7XG59O1xuUC5wbHVzID0gUC5hZGQgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBjYXJyeSwgZCwgZSwgaSwgaywgbGVuLCBwciwgcm0sIHhkLCB5ZCwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICB5ID0gbmV3IEN0b3IoeSk7XG4gIGlmICgheC5kIHx8ICF5LmQpIHtcbiAgICBpZiAoIXgucyB8fCAheS5zKVxuICAgICAgeSA9IG5ldyBDdG9yKE5hTik7XG4gICAgZWxzZSBpZiAoIXguZClcbiAgICAgIHkgPSBuZXcgQ3Rvcih5LmQgfHwgeC5zID09PSB5LnMgPyB4IDogTmFOKTtcbiAgICByZXR1cm4geTtcbiAgfVxuICBpZiAoeC5zICE9IHkucykge1xuICAgIHkucyA9IC15LnM7XG4gICAgcmV0dXJuIHgubWludXMoeSk7XG4gIH1cbiAgeGQgPSB4LmQ7XG4gIHlkID0geS5kO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmICgheGRbMF0gfHwgIXlkWzBdKSB7XG4gICAgaWYgKCF5ZFswXSlcbiAgICAgIHkgPSBuZXcgQ3Rvcih4KTtcbiAgICByZXR1cm4gZXh0ZXJuYWwgPyBmaW5hbGlzZSh5LCBwciwgcm0pIDogeTtcbiAgfVxuICBrID0gbWF0aGZsb29yKHguZSAvIExPR19CQVNFKTtcbiAgZSA9IG1hdGhmbG9vcih5LmUgLyBMT0dfQkFTRSk7XG4gIHhkID0geGQuc2xpY2UoKTtcbiAgaSA9IGsgLSBlO1xuICBpZiAoaSkge1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgZCA9IHhkO1xuICAgICAgaSA9IC1pO1xuICAgICAgbGVuID0geWQubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkID0geWQ7XG4gICAgICBlID0gaztcbiAgICAgIGxlbiA9IHhkLmxlbmd0aDtcbiAgICB9XG4gICAgayA9IE1hdGguY2VpbChwciAvIExPR19CQVNFKTtcbiAgICBsZW4gPSBrID4gbGVuID8gayArIDEgOiBsZW4gKyAxO1xuICAgIGlmIChpID4gbGVuKSB7XG4gICAgICBpID0gbGVuO1xuICAgICAgZC5sZW5ndGggPSAxO1xuICAgIH1cbiAgICBkLnJldmVyc2UoKTtcbiAgICBmb3IgKDsgaS0tOyApXG4gICAgICBkLnB1c2goMCk7XG4gICAgZC5yZXZlcnNlKCk7XG4gIH1cbiAgbGVuID0geGQubGVuZ3RoO1xuICBpID0geWQubGVuZ3RoO1xuICBpZiAobGVuIC0gaSA8IDApIHtcbiAgICBpID0gbGVuO1xuICAgIGQgPSB5ZDtcbiAgICB5ZCA9IHhkO1xuICAgIHhkID0gZDtcbiAgfVxuICBmb3IgKGNhcnJ5ID0gMDsgaTsgKSB7XG4gICAgY2FycnkgPSAoeGRbLS1pXSA9IHhkW2ldICsgeWRbaV0gKyBjYXJyeSkgLyBCQVNFIHwgMDtcbiAgICB4ZFtpXSAlPSBCQVNFO1xuICB9XG4gIGlmIChjYXJyeSkge1xuICAgIHhkLnVuc2hpZnQoY2FycnkpO1xuICAgICsrZTtcbiAgfVxuICBmb3IgKGxlbiA9IHhkLmxlbmd0aDsgeGRbLS1sZW5dID09IDA7IClcbiAgICB4ZC5wb3AoKTtcbiAgeS5kID0geGQ7XG4gIHkuZSA9IGdldEJhc2UxMEV4cG9uZW50KHhkLCBlKTtcbiAgcmV0dXJuIGV4dGVybmFsID8gZmluYWxpc2UoeSwgcHIsIHJtKSA6IHk7XG59O1xuUC5wcmVjaXNpb24gPSBQLnNkID0gZnVuY3Rpb24oeikge1xuICB2YXIgaywgeCA9IHRoaXM7XG4gIGlmICh6ICE9PSB2b2lkIDAgJiYgeiAhPT0gISF6ICYmIHogIT09IDEgJiYgeiAhPT0gMClcbiAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyB6KTtcbiAgaWYgKHguZCkge1xuICAgIGsgPSBnZXRQcmVjaXNpb24oeC5kKTtcbiAgICBpZiAoeiAmJiB4LmUgKyAxID4gaylcbiAgICAgIGsgPSB4LmUgKyAxO1xuICB9IGVsc2Uge1xuICAgIGsgPSBOYU47XG4gIH1cbiAgcmV0dXJuIGs7XG59O1xuUC5yb3VuZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoeCksIHguZSArIDEsIEN0b3Iucm91bmRpbmcpO1xufTtcblAuc2luZSA9IFAuc2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwciwgcm0sIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgcHIgPSBDdG9yLnByZWNpc2lvbjtcbiAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICBDdG9yLnByZWNpc2lvbiA9IHByICsgTWF0aC5tYXgoeC5lLCB4LnNkKCkpICsgTE9HX0JBU0U7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0gc2luZShDdG9yLCB0b0xlc3NUaGFuSGFsZlBpKEN0b3IsIHgpKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4gZmluYWxpc2UocXVhZHJhbnQgPiAyID8geC5uZWcoKSA6IHgsIHByLCBybSwgdHJ1ZSk7XG59O1xuUC5zcXVhcmVSb290ID0gUC5zcXJ0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtLCBuLCBzZCwgciwgcmVwLCB0LCB4ID0gdGhpcywgZCA9IHguZCwgZSA9IHguZSwgcyA9IHgucywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzICE9PSAxIHx8ICFkIHx8ICFkWzBdKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKCFzIHx8IHMgPCAwICYmICghZCB8fCBkWzBdKSA/IE5hTiA6IGQgPyB4IDogMSAvIDApO1xuICB9XG4gIGV4dGVybmFsID0gZmFsc2U7XG4gIHMgPSBNYXRoLnNxcnQoK3gpO1xuICBpZiAocyA9PSAwIHx8IHMgPT0gMSAvIDApIHtcbiAgICBuID0gZGlnaXRzVG9TdHJpbmcoZCk7XG4gICAgaWYgKChuLmxlbmd0aCArIGUpICUgMiA9PSAwKVxuICAgICAgbiArPSBcIjBcIjtcbiAgICBzID0gTWF0aC5zcXJ0KG4pO1xuICAgIGUgPSBtYXRoZmxvb3IoKGUgKyAxKSAvIDIpIC0gKGUgPCAwIHx8IGUgJSAyKTtcbiAgICBpZiAocyA9PSAxIC8gMCkge1xuICAgICAgbiA9IFwiNWVcIiArIGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBzLnRvRXhwb25lbnRpYWwoKTtcbiAgICAgIG4gPSBuLnNsaWNlKDAsIG4uaW5kZXhPZihcImVcIikgKyAxKSArIGU7XG4gICAgfVxuICAgIHIgPSBuZXcgQ3RvcihuKTtcbiAgfSBlbHNlIHtcbiAgICByID0gbmV3IEN0b3Iocy50b1N0cmluZygpKTtcbiAgfVxuICBzZCA9IChlID0gQ3Rvci5wcmVjaXNpb24pICsgMztcbiAgZm9yICg7IDsgKSB7XG4gICAgdCA9IHI7XG4gICAgciA9IHQucGx1cyhkaXZpZGUoeCwgdCwgc2QgKyAyLCAxKSkudGltZXMoMC41KTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCBzZCkgPT09IChuID0gZGlnaXRzVG9TdHJpbmcoci5kKSkuc2xpY2UoMCwgc2QpKSB7XG4gICAgICBuID0gbi5zbGljZShzZCAtIDMsIHNkICsgMSk7XG4gICAgICBpZiAobiA9PSBcIjk5OTlcIiB8fCAhcmVwICYmIG4gPT0gXCI0OTk5XCIpIHtcbiAgICAgICAgaWYgKCFyZXApIHtcbiAgICAgICAgICBmaW5hbGlzZSh0LCBlICsgMSwgMCk7XG4gICAgICAgICAgaWYgKHQudGltZXModCkuZXEoeCkpIHtcbiAgICAgICAgICAgIHIgPSB0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNkICs9IDQ7XG4gICAgICAgIHJlcCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIStuIHx8ICErbi5zbGljZSgxKSAmJiBuLmNoYXJBdCgwKSA9PSBcIjVcIikge1xuICAgICAgICAgIGZpbmFsaXNlKHIsIGUgKyAxLCAxKTtcbiAgICAgICAgICBtID0gIXIudGltZXMocikuZXEoeCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIGUsIEN0b3Iucm91bmRpbmcsIG0pO1xufTtcblAudGFuZ2VudCA9IFAudGFuID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwciwgcm0sIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgcHIgPSBDdG9yLnByZWNpc2lvbjtcbiAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICBDdG9yLnByZWNpc2lvbiA9IHByICsgMTA7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0geC5zaW4oKTtcbiAgeC5zID0gMTtcbiAgeCA9IGRpdmlkZSh4LCBuZXcgQ3RvcigxKS5taW51cyh4LnRpbWVzKHgpKS5zcXJ0KCksIHByICsgMTAsIDApO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiBmaW5hbGlzZShxdWFkcmFudCA9PSAyIHx8IHF1YWRyYW50ID09IDQgPyB4Lm5lZygpIDogeCwgcHIsIHJtLCB0cnVlKTtcbn07XG5QLnRpbWVzID0gUC5tdWwgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBjYXJyeSwgZSwgaSwgaywgciwgckwsIHQsIHhkTCwgeWRMLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIHhkID0geC5kLCB5ZCA9ICh5ID0gbmV3IEN0b3IoeSkpLmQ7XG4gIHkucyAqPSB4LnM7XG4gIGlmICgheGQgfHwgIXhkWzBdIHx8ICF5ZCB8fCAheWRbMF0pIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoIXkucyB8fCB4ZCAmJiAheGRbMF0gJiYgIXlkIHx8IHlkICYmICF5ZFswXSAmJiAheGQgPyBOYU4gOiAheGQgfHwgIXlkID8geS5zIC8gMCA6IHkucyAqIDApO1xuICB9XG4gIGUgPSBtYXRoZmxvb3IoeC5lIC8gTE9HX0JBU0UpICsgbWF0aGZsb29yKHkuZSAvIExPR19CQVNFKTtcbiAgeGRMID0geGQubGVuZ3RoO1xuICB5ZEwgPSB5ZC5sZW5ndGg7XG4gIGlmICh4ZEwgPCB5ZEwpIHtcbiAgICByID0geGQ7XG4gICAgeGQgPSB5ZDtcbiAgICB5ZCA9IHI7XG4gICAgckwgPSB4ZEw7XG4gICAgeGRMID0geWRMO1xuICAgIHlkTCA9IHJMO1xuICB9XG4gIHIgPSBbXTtcbiAgckwgPSB4ZEwgKyB5ZEw7XG4gIGZvciAoaSA9IHJMOyBpLS07IClcbiAgICByLnB1c2goMCk7XG4gIGZvciAoaSA9IHlkTDsgLS1pID49IDA7ICkge1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGsgPSB4ZEwgKyBpOyBrID4gaTsgKSB7XG4gICAgICB0ID0gcltrXSArIHlkW2ldICogeGRbayAtIGkgLSAxXSArIGNhcnJ5O1xuICAgICAgcltrLS1dID0gdCAlIEJBU0UgfCAwO1xuICAgICAgY2FycnkgPSB0IC8gQkFTRSB8IDA7XG4gICAgfVxuICAgIHJba10gPSAocltrXSArIGNhcnJ5KSAlIEJBU0UgfCAwO1xuICB9XG4gIGZvciAoOyAhclstLXJMXTsgKVxuICAgIHIucG9wKCk7XG4gIGlmIChjYXJyeSlcbiAgICArK2U7XG4gIGVsc2VcbiAgICByLnNoaWZ0KCk7XG4gIHkuZCA9IHI7XG4gIHkuZSA9IGdldEJhc2UxMEV4cG9uZW50KHIsIGUpO1xuICByZXR1cm4gZXh0ZXJuYWwgPyBmaW5hbGlzZSh5LCBDdG9yLnByZWNpc2lvbiwgQ3Rvci5yb3VuZGluZykgOiB5O1xufTtcblAudG9CaW5hcnkgPSBmdW5jdGlvbihzZCwgcm0pIHtcbiAgcmV0dXJuIHRvU3RyaW5nQmluYXJ5KHRoaXMsIDIsIHNkLCBybSk7XG59O1xuUC50b0RlY2ltYWxQbGFjZXMgPSBQLnRvRFAgPSBmdW5jdGlvbihkcCwgcm0pIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgeCA9IG5ldyBDdG9yKHgpO1xuICBpZiAoZHAgPT09IHZvaWQgMClcbiAgICByZXR1cm4geDtcbiAgY2hlY2tJbnQzMihkcCwgMCwgTUFYX0RJR0lUUyk7XG4gIGlmIChybSA9PT0gdm9pZCAwKVxuICAgIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgZWxzZVxuICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICByZXR1cm4gZmluYWxpc2UoeCwgZHAgKyB4LmUgKyAxLCBybSk7XG59O1xuUC50b0V4cG9uZW50aWFsID0gZnVuY3Rpb24oZHAsIHJtKSB7XG4gIHZhciBzdHIsIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGRwID09PSB2b2lkIDApIHtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh4LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBjaGVja0ludDMyKGRwLCAwLCBNQVhfRElHSVRTKTtcbiAgICBpZiAocm0gPT09IHZvaWQgMClcbiAgICAgIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgICBlbHNlXG4gICAgICBjaGVja0ludDMyKHJtLCAwLCA4KTtcbiAgICB4ID0gZmluYWxpc2UobmV3IEN0b3IoeCksIGRwICsgMSwgcm0pO1xuICAgIHN0ciA9IGZpbml0ZVRvU3RyaW5nKHgsIHRydWUsIGRwICsgMSk7XG4gIH1cbiAgcmV0dXJuIHguaXNOZWcoKSAmJiAheC5pc1plcm8oKSA/IFwiLVwiICsgc3RyIDogc3RyO1xufTtcblAudG9GaXhlZCA9IGZ1bmN0aW9uKGRwLCBybSkge1xuICB2YXIgc3RyLCB5LCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChkcCA9PT0gdm9pZCAwKSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCk7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tJbnQzMihkcCwgMCwgTUFYX0RJR0lUUyk7XG4gICAgaWYgKHJtID09PSB2b2lkIDApXG4gICAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gICAgZWxzZVxuICAgICAgY2hlY2tJbnQzMihybSwgMCwgOCk7XG4gICAgeSA9IGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBkcCArIHguZSArIDEsIHJtKTtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh5LCBmYWxzZSwgZHAgKyB5LmUgKyAxKTtcbiAgfVxuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50b0ZyYWN0aW9uID0gZnVuY3Rpb24obWF4RCkge1xuICB2YXIgZCwgZDAsIGQxLCBkMiwgZSwgaywgbiwgbjAsIG4xLCBwciwgcSwgciwgeCA9IHRoaXMsIHhkID0geC5kLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4ZClcbiAgICByZXR1cm4gbmV3IEN0b3IoeCk7XG4gIG4xID0gZDAgPSBuZXcgQ3RvcigxKTtcbiAgZDEgPSBuMCA9IG5ldyBDdG9yKDApO1xuICBkID0gbmV3IEN0b3IoZDEpO1xuICBlID0gZC5lID0gZ2V0UHJlY2lzaW9uKHhkKSAtIHguZSAtIDE7XG4gIGsgPSBlICUgTE9HX0JBU0U7XG4gIGQuZFswXSA9IG1hdGhwb3coMTAsIGsgPCAwID8gTE9HX0JBU0UgKyBrIDogayk7XG4gIGlmIChtYXhEID09IG51bGwpIHtcbiAgICBtYXhEID0gZSA+IDAgPyBkIDogbjE7XG4gIH0gZWxzZSB7XG4gICAgbiA9IG5ldyBDdG9yKG1heEQpO1xuICAgIGlmICghbi5pc0ludCgpIHx8IG4ubHQobjEpKVxuICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEFyZ3VtZW50ICsgbik7XG4gICAgbWF4RCA9IG4uZ3QoZCkgPyBlID4gMCA/IGQgOiBuMSA6IG47XG4gIH1cbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgbiA9IG5ldyBDdG9yKGRpZ2l0c1RvU3RyaW5nKHhkKSk7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIEN0b3IucHJlY2lzaW9uID0gZSA9IHhkLmxlbmd0aCAqIExPR19CQVNFICogMjtcbiAgZm9yICg7IDsgKSB7XG4gICAgcSA9IGRpdmlkZShuLCBkLCAwLCAxLCAxKTtcbiAgICBkMiA9IGQwLnBsdXMocS50aW1lcyhkMSkpO1xuICAgIGlmIChkMi5jbXAobWF4RCkgPT0gMSlcbiAgICAgIGJyZWFrO1xuICAgIGQwID0gZDE7XG4gICAgZDEgPSBkMjtcbiAgICBkMiA9IG4xO1xuICAgIG4xID0gbjAucGx1cyhxLnRpbWVzKGQyKSk7XG4gICAgbjAgPSBkMjtcbiAgICBkMiA9IGQ7XG4gICAgZCA9IG4ubWludXMocS50aW1lcyhkMikpO1xuICAgIG4gPSBkMjtcbiAgfVxuICBkMiA9IGRpdmlkZShtYXhELm1pbnVzKGQwKSwgZDEsIDAsIDEsIDEpO1xuICBuMCA9IG4wLnBsdXMoZDIudGltZXMobjEpKTtcbiAgZDAgPSBkMC5wbHVzKGQyLnRpbWVzKGQxKSk7XG4gIG4wLnMgPSBuMS5zID0geC5zO1xuICByID0gZGl2aWRlKG4xLCBkMSwgZSwgMSkubWludXMoeCkuYWJzKCkuY21wKGRpdmlkZShuMCwgZDAsIGUsIDEpLm1pbnVzKHgpLmFicygpKSA8IDEgPyBbbjEsIGQxXSA6IFtuMCwgZDBdO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIHJldHVybiByO1xufTtcblAudG9IZXhhZGVjaW1hbCA9IFAudG9IZXggPSBmdW5jdGlvbihzZCwgcm0pIHtcbiAgcmV0dXJuIHRvU3RyaW5nQmluYXJ5KHRoaXMsIDE2LCBzZCwgcm0pO1xufTtcblAudG9OZWFyZXN0ID0gZnVuY3Rpb24oeSwgcm0pIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgeCA9IG5ldyBDdG9yKHgpO1xuICBpZiAoeSA9PSBudWxsKSB7XG4gICAgaWYgKCF4LmQpXG4gICAgICByZXR1cm4geDtcbiAgICB5ID0gbmV3IEN0b3IoMSk7XG4gICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICB9IGVsc2Uge1xuICAgIHkgPSBuZXcgQ3Rvcih5KTtcbiAgICBpZiAocm0gPT09IHZvaWQgMCkge1xuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ludDMyKHJtLCAwLCA4KTtcbiAgICB9XG4gICAgaWYgKCF4LmQpXG4gICAgICByZXR1cm4geS5zID8geCA6IHk7XG4gICAgaWYgKCF5LmQpIHtcbiAgICAgIGlmICh5LnMpXG4gICAgICAgIHkucyA9IHgucztcbiAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgfVxuICBpZiAoeS5kWzBdKSB7XG4gICAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgICB4ID0gZGl2aWRlKHgsIHksIDAsIHJtLCAxKS50aW1lcyh5KTtcbiAgICBleHRlcm5hbCA9IHRydWU7XG4gICAgZmluYWxpc2UoeCk7XG4gIH0gZWxzZSB7XG4gICAgeS5zID0geC5zO1xuICAgIHggPSB5O1xuICB9XG4gIHJldHVybiB4O1xufTtcblAudG9OdW1iZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICt0aGlzO1xufTtcblAudG9PY3RhbCA9IGZ1bmN0aW9uKHNkLCBybSkge1xuICByZXR1cm4gdG9TdHJpbmdCaW5hcnkodGhpcywgOCwgc2QsIHJtKTtcbn07XG5QLnRvUG93ZXIgPSBQLnBvdyA9IGZ1bmN0aW9uKHkpIHtcbiAgdmFyIGUsIGssIHByLCByLCBybSwgcywgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCB5biA9ICsoeSA9IG5ldyBDdG9yKHkpKTtcbiAgaWYgKCF4LmQgfHwgIXkuZCB8fCAheC5kWzBdIHx8ICF5LmRbMF0pXG4gICAgcmV0dXJuIG5ldyBDdG9yKG1hdGhwb3coK3gsIHluKSk7XG4gIHggPSBuZXcgQ3Rvcih4KTtcbiAgaWYgKHguZXEoMSkpXG4gICAgcmV0dXJuIHg7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKHkuZXEoMSkpXG4gICAgcmV0dXJuIGZpbmFsaXNlKHgsIHByLCBybSk7XG4gIGUgPSBtYXRoZmxvb3IoeS5lIC8gTE9HX0JBU0UpO1xuICBpZiAoZSA+PSB5LmQubGVuZ3RoIC0gMSAmJiAoayA9IHluIDwgMCA/IC15biA6IHluKSA8PSBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgciA9IGludFBvdyhDdG9yLCB4LCBrLCBwcik7XG4gICAgcmV0dXJuIHkucyA8IDAgPyBuZXcgQ3RvcigxKS5kaXYocikgOiBmaW5hbGlzZShyLCBwciwgcm0pO1xuICB9XG4gIHMgPSB4LnM7XG4gIGlmIChzIDwgMCkge1xuICAgIGlmIChlIDwgeS5kLmxlbmd0aCAtIDEpXG4gICAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgICBpZiAoKHkuZFtlXSAmIDEpID09IDApXG4gICAgICBzID0gMTtcbiAgICBpZiAoeC5lID09IDAgJiYgeC5kWzBdID09IDEgJiYgeC5kLmxlbmd0aCA9PSAxKSB7XG4gICAgICB4LnMgPSBzO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9XG4gIGsgPSBtYXRocG93KCt4LCB5bik7XG4gIGUgPSBrID09IDAgfHwgIWlzRmluaXRlKGspID8gbWF0aGZsb29yKHluICogKE1hdGgubG9nKFwiMC5cIiArIGRpZ2l0c1RvU3RyaW5nKHguZCkpIC8gTWF0aC5MTjEwICsgeC5lICsgMSkpIDogbmV3IEN0b3IoayArIFwiXCIpLmU7XG4gIGlmIChlID4gQ3Rvci5tYXhFICsgMSB8fCBlIDwgQ3Rvci5taW5FIC0gMSlcbiAgICByZXR1cm4gbmV3IEN0b3IoZSA+IDAgPyBzIC8gMCA6IDApO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBDdG9yLnJvdW5kaW5nID0geC5zID0gMTtcbiAgayA9IE1hdGgubWluKDEyLCAoZSArIFwiXCIpLmxlbmd0aCk7XG4gIHIgPSBuYXR1cmFsRXhwb25lbnRpYWwoeS50aW1lcyhuYXR1cmFsTG9nYXJpdGhtKHgsIHByICsgaykpLCBwcik7XG4gIGlmIChyLmQpIHtcbiAgICByID0gZmluYWxpc2UociwgcHIgKyA1LCAxKTtcbiAgICBpZiAoY2hlY2tSb3VuZGluZ0RpZ2l0cyhyLmQsIHByLCBybSkpIHtcbiAgICAgIGUgPSBwciArIDEwO1xuICAgICAgciA9IGZpbmFsaXNlKG5hdHVyYWxFeHBvbmVudGlhbCh5LnRpbWVzKG5hdHVyYWxMb2dhcml0aG0oeCwgZSArIGspKSwgZSksIGUgKyA1LCAxKTtcbiAgICAgIGlmICgrZGlnaXRzVG9TdHJpbmcoci5kKS5zbGljZShwciArIDEsIHByICsgMTUpICsgMSA9PSAxZTE0KSB7XG4gICAgICAgIHIgPSBmaW5hbGlzZShyLCBwciArIDEsIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByLnMgPSBzO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIHByLCBybSk7XG59O1xuUC50b1ByZWNpc2lvbiA9IGZ1bmN0aW9uKHNkLCBybSkge1xuICB2YXIgc3RyLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzZCA9PT0gdm9pZCAwKSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrSW50MzIoc2QsIDEsIE1BWF9ESUdJVFMpO1xuICAgIGlmIChybSA9PT0gdm9pZCAwKVxuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIGVsc2VcbiAgICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICAgIHggPSBmaW5hbGlzZShuZXcgQ3Rvcih4KSwgc2QsIHJtKTtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh4LCBzZCA8PSB4LmUgfHwgeC5lIDw9IEN0b3IudG9FeHBOZWcsIHNkKTtcbiAgfVxuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50b1NpZ25pZmljYW50RGlnaXRzID0gUC50b1NEID0gZnVuY3Rpb24oc2QsIHJtKSB7XG4gIHZhciB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzZCA9PT0gdm9pZCAwKSB7XG4gICAgc2QgPSBDdG9yLnByZWNpc2lvbjtcbiAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tJbnQzMihzZCwgMSwgTUFYX0RJR0lUUyk7XG4gICAgaWYgKHJtID09PSB2b2lkIDApXG4gICAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gICAgZWxzZVxuICAgICAgY2hlY2tJbnQzMihybSwgMCwgOCk7XG4gIH1cbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBzZCwgcm0pO1xufTtcblAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3Rvciwgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50cnVuY2F0ZWQgPSBQLnRydW5jID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBmaW5hbGlzZShuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSwgdGhpcy5lICsgMSwgMSk7XG59O1xuUC52YWx1ZU9mID0gUC50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3Rvciwgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICByZXR1cm4geC5pc05lZygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuZnVuY3Rpb24gZGlnaXRzVG9TdHJpbmcoZCkge1xuICB2YXIgaSwgaywgd3MsIGluZGV4T2ZMYXN0V29yZCA9IGQubGVuZ3RoIC0gMSwgc3RyID0gXCJcIiwgdyA9IGRbMF07XG4gIGlmIChpbmRleE9mTGFzdFdvcmQgPiAwKSB7XG4gICAgc3RyICs9IHc7XG4gICAgZm9yIChpID0gMTsgaSA8IGluZGV4T2ZMYXN0V29yZDsgaSsrKSB7XG4gICAgICB3cyA9IGRbaV0gKyBcIlwiO1xuICAgICAgayA9IExPR19CQVNFIC0gd3MubGVuZ3RoO1xuICAgICAgaWYgKGspXG4gICAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICAgICAgc3RyICs9IHdzO1xuICAgIH1cbiAgICB3ID0gZFtpXTtcbiAgICB3cyA9IHcgKyBcIlwiO1xuICAgIGsgPSBMT0dfQkFTRSAtIHdzLmxlbmd0aDtcbiAgICBpZiAoaylcbiAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICB9IGVsc2UgaWYgKHcgPT09IDApIHtcbiAgICByZXR1cm4gXCIwXCI7XG4gIH1cbiAgZm9yICg7IHcgJSAxMCA9PT0gMDsgKVxuICAgIHcgLz0gMTA7XG4gIHJldHVybiBzdHIgKyB3O1xufVxuZnVuY3Rpb24gY2hlY2tJbnQzMihpLCBtaW4yLCBtYXgyKSB7XG4gIGlmIChpICE9PSB+fmkgfHwgaSA8IG1pbjIgfHwgaSA+IG1heDIpIHtcbiAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyBpKTtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSb3VuZGluZ0RpZ2l0cyhkLCBpLCBybSwgcmVwZWF0aW5nKSB7XG4gIHZhciBkaSwgaywgciwgcmQ7XG4gIGZvciAoayA9IGRbMF07IGsgPj0gMTA7IGsgLz0gMTApXG4gICAgLS1pO1xuICBpZiAoLS1pIDwgMCkge1xuICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgZGkgPSAwO1xuICB9IGVsc2Uge1xuICAgIGRpID0gTWF0aC5jZWlsKChpICsgMSkgLyBMT0dfQkFTRSk7XG4gICAgaSAlPSBMT0dfQkFTRTtcbiAgfVxuICBrID0gbWF0aHBvdygxMCwgTE9HX0JBU0UgLSBpKTtcbiAgcmQgPSBkW2RpXSAlIGsgfCAwO1xuICBpZiAocmVwZWF0aW5nID09IG51bGwpIHtcbiAgICBpZiAoaSA8IDMpIHtcbiAgICAgIGlmIChpID09IDApXG4gICAgICAgIHJkID0gcmQgLyAxMDAgfCAwO1xuICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICByZCA9IHJkIC8gMTAgfCAwO1xuICAgICAgciA9IHJtIDwgNCAmJiByZCA9PSA5OTk5OSB8fCBybSA+IDMgJiYgcmQgPT0gNDk5OTkgfHwgcmQgPT0gNWU0IHx8IHJkID09IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIgPSAocm0gPCA0ICYmIHJkICsgMSA9PSBrIHx8IHJtID4gMyAmJiByZCArIDEgPT0gayAvIDIpICYmIChkW2RpICsgMV0gLyBrIC8gMTAwIHwgMCkgPT0gbWF0aHBvdygxMCwgaSAtIDIpIC0gMSB8fCAocmQgPT0gayAvIDIgfHwgcmQgPT0gMCkgJiYgKGRbZGkgKyAxXSAvIGsgLyAxMDAgfCAwKSA9PSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaSA8IDQpIHtcbiAgICAgIGlmIChpID09IDApXG4gICAgICAgIHJkID0gcmQgLyAxZTMgfCAwO1xuICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICByZCA9IHJkIC8gMTAwIHwgMDtcbiAgICAgIGVsc2UgaWYgKGkgPT0gMilcbiAgICAgICAgcmQgPSByZCAvIDEwIHwgMDtcbiAgICAgIHIgPSAocmVwZWF0aW5nIHx8IHJtIDwgNCkgJiYgcmQgPT0gOTk5OSB8fCAhcmVwZWF0aW5nICYmIHJtID4gMyAmJiByZCA9PSA0OTk5O1xuICAgIH0gZWxzZSB7XG4gICAgICByID0gKChyZXBlYXRpbmcgfHwgcm0gPCA0KSAmJiByZCArIDEgPT0gayB8fCAhcmVwZWF0aW5nICYmIHJtID4gMyAmJiByZCArIDEgPT0gayAvIDIpICYmIChkW2RpICsgMV0gLyBrIC8gMWUzIHwgMCkgPT0gbWF0aHBvdygxMCwgaSAtIDMpIC0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBjb252ZXJ0QmFzZShzdHIsIGJhc2VJbiwgYmFzZU91dCkge1xuICB2YXIgaiwgYXJyID0gWzBdLCBhcnJMLCBpID0gMCwgc3RyTCA9IHN0ci5sZW5ndGg7XG4gIGZvciAoOyBpIDwgc3RyTDsgKSB7XG4gICAgZm9yIChhcnJMID0gYXJyLmxlbmd0aDsgYXJyTC0tOyApXG4gICAgICBhcnJbYXJyTF0gKj0gYmFzZUluO1xuICAgIGFyclswXSArPSBOVU1FUkFMUy5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSk7XG4gICAgZm9yIChqID0gMDsgaiA8IGFyci5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFycltqXSA+IGJhc2VPdXQgLSAxKSB7XG4gICAgICAgIGlmIChhcnJbaiArIDFdID09PSB2b2lkIDApXG4gICAgICAgICAgYXJyW2ogKyAxXSA9IDA7XG4gICAgICAgIGFycltqICsgMV0gKz0gYXJyW2pdIC8gYmFzZU91dCB8IDA7XG4gICAgICAgIGFycltqXSAlPSBiYXNlT3V0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyLnJldmVyc2UoKTtcbn1cbmZ1bmN0aW9uIGNvc2luZShDdG9yLCB4KSB7XG4gIHZhciBrLCBsZW4sIHk7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiB4O1xuICBsZW4gPSB4LmQubGVuZ3RoO1xuICBpZiAobGVuIDwgMzIpIHtcbiAgICBrID0gTWF0aC5jZWlsKGxlbiAvIDMpO1xuICAgIHkgPSAoMSAvIHRpbnlQb3coNCwgaykpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgayA9IDE2O1xuICAgIHkgPSBcIjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTBcIjtcbiAgfVxuICBDdG9yLnByZWNpc2lvbiArPSBrO1xuICB4ID0gdGF5bG9yU2VyaWVzKEN0b3IsIDEsIHgudGltZXMoeSksIG5ldyBDdG9yKDEpKTtcbiAgZm9yICh2YXIgaSA9IGs7IGktLTsgKSB7XG4gICAgdmFyIGNvczJ4ID0geC50aW1lcyh4KTtcbiAgICB4ID0gY29zMngudGltZXMoY29zMngpLm1pbnVzKGNvczJ4KS50aW1lcyg4KS5wbHVzKDEpO1xuICB9XG4gIEN0b3IucHJlY2lzaW9uIC09IGs7XG4gIHJldHVybiB4O1xufVxudmFyIGRpdmlkZSA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBtdWx0aXBseUludGVnZXIoeCwgaywgYmFzZSkge1xuICAgIHZhciB0ZW1wLCBjYXJyeSA9IDAsIGkgPSB4Lmxlbmd0aDtcbiAgICBmb3IgKHggPSB4LnNsaWNlKCk7IGktLTsgKSB7XG4gICAgICB0ZW1wID0geFtpXSAqIGsgKyBjYXJyeTtcbiAgICAgIHhbaV0gPSB0ZW1wICUgYmFzZSB8IDA7XG4gICAgICBjYXJyeSA9IHRlbXAgLyBiYXNlIHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5KVxuICAgICAgeC51bnNoaWZ0KGNhcnJ5KTtcbiAgICByZXR1cm4geDtcbiAgfVxuICBmdW5jdGlvbiBjb21wYXJlKGEsIGIsIGFMLCBiTCkge1xuICAgIHZhciBpLCByO1xuICAgIGlmIChhTCAhPSBiTCkge1xuICAgICAgciA9IGFMID4gYkwgPyAxIDogLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IHIgPSAwOyBpIDwgYUw7IGkrKykge1xuICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSB7XG4gICAgICAgICAgciA9IGFbaV0gPiBiW2ldID8gMSA6IC0xO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRyYWN0MihhLCBiLCBhTCwgYmFzZSkge1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgYUwtLTsgKSB7XG4gICAgICBhW2FMXSAtPSBpO1xuICAgICAgaSA9IGFbYUxdIDwgYlthTF0gPyAxIDogMDtcbiAgICAgIGFbYUxdID0gaSAqIGJhc2UgKyBhW2FMXSAtIGJbYUxdO1xuICAgIH1cbiAgICBmb3IgKDsgIWFbMF0gJiYgYS5sZW5ndGggPiAxOyApXG4gICAgICBhLnNoaWZ0KCk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKHgsIHksIHByLCBybSwgZHAsIGJhc2UpIHtcbiAgICB2YXIgY21wLCBlLCBpLCBrLCBsb2dCYXNlLCBtb3JlLCBwcm9kLCBwcm9kTCwgcSwgcWQsIHJlbSwgcmVtTCwgcmVtMCwgc2QsIHQsIHhpLCB4TCwgeWQwLCB5TCwgeXosIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBzaWduMiA9IHgucyA9PSB5LnMgPyAxIDogLTEsIHhkID0geC5kLCB5ZCA9IHkuZDtcbiAgICBpZiAoIXhkIHx8ICF4ZFswXSB8fCAheWQgfHwgIXlkWzBdKSB7XG4gICAgICByZXR1cm4gbmV3IEN0b3IoXG4gICAgICAgIC8vIFJldHVybiBOYU4gaWYgZWl0aGVyIE5hTiwgb3IgYm90aCBJbmZpbml0eSBvciAwLlxuICAgICAgICAheC5zIHx8ICF5LnMgfHwgKHhkID8geWQgJiYgeGRbMF0gPT0geWRbMF0gOiAheWQpID8gTmFOIDogKFxuICAgICAgICAgIC8vIFJldHVybiBcdTAwQjEwIGlmIHggaXMgMCBvciB5IGlzIFx1MDBCMUluZmluaXR5LCBvciByZXR1cm4gXHUwMEIxSW5maW5pdHkgYXMgeSBpcyAwLlxuICAgICAgICAgIHhkICYmIHhkWzBdID09IDAgfHwgIXlkID8gc2lnbjIgKiAwIDogc2lnbjIgLyAwXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChiYXNlKSB7XG4gICAgICBsb2dCYXNlID0gMTtcbiAgICAgIGUgPSB4LmUgLSB5LmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UgPSBCQVNFO1xuICAgICAgbG9nQmFzZSA9IExPR19CQVNFO1xuICAgICAgZSA9IG1hdGhmbG9vcih4LmUgLyBsb2dCYXNlKSAtIG1hdGhmbG9vcih5LmUgLyBsb2dCYXNlKTtcbiAgICB9XG4gICAgeUwgPSB5ZC5sZW5ndGg7XG4gICAgeEwgPSB4ZC5sZW5ndGg7XG4gICAgcSA9IG5ldyBDdG9yKHNpZ24yKTtcbiAgICBxZCA9IHEuZCA9IFtdO1xuICAgIGZvciAoaSA9IDA7IHlkW2ldID09ICh4ZFtpXSB8fCAwKTsgaSsrKVxuICAgICAgO1xuICAgIGlmICh5ZFtpXSA+ICh4ZFtpXSB8fCAwKSlcbiAgICAgIGUtLTtcbiAgICBpZiAocHIgPT0gbnVsbCkge1xuICAgICAgc2QgPSBwciA9IEN0b3IucHJlY2lzaW9uO1xuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIH0gZWxzZSBpZiAoZHApIHtcbiAgICAgIHNkID0gcHIgKyAoeC5lIC0geS5lKSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNkID0gcHI7XG4gICAgfVxuICAgIGlmIChzZCA8IDApIHtcbiAgICAgIHFkLnB1c2goMSk7XG4gICAgICBtb3JlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2QgPSBzZCAvIGxvZ0Jhc2UgKyAyIHwgMDtcbiAgICAgIGkgPSAwO1xuICAgICAgaWYgKHlMID09IDEpIHtcbiAgICAgICAgayA9IDA7XG4gICAgICAgIHlkID0geWRbMF07XG4gICAgICAgIHNkKys7XG4gICAgICAgIGZvciAoOyAoaSA8IHhMIHx8IGspICYmIHNkLS07IGkrKykge1xuICAgICAgICAgIHQgPSBrICogYmFzZSArICh4ZFtpXSB8fCAwKTtcbiAgICAgICAgICBxZFtpXSA9IHQgLyB5ZCB8IDA7XG4gICAgICAgICAgayA9IHQgJSB5ZCB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgbW9yZSA9IGsgfHwgaSA8IHhMO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgayA9IGJhc2UgLyAoeWRbMF0gKyAxKSB8IDA7XG4gICAgICAgIGlmIChrID4gMSkge1xuICAgICAgICAgIHlkID0gbXVsdGlwbHlJbnRlZ2VyKHlkLCBrLCBiYXNlKTtcbiAgICAgICAgICB4ZCA9IG11bHRpcGx5SW50ZWdlcih4ZCwgaywgYmFzZSk7XG4gICAgICAgICAgeUwgPSB5ZC5sZW5ndGg7XG4gICAgICAgICAgeEwgPSB4ZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgeGkgPSB5TDtcbiAgICAgICAgcmVtID0geGQuc2xpY2UoMCwgeUwpO1xuICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IHJlbUwgPCB5TDsgKVxuICAgICAgICAgIHJlbVtyZW1MKytdID0gMDtcbiAgICAgICAgeXogPSB5ZC5zbGljZSgpO1xuICAgICAgICB5ei51bnNoaWZ0KDApO1xuICAgICAgICB5ZDAgPSB5ZFswXTtcbiAgICAgICAgaWYgKHlkWzFdID49IGJhc2UgLyAyKVxuICAgICAgICAgICsreWQwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgayA9IDA7XG4gICAgICAgICAgY21wID0gY29tcGFyZSh5ZCwgcmVtLCB5TCwgcmVtTCk7XG4gICAgICAgICAgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgIHJlbTAgPSByZW1bMF07XG4gICAgICAgICAgICBpZiAoeUwgIT0gcmVtTClcbiAgICAgICAgICAgICAgcmVtMCA9IHJlbTAgKiBiYXNlICsgKHJlbVsxXSB8fCAwKTtcbiAgICAgICAgICAgIGsgPSByZW0wIC8geWQwIHwgMDtcbiAgICAgICAgICAgIGlmIChrID4gMSkge1xuICAgICAgICAgICAgICBpZiAoayA+PSBiYXNlKVxuICAgICAgICAgICAgICAgIGsgPSBiYXNlIC0gMTtcbiAgICAgICAgICAgICAgcHJvZCA9IG11bHRpcGx5SW50ZWdlcih5ZCwgaywgYmFzZSk7XG4gICAgICAgICAgICAgIHByb2RMID0gcHJvZC5sZW5ndGg7XG4gICAgICAgICAgICAgIHJlbUwgPSByZW0ubGVuZ3RoO1xuICAgICAgICAgICAgICBjbXAgPSBjb21wYXJlKHByb2QsIHJlbSwgcHJvZEwsIHJlbUwpO1xuICAgICAgICAgICAgICBpZiAoY21wID09IDEpIHtcbiAgICAgICAgICAgICAgICBrLS07XG4gICAgICAgICAgICAgICAgc3VidHJhY3QyKHByb2QsIHlMIDwgcHJvZEwgPyB5eiA6IHlkLCBwcm9kTCwgYmFzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChrID09IDApXG4gICAgICAgICAgICAgICAgY21wID0gayA9IDE7XG4gICAgICAgICAgICAgIHByb2QgPSB5ZC5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZEwgPSBwcm9kLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwcm9kTCA8IHJlbUwpXG4gICAgICAgICAgICAgIHByb2QudW5zaGlmdCgwKTtcbiAgICAgICAgICAgIHN1YnRyYWN0MihyZW0sIHByb2QsIHJlbUwsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkge1xuICAgICAgICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgICAgICAgY21wID0gY29tcGFyZSh5ZCwgcmVtLCB5TCwgcmVtTCk7XG4gICAgICAgICAgICAgIGlmIChjbXAgPCAxKSB7XG4gICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIHN1YnRyYWN0MihyZW0sIHlMIDwgcmVtTCA/IHl6IDogeWQsIHJlbUwsIGJhc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgcmVtID0gWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxZFtpKytdID0gaztcbiAgICAgICAgICBpZiAoY21wICYmIHJlbVswXSkge1xuICAgICAgICAgICAgcmVtW3JlbUwrK10gPSB4ZFt4aV0gfHwgMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtID0gW3hkW3hpXV07XG4gICAgICAgICAgICByZW1MID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCh4aSsrIDwgeEwgfHwgcmVtWzBdICE9PSB2b2lkIDApICYmIHNkLS0pO1xuICAgICAgICBtb3JlID0gcmVtWzBdICE9PSB2b2lkIDA7XG4gICAgICB9XG4gICAgICBpZiAoIXFkWzBdKVxuICAgICAgICBxZC5zaGlmdCgpO1xuICAgIH1cbiAgICBpZiAobG9nQmFzZSA9PSAxKSB7XG4gICAgICBxLmUgPSBlO1xuICAgICAgaW5leGFjdCA9IG1vcmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDEsIGsgPSBxZFswXTsgayA+PSAxMDsgayAvPSAxMClcbiAgICAgICAgaSsrO1xuICAgICAgcS5lID0gaSArIGUgKiBsb2dCYXNlIC0gMTtcbiAgICAgIGZpbmFsaXNlKHEsIGRwID8gcHIgKyBxLmUgKyAxIDogcHIsIHJtLCBtb3JlKTtcbiAgICB9XG4gICAgcmV0dXJuIHE7XG4gIH07XG59KCk7XG5mdW5jdGlvbiBmaW5hbGlzZSh4LCBzZCwgcm0sIGlzVHJ1bmNhdGVkKSB7XG4gIHZhciBkaWdpdHMsIGksIGosIGssIHJkLCByb3VuZFVwLCB3LCB4ZCwgeGRpLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgb3V0OlxuICAgIGlmIChzZCAhPSBudWxsKSB7XG4gICAgICB4ZCA9IHguZDtcbiAgICAgIGlmICgheGQpXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgZm9yIChkaWdpdHMgPSAxLCBrID0geGRbMF07IGsgPj0gMTA7IGsgLz0gMTApXG4gICAgICAgIGRpZ2l0cysrO1xuICAgICAgaSA9IHNkIC0gZGlnaXRzO1xuICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgICAgIGogPSBzZDtcbiAgICAgICAgdyA9IHhkW3hkaSA9IDBdO1xuICAgICAgICByZCA9IHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkgJSAxMCB8IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ZGkgPSBNYXRoLmNlaWwoKGkgKyAxKSAvIExPR19CQVNFKTtcbiAgICAgICAgayA9IHhkLmxlbmd0aDtcbiAgICAgICAgaWYgKHhkaSA+PSBrKSB7XG4gICAgICAgICAgaWYgKGlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBmb3IgKDsgaysrIDw9IHhkaTsgKVxuICAgICAgICAgICAgICB4ZC5wdXNoKDApO1xuICAgICAgICAgICAgdyA9IHJkID0gMDtcbiAgICAgICAgICAgIGRpZ2l0cyA9IDE7XG4gICAgICAgICAgICBpICU9IExPR19CQVNFO1xuICAgICAgICAgICAgaiA9IGkgLSBMT0dfQkFTRSArIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrIG91dDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdyA9IGsgPSB4ZFt4ZGldO1xuICAgICAgICAgIGZvciAoZGlnaXRzID0gMTsgayA+PSAxMDsgayAvPSAxMClcbiAgICAgICAgICAgIGRpZ2l0cysrO1xuICAgICAgICAgIGkgJT0gTE9HX0JBU0U7XG4gICAgICAgICAgaiA9IGkgLSBMT0dfQkFTRSArIGRpZ2l0cztcbiAgICAgICAgICByZCA9IGogPCAwID8gMCA6IHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkgJSAxMCB8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlzVHJ1bmNhdGVkID0gaXNUcnVuY2F0ZWQgfHwgc2QgPCAwIHx8IHhkW3hkaSArIDFdICE9PSB2b2lkIDAgfHwgKGogPCAwID8gdyA6IHcgJSBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkpO1xuICAgICAgcm91bmRVcCA9IHJtIDwgNCA/IChyZCB8fCBpc1RydW5jYXRlZCkgJiYgKHJtID09IDAgfHwgcm0gPT0gKHgucyA8IDAgPyAzIDogMikpIDogcmQgPiA1IHx8IHJkID09IDUgJiYgKHJtID09IDQgfHwgaXNUcnVuY2F0ZWQgfHwgcm0gPT0gNiAmJiAvLyBDaGVjayB3aGV0aGVyIHRoZSBkaWdpdCB0byB0aGUgbGVmdCBvZiB0aGUgcm91bmRpbmcgZGlnaXQgaXMgb2RkLlxuICAgICAgKGkgPiAwID8gaiA+IDAgPyB3IC8gbWF0aHBvdygxMCwgZGlnaXRzIC0gaikgOiAwIDogeGRbeGRpIC0gMV0pICUgMTAgJiAxIHx8IHJtID09ICh4LnMgPCAwID8gOCA6IDcpKTtcbiAgICAgIGlmIChzZCA8IDEgfHwgIXhkWzBdKSB7XG4gICAgICAgIHhkLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgICAgc2QgLT0geC5lICsgMTtcbiAgICAgICAgICB4ZFswXSA9IG1hdGhwb3coMTAsIChMT0dfQkFTRSAtIHNkICUgTE9HX0JBU0UpICUgTE9HX0JBU0UpO1xuICAgICAgICAgIHguZSA9IC1zZCB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHhkWzBdID0geC5lID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgeGQubGVuZ3RoID0geGRpO1xuICAgICAgICBrID0gMTtcbiAgICAgICAgeGRpLS07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ZC5sZW5ndGggPSB4ZGkgKyAxO1xuICAgICAgICBrID0gbWF0aHBvdygxMCwgTE9HX0JBU0UgLSBpKTtcbiAgICAgICAgeGRbeGRpXSA9IGogPiAwID8gKHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqKSAlIG1hdGhwb3coMTAsIGopIHwgMCkgKiBrIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgIGZvciAoOyA7ICkge1xuICAgICAgICAgIGlmICh4ZGkgPT0gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMSwgaiA9IHhkWzBdOyBqID49IDEwOyBqIC89IDEwKVxuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqID0geGRbMF0gKz0gaztcbiAgICAgICAgICAgIGZvciAoayA9IDE7IGogPj0gMTA7IGogLz0gMTApXG4gICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgIGlmIChpICE9IGspIHtcbiAgICAgICAgICAgICAgeC5lKys7XG4gICAgICAgICAgICAgIGlmICh4ZFswXSA9PSBCQVNFKVxuICAgICAgICAgICAgICAgIHhkWzBdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4ZFt4ZGldICs9IGs7XG4gICAgICAgICAgICBpZiAoeGRbeGRpXSAhPSBCQVNFKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHhkW3hkaS0tXSA9IDA7XG4gICAgICAgICAgICBrID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IHhkLmxlbmd0aDsgeGRbLS1pXSA9PT0gMDsgKVxuICAgICAgICB4ZC5wb3AoKTtcbiAgICB9XG4gIGlmIChleHRlcm5hbCkge1xuICAgIGlmICh4LmUgPiBDdG9yLm1heEUpIHtcbiAgICAgIHguZCA9IG51bGw7XG4gICAgICB4LmUgPSBOYU47XG4gICAgfSBlbHNlIGlmICh4LmUgPCBDdG9yLm1pbkUpIHtcbiAgICAgIHguZSA9IDA7XG4gICAgICB4LmQgPSBbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiB4O1xufVxuZnVuY3Rpb24gZmluaXRlVG9TdHJpbmcoeCwgaXNFeHAsIHNkKSB7XG4gIGlmICgheC5pc0Zpbml0ZSgpKVxuICAgIHJldHVybiBub25GaW5pdGVUb1N0cmluZyh4KTtcbiAgdmFyIGssIGUgPSB4LmUsIHN0ciA9IGRpZ2l0c1RvU3RyaW5nKHguZCksIGxlbiA9IHN0ci5sZW5ndGg7XG4gIGlmIChpc0V4cCkge1xuICAgIGlmIChzZCAmJiAoayA9IHNkIC0gbGVuKSA+IDApIHtcbiAgICAgIHN0ciA9IHN0ci5jaGFyQXQoMCkgKyBcIi5cIiArIHN0ci5zbGljZSgxKSArIGdldFplcm9TdHJpbmcoayk7XG4gICAgfSBlbHNlIGlmIChsZW4gPiAxKSB7XG4gICAgICBzdHIgPSBzdHIuY2hhckF0KDApICsgXCIuXCIgKyBzdHIuc2xpY2UoMSk7XG4gICAgfVxuICAgIHN0ciA9IHN0ciArICh4LmUgPCAwID8gXCJlXCIgOiBcImUrXCIpICsgeC5lO1xuICB9IGVsc2UgaWYgKGUgPCAwKSB7XG4gICAgc3RyID0gXCIwLlwiICsgZ2V0WmVyb1N0cmluZygtZSAtIDEpICsgc3RyO1xuICAgIGlmIChzZCAmJiAoayA9IHNkIC0gbGVuKSA+IDApXG4gICAgICBzdHIgKz0gZ2V0WmVyb1N0cmluZyhrKTtcbiAgfSBlbHNlIGlmIChlID49IGxlbikge1xuICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGUgKyAxIC0gbGVuKTtcbiAgICBpZiAoc2QgJiYgKGsgPSBzZCAtIGUgLSAxKSA+IDApXG4gICAgICBzdHIgPSBzdHIgKyBcIi5cIiArIGdldFplcm9TdHJpbmcoayk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKChrID0gZSArIDEpIDwgbGVuKVxuICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIGspICsgXCIuXCIgKyBzdHIuc2xpY2Uoayk7XG4gICAgaWYgKHNkICYmIChrID0gc2QgLSBsZW4pID4gMCkge1xuICAgICAgaWYgKGUgKyAxID09PSBsZW4pXG4gICAgICAgIHN0ciArPSBcIi5cIjtcbiAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gZ2V0QmFzZTEwRXhwb25lbnQoZGlnaXRzLCBlKSB7XG4gIHZhciB3ID0gZGlnaXRzWzBdO1xuICBmb3IgKGUgKj0gTE9HX0JBU0U7IHcgPj0gMTA7IHcgLz0gMTApXG4gICAgZSsrO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIGdldExuMTAoQ3Rvciwgc2QsIHByKSB7XG4gIGlmIChzZCA+IExOMTBfUFJFQ0lTSU9OKSB7XG4gICAgZXh0ZXJuYWwgPSB0cnVlO1xuICAgIGlmIChwcilcbiAgICAgIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gICAgdGhyb3cgRXJyb3IocHJlY2lzaW9uTGltaXRFeGNlZWRlZCk7XG4gIH1cbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKExOMTApLCBzZCwgMSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBnZXRQaShDdG9yLCBzZCwgcm0pIHtcbiAgaWYgKHNkID4gUElfUFJFQ0lTSU9OKVxuICAgIHRocm93IEVycm9yKHByZWNpc2lvbkxpbWl0RXhjZWVkZWQpO1xuICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoUEkpLCBzZCwgcm0sIHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0UHJlY2lzaW9uKGRpZ2l0cykge1xuICB2YXIgdyA9IGRpZ2l0cy5sZW5ndGggLSAxLCBsZW4gPSB3ICogTE9HX0JBU0UgKyAxO1xuICB3ID0gZGlnaXRzW3ddO1xuICBpZiAodykge1xuICAgIGZvciAoOyB3ICUgMTAgPT0gMDsgdyAvPSAxMClcbiAgICAgIGxlbi0tO1xuICAgIGZvciAodyA9IGRpZ2l0c1swXTsgdyA+PSAxMDsgdyAvPSAxMClcbiAgICAgIGxlbisrO1xuICB9XG4gIHJldHVybiBsZW47XG59XG5mdW5jdGlvbiBnZXRaZXJvU3RyaW5nKGspIHtcbiAgdmFyIHpzID0gXCJcIjtcbiAgZm9yICg7IGstLTsgKVxuICAgIHpzICs9IFwiMFwiO1xuICByZXR1cm4genM7XG59XG5mdW5jdGlvbiBpbnRQb3coQ3RvciwgeCwgbiwgcHIpIHtcbiAgdmFyIGlzVHJ1bmNhdGVkLCByID0gbmV3IEN0b3IoMSksIGsgPSBNYXRoLmNlaWwocHIgLyBMT0dfQkFTRSArIDQpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBmb3IgKDsgOyApIHtcbiAgICBpZiAobiAlIDIpIHtcbiAgICAgIHIgPSByLnRpbWVzKHgpO1xuICAgICAgaWYgKHRydW5jYXRlKHIuZCwgaykpXG4gICAgICAgIGlzVHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgbiA9IG1hdGhmbG9vcihuIC8gMik7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIG4gPSByLmQubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpc1RydW5jYXRlZCAmJiByLmRbbl0gPT09IDApXG4gICAgICAgICsrci5kW25dO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHggPSB4LnRpbWVzKHgpO1xuICAgIHRydW5jYXRlKHguZCwgayk7XG4gIH1cbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIGlzT2RkKG4pIHtcbiAgcmV0dXJuIG4uZFtuLmQubGVuZ3RoIC0gMV0gJiAxO1xufVxuZnVuY3Rpb24gbWF4T3JNaW4oQ3RvciwgYXJncywgbHRndCkge1xuICB2YXIgeSwgeCA9IG5ldyBDdG9yKGFyZ3NbMF0pLCBpID0gMDtcbiAgZm9yICg7ICsraSA8IGFyZ3MubGVuZ3RoOyApIHtcbiAgICB5ID0gbmV3IEN0b3IoYXJnc1tpXSk7XG4gICAgaWYgKCF5LnMpIHtcbiAgICAgIHggPSB5O1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh4W2x0Z3RdKHkpKSB7XG4gICAgICB4ID0geTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBuYXR1cmFsRXhwb25lbnRpYWwoeCwgc2QpIHtcbiAgdmFyIGRlbm9taW5hdG9yLCBndWFyZCwgaiwgcG93Mywgc3VtMiwgdCwgd3ByLCByZXAgPSAwLCBpID0gMCwgayA9IDAsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBybSA9IEN0b3Iucm91bmRpbmcsIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIGlmICgheC5kIHx8ICF4LmRbMF0gfHwgeC5lID4gMTcpIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5kID8gIXguZFswXSA/IDEgOiB4LnMgPCAwID8gMCA6IDEgLyAwIDogeC5zID8geC5zIDwgMCA/IDAgOiB4IDogMCAvIDApO1xuICB9XG4gIGlmIChzZCA9PSBudWxsKSB7XG4gICAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgICB3cHIgPSBwcjtcbiAgfSBlbHNlIHtcbiAgICB3cHIgPSBzZDtcbiAgfVxuICB0ID0gbmV3IEN0b3IoMC4wMzEyNSk7XG4gIHdoaWxlICh4LmUgPiAtMikge1xuICAgIHggPSB4LnRpbWVzKHQpO1xuICAgIGsgKz0gNTtcbiAgfVxuICBndWFyZCA9IE1hdGgubG9nKG1hdGhwb3coMiwgaykpIC8gTWF0aC5MTjEwICogMiArIDUgfCAwO1xuICB3cHIgKz0gZ3VhcmQ7XG4gIGRlbm9taW5hdG9yID0gcG93MyA9IHN1bTIgPSBuZXcgQ3RvcigxKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSB3cHI7XG4gIGZvciAoOyA7ICkge1xuICAgIHBvdzMgPSBmaW5hbGlzZShwb3czLnRpbWVzKHgpLCB3cHIsIDEpO1xuICAgIGRlbm9taW5hdG9yID0gZGVub21pbmF0b3IudGltZXMoKytpKTtcbiAgICB0ID0gc3VtMi5wbHVzKGRpdmlkZShwb3czLCBkZW5vbWluYXRvciwgd3ByLCAxKSk7XG4gICAgaWYgKGRpZ2l0c1RvU3RyaW5nKHQuZCkuc2xpY2UoMCwgd3ByKSA9PT0gZGlnaXRzVG9TdHJpbmcoc3VtMi5kKS5zbGljZSgwLCB3cHIpKSB7XG4gICAgICBqID0gaztcbiAgICAgIHdoaWxlIChqLS0pXG4gICAgICAgIHN1bTIgPSBmaW5hbGlzZShzdW0yLnRpbWVzKHN1bTIpLCB3cHIsIDEpO1xuICAgICAgaWYgKHNkID09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlcCA8IDMgJiYgY2hlY2tSb3VuZGluZ0RpZ2l0cyhzdW0yLmQsIHdwciAtIGd1YXJkLCBybSwgcmVwKSkge1xuICAgICAgICAgIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IDEwO1xuICAgICAgICAgIGRlbm9taW5hdG9yID0gcG93MyA9IHQgPSBuZXcgQ3RvcigxKTtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICByZXArKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmluYWxpc2Uoc3VtMiwgQ3Rvci5wcmVjaXNpb24gPSBwciwgcm0sIGV4dGVybmFsID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gICAgICAgIHJldHVybiBzdW0yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdW0yID0gdDtcbiAgfVxufVxuZnVuY3Rpb24gbmF0dXJhbExvZ2FyaXRobSh5LCBzZCkge1xuICB2YXIgYywgYzAsIGRlbm9taW5hdG9yLCBlLCBudW1lcmF0b3IsIHJlcCwgc3VtMiwgdCwgd3ByLCB4MSwgeDIsIG4gPSAxLCBndWFyZCA9IDEwLCB4ID0geSwgeGQgPSB4LmQsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBybSA9IEN0b3Iucm91bmRpbmcsIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIGlmICh4LnMgPCAwIHx8ICF4ZCB8fCAheGRbMF0gfHwgIXguZSAmJiB4ZFswXSA9PSAxICYmIHhkLmxlbmd0aCA9PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHhkICYmICF4ZFswXSA/IC0xIC8gMCA6IHgucyAhPSAxID8gTmFOIDogeGQgPyAwIDogeCk7XG4gIH1cbiAgaWYgKHNkID09IG51bGwpIHtcbiAgICBleHRlcm5hbCA9IGZhbHNlO1xuICAgIHdwciA9IHByO1xuICB9IGVsc2Uge1xuICAgIHdwciA9IHNkO1xuICB9XG4gIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IGd1YXJkO1xuICBjID0gZGlnaXRzVG9TdHJpbmcoeGQpO1xuICBjMCA9IGMuY2hhckF0KDApO1xuICBpZiAoTWF0aC5hYnMoZSA9IHguZSkgPCAxNWUxNCkge1xuICAgIHdoaWxlIChjMCA8IDcgJiYgYzAgIT0gMSB8fCBjMCA9PSAxICYmIGMuY2hhckF0KDEpID4gMykge1xuICAgICAgeCA9IHgudGltZXMoeSk7XG4gICAgICBjID0gZGlnaXRzVG9TdHJpbmcoeC5kKTtcbiAgICAgIGMwID0gYy5jaGFyQXQoMCk7XG4gICAgICBuKys7XG4gICAgfVxuICAgIGUgPSB4LmU7XG4gICAgaWYgKGMwID4gMSkge1xuICAgICAgeCA9IG5ldyBDdG9yKFwiMC5cIiArIGMpO1xuICAgICAgZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gbmV3IEN0b3IoYzAgKyBcIi5cIiArIGMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0ID0gZ2V0TG4xMChDdG9yLCB3cHIgKyAyLCBwcikudGltZXMoZSArIFwiXCIpO1xuICAgIHggPSBuYXR1cmFsTG9nYXJpdGhtKG5ldyBDdG9yKGMwICsgXCIuXCIgKyBjLnNsaWNlKDEpKSwgd3ByIC0gZ3VhcmQpLnBsdXModCk7XG4gICAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgICByZXR1cm4gc2QgPT0gbnVsbCA/IGZpbmFsaXNlKHgsIHByLCBybSwgZXh0ZXJuYWwgPSB0cnVlKSA6IHg7XG4gIH1cbiAgeDEgPSB4O1xuICBzdW0yID0gbnVtZXJhdG9yID0geCA9IGRpdmlkZSh4Lm1pbnVzKDEpLCB4LnBsdXMoMSksIHdwciwgMSk7XG4gIHgyID0gZmluYWxpc2UoeC50aW1lcyh4KSwgd3ByLCAxKTtcbiAgZGVub21pbmF0b3IgPSAzO1xuICBmb3IgKDsgOyApIHtcbiAgICBudW1lcmF0b3IgPSBmaW5hbGlzZShudW1lcmF0b3IudGltZXMoeDIpLCB3cHIsIDEpO1xuICAgIHQgPSBzdW0yLnBsdXMoZGl2aWRlKG51bWVyYXRvciwgbmV3IEN0b3IoZGVub21pbmF0b3IpLCB3cHIsIDEpKTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCB3cHIpID09PSBkaWdpdHNUb1N0cmluZyhzdW0yLmQpLnNsaWNlKDAsIHdwcikpIHtcbiAgICAgIHN1bTIgPSBzdW0yLnRpbWVzKDIpO1xuICAgICAgaWYgKGUgIT09IDApXG4gICAgICAgIHN1bTIgPSBzdW0yLnBsdXMoZ2V0TG4xMChDdG9yLCB3cHIgKyAyLCBwcikudGltZXMoZSArIFwiXCIpKTtcbiAgICAgIHN1bTIgPSBkaXZpZGUoc3VtMiwgbmV3IEN0b3IobiksIHdwciwgMSk7XG4gICAgICBpZiAoc2QgPT0gbnVsbCkge1xuICAgICAgICBpZiAoY2hlY2tSb3VuZGluZ0RpZ2l0cyhzdW0yLmQsIHdwciAtIGd1YXJkLCBybSwgcmVwKSkge1xuICAgICAgICAgIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IGd1YXJkO1xuICAgICAgICAgIHQgPSBudW1lcmF0b3IgPSB4ID0gZGl2aWRlKHgxLm1pbnVzKDEpLCB4MS5wbHVzKDEpLCB3cHIsIDEpO1xuICAgICAgICAgIHgyID0gZmluYWxpc2UoeC50aW1lcyh4KSwgd3ByLCAxKTtcbiAgICAgICAgICBkZW5vbWluYXRvciA9IHJlcCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmFsaXNlKHN1bTIsIEN0b3IucHJlY2lzaW9uID0gcHIsIHJtLCBleHRlcm5hbCA9IHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICAgICAgICByZXR1cm4gc3VtMjtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtMiA9IHQ7XG4gICAgZGVub21pbmF0b3IgKz0gMjtcbiAgfVxufVxuZnVuY3Rpb24gbm9uRmluaXRlVG9TdHJpbmcoeCkge1xuICByZXR1cm4gU3RyaW5nKHgucyAqIHgucyAvIDApO1xufVxuZnVuY3Rpb24gcGFyc2VEZWNpbWFsKHgsIHN0cikge1xuICB2YXIgZSwgaSwgbGVuO1xuICBpZiAoKGUgPSBzdHIuaW5kZXhPZihcIi5cIikpID4gLTEpXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoXCIuXCIsIFwiXCIpO1xuICBpZiAoKGkgPSBzdHIuc2VhcmNoKC9lL2kpKSA+IDApIHtcbiAgICBpZiAoZSA8IDApXG4gICAgICBlID0gaTtcbiAgICBlICs9ICtzdHIuc2xpY2UoaSArIDEpO1xuICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaSk7XG4gIH0gZWxzZSBpZiAoZSA8IDApIHtcbiAgICBlID0gc3RyLmxlbmd0aDtcbiAgfVxuICBmb3IgKGkgPSAwOyBzdHIuY2hhckNvZGVBdChpKSA9PT0gNDg7IGkrKylcbiAgICA7XG4gIGZvciAobGVuID0gc3RyLmxlbmd0aDsgc3RyLmNoYXJDb2RlQXQobGVuIC0gMSkgPT09IDQ4OyAtLWxlbilcbiAgICA7XG4gIHN0ciA9IHN0ci5zbGljZShpLCBsZW4pO1xuICBpZiAoc3RyKSB7XG4gICAgbGVuIC09IGk7XG4gICAgeC5lID0gZSA9IGUgLSBpIC0gMTtcbiAgICB4LmQgPSBbXTtcbiAgICBpID0gKGUgKyAxKSAlIExPR19CQVNFO1xuICAgIGlmIChlIDwgMClcbiAgICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgIGlmIChpKVxuICAgICAgICB4LmQucHVzaCgrc3RyLnNsaWNlKDAsIGkpKTtcbiAgICAgIGZvciAobGVuIC09IExPR19CQVNFOyBpIDwgbGVuOyApXG4gICAgICAgIHguZC5wdXNoKCtzdHIuc2xpY2UoaSwgaSArPSBMT0dfQkFTRSkpO1xuICAgICAgc3RyID0gc3RyLnNsaWNlKGkpO1xuICAgICAgaSA9IExPR19CQVNFIC0gc3RyLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgaSAtPSBsZW47XG4gICAgfVxuICAgIGZvciAoOyBpLS07IClcbiAgICAgIHN0ciArPSBcIjBcIjtcbiAgICB4LmQucHVzaCgrc3RyKTtcbiAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgIGlmICh4LmUgPiB4LmNvbnN0cnVjdG9yLm1heEUpIHtcbiAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgeC5lID0gTmFOO1xuICAgICAgfSBlbHNlIGlmICh4LmUgPCB4LmNvbnN0cnVjdG9yLm1pbkUpIHtcbiAgICAgICAgeC5lID0gMDtcbiAgICAgICAgeC5kID0gWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB4LmUgPSAwO1xuICAgIHguZCA9IFswXTtcbiAgfVxuICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIHBhcnNlT3RoZXIoeCwgc3RyKSB7XG4gIHZhciBiYXNlLCBDdG9yLCBkaXZpc29yLCBpLCBpc0Zsb2F0LCBsZW4sIHAsIHhkLCB4ZTtcbiAgaWYgKHN0ci5pbmRleE9mKFwiX1wiKSA+IC0xKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoLyhcXGQpXyg/PVxcZCkvZywgXCIkMVwiKTtcbiAgICBpZiAoaXNEZWNpbWFsLnRlc3Qoc3RyKSlcbiAgICAgIHJldHVybiBwYXJzZURlY2ltYWwoeCwgc3RyKTtcbiAgfSBlbHNlIGlmIChzdHIgPT09IFwiSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiTmFOXCIpIHtcbiAgICBpZiAoIStzdHIpXG4gICAgICB4LnMgPSBOYU47XG4gICAgeC5lID0gTmFOO1xuICAgIHguZCA9IG51bGw7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgaWYgKGlzSGV4LnRlc3Qoc3RyKSkge1xuICAgIGJhc2UgPSAxNjtcbiAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChpc0JpbmFyeS50ZXN0KHN0cikpIHtcbiAgICBiYXNlID0gMjtcbiAgfSBlbHNlIGlmIChpc09jdGFsLnRlc3Qoc3RyKSkge1xuICAgIGJhc2UgPSA4O1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIHN0cik7XG4gIH1cbiAgaSA9IHN0ci5zZWFyY2goL3AvaSk7XG4gIGlmIChpID4gMCkge1xuICAgIHAgPSArc3RyLnNsaWNlKGkgKyAxKTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDIsIGkpO1xuICB9IGVsc2Uge1xuICAgIHN0ciA9IHN0ci5zbGljZSgyKTtcbiAgfVxuICBpID0gc3RyLmluZGV4T2YoXCIuXCIpO1xuICBpc0Zsb2F0ID0gaSA+PSAwO1xuICBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzRmxvYXQpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShcIi5cIiwgXCJcIik7XG4gICAgbGVuID0gc3RyLmxlbmd0aDtcbiAgICBpID0gbGVuIC0gaTtcbiAgICBkaXZpc29yID0gaW50UG93KEN0b3IsIG5ldyBDdG9yKGJhc2UpLCBpLCBpICogMik7XG4gIH1cbiAgeGQgPSBjb252ZXJ0QmFzZShzdHIsIGJhc2UsIEJBU0UpO1xuICB4ZSA9IHhkLmxlbmd0aCAtIDE7XG4gIGZvciAoaSA9IHhlOyB4ZFtpXSA9PT0gMDsgLS1pKVxuICAgIHhkLnBvcCgpO1xuICBpZiAoaSA8IDApXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgucyAqIDApO1xuICB4LmUgPSBnZXRCYXNlMTBFeHBvbmVudCh4ZCwgeGUpO1xuICB4LmQgPSB4ZDtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgaWYgKGlzRmxvYXQpXG4gICAgeCA9IGRpdmlkZSh4LCBkaXZpc29yLCBsZW4gKiA0KTtcbiAgaWYgKHApXG4gICAgeCA9IHgudGltZXMoTWF0aC5hYnMocCkgPCA1NCA/IG1hdGhwb3coMiwgcCkgOiBEZWNpbWFsLnBvdygyLCBwKSk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBzaW5lKEN0b3IsIHgpIHtcbiAgdmFyIGssIGxlbiA9IHguZC5sZW5ndGg7XG4gIGlmIChsZW4gPCAzKSB7XG4gICAgcmV0dXJuIHguaXNaZXJvKCkgPyB4IDogdGF5bG9yU2VyaWVzKEN0b3IsIDIsIHgsIHgpO1xuICB9XG4gIGsgPSAxLjQgKiBNYXRoLnNxcnQobGVuKTtcbiAgayA9IGsgPiAxNiA/IDE2IDogayB8IDA7XG4gIHggPSB4LnRpbWVzKDEgLyB0aW55UG93KDUsIGspKTtcbiAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAyLCB4LCB4KTtcbiAgdmFyIHNpbjJfeCwgZDUgPSBuZXcgQ3Rvcig1KSwgZDE2ID0gbmV3IEN0b3IoMTYpLCBkMjAgPSBuZXcgQ3RvcigyMCk7XG4gIGZvciAoOyBrLS07ICkge1xuICAgIHNpbjJfeCA9IHgudGltZXMoeCk7XG4gICAgeCA9IHgudGltZXMoZDUucGx1cyhzaW4yX3gudGltZXMoZDE2LnRpbWVzKHNpbjJfeCkubWludXMoZDIwKSkpKTtcbiAgfVxuICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIHRheWxvclNlcmllcyhDdG9yLCBuLCB4LCB5LCBpc0h5cGVyYm9saWMpIHtcbiAgdmFyIGosIHQsIHUsIHgyLCBpID0gMSwgcHIgPSBDdG9yLnByZWNpc2lvbiwgayA9IE1hdGguY2VpbChwciAvIExPR19CQVNFKTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgeDIgPSB4LnRpbWVzKHgpO1xuICB1ID0gbmV3IEN0b3IoeSk7XG4gIGZvciAoOyA7ICkge1xuICAgIHQgPSBkaXZpZGUodS50aW1lcyh4MiksIG5ldyBDdG9yKG4rKyAqIG4rKyksIHByLCAxKTtcbiAgICB1ID0gaXNIeXBlcmJvbGljID8geS5wbHVzKHQpIDogeS5taW51cyh0KTtcbiAgICB5ID0gZGl2aWRlKHQudGltZXMoeDIpLCBuZXcgQ3RvcihuKysgKiBuKyspLCBwciwgMSk7XG4gICAgdCA9IHUucGx1cyh5KTtcbiAgICBpZiAodC5kW2tdICE9PSB2b2lkIDApIHtcbiAgICAgIGZvciAoaiA9IGs7IHQuZFtqXSA9PT0gdS5kW2pdICYmIGotLTsgKVxuICAgICAgICA7XG4gICAgICBpZiAoaiA9PSAtMSlcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGogPSB1O1xuICAgIHUgPSB5O1xuICAgIHkgPSB0O1xuICAgIHQgPSBqO1xuICAgIGkrKztcbiAgfVxuICBleHRlcm5hbCA9IHRydWU7XG4gIHQuZC5sZW5ndGggPSBrICsgMTtcbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiB0aW55UG93KGIsIGUpIHtcbiAgdmFyIG4gPSBiO1xuICB3aGlsZSAoLS1lKVxuICAgIG4gKj0gYjtcbiAgcmV0dXJuIG47XG59XG5mdW5jdGlvbiB0b0xlc3NUaGFuSGFsZlBpKEN0b3IsIHgpIHtcbiAgdmFyIHQsIGlzTmVnMiA9IHgucyA8IDAsIHBpID0gZ2V0UGkoQ3RvciwgQ3Rvci5wcmVjaXNpb24sIDEpLCBoYWxmUGkgPSBwaS50aW1lcygwLjUpO1xuICB4ID0geC5hYnMoKTtcbiAgaWYgKHgubHRlKGhhbGZQaSkpIHtcbiAgICBxdWFkcmFudCA9IGlzTmVnMiA/IDQgOiAxO1xuICAgIHJldHVybiB4O1xuICB9XG4gIHQgPSB4LmRpdlRvSW50KHBpKTtcbiAgaWYgKHQuaXNaZXJvKCkpIHtcbiAgICBxdWFkcmFudCA9IGlzTmVnMiA/IDMgOiAyO1xuICB9IGVsc2Uge1xuICAgIHggPSB4Lm1pbnVzKHQudGltZXMocGkpKTtcbiAgICBpZiAoeC5sdGUoaGFsZlBpKSkge1xuICAgICAgcXVhZHJhbnQgPSBpc09kZCh0KSA/IGlzTmVnMiA/IDIgOiAzIDogaXNOZWcyID8gNCA6IDE7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgcXVhZHJhbnQgPSBpc09kZCh0KSA/IGlzTmVnMiA/IDEgOiA0IDogaXNOZWcyID8gMyA6IDI7XG4gIH1cbiAgcmV0dXJuIHgubWludXMocGkpLmFicygpO1xufVxuZnVuY3Rpb24gdG9TdHJpbmdCaW5hcnkoeCwgYmFzZU91dCwgc2QsIHJtKSB7XG4gIHZhciBiYXNlLCBlLCBpLCBrLCBsZW4sIHJvdW5kVXAsIHN0ciwgeGQsIHksIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBpc0V4cCA9IHNkICE9PSB2b2lkIDA7XG4gIGlmIChpc0V4cCkge1xuICAgIGNoZWNrSW50MzIoc2QsIDEsIE1BWF9ESUdJVFMpO1xuICAgIGlmIChybSA9PT0gdm9pZCAwKVxuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIGVsc2VcbiAgICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICB9IGVsc2Uge1xuICAgIHNkID0gQ3Rvci5wcmVjaXNpb247XG4gICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICB9XG4gIGlmICgheC5pc0Zpbml0ZSgpKSB7XG4gICAgc3RyID0gbm9uRmluaXRlVG9TdHJpbmcoeCk7XG4gIH0gZWxzZSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCk7XG4gICAgaSA9IHN0ci5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaXNFeHApIHtcbiAgICAgIGJhc2UgPSAyO1xuICAgICAgaWYgKGJhc2VPdXQgPT0gMTYpIHtcbiAgICAgICAgc2QgPSBzZCAqIDQgLSAzO1xuICAgICAgfSBlbHNlIGlmIChiYXNlT3V0ID09IDgpIHtcbiAgICAgICAgc2QgPSBzZCAqIDMgLSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlID0gYmFzZU91dDtcbiAgICB9XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoXCIuXCIsIFwiXCIpO1xuICAgICAgeSA9IG5ldyBDdG9yKDEpO1xuICAgICAgeS5lID0gc3RyLmxlbmd0aCAtIGk7XG4gICAgICB5LmQgPSBjb252ZXJ0QmFzZShmaW5pdGVUb1N0cmluZyh5KSwgMTAsIGJhc2UpO1xuICAgICAgeS5lID0geS5kLmxlbmd0aDtcbiAgICB9XG4gICAgeGQgPSBjb252ZXJ0QmFzZShzdHIsIDEwLCBiYXNlKTtcbiAgICBlID0gbGVuID0geGQubGVuZ3RoO1xuICAgIGZvciAoOyB4ZFstLWxlbl0gPT0gMDsgKVxuICAgICAgeGQucG9wKCk7XG4gICAgaWYgKCF4ZFswXSkge1xuICAgICAgc3RyID0gaXNFeHAgPyBcIjBwKzBcIiA6IFwiMFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgZS0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IG5ldyBDdG9yKHgpO1xuICAgICAgICB4LmQgPSB4ZDtcbiAgICAgICAgeC5lID0gZTtcbiAgICAgICAgeCA9IGRpdmlkZSh4LCB5LCBzZCwgcm0sIDAsIGJhc2UpO1xuICAgICAgICB4ZCA9IHguZDtcbiAgICAgICAgZSA9IHguZTtcbiAgICAgICAgcm91bmRVcCA9IGluZXhhY3Q7XG4gICAgICB9XG4gICAgICBpID0geGRbc2RdO1xuICAgICAgayA9IGJhc2UgLyAyO1xuICAgICAgcm91bmRVcCA9IHJvdW5kVXAgfHwgeGRbc2QgKyAxXSAhPT0gdm9pZCAwO1xuICAgICAgcm91bmRVcCA9IHJtIDwgNCA/IChpICE9PSB2b2lkIDAgfHwgcm91bmRVcCkgJiYgKHJtID09PSAwIHx8IHJtID09PSAoeC5zIDwgMCA/IDMgOiAyKSkgOiBpID4gayB8fCBpID09PSBrICYmIChybSA9PT0gNCB8fCByb3VuZFVwIHx8IHJtID09PSA2ICYmIHhkW3NkIC0gMV0gJiAxIHx8IHJtID09PSAoeC5zIDwgMCA/IDggOiA3KSk7XG4gICAgICB4ZC5sZW5ndGggPSBzZDtcbiAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgIGZvciAoOyArK3hkWy0tc2RdID4gYmFzZSAtIDE7ICkge1xuICAgICAgICAgIHhkW3NkXSA9IDA7XG4gICAgICAgICAgaWYgKCFzZCkge1xuICAgICAgICAgICAgKytlO1xuICAgICAgICAgICAgeGQudW5zaGlmdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGVuID0geGQubGVuZ3RoOyAheGRbbGVuIC0gMV07IC0tbGVuKVxuICAgICAgICA7XG4gICAgICBmb3IgKGkgPSAwLCBzdHIgPSBcIlwiOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIHN0ciArPSBOVU1FUkFMUy5jaGFyQXQoeGRbaV0pO1xuICAgICAgaWYgKGlzRXhwKSB7XG4gICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgaWYgKGJhc2VPdXQgPT0gMTYgfHwgYmFzZU91dCA9PSA4KSB7XG4gICAgICAgICAgICBpID0gYmFzZU91dCA9PSAxNiA/IDQgOiAzO1xuICAgICAgICAgICAgZm9yICgtLWxlbjsgbGVuICUgaTsgbGVuKyspXG4gICAgICAgICAgICAgIHN0ciArPSBcIjBcIjtcbiAgICAgICAgICAgIHhkID0gY29udmVydEJhc2Uoc3RyLCBiYXNlLCBiYXNlT3V0KTtcbiAgICAgICAgICAgIGZvciAobGVuID0geGQubGVuZ3RoOyAheGRbbGVuIC0gMV07IC0tbGVuKVxuICAgICAgICAgICAgICA7XG4gICAgICAgICAgICBmb3IgKGkgPSAxLCBzdHIgPSBcIjEuXCI7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgICAgc3RyICs9IE5VTUVSQUxTLmNoYXJBdCh4ZFtpXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IHN0ci5jaGFyQXQoMCkgKyBcIi5cIiArIHN0ci5zbGljZSgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gc3RyICsgKGUgPCAwID8gXCJwXCIgOiBcInArXCIpICsgZTtcbiAgICAgIH0gZWxzZSBpZiAoZSA8IDApIHtcbiAgICAgICAgZm9yICg7ICsrZTsgKVxuICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xuICAgICAgICBzdHIgPSBcIjAuXCIgKyBzdHI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKytlID4gbGVuKVxuICAgICAgICAgIGZvciAoZSAtPSBsZW47IGUtLTsgKVxuICAgICAgICAgICAgc3RyICs9IFwiMFwiO1xuICAgICAgICBlbHNlIGlmIChlIDwgbGVuKVxuICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCBlKSArIFwiLlwiICsgc3RyLnNsaWNlKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSAoYmFzZU91dCA9PSAxNiA/IFwiMHhcIiA6IGJhc2VPdXQgPT0gMiA/IFwiMGJcIiA6IGJhc2VPdXQgPT0gOCA/IFwiMG9cIiA6IFwiXCIpICsgc3RyO1xuICB9XG4gIHJldHVybiB4LnMgPCAwID8gXCItXCIgKyBzdHIgOiBzdHI7XG59XG5mdW5jdGlvbiB0cnVuY2F0ZShhcnIsIGxlbikge1xuICBpZiAoYXJyLmxlbmd0aCA+IGxlbikge1xuICAgIGFyci5sZW5ndGggPSBsZW47XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGFicyh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hYnMoKTtcbn1cbmZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkuYWNvcygpO1xufVxuZnVuY3Rpb24gYWNvc2goeCkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkuYWNvc2goKTtcbn1cbmZ1bmN0aW9uIGFkZCh4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5wbHVzKHkpO1xufVxuZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hc2luKCk7XG59XG5mdW5jdGlvbiBhc2luaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hc2luaCgpO1xufVxuZnVuY3Rpb24gYXRhbih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hdGFuKCk7XG59XG5mdW5jdGlvbiBhdGFuaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hdGFuaCgpO1xufVxuZnVuY3Rpb24gYXRhbjIoeSwgeCkge1xuICB5ID0gbmV3IHRoaXMoeSk7XG4gIHggPSBuZXcgdGhpcyh4KTtcbiAgdmFyIHIsIHByID0gdGhpcy5wcmVjaXNpb24sIHJtID0gdGhpcy5yb3VuZGluZywgd3ByID0gcHIgKyA0O1xuICBpZiAoIXkucyB8fCAheC5zKSB7XG4gICAgciA9IG5ldyB0aGlzKE5hTik7XG4gIH0gZWxzZSBpZiAoIXkuZCAmJiAheC5kKSB7XG4gICAgciA9IGdldFBpKHRoaXMsIHdwciwgMSkudGltZXMoeC5zID4gMCA/IDAuMjUgOiAwLjc1KTtcbiAgICByLnMgPSB5LnM7XG4gIH0gZWxzZSBpZiAoIXguZCB8fCB5LmlzWmVybygpKSB7XG4gICAgciA9IHgucyA8IDAgPyBnZXRQaSh0aGlzLCBwciwgcm0pIDogbmV3IHRoaXMoMCk7XG4gICAgci5zID0geS5zO1xuICB9IGVsc2UgaWYgKCF5LmQgfHwgeC5pc1plcm8oKSkge1xuICAgIHIgPSBnZXRQaSh0aGlzLCB3cHIsIDEpLnRpbWVzKDAuNSk7XG4gICAgci5zID0geS5zO1xuICB9IGVsc2UgaWYgKHgucyA8IDApIHtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHdwcjtcbiAgICB0aGlzLnJvdW5kaW5nID0gMTtcbiAgICByID0gdGhpcy5hdGFuKGRpdmlkZSh5LCB4LCB3cHIsIDEpKTtcbiAgICB4ID0gZ2V0UGkodGhpcywgd3ByLCAxKTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHByO1xuICAgIHRoaXMucm91bmRpbmcgPSBybTtcbiAgICByID0geS5zIDwgMCA/IHIubWludXMoeCkgOiByLnBsdXMoeCk7XG4gIH0gZWxzZSB7XG4gICAgciA9IHRoaXMuYXRhbihkaXZpZGUoeSwgeCwgd3ByLCAxKSk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBjYnJ0KHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNicnQoKTtcbn1cbmZ1bmN0aW9uIGNlaWwoeCkge1xuICByZXR1cm4gZmluYWxpc2UoeCA9IG5ldyB0aGlzKHgpLCB4LmUgKyAxLCAyKTtcbn1cbmZ1bmN0aW9uIGNsYW1wKHgsIG1pbjIsIG1heDIpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNsYW1wKG1pbjIsIG1heDIpO1xufVxuZnVuY3Rpb24gY29uZmlnKG9iaikge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKVxuICAgIHRocm93IEVycm9yKGRlY2ltYWxFcnJvciArIFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICB2YXIgaSwgcCwgdiwgdXNlRGVmYXVsdHMgPSBvYmouZGVmYXVsdHMgPT09IHRydWUsIHBzID0gW1xuICAgIFwicHJlY2lzaW9uXCIsXG4gICAgMSxcbiAgICBNQVhfRElHSVRTLFxuICAgIFwicm91bmRpbmdcIixcbiAgICAwLFxuICAgIDgsXG4gICAgXCJ0b0V4cE5lZ1wiLFxuICAgIC1FWFBfTElNSVQsXG4gICAgMCxcbiAgICBcInRvRXhwUG9zXCIsXG4gICAgMCxcbiAgICBFWFBfTElNSVQsXG4gICAgXCJtYXhFXCIsXG4gICAgMCxcbiAgICBFWFBfTElNSVQsXG4gICAgXCJtaW5FXCIsXG4gICAgLUVYUF9MSU1JVCxcbiAgICAwLFxuICAgIFwibW9kdWxvXCIsXG4gICAgMCxcbiAgICA5XG4gIF07XG4gIGZvciAoaSA9IDA7IGkgPCBwcy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGlmIChwID0gcHNbaV0sIHVzZURlZmF1bHRzKVxuICAgICAgdGhpc1twXSA9IERFRkFVTFRTW3BdO1xuICAgIGlmICgodiA9IG9ialtwXSkgIT09IHZvaWQgMCkge1xuICAgICAgaWYgKG1hdGhmbG9vcih2KSA9PT0gdiAmJiB2ID49IHBzW2kgKyAxXSAmJiB2IDw9IHBzW2kgKyAyXSlcbiAgICAgICAgdGhpc1twXSA9IHY7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIHAgKyBcIjogXCIgKyB2KTtcbiAgICB9XG4gIH1cbiAgaWYgKHAgPSBcImNyeXB0b1wiLCB1c2VEZWZhdWx0cylcbiAgICB0aGlzW3BdID0gREVGQVVMVFNbcF07XG4gIGlmICgodiA9IG9ialtwXSkgIT09IHZvaWQgMCkge1xuICAgIGlmICh2ID09PSB0cnVlIHx8IHYgPT09IGZhbHNlIHx8IHYgPT09IDAgfHwgdiA9PT0gMSkge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT0gXCJ1bmRlZmluZWRcIiAmJiBjcnlwdG8gJiYgKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgfHwgY3J5cHRvLnJhbmRvbUJ5dGVzKSkge1xuICAgICAgICAgIHRoaXNbcF0gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IEVycm9yKGNyeXB0b1VuYXZhaWxhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1twXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyBwICsgXCI6IFwiICsgdik7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gY29zKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNvcygpO1xufVxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5jb3NoKCk7XG59XG5mdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgdmFyIGksIHAsIHBzO1xuICBmdW5jdGlvbiBEZWNpbWFsMih2KSB7XG4gICAgdmFyIGUsIGkyLCB0LCB4ID0gdGhpcztcbiAgICBpZiAoISh4IGluc3RhbmNlb2YgRGVjaW1hbDIpKVxuICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsMih2KTtcbiAgICB4LmNvbnN0cnVjdG9yID0gRGVjaW1hbDI7XG4gICAgaWYgKGlzRGVjaW1hbEluc3RhbmNlKHYpKSB7XG4gICAgICB4LnMgPSB2LnM7XG4gICAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgICAgaWYgKCF2LmQgfHwgdi5lID4gRGVjaW1hbDIubWF4RSkge1xuICAgICAgICAgIHguZSA9IE5hTjtcbiAgICAgICAgICB4LmQgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHYuZSA8IERlY2ltYWwyLm1pbkUpIHtcbiAgICAgICAgICB4LmUgPSAwO1xuICAgICAgICAgIHguZCA9IFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4LmUgPSB2LmU7XG4gICAgICAgICAgeC5kID0gdi5kLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHguZSA9IHYuZTtcbiAgICAgICAgeC5kID0gdi5kID8gdi5kLnNsaWNlKCkgOiB2LmQ7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHQgPSB0eXBlb2YgdjtcbiAgICBpZiAodCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHYgPT09IDApIHtcbiAgICAgICAgeC5zID0gMSAvIHYgPCAwID8gLTEgOiAxO1xuICAgICAgICB4LmUgPSAwO1xuICAgICAgICB4LmQgPSBbMF07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2IDwgMCkge1xuICAgICAgICB2ID0gLXY7XG4gICAgICAgIHgucyA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeC5zID0gMTtcbiAgICAgIH1cbiAgICAgIGlmICh2ID09PSB+fnYgJiYgdiA8IDFlNykge1xuICAgICAgICBmb3IgKGUgPSAwLCBpMiA9IHY7IGkyID49IDEwOyBpMiAvPSAxMClcbiAgICAgICAgICBlKys7XG4gICAgICAgIGlmIChleHRlcm5hbCkge1xuICAgICAgICAgIGlmIChlID4gRGVjaW1hbDIubWF4RSkge1xuICAgICAgICAgICAgeC5lID0gTmFOO1xuICAgICAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGUgPCBEZWNpbWFsMi5taW5FKSB7XG4gICAgICAgICAgICB4LmUgPSAwO1xuICAgICAgICAgICAgeC5kID0gWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4LmUgPSBlO1xuICAgICAgICAgICAgeC5kID0gW3ZdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4LmUgPSBlO1xuICAgICAgICAgIHguZCA9IFt2XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHYgKiAwICE9PSAwKSB7XG4gICAgICAgIGlmICghdilcbiAgICAgICAgICB4LnMgPSBOYU47XG4gICAgICAgIHguZSA9IE5hTjtcbiAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlRGVjaW1hbCh4LCB2LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAodCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEFyZ3VtZW50ICsgdik7XG4gICAgfVxuICAgIGlmICgoaTIgPSB2LmNoYXJDb2RlQXQoMCkpID09PSA0NSkge1xuICAgICAgdiA9IHYuc2xpY2UoMSk7XG4gICAgICB4LnMgPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGkyID09PSA0MylcbiAgICAgICAgdiA9IHYuc2xpY2UoMSk7XG4gICAgICB4LnMgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gaXNEZWNpbWFsLnRlc3QodikgPyBwYXJzZURlY2ltYWwoeCwgdikgOiBwYXJzZU90aGVyKHgsIHYpO1xuICB9XG4gIERlY2ltYWwyLnByb3RvdHlwZSA9IFA7XG4gIERlY2ltYWwyLlJPVU5EX1VQID0gMDtcbiAgRGVjaW1hbDIuUk9VTkRfRE9XTiA9IDE7XG4gIERlY2ltYWwyLlJPVU5EX0NFSUwgPSAyO1xuICBEZWNpbWFsMi5ST1VORF9GTE9PUiA9IDM7XG4gIERlY2ltYWwyLlJPVU5EX0hBTEZfVVAgPSA0O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0RPV04gPSA1O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0VWRU4gPSA2O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0NFSUwgPSA3O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0ZMT09SID0gODtcbiAgRGVjaW1hbDIuRVVDTElEID0gOTtcbiAgRGVjaW1hbDIuY29uZmlnID0gRGVjaW1hbDIuc2V0ID0gY29uZmlnO1xuICBEZWNpbWFsMi5jbG9uZSA9IGNsb25lO1xuICBEZWNpbWFsMi5pc0RlY2ltYWwgPSBpc0RlY2ltYWxJbnN0YW5jZTtcbiAgRGVjaW1hbDIuYWJzID0gYWJzO1xuICBEZWNpbWFsMi5hY29zID0gYWNvcztcbiAgRGVjaW1hbDIuYWNvc2ggPSBhY29zaDtcbiAgRGVjaW1hbDIuYWRkID0gYWRkO1xuICBEZWNpbWFsMi5hc2luID0gYXNpbjtcbiAgRGVjaW1hbDIuYXNpbmggPSBhc2luaDtcbiAgRGVjaW1hbDIuYXRhbiA9IGF0YW47XG4gIERlY2ltYWwyLmF0YW5oID0gYXRhbmg7XG4gIERlY2ltYWwyLmF0YW4yID0gYXRhbjI7XG4gIERlY2ltYWwyLmNicnQgPSBjYnJ0O1xuICBEZWNpbWFsMi5jZWlsID0gY2VpbDtcbiAgRGVjaW1hbDIuY2xhbXAgPSBjbGFtcDtcbiAgRGVjaW1hbDIuY29zID0gY29zO1xuICBEZWNpbWFsMi5jb3NoID0gY29zaDtcbiAgRGVjaW1hbDIuZGl2ID0gZGl2O1xuICBEZWNpbWFsMi5leHAgPSBleHA7XG4gIERlY2ltYWwyLmZsb29yID0gZmxvb3I7XG4gIERlY2ltYWwyLmh5cG90ID0gaHlwb3Q7XG4gIERlY2ltYWwyLmxuID0gbG47XG4gIERlY2ltYWwyLmxvZyA9IGxvZztcbiAgRGVjaW1hbDIubG9nMTAgPSBsb2cxMDtcbiAgRGVjaW1hbDIubG9nMiA9IGxvZzI7XG4gIERlY2ltYWwyLm1heCA9IG1heDtcbiAgRGVjaW1hbDIubWluID0gbWluO1xuICBEZWNpbWFsMi5tb2QgPSBtb2Q7XG4gIERlY2ltYWwyLm11bCA9IG11bDtcbiAgRGVjaW1hbDIucG93ID0gcG93O1xuICBEZWNpbWFsMi5yYW5kb20gPSByYW5kb207XG4gIERlY2ltYWwyLnJvdW5kID0gcm91bmQ7XG4gIERlY2ltYWwyLnNpZ24gPSBzaWduO1xuICBEZWNpbWFsMi5zaW4gPSBzaW47XG4gIERlY2ltYWwyLnNpbmggPSBzaW5oO1xuICBEZWNpbWFsMi5zcXJ0ID0gc3FydDtcbiAgRGVjaW1hbDIuc3ViID0gc3ViO1xuICBEZWNpbWFsMi5zdW0gPSBzdW07XG4gIERlY2ltYWwyLnRhbiA9IHRhbjtcbiAgRGVjaW1hbDIudGFuaCA9IHRhbmg7XG4gIERlY2ltYWwyLnRydW5jID0gdHJ1bmM7XG4gIGlmIChvYmogPT09IHZvaWQgMClcbiAgICBvYmogPSB7fTtcbiAgaWYgKG9iaikge1xuICAgIGlmIChvYmouZGVmYXVsdHMgIT09IHRydWUpIHtcbiAgICAgIHBzID0gW1wicHJlY2lzaW9uXCIsIFwicm91bmRpbmdcIiwgXCJ0b0V4cE5lZ1wiLCBcInRvRXhwUG9zXCIsIFwibWF4RVwiLCBcIm1pbkVcIiwgXCJtb2R1bG9cIiwgXCJjcnlwdG9cIl07XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcHMubGVuZ3RoOyApXG4gICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KHAgPSBwc1tpKytdKSlcbiAgICAgICAgICBvYmpbcF0gPSB0aGlzW3BdO1xuICAgIH1cbiAgfVxuICBEZWNpbWFsMi5jb25maWcob2JqKTtcbiAgcmV0dXJuIERlY2ltYWwyO1xufVxuZnVuY3Rpb24gZGl2KHgsIHkpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmRpdih5KTtcbn1cbmZ1bmN0aW9uIGV4cCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5leHAoKTtcbn1cbmZ1bmN0aW9uIGZsb29yKHgpIHtcbiAgcmV0dXJuIGZpbmFsaXNlKHggPSBuZXcgdGhpcyh4KSwgeC5lICsgMSwgMyk7XG59XG5mdW5jdGlvbiBoeXBvdCgpIHtcbiAgdmFyIGksIG4sIHQgPSBuZXcgdGhpcygwKTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICkge1xuICAgIG4gPSBuZXcgdGhpcyhhcmd1bWVudHNbaSsrXSk7XG4gICAgaWYgKCFuLmQpIHtcbiAgICAgIGlmIChuLnMpIHtcbiAgICAgICAgZXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoMSAvIDApO1xuICAgICAgfVxuICAgICAgdCA9IG47XG4gICAgfSBlbHNlIGlmICh0LmQpIHtcbiAgICAgIHQgPSB0LnBsdXMobi50aW1lcyhuKSk7XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIHQuc3FydCgpO1xufVxuZnVuY3Rpb24gaXNEZWNpbWFsSW5zdGFuY2Uob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBEZWNpbWFsIHx8IG9iaiAmJiBvYmoudG9TdHJpbmdUYWcgPT09IHRhZyB8fCBmYWxzZTtcbn1cbmZ1bmN0aW9uIGxuKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmxuKCk7XG59XG5mdW5jdGlvbiBsb2coeCwgeSkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkubG9nKHkpO1xufVxuZnVuY3Rpb24gbG9nMih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5sb2coMik7XG59XG5mdW5jdGlvbiBsb2cxMCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5sb2coMTApO1xufVxuZnVuY3Rpb24gbWF4KCkge1xuICByZXR1cm4gbWF4T3JNaW4odGhpcywgYXJndW1lbnRzLCBcImx0XCIpO1xufVxuZnVuY3Rpb24gbWluKCkge1xuICByZXR1cm4gbWF4T3JNaW4odGhpcywgYXJndW1lbnRzLCBcImd0XCIpO1xufVxuZnVuY3Rpb24gbW9kKHgsIHkpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLm1vZCh5KTtcbn1cbmZ1bmN0aW9uIG11bCh4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5tdWwoeSk7XG59XG5mdW5jdGlvbiBwb3coeCwgeSkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkucG93KHkpO1xufVxuZnVuY3Rpb24gcmFuZG9tKHNkKSB7XG4gIHZhciBkLCBlLCBrLCBuLCBpID0gMCwgciA9IG5ldyB0aGlzKDEpLCByZCA9IFtdO1xuICBpZiAoc2QgPT09IHZvaWQgMClcbiAgICBzZCA9IHRoaXMucHJlY2lzaW9uO1xuICBlbHNlXG4gICAgY2hlY2tJbnQzMihzZCwgMSwgTUFYX0RJR0lUUyk7XG4gIGsgPSBNYXRoLmNlaWwoc2QgLyBMT0dfQkFTRSk7XG4gIGlmICghdGhpcy5jcnlwdG8pIHtcbiAgICBmb3IgKDsgaSA8IGs7IClcbiAgICAgIHJkW2krK10gPSBNYXRoLnJhbmRvbSgpICogMWU3IHwgMDtcbiAgfSBlbHNlIGlmIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgZCA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KGspKTtcbiAgICBmb3IgKDsgaSA8IGs7ICkge1xuICAgICAgbiA9IGRbaV07XG4gICAgICBpZiAobiA+PSA0MjllNykge1xuICAgICAgICBkW2ldID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmRbaSsrXSA9IG4gJSAxZTc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGNyeXB0by5yYW5kb21CeXRlcykge1xuICAgIGQgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoayAqPSA0KTtcbiAgICBmb3IgKDsgaSA8IGs7ICkge1xuICAgICAgbiA9IGRbaV0gKyAoZFtpICsgMV0gPDwgOCkgKyAoZFtpICsgMl0gPDwgMTYpICsgKChkW2kgKyAzXSAmIDEyNykgPDwgMjQpO1xuICAgICAgaWYgKG4gPj0gMjE0ZTcpIHtcbiAgICAgICAgY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLmNvcHkoZCwgaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZC5wdXNoKG4gJSAxZTcpO1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG4gICAgfVxuICAgIGkgPSBrIC8gNDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihjcnlwdG9VbmF2YWlsYWJsZSk7XG4gIH1cbiAgayA9IHJkWy0taV07XG4gIHNkICU9IExPR19CQVNFO1xuICBpZiAoayAmJiBzZCkge1xuICAgIG4gPSBtYXRocG93KDEwLCBMT0dfQkFTRSAtIHNkKTtcbiAgICByZFtpXSA9IChrIC8gbiB8IDApICogbjtcbiAgfVxuICBmb3IgKDsgcmRbaV0gPT09IDA7IGktLSlcbiAgICByZC5wb3AoKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgZSA9IDA7XG4gICAgcmQgPSBbMF07XG4gIH0gZWxzZSB7XG4gICAgZSA9IC0xO1xuICAgIGZvciAoOyByZFswXSA9PT0gMDsgZSAtPSBMT0dfQkFTRSlcbiAgICAgIHJkLnNoaWZ0KCk7XG4gICAgZm9yIChrID0gMSwgbiA9IHJkWzBdOyBuID49IDEwOyBuIC89IDEwKVxuICAgICAgaysrO1xuICAgIGlmIChrIDwgTE9HX0JBU0UpXG4gICAgICBlIC09IExPR19CQVNFIC0gaztcbiAgfVxuICByLmUgPSBlO1xuICByLmQgPSByZDtcbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiByb3VuZCh4KSB7XG4gIHJldHVybiBmaW5hbGlzZSh4ID0gbmV3IHRoaXMoeCksIHguZSArIDEsIHRoaXMucm91bmRpbmcpO1xufVxuZnVuY3Rpb24gc2lnbih4KSB7XG4gIHggPSBuZXcgdGhpcyh4KTtcbiAgcmV0dXJuIHguZCA/IHguZFswXSA/IHgucyA6IDAgKiB4LnMgOiB4LnMgfHwgTmFOO1xufVxuZnVuY3Rpb24gc2luKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnNpbigpO1xufVxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5zaW5oKCk7XG59XG5mdW5jdGlvbiBzcXJ0KHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnNxcnQoKTtcbn1cbmZ1bmN0aW9uIHN1Yih4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5zdWIoeSk7XG59XG5mdW5jdGlvbiBzdW0oKSB7XG4gIHZhciBpID0gMCwgYXJncyA9IGFyZ3VtZW50cywgeCA9IG5ldyB0aGlzKGFyZ3NbaV0pO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBmb3IgKDsgeC5zICYmICsraSA8IGFyZ3MubGVuZ3RoOyApXG4gICAgeCA9IHgucGx1cyhhcmdzW2ldKTtcbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4gZmluYWxpc2UoeCwgdGhpcy5wcmVjaXNpb24sIHRoaXMucm91bmRpbmcpO1xufVxuZnVuY3Rpb24gdGFuKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnRhbigpO1xufVxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS50YW5oKCk7XG59XG5mdW5jdGlvbiB0cnVuYyh4KSB7XG4gIHJldHVybiBmaW5hbGlzZSh4ID0gbmV3IHRoaXMoeCksIHguZSArIDEsIDEpO1xufVxuUFtTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIildID0gUC50b1N0cmluZztcblBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiRGVjaW1hbFwiO1xudmFyIERlY2ltYWwgPSBQLmNvbnN0cnVjdG9yID0gY2xvbmUoREVGQVVMVFMpO1xuTE4xMCA9IG5ldyBEZWNpbWFsKExOMTApO1xuUEkgPSBuZXcgRGVjaW1hbChQSSk7XG52YXIgZGVjaW1hbF9kZWZhdWx0ID0gRGVjaW1hbDtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2NvbXB1dGUtZW5naW5lLnRzXG52YXIgaW1wb3J0X2NvbXBsZXgyMCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tbW9uL2dyYXBoZW1lLXNwbGl0dGVyLnRzXG5mdW5jdGlvbiBzdHJpbmdUb0NvZGVwb2ludHMoc3RyaW5nKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPj0gNTUyOTYgJiYgY29kZSA8PSA1NjMxOSkge1xuICAgICAgY29uc3QgbmV4dENvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dENvZGUgPj0gNTYzMjAgJiYgbmV4dENvZGUgPD0gNTczNDMpIHtcbiAgICAgICAgY29uc3QgbGVhZCA9IGNvZGUgLSA1NTI5NjtcbiAgICAgICAgY29uc3QgdHJhaWwgPSBuZXh0Q29kZSAtIDU2MzIwO1xuICAgICAgICBjb2RlID0gMiAqKiAxNiArIGxlYWQgKiAyICoqIDEwICsgdHJhaWw7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnB1c2goY29kZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbnZhciBaV0ogPSA4MjA1O1xudmFyIFJFR0lPTkFMX0lORElDQVRPUiA9IFsxMjc0NjIsIDEyNzQ4N107XG5mdW5jdGlvbiBpc0Vtb2ppQ29tYmluYXRvcihjb2RlKSB7XG4gIGlmIChjb2RlID09PSBaV0opXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlID09PSA2NTAzOCB8fCBjb2RlID09PSA2NTAzOSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gMTI3OTk1ICYmIGNvZGUgPD0gMTI3OTk1ICsgNSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gMTI5NDU2ICYmIGNvZGUgPD0gMTI5NDU2ICsgNClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gOTE3NTM2ICYmIGNvZGUgPD0gOTE3NTM2ICsgOTYpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICByZXR1cm4gY29kZSA+PSBSRUdJT05BTF9JTkRJQ0FUT1JbMF0gJiYgY29kZSA8PSBSRUdJT05BTF9JTkRJQ0FUT1JbMV07XG59XG5mdW5jdGlvbiBzcGxpdEdyYXBoZW1lcyhzdHJpbmcpIHtcbiAgaWYgKC9eW1xcdTAwMjAtXFx1MDBGRl0qJC8udGVzdChzdHJpbmcpKVxuICAgIHJldHVybiBzdHJpbmc7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjb2RlUG9pbnRzID0gc3RyaW5nVG9Db2RlcG9pbnRzKHN0cmluZyk7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGNvZGVQb2ludHMubGVuZ3RoKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVQb2ludHNbaW5kZXgrK107XG4gICAgY29uc3QgbmV4dCA9IGNvZGVQb2ludHNbaW5kZXhdO1xuICAgIGlmIChuZXh0ID09PSBaV0opIHtcbiAgICAgIGNvbnN0IGJhc2VJbmRleCA9IGluZGV4IC0gMTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoY29kZVBvaW50c1tpbmRleF0gPT09IFpXSikge1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgIC4uLmNvZGVQb2ludHMuc2xpY2UoYmFzZUluZGV4LCAyICogaW5kZXggLSBiYXNlSW5kZXggKyAxKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNFbW9qaUNvbWJpbmF0b3IobmV4dCkpIHtcbiAgICAgIGNvbnN0IGJhc2VJbmRleCA9IGluZGV4IC0gMTtcbiAgICAgIHdoaWxlIChpc0Vtb2ppQ29tYmluYXRvcihjb2RlUG9pbnRzW2luZGV4XSkpIHtcbiAgICAgICAgaW5kZXggKz0gY29kZVBvaW50c1tpbmRleF0gPT09IFpXSiA/IDIgOiAxO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgIC4uLmNvZGVQb2ludHMuc2xpY2UoYmFzZUluZGV4LCAyICogaW5kZXggLSBiYXNlSW5kZXggLSAxKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihjb2RlKSkge1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMuc2xpY2UoaW5kZXggLSAyLCAyKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvdG9rZW5pemVyLnRzXG52YXIgVG9rZW5pemVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihzKSB7XG4gICAgdGhpcy5vYmV5c3BhY2VzID0gZmFsc2U7XG4gICAgcyA9IHMucmVwbGFjZSgvW1xcdTIwMEVcXHUyMDBGXFx1MjA2Ni1cXHUyMDY5XFx1MjAyQS1cXHUyMDJFXS9nLCBcIlwiKTtcbiAgICB0aGlzLnMgPSBzcGxpdEdyYXBoZW1lcyhzKTtcbiAgICB0aGlzLnBvcyA9IDA7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbVxuICAgKi9cbiAgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgY2hhciBhbmQgYWR2YW5jZVxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLnBvcyA8IHRoaXMucy5sZW5ndGggPyB0aGlzLnNbdGhpcy5wb3MrK10gOiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgY2hhciwgYnV0IGRvIG5vdCBhZHZhbmNlXG4gICAqL1xuICBwZWVrKCkge1xuICAgIHJldHVybiB0aGlzLnNbdGhpcy5wb3NdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgc3Vic3RyaW5nIG1hdGNoaW5nIHJlZ0V4IGFuZCBhZHZhbmNlLlxuICAgKi9cbiAgbWF0Y2gocmVnRXgpIHtcbiAgICBsZXQgZXhlY1Jlc3VsdDtcbiAgICBpZiAodHlwZW9mIHRoaXMucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXhlY1Jlc3VsdCA9IHJlZ0V4LmV4ZWModGhpcy5zLnNsaWNlKHRoaXMucG9zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWNSZXN1bHQgPSByZWdFeC5leGVjKHRoaXMucy5zbGljZSh0aGlzLnBvcykuam9pbihcIlwiKSk7XG4gICAgfVxuICAgIGlmIChleGVjUmVzdWx0Py5bMF0pIHtcbiAgICAgIHRoaXMucG9zICs9IGV4ZWNSZXN1bHRbMF0ubGVuZ3RoO1xuICAgICAgcmV0dXJuIGV4ZWNSZXN1bHRbMF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgdG9rZW4sIG9yIG51bGwuXG4gICAqL1xuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmVuZCgpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLm9iZXlzcGFjZXMgJiYgdGhpcy5tYXRjaCgvXlsgXFxmXFxuXFxyXFx0XFx2XFx4QTBcXHUyMDI4XFx1MjAyOV0rLykpIHtcbiAgICAgIHJldHVybiBcIjxzcGFjZT5cIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMub2JleXNwYWNlcyAmJiB0aGlzLm1hdGNoKC9eWyBcXGZcXG5cXHJcXHRcXHZcXHhBMFxcdTIwMjhcXHUyMDI5XS8pKSB7XG4gICAgICByZXR1cm4gXCI8c3BhY2U+XCI7XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldCgpO1xuICAgIGlmIChuZXh0ID09PSBcIlxcXFxcIikge1xuICAgICAgaWYgKCF0aGlzLmVuZCgpKSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gdGhpcy5tYXRjaCgvXlthLXpBLVoqXSsvKTtcbiAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICB0aGlzLm1hdGNoKC9eWyBcXGZcXG5cXHJcXHRcXHZcXHhBMFxcdTIwMjhcXHUyMDI5XSovKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tYW5kID0gdGhpcy5nZXQoKTtcbiAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjxzcGFjZT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXFxcXFwiICsgY29tbWFuZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwie1wiKSB7XG4gICAgICByZXR1cm4gXCI8ez5cIjtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwifVwiKSB7XG4gICAgICByZXR1cm4gXCI8fT5cIjtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiXlwiKSB7XG4gICAgICBpZiAodGhpcy5wZWVrKCkgPT09IFwiXlwiKSB7XG4gICAgICAgIHRoaXMuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMubWF0Y2goXG4gICAgICAgICAgL14oXFxeKFxcXihcXF4oXFxeWzAtOWEtZl0pP1swLTlhLWZdKT9bMC05YS1mXSk/WzAtOWEtZl0pP1swLTlhLWZdWzAtOWEtZl0vXG4gICAgICAgICk7XG4gICAgICAgIGlmIChoZXgpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICBwYXJzZUludChoZXguc2xpY2UoaGV4Lmxhc3RJbmRleE9mKFwiXlwiKSArIDEpLCAxNilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiI1wiKSB7XG4gICAgICBpZiAoIXRoaXMuZW5kKCkpIHtcbiAgICAgICAgbGV0IGlzUGFyYW0gPSBmYWxzZTtcbiAgICAgICAgaWYgKC9bMC05P10vLnRlc3QodGhpcy5wZWVrKCkpKSB7XG4gICAgICAgICAgaXNQYXJhbSA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMucG9zICsgMSA8IHRoaXMucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5zW3RoaXMucG9zICsgMV07XG4gICAgICAgICAgICBpc1BhcmFtID0gL1teMC05QS1aYS16XS8udGVzdChhZnRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhcmFtKSB7XG4gICAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy5nZXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIjXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0ID09PSBcIiRcIikge1xuICAgICAgaWYgKHRoaXMucGVlaygpID09PSBcIiRcIikge1xuICAgICAgICB0aGlzLmdldCgpO1xuICAgICAgICByZXR1cm4gXCI8JCQ+XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCI8JD5cIjtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn07XG5mdW5jdGlvbiBleHBhbmQobGV4MiwgYXJncykge1xuICBsZXQgdG9rZW4gPSBsZXgyLm5leHQoKTtcbiAgaWYgKCF0b2tlbilcbiAgICByZXR1cm4gW107XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgaWYgKHRva2VuID09PSBcIlxcXFxyZWxheFwiKSB7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXG5vZXhwYW5kXCIpIHtcbiAgICB0b2tlbiA9IGxleDIubmV4dCgpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gXCJcXFxcb2JleXNwYWNlc1wiKSB7XG4gICAgbGV4Mi5vYmV5c3BhY2VzID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gXCJcXFxcc3BhY2VcIiB8fCB0b2tlbiA9PT0gXCJ+XCIpIHtcbiAgICByZXN1bHQucHVzaChcIjxzcGFjZT5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGJncm91cFwiKSB7XG4gICAgcmVzdWx0LnB1c2goXCI8ez5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGVncm91cFwiKSB7XG4gICAgcmVzdWx0LnB1c2goXCI8fT5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXHN0cmluZ1wiKSB7XG4gICAgdG9rZW4gPSBsZXgyLm5leHQoKTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGlmICh0b2tlblswXSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0b2tlbikuZm9yRWFjaChcbiAgICAgICAgICAoeCkgPT4gcmVzdWx0LnB1c2goeCA9PT0gXCJcXFxcXCIgPyBcIlxcXFxiYWNrc2xhc2hcIiA6IHgpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx7PlwiKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFwiXFxcXHtcIik7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjxzcGFjZT5cIikge1xuICAgICAgICByZXN1bHQucHVzaChcIn5cIik7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx9PlwiKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFwiXFxcXH1cIik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHRva2VuID09PSBcIlxcXFxjc25hbWVcIikge1xuICAgIHdoaWxlIChsZXgyLnBlZWsoKSA9PT0gXCI8c3BhY2U+XCIpIHtcbiAgICAgIGxleDIubmV4dCgpO1xuICAgIH1cbiAgICBsZXQgY29tbWFuZCA9IFwiXCI7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBsZXQgdG9rZW5zID0gW107XG4gICAgZG8ge1xuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKC9eI1swLTk/XSQvLnRlc3QobGV4Mi5wZWVrKCkpKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW0gPSBsZXgyLmdldCgpLnNsaWNlKDEpO1xuICAgICAgICAgIHRva2VucyA9IHRva2VuaXplKFxuICAgICAgICAgICAgYXJncz8uW3BhcmFtXSA/PyBhcmdzPy5bXCI/XCJdID8/IFwiXFxcXHBsYWNlaG9sZGVye31cIixcbiAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIHRva2VuID0gdG9rZW5zWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2VuID0gbGV4Mi5uZXh0KCk7XG4gICAgICAgICAgdG9rZW5zID0gdG9rZW4gPyBbdG9rZW5dIDogW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvbmUgPSB0b2tlbnMubGVuZ3RoID09PSAwO1xuICAgICAgaWYgKCFkb25lICYmIHRva2VuID09PSBcIlxcXFxlbmRjc25hbWVcIikge1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgdG9rZW5zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgZG9uZSA9IHRva2VuID09PSBcIjwkPlwiIHx8IHRva2VuID09PSBcIjwkJD5cIiB8fCB0b2tlbiA9PT0gXCI8ez5cIiB8fCB0b2tlbiA9PT0gXCI8fT5cIiB8fCAhIXRva2VuICYmIHRva2VuLmxlbmd0aCA+IDEgJiYgdG9rZW5bMF0gPT09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgIGNvbW1hbmQgKz0gdG9rZW5zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIGlmIChjb21tYW5kKSB7XG4gICAgICByZXN1bHQucHVzaChcIlxcXFxcIiArIGNvbW1hbmQpO1xuICAgIH1cbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRva2Vucyk7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGVuZGNzbmFtZVwiKSB7XG4gIH0gZWxzZSBpZiAodG9rZW4ubGVuZ3RoID4gMSAmJiB0b2tlblswXSA9PT0gXCIjXCIpIHtcbiAgICBjb25zdCBwYXJhbSA9IHRva2VuLnNsaWNlKDEpO1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoXG4gICAgICB0b2tlbml6ZShhcmdzPy5bcGFyYW1dID8/IGFyZ3M/LltcIj9cIl0gPz8gXCJcXFxccGxhY2Vob2xkZXJ7fVwiLCBhcmdzKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB0b2tlbml6ZShzLCBhcmdzKSB7XG4gIGNvbnN0IGxpbmVzID0gcy50b1N0cmluZygpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGxldCBzdHJlYW0gPSBcIlwiO1xuICBsZXQgc2VwID0gXCJcIjtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgc3RyZWFtICs9IHNlcDtcbiAgICBzZXAgPSBcIiBcIjtcbiAgICBjb25zdCBtID0gbGluZS5tYXRjaCgvKCg/OlxcXFwlKXxbXiVdKSovKTtcbiAgICBpZiAobSAhPT0gbnVsbClcbiAgICAgIHN0cmVhbSArPSBtWzBdO1xuICB9XG4gIGNvbnN0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RyZWFtKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGRvXG4gICAgcmVzdWx0LnB1c2goLi4uZXhwYW5kKHRva2VuaXplciwgYXJncykpO1xuICB3aGlsZSAoIXRva2VuaXplci5lbmQoKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb3VudFRva2VucyhzKSB7XG4gIHJldHVybiB0b2tlbml6ZShzLCBbXSkubGVuZ3RoO1xufVxuZnVuY3Rpb24gam9pbkxhdGV4KHNlZ21lbnRzKSB7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgIGlmICgvW2EtekEtWipdLy50ZXN0KHNlZ21lbnRbMF0pKSB7XG4gICAgICAgIHJlc3VsdCArPSBzZXA7XG4gICAgICB9XG4gICAgICBpZiAoL1xcXFxbYS16QS1aXStcXCo/JC8udGVzdChzZWdtZW50KSkge1xuICAgICAgICBzZXAgPSBcIiBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcCA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gc2VnbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHRva2Vuc1RvU3RyaW5nKHRva2Vucykge1xuICBsZXQgZmxhdCA9IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2Vucykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgZmxhdCA9IFsuLi5mbGF0LCAuLi5pdGVtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYXQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmxhdCA9IFt0b2tlbnNdO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGpvaW5MYXRleChcbiAgICBmbGF0Lm1hcCgodG9rZW4pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFwiPHNwYWNlPlwiOiBcIiBcIixcbiAgICAgICAgXCI8JCQ+XCI6IFwiJCRcIixcbiAgICAgICAgXCI8JD5cIjogXCIkXCIsXG4gICAgICAgIFwiPHs+XCI6IFwie1wiLFxuICAgICAgICBcIjx9PlwiOiBcIn1cIlxuICAgICAgfVt0b2tlbl0gPz8gdG9rZW47XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9kaWN0aW9uYXJ5L2RlZmluaXRpb25zLWFsZ2VicmEudHNcbnZhciBERUZJTklUSU9OU19BTEdFQlJBID0gW1xuICB7XG4gICAgbmFtZTogXCJUb1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRvXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzBcbiAgICAvLyBNYXRoTUwgcmlnaHR3YXJkcyBhcnJvd1xuICB9XG5dO1xuXG4vLyBzcmMvbWF0aC1qc29uL3V0aWxzLnRzXG52YXIgTUlTU0lORyA9IFtcIkVycm9yXCIsIFwiJ21pc3NpbmcnXCJdO1xuZnVuY3Rpb24gaXNOdW1iZXJFeHByZXNzaW9uKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwibnVtYmVyXCIgfHwgaXNOdW1iZXJPYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIiAmJiAvXlsrLV0/WzAtOVxcLl0vLnRlc3QoZXhwcikpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KGV4cHIpIHtcbiAgcmV0dXJuIGV4cHIgIT09IG51bGwgJiYgdHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBleHByO1xufVxuZnVuY3Rpb24gaXNTeW1ib2xPYmplY3QoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiB0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcInN5bVwiIGluIGV4cHI7XG59XG5mdW5jdGlvbiBpc1N0cmluZ09iamVjdChleHByKSB7XG4gIHJldHVybiBleHByICE9PSBudWxsICYmIHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiICYmIFwic3RyXCIgaW4gZXhwcjtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb25PYmplY3QoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiB0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcImZuXCIgaW4gZXhwcjtcbn1cbnZhciByZWNvbW1lbmRlZFNjcmlwdHNSZWdleDtcbmZ1bmN0aW9uIGlzUmVjb21tZW5kZWRTY3JpcHRzKHRleHQpIHtcbiAgaWYgKCFyZWNvbW1lbmRlZFNjcmlwdHNSZWdleCkge1xuICAgIGNvbnN0IHJlY29tbWVuZGVkU2NyaXB0cyA9IFtcbiAgICAgIFwiWnl5eVwiLFxuICAgICAgXCJaaW5oXCIsXG4gICAgICBcIkFyYWJcIixcbiAgICAgIFwiQXJtblwiLFxuICAgICAgXCJCZW5nXCIsXG4gICAgICBcIkJvcG9cIixcbiAgICAgIFwiQ3lybFwiLFxuICAgICAgXCJEZXZhXCIsXG4gICAgICBcIkV0aGlcIixcbiAgICAgIFwiR2VvclwiLFxuICAgICAgXCJHcmVrXCIsXG4gICAgICBcIkd1anJcIixcbiAgICAgIFwiR3VydVwiLFxuICAgICAgXCJIYW5nXCIsXG4gICAgICBcIkhhbmlcIixcbiAgICAgIFwiSGViclwiLFxuICAgICAgXCJIaXJhXCIsXG4gICAgICBcIkthbmFcIixcbiAgICAgIFwiS25kYVwiLFxuICAgICAgXCJLaG1yXCIsXG4gICAgICBcIkxhb29cIixcbiAgICAgIFwiTGF0blwiLFxuICAgICAgXCJNbHltXCIsXG4gICAgICBcIk15bXJcIixcbiAgICAgIFwiT3J5YVwiLFxuICAgICAgXCJTaW5oXCIsXG4gICAgICBcIlRhbWxcIixcbiAgICAgIFwiVGVsdVwiLFxuICAgICAgXCJUaGFhXCIsXG4gICAgICBcIlRoYWlcIixcbiAgICAgIFwiVGlidFwiXG4gICAgXTtcbiAgICBjb25zdCByZWdleFBhdHRlcm4gPSBgXlske3JlY29tbWVuZGVkU2NyaXB0cy5tYXAoKHgpID0+IGBcXFxccHtTY3JpcHQ9JHt4fX1gKS5qb2luKFwiXCIpfV0qJGA7XG4gICAgcmVjb21tZW5kZWRTY3JpcHRzUmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4UGF0dGVybiwgXCJ1XCIpO1xuICB9XG4gIHJldHVybiByZWNvbW1lbmRlZFNjcmlwdHNSZWdleC50ZXN0KHRleHQpO1xufVxuZnVuY3Rpb24gaXNWYWxpZElkZW50aWZpZXIocykge1xuICBpZiAoL15bYS16QS1aX11bYS16QS1aMC05X10qJC8udGVzdChzKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKE9OTFlfRU1PSklTLnRlc3QocykpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICghaXNSZWNvbW1lbmRlZFNjcmlwdHMocykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL15bXFxwe1hJRFN9X11cXHB7WElEQ30qJC91LnRlc3Qocyk7XG59XG52YXIgVlMxNiA9IFwiXFxcXHV7RkUwRn1cIjtcbnZhciBLRVlDQVAgPSBcIlxcXFx1ezIwRTN9XCI7XG52YXIgWldKMiA9IFwiXFxcXHV7MjAwRH1cIjtcbnZhciBGTEFHX1NFUVVFTkNFID0gXCJcXFxccHtSSX1cXFxccHtSSX1cIjtcbnZhciBUQUdfTU9EID0gYCg/OltcXFxcdXtFMDAyMH0tXFxcXHV7RTAwN0V9XStcXFxcdXtFMDA3Rn0pYDtcbnZhciBFTU9KSV9NT0QgPSBgKD86XFxcXHB7RU1vZH18JHtWUzE2fSR7S0VZQ0FQfT98JHtUQUdfTU9EfSlgO1xudmFyIEVNT0pJX05PVF9JREVOVElGSUVSID0gYCg/Oig/PVxcXFxQe1hJREN9KVxcXFxwe0Vtb2ppfSlgO1xudmFyIFpXSl9FTEVNRU5UID0gYCg/OiR7RU1PSklfTk9UX0lERU5USUZJRVJ9JHtFTU9KSV9NT0R9KnxcXFxccHtFbW9qaX0ke0VNT0pJX01PRH0rfCR7RkxBR19TRVFVRU5DRX0pYDtcbnZhciBQT1NTSUJMRV9FTU9KSSA9IGAoPzoke1pXSl9FTEVNRU5UfSkoJHtaV0oyfSR7WldKX0VMRU1FTlR9KSpgO1xudmFyIFNPTUVfRU1PSkkgPSBuZXcgUmVnRXhwKGAoPzoke1BPU1NJQkxFX0VNT0pJfSkrYCwgXCJ1XCIpO1xudmFyIE9OTFlfRU1PSklTID0gbmV3IFJlZ0V4cChgXig/OiR7UE9TU0lCTEVfRU1PSkl9KSskYCwgXCJ1XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVJZGVudGlmaWVyKHMpIHtcbiAgaWYgKHR5cGVvZiBzICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBcIm5vdC1hLXN0cmluZ1wiO1xuICBpZiAocyA9PT0gXCJcIilcbiAgICByZXR1cm4gXCJlbXB0eS1zdHJpbmdcIjtcbiAgaWYgKHMubm9ybWFsaXplKCkgIT09IHMpXG4gICAgcmV0dXJuIFwiZXhwZWN0ZWQtbmZjXCI7XG4gIGlmICgvW1xcdTIwMEVcXHUyMDBGXFx1MjA2Ni1cXHUyMDY5XFx1MjAyQS1cXHUyMDJFXS8udGVzdChzKSlcbiAgICByZXR1cm4gXCJ1bmV4cGVjdGVkLWJpZGktbWFya2VyXCI7XG4gIGlmIChPTkxZX0VNT0pJUy50ZXN0KHMpKVxuICAgIHJldHVybiBcInZhbGlkXCI7XG4gIGlmICgvXFxwe1hJREN9L3UudGVzdChzKSAmJiBTT01FX0VNT0pJLnRlc3QocykpXG4gICAgcmV0dXJuIFwidW5leHBlY3RlZC1taXhlZC1lbW9qaVwiO1xuICBpZiAoIWlzUmVjb21tZW5kZWRTY3JpcHRzKHMpKVxuICAgIHJldHVybiBcInVuZXhwZWN0ZWQtc2NyaXB0XCI7XG4gIGlmICghaXNWYWxpZElkZW50aWZpZXIocykpIHtcbiAgICBpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHNbMF0pKVxuICAgICAgcmV0dXJuIFwiaW52YWxpZC1maXJzdC1jaGFyXCI7XG4gICAgcmV0dXJuIFwiaW52YWxpZC1jaGFyXCI7XG4gIH1cbiAgcmV0dXJuIFwidmFsaWRcIjtcbn1cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgZXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJzdHJcIiBpbiBleHByKVxuICAgIHJldHVybiBleHByLnN0cjtcbiAgaWYgKHR5cGVvZiBleHByICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoZXhwci5sZW5ndGggPCAyKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoZXhwclswXSAhPT0gXCInXCIgfHwgZXhwcltleHByLmxlbmd0aCAtIDFdICE9PSBcIidcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGV4cHIuc3Vic3RyaW5nKDEsIGV4cHIubGVuZ3RoIC0gMSk7XG59XG5mdW5jdGlvbiBzdHJpcFRleHQoZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDAgfHwgc3RyaW5nVmFsdWUoZXhwcikgIT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBbXG4gICAgICBoLFxuICAgICAgLi4uKG9wcyhleHByKSA/PyBbXSkubWFwKCh4KSA9PiBzdHJpcFRleHQoeCkpLmZpbHRlcigoeCkgPT4geCAhPT0gbnVsbClcbiAgICBdO1xuICB9XG4gIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gaGVhZChleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpIHtcbiAgICBpZiAodHlwZW9mIGV4cHJbMF0gPT09IFwic3RyaW5nXCIgJiYgIWlzVmFsaWRJZGVudGlmaWVyKGV4cHJbMF0pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgSW52YWxpZCBpZGVudGlmaWVyIFwiJHtleHByWzBdfVwiOiAke3ZhbGlkYXRlSWRlbnRpZmllcihleHByWzBdKX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBleHByWzBdO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBleHByLmZuWzBdO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGhlYWROYW1lKGV4cHIpIHtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIHJldHVybiB0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiA/IGggOiBcIlwiO1xufVxuZnVuY3Rpb24gb3BzKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgZXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSlcbiAgICByZXR1cm4gZXhwci5zbGljZSgxKTtcbiAgaWYgKGlzRnVuY3Rpb25PYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIGV4cHIuZm4uc2xpY2UoMSk7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gb3AoZXhwciwgbikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKVxuICAgIHJldHVybiBleHByW25dID8/IG51bGw7XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBleHByLmZuW25dID8/IG51bGw7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gb3AxKGV4cHIpIHtcbiAgcmV0dXJuIG9wKGV4cHIsIDEpO1xufVxuZnVuY3Rpb24gb3AyKGV4cHIpIHtcbiAgcmV0dXJuIG9wKGV4cHIsIDIpO1xufVxuZnVuY3Rpb24gbm9wcyhleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gMDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cHIubGVuZ3RoIC0gMSk7XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBNYXRoLm1heCgwLCBleHByLmZuLmxlbmd0aCAtIDEpO1xuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIHN5bWJvbChleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKC9eWytcXC1cXC4wLTldLy50ZXN0KGV4cHIpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKGV4cHIubGVuZ3RoID49IDIgJiYgZXhwclswXSA9PT0gXCInXCIgJiYgZXhwcltleHByLmxlbmd0aCAtIDFdID09PSBcIidcIilcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHMgPSBpc1N5bWJvbE9iamVjdChleHByKSA/IGV4cHIuc3ltIDogZXhwcjtcbiAgaWYgKHR5cGVvZiBzICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIGlzTGlzdExpa2UoZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoIWggfHwgdHlwZW9mIGggIT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL14oTGlzdHxTZXF1ZW5jZXxUdXBsZXxTaW5nbGV8UGFpcnxUcmlwbGUpJC8udGVzdChoKTtcbn1cbmZ1bmN0aW9uIGtleVZhbHVlUGFpcihleHByKSB7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCA9PT0gXCJLZXlWYWx1ZVBhaXJcIiB8fCBoID09PSBcIlR1cGxlXCIgfHwgaCA9PT0gXCJQYWlyXCIpIHtcbiAgICBjb25zdCBrZXkgPSBzdHJpbmdWYWx1ZShvcDEoZXhwcikpO1xuICAgIGlmICgha2V5KVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIFtrZXksIG9wMihleHByKSA/PyBcIk5vdGhpbmdcIl07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkaWN0aW9uYXJ5KGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcImRpY3RcIiBpbiBleHByKVxuICAgIHJldHVybiBleHByLmRpY3Q7XG4gIGNvbnN0IGt2ID0ga2V5VmFsdWVQYWlyKGV4cHIpO1xuICBpZiAoa3YpXG4gICAgcmV0dXJuIHsgW2t2WzBdXToga3ZbMV0gfTtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIGlmIChoID09PSBcIkRpY3Rpb25hcnlcIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbm9wcyhleHByKTsgaSsrKSB7XG4gICAgICBjb25zdCBrdjIgPSBrZXlWYWx1ZVBhaXIob3AoZXhwciwgaSkpO1xuICAgICAgaWYgKGt2MilcbiAgICAgICAgcmVzdWx0W2t2MlswXV0gPSBrdjJbMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBtYWNoaW5lVmFsdWVPZlN0cmluZyhzKSB7XG4gIHMgPSBzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW25kXSQvZywgXCJcIikucmVwbGFjZSgvW1xcdTAwMDktXFx1MDAwZFxcdTAwMjBcXHUwMGEwXS9nLCBcIlwiKTtcbiAgaWYgKHMgPT09IFwibmFuXCIpXG4gICAgcmV0dXJuIE5hTjtcbiAgaWYgKHMgPT09IFwiK2luZmluaXR5XCIpXG4gICAgcmV0dXJuIEluZmluaXR5O1xuICBpZiAocyA9PT0gXCItaW5maW5pdHlcIilcbiAgICByZXR1cm4gLUluZmluaXR5O1xuICBpZiAoL1xcKFswLTldK1xcKS8udGVzdChzKSkge1xuICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IHMubWF0Y2goLyguKylcXCgoWzAtOV0rKVxcKSguKikkLykgPz8gW107XG4gICAgcyA9IGJvZHkgKyByZXBlYXQucmVwZWF0KE1hdGguY2VpbCgxNiAvIHJlcGVhdC5sZW5ndGgpKSArICh0cmFpbCA/PyBcIlwiKTtcbiAgfVxuICByZXR1cm4gcGFyc2VGbG9hdChzKTtcbn1cbmZ1bmN0aW9uIG1hY2hpbmVWYWx1ZShleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm51bWJlclwiKVxuICAgIHJldHVybiBleHByO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIG1hY2hpbmVWYWx1ZU9mU3RyaW5nKGV4cHIpO1xuICBpZiAoaXNOdW1iZXJPYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIG1hY2hpbmVWYWx1ZShleHByLm51bSk7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmF0aW9uYWxWYWx1ZShleHByKSB7XG4gIGlmIChleHByID09PSB2b2lkIDAgfHwgZXhwciA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHN5bWJvbChleHByKSA9PT0gXCJIYWxmXCIpXG4gICAgcmV0dXJuIFsxLCAyXTtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIGlmICghaClcbiAgICByZXR1cm4gbnVsbDtcbiAgbGV0IG51bWVyID0gbnVsbDtcbiAgbGV0IGRlbm9tID0gbnVsbDtcbiAgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCByID0gcmF0aW9uYWxWYWx1ZShvcDEoZXhwcikpO1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuIFstclswXSwgclsxXV07XG4gIH1cbiAgaWYgKGggPT09IFwiUmF0aW9uYWxcIiB8fCBoID09PSBcIkRpdmlkZVwiKSB7XG4gICAgbnVtZXIgPSBtYWNoaW5lVmFsdWUob3AxKGV4cHIpKSA/PyBOYU47XG4gICAgZGVub20gPSBtYWNoaW5lVmFsdWUob3AyKGV4cHIpKSA/PyBOYU47XG4gIH1cbiAgaWYgKGggPT09IFwiUG93ZXJcIikge1xuICAgIGNvbnN0IGV4cG9uZW50ID0gbWFjaGluZVZhbHVlKG9wMihleHByKSk7XG4gICAgaWYgKGV4cG9uZW50ID09PSAxKSB7XG4gICAgICBudW1lciA9IG1hY2hpbmVWYWx1ZShvcDEoZXhwcikpO1xuICAgICAgZGVub20gPSAxO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IC0xKSB7XG4gICAgICBudW1lciA9IDE7XG4gICAgICBkZW5vbSA9IG1hY2hpbmVWYWx1ZShvcDEoZXhwcikpO1xuICAgIH1cbiAgfVxuICBpZiAoaCA9PT0gXCJNdWx0aXBseVwiICYmIGhlYWQob3AyKGV4cHIpKSA9PT0gXCJQb3dlclwiICYmIG1hY2hpbmVWYWx1ZShvcDIob3AyKGV4cHIpKSkgPT09IC0xKSB7XG4gICAgbnVtZXIgPSBtYWNoaW5lVmFsdWUob3AxKGV4cHIpKTtcbiAgICBkZW5vbSA9IG1hY2hpbmVWYWx1ZShvcDEob3AyKGV4cHIpKSk7XG4gIH1cbiAgaWYgKG51bWVyID09PSBudWxsIHx8IGRlbm9tID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihudW1lcikgJiYgTnVtYmVyLmlzSW50ZWdlcihkZW5vbSkpXG4gICAgcmV0dXJuIFtudW1lciwgZGVub21dO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHN1YnMoZXhwciwgcykge1xuICBjb25zdCBoID0gaGVhZChleHByKTtcbiAgaWYgKGggIT09IG51bGwpXG4gICAgcmV0dXJuIFtzdWJzKGgsIHMpLCAuLi4ob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHN1YnMoeCwgcykpXTtcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcnkoZXhwcik7XG4gIGlmIChkaWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRpY3QpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpXG4gICAgICByZXN1bHRba2V5XSA9IHN1YnMoZGljdFtrZXldLCBzKTtcbiAgICByZXR1cm4geyBkaWN0OiByZXN1bHQgfTtcbiAgfVxuICBjb25zdCBzeW0gPSBzeW1ib2woZXhwcik7XG4gIGlmIChzeW0gJiYgc1tzeW1dKVxuICAgIHJldHVybiBzW3N5bV07XG4gIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gbWFwQXJncyhleHByLCBmbikge1xuICBsZXQgYXJncyA9IG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKVxuICAgIGFyZ3MgPSBleHByO1xuICBpZiAoaXNGdW5jdGlvbk9iamVjdChleHByKSlcbiAgICBhcmdzID0gZXhwci5mbjtcbiAgaWYgKGFyZ3MgPT09IG51bGwpXG4gICAgcmV0dXJuIFtdO1xuICBsZXQgaSA9IDE7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnB1c2goZm4oYXJnc1tpXSkpO1xuICAgIGkgKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKG9wMywgbGhzLCByaHMsIGFzc29jaWF0aXZpdHkgPSBcImJvdGhcIikge1xuICBpZiAoYXNzb2NpYXRpdml0eSA9PT0gXCJub25cIilcbiAgICByZXR1cm4gW29wMywgbGhzLCByaHNdO1xuICBjb25zdCBsaHNOYW1lID0gaGVhZChsaHMpO1xuICBjb25zdCByaHNOYW1lID0gaGVhZChyaHMpO1xuICBpZiAoYXNzb2NpYXRpdml0eSA9PT0gXCJsZWZ0XCIpIHtcbiAgICBpZiAobGhzTmFtZSA9PT0gb3AzKVxuICAgICAgcmV0dXJuIFtvcDMsIC4uLm9wcyhsaHMpID8/IFtdLCByaHNdO1xuICAgIHJldHVybiBbb3AzLCBsaHMsIHJoc107XG4gIH1cbiAgaWYgKGFzc29jaWF0aXZpdHkgPT09IFwicmlnaHRcIikge1xuICAgIGlmIChyaHNOYW1lID09PSBvcDMpXG4gICAgICByZXR1cm4gW29wMywgbGhzLCAuLi5vcHMocmhzKSA/PyBbXV07XG4gICAgcmV0dXJuIFtvcDMsIGxocywgcmhzXTtcbiAgfVxuICBpZiAobGhzTmFtZSA9PT0gb3AzICYmIHJoc05hbWUgPT09IG9wMykge1xuICAgIHJldHVybiBbb3AzLCAuLi5vcHMobGhzKSA/PyBbXSwgLi4ub3BzKHJocykgPz8gW11dO1xuICB9XG4gIGlmIChsaHNOYW1lID09PSBvcDMpXG4gICAgcmV0dXJuIFtvcDMsIC4uLm9wcyhsaHMpID8/IFtdLCByaHNdO1xuICBpZiAocmhzTmFtZSA9PT0gb3AzKVxuICAgIHJldHVybiBbb3AzLCBsaHMsIC4uLm9wcyhyaHMpID8/IFtdXTtcbiAgcmV0dXJuIFtvcDMsIGxocywgcmhzXTtcbn1cbmZ1bmN0aW9uIGdldFNlcXVlbmNlKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGxldCBoID0gaGVhZChleHByKTtcbiAgaWYgKGggPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICBleHByID0gb3AoZXhwciwgMSk7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gW107XG4gICAgaWYgKGhlYWQoZXhwcikgIT09IFwiU2VxdWVuY2VcIilcbiAgICAgIHJldHVybiBbZXhwcl07XG4gIH1cbiAgaCA9IGhlYWQoZXhwcik7XG4gIGlmIChoICE9PSBcIlNlcXVlbmNlXCIpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBvcHMoZXhwcikgPz8gW107XG59XG5mdW5jdGlvbiBpc0VtcHR5U2VxdWVuY2UoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiBoZWFkKGV4cHIpID09PSBcIlNlcXVlbmNlXCIgJiYgbm9wcyhleHByKSA9PT0gMDtcbn1cbmZ1bmN0aW9uIG1pc3NpbmdJZkVtcHR5KGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGV4cHIpKVxuICAgIHJldHVybiBNSVNTSU5HO1xuICByZXR1cm4gZXhwcjtcbn1cbmZ1bmN0aW9uIGNvdW50RnVuY3Rpb25MZWF2ZXMoeHMpIHtcbiAgaWYgKHhzWzBdID09PSBcIlNxdWFyZVwiKSB7XG4gICAgcmV0dXJuIGNvdW50RnVuY3Rpb25MZWF2ZXMoeHMuc2xpY2UoMSkpICsgMjtcbiAgfVxuICByZXR1cm4geHMucmVkdWNlKChhY2MsIHgpID0+IGFjYyArIGNvdW50TGVhdmVzKHgpLCAwKTtcbn1cbmZ1bmN0aW9uIGNvdW50TGVhdmVzKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIDA7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gMTtcbiAgaWYgKGlzTnVtYmVyRXhwcmVzc2lvbihleHByKSB8fCBpc1N5bWJvbE9iamVjdChleHByKSB8fCBpc1N0cmluZ09iamVjdChleHByKSlcbiAgICByZXR1cm4gMTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpXG4gICAgcmV0dXJuIGNvdW50RnVuY3Rpb25MZWF2ZXMoZXhwcik7XG4gIGlmIChcImZuXCIgaW4gZXhwcilcbiAgICByZXR1cm4gY291bnRGdW5jdGlvbkxlYXZlcyhleHByLmZuKTtcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcnkoZXhwcik7XG4gIGlmIChkaWN0KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRpY3QpO1xuICAgIHJldHVybiAxICsga2V5cy5sZW5ndGggKyBrZXlzLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyBjb3VudExlYXZlcyhkaWN0W3hdKSwgMCk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvc2VyaWFsaXplci1zdHlsZS50c1xuZnVuY3Rpb24gZ2V0QXBwbHlGdW5jdGlvblN0eWxlKF9leHByLCBfbGV2ZWwpIHtcbiAgcmV0dXJuIFwicGFyZW5cIjtcbn1cbmZ1bmN0aW9uIGdldEdyb3VwU3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJwYXJlblwiO1xufVxuZnVuY3Rpb24gZ2V0Um9vdFN0eWxlKF9leHByLCBsZXZlbCkge1xuICByZXR1cm4gbGV2ZWwgPiAyID8gXCJzb2xpZHVzXCIgOiBcInJhZGljYWxcIjtcbn1cbmZ1bmN0aW9uIGdldEZyYWN0aW9uU3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgaWYgKGxldmVsID4gMylcbiAgICByZXR1cm4gXCJpbmxpbmUtc29saWR1c1wiO1xuICBpZiAoaGVhZChleHByKSA9PT0gXCJEaXZpZGVcIikge1xuICAgIGNvbnN0IFtuLCBkXSA9IFtjb3VudExlYXZlcyhvcDEoZXhwcikpLCBjb3VudExlYXZlcyhvcDIoZXhwcikpXTtcbiAgICBpZiAoZCA8PSAyICYmIG4gPiA1KVxuICAgICAgcmV0dXJuIFwiZmFjdG9yXCI7XG4gICAgaWYgKG4gPD0gMiAmJiBkID4gNSlcbiAgICAgIHJldHVybiBcInJlY2lwcm9jYWxcIjtcbiAgfVxuICByZXR1cm4gXCJxdW90aWVudFwiO1xufVxuZnVuY3Rpb24gZ2V0TG9naWNTdHlsZShfZXhwciwgX2xldmVsKSB7XG4gIHJldHVybiBcImJvb2xlYW5cIjtcbn1cbmZ1bmN0aW9uIGdldFBvd2VyU3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJzb2xpZHVzXCI7XG59XG5mdW5jdGlvbiBnZXROdW1lcmljU2V0U3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJjb21wYWN0XCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1hcml0aG1ldGljLnRzXG5mdW5jdGlvbiBudW1lcmF0b3JEZW5vbWluYXRvcihleHByKSB7XG4gIGlmIChoZWFkKGV4cHIpICE9PSBcIk11bHRpcGx5XCIpXG4gICAgcmV0dXJuIFtbXSwgW11dO1xuICBjb25zdCBudW1lcmF0b3IgPSBbXTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBbXTtcbiAgY29uc3QgYXJncyA9IG9wcyhleHByKSA/PyBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChoZWFkKGFyZykgPT09IFwiUG93ZXJcIikge1xuICAgICAgY29uc3Qgb3AxMiA9IG9wKGFyZywgMSk7XG4gICAgICBjb25zdCBvcDIyID0gb3AoYXJnLCAyKTtcbiAgICAgIGlmIChoZWFkKG9wMjIpID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGIgPSBvcChvcDIyLCAxKTtcbiAgICAgICAgaWYgKG9wMTIgJiYgYilcbiAgICAgICAgICBkZW5vbWluYXRvci5wdXNoKFtcIlBvd2VyXCIsIG9wMTIsIGJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50VmFsID0gbWFjaGluZVZhbHVlKG9wMjIpID8/IE5hTjtcbiAgICAgICAgaWYgKGV4cG9uZW50VmFsID09PSAtMSkge1xuICAgICAgICAgIGlmIChvcDEyKVxuICAgICAgICAgICAgZGVub21pbmF0b3IucHVzaChvcDEyKTtcbiAgICAgICAgfSBlbHNlIGlmIChleHBvbmVudFZhbCA8IDApIHtcbiAgICAgICAgICBpZiAob3AxMilcbiAgICAgICAgICAgIGRlbm9taW5hdG9yLnB1c2goW1wiUG93ZXJcIiwgb3AxMiwgLWV4cG9uZW50VmFsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbnVtZXJhdG9yLnB1c2goYXJnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZChhcmcpID09PSBcIlJhdGlvbmFsXCIgJiYgbm9wcyhhcmcpID09PSAyKSB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoYXJnLCAxKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBvcChhcmcsIDIpO1xuICAgICAgaWYgKG1hY2hpbmVWYWx1ZShvcDEyKSAhPT0gMSlcbiAgICAgICAgbnVtZXJhdG9yLnB1c2gob3AxMik7XG4gICAgICBpZiAobWFjaGluZVZhbHVlKG9wMjIpICE9PSAxKVxuICAgICAgICBkZW5vbWluYXRvci5wdXNoKG9wMjIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByID0gcmF0aW9uYWxWYWx1ZShhcmcpO1xuICAgICAgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJbMF0gIT09IDEpXG4gICAgICAgICAgbnVtZXJhdG9yLnB1c2goclswXSk7XG4gICAgICAgIGRlbm9taW5hdG9yLnB1c2goclsxXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgbnVtZXJhdG9yLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtudW1lcmF0b3IsIGRlbm9taW5hdG9yXTtcbn1cbmZ1bmN0aW9uIHBhcnNlUm9vdChwYXJzZXIpIHtcbiAgY29uc3QgZGVncmVlID0gcGFyc2VyLnBhcnNlT3B0aW9uYWxHcm91cCgpO1xuICBjb25zdCBiYXNlID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICBpZiAoYmFzZSA9PT0gbnVsbCB8fCBpc0VtcHR5U2VxdWVuY2UoYmFzZSkpIHtcbiAgICBpZiAoZGVncmVlICE9PSBudWxsKVxuICAgICAgcmV0dXJuIFtcIlJvb3RcIiwgTUlTU0lORywgbWlzc2luZ0lmRW1wdHkoZGVncmVlKV07XG4gICAgcmV0dXJuIFtcIlNxcnRcIiwgTUlTU0lOR107XG4gIH1cbiAgaWYgKGRlZ3JlZSAhPT0gbnVsbClcbiAgICByZXR1cm4gW1wiUm9vdFwiLCBiYXNlLCBkZWdyZWVdO1xuICByZXR1cm4gW1wiU3FydFwiLCBiYXNlXTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVJvb3Qoc2VyaWFsaXplciwgc3R5bGUsIGJhc2UsIGRlZ3JlZSkge1xuICBpZiAoYmFzZSA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJcXFxcc3FydHt9XCI7XG4gIGRlZ3JlZSA9IGRlZ3JlZSA/PyAyO1xuICBpZiAoc3R5bGUgPT09IFwic29saWR1c1wiKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFNob3J0KGJhc2UpICsgXCJeezFcXFxcL1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwifVwiO1xuICB9IGVsc2UgaWYgKHN0eWxlID09PSBcInF1b3RpZW50XCIpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplci53cmFwU2hvcnQoYmFzZSkgKyBcIl57XFxcXGZyYWN7MX17XCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZWdyZWUpICsgXCJ9fVwiO1xuICB9XG4gIGNvbnN0IGRlZ3JlZVZhbHVlID0gbWFjaGluZVZhbHVlKGRlZ3JlZSk7XG4gIGlmIChkZWdyZWVWYWx1ZSA9PT0gMilcbiAgICByZXR1cm4gXCJcXFxcc3FydHtcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGJhc2UpICsgXCJ9XCI7XG4gIHJldHVybiBcIlxcXFxzcXJ0W1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwiXXtcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGJhc2UpICsgXCJ9XCI7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVBZGQoc2VyaWFsaXplciwgZXhwcikge1xuICBzZXJpYWxpemVyLmxldmVsIC09IDE7XG4gIGNvbnN0IG5hbWUgPSBoZWFkKGV4cHIpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IGFyZyA9IG9wKGV4cHIsIDEpO1xuICBpZiAobmFtZSA9PT0gXCJOZWdhdGVcIikge1xuICAgIHJlc3VsdCA9IFwiLVwiICsgc2VyaWFsaXplci53cmFwKGFyZywgMjc2KTtcbiAgfSBlbHNlIGlmIChuYW1lID09PSBcIkFkZFwiKSB7XG4gICAgaWYgKHNlcmlhbGl6ZXIuY2Fub25pY2FsICYmIG5vcHMoZXhwcikgPT09IDIgJiYgc2VyaWFsaXplci5vcHRpb25zLmludmlzaWJsZVBsdXMgIT09IFwiK1wiKSB7XG4gICAgICBjb25zdCBbb3AxMiwgb3AyMl0gPSBbb3AoZXhwciwgMSksIG9wKGV4cHIsIDIpXTtcbiAgICAgIGxldCBbbGhzLCByaHNdID0gW29wMTIsIG9wMjJdO1xuICAgICAgbGV0IGxoc1ZhbHVlID0gbWFjaGluZVZhbHVlKGxocyk7XG4gICAgICBsZXQgcmhzVmFsdWUgPSByYXRpb25hbFZhbHVlKHJocyk7XG4gICAgICBpZiAobGhzVmFsdWUgPT09IG51bGwgfHwgcmhzVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgW2xocywgcmhzXSA9IFtvcDIyLCBvcDEyXTtcbiAgICAgICAgbGhzVmFsdWUgPSBtYWNoaW5lVmFsdWUobGhzKTtcbiAgICAgICAgcmhzVmFsdWUgPSByYXRpb25hbFZhbHVlKHJocyk7XG4gICAgICB9XG4gICAgICBpZiAobGhzVmFsdWUgIT09IG51bGwgJiYgcmhzVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzRmluaXRlKGxoc1ZhbHVlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxoc1ZhbHVlKSAmJiBsaHNWYWx1ZSA+PSAwICYmIGxoc1ZhbHVlIDw9IDFlMyAmJiBpc0Zpbml0ZShyaHNWYWx1ZVswXSkgJiYgaXNGaW5pdGUocmhzVmFsdWVbMV0pICYmIHJoc1ZhbHVlWzBdID4gMCAmJiByaHNWYWx1ZVswXSA8PSAxMDAgJiYgcmhzVmFsdWVbMV0gPD0gMTAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGxocyksXG4gICAgICAgICAgICBzZXJpYWxpemVyLm9wdGlvbnMuaW52aXNpYmxlUGx1cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHJocylcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBzZXJpYWxpemVyLmxldmVsICs9IDE7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgdmFsID0gbWFjaGluZVZhbHVlKGFyZykgPz8gTmFOO1xuICAgIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZyk7XG4gICAgY29uc3QgbGFzdCA9IG5vcHMoZXhwcikgKyAxO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGFzdDsgaSsrKSB7XG4gICAgICBhcmcgPSBvcChleHByLCBpKTtcbiAgICAgIHZhbCA9IG1hY2hpbmVWYWx1ZShhcmcpID8/IE5hTjtcbiAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgIHJlc3VsdCArPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmcpO1xuICAgICAgfSBlbHNlIGlmIChoZWFkKGFyZykgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgICAgcmVzdWx0ICs9IHNlcmlhbGl6ZXIud3JhcChhcmcsIDI3NSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZXJtID0gc2VyaWFsaXplci53cmFwKGFyZywgMjc1KTtcbiAgICAgICAgaWYgKHRlcm1bMF0gPT09IFwiLVwiIHx8IHRlcm1bMF0gPT09IFwiK1wiKVxuICAgICAgICAgIHJlc3VsdCArPSB0ZXJtO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzdWx0ICs9IFwiK1wiICsgdGVybTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJTdWJ0cmFjdFwiKSB7XG4gICAgcmVzdWx0ID0gc2VyaWFsaXplci53cmFwKGFyZywgMjc1KTtcbiAgICBjb25zdCBhcmcyID0gb3AoZXhwciwgMik7XG4gICAgaWYgKGFyZzIgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm0gPSBzZXJpYWxpemVyLndyYXAoYXJnMiwgMjc1KTtcbiAgICAgIGlmICh0ZXJtWzBdID09PSBcIi1cIilcbiAgICAgICAgcmVzdWx0ICs9IFwiK1wiICsgdGVybS5zbGljZSgxKTtcbiAgICAgIGVsc2UgaWYgKHRlcm1bMF0gPT09IFwiK1wiKVxuICAgICAgICByZXN1bHQgKz0gXCItXCIgKyB0ZXJtLnNsaWNlKDEpO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBcIi1cIiArIHRlcm07XG4gICAgfVxuICB9XG4gIHNlcmlhbGl6ZXIubGV2ZWwgKz0gMTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZU11bHRpcGx5KHNlcmlhbGl6ZXIsIGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHNlcmlhbGl6ZXIubGV2ZWwgLT0gMTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGlmIChzZXJpYWxpemVyLmNhbm9uaWNhbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IFtudW1lciwgZGVub21dID0gbnVtZXJhdG9yRGVub21pbmF0b3IoZXhwcik7XG4gICAgaWYgKGRlbm9tLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChkZW5vbS5sZW5ndGggPT09IDEgJiYgZGVub21bMF0gPT09IDEpIHtcbiAgICAgICAgaWYgKG51bWVyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByZXN1bHQgPSBcIjFcIjtcbiAgICAgICAgZWxzZSBpZiAobnVtZXIubGVuZ3RoID09PSAxKVxuICAgICAgICAgIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG51bWVyWzBdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlc3VsdCA9IHNlcmlhbGl6ZU11bHRpcGx5KHNlcmlhbGl6ZXIsIFtcIk11bHRpcGx5XCIsIC4uLm51bWVyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShbXG4gICAgICAgICAgXCJEaXZpZGVcIixcbiAgICAgICAgICBudW1lci5sZW5ndGggPT09IDEgPyBudW1lclswXSA6IFtcIk11bHRpcGx5XCIsIC4uLm51bWVyXSxcbiAgICAgICAgICBkZW5vbS5sZW5ndGggPT09IDEgPyBkZW5vbVswXSA6IFtcIk11bHRpcGx5XCIsIC4uLmRlbm9tXVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJlc3VsdCkge1xuICAgIHNlcmlhbGl6ZXIubGV2ZWwgKz0gMTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxldCBpc05lZ2F0aXZlID0gZmFsc2U7XG4gIGxldCBhcmcgPSBudWxsO1xuICBjb25zdCBjb3VudCA9IG5vcHMoZXhwcikgKyAxO1xuICBsZXQgcHJldldhc051bWJlciA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBhcmcgPSBvcChleHByLCBpKTtcbiAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgY29udGludWU7XG4gICAgbGV0IHRlcm07XG4gICAgaWYgKGlzTnVtYmVyRXhwcmVzc2lvbihhcmcpKSB7XG4gICAgICB0ZXJtID0gc2VyaWFsaXplci5zZXJpYWxpemUoYXJnKTtcbiAgICAgIGlmICh0ZXJtID09PSBcIi0xXCIgJiYgIXJlc3VsdCkge1xuICAgICAgICByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpc05lZ2F0aXZlID0gIWlzTmVnYXRpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGVybVswXSA9PT0gXCItXCIpIHtcbiAgICAgICAgICB0ZXJtID0gdGVybS5zbGljZSgxKTtcbiAgICAgICAgICBpc05lZ2F0aXZlID0gIWlzTmVnYXRpdmU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gIXJlc3VsdCA/IHRlcm0gOiBqb2luTGF0ZXgoW3Jlc3VsdCwgc2VyaWFsaXplci5vcHRpb25zLm11bHRpcGx5LCB0ZXJtXSk7XG4gICAgICB9XG4gICAgICBwcmV2V2FzTnVtYmVyID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaGVhZChhcmcpID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGNvbnN0IHIgPSByYXRpb25hbFZhbHVlKG9wKGFyZywgMikpO1xuICAgICAgaWYgKHIpIHtcbiAgICAgICAgY29uc3QgW24sIGRdID0gcjtcbiAgICAgICAgaWYgKG4gPT09IDEgJiYgZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdCArPSBzZXJpYWxpemVSb290KFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIGdldFJvb3RTdHlsZShhcmcsIHNlcmlhbGl6ZXIubGV2ZWwpLFxuICAgICAgICAgICAgb3AoYXJnLCAxKSxcbiAgICAgICAgICAgIGRcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZXZXYXNOdW1iZXIgPSBmYWxzZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGVhZChhcmcpID09PSBcIlBvd2VyXCIgJiYgIWlzTmFOKG1hY2hpbmVWYWx1ZShvcChhcmcsIDEpKSA/PyBOYU4pKSB7XG4gICAgICB0ZXJtID0gc2VyaWFsaXplci5zZXJpYWxpemUoYXJnKTtcbiAgICAgIHJlc3VsdCA9ICFyZXN1bHQgPyB0ZXJtIDogam9pbkxhdGV4KFtyZXN1bHQsIHNlcmlhbGl6ZXIub3B0aW9ucy5tdWx0aXBseSwgdGVybV0pO1xuICAgICAgcHJldldhc051bWJlciA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGhlYWQoYXJnKSA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgYXJnID0gb3AoYXJnLCAxKTtcbiAgICAgIGlzTmVnYXRpdmUgPSAhaXNOZWdhdGl2ZTtcbiAgICB9XG4gICAgdGVybSA9IHNlcmlhbGl6ZXIud3JhcChhcmcsIDM5MCk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IHRlcm07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGggPSBoZWFkKGFyZyk7XG4gICAgICBpZiAocHJldldhc051bWJlciAmJiAoaCA9PT0gXCJEaXZpZGVcIiB8fCBoID09PSBcIlJhdGlvbmFsXCIpKSB7XG4gICAgICAgIHJlc3VsdCA9IGpvaW5MYXRleChbcmVzdWx0LCBzZXJpYWxpemVyLm9wdGlvbnMubXVsdGlwbHksIHRlcm1dKTtcbiAgICAgIH0gZWxzZSBpZiAoIXNlcmlhbGl6ZXIub3B0aW9ucy5pbnZpc2libGVNdWx0aXBseSkge1xuICAgICAgICByZXN1bHQgPSBqb2luTGF0ZXgoW3Jlc3VsdCwgdGVybV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc2VyaWFsaXplci5vcHRpb25zLmludmlzaWJsZU11bHRpcGx5LFxuICAgICAgICAgIHRlcm1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByZXZXYXNOdW1iZXIgPSBmYWxzZTtcbiAgfVxuICBzZXJpYWxpemVyLmxldmVsICs9IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlID8gXCItXCIgKyByZXN1bHQgOiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUZyYWN0aW9uKHBhcnNlcikge1xuICBsZXQgbnVtZXIgPSBwYXJzZXIucGFyc2VHcm91cCgpO1xuICBsZXQgZGVub20gPSBudWxsO1xuICBpZiAobnVtZXIgPT09IG51bGwpIHtcbiAgICBudW1lciA9IHBhcnNlci5wYXJzZVRva2VuKCk7XG4gICAgZGVub20gPSBwYXJzZXIucGFyc2VUb2tlbigpO1xuICB9IGVsc2Uge1xuICAgIGRlbm9tID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgfVxuICBudW1lciA9IG1pc3NpbmdJZkVtcHR5KG51bWVyKTtcbiAgZGVub20gPSBtaXNzaW5nSWZFbXB0eShkZW5vbSk7XG4gIGlmIChoZWFkKG51bWVyKSA9PT0gXCJQYXJ0aWFsRGVyaXZhdGl2ZVwiICYmIChoZWFkKGRlbm9tKSA9PT0gXCJQYXJ0aWFsRGVyaXZhdGl2ZVwiIHx8IGhlYWQoZGVub20pID09PSBcIk11bHRpcGx5XCIgJiYgaGVhZChvcChkZW5vbSwgMSkpID09PSBcIlBhcnRpYWxEZXJpdmF0aXZlXCIpKSB7XG4gICAgY29uc3QgZGVncmVlID0gb3AobnVtZXIsIDMpID8/IG51bGw7XG4gICAgbGV0IGZuID0gb3AobnVtZXIsIDEpO1xuICAgIGlmIChmbiA9PT0gbnVsbClcbiAgICAgIGZuID0gbWlzc2luZ0lmRW1wdHkocGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpKTtcbiAgICBsZXQgdmFycyA9IFtdO1xuICAgIGlmIChoZWFkKGRlbm9tKSA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGFyZyBvZiBvcHMoZGVub20pID8/IFtdKSB7XG4gICAgICAgIGlmIChoZWFkKGFyZykgPT09IFwiUGFydGlhbERlcml2YXRpdmVcIikge1xuICAgICAgICAgIGNvbnN0IHYgPSBvcChhcmcsIDIpO1xuICAgICAgICAgIGlmICh2KVxuICAgICAgICAgICAgdmFycy5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHYgPSBvcChkZW5vbSwgMik7XG4gICAgICBpZiAodilcbiAgICAgICAgdmFycy5wdXNoKHYpO1xuICAgIH1cbiAgICBpZiAodmFycy5sZW5ndGggPiAxKSB7XG4gICAgICB2YXJzID0gW1wiTGlzdFwiLCAuLi52YXJzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcIlBhcnRpYWxEZXJpdmF0aXZlXCIsIGZuLCAuLi52YXJzLCBkZWdyZWUgPT09IG51bGwgPyAxIDogZGVncmVlXTtcbiAgfVxuICByZXR1cm4gW1wiRGl2aWRlXCIsIG51bWVyLCBkZW5vbV07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVGcmFjdGlvbihzZXJpYWxpemVyLCBleHByKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBudW1lciA9IG1pc3NpbmdJZkVtcHR5KG9wKGV4cHIsIDEpKTtcbiAgY29uc3QgZGVub20gPSBtaXNzaW5nSWZFbXB0eShvcChleHByLCAyKSk7XG4gIGNvbnN0IHN0eWxlID0gc2VyaWFsaXplci5jYW5vbmljYWwgPyBnZXRGcmFjdGlvblN0eWxlKGV4cHIsIHNlcmlhbGl6ZXIubGV2ZWwpIDogXCJxdW90aWVudFwiO1xuICBpZiAoc3R5bGUgPT09IFwiaW5saW5lLXNvbGlkdXNcIiB8fCBzdHlsZSA9PT0gXCJuaWNlLXNvbGlkdXNcIikge1xuICAgIGNvbnN0IG51bWVyU3RyID0gc2VyaWFsaXplci53cmFwU2hvcnQobnVtZXIpO1xuICAgIGNvbnN0IGRlbm9tU3RyID0gc2VyaWFsaXplci53cmFwU2hvcnQoZGVub20pO1xuICAgIGlmIChzdHlsZSA9PT0gXCJpbmxpbmUtc29saWR1c1wiKVxuICAgICAgcmV0dXJuIGAke251bWVyU3RyfVxcXFwvJHtkZW5vbVN0cn1gO1xuICAgIHJldHVybiBge31eeyR7bnVtZXJTdHJ9fVxcXFwhXFxcXCEvXFxcXCF7fV97JHtkZW5vbVN0cn19YDtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJyZWNpcHJvY2FsXCIpIHtcbiAgICBpZiAobWFjaGluZVZhbHVlKG51bWVyKSA9PT0gMSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVyLndyYXAoZGVub20pICsgXCJeey0xfVwiO1xuICAgIHJldHVybiBzZXJpYWxpemVyLndyYXAobnVtZXIpICsgc2VyaWFsaXplci53cmFwKGRlbm9tKSArIFwiXnstMX1cIjtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJmYWN0b3JcIikge1xuICAgIGlmIChtYWNoaW5lVmFsdWUoZGVub20pID09PSAxKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcChudW1lcik7XG4gICAgcmV0dXJuIFwiXFxcXGZyYWN7MX17XCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZW5vbSkgKyBcIn17XCIgKyBzZXJpYWxpemVyLndyYXAobnVtZXIpICsgXCJ9XCI7XG4gIH1cbiAgY29uc3QgbnVtZXJMYXRleCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG51bWVyKTtcbiAgY29uc3QgZGVub21MYXRleCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbm9tKTtcbiAgcmV0dXJuIGBcXFxcZnJhY3ske251bWVyTGF0ZXh9fXske2Rlbm9tTGF0ZXh9fWA7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVQb3dlcihzZXJpYWxpemVyLCBleHByKSB7XG4gIGNvbnN0IG5hbWUgPSBoZWFkKGV4cHIpO1xuICBjb25zdCBiYXNlID0gbWlzc2luZ0lmRW1wdHkob3AoZXhwciwgMSkpO1xuICBpZiAobmFtZSA9PT0gXCJTcXJ0XCIpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplUm9vdChcbiAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCAtIDEpLFxuICAgICAgYmFzZSxcbiAgICAgIDJcbiAgICApO1xuICB9XG4gIGNvbnN0IGV4cDIgPSBtaXNzaW5nSWZFbXB0eShvcChleHByLCAyKSk7XG4gIGlmIChuYW1lID09PSBcIlJvb3RcIilcbiAgICByZXR1cm4gc2VyaWFsaXplUm9vdChcbiAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCAtIDEpLFxuICAgICAgYmFzZSxcbiAgICAgIGV4cDJcbiAgICApO1xuICBpZiAoc2VyaWFsaXplci5jYW5vbmljYWwpIHtcbiAgICBjb25zdCB2YWwyID0gbWFjaGluZVZhbHVlKGV4cDIpID8/IDE7XG4gICAgaWYgKHZhbDIgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoW1wiRGl2aWRlXCIsIFwiMVwiLCBiYXNlXSk7XG4gICAgfSBlbHNlIGlmICh2YWwyIDwgMCkge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKFtcIkRpdmlkZVwiLCBcIjFcIiwgW1wiUG93ZXJcIiwgYmFzZSwgLXZhbDJdXSk7XG4gICAgfSBlbHNlIGlmIChoZWFkKGV4cDIpID09PSBcIkRpdmlkZVwiIHx8IGhlYWQoZXhwMikgPT09IFwiUmF0aW9uYWxcIikge1xuICAgICAgaWYgKG1hY2hpbmVWYWx1ZShvcChleHAyLCAxKSkgPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVSb290KHNlcmlhbGl6ZXIsIHN0eWxlLCBiYXNlLCBvcChleHAyLCAyKSk7XG4gICAgICB9XG4gICAgICBpZiAobWFjaGluZVZhbHVlKG9wKGV4cDIsIDIpKSA9PT0gMikge1xuICAgICAgICByZXR1cm4gYCR7c2VyaWFsaXplci5zZXJpYWxpemUoW1wiU3FydFwiLCBiYXNlXSl9Xnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKFxuICAgICAgICAgIG9wKGV4cDIsIDEpXG4gICAgICAgICl9fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkKGV4cDIpID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGlmIChtYWNoaW5lVmFsdWUob3AoZXhwMiwgMikpID09PSAtMSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldFJvb3RTdHlsZShleHByLCBzZXJpYWxpemVyLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVJvb3Qoc2VyaWFsaXplciwgc3R5bGUsIGJhc2UsIG9wKGV4cDIsIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFNob3J0KGJhc2UpICsgXCJee1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZXhwMikgKyBcIn1cIjtcbn1cbnZhciBERUZJTklUSU9OU19BUklUSE1FVElDID0gW1xuICAvLyBDb25zdGFudHNcbiAgeyBuYW1lOiBcIkNhdGFsYW5Db25zdGFudFwiLCBzZXJpYWxpemU6IFwiR1wiIH0sXG4gIHsgbmFtZTogXCJHb2xkZW5SYXRpb1wiLCBzZXJpYWxpemU6IFwiXFxcXHZhcnBoaVwiIH0sXG4gIHsgbmFtZTogXCJFdWxlckdhbW1hXCIsIHNlcmlhbGl6ZTogXCJcXFxcZ2FtbWFcIiB9LFxuICB7XG4gICAgbmFtZTogXCJEZWdyZWVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZGVncmVlXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDg4MCxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGxocykgPT4gW1wiRGVncmVlc1wiLCBsaHNdLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSwgXCJcXFxcZGVncmVlXCJdKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxkZWdyZWVcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIjx7PlwiLCBcIlxcXFxjaXJjXCIsIFwiPH0+XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxjaXJjXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFx4QjBcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFuZ1wiXSxcbiAgICBwYXJzZTogKHBhcnNlcikgPT4ge1xuICAgICAgY29uc3QgYXJnID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIHJldHVybiBhcmcgPT09IG51bGwgPyBbXCJEZWdyZWVzXCJdIDogW1wiRGVncmVlc1wiLCBhcmddO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGluZnR5XCJdLFxuICAgIHBhcnNlOiB7IG51bTogXCIrSW5maW5pdHlcIiB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbXBsZXhJbmZpbml0eVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbGRlXCIsIFwiXFxcXGluZnR5XCJdLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcdGlsZGVcXFxcaW5mdHlcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGlsZGVcIiwgXCI8ez5cIiwgXCJcXFxcaW5mdHlcIiwgXCI8fT5cIl0sXG4gICAgcGFyc2U6IFwiQ29tcGxleEluZmluaXR5XCJcbiAgfSxcbiAgeyBuYW1lOiBcIlBpXCIsIGtpbmQ6IFwic3ltYm9sXCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBpXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBbXCJcXHUwM0MwXCJdLCBwYXJzZTogXCJQaVwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIkV4cG9uZW50aWFsRVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGV4cG9uZW50aWFsRVwiXSxcbiAgICBwYXJzZTogXCJFeHBvbmVudGlhbEVcIixcbiAgICBzZXJpYWxpemU6IFwiXFxcXGV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG9wZXJhdG9ybmFtZXtlfVwiLFxuICAgIHBhcnNlOiBcIkV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG1hdGhybXtlfVwiLFxuICAgIHBhcnNlOiBcIkV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiZXhwXCIsXG4gICAgcGFyc2U6IFwiRXhwXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcZXhwXCIsXG4gICAgcGFyc2U6IFwiRXhwXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSW1hZ2luYXJ5VW5pdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGltYWdpbmFyeUlcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le2l9XCIsXG4gICAgcGFyc2U6IFwiSW1hZ2luYXJ5VW5pdFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG1hdGhybXtpfVwiLFxuICAgIHBhcnNlOiBcIkltYWdpbmFyeVVuaXRcIlxuICB9LFxuICAvLyBPcGVyYXRpb25zXG4gIHtcbiAgICAvKiogQ291bGQgYmUgdGhlIGRldGVybWluYW50IGlmIHRoZSBhcmd1bWVudCBpcyBhIG1hdHJpeCAqL1xuICAgIC8qKiBAdG9kbzogZG9tYWluIGNoZWNrICovXG4gICAgLyoqIElmIGEgbGl0ZXJhbCBtYXRyaXgsIHRoZSBgc2VyaWFsaXplYCBzaG91bGQgYmUgY3VzdG9tLCB0aGUgcGFyZW5zIGFyZVxuICAgICAqIHJlcGxhY2VkIHdpdGggYmFycyAqL1xuICAgIG5hbWU6IFwiQWJzXCIsXG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBcInxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwifFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgYm9keSkgPT4gaXNFbXB0eVNlcXVlbmNlKGJvZHkpID8gbnVsbCA6IFtcIkFic1wiLCBib2R5XVxuICB9LFxuICB7XG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiYWJzXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIHBhcnNlOiBcIkFic1wiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkFkZFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMjc1LFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHVudGlsKSA9PiB7XG4gICAgICBpZiAodW50aWwgJiYgMjc1IDwgdW50aWwubWluUHJlYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udW50aWwsIG1pblByZWM6IDI3NSB9KTtcbiAgICAgIGlmIChyaHMgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIkFkZFwiLCBsaHMsIHJocyk7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUFkZFxuICB9LFxuICB7XG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIitcIl0sXG4gICAgcHJlY2VkZW5jZTogMjc1LFxuICAgIHBhcnNlOiAocGFyc2VyLCB1bnRpbCkgPT4ge1xuICAgICAgaWYgKHVudGlsICYmIDI3NSA8IHVudGlsLm1pblByZWMpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyAuLi51bnRpbCwgbWluUHJlYzogNDAwIH0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ2VpbFwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbGNlaWxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXHJjZWlsXCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBib2R5KSA9PiBpc0VtcHR5U2VxdWVuY2UoYm9keSkgPyBudWxsIDogW1wiQ2VpbFwiLCBib2R5XVxuICB9LFxuICB7XG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBbXCJcXHUyMzA4XCJdLFxuICAgIGNsb3NlVHJpZ2dlcjogW1wiXFx1MjMwOVwiXSxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJDZWlsXCIsIGJvZHldXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJjZWlsXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIHBhcnNlOiBcIkNlaWxcIlxuICB9LFxuICB7IG5hbWU6IFwiQ2hvcFwiLCBpZGVudGlmaWVyVHJpZ2dlcjogXCJjaG9wXCIsIGtpbmQ6IFwiZnVuY3Rpb25cIiwgcGFyc2U6IFwiQ2hvcFwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbXBsZXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzQsXG4gICAgLy8gT25lIGxlc3MgdGhhbiBwcmVjZWRlbmNlIG9mIGBBZGRgOiB1c2VkIGZvciBjb3JyZWN0IHdyYXBwaW5nXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgcmUgPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMSkpO1xuICAgICAgY29uc3QgaW0gPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMikpO1xuICAgICAgaWYgKGltID09PSAwKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpO1xuICAgICAgY29uc3QgaW1QYXJ0ID0gaW0gPT09IDEgPyBcIlxcXFxpbWFnaW5hcnlJXCIgOiBpbSA9PT0gLTEgPyBcIi1cXFxcaW1hZ2luYXJ5SVwiIDogam9pbkxhdGV4KFtzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSksIFwiXFxcXGltYWdpbmFyeUlcIl0pO1xuICAgICAgaWYgKHJlID09PSAwKVxuICAgICAgICByZXR1cm4gaW1QYXJ0O1xuICAgICAgaWYgKGltICE9PSBudWxsICYmIGltIDwgMClcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBpbVBhcnRdKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSwgXCIrXCIsIGltUGFydF0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRGl2aWRlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxmcmFjXCIsXG4gICAgcHJlY2VkZW5jZTogNjYwLFxuICAgIC8vIEZvciBcXGZyYWMgc3BlY2lmaWNhbGx5LCBub3QgZm9yIFxcZGl2LCBldGMuLlxuICAgIC8vIGhhbmRsZXMgTGVpYm5pdHogbm90YXRpb24gZm9yIHBhcnRpYWwgZGVyaXZhdGl2ZXNcbiAgICBwYXJzZTogcGFyc2VGcmFjdGlvbixcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUZyYWN0aW9uXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvdmVyXCIsXG4gICAgcHJlY2VkZW5jZTogNjYwLFxuICAgIHBhcnNlOiBcIkRpdmlkZVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFwvXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcIm5vblwiLFxuICAgIHByZWNlZGVuY2U6IDY2MCxcbiAgICAvLyA/Pz8gTWF0aE1MIGhhcyAyNjUsIGJ1dCBpdCdzIHdyb25nLlxuICAgIC8vIEl0IGhhcyB0byBiZSBhdCBsZWFzdCBoaWdoZXIgdGhhbiBtdWx0aXBseVxuICAgIC8vIGUuZy4gYDEvMiszKnhgIC0+IGAxLzIgKyAzKnhgICwgbm90IGAxLygyKzMqeClgXG4gICAgcGFyc2U6IFwiRGl2aWRlXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiL1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJub25cIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgcGFyc2U6IFwiRGl2aWRlXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGRpdlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJub25cIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgLy8gPz8/IGFjY29yZGluZyB0byBNYXRoTUxcbiAgICBwYXJzZTogXCJEaXZpZGVcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFeHBcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgICBpZiAoc3ltYm9sKG9wMTIpIHx8IG1hY2hpbmVWYWx1ZShvcDEyKSAhPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbXCJcXFxcZXhwb25lbnRpYWxFXntcIiwgc2VyaWFsaXplci5zZXJpYWxpemUob3AxMildKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1wiXFxcXGV4cFwiLCBzZXJpYWxpemVyLndyYXAobWlzc2luZ0lmRW1wdHkob3AxMikpXSk7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGYWN0b3JpYWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIiFcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODEwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkZhY3RvcmlhbDJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIiFcIiwgXCIhXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGbG9vclwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbGZsb29yXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIlxcXFxyZmxvb3JcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJGbG9vclwiLCBib2R5XVxuICB9LFxuICB7XG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBbXCJcXHUyMzBBXCJdLFxuICAgIGNsb3NlVHJpZ2dlcjogW1wiXFx1MjMwQlwiXSxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJGbG9vclwiLCBib2R5XVxuICB9LFxuICB7XG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiZmxvb3JcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgcGFyc2U6IFwiRmxvb3JcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcR2FtbWFcIl0sXG4gICAgcGFyc2U6IFwiR2FtbWFcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJHY2RcIixcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJnY2RcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSGFsZlwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcZnJhYzEyXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGdcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZ1wiXSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiBcIlxcXFxsb2dfezEwfVwiICsgc2VyaWFsaXplci53cmFwQXJndW1lbnRzKGV4cHIpLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIik7XG4gICAgICBpZiAoYXJncyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiTGdcIjtcbiAgICAgIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgMTBdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGJcIixcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXGxiXCIsXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZXIucGFyc2VBcmd1bWVudHMoXCJpbXBsaWNpdFwiKTtcbiAgICAgIGlmIChhcmdzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gXCJMb2dcIjtcbiAgICAgIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgMl07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxuXCJdLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IFwiXFxcXGxuXCIgKyBzZXJpYWxpemVyLndyYXBBcmd1bWVudHMoZXhwciksXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHBhcnNlTG9nKFwiTG5cIiwgcGFyc2VyKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMb2dcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsb2dcIl0sXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHBhcnNlTG9nKFwiTG9nXCIsIHBhcnNlciksXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IG9wMihleHByKTtcbiAgICAgIGlmIChiYXNlKVxuICAgICAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgICAgICBcIlxcXFxsb2dfe1wiLFxuICAgICAgICAgIGJhc2UudG9TdHJpbmcoKSxcbiAgICAgICAgICBcIn1cIixcbiAgICAgICAgICBzZXJpYWxpemVyLndyYXAob3AxKGV4cHIpKVxuICAgICAgICBdKTtcbiAgICAgIHJldHVybiBcIlxcXFxsb2dcIiArIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxjbVwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImxjbVwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIlxuICB9LFxuICB7IG5hbWU6IFwiTWF4XCIsIGlkZW50aWZpZXJUcmlnZ2VyOiBcIm1heFwiLCBraW5kOiBcImZ1bmN0aW9uXCIgfSxcbiAgeyBuYW1lOiBcIk1pblwiLCBpZGVudGlmaWVyVHJpZ2dlcjogXCJtaW5cIiwga2luZDogXCJmdW5jdGlvblwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIk1pbnVzUGx1c1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG1wXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcImJvdGhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTXVsdGlwbHlcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aW1lc1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplTXVsdGlwbHlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNkb3RcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDM5MCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogMzkyIH0pO1xuICAgICAgaWYgKHJocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFtcIk11bHRpcGx5XCIsIGxocywgTUlTU0lOR107XG4gICAgICByZXR1cm4gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKFwiTXVsdGlwbHlcIiwgbGhzLCByaHMpO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiKlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyAuLi50ZXJtaW5hdG9yLCBtaW5QcmVjOiAzOTIgfSk7XG4gICAgICBpZiAocmhzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gW1wiTXVsdGlwbHlcIiwgbGhzLCBNSVNTSU5HXTtcbiAgICAgIHJldHVybiBhcHBseUFzc29jaWF0aXZlT3BlcmF0b3IoXCJNdWx0aXBseVwiLCBsaHMsIHJocyk7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOZWdhdGVcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIi1cIl0sXG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IDQwMCB9KTtcbiAgICAgIHJldHVybiBbXCJOZWdhdGVcIiwgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfSxcbiAgICBwcmVjZWRlbmNlOiAyNzVcbiAgfSxcbiAgLy8ge1xuICAvLyAgIC8qKiBJZiB0aGUgYXJndW1lbnQgaXMgYSB2ZWN0b3IgKi9cbiAgLy8gICAvKiogQHRvZG86IGRvbWFpbiBjaGVjayAqL1xuICAvLyAgIG5hbWU6ICdOb3JtJyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd8JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ3wnLFxuICAvLyB9LFxuICAvLyB7XG4gIC8vICAgLyoqIElmIHRoZSBhcmd1bWVudCBpcyBhIHNldCAqL1xuICAvLyAgIC8qKiBAdG9kbzogZG9tYWluIGNoZWNrICovXG4gIC8vICAgbmFtZTogJ0NhcmRpbmFsaXR5JyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd8JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ3wnLFxuICAvLyB9LFxuICB7XG4gICAgLy8gICAvKiogSWYgdGhlIGFyZ3VtZW50IGlzIGEgdmVjdG9yICovXG4gICAgLyoqIEB0b2RvOiBkb21haW4gY2hlY2sgKi9cbiAgICBraW5kOiBcIm1hdGNoZml4XCIsXG4gICAgb3BlblRyaWdnZXI6IFwifHxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwifHxcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGV4cHIpID0+IGlzRW1wdHlTZXF1ZW5jZShleHByKSA/IG51bGwgOiBbXCJOb3JtXCIsIGV4cHJdXG4gIH0sXG4gIHtcbiAgICAvLyAgIC8qKiBJZiB0aGUgYXJndW1lbnQgaXMgYSB2ZWN0b3IgKi9cbiAgICAvKiogQHRvZG86IGRvbWFpbiBjaGVjayAqL1xuICAgIG5hbWU6IFwiTm9ybVwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogW1wiXFxcXGxlZnRcIiwgXCJcXFxcVmVydFwiXSxcbiAgICBjbG9zZVRyaWdnZXI6IFtcIlxcXFxyaWdodFwiLCBcIlxcXFxWZXJ0XCJdLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgZXhwcikgPT4gaXNFbXB0eVNlcXVlbmNlKGV4cHIpID8gbnVsbCA6IFtcIk5vcm1cIiwgZXhwcl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUGx1c01pbnVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccG1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgICBpZiAob3AxMiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXFxcXHBtXCI7XG4gICAgICBpZiAobm9wcyhleHByKSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbXCJcXFxccG1cIiwgc2VyaWFsaXplci5zZXJpYWxpemUob3AxMildKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBvcChleHByLCAyKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcDEyKSxcbiAgICAgICAgXCJcXFxccG1cIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AyMilcbiAgICAgIF0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBtXCJdLFxuICAgIGtpbmQ6IFwicHJlZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjcwLFxuICAgIHBhcnNlOiAocGFyc2VyLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogNDAwIH0pO1xuICAgICAgcmV0dXJuIFtcIlBsdXNNaW51c1wiLCBtaXNzaW5nSWZFbXB0eShyaHMpXTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxwbHVzbW5cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogNDAwIH0pO1xuICAgICAgcmV0dXJuIFtcIlBsdXNNaW51c1wiLCBsaHMsIG1pc3NpbmdJZkVtcHR5KHJocyldO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBsdXNtblwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBwYXJzZTogKHBhcnNlciwgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IDQwMCB9KTtcbiAgICAgIHJldHVybiBbXCJQbHVzTWludXNcIiwgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJQb3dlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemVQb3dlclxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxwcm9kXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIG5hbWU6IFwiUHJvZHVjdFwiLFxuICAgIHBhcnNlOiBwYXJzZUJpZ09wKFwiUHJvZHVjdFwiLCAzOTApLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplQmlnT3AoXCJcXFxccHJvZFwiKVxuICB9LFxuICAvLyB7XG4gIC8vICAgdHJpZ2dlcjogWycqJywgJyonXSxcbiAgLy8gICBraW5kOiAnaW5maXgnLFxuICAvLyAgIGFzc29jaWF0aXZpdHk6ICdub24nLFxuICAvLyAgIHByZWNlZGVuY2U6IDcyMCxcbiAgLy8gfSxcbiAge1xuICAgIG5hbWU6IFwiUmF0aW9uYWxcIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKGV4cHIgJiYgbm9wcyhleHByKSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIFwiXFxcXG9wZXJhdG9ybmFtZXtSYXRpb25hbH1cIiArIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICAgIHJldHVybiBzZXJpYWxpemVGcmFjdGlvbihzZXJpYWxpemVyLCBleHByKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlJvb3RcIixcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZVBvd2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlJvdW5kXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwicm91bmRcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3F1YXJlXCIsXG4gICAgcHJlY2VkZW5jZTogNzIwLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHNlcmlhbGl6ZXIud3JhcFNob3J0KG9wKGV4cHIsIDEpKSArIFwiXjJcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3VtXCJdLFxuICAgIHByZWNlZGVuY2U6IDI3NSxcbiAgICBuYW1lOiBcIlN1bVwiLFxuICAgIHBhcnNlOiBwYXJzZUJpZ09wKFwiU3VtXCIsIDI3NSksXG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemVCaWdPcChcIlxcXFxzdW1cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2lnblwiLFxuICAgIC8vIEFzIHBlciBJU08gODAwMDAtMiwgXCJzaWdudW1cIiBpcyAnc2duJ1xuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcInNnblwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXJ0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3FydFwiXSxcbiAgICBwYXJzZTogcGFyc2VSb290LFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplUG93ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3VidHJhY3RcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIi1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3NSxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogMjc3IH0pO1xuICAgICAgcmV0dXJuIFtcIlN1YnRyYWN0XCIsIGxocywgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfVxuICB9XG5dO1xuZnVuY3Rpb24gcGFyc2VCaWdPcChuYW1lLCBwcmVjKSB7XG4gIHJldHVybiAocGFyc2VyKSA9PiB7XG4gICAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICAgIGxldCBzdXAgPSBudWxsO1xuICAgIGxldCBzdWIyID0gbnVsbDtcbiAgICB3aGlsZSAoIShzdWIyICYmIHN1cCkgJiYgKHBhcnNlci5wZWVrID09PSBcIl9cIiB8fCBwYXJzZXIucGVlayA9PT0gXCJeXCIpKSB7XG4gICAgICBpZiAocGFyc2VyLm1hdGNoKFwiX1wiKSlcbiAgICAgICAgc3ViMiA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIl5cIikpXG4gICAgICAgIHN1cCA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHN1YjIgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdWIyKSlcbiAgICAgIHN1YjIgPSBudWxsO1xuICAgIGlmIChzdXAgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdXApKVxuICAgICAgc3VwID0gbnVsbDtcbiAgICBsZXQgaW5kZXggPSBudWxsO1xuICAgIGxldCBsb3dlciA9IG51bGw7XG4gICAgaWYgKGhlYWQoc3ViMikgPT09IFwiRXF1YWxcIikge1xuICAgICAgaW5kZXggPSBvcChzdWIyLCAxKTtcbiAgICAgIGxvd2VyID0gb3Aoc3ViMiwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gc3ViMjtcbiAgICB9XG4gICAgY29uc3Qgc3ltID0gc3ltYm9sKGluZGV4KTtcbiAgICBpZiAoc3ltKVxuICAgICAgcGFyc2VyLmNvbXB1dGVFbmdpbmU/LnB1c2hTY29wZSh7IFtzeW1dOiB7IGRvbWFpbjogXCJJbnRlZ2VyXCIgfSB9KTtcbiAgICBjb25zdCBmbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyBtaW5QcmVjOiBwcmVjICsgMSB9KTtcbiAgICBpZiAoc3ltKVxuICAgICAgcGFyc2VyLmNvbXB1dGVFbmdpbmU/LnBvcFNjb3BlKCk7XG4gICAgaWYgKCFmbilcbiAgICAgIHJldHVybiBbbmFtZV07XG4gICAgaWYgKHN1cClcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZuLFxuICAgICAgICBbXCJUdXBsZVwiLCBpbmRleCA/IFtcIkhvbGRcIiwgaW5kZXhdIDogXCJOb3RoaW5nXCIsIGxvd2VyID8/IDEsIHN1cF1cbiAgICAgIF07XG4gICAgaWYgKGxvd2VyKVxuICAgICAgcmV0dXJuIFtuYW1lLCBmbiwgW1wiVHVwbGVcIiwgaW5kZXggPyBbXCJIb2xkXCIsIGluZGV4XSA6IFwiTm90aGluZ1wiLCBsb3dlcl1dO1xuICAgIGlmIChpbmRleClcbiAgICAgIHJldHVybiBbbmFtZSwgZm4sIFtcIlR1cGxlXCIsIFtcIkhvbGRcIiwgaW5kZXhdXV07XG4gICAgcmV0dXJuIFtuYW1lLCBmbl07XG4gIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCaWdPcChjb21tYW5kKSB7XG4gIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgIGlmICghb3AoZXhwciwgMSkpXG4gICAgICByZXR1cm4gY29tbWFuZDtcbiAgICBsZXQgYXJnID0gb3AoZXhwciwgMik7XG4gICAgY29uc3QgaCA9IGhlYWQoYXJnKTtcbiAgICBpZiAoaCAhPT0gXCJUdXBsZVwiICYmIGggIT09IFwiVHJpcGxlXCIgJiYgaCAhPT0gXCJQYWlyXCIgJiYgaCAhPT0gXCJTaW5nbGVcIilcbiAgICAgIGFyZyA9IG51bGw7XG4gICAgbGV0IGluZGV4ID0gb3AoYXJnLCAxKTtcbiAgICBpZiAoaW5kZXggJiYgaGVhZChpbmRleCkgPT09IFwiSG9sZFwiKVxuICAgICAgaW5kZXggPSBvcChpbmRleCwgMSk7XG4gICAgY29uc3QgZm4gPSBvcChleHByLCAxKTtcbiAgICBpZiAoIWFyZykge1xuICAgICAgaWYgKCFvcChleHByLCAyKSlcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbY29tbWFuZCwgXCJfblwiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShmbildKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBcIl97XCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IGxvd2VyID0gb3AoYXJnLCAyKTtcbiAgICBsZXQgc3ViMiA9IFtdO1xuICAgIGlmIChpbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIiAmJiBsb3dlcilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXgpLCBcIj1cIiwgc2VyaWFsaXplci5zZXJpYWxpemUobG93ZXIpXTtcbiAgICBlbHNlIGlmIChpbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXgpXTtcbiAgICBlbHNlIGlmIChsb3dlcilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUobG93ZXIpXTtcbiAgICBpZiAoc3ViMi5sZW5ndGggPiAwKVxuICAgICAgc3ViMiA9IFtcIl97XCIsIC4uLnN1YjIsIFwifVwiXTtcbiAgICBsZXQgc3VwID0gW107XG4gICAgaWYgKG9wKGFyZywgMykpXG4gICAgICBzdXAgPSBbXCJee1wiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChhcmcsIDMpKSwgXCJ9XCJdO1xuICAgIHJldHVybiBqb2luTGF0ZXgoW2NvbW1hbmQsIC4uLnN1cCwgLi4uc3ViMiwgc2VyaWFsaXplci5zZXJpYWxpemUoZm4pXSk7XG4gIH07XG59XG5mdW5jdGlvbiBwYXJzZUxvZyhjb21tYW5kLCBwYXJzZXIpIHtcbiAgbGV0IHN1YjIgPSBudWxsO1xuICBsZXQgYmFzZSA9IG51bGw7XG4gIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgc3ViMiA9IHBhcnNlci5wYXJzZVN0cmluZ0dyb3VwKCk/LnRyaW0oKSA/PyBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgYmFzZSA9IE51bWJlci5wYXJzZUZsb2F0KHN1YjIgPz8gXCIxMFwiKTtcbiAgfVxuICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIik7XG4gIGlmIChhcmdzID09PSBudWxsKVxuICAgIHJldHVybiBbY29tbWFuZF07XG4gIGlmIChiYXNlID09PSAxMClcbiAgICByZXR1cm4gW1wiTG9nXCIsIGFyZ3NbMF1dO1xuICBpZiAoYmFzZSA9PT0gMilcbiAgICByZXR1cm4gW1wiTGJcIiwgLi4uYXJnc107XG4gIGlmIChzdWIyID09PSBudWxsKVxuICAgIHJldHVybiBbY29tbWFuZCwgLi4uYXJnc107XG4gIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgc3ViMl07XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jb3JlLnRzXG5mdW5jdGlvbiBwYXJzZVNlcXVlbmNlKHBhcnNlciwgdGVybWluYXRvciwgbGhzLCBwcmVjLCBzZXApIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGxocyAhPT0gbnVsbCk7XG4gIGlmICh0ZXJtaW5hdG9yLm1pblByZWMgPj0gcHJlYylcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0gW2xoc107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIHdoaWxlICghZG9uZSkge1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB3aGlsZSAocGFyc2VyLm1hdGNoKHNlcCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiTm90aGluZ1wiKTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlci5hdFRlcm1pbmF0b3IodGVybWluYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiTm90aGluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IHByZWMgfSk7XG4gICAgICByZXN1bHQucHVzaChyaHMgPz8gXCJOb3RoaW5nXCIpO1xuICAgICAgZG9uZSA9IHJocyA9PT0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFkb25lKSB7XG4gICAgICBwYXJzZXIuc2tpcFNwYWNlKCk7XG4gICAgICBkb25lID0gIXBhcnNlci5tYXRjaChzZXApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VyaWFsaXplT3BzKHNlcCA9IFwiXCIpIHtcbiAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiAob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpKS5qb2luKHNlcCk7XG59XG52YXIgREVGSU5JVElPTlNfQ09SRSA9IFtcbiAgLy9cbiAgLy8gQ29uc3RhbnRzXG4gIC8vXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxwbGFjZWhvbGRlclwiXSxcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICB3aGlsZSAocGFyc2VyLm1hdGNoKFwiPHNwYWNlPlwiKSkge1xuICAgICAgfVxuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIltcIikpXG4gICAgICAgIHdoaWxlICghcGFyc2VyLm1hdGNoKFwiXVwiKSAmJiAhcGFyc2VyLmF0Qm91bmRhcnkpXG4gICAgICAgICAgcGFyc2VyLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKHBhcnNlci5tYXRjaChcIjxzcGFjZT5cIikpIHtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJzZXIubWF0Y2goXCI8ez5cIikpXG4gICAgICAgIHdoaWxlICghcGFyc2VyLm1hdGNoKFwiPH0+XCIpICYmICFwYXJzZXIuYXRCb3VuZGFyeSlcbiAgICAgICAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgICByZXR1cm4gXCJOb3RoaW5nXCI7XG4gICAgfVxuICB9LFxuICAvL1xuICAvLyBGdW5jdGlvbnNcbiAgLy9cbiAge1xuICAgIG5hbWU6IFwiQXBwbHlcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiYXBwbHlcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZUZ1bmN0aW9uKG9wcyhleHByKSlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxccmhkXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDIwLFxuICAgIHBhcnNlOiBcIkFwcGx5XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbGhkXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDIwLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyBtaW5QcmVjOiAyMCB9KSA/PyBcIk5vdGhpbmdcIjtcbiAgICAgIHJldHVybiBbXCJBcHBseVwiLCByaHMsIGxoc107XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJCYXNlRm9ybVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IHJhZGl4ID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDIpKSA/PyBOYU47XG4gICAgICBpZiAoaXNGaW5pdGUocmFkaXgpICYmIHJhZGl4ID49IDIgJiYgcmFkaXggPD0gMzYpIHtcbiAgICAgICAgY29uc3QgbnVtID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDEpKSA/PyBOYU47XG4gICAgICAgIGlmIChpc0Zpbml0ZShudW0pICYmIE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgICAgICAgIGxldCBkaWdpdHMgPSBOdW1iZXIobnVtKS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgICAgbGV0IGdyb3VwTGVuZ3RoID0gMDtcbiAgICAgICAgICBpZiAocmFkaXggPT09IDIpIHtcbiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gNDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJhZGl4ID09PSAxMCkge1xuICAgICAgICAgICAgZ3JvdXBMZW5ndGggPSA0O1xuICAgICAgICAgIH0gZWxzZSBpZiAocmFkaXggPT09IDE2KSB7XG4gICAgICAgICAgICBncm91cExlbmd0aCA9IDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChyYWRpeCA+IDE2KSB7XG4gICAgICAgICAgICBncm91cExlbmd0aCA9IDQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChncm91cExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZERpZ2l0cyA9IGRpZ2l0cztcbiAgICAgICAgICAgIGRpZ2l0cyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZERpZ2l0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSAlIGdyb3VwTGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGRpZ2l0cyA9IFwiXFxcXCwgXCIgKyBkaWdpdHM7XG4gICAgICAgICAgICAgIGRpZ2l0cyA9IG9sZERpZ2l0c1tvbGREaWdpdHMubGVuZ3RoIC0gaSAtIDFdICsgZGlnaXRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYChcXFxcdGV4dHske2RpZ2l0c319X3ske3JhZGl4fX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJcXFxcb3BlcmF0b3JuYW1le0Jhc2VGb3JtfShcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiLCBcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwiKVwiO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRGVsaW1pdGVyXCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgYXJnQ291bnQgPSBub3BzKGV4cHIpO1xuICAgICAgaWYgKGFyZ0NvdW50ID09PSAwKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGNvbnN0IHN0eWxlID0gc2VyaWFsaXplci5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCArIDEpO1xuICAgICAgY29uc3QgYXJnMSA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgaDEgPSBoZWFkKGFyZzEpO1xuICAgICAgY29uc3QgZGVmYXVsdEZlbmNlID0geyBMaXN0OiBcIltdLFwiLCBTZXF1ZW5jZTogXCJcIiB9W3R5cGVvZiBoMSA9PT0gXCJzdHJpbmdcIiA/IGgxIDogXCJcIl0gPz8gXCIoKSxcIjtcbiAgICAgIGxldCBvcGVuID0gZGVmYXVsdEZlbmNlWzBdID8/IFwiXCI7XG4gICAgICBsZXQgY2xvc2UgPSBkZWZhdWx0RmVuY2VbMV0gPz8gXCJcIjtcbiAgICAgIGxldCBzZXAgPSBkZWZhdWx0RmVuY2VbMl0gPz8gXCJcIjtcbiAgICAgIGlmIChhcmdDb3VudCA+IDEpIHtcbiAgICAgICAgY29uc3Qgb3AyMiA9IHN0cmluZ1ZhbHVlKG9wKGV4cHIsIDIpKSA/PyBcIlwiO1xuICAgICAgICBvcGVuID0gb3AyMlswXSA/PyBkZWZhdWx0RmVuY2VbMF07XG4gICAgICAgIGNsb3NlID0gb3AyMlsxXSA/PyBkZWZhdWx0RmVuY2VbMV07XG4gICAgICAgIHNlcCA9IG9wMjJbMl0gPz8gZGVmYXVsdEZlbmNlWzJdO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IGlzTGlzdExpa2UoYXJnMSkgPyBzZXJpYWxpemVPcHMoc2VwKShzZXJpYWxpemVyLCBhcmcxKSA6IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZzEpO1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFN0cmluZyhib2R5LCBzdHlsZSwgb3BlbiArIGNsb3NlKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkRvbWFpblwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGlmIChoZWFkKGV4cHIpID09PSBcIkVycm9yXCIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZShleHByKTtcbiAgICAgIHJldHVybiBgXFxcXG1hdGhiZnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxtYXRodGlwXCJdLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBwYXJzZXIucGFyc2VHcm91cCgpO1xuICAgICAgcmV0dXJuIG9wMTI7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGV4dHRpcFwiXSxcbiAgICBwYXJzZTogKHBhcnNlcikgPT4ge1xuICAgICAgY29uc3Qgb3AxMiA9IHBhcnNlci5wYXJzZUdyb3VwKCk7XG4gICAgICBjb25zdCBvcDIyID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIHJldHVybiBvcDEyO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGVycm9yXCJdLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiBbXCJFcnJvclwiLCBwYXJzZXIucGFyc2VHcm91cCgpXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcnJvclwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGlmIChzdHJpbmdWYWx1ZShvcChleHByLCAxKSkgPT09IFwibWlzc2luZ1wiKVxuICAgICAgICByZXR1cm4gYFxcXFxlcnJvcnske3NlcmlhbGl6ZXIub3B0aW9ucy5taXNzaW5nU3ltYm9sID8/IFwiXFxcXHBsYWNlaG9sZGVye31cIn19YDtcbiAgICAgIGNvbnN0IHdoZXJlID0gZXJyb3JDb250ZXh0QXNMYXRleChzZXJpYWxpemVyLCBleHByKSB8fCBcIlxcXFxibGFja3NxdWFyZVwiO1xuICAgICAgY29uc3Qgb3AxMiA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgY29kZSA9IGhlYWQob3AxMikgPT09IFwiRXJyb3JDb2RlXCIgPyBzdHJpbmdWYWx1ZShvcChvcDEyLCAxKSkgOiBzdHJpbmdWYWx1ZShvcDEyKTtcbiAgICAgIGlmIChjb2RlID09PSBcImluY29tcGF0aWJsZS1kb21haW5cIikge1xuICAgICAgICByZXR1cm4gYFxcXFxtYXRodGlwe1xcXFxlcnJvcnske3doZXJlfX19e1xcXFxpbiAke3NlcmlhbGl6ZXIuc2VyaWFsaXplKFxuICAgICAgICAgIG9wKG9wMTIsIDMpXG4gICAgICAgICl9XFxcXG5vdGluICR7c2VyaWFsaXplci5zZXJpYWxpemUob3Aob3AxMiwgMikpfX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gYFxcXFxlcnJvcnske3doZXJlfX1gO1xuICAgICAgcmV0dXJuIGBcXFxcZXJyb3J7JHt3aGVyZX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkVycm9yQ29kZVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBzdHJpbmdWYWx1ZShvcChleHByLCAxKSk7XG4gICAgICBpZiAoY29kZSA9PT0gXCJtaXNzaW5nXCIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLm9wdGlvbnMubWlzc2luZ1N5bWJvbCA/PyBcIlxcXFxwbGFjZWhvbGRlcnt9XCI7XG4gICAgICBpZiAoY29kZSA9PT0gXCJ1bmV4cGVjdGVkLWNvbW1hbmRcIiB8fCBjb2RlID09PSBcInVuZXhwZWN0ZWQtb3BlcmF0b3JcIiB8fCBjb2RlID09PSBcInVuZXhwZWN0ZWQtdG9rZW5cIiB8fCBjb2RlID09PSBcImludmFsaWQtaWRlbnRpZmllclwiIHx8IGNvZGUgPT09IFwidW5rbm93bi1lbnZpcm9ubWVudFwiIHx8IGNvZGUgPT09IFwidW5leHBlY3RlZC1iYXNlXCIgfHwgY29kZSA9PT0gXCJpbmNvbXBhdGlibGUtZG9tYWluXCIgfHwgY29kZSA9PT0gXCJpbnZhbGlkLWRvbWFpblwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBcXFxcdGV4dHRpcHtcXFxcZXJyb3J7XFxcXGJsYWNrc3F1YXJlfX17XFxcXG1hdGh0dHske2NvZGV9fX1gO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRnJvbUxhdGV4XCIsXG4gICAgc2VyaWFsaXplOiAoX3NlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIHJldHVybiBgXFxcXHRleHR0dHske3Nhbml0aXplTGF0ZXgoc3RyaW5nVmFsdWUob3AoZXhwciwgMSkpKX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxhdGV4XCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChcbiAgICAgICAgbWFwQXJncyhleHByLCAoeCkgPT4gc3RyaW5nVmFsdWUoeCkgPz8gc2VyaWFsaXplci5zZXJpYWxpemUoeCkpXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGF0ZXhTdHJpbmdcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBpZiAoZXhwciA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gam9pbkxhdGV4KG1hcEFyZ3MoZXhwciwgKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpKSk7XG4gICAgfVxuICB9LFxuICB7IG5hbWU6IFwiTGF0ZXhUb2tlbnNcIiwgc2VyaWFsaXplOiBzZXJpYWxpemVMYXRleFRva2VucyB9LFxuICB7XG4gICAgbmFtZTogXCJMaXN0XCIsXG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBcIlxcXFxsYnJhY2tcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXHJicmFja1wiLFxuICAgIHBhcnNlOiBwYXJzZUxpc3QsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIFwiXFxcXGxicmFja1wiLFxuICAgICAgICBzZXJpYWxpemVPcHMoXCIsIFwiKShzZXJpYWxpemVyLCBleHByKSxcbiAgICAgICAgXCJcXFxccmJyYWNrXCJcbiAgICAgIF0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3lub255bXMgZm9yIExpc3RcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJbXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIl1cIixcbiAgICBwYXJzZTogcGFyc2VMaXN0XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcIm1hdGNoZml4XCIsXG4gICAgb3BlblRyaWdnZXI6IFwiXFxcXFtcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXF1cIixcbiAgICBwYXJzZTogcGFyc2VMaXN0XG4gIH0sXG4gIC8vIFN5bm9ueW1zIGZvciBEZWxpbWl0ZXJcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCIoXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIilcIixcbiAgICBwYXJzZTogcGFyc2VEZWxpbWl0ZXJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbHBhcmVuXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIlxcXFxycGFyZW5cIixcbiAgICBwYXJzZTogcGFyc2VEZWxpbWl0ZXJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiLFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjAsXG4gICAgLy8gVW5saWtlIHRoZSBtYXRjaGZpeCB2ZXJzaW9uIG9mIExpc3QsXG4gICAgLy8gd2hlbiB0aGUgY29tbWEgb3BlcmF0b3IgaXMgdXNlZCwgdGhlIGxocyBhbmQgcmhzIGFyZSBmbGF0dGVuZWQsXG4gICAgLy8gaS5lLiBgMSwyLDNgIC0+IGBbXCJEZWxpbWl0ZXJcIiwgW1wiTGlzdFwiLCAxLCAyLCAzXSwgIFwiLFwiXWAsXG4gICAgLy8gYW5kIGAxLCAoMiwgMylgIC0+IGBbXCJEZWxpbWl0ZXJcIixcbiAgICAvLyBbXCJTZXF1ZW5jZVwiLCAxLCBbXCJEZWxpbWl0ZXJcIiwgW1wiTGlzdFwiLCAyLCAzXSwgIFwiKClcIiwgXCIsXCJdXV0sXG4gICAgcGFyc2U6IChwYXJzZXIsIGxocywgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3Qgc2VxID0gcGFyc2VTZXF1ZW5jZShwYXJzZXIsIHRlcm1pbmF0b3IsIGxocywgMjAsIFwiLFwiKTtcbiAgICAgIGlmIChzZXEgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtcIlNlcXVlbmNlXCIsIC4uLnNlcV07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplT3BzKFwiXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjtcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDE5LFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHNlcSA9IHBhcnNlU2VxdWVuY2UocGFyc2VyLCB0ZXJtaW5hdG9yLCBsaHMsIDE5LCBcIjtcIik7XG4gICAgICBpZiAoc2VxID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiU2VxdWVuY2VcIixcbiAgICAgICAgLi4uc2VxLm1hcChcbiAgICAgICAgICAoeCkgPT4gaGVhZCh4KSA9PT0gXCJTZXF1ZW5jZVwiID8gW1wiTGlzdFwiLCAuLi5vcHMoeCkgPz8gW11dIDogeFxuICAgICAgICApXG4gICAgICBdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGV4dFwiXSxcbiAgICBwYXJzZTogKHNjYW5uZXIpID0+IHBhcnNlVGV4dFJ1bihzY2FubmVyKSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpO1xuICAgICAgaWYgKGFyZ3MgPT09IG51bGwgfHwgYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBcIlxcXFx0ZXh0e31cIjtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBcIlxcXFx0ZXh0e1wiLFxuICAgICAgICBhcmdzLm1hcCgoeCkgPT4gc2VyaWFsaXplci5zZXJpYWxpemUoeCkpLmpvaW4oXCJcIiksXG4gICAgICAgIFwifVwiXG4gICAgICBdKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNjcmlwdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiX1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKG5vcHMoZXhwcikgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiX3tcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiX3tcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwifVwiO1xuICAgIH1cbiAgfSxcbiAgeyBuYW1lOiBcIlN1cGVycGx1c1wiLCBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCIrXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VicGx1c1wiLCBsYXRleFRyaWdnZXI6IFtcIl9cIiwgXCIrXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VwZXJtaW51c1wiLCBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCItXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VibWludXNcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJfXCIsIFwiLVwiXSwga2luZDogXCJwb3N0Zml4XCIgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIipcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBsaHMpID0+IFtcIlN1cGVyc3RhclwiLCBsaHNdXG4gIH0sXG4gIC8vIHsgbmFtZTogJ1N1cGVyc3RhcicsIGxhdGV4VHJpZ2dlcjogWydeJywgJ1xcXFxzdGFyJ10sIGtpbmQ6ICdwb3N0Zml4JyB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJfXCIsIFwiKlwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGxocykgPT4gW1wiU3Vic3RhclwiLCBsaHNdXG4gIH0sXG4gIHsgbmFtZTogXCJTdWJzdGFyXCIsIGxhdGV4VHJpZ2dlcjogW1wiX1wiLCBcIlxcXFxzdGFyXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VwZXJkYWdnZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiXFxcXGRhZ2dlclwiXSwga2luZDogXCJwb3N0Zml4XCIgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxkYWdcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBsaHMpID0+IFtcIlN1cGVyZGFnZ2VyXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJpbWVcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCJcXFxccHJpbWVcIl0sXG4gICAgLy8gTm90ZTogd2UgZG9uJ3QgbmVlZCBhIHByZWNlZGVuY2UgYmVjYXVzZSB0aGUgdHJpZ2dlciBpcyAnXidcbiAgICAvLyBhbmQgJ14nIChhbmQgJ18nKSBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHBhcnNlci5cbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBuMiA9IG1hY2hpbmVWYWx1ZShvcChleHByLCAyKSkgPz8gMTtcbiAgICAgIGNvbnN0IGJhc2UgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSk7XG4gICAgICBpZiAobjIgPT09IDEpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXHByaW1lXCI7XG4gICAgICBpZiAobjIgPT09IDIpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXGRvdWJsZXByaW1lXCI7XG4gICAgICBpZiAobjIgPT09IDMpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXHRyaXBsZXByaW1lXCI7XG4gICAgICByZXR1cm4gYmFzZSArIFwiXnsoXCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSkgKyBcIil9XCI7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIl57XFxcXHByaW1lXFxcXHByaW1lfVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHBhcnNlUHJpbWUocGFyc2VyLCBsaHMsIDIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXntcXFxccHJpbWVcXFxccHJpbWVcXFxccHJpbWV9XCIsXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChwYXJzZXIsIGxocykgPT4gcGFyc2VQcmltZShwYXJzZXIsIGxocywgMylcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxkb3VibGVwcmltZVwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAyKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiXFxcXHRyaXBsZXByaW1lXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHBhcnNlUHJpbWUocGFyc2VyLCBsaHMsIDMpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiJ1wiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxkb3VibGVwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAyKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFx0cmlwbGVwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAzKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiPHs+XCIsIFwiKFwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiB7XG4gICAgICBpZiAoIXBhcnNlci5jb21wdXRlRW5naW5lPy5ib3gobGhzKT8uZG9tYWluLmlzRnVuY3Rpb24pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgc3RhcnQgPSBwYXJzZXIuaW5kZXg7XG4gICAgICBwYXJzZXIuYWRkQm91bmRhcnkoW1wiKVwiXSk7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgaWYgKCFwYXJzZXIubWF0Y2hCb3VuZGFyeSgpKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyc2VyLm1hdGNoKFwiPH0+XCIpKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXCJEZXJpdmF0aXZlXCIsIGxocywgZXhwcl07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJJbnZlcnNlRnVuY3Rpb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFwiXnstMX1cIixcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiB7XG4gICAgICBpZiAocGFyc2VyLmNvbXB1dGVFbmdpbmU/LmJveChsaHMpPy5kb21haW4uaXNGdW5jdGlvbilcbiAgICAgICAgcmV0dXJuIFtcIkludmVyc2VGdW5jdGlvblwiLCBsaHNdO1xuICAgICAgcmV0dXJuIFtcIlBvd2VyXCIsIG1pc3NpbmdJZkVtcHR5KGxocyksIC0xXTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiXnstMX1cIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJEZXJpdmF0aXZlXCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgZGVncmVlID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDIpKSA/PyAxO1xuICAgICAgY29uc3QgYmFzZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKTtcbiAgICAgIGlmIChkZWdyZWUgPT09IDEpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFxwcmltZX1cIjtcbiAgICAgIGlmIChkZWdyZWUgPT09IDIpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFxkb3VibGVwcmltZX1cIjtcbiAgICAgIGlmIChkZWdyZWUgPT09IDMpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFx0cmlwbGVwcmltZX1cIjtcbiAgICAgIHJldHVybiBiYXNlICsgXCJeeyhcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwiKX1cIjtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImVudmlyb25tZW50XCIsXG4gICAgbmFtZTogXCJXaGljaFwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImNhc2VzXCIsXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHtcbiAgICAgIGNvbnN0IHRhYnVsYXIgPSBwYXJzZXIucGFyc2VUYWJ1bGFyKCk7XG4gICAgICBpZiAoIXRhYnVsYXIpXG4gICAgICAgIHJldHVybiBbXCJXaGljaFwiXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtcIldoaWNoXCJdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdGFidWxhcikge1xuICAgICAgICBpZiAocm93Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFwiVHJ1ZVwiKTtcbiAgICAgICAgICByZXN1bHQucHVzaChyb3dbMF0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBzID0gc3RyaW5nVmFsdWUocm93WzFdKTtcbiAgICAgICAgICByZXN1bHQucHVzaChzID8gXCJUcnVlXCIgOiBzdHJpcFRleHQocm93WzFdKSA/PyBcIlRydWVcIik7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocm93WzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZTIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhcmdzLmxlbmd0aCAtIDI7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHJvdyA9IFtdO1xuICAgICAgICAgIHJvdy5wdXNoKHNlcmlhbGl6ZTIuc2VyaWFsaXplKGFyZ3NbaSArIDFdKSk7XG4gICAgICAgICAgcm93LnB1c2goc2VyaWFsaXplMi5zZXJpYWxpemUoYXJnc1tpXSkpO1xuICAgICAgICAgIHJvd3MucHVzaChyb3cuam9pbihcIiZcIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gam9pbkxhdGV4KFtcIlxcXFxiZWdpbntjYXNlc31cIiwgcm93cy5qb2luKFwiXFxcXFxcXFxcIiksIFwiXFxcXGVuZHtjYXNlc31cIl0pO1xuICAgIH1cbiAgfVxuXTtcbmZ1bmN0aW9uIHBhcnNlVGV4dFJ1bihwYXJzZXIsIHN0eWxlKSB7XG4gIGlmICghcGFyc2VyLm1hdGNoKFwiPHs+XCIpKVxuICAgIHJldHVybiBcIicnXCI7XG4gIGNvbnN0IHJ1bnMgPSBbXTtcbiAgbGV0IHRleHQgPSBcIlwiO1xuICBsZXQgcnVuaW5TdHlsZSA9IG51bGw7XG4gIHdoaWxlICghcGFyc2VyLmF0RW5kICYmICFwYXJzZXIubWF0Y2goXCI8fT5cIikpIHtcbiAgICBpZiAocGFyc2VyLnBlZWsgPT09IFwiPHs+XCIpIHtcbiAgICAgIHJ1bnMucHVzaChwYXJzZVRleHRSdW4ocGFyc2VyKSk7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJcXFxcdGV4dGJmXCIpICYmIHBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcnVucy5wdXNoKHBhcnNlVGV4dFJ1bihwYXJzZXIsIHsgXCJmb250LXdlaWdodFwiOiBcImJvbGRcIiB9KSk7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJcXFxcY29sb3JcIikpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gcGFyc2VyLnBhcnNlU3RyaW5nR3JvdXAoKTtcbiAgICAgIGlmIChjb2xvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocnVuaW5TdHlsZSAhPT0gbnVsbCAmJiB0ZXh0KSB7XG4gICAgICAgICAgcnVucy5wdXNoKFtcIlN0eWxlXCIsIHRleHQsIHsgZGljdDogcnVuaW5TdHlsZSB9XSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dCkge1xuICAgICAgICAgIHJ1bnMucHVzaChbXCJTdHJpbmdcIiwgdGV4dF0pO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICBydW5pblN0eWxlID0geyBjb2xvciB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyc2VyLm1hdGNoKFwiPHNwYWNlPlwiKSkge1xuICAgICAgdGV4dCArPSBcIiBcIjtcbiAgICB9IGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIjwkPlwiKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZXIuaW5kZXg7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpID8/IFtcIlNlcXVlbmNlXCJdO1xuICAgICAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIjwkPlwiKSkge1xuICAgICAgICBydW5zLnB1c2goZXhwcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ICs9IFwiJFwiO1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIjwkJD5cIikpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VyLmluZGV4O1xuICAgICAgY29uc3QgZXhwciA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKSA/PyBbXCJTZXF1ZW5jZVwiXTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICAgIGlmIChwYXJzZXIubWF0Y2goXCI8JCQ+XCIpKSB7XG4gICAgICAgIHJ1bnMucHVzaChleHByKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgKz0gXCIkJFwiO1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgIHRleHQgKz0gcGFyc2VyLm1hdGNoQ2hhcigpID8/IHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgfVxuICBpZiAocnVuaW5TdHlsZSAhPT0gbnVsbCAmJiB0ZXh0KSB7XG4gICAgcnVucy5wdXNoKFtcIlN0eWxlXCIsIGAnJHt0ZXh0fSdgLCB7IGRpY3Q6IHJ1bmluU3R5bGUgfV0pO1xuICB9IGVsc2UgaWYgKHRleHQpIHtcbiAgICBydW5zLnB1c2goYCcke3RleHR9J2ApO1xuICB9XG4gIGxldCBib2R5O1xuICBpZiAocnVucy5sZW5ndGggPT09IDEpXG4gICAgYm9keSA9IHJ1bnNbMF07XG4gIGVsc2Uge1xuICAgIGlmIChydW5zLmV2ZXJ5KCh4KSA9PiBzdHJpbmdWYWx1ZSh4KSAhPT0gbnVsbCkpXG4gICAgICBib2R5ID0gXCInXCIgKyBydW5zLm1hcCgoeCkgPT4gc3RyaW5nVmFsdWUoeCkpLmpvaW4oKSArIFwiJ1wiO1xuICAgIGVsc2VcbiAgICAgIGJvZHkgPSBbXCJTdHJpbmdcIiwgLi4ucnVuc107XG4gIH1cbiAgcmV0dXJuIHN0eWxlID8gW1wiU3R5bGVcIiwgYm9keSwgeyBkaWN0OiBzdHlsZSB9XSA6IGJvZHk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVMYXRleFRva2VucyhzZXJpYWxpemVyLCBleHByKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBcIlwiO1xuICByZXR1cm4gam9pbkxhdGV4KFxuICAgIG1hcEFyZ3MoZXhwciwgKHgpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBzdHJpbmdWYWx1ZSh4KTtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoeCk7XG4gICAgICBpZiAocyA9PT0gXCI8ez5cIilcbiAgICAgICAgcmV0dXJuIFwie1wiO1xuICAgICAgaWYgKHMgPT09IFwiPH0+XCIpXG4gICAgICAgIHJldHVybiBcIn1cIjtcbiAgICAgIGlmIChzID09PSBcIjwkPlwiKVxuICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICBpZiAocyA9PT0gXCI8JCQ+XCIpXG4gICAgICAgIHJldHVybiBcIiQkXCI7XG4gICAgICBpZiAocyA9PT0gXCI8c3BhY2U+XCIpXG4gICAgICAgIHJldHVybiBcIiBcIjtcbiAgICAgIHJldHVybiBzO1xuICAgIH0pXG4gICk7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUxhdGV4KHMpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBzLnJlcGxhY2UoXG4gICAgL1t7fVxcW1xcXVxcXFw6XFwtXFwkJV0vZyxcbiAgICAoYykgPT4gKHtcbiAgICAgIFwie1wiOiBcIlxcXFxsYnJhY2UgXCIsXG4gICAgICBcIn1cIjogXCJcXFxccmJyYWNlIFwiLFxuICAgICAgXCJbXCI6IFwiXFxcXGxicmFjayBcIixcbiAgICAgIFwiXVwiOiBcIlxcXFxyYnJhY2sgXCIsXG4gICAgICBcIjpcIjogXCJcXFxcY29sb24gXCIsXG4gICAgICBcIlxcXFxcIjogXCJcXFxcYmFja3NsYXNoIFwiXG4gICAgfSlbY10gPz8gXCJcXFxcXCIgKyBjXG4gICk7XG59XG5mdW5jdGlvbiBlcnJvckNvbnRleHRBc0xhdGV4KHNlcmlhbGl6ZXIsIGVycm9yKSB7XG4gIGNvbnN0IGFyZyA9IG9wKGVycm9yLCAyKTtcbiAgaWYgKCFhcmcpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGlmIChoZWFkKGFyZykgPT09IFwiTGF0ZXhcIilcbiAgICByZXR1cm4gYFxcXFx0ZXh0dHR7JHtzYW5pdGl6ZUxhdGV4KHN0cmluZ1ZhbHVlKG9wKGFyZywgMSkpID8/IFwiXCIpfX1gO1xuICBpZiAoaGVhZChhcmcpID09PSBcIkhvbGRcIilcbiAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUob3AoYXJnLCAxKSk7XG4gIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmcpO1xufVxuZnVuY3Rpb24gcGFyc2VQcmltZShwYXJzZXIsIGxocywgb3JkZXIyKSB7XG4gIGNvbnN0IGxoc2ggPSBoZWFkKGxocyk7XG4gIGlmIChsaHNoID09PSBcIkRlcml2YXRpdmVcIiB8fCBsaHNoID09PSBcIlByaW1lXCIpIHtcbiAgICBjb25zdCBuID0gbWFjaGluZVZhbHVlKG9wKGxocywgMikpID8/IDE7XG4gICAgcmV0dXJuIFtsaHNoLCBtaXNzaW5nSWZFbXB0eShvcChsaHMsIDEpKSwgbiArIG9yZGVyMl07XG4gIH1cbiAgaWYgKHBhcnNlci5jb21wdXRlRW5naW5lPy5ib3gobGhzKT8uZG9tYWluLmlzRnVuY3Rpb24pIHtcbiAgICBpZiAob3JkZXIyID09PSAxKVxuICAgICAgcmV0dXJuIFtcIkRlcml2YXRpdmVcIiwgbGhzXTtcbiAgICByZXR1cm4gW1wiRGVyaXZhdGl2ZVwiLCBsaHMsIG9yZGVyMl07XG4gIH1cbiAgaWYgKG9yZGVyMiA9PT0gMSlcbiAgICByZXR1cm4gW1wiUHJpbWVcIiwgbWlzc2luZ0lmRW1wdHkobGhzKV07XG4gIHJldHVybiBbXCJQcmltZVwiLCBtaXNzaW5nSWZFbXB0eShsaHMpLCBvcmRlcjJdO1xufVxuZnVuY3Rpb24gcGFyc2VEZWxpbWl0ZXIocGFyc2VyLCBib2R5KSB7XG4gIGlmIChib2R5ID09PSBudWxsIHx8IGlzRW1wdHlTZXF1ZW5jZShib2R5KSlcbiAgICByZXR1cm4gW1wiU2VxdWVuY2VcIl07XG4gIGlmIChoZWFkKGJvZHkpID09PSBcIlNlcXVlbmNlXCIpIHtcbiAgICBpZiAobm9wcyhib2R5KSA9PT0gMClcbiAgICAgIHJldHVybiBbXCJEZWxpbWl0ZXJcIl07XG4gICAgcmV0dXJuIFtcIkRlbGltaXRlclwiLCBbXCJTZXF1ZW5jZVwiLCAuLi5vcHMoYm9keSkgPz8gW11dXTtcbiAgfVxuICByZXR1cm4gW1wiRGVsaW1pdGVyXCIsIGJvZHldO1xufVxuZnVuY3Rpb24gcGFyc2VMaXN0KF9wYXJzZXIsIGJvZHkpIHtcbiAgaWYgKGJvZHkgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGJvZHkpKVxuICAgIHJldHVybiBbXCJMaXN0XCJdO1xuICBpZiAoaGVhZChib2R5KSAhPT0gXCJTZXF1ZW5jZVwiICYmIGhlYWQoYm9keSkgIT09IFwiTGlzdFwiKVxuICAgIHJldHVybiBbXCJMaXN0XCIsIGJvZHldO1xuICByZXR1cm4gW1wiTGlzdFwiLCAuLi5vcHMoYm9keSkgPz8gW11dO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMtaW5lcXVhbGl0aWVzLnRzXG52YXIgREVGSU5JVElPTlNfSU5FUVVBTElUSUVTID0gW1xuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm90XCIsIFwiPFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NixcbiAgICBwYXJzZTogXCJOb3RMZXNzXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90TGVzc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5sZXNzXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ2XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjxcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDUsXG4gICAgcGFyc2U6IFwiTGVzc1wiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxlc3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsdFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI8XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MSxcbiAgICBwYXJzZTogXCJMZXNzRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMZXNzRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQxLFxuICAgIHBhcnNlOiBcIkxlc3NFcXVhbFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZXFzbGFudFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NSxcbiAgICAvLyBOb3RlIGRpZmZlcmVudCBwcmVjZWRlbmNlIHRoYW4gYDw9YCBhcyBwZXIgTWF0aE1MXG4gICAgcGFyc2U6IFwiTGVzc0VxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGVzc05vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG5lcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90TGVzc05vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmxlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGVzc092ZXJFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlck92ZXJFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjUsXG4gICAgcGFyc2U6IFwiR3JlYXRlckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiKlwiLCBcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjAsXG4gICAgcGFyc2U6IFwiU3RhckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3RhckVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3RhclwiLCBcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUGx1c0VxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIrXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNaW51c0VxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCItXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTbGFzaEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIvXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVhbEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI9XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVhbEVxdWFsRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIj1cIiwgXCI9XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJUaWxkZUZ1bGxFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogYXBwcm94aW1hdGVseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvbmdcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90VGlsZGVGdWxsRXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJveGltYXRlbHkgYnV0IG5vdCBhY3R1YWxseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5jb25nXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjpcIiwgXCI9XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwLFxuICAgIHBhcnNlOiBcIkFzc2lnblwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkFzc2lnblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvbG9uZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXBwcm94XCIsXG4gICAgLy8gTm90ZTogTWF0aGVtYXRpY2EgVGlsZGVUaWxkZVxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFwcHJveFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0N1xuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RBcHByb3hcIixcbiAgICAvLyBOb3RlOiBNYXRoZW1hdGljYSBUaWxkZVRpbGRlXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm90XCIsIFwiXFxcXGFwcHJveFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0N1xuICB9LFxuICB7XG4gICAgbmFtZTogXCJBcHByb3hFcXVhbFwiLFxuICAgIC8vIE5vdGU6IE1hdGhlbWF0aWNhIFRpbGRlRXF1YWwsIE1hdGhNTDogYGFzeW1wdG90aWNhbGx5IGVxdWFsIHRvYFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFwcHJveGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdEFwcHJveEVxdWFsXCIsXG4gICAgLy8gTm90ZTogTWF0aGVtYXRpY2EgTm90VGlsZGVFcXVhbFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5vdFwiLCBcIlxcXFxhcHByb3hlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgLy8gTm90ZTogbm8gTGFUZVggc3ltYm9sIGZvciBjaGFyIFUrMjI0OVxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNTBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuZVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI1NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJVbmVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIhXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICAgIC8vIE5vdGUgZGlmZmVyZW50IHByZWNlbmRlbmNlIHRoYW4gXFxcXG5lIHBlciBNYXRoTUxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlckVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ2VcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDJcbiAgICAvLyBOb3RlOiBkaWZmZXJlbnQgcHJlY2VuZGVuY2UgdGhhbiBgPj1gIGFzIHBlciBNYXRoTUxcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MixcbiAgICAvLyBOb3RlOiBkaWZmZXJlbnQgcHJlY2VuZGVuY2UgdGhhbiBgPj1gIGFzIHBlciBNYXRoTUxcbiAgICBwYXJzZTogXCJHcmVhdGVyRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI+XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MyxcbiAgICBwYXJzZTogXCJHcmVhdGVyRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ2Vxc2xhbnRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjUsXG4gICAgLy8gTm90ZTogZGlmZmVyZW50IHByZWNlbmRlbmNlIHRoYW4gYD49YCBhcyBwZXIgTWF0aE1MXG4gICAgcGFyc2U6IFwiR3JlYXRlckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlck5vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ25lcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90R3JlYXRlck5vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmdlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiPlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NSxcbiAgICBwYXJzZTogXCJHcmVhdGVyXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGd0XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdEdyZWF0ZXJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuZ3RyXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ0XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxub3RcIiwgXCI+XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ0LFxuICAgIHBhcnNlOiBcIk5vdEdyZWF0ZXJcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaW5nRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjaXJjZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiVHJpYW5nbGVFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogZGVsdGEgZXF1YWwgdG9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0cmlhbmdsZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRG90RXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJvYWNoZXMgdGhlIGxpbWl0XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZG90ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRG90RXF1YWxEb3RcIixcbiAgICAvLyBNYXRoTUw6IEdlb21ldHJpY2FsbHkgZXF1YWxcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxkb3RlcWRvdFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGYWxsaW5nRG90RXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJveGltYXRlbHkgZXF1YWwgdG8gb3IgdGhlIGltYWdlIG9mXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZmFsbGluZ2RvdHNlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaXNpbmdEb3RFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogaW1hZ2Ugb2Ygb3IgYXBwcm94aW1hdGVseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGZhbGxpbmdkb3RzZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUXVlc3Rpb25FcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHF1ZXN0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTXVjaExlc3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsbFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNdWNoR3JlYXRlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdnXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByZWNlZGVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccHJlY1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdWNjZWVkc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1Y2NcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJlY2VkZXNFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHByZWNjdXJseWVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1Y2NlZWRzRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjdXJseWVxcHJlY1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RQcmVjZWRlc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5wcmVjXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdFN1Y2NlZWRzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbnN1Y2NcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQmV0d2VlblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJldHdlZW5cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfVxuXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9kaWN0aW9uYXJ5L2RlZmluaXRpb25zLWxvZ2ljLnRzXG52YXIgREVGSU5JVElPTlNfTE9HSUMgPSBbXG4gIC8vIENvbnN0YW50c1xuICB7XG4gICAgbmFtZTogXCJUcnVlXCIsXG4gICAga2luZDogXCJzeW1ib2xcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0b3BcIl1cbiAgICAvLyBcdTIyQTQgVSsyMkE0XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aHJte1RydWV9XCIsXG4gICAgcGFyc2U6IFwiVHJ1ZVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3J7VHJ1ZX1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoc2Z7VH1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRmFsc2VcIixcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJvdFwiXVxuICAgIC8vIFx1MjJBNSBVKzIyQTVcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvcGVyYXRvcntGYWxzZX1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoc2Z7Rn1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTWF5YmVcIixcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le01heWJlfVwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcb3BlcmF0b3JuYW1le01heWJlfVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aHJte01heWJlfVwiLFxuICAgIHBhcnNlOiBcIk1heWJlXCJcbiAgfSxcbiAgLy8gT3BlcmF0b3JzXG4gIHtcbiAgICBuYW1lOiBcIkFuZFwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsYW5kXCJdLFxuICAgIHByZWNlZGVuY2U6IDMxN1xuICAgIC8vIHNlcmlhbGl6ZTogJ1xcXFxsYW5kJyxcbiAgfSxcbiAgeyBraW5kOiBcImluZml4XCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHdlZGdlXCJdLCBwYXJzZTogXCJBbmRcIiwgcHJlY2VkZW5jZTogMzE3IH0sXG4gIHsga2luZDogXCJpbmZpeFwiLCBsYXRleFRyaWdnZXI6IFwiXFxcXCZcIiwgcGFyc2U6IFwiQW5kXCIsIHByZWNlZGVuY2U6IDMxNyB9LFxuICB7XG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le2FuZH1cIixcbiAgICBwYXJzZTogXCJBbmRcIixcbiAgICBwcmVjZWRlbmNlOiAzMTdcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3JcIixcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG9yXCJdLFxuICAgIHByZWNlZGVuY2U6IDMxMFxuICB9LFxuICB7IGtpbmQ6IFwiaW5maXhcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdmVlXCJdLCBwYXJzZTogXCJPclwiLCBwcmVjZWRlbmNlOiAzMTAgfSxcbiAgeyBraW5kOiBcImluZml4XCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxccGFyYWxsZWxcIiwgcGFyc2U6IFwiT3JcIiwgcHJlY2VkZW5jZTogMzEwIH0sXG4gIHtcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvcGVyYXRvcm5hbWV7b3J9XCIsXG4gICAgcGFyc2U6IFwiQW5kXCIsXG4gICAgcHJlY2VkZW5jZTogMzEwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlhvclwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2ZWViYXJcIl0sXG4gICAgcHJlY2VkZW5jZTogMzE1XG4gIH0sXG4gIC8vIFBvc3NpYmxlIGFsdDogXFxvcGx1cyBcdTIyOTUgVSsyMjk1XG4gIHtcbiAgICBuYW1lOiBcIk5vdFwiLFxuICAgIGtpbmQ6IFwicHJlZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG5vdFwiXSxcbiAgICBwcmVjZWRlbmNlOiA4ODBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTmFuZFwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxiYXJ3ZWRnZVwiXSxcbiAgICBwcmVjZWRlbmNlOiAzMTVcbiAgICAvLyBzZXJpYWxpemU6ICdcXFxcbWlkJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm9yXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFx1MjJCRFwiXSxcbiAgICAvLyBiYXIgdmVlXG4gICAgcHJlY2VkZW5jZTogMzE1XG4gICAgLy8gc2VyaWFsaXplOiAnXFxcXGRvd25hcnJvdycsXG4gIH0sXG4gIC8vIEZ1bmN0aW9uc1xuICB7XG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImFuZFwiLFxuICAgIHBhcnNlOiBcIkFuZFwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwib3JcIixcbiAgICBwYXJzZTogXCJPclwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwibm90XCIsXG4gICAgcGFyc2U6IFwiTm90XCJcbiAgfSxcbiAgLy8gUmVsYXRpb25zXG4gIHtcbiAgICBuYW1lOiBcIkltcGxpZXNcIixcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjIwLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpbXBsaWVzXCJdLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcaW1wbGllc1wiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxSaWdodGFycm93XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyMjAsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHBhcnNlOiBcIkltcGxpZXNcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVpdmFsZW50XCIsXG4gICAgLy8gTWF0aE1MOiBpZGVudGljYWwgdG8sIE1hdGhlbWF0aWNhOiBDb25ncnVlbnRcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpZmZcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyMTlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXExlZnRyaWdodGFycm93XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjE5LFxuICAgIHBhcnNlOiBcIkVxdWl2YWxlbnRcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZXF1aXZcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyMTksXG4gICAgcGFyc2U6IFwiRXF1aXZhbGVudFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByb3Zlc1wiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2ZGFzaFwiXSxcbiAgICBwcmVjZWRlbmNlOiAyMjAsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcdmRhc2hcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFbnRhaWxzXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZEYXNoXCJdLFxuICAgIHByZWNlZGVuY2U6IDIyMCxcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgc2VyaWFsaXplOiBcIlxcXFx2RGFzaFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNhdGlzZmllc1wiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxtb2RlbHNcIl0sXG4gICAgcHJlY2VkZW5jZTogMjIwLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBzZXJpYWxpemU6IFwiXFxcXG1vZGVsc1wiXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1vdGhlci50c1xuZnVuY3Rpb24gcGFyc2VTaW5nbGVBcmcoY21kKSB7XG4gIHJldHVybiAocGFyc2VyKSA9PiB7XG4gICAgY29uc3QgYXJnID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICByZXR1cm4gYXJnID09PSBudWxsID8gW2NtZF0gOiBbY21kLCBhcmddO1xuICB9O1xufVxudmFyIERFRklOSVRJT05TX09USEVSUyA9IFtcbiAge1xuICAgIG5hbWU6IFwiT3ZlcnNjcmlwdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDcwMFxuICAgIC8vIEB0b2RvOiBub3QgaW4gTWF0aE1MXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlVuZGVyc2NyaXB0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdW5kZXJzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDcwMFxuICAgIC8vIEB0b2RvOiBub3QgaW4gTWF0aE1MXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkluY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiLCBcIitcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkRlY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiLVwiLCBcIi1cIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByZUluY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiLCBcIitcIl0sXG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBwcmVjZWRlbmNlOiA4ODBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJlRGVjcmVtZW50XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCItXCIsIFwiLVwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDg4MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaW5nXCIsXG4gICAgLy8gQWthICdDb21wb3NpdGlvbicsIGkuZS4gZnVuY3Rpb24gY29tcG9zaXRpb25cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjaXJjXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgICAvLyBAdG9kbzogTWF0aE1MIGlzIDk1MFxuICAgIC8vIEB0b2RvOiBjaGVjayBsaHMgYW5kIHJocyBhcmUgZnVuY3Rpb25zXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRyYW5zcG9zZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlRcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCJcbiAgICAvLyBAdG9kbzogaWYgbGhzIGlzIGEgbGlzdC90ZW5zb3JcbiAgfSxcbiAge1xuICAgIC8vIEB0b2RvOiBpZiBsaHMgaXMgYSBsaXN0L3RlbnNvclxuICAgIG5hbWU6IFwiQ29uanVnYXRlVHJhbnNwb3NlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiSFwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdHJpbmdKb2luXCIsXG4gICAgLy8gQHRvZG8gRnJvbSBNYXRoZW1hdGljYS4uLj9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsdFwiLCBcIlxcXFxndFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogNzgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN0YXJzdGFyXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3RhclwiLCBcIlxcXFxzdGFyXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiA3ODBcbiAgfSxcbiAge1xuICAgIC8vIFBhcnRpYWwgZGVyaXZhdGl2ZSB1c2luZyBhIHZhcmlhdGlvbiBvZiB0aGUgRXVsZXIgbm90YXRpb246IGBcdTIyMDJfeGYoeClgXG4gICAgLy8gKHRoZSBFdWxlciBub3RhdGlvbiB1c2VzIGBEXzFmKHgpYCB3aGVyZSBcIjFcIiBpcyBmb3IgdGhlIGZpcnN0IHZhcmlhYmxlXG4gICAgLy8gRm9yIHRoZSBMZWlibml6IG5vdGF0aW9uIHNlZSAnRGl2aWRlJyB0aGF0IGhhbmRsZXMgYFx1MjIwMmYvXHUyMjAyeGBcbiAgICBuYW1lOiBcIlBhcnRpYWxEZXJpdmF0aXZlXCIsXG4gICAgLy8gUGFydGlhbERlcml2YXRpdmUoZXhwciwge2xpc3RzIG9mIHZhcnN9LCBkZWdyZWUpXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccGFydGlhbFwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgbGV0IHN1cCA9IFwiTm90aGluZ1wiO1xuICAgICAgbGV0IHN1YjIgPSBcIk5vdGhpbmdcIjtcbiAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICBwYXJzZXIuc2tpcFNwYWNlKCk7XG4gICAgICAgIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgICAgICAgc3ViMiA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICAgICAgc3VwID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzZXEgPSBnZXRTZXF1ZW5jZShzdWIyKTtcbiAgICAgIGlmIChzZXEpXG4gICAgICAgIHN1YjIgPSBbXCJMaXN0XCIsIC4uLnNlcV07XG4gICAgICBpZiAoc3ViMiA9PT0gbnVsbCB8fCBzdXAgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgbGV0IHJocyA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gXCJOb3RoaW5nXCI7XG4gICAgICBpZiAocmhzICE9PSBcIk5vdGhpbmdcIiAmJiAhaXNFbXB0eVNlcXVlbmNlKHJocykpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhcnNlci5wYXJzZUFyZ3VtZW50cygpID8/IFtcIk5vdGhpbmdcIl07XG4gICAgICAgIHJocyA9IFtyaHMsIC4uLmFyZ3NdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtcIlBhcnRpYWxEZXJpdmF0aXZlXCIsIHJocywgc3ViMiwgc3VwXTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBcIlxcXFxwYXJ0aWFsXCI7XG4gICAgICBjb25zdCBmbiA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgdmFycyA9IG9wKGV4cHIsIDIpO1xuICAgICAgY29uc3QgZGVncmVlID0gb3AoZXhwciwgMyk7XG4gICAgICBpZiAodmFycyAhPT0gbnVsbCAmJiB2YXJzICE9PSBcIk5vdGhpbmdcIikge1xuICAgICAgICBpZiAoaGVhZCh2YXJzKSA9PT0gXCJMaXN0XCIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gXCJfe1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoW1wiU2VxdWVuY2VcIiwgLi4ub3BzKHZhcnMpID8/IFtdXSkgKyBcIn1cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgKz0gXCJfe1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUodmFycykgKyBcIn1cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlZ3JlZSAhPT0gbnVsbCAmJiBkZWdyZWUgIT09IFwiTm90aGluZ1wiKVxuICAgICAgICByZXN1bHQgKz0gXCJee1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwifVwiO1xuICAgICAgaWYgKGZuICE9PSBudWxsICYmIGZuICE9PSBcIk5vdGhpbmdcIilcbiAgICAgICAgcmVzdWx0ICs9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBwcmVjZWRlbmNlOiA3NDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckJhclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJsaW5lXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJCYXJcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiVW5kZXJCYXJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx1bmRlcmxpbmVcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiVW5kZXJCYXJcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlclZlY3RvclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZlY1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyVmVjdG9yXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJUaWxkZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbGRlXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJUaWxkZVwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVySGF0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaGF0XCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJIYXRcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlclJpZ2h0QXJyb3dcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxvdmVycmlnaHRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyUmlnaHRBcnJvd1wiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyTGVmdEFycm93XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmxlZnRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyTGVmdEFycm93XCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJSaWdodERvdWJsZUFycm93XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcT3ZlcnJpZ2h0YXJyb3dcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiT3ZlclJpZ2h0RG91YmxlQXJyb3dcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckxlZnRIYXJwb29uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmxlZnRoYXJwb29uXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJMZWZ0SGFycG9vblwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyUmlnaHRIYXJwb29uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcnJpZ2h0aGFycG9vblwiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyUmlnaHRIYXJwb29uXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJMZWZ0UmlnaHRBcnJvd1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJsZWZ0cmlnaHRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyTGVmdFJpZ2h0QXJyb3dcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckJyYWNlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmJyYWNlXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJCcmFjZVwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyTGluZVNlZ21lbnRcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxvdmVybGluZXNlZ21lbnRcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiT3ZlckxpbmVTZWdtZW50XCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJHcm91cFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJncm91cFwiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyR3JvdXBcIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGRpc3BsYXlzdHlsZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRleHRzdHlsZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNjcmlwdHN0eWxlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2NyaXB0c2NyaXB0c3R5bGVcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aW55XCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2NyaXB0c2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGZvb3Rub3Rlc2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNtYWxsXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm9ybWFsc2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxhcmdlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcTGFyZ2VcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxMQVJHRVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGh1Z2VcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxIdWdlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdHlsZVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSk7XG4gICAgICBjb25zdCBkaWN0ID0gZGljdGlvbmFyeShvcChleHByLCAyKSk7XG4gICAgICBpZiAoZGljdCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmIChzdHJpbmdWYWx1ZShkaWN0LmRpc3BsYXkpID09PSBcImJsb2NrXCIpXG4gICAgICAgIHJlc3VsdCA9IGpvaW5MYXRleChbXCJ7XFxcXGRpc3BsYXlzdHlsZVwiLCByZXN1bHQsIFwifVwiXSk7XG4gICAgICBlbHNlIGlmIChzdHJpbmdWYWx1ZShkaWN0LmRpc3BsYXkpID09PSBcImlubGluZVwiKVxuICAgICAgICByZXN1bHQgPSBqb2luTGF0ZXgoW1wie1xcXFx0ZXh0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgZWxzZSBpZiAoc3RyaW5nVmFsdWUoZGljdC5kaXNwbGF5KSA9PT0gXCJzY3JpcHRcIilcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcIntcXFxcc2NyaXB0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgZWxzZSBpZiAoc3RyaW5nVmFsdWUoZGljdC5kaXNwbGF5KSA9PT0gXCJzY3JpcHRzY3JpcHRcIilcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcIntcXFxcc2NyaXB0c2NyaXB0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgY29uc3QgdiA9IG1hY2hpbmVWYWx1ZShkaWN0LnNpemUpO1xuICAgICAgaWYgKHYgIT09IG51bGwgJiYgdiA+PSAxICYmIHYgPD0gMTApIHtcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAxOiBcIlxcXFx0aW55XCIsXG4gICAgICAgICAgICAyOiBcIlxcXFxzY3JpcHRzaXplXCIsXG4gICAgICAgICAgICAzOiBcIlxcXFxmb290bm90ZXNpemVcIixcbiAgICAgICAgICAgIDQ6IFwiXFxcXHNtYWxsXCIsXG4gICAgICAgICAgICA1OiBcIlxcXFxub3JtYWxzaXplXCIsXG4gICAgICAgICAgICA2OiBcIlxcXFxsYXJnZVwiLFxuICAgICAgICAgICAgNzogXCJcXFxcTGFyZ2VcIixcbiAgICAgICAgICAgIDg6IFwiXFxcXExBUkdFXCIsXG4gICAgICAgICAgICA5OiBcIlxcXFxodWdlXCIsXG4gICAgICAgICAgICAxMDogXCJcXFxcSHVnZVwiXG4gICAgICAgICAgfVt2XSxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgXCJ9XCJcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXCFcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIC0zXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcIFwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgNl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXDpcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDRdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxlbnNraXBcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDldXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxxdWFkXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCAxOF1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHFxdWFkXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCAzNl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXCxcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDNdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFw7XCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCA1XVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZW5zcGFjZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgOV1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSG9yaXpvbnRhbFNwYWNpbmdcIixcbiAgICAvLyBUaGUgYEhvcml6b250YWxTcGFjaW5nYCBmdW5jdGlvbiBoYXMgdHdvIGZvcm1zXG4gICAgLy8gYFtcIkhvcml6b250YWxTcGFjaW5nXCIsIG51bWJlcl1gIC0+IGluZGljYXRlIGEgc3BhY2Ugb2YgbXUgdW5pdHNcbiAgICAvLyBgW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgZXhwciwgJ29wJ3wnYmluJ3xyZWxdYCAtPiBpbmRpY2F0ZSBhIHNwYWNpbmcgYXJvdW5kIGFuZCBleHByZXNzaW9uLCBpLmUuIGBcXG1hdGhiaW57eH1gLCBldGMuLi5cbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBpZiAob3AoZXhwciwgMikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYgPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMSkpO1xuICAgICAgaWYgKHYgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgXCItM1wiOiBcIlxcXFwhXCIsXG4gICAgICAgIDY6IFwiXFxcXCBcIixcbiAgICAgICAgMzogXCJcXFxcLFwiLFxuICAgICAgICA0OiBcIlxcXFw6XCIsXG4gICAgICAgIDU6IFwiXFxcXDtcIixcbiAgICAgICAgOTogXCJcXFxcZW5zcGFjZVwiLFxuICAgICAgICAxODogXCJcXFxccXVhZFwiLFxuICAgICAgICAzNjogXCJcXFxccXF1YWRcIlxuICAgICAgfVt2XSA/PyBcIlwiO1xuICAgIH1cbiAgfVxuICAvLyBpZiAoXG4gIC8vICAgW1xuICAvLyAgICAgJ1xcXFwhJyxcbiAgLy8gICAgICdcXFxcOicsXG4gIC8vICAgICAnXFxcXGVuc2tpcCcsXG4gIC8vICAgICAnXFxcXHF1YWQnLFxuICAvLyAgICAgJ1xcXFwsJyxcbiAgLy8gICAgICdcXFxcOycsXG4gIC8vICAgICAnXFxcXGVuc3BhY2UnLFxuICAvLyAgICAgJ1xcXFxxcXVhZCcsXG4gIC8vICAgICAnXFxcXHNlbGVjdGZvbnQnLFxuICAvLyAgIF0uaW5jbHVkZXModG9rZW4pXG4gIC8vICkge1xuICAvLyAgIHJldHVybiAnc2tpcCc7XG4gIC8vIH1cbiAgLy8ge1xuICAvLyAgICAgbmFtZTogJycsXG4gIC8vICAgICB0cmlnZ2VyOiAnXFxcXG1hdGhyaW5nJyxcbiAgLy8gfSxcbiAgLy8ge1xuICAvLyAgICAgbmFtZTogJycsXG4gIC8vICAgICB0cmlnZ2VyOiAnXFxcXGNoZWNrJyxcbiAgLy8gfSxcbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy10cmlnb25vbWV0cnkudHNcbmZ1bmN0aW9uIHBhcnNlVHJpZyhvcDMpIHtcbiAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgY29uc3QgaGVhZDIgPSB7XG4gICAgICBcIlxcXFxhcmNzaW5cIjogXCJBcmNzaW5cIixcbiAgICAgIFwiXFxcXGFyY2Nvc1wiOiBcIkFyY2Nvc1wiLFxuICAgICAgXCJcXFxcYXJjdGFuXCI6IFwiQXJjdGFuXCIsXG4gICAgICBcIlxcXFxhcmN0Z1wiOiBcIkFyY3RhblwiLFxuICAgICAgXCJcXFxcYXJjY3RnXCI6IFwiQXJjdGFuXCIsXG4gICAgICBcIlxcXFxhcmNzZWNcIjogXCJBcmNzZWNcIixcbiAgICAgIFwiXFxcXGFyY2NzY1wiOiBcIiBBcmNjc2NcIixcbiAgICAgIFwiXFxcXGFyc2luaFwiOiBcIkFyc2luaFwiLFxuICAgICAgXCJcXFxcYXJjb3NoXCI6IFwiQXJjb3NoXCIsXG4gICAgICBcIlxcXFxhcnRhbmhcIjogXCJBcnRhbmhcIixcbiAgICAgIFwiXFxcXGFyY3NlY2hcIjogXCJBcmNzZWNoXCIsXG4gICAgICBcIlxcXFxhcmNjc2NoXCI6IFwiQXJjc2NoXCIsXG4gICAgICAvLyAnXFxcXGFyZycsXG4gICAgICBcIlxcXFxjaFwiOiBcIkNvc2hcIixcbiAgICAgIFwiXFxcXGNvc1wiOiBcIkNvc1wiLFxuICAgICAgXCJcXFxcY29zZWNcIjogXCJDc2NcIixcbiAgICAgIFwiXFxcXGNvc2hcIjogXCJDc2NoXCIsXG4gICAgICBcIlxcXFxjb3RcIjogXCJDb3RcIixcbiAgICAgIFwiXFxcXGNvdGdcIjogXCJDb3RcIixcbiAgICAgIFwiXFxcXGNvdGhcIjogXCJDb3RoXCIsXG4gICAgICBcIlxcXFxjc2NcIjogXCJDc2NcIixcbiAgICAgIFwiXFxcXGN0Z1wiOiBcIkNvdFwiLFxuICAgICAgXCJcXFxcY3RoXCI6IFwiQ290aFwiLFxuICAgICAgXCJcXFxcc2VjXCI6IFwiU2VjXCIsXG4gICAgICBcIlxcXFxzaW5cIjogXCJTaW5cIixcbiAgICAgIFwiXFxcXHNpbmhcIjogXCJTaW5oXCIsXG4gICAgICBcIlxcXFxzaFwiOiBcIlNpbmhcIixcbiAgICAgIFwiXFxcXHRhblwiOiBcIlRhblwiLFxuICAgICAgXCJcXFxcdGFuaFwiOiBcIlRhbmhcIixcbiAgICAgIFwiXFxcXHRnXCI6IFwiVGFuXCIsXG4gICAgICBcIlxcXFx0aFwiOiBcIlRhbmhcIlxuICAgIH1bb3AzID8/IFwiXCJdID8/IG9wMyA/PyBcIlwiO1xuICAgIGlmIChwYXJzZXIuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBoZWFkMjtcbiAgICBjb25zdCBmbiA9IHBhcnNlci5wYXJzZVBvc3RmaXhPcGVyYXRvcihoZWFkMiwgdW50aWwpO1xuICAgIGlmIChmbiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBmbjtcbiAgICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIiwgdW50aWwpO1xuICAgIHJldHVybiBhcmdzID09PSBudWxsID8gaGVhZDIgOiBbaGVhZDIsIC4uLmFyZ3NdO1xuICB9O1xufVxudmFyIERFRklOSVRJT05TX1RSSUdPTk9NRVRSWSA9IFtcbiAge1xuICAgIG5hbWU6IFwiQXJjc2luXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjc2luXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzaW5cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY29zXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY29zXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjb3NcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjdGFuXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjdGFuXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmN0YW5cIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFyY3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmN0YW5cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY290XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjb3RcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjc2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcImFyY3NlY1wiLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzZWNcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY3NjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY3NjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjc2NcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJzaW5oXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJzaW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnNpbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjb3NoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjb3NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNvc2hcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJ0YW5oXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJ0YW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnRhbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJzZWNoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJzZWNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnNlY2hcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjc2NoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjc2NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzY2hcIilcbiAgfSxcbiAge1xuICAgIC8vIFJ1c2lhbiBoeXBlcmJvbGljIGNvc2luZVxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3NoXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvc2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY29zZWNcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvc2VjXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvc2hcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3NoXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvdFwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiQ290XCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3RcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ290aFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvdGhcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvdGhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ3NjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3NjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDc2NcIilcbiAgfSxcbiAge1xuICAgIC8vIFJ1c2lhbiBjb3RhbmdlbnRcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjdGdcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvdFwiKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3RoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3RhbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2VjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJTZWNcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2luaFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNpbmhcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIlNpbmhcIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJTaW5oXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRhblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRhblwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0Z1wiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRhbmhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0YW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJUYW5oXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aFwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuaFwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJDb3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3NcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvc1wiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTaW5cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzaW5cIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIlNpblwiKVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMtc2V0cy50c1xudmFyIERFRklOSVRJT05TX1NFVFMgPSBbXG4gIC8vIENvbnN0YW50c1xuICB7IG5hbWU6IFwiQWxnZWJyYWljTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcYmFyXFxcXFFcIiB9LFxuICB7IG5hbWU6IFwiQ29tcGxleE51bWJlclwiLCBsYXRleFRyaWdnZXI6IFtcIlxcXFxDXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Q31cIiwgcGFyc2U6IFwiQ29tcGxleE51bWJlclwiIH0sXG4gIHsgbmFtZTogXCJJbWFnaW5hcnlOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaW1hZ2luYXJ5SVwiLCBcIlxcXFxSXCJdIH0sXG4gIHsgbmFtZTogXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYmFyXCIsIFwiXFxcXENcIl0gfSxcbiAgeyBuYW1lOiBcIkVtcHR5U2V0XCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGVtcHR5c2V0XCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdmFybm90aGluZ1wiXSwgcGFyc2U6IFwiRW1wdHlTZXRcIiB9LFxuICAvLyBQYXJzaW5nIG9ubHlcbiAgeyBuYW1lOiBcIkludGVnZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcWlwiXSB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aGJie1p9XCIsIHBhcnNlOiBcIkludGVnZXJcIiB9LFxuICB7IG5hbWU6IFwiUmF0aW9uYWxOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcUVwiXSB9LFxuICB7IG5hbWU6IFwiUmVhbE51bWJlclwiLCBsYXRleFRyaWdnZXI6IFtcIlxcXFxSXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Un1cIiwgcGFyc2U6IFwiUmVhbE51bWJlclwiIH0sXG4gIHsgbmFtZTogXCJFeHRlbmRlZFJlYWxOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYmFyXCIsIFwiXFxcXFJcIl0gfSxcbiAgeyBuYW1lOiBcIlRyYW5zY2VuZGVudGFsTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUi1cXFxcYmFyXFxcXFFcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUlxcXFxiYWNrc2xhc2hcXFxcYmFyXFxcXFFcIiwgcGFyc2U6IFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIiB9LFxuICAvLyBSZWFsIG51bWJlcnMgPCAwXG4gIHsgbmFtZTogXCJOZWdhdGl2ZU51bWJlclwiLCBsYXRleFRyaWdnZXI6IFwiXFxcXFJeLVwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXnstfVwiLCBwYXJzZTogXCJOZWdhdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXy1cIiwgcGFyc2U6IFwiTmVnYXRpdmVOdW1iZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUl97LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVOdW1iZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUl57XFxcXGx0fVwiLCBwYXJzZTogXCJOZWdhdGl2ZU51bWJlclwiIH0sXG4gIC8vIFJlYWwgbnVtYmVycyA+IDBcbiAgeyBuYW1lOiBcIlBvc2l0aXZlTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUl4rXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJeeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlTnVtYmVyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJfK1wiLCBwYXJzZTogXCJQb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSX3srfVwiLCBwYXJzZTogXCJQb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXntcXFxcZ3R9XCIsIHBhcnNlOiBcIlBvc2l0aXZlTnVtYmVyXCIgfSxcbiAgLy8gUmVhbCBudW1iZXJzIDw9IDBcbiAgeyBuYW1lOiBcIk5vblBvc2l0aXZlTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUl57MC19XCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJeey0wfVwiLCBwYXJzZTogXCJOb25Qb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXntcXFxcbGVxfVwiLCBwYXJzZTogXCJOb25Qb3NpdGl2ZU51bWJlclwiIH0sXG4gIC8vIEludGVnZXJzIDwgMFxuICB7IG5hbWU6IFwiTmVnYXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcWl4tXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeLVwiLCBwYXJzZTogXCJOZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpfLVwiLCBwYXJzZTogXCJOZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl97LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpee1xcXFxsdH1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgLy8gSW50ZWdlcnMgPiAgMFxuICB7IG5hbWU6IFwiUG9zaXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcWl4rXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXytcIiwgcGFyc2U6IFwiUG9zaXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpfeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXntcXFxcZ3R9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXntcXFxcZ3QwfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl4rXCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXnsrfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl4qXCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXnsqfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl5cXFxcc3RhclwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl57XFxcXHN0YXJ9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXzFcIiwgcGFyc2U6IFwiUG9zaXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXE5fezF9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIC8vIGh0dHBzOi8vbWF0aHZhdWx0LmNhL2h1Yi9oaWdoZXItbWF0aC9tYXRoLXN5bWJvbHMvYWxnZWJyYS1zeW1ib2xzL1xuICAvLyBJbnRlZ2VycyA+PSAgMFxuICB7IG5hbWU6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXE5cIl0gfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeeyswfVwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57XFxcXGdlcX1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpee1xcXFxnZXEwfVwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57MCt9XCIsIHBhcnNlOiBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Tn1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXE5fMFwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl97MH1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgLy9cbiAgLy8gU2V0IEV4cHJlc3Npb25zXG4gIC8vXG4gIC8vIEB0b2RvOiBjb3VsZCBhbHNvIGhhdmUgYSBgQ2FydGVzaWFuUG93ZXJgIGZ1bmN0aW9uIHdpdGggYSBudW1iZXIgYHJoc2BcbiAge1xuICAgIG5hbWU6IFwiQ2FydGVzaWFuUHJvZHVjdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbWVzXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgLy8gQ2F1dGlvbjogY2FydGVzaWFuIHByb2R1Y3QgaXMgbm90IGFzc29jaWF0aXZlXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIC8vIFNhbWUgYXMgTXVsdGlwbHk/XG4gICAgcGFyc2U6IChwYXJzZXIsIGxocywgdW50aWwpID0+IHtcbiAgICAgIGlmICgzOTAgPCB1bnRpbC5taW5QcmVjKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGNlID0gcGFyc2VyLmNvbXB1dGVFbmdpbmU7XG4gICAgICBpZiAoIWNlIHx8ICFjZS5ib3gobGhzKS5kb21haW4uaXNDb21wYXRpYmxlKFwiU2V0XCIpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VyLmluZGV4O1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiAzOTAgfSk7XG4gICAgICBpZiAocmhzID09PSBudWxsIHx8IGNlLmJveChsaHMpLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJTZXRcIikgIT09IHRydWUpIHtcbiAgICAgICAgcGFyc2VyLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtcIkNhcnRlc2lhblByb2R1Y3RcIiwgbGhzLCByaHNdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxjb21wbGVtZW50XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiB7XG4gICAgICByZXR1cm4gW1wiQ29tcGxlbWVudFwiLCBsaHNdO1xuICAgIH1cbiAgICAvLyBwcmVjZWRlbmNlOiAyNDAsXG4gICAgLy8gQHRvZG86IHNlcmlhbGl6ZSBmb3IgdGhlIG11bHRpcGxlIGFyZ3VtZW50IGNhc2VcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ29tcGxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIjx7PlwiLCBcIlxcXFxjb21wbGVtZW50XCIsIFwiPH0+XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiXG4gICAgLy8gcHJlY2VkZW5jZTogMjQwLFxuICAgIC8vIEB0b2RvOiBzZXJpYWxpemUgZm9yIHRoZSBtdWx0aXBsZSBhcmd1bWVudCBjYXNlXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkludGVyc2VjdGlvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNhcFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMzUwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkludGVydmFsXCIsXG4gICAgLy8gQHRvZG86IHBhcnNlIG9wZW5pbmcgJ1snIG9yICddJyBvciAnKCdcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZVNldFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNdWx0aXBsZVwiLFxuICAgIC8vIEB0b2RvOiBwYXJzZVxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplU2V0XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlVuaW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3VwXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAzNTBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUmFuZ2VcIixcbiAgICAvLyBAdG9kbzogcGFyc2Ugb3BlbmluZyAnWycgb3IgJ10nIG9yICcoJ1xuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplU2V0XG4gIH0sXG4gIC8vIHtcbiAgLy8gICBuYW1lOiAnU2V0JyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd7JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ30nLFxuICAvLyAgIHByZWNlZGVuY2U6IDIwLFxuICAvLyAgIC8vIEB0b2RvOiB0aGUgc2V0IHN5bnRheCBjYW4gYWxzbyBpbmNsdWRlIGNvbmRpdGlvbnMuLi5cbiAgLy8gfSxcbiAge1xuICAgIG5hbWU6IFwiU2V0TWludXNcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzZXRtaW51c1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogNjUwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN5bW1ldHJpY0RpZmZlcmVuY2VcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0cmlhbmdsZVwiXSxcbiAgICAvLyBvciBcXFxcb21pbnVzXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIC8vIEB0b2RvOiBwYXJzZXIgY291bGQgY2hlY2sgdGhhdCBsaHMgYW5kIHJocyBhcmUgc2V0c1xuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICAvLyBQcmVkaWNhdGVzL1JlbGF0aW9uc1xuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmlcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAxNjAsXG4gICAgLy8gQXMgcGVyIE1hdGhNTCwgbG93ZXIgcHJlY2VkZW5jZVxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24odGVybWluYXRvcik7XG4gICAgICByZXR1cm4gcmhzID09PSBudWxsID8gbnVsbCA6IFtcIkVsZW1lbnRcIiwgcmhzLCBsaHNdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRWxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGluXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90RWxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5vdGluXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3Vic2V0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbnN1YnNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RTdXBlcnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5zdXBzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3Vic2V0Tm90RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuc3Vic2V0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3VwZXJzZXROb3RFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5zdXBzZXRlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXVhcmVTdWJzZXRcIixcbiAgICAvLyBNYXRoTUw6IHNxdWFyZSBpbWFnZSBvZlxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNxc3Vic2V0XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNxdWFyZVN1YnNldEVxdWFsXCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgaW1hZ2Ugb2Ygb3IgZXF1YWwgdG9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1YnNldGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNxdWFyZVN1cGVyc2V0XCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgb3JpZ2luYWwgb2ZcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1cHNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXVhcmVTdXBlcnNldEVxdWFsXCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgb3JpZ2luYWwgb2Ygb3IgZXF1YWxcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1cHNldGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1YnNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vic2V0bmVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1YnNldFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2YXJzdWJzZXRuZXFxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1YnNldFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNldEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vic2V0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdXBlcnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1cHNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vwc2V0bmVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1cGVyc2V0XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZhcnN1cHNldG5lcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MCxcbiAgICBwYXJzZTogXCJTdXBlcnNldFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1cGVyc2V0RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzdXBzZXRlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9XG5dO1xuZnVuY3Rpb24gc2VyaWFsaXplU2V0KHNlcmlhbGl6ZXIsIGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJcIjtcbiAgaWYgKGggPT09IFwiU2V0XCIpIHtcbiAgICBpZiAobm9wcyhleHByKSA9PT0gMClcbiAgICAgIHJldHVybiBcIlxcXFxlbXB0eXNldFwiO1xuICAgIGlmIChub3BzKGV4cHIpID09PSAyICYmIGhlYWQob3AoZXhwciwgMikpID09PSBcIkNvbmRpdGlvblwiKSB7XG4gICAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgICAgXCJcXFxcbGVmdFxcXFxsYnJhY2VcIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLFxuICAgICAgICBcIlxcXFxtaWRkbGVcXFxcbWlkXCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSxcbiAgICAgICAgXCJcXFxccmlnaHRcXFxccmJyYWNlXCJcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXGxlZnRcXFxcbGJyYWNlXCIsXG4gICAgICAuLi4ob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpICsgXCIgLFwiKSxcbiAgICAgIFwiXFxcXHJpZ2h0XFxcXHJicmFjZVwiXG4gICAgXSk7XG4gIH1cbiAgaWYgKGggPT09IFwiTXVsdGlwbGVcIikge1xuICB9XG4gIGlmIChoID09PSBcIlJhbmdlXCIpIHtcbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXG1hdGhvcGVuXFxcXGxicmFja1wiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLFxuICAgICAgXCIsIFwiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMikpLFxuICAgICAgXCJcXFxcbWF0aGNsb3NlXFxcXHJicmFja1wiXG4gICAgXSk7XG4gIH1cbiAgaWYgKGggPT09IFwiSW50ZXJ2YWxcIikge1xuICAgIGxldCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgbGV0IG9wMjIgPSBvcChleHByLCAyKTtcbiAgICBsZXQgb3BlbkxlZnQgPSBmYWxzZTtcbiAgICBsZXQgb3BlblJpZ2h0ID0gZmFsc2U7XG4gICAgaWYgKGhlYWQob3AxMikgPT09IFwiT3BlblwiKSB7XG4gICAgICBvcDEyID0gb3Aob3AxMiwgMSk7XG4gICAgICBvcGVuTGVmdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoZWFkKG9wMjIpID09PSBcIk9wZW5cIikge1xuICAgICAgb3AyMiA9IG9wKG9wMjIsIDEpO1xuICAgICAgb3BlblJpZ2h0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICBgXFxcXG1hdGhvcGVuJHtvcGVuTGVmdCA/IFwiXFxcXHJicmFja1wiIDogXCJcXFxcbGJyYWNrXCJ9YCxcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wMTIpLFxuICAgICAgXCIsIFwiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AyMiksXG4gICAgICBgXFxcXG1hdGhjbG9zZSR7b3BlblJpZ2h0ID8gXCJcXFxcbGJyYWNrXCIgOiBcIlxcXFxyYnJhY2tcIn1gXG4gICAgXSk7XG4gIH1cbiAgY29uc3Qgc3R5bGUgPSBzZXJpYWxpemVyLm51bWVyaWNTZXRTdHlsZShleHByLCBzZXJpYWxpemVyLmxldmVsKTtcbiAgaWYgKHN0eWxlID09PSBcImNvbXBhY3RcIikge1xuICB9IGVsc2UgaWYgKHN0eWxlID09PSBcImludGVydmFsXCIpIHtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJyZWd1bGFyXCIpIHtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJzZXQtYnVpbGRlclwiKSB7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jYWxjdWx1cy50c1xuZnVuY3Rpb24gcGFyc2VJbnRlZ3JhbChjb21tYW5kLCBuID0gMSkge1xuICByZXR1cm4gKHBhcnNlcikgPT4ge1xuICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICBsZXQgc3VwID0gbnVsbDtcbiAgICBsZXQgc3ViMiA9IG51bGw7XG4gICAgd2hpbGUgKCEoc3ViMiAhPT0gbnVsbCAmJiBzdXAgIT09IG51bGwpICYmIChwYXJzZXIucGVlayA9PT0gXCJfXCIgfHwgcGFyc2VyLnBlZWsgPT09IFwiXlwiKSkge1xuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIl9cIikpXG4gICAgICAgIHN1YjIgPSBwYXJzZXIucGFyc2VHcm91cCgpID8/IHBhcnNlci5wYXJzZVRva2VuKCk7XG4gICAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICAgIHN1cCA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIH1cbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHN1YjIgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdWIyKSlcbiAgICAgIHN1YjIgPSBudWxsO1xuICAgIGlmIChzdXAgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdXApKVxuICAgICAgc3VwID0gbnVsbDtcbiAgICBsZXQgW2ZuLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keShwYXJzZXIsIG4pO1xuICAgIGlmIChmbiAmJiAhaW5kZXgpIHtcbiAgICAgIGlmIChoZWFkKGZuKSA9PT0gXCJBZGRcIiB8fCBoZWFkKGZuKSA9PT0gXCJTdWJ0cmFjdFwiKSB7XG4gICAgICAgIGNvbnN0IG5ld09wID0gW107XG4gICAgICAgIGNvbnN0IHJlc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzKGZuKSA/PyBbXSkge1xuICAgICAgICAgIGlmIChpbmRleClcbiAgICAgICAgICAgIHJlc3QucHVzaChvcDMpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG9wMjI7XG4gICAgICAgICAgICBbb3AyMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKG9wMyk7XG4gICAgICAgICAgICBuZXdPcC5wdXNoKG9wMjIgPz8gb3AzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsICYmIHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcIkFkZFwiLFxuICAgICAgICAgICAgbWFrZUludGVncmFsKFxuICAgICAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgIFtcIkFkZFwiLCAuLi5uZXdPcF0sXG4gICAgICAgICAgICAgIFt7IGluZGV4LCBzdWI6IHN1YjIsIHN1cCB9XVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhlYWQoZm4pID09PSBcIkRpdmlkZVwiKSB7XG4gICAgICAgIGxldCBhbHROdW1lcmF0b3I7XG4gICAgICAgIFthbHROdW1lcmF0b3IsIGluZGV4XSA9IHBhcnNlSW50ZWdyYWxCb2R5RXhwcmVzc2lvbihvcChmbiwgMSkpO1xuICAgICAgICBpZiAoYWx0TnVtZXJhdG9yICE9PSBudWxsICYmIGluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgZm4gPSBbXCJEaXZpZGVcIiwgYWx0TnVtZXJhdG9yLCBvcChmbiwgMildO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWtlSW50ZWdyYWwocGFyc2VyLCBjb21tYW5kLCBmbiwgW3sgaW5kZXgsIHN1Yjogc3ViMiwgc3VwIH1dKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1ha2VJbnRlZ3JhbChwYXJzZXIsIGNvbW1hbmQsIGZuLCByYW5nZXMpIHtcbiAgaWYgKGZuICYmIHJhbmdlcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtjb21tYW5kLCBmbl07XG4gIGZuID8/IChmbiA9IFwiTm90aGluZ1wiKTtcbiAgaWYgKHBhcnNlci5jb21wdXRlRW5naW5lKSB7XG4gICAgY29uc3QgY2UgPSBwYXJzZXIuY29tcHV0ZUVuZ2luZTtcbiAgICBsZXQgaGFzSW5kZXggPSBmYWxzZTtcbiAgICBjb25zdCBpZFRhYmxlID0ge307XG4gICAgZm9yIChjb25zdCByIG9mIHJhbmdlcylcbiAgICAgIGlmIChyLmluZGV4KSB7XG4gICAgICAgIGhhc0luZGV4ID0gdHJ1ZTtcbiAgICAgICAgaWRUYWJsZVtyLmluZGV4XSA9IHsgZG9tYWluOiBcIkV4dGVuZGVkUmVhbE51bWJlclwiIH07XG4gICAgICB9XG4gICAgaWYgKGhhc0luZGV4KVxuICAgICAgY2UucHVzaFNjb3BlKGlkVGFibGUpO1xuICAgIGZuID0gY2UuYm94KGZuKS5qc29uO1xuICAgIGlmIChoYXNJbmRleClcbiAgICAgIGNlLnBvcFNjb3BlKCk7XG4gIH1cbiAgcmV0dXJuIFtjb21tYW5kLCBmbiwgLi4ucmFuZ2VzLm1hcCgocikgPT4gbWFrZVJhbmdlKHIpKV07XG59XG5mdW5jdGlvbiBtYWtlUmFuZ2UocmFuZ2UpIHtcbiAgY29uc3QgaGVsZEluZGV4ID0gcmFuZ2UuaW5kZXggPyBbXCJIb2xkXCIsIHJhbmdlLmluZGV4XSA6IFwiTm90aGluZ1wiO1xuICBpZiAocmFuZ2Uuc3VwICE9PSBudWxsKVxuICAgIHJldHVybiBbXCJUdXBsZVwiLCBoZWxkSW5kZXgsIHJhbmdlLnN1YiA/PyBcIk5vdGhpbmdcIiwgcmFuZ2Uuc3VwXTtcbiAgaWYgKHJhbmdlLnN1YiAhPT0gbnVsbClcbiAgICByZXR1cm4gW1wiVHVwbGVcIiwgaGVsZEluZGV4LCByYW5nZS5zdWJdO1xuICByZXR1cm4gaGVsZEluZGV4O1xufVxuZnVuY3Rpb24gcGFyc2VJbnRlZ3JhbEJvZHkocGFyc2VyLCBuID0gMSkge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGxldCBmbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oe1xuICAgIG1pblByZWM6IDI2NixcbiAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXFxcXG1hdGhybVwiLCBcIjx7PlwiLCBcImRcIiwgXCI8fT5cIl0pKVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXFxcXG9wZXJhdG9ybmFtZVwiLCBcIjx7PlwiLCBcImRcIiwgXCI8fT5cIl0pKVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9KTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgIGZuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7XG4gICAgICBtaW5QcmVjOiAyNjYsXG4gICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgaWYgKHBhcnNlci5tYXRjaChcImRcIikpXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKGZuICYmICFmb3VuZClcbiAgICByZXR1cm4gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKGZuKTtcbiAgY29uc3QgaW5kZXhlcyA9IHBhcnNlSW5kZXhlcyhwYXJzZXIsIG4pO1xuICByZXR1cm4gW2ZuLCBpbmRleGVzWzBdID8/IG51bGxdO1xufVxuZnVuY3Rpb24gcGFyc2VJbmRleGVzKHBhcnNlciwgbiA9IDEpIHtcbiAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgaW5kZXggPSBzeW1ib2wocGFyc2VyLnBhcnNlU3ltYm9sKCkpO1xuICBpZiAoaW5kZXggPT09IG51bGwpXG4gICAgcmV0dXJuIFtdO1xuICByZXN1bHQucHVzaChpbmRleCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oZXhwcikge1xuICBjb25zdCBoID0gaGVhZChleHByKTtcbiAgY29uc3Qgb3AxMiA9IG9wKGV4cHIsIDEpO1xuICBpZiAoIW9wMTIpXG4gICAgcmV0dXJuIFtleHByLCBudWxsXTtcbiAgaWYgKGggPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBzeW0gPSBzeW1ib2woYXJnc1thcmdzLmxlbmd0aCAtIDJdKTtcbiAgICAgIGlmIChzeW0gPT09IFwiZFwiIHx8IHN5bSA9PT0gXCJkX3VwcmlnaHRcIikge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBzeW1ib2woYXJnc1sxXSldO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDMpXG4gICAgICAgICAgcmV0dXJuIFthcmdzWzBdLCBzeW1ib2woYXJnc1syXSldO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFtcIk11bHRpcGx5XCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTIpXSxcbiAgICAgICAgICBzeW1ib2woYXJnc1thcmdzLmxlbmd0aCAtIDFdKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29uc3QgW2ZuMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKGFyZ3NbYXJncy5sZW5ndGggLSAxXSk7XG4gICAgICBpZiAoZm4yKVxuICAgICAgICByZXR1cm4gW1tcIk11bHRpcGx5XCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTEpLCBmbjJdLCBpbmRleF07XG4gICAgfVxuICB9IGVsc2UgaWYgKGggPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24ob3AxMik7XG4gICAgaWYgKGluZGV4KSB7XG4gICAgICBpZiAoIWZuMilcbiAgICAgICAgcmV0dXJuIFtudWxsLCBpbmRleF07XG4gICAgICByZXR1cm4gW1tcIkRlbGltaXRlclwiLCBmbjIsIC4uLm9wcyhleHByKS5zbGljZSgxKV0sIGluZGV4XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaCA9PT0gXCJBZGRcIikge1xuICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oYXJnc1thcmdzLmxlbmd0aCAtIDFdKTtcbiAgICAgIGlmIChpbmRleCkge1xuICAgICAgICBpZiAoZm4yKVxuICAgICAgICAgIHJldHVybiBbW1wiQWRkXCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTEpLCBmbjJdLCBpbmRleF07XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgcmV0dXJuIFtbXCJBZGRcIiwgLi4uYXJncy5zbGljZSgwLCAtMSldLCBpbmRleF07XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgcmV0dXJuIFthcmdzWzBdLCBpbmRleF07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24ob3AxMik7XG4gICAgaWYgKGluZGV4KVxuICAgICAgcmV0dXJuIFtmbjIgPyBbXCJOZWdhdGVcIiwgZm4yXSA6IG51bGwsIGluZGV4XTtcbiAgfSBlbHNlIGlmIChoID09PSBcIkRpdmlkZVwiKSB7XG4gICAgY29uc3QgW2ZuMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKG9wMTIpO1xuICAgIGlmIChpbmRleClcbiAgICAgIHJldHVybiBbW1wiRGl2aWRlXCIsIGZuMiA/PyAxLCBvcChleHByLCAyKV0sIGluZGV4XTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpO1xuICAgIGlmIChhcmdzPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFthcmcyLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oYXJnc1swXSk7XG4gICAgICBpZiAoaW5kZXgpXG4gICAgICAgIHJldHVybiBbW2hlYWQoZXhwciksIGFyZzJdLCBpbmRleF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXhwciwgbnVsbF07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVJbnRlZ3JhbChjb21tYW5kKSB7XG4gIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgIGlmICghb3AoZXhwciwgMSkpXG4gICAgICByZXR1cm4gY29tbWFuZDtcbiAgICBsZXQgYXJnID0gb3AoZXhwciwgMik7XG4gICAgY29uc3QgaCA9IGhlYWQoYXJnKTtcbiAgICBsZXQgaW5kZXhFeHByID0gbnVsbDtcbiAgICBpZiAoaCA9PT0gXCJUdXBsZVwiIHx8IGggPT09IFwiVHJpcGxlXCIgfHwgaCA9PT0gXCJQYWlyXCIgfHwgaCA9PT0gXCJTaW5nbGVcIikge1xuICAgICAgaW5kZXhFeHByID0gb3AoYXJnLCAxKTtcbiAgICB9IGVsc2UgaWYgKGggPT09IFwiSG9sZFwiKSB7XG4gICAgICBpbmRleEV4cHIgPSBvcChhcmcsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleEV4cHIgPSBvcChhcmcsIDEpID8/IFwieFwiO1xuICAgICAgYXJnID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhlYWQoaW5kZXhFeHByKSA9PT0gXCJIb2xkXCIpXG4gICAgICBpbmRleEV4cHIgPSBvcChpbmRleEV4cHIsIDEpO1xuICAgIGNvbnN0IGluZGV4ID0gaW5kZXhFeHByICE9PSBudWxsID8gc3ltYm9sKGluZGV4RXhwcikgOiBudWxsO1xuICAgIGxldCBmbiA9IG9wKGV4cHIsIDEpO1xuICAgIGlmIChoZWFkKGZuKSA9PT0gXCJMYW1iZGFcIiAmJiBvcChmbiwgMSkpXG4gICAgICBmbiA9IHN1YnMob3AoZm4sIDEpLCB7IF86IGluZGV4ID8/IFwieFwiLCBfMTogaW5kZXggPz8gXCJ4XCIgfSk7XG4gICAgaWYgKCFhcmcpIHtcbiAgICAgIGlmICghaW5kZXggfHwgaW5kZXggPT09IFwiTm90aGluZ1wiKVxuICAgICAgICByZXR1cm4gam9pbkxhdGV4KFtjb21tYW5kLCBcIlxcXFwhXCIsIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKV0pO1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIFwiXFxcXCFcIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoZm4pLFxuICAgICAgICBcIlxcXFwsXFxcXG9wZXJhdG9ybmFtZXtkfVwiLFxuICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleClcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCBzdWJTeW1ib2wgPSBvcChhcmcsIDIpID8gc3ltYm9sKG9wKGFyZywgMikpIDogbnVsbDtcbiAgICBsZXQgc3ViMiA9IGFyZyAmJiBzdWJTeW1ib2wgIT09IFwiTm90aGluZ1wiID8gc2VyaWFsaXplci5zZXJpYWxpemUob3AoYXJnLCAyKSkgOiBcIlwiO1xuICAgIGlmIChzdWIyLmxlbmd0aCA+IDApXG4gICAgICBzdWIyID0gYF97JHtzdWIyfX1gO1xuICAgIGxldCBzdXAgPSBcIlwiO1xuICAgIGNvbnN0IHN1cFN5bWJvbCA9IG9wKGFyZywgMykgPyBzeW1ib2wob3AoYXJnLCAzKSkgOiBudWxsO1xuICAgIGlmIChvcChhcmcsIDMpICYmIHN1cFN5bWJvbCAhPT0gXCJOb3RoaW5nXCIpXG4gICAgICBzdXAgPSBgXnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGFyZywgMykpfX1gO1xuICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgY29tbWFuZCxcbiAgICAgIHN1cCxcbiAgICAgIHN1YjIsXG4gICAgICBcIlxcXFwhXCIsXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShmbiksXG4gICAgICAuLi5pbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIiA/IFtcIlxcXFwsXFxcXG9wZXJhdG9ybmFtZXtkfVwiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleCldIDogW11cbiAgICBdKTtcbiAgfTtcbn1cbnZhciBERUZJTklUSU9OU19DQUxDVUxVUyA9IFtcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIG5hbWU6IFwiSW50ZWdyYXRlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiSW50ZWdyYXRlXCIpLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplSW50ZWdyYWwoXCJcXFxcaW50XCIpXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpaW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiSW50ZWdyYXRlXCIsIDIpXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpaWludFwiXSxcbiAgICBwYXJzZTogcGFyc2VJbnRlZ3JhbChcIkludGVncmF0ZVwiLCAzKVxuICB9LFxuICB7XG4gICAga2luZDogXCJleHByZXNzaW9uXCIsXG4gICAgbmFtZTogXCJDaXJjdWxhckludGVncmF0ZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9pbnRcIl0sXG4gICAgcGFyc2U6IHBhcnNlSW50ZWdyYWwoXCJDaXJjdWxhckludGVncmF0ZVwiKSxcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUludGVncmFsKFwiXFxcXG9pbnRcIilcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9paW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiQ2lyY3VsYXJJbnRlZ3JhdGVcIiwgMilcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9paWludFwiXSxcbiAgICBwYXJzZTogcGFyc2VJbnRlZ3JhbChcIkNpcmN1bGFySW50ZWdyYXRlXCIsIDMpXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1zeW1ib2xzLnRzXG52YXIgU1lNQk9MUyA9IFtcbiAgLy8gR3JlZWtcbiAgW1wiYWxwaGFcIiwgXCJcXFxcYWxwaGFcIiwgOTQ1XSxcbiAgW1wiYmV0YVwiLCBcIlxcXFxiZXRhXCIsIDk0Nl0sXG4gIFtcImdhbW1hXCIsIFwiXFxcXGdhbW1hXCIsIDk0N10sXG4gIFtcImRlbHRhXCIsIFwiXFxcXGRlbHRhXCIsIDk0OF0sXG4gIFtcImVwc2lsb25cIiwgXCJcXFxcZXBzaWxvblwiLCA5NDldLFxuICBbXCJlcHNpbG9uU3ltYm9sXCIsIFwiXFxcXHZhcmVwc2lsb25cIiwgMTAxM10sXG4gIC8vIEdSRUVLIExVTkFURSBFUFNJTE9OIFNZTUJPTFxuICBbXCJ6ZXRhXCIsIFwiXFxcXHpldGFcIiwgOTUwXSxcbiAgW1wiZXRhXCIsIFwiXFxcXGV0YVwiLCA5NTFdLFxuICBbXCJ0aGV0YVwiLCBcIlxcXFx0aGV0YVwiLCA5NTJdLFxuICBbXCJ0aGV0YVN5bWJvbFwiLCBcIlxcXFx2YXJ0aGV0YVwiLCA5NzddLFxuICAvLyBVbmljb2RlIEdSRUVLIFRIRVRBIFNZTUJPTFxuICBbXCJpb3RhXCIsIFwiXFxcXGlvdGFcIiwgOTUzXSxcbiAgW1wia2FwcGFcIiwgXCJcXFxca2FwcGFcIiwgOTU0XSxcbiAgW1wia2FwcGFTeW1ib2xcIiwgXCJcXFxcdmFya2FwcGFcIiwgMTAwOF0sXG4gIC8vIEdSRUVLIEtBUFBBIFNZTUJPTFxuICBbXCJsYW1iZGFcIiwgXCJcXFxcbGFtYmRhXCIsIDk1NV0sXG4gIFtcIm11XCIsIFwiXFxcXG11XCIsIDk1Nl0sXG4gIFtcIm51XCIsIFwiXFxcXG51XCIsIDk1N10sXG4gIFtcInhpXCIsIFwiXFxcXHhpXCIsIDk1OF0sXG4gIFtcIm9taWNyb25cIiwgXCJcXFxcb21pY3JvblwiLCA5NTldLFxuICBbXCJwaVwiLCBcIlxcXFxwaVwiLCA5NjBdLFxuICBbXCJwaVN5bWJvbFwiLCBcIlxcXFx2YXJwaVwiLCA5ODJdLFxuICAvLyBHUkVFSyBQSSBTWU1CT0xcbiAgW1wicmhvXCIsIFwiXFxcXHJob1wiLCA5NjFdLFxuICBbXCJyaG9TeW1ib2xcIiwgXCJcXFxcdmFycmhvXCIsIDEwMDldLFxuICAvLyBHUkVFSyBSSE8gU1lNQk9MXG4gIFtcInNpZ21hXCIsIFwiXFxcXHNpZ21hXCIsIDk2M10sXG4gIFtcImZpbmFsU2lnbWFcIiwgXCJcXFxcdmFyc2lnbWFcIiwgOTYyXSxcbiAgLy9HUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUFcbiAgW1widGF1XCIsIFwiXFxcXHRhdVwiLCA5NjRdLFxuICBbXCJwaGlcIiwgXCJcXFxccGhpXCIsIDk4MV0sXG4gIC8vIE5vdGUgR1JFRUsgUEhJIFNZTUJPTCwgYnV0IGNvbW1vbiB1c2FnZSBpbiBtYXRoXG4gIFtcInBoaUxldHRlclwiLCBcIlxcXFx2YXJwaGlcIiwgOTY2XSxcbiAgW1widXBzaWxvblwiLCBcIlxcXFx1cHNpbG9uXCIsIDk2NV0sXG4gIFtcImNoaVwiLCBcIlxcXFxjaGlcIiwgOTY3XSxcbiAgW1wicHNpXCIsIFwiXFxcXHBzaVwiLCA5NjhdLFxuICBbXCJvbWVnYVwiLCBcIlxcXFxvbWVnYVwiLCA5NjldLFxuICBbXCJBbHBoYVwiLCBcIlxcXFxBbHBoYVwiLCA5MTNdLFxuICBbXCJCZXRhXCIsIFwiXFxcXEJldGFcIiwgOTE0XSxcbiAgW1wiR2FtbWFcIiwgXCJcXFxcR2FtbWFcIiwgOTE1XSxcbiAgW1wiRGVsdGFcIiwgXCJcXFxcRGVsdGFcIiwgOTE2XSxcbiAgW1wiRXBzaWxvblwiLCBcIlxcXFxFcHNpbG9uXCIsIDkxN10sXG4gIFtcIlpldGFcIiwgXCJcXFxcWmV0YVwiLCA5MThdLFxuICBbXCJFdGFcIiwgXCJcXFxcRXRhXCIsIDkxOV0sXG4gIFtcIlRoZXRhXCIsIFwiXFxcXFRoZXRhXCIsIDkyMF0sXG4gIFtcIklvdGFcIiwgXCJcXFxcSW90YVwiLCA5MjFdLFxuICBbXCJLYXBwYVwiLCBcIlxcXFxLYXBwYVwiLCA5MjJdLFxuICBbXCJMYW1iZGFcIiwgXCJcXFxcTGFtYmRhXCIsIDkyM10sXG4gIFtcIk11XCIsIFwiXFxcXE11XCIsIDkyNF0sXG4gIFtcIk51XCIsIFwiXFxcXE51XCIsIDkyNV0sXG4gIFtcIlhpXCIsIFwiXFxcXFhpXCIsIDkyNl0sXG4gIFtcIk9taWNyb25cIiwgXCJcXFxcT21pY3JvblwiLCA5MjddLFxuICAvLyBbJ1BpJywgJ1xcXFxQaScsIDB4MDNhMF0sXG4gIFtcIlJob1wiLCBcIlxcXFxSaG9cIiwgOTI5XSxcbiAgW1wiU2lnbWFcIiwgXCJcXFxcU2lnbWFcIiwgOTMxXSxcbiAgW1wiVGF1XCIsIFwiXFxcXFRhdVwiLCA5MzJdLFxuICBbXCJQaGlcIiwgXCJcXFxcUGhpXCIsIDkzNF0sXG4gIFtcIlVwc2lsb25cIiwgXCJcXFxcVXBzaWxvblwiLCA5MzNdLFxuICBbXCJDaGlcIiwgXCJcXFxcQ2hpXCIsIDkzNV0sXG4gIFtcIlBzaVwiLCBcIlxcXFxQc2lcIiwgOTM2XSxcbiAgW1wiT21lZ2FcIiwgXCJcXFxcT21lZ2FcIiwgOTM3XSxcbiAgW1wiZGlnYW1tYVwiLCBcIlxcXFxkaWdhbW1hXCIsIDk4OV0sXG4gIC8vIEhlYnJld1xuICBbXCJhbGVwaFwiLCBcIlxcXFxhbGVwaFwiLCA4NTAxXSxcbiAgLy8gVW5pY29kZSBBTEVGIFNZTUJPTFxuICBbXCJiZXRcIiwgXCJcXFxcYmV0aFwiLCA4NTAyXSxcbiAgW1wiZ2ltZWxcIiwgXCJcXFxcZ2ltZWxcIiwgODUwM10sXG4gIFtcImRhbGV0XCIsIFwiXFxcXGRhbGV0aFwiLCA4NTA0XSxcbiAgLy8gTGV0dGVyLWxpa2VcbiAgW1wiZWxsXCIsIFwiXFxcXGVsbFwiLCA4NDk5XSxcbiAgLy8gVW5pY29kZSBTQ1JJUFQgU01BTEwgTFxuICBbXCJ0dXJuZWRDYXBpdGFsRlwiLCBcIlxcXFxGaW52XCIsIDg0OThdLFxuICAvLyBVbmljb2RlIFRVUk5FRCBDQVBJVEFMIEYnXG4gIFtcInR1cm5lZENhcGl0YWxHXCIsIFwiXFxcXEdhbWVcIiwgODUxM10sXG4gIC8vIFRVUk5FRCBTQU5TLVNFUklGIENBUElUQUwgR1xuICBbXCJ3ZWllcnN0cmFzc1wiLCBcIlxcXFx3cFwiLCA4NDcyXSxcbiAgLy8gVW5pY29kZSBTQ1JJUFQgQ0FQSVRBTCBQXG4gIFtcImV0aFwiLCBcIlxcXFxldGhcIiwgMjQwXSxcbiAgW1wiaW52ZXJ0ZWRPaG1cIiwgXCJcXFxcbWhvXCIsIDg0ODddLFxuICAvLyBVbmljb2RlIElOVkVSVEVEIE9ITSBTSUdOXG4gIFtcImhCYXJcIiwgXCJcXFxcaGJhclwiLCAyOTVdLFxuICAvLyBVbmljb2RlIExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggU1RST0tFXG4gIFtcImhTbGFzaFwiLCBcIlxcXFxoc2xhc2hcIiwgODQ2M10sXG4gIC8vIFVuaWNvZGUgUExBTkNLIENPTlNUQU5UIE9WRVIgVFdPIFBJXG4gIC8vIFN5bWJvbHNcbiAgW1wiYmxhY2tDbHViU3VpdFwiLCBcIlxcXFxjbHVic3VpdFwiLCA5ODI3XSxcbiAgW1wid2hpdGVIZWFydFN1aXRcIiwgXCJcXFxcaGVhcnRzdWl0XCIsIDk4MjVdLFxuICBbXCJibGFja1NwYWRlU3VpdFwiLCBcIlxcXFxzcGFkZXN1aXRcIiwgOTgyNF0sXG4gIFtcIndoaXRlRGlhbW9uZFN1aXRcIiwgXCJcXFxcZGlhbW9uZHN1aXRcIiwgOTgyNl0sXG4gIFtcInNoYXJwXCIsIFwiXFxcXHNoYXJwXCIsIDk4MzldLFxuICBbXCJmbGF0XCIsIFwiXFxcXGZsYXRcIiwgOTgzN10sXG4gIFtcIm5hdHVyYWxcIiwgXCJcXFxcbmF0dXJhbFwiLCA5ODM4XVxuXTtcbnZhciBERUZJTklUSU9OU19TWU1CT0xTID0gW1xuICAuLi5TWU1CT0xTLm1hcCgoW3N5bWJvbDIsIGxhdGV4LCBfY29kZXBvaW50XSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgICAgbmFtZTogc3ltYm9sMixcbiAgICAgIGxhdGV4VHJpZ2dlcjogW2xhdGV4XSxcbiAgICAgIHBhcnNlOiBzeW1ib2wyXG4gICAgfTtcbiAgfSksXG4gIC4uLlNZTUJPTFMubWFwKChbc3ltYm9sMiwgX2xhdGV4LCBjb2RlcG9pbnRdKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgICBsYXRleFRyaWdnZXI6IFtTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpXSxcbiAgICAgIHBhcnNlOiBzeW1ib2wyXG4gICAgfTtcbiAgfSlcbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jb21wbGV4LnRzXG52YXIgREVGSU5JVElPTlNfQ09NUExFWCA9IFtcbiAge1xuICAgIG5hbWU6IFwiUmVhbFwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxSZVwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJJbWFnaW5hcnlcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcSW1cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJndW1lbnRcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJnXCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbmp1Z2F0ZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxzdGFyXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1zdGF0aXN0aWNzLnRzXG52YXIgREVGSU5JVElPTlNfU1RBVElTVElDUyA9IFtcbiAge1xuICAgIG5hbWU6IFwiTWVhblwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIixcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJtZWFuXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTWVkaWFuXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcIm1lZGlhblwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN0YW5kYXJEZXZpYXRpb25cIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwic3RkZGV2XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJhclwiXSxcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBwYXJzZTogKHBhcnNlciwgX3VudGlsKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICAgICAgaWYgKCFleHByIHx8ICFzeW1ib2woZXhwcikpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtcIk1lYW5cIiwgZXhwcl07XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMudHNcbnZhciBERUZBVUxUX0RFTElNSVRFUiA9IHtcbiAgXCIoXCI6IFwiKFwiLFxuICBcIilcIjogXCIpXCIsXG4gIFwiW1wiOiBcIlxcXFxsYnJhY2tcIixcbiAgXCJdXCI6IFwiXFxcXHJicmFja1wiLFxuICBcIntcIjogXCJcXFxcbGJyYWNlXCIsXG4gIFwifVwiOiBcIlxcXFxyYnJhY2VcIixcbiAgXCI8XCI6IFwiXFxcXGxhbmdsZVwiLFxuICBcIj5cIjogXCJcXFxccmFuZ2xlXCIsXG4gIFwifFwiOiBcIlxcXFx2ZXJ0XCIsXG4gIFwifHxcIjogXCJcXFxcVmVydFwiLFxuICBcIlxcXFxsY2VpbFwiOiBcIlxcXFxsY2VpbFwiLFxuICBcIlxcXFxsZmxvb3JcIjogXCJcXFxcbGZsb29yXCIsXG4gIFwiXFxcXHJjZWlsXCI6IFwiXFxcXHJjZWlsXCIsXG4gIFwiXFxcXHJmbG9vclwiOiBcIlxcXFxyZmxvb3JcIlxufTtcbmZ1bmN0aW9uIGFkZEVudHJ5KHJlc3VsdCwgZW50cnksIG9uRXJyb3IpIHtcbiAgY29uc3QgaW5kZXhlZEVudHJ5ID0gbWFrZUluZGV4ZWRFbnRyeShlbnRyeSwgb25FcnJvcik7XG4gIGlmIChpbmRleGVkRW50cnkgPT09IG51bGwpXG4gICAgcmV0dXJuO1xuICBjb25zdCBraW5kID0gXCJraW5kXCIgaW4gZW50cnkgPyBlbnRyeS5raW5kIDogXCJleHByZXNzaW9uXCI7XG4gIGNvbnN0IGxhdGV4VHJpZ2dlciA9IGluZGV4ZWRFbnRyeS5sYXRleFRyaWdnZXI7XG4gIGlmICh0eXBlb2YgbGF0ZXhUcmlnZ2VyID09PSBcInN0cmluZ1wiKVxuICAgIHJlc3VsdC5sb29rYWhlYWQgPSBNYXRoLm1heChyZXN1bHQubG9va2FoZWFkLCBjb3VudFRva2VucyhsYXRleFRyaWdnZXIpKTtcbiAgY29uc3QgdG9rZW5zVHJpZ2dlciA9IHRva2VuaXplKGxhdGV4VHJpZ2dlciA/PyBcIlwiLCBbXSk7XG4gIGlmIChsYXRleFRyaWdnZXI/LlsxXSA9PT0gXCJcXFxccHJpbWVcIilcbiAgICA7XG4gIGlmICh0b2tlbnNUcmlnZ2VyLmxlbmd0aCA9PT0gMiAmJiAvW19eXS8udGVzdCh0b2tlbnNUcmlnZ2VyWzBdKSAmJiB0b2tlbnNUcmlnZ2VyWzFdICE9PSBcIjx7PlwiICYmIGtpbmQgIT09IFwiZnVuY3Rpb25cIiAmJiBraW5kICE9PSBcImVudmlyb25tZW50XCIgJiYga2luZCAhPT0gXCJtYXRjaGZpeFwiKSB7XG4gICAgbGV0IHBhcnNlID0gZW50cnkucGFyc2U7XG4gICAgaWYgKCFwYXJzZSAmJiBlbnRyeS5uYW1lKSB7XG4gICAgICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIgfHwga2luZCA9PT0gXCJwcmVmaXhcIilcbiAgICAgICAgcGFyc2UgPSAoX3BhcnNlciwgZXhwcikgPT4gW2VudHJ5Lm5hbWUsIGV4cHJdO1xuICAgICAgZWxzZVxuICAgICAgICBwYXJzZSA9IGVudHJ5Lm5hbWU7XG4gICAgfVxuICAgIGFkZEVudHJ5KFxuICAgICAgcmVzdWx0LFxuICAgICAge1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAga2luZCxcbiAgICAgICAgbmFtZTogdm9pZCAwLFxuICAgICAgICBzZXJpYWxpemU6IHZvaWQgMCxcbiAgICAgICAgcGFyc2UsXG4gICAgICAgIGxhdGV4VHJpZ2dlcjogW3Rva2Vuc1RyaWdnZXJbMF0sIFwiPHs+XCIsIHRva2Vuc1RyaWdnZXJbMV0sIFwiPH0+XCJdXG4gICAgICB9LFxuICAgICAgb25FcnJvclxuICAgICk7XG4gIH1cbiAgcmVzdWx0LmRlZnMucHVzaChpbmRleGVkRW50cnkpO1xuICBpZiAoaW5kZXhlZEVudHJ5Lm5hbWUgIT09IHZvaWQgMCkge1xuICAgIGlmIChyZXN1bHQuaWRzLmhhcyhpbmRleGVkRW50cnkubmFtZSkpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIGluZGV4ZWRFbnRyeS5uYW1lLFxuICAgICAgICAgIFwiRHVwbGljYXRlIGRlZmluaXRpb24uIFRoZSBuYW1lIChNYXRoSlNPTiBpZGVudGlmaWVyKSBtdXN0IGJlIHVuaXF1ZSwgYnV0IHRyaWdnZXJzIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgZGVmaW5pdGlvbnMuXCJcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3VsdC5pZHMuc2V0KGluZGV4ZWRFbnRyeS5uYW1lLCBpbmRleGVkRW50cnkpO1xuICB9XG59XG5mdW5jdGlvbiBpbmRleExhdGV4RGljdGlvbmFyeShkaWMsIG9uRXJyb3IpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGxvb2thaGVhZDogMSxcbiAgICBpZHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgZGVmczogW11cbiAgfTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBkaWMpXG4gICAgYWRkRW50cnkocmVzdWx0LCBlbnRyeSwgb25FcnJvcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYWtlSW5kZXhlZEVudHJ5KGVudHJ5LCBvbkVycm9yKSB7XG4gIGlmICghaXNWYWxpZEVudHJ5KGVudHJ5LCBvbkVycm9yKSlcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGtpbmQ6IFwia2luZFwiIGluIGVudHJ5ID8gZW50cnkua2luZCA6IFwiZXhwcmVzc2lvblwiXG4gIH07XG4gIGxldCB0b2tlbnNUcmlnZ2VyID0gbnVsbDtcbiAgaWYgKFwibGF0ZXhUcmlnZ2VyXCIgaW4gZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5LmxhdGV4VHJpZ2dlciA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHRva2Vuc1RyaWdnZXIgPSB0b2tlbml6ZShlbnRyeS5sYXRleFRyaWdnZXIsIFtdKTtcbiAgICBlbHNlXG4gICAgICB0b2tlbnNUcmlnZ2VyID0gZW50cnkubGF0ZXhUcmlnZ2VyO1xuICB9XG4gIGxldCBpZFRyaWdnZXIgPSBudWxsO1xuICBpZiAoXCJpZGVudGlmaWVyVHJpZ2dlclwiIGluIGVudHJ5KSB7XG4gICAgaWRUcmlnZ2VyID0gZW50cnkuaWRlbnRpZmllclRyaWdnZXI7XG4gIH1cbiAgaWYgKHRva2Vuc1RyaWdnZXIgIT09IG51bGwpXG4gICAgcmVzdWx0LmxhdGV4VHJpZ2dlciA9IHRva2Vuc1RvU3RyaW5nKHRva2Vuc1RyaWdnZXIpO1xuICBpZiAoaWRUcmlnZ2VyICE9PSBudWxsKVxuICAgIHJlc3VsdC5pZGVudGlmaWVyVHJpZ2dlciA9IGlkVHJpZ2dlcjtcbiAgaWYgKGVudHJ5Lm5hbWUpIHtcbiAgICByZXN1bHQubmFtZSA9IGVudHJ5Lm5hbWU7XG4gICAgcmVzdWx0LnNlcmlhbGl6ZSA9IG1ha2VTZXJpYWxpemVIYW5kbGVyKGVudHJ5LCB0b2tlbnNUcmlnZ2VyLCBpZFRyaWdnZXIpO1xuICB9XG4gIGlmIChyZXN1bHQua2luZCA9PT0gXCJtYXRjaGZpeFwiICYmIGlzTWF0Y2hmaXhFbnRyeShlbnRyeSkpIHtcbiAgICByZXN1bHQub3BlbkRlbGltaXRlciA9IGVudHJ5Lm9wZW5UcmlnZ2VyO1xuICAgIHJlc3VsdC5jbG9zZURlbGltaXRlciA9IGVudHJ5LmNsb3NlVHJpZ2dlcjtcbiAgfVxuICBpZiAocmVzdWx0LmtpbmQgPT09IFwic3ltYm9sXCIgJiYgaXNTeW1ib2xFbnRyeShlbnRyeSkpIHtcbiAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGlmICgocmVzdWx0LmtpbmQgPT09IFwicHJlZml4XCIgfHwgcmVzdWx0LmtpbmQgPT09IFwicG9zdGZpeFwiKSAmJiAoaXNQcmVmaXhFbnRyeShlbnRyeSkgfHwgaXNQb3N0Zml4RW50cnkoZW50cnkpKSkge1xuICAgIGlmICh0b2tlbnNUcmlnZ2VyICYmICh0b2tlbnNUcmlnZ2VyWzBdID09PSBcIl5cIiB8fCB0b2tlbnNUcmlnZ2VyWzBdID09PSBcIl9cIikpIHtcbiAgICAgIHJlc3VsdC5wcmVjZWRlbmNlID0gNzIwO1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICBlbnRyeS5wcmVjZWRlbmNlID09PSB2b2lkIDAsXG4gICAgICAgIFwiJ3ByZWNlZGVuY2UnIGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQgd2l0aCBeIGFuZCBfIHRyaWdnZXJzXCJcbiAgICAgICk7XG4gICAgfSBlbHNlXG4gICAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGlmIChyZXN1bHQua2luZCA9PT0gXCJpbmZpeFwiICYmIGlzSW5maXhFbnRyeShlbnRyeSkpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAhdG9rZW5zVHJpZ2dlciB8fCB0b2tlbnNUcmlnZ2VyWzBdICE9PSBcIl5cIiAmJiB0b2tlbnNUcmlnZ2VyWzBdICE9PSBcIl9cIiB8fCAhZW50cnkuYXNzb2NpYXRpdml0eSB8fCBlbnRyeS5hc3NvY2lhdGl2aXR5ID09PSBcIm5vblwiXG4gICAgKTtcbiAgICByZXN1bHQuYXNzb2NpYXRpdml0eSA9IGVudHJ5LmFzc29jaWF0aXZpdHkgPz8gXCJub25cIjtcbiAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGNvbnN0IHBhcnNlID0gbWFrZVBhcnNlSGFuZGxlcihlbnRyeSwgdG9rZW5zVHJpZ2dlciwgaWRUcmlnZ2VyKTtcbiAgaWYgKHBhcnNlKVxuICAgIHJlc3VsdC5wYXJzZSA9IHBhcnNlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFrZVNlcmlhbGl6ZUhhbmRsZXIoZW50cnksIGxhdGV4VHJpZ2dlciwgaWRUcmlnZ2VyKSB7XG4gIGlmICh0eXBlb2YgZW50cnkuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIGVudHJ5LnNlcmlhbGl6ZTtcbiAgY29uc3Qga2luZCA9IGVudHJ5W1wia2luZFwiXSA/PyBcImV4cHJlc3Npb25cIjtcbiAgaWYgKGtpbmQgPT09IFwiZW52aXJvbm1lbnRcIikge1xuICAgIGNvbnN0IGVudk5hbWUgPSBlbnRyeVtcImlkZW50aWZpZXJUcmlnZ2VyXCJdID8/IGVudHJ5Lm5hbWUgPz8gXCJ1bmtub3duXCI7XG4gICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW1xuICAgICAgYFxcXFxiZWdpbnske2Vudk5hbWV9fWAsXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSksXG4gICAgICBgXFxcXGVuZHske2Vudk5hbWV9fWBcbiAgICBdKTtcbiAgfVxuICBpZiAoaXNNYXRjaGZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGNvbnN0IG9wZW5EZWxpbSA9IHR5cGVvZiBlbnRyeS5vcGVuVHJpZ2dlciA9PT0gXCJzdHJpbmdcIiA/IERFRkFVTFRfREVMSU1JVEVSW2VudHJ5Lm9wZW5UcmlnZ2VyXSA6IHRva2Vuc1RvU3RyaW5nKGVudHJ5W1wib3BlbkRlbGltaXRlclwiXSk7XG4gICAgY29uc3QgY2xvc2VEZWxpbSA9IHR5cGVvZiBlbnRyeS5jbG9zZVRyaWdnZXIgPT09IFwic3RyaW5nXCIgPyBERUZBVUxUX0RFTElNSVRFUltlbnRyeS5jbG9zZVRyaWdnZXJdIDogdG9rZW5zVG9TdHJpbmcoZW50cnlbXCJjbG9zZURlbGltaXRlclwiXSk7XG4gICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW29wZW5EZWxpbSwgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBjbG9zZURlbGltXSk7XG4gIH1cbiAgbGV0IGxhdGV4ID0gZW50cnkuc2VyaWFsaXplO1xuICBpZiAobGF0ZXggPT09IHZvaWQgMCAmJiBsYXRleFRyaWdnZXIpXG4gICAgbGF0ZXggPSB0b2tlbnNUb1N0cmluZyhsYXRleFRyaWdnZXIpO1xuICBpZiAobGF0ZXgpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIpXG4gICAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBsYXRleF0pO1xuICAgIGlmIChraW5kID09PSBcInByZWZpeFwiKVxuICAgICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW2xhdGV4LCBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSldKTtcbiAgICBpZiAoa2luZCA9PT0gXCJpbmZpeFwiKSB7XG4gICAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChcbiAgICAgICAgKG9wcyhleHByKSA/PyBbXSkuZmxhdE1hcChcbiAgICAgICAgICAodmFsLCBpKSA9PiBpIDwgbm9wcyhleHByKSAtIDEgPyBbc2VyaWFsaXplci5zZXJpYWxpemUodmFsKSwgbGF0ZXhdIDogW3NlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbCldXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4gaGVhZChleHByKSA/IGpvaW5MYXRleChbbGF0ZXgsIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKV0pIDogbGF0ZXg7XG4gIH1cbiAgY29uc3QgaWQgPSBpZFRyaWdnZXIgPz8gZW50cnkubmFtZSA/PyBcInVua25vd25cIjtcbiAgaWYgKGtpbmQgPT09IFwicG9zdGZpeFwiKVxuICAgIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4gam9pbkxhdGV4KFtcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSxcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplU3ltYm9sKGlkKVxuICAgIF0pO1xuICBpZiAoa2luZCA9PT0gXCJwcmVmaXhcIilcbiAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSlcbiAgICBdKTtcbiAgaWYgKGtpbmQgPT09IFwiaW5maXhcIilcbiAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSlcbiAgICBdKTtcbiAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBoZWFkKGV4cHIpID8gam9pbkxhdGV4KFtcbiAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgc2VyaWFsaXplci53cmFwQXJndW1lbnRzKGV4cHIpXG4gIF0pIDogc2VyaWFsaXplci5zZXJpYWxpemVTeW1ib2woaWQpO1xufVxuZnVuY3Rpb24gbWFrZVBhcnNlSGFuZGxlcihlbnRyeSwgbGF0ZXhUcmlnZ2VyLCBpZFRyaWdnZXIpIHtcbiAgaWYgKFwicGFyc2VcIiBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gZW50cnkucGFyc2U7XG4gIGNvbnN0IGtpbmQgPSBcImtpbmRcIiBpbiBlbnRyeSA/IGVudHJ5LmtpbmQgOiBcImV4cHJlc3Npb25cIjtcbiAgaWYgKGtpbmQgPT09IFwiZW52aXJvbm1lbnRcIikge1xuICAgIGNvbnN0IGVudk5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoZW52TmFtZSlcbiAgICAgIHJldHVybiAocGFyc2VyLCBfdW50aWwpID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBwYXJzZXIucGFyc2VUYWJ1bGFyKCk7XG4gICAgICAgIGlmIChhcnJheSA9PT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtlbnZOYW1lLCBbXCJMaXN0XCIsIGFycmF5Lm1hcCgocm93KSA9PiBbXCJMaXN0XCIsIC4uLnJvd10pXV07XG4gICAgICB9O1xuICB9XG4gIGlmIChraW5kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBmbk5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoZm5OYW1lKVxuICAgICAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZXIucGFyc2VBcmd1bWVudHMoXCJlbmNsb3N1cmVcIiwgdW50aWwpO1xuICAgICAgICByZXR1cm4gYXJncyA9PT0gbnVsbCA/IGZuTmFtZSA6IFtmbk5hbWUsIC4uLmFyZ3NdO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJzeW1ib2xcIikge1xuICAgIGNvbnN0IHN5bU5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoc3ltTmFtZSlcbiAgICAgIHJldHVybiAoX3BhcnNlciwgX3Rlcm1pbmF0b3IpID0+IHN5bU5hbWU7XG4gIH1cbiAgaWYgKGtpbmQgPT09IFwicHJlZml4XCIpIHtcbiAgICBjb25zdCBoID0gZW50cnkucGFyc2UgPz8gZW50cnkubmFtZSA/PyBpZFRyaWdnZXI7XG4gICAgaWYgKGgpIHtcbiAgICAgIGNvbnN0IHByZWMgPSBlbnRyeVtcInByZWNlZGVuY2VcIl0gPz8gMWU0O1xuICAgICAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oe1xuICAgICAgICAgIC4uLnVudGlsID8/IFtdLFxuICAgICAgICAgIG1pblByZWM6IHByZWNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByaHMgPT09IG51bGwgPyBudWxsIDogW2gsIHJoc107XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIpIHtcbiAgICBjb25zdCBoID0gZW50cnkucGFyc2UgPz8gZW50cnkubmFtZTtcbiAgICBpZiAoaClcbiAgICAgIHJldHVybiAoX3BhcnNlciwgbGhzKSA9PiBsaHMgPT09IG51bGwgPyBudWxsIDogW2gsIGxoc107XG4gIH1cbiAgaWYgKGtpbmQgPT09IFwiaW5maXhcIikge1xuICAgIGlmICgvW19eXS8udGVzdChsYXRleFRyaWdnZXI/LlswXSA/PyBcIlwiKSkge1xuICAgICAgY29uc3QgaDIgPSBlbnRyeS5uYW1lID8/IGVudHJ5LnBhcnNlO1xuICAgICAgcmV0dXJuIChfcGFyc2VyLCBhcmcpID0+IFtcbiAgICAgICAgaDIsXG4gICAgICAgIG1pc3NpbmdJZkVtcHR5KG9wKGFyZywgMSkpLFxuICAgICAgICBtaXNzaW5nSWZFbXB0eShvcChhcmcsIDIpKVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgaCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWUgPz8gaWRUcmlnZ2VyO1xuICAgIGNvbnN0IHByZWMgPSBlbnRyeVtcInByZWNlZGVuY2VcIl0gPz8gMWU0O1xuICAgIGNvbnN0IGFzc29jaWF0aXZpdHkgPSBlbnRyeVtcImFzc29jaWF0aXZpdHlcIl0gPz8gXCJub25cIjtcbiAgICBpZiAoaClcbiAgICAgIHJldHVybiAocGFyc2VyLCBsaHMsIHVudGlsKSA9PiB7XG4gICAgICAgIGlmIChsaHMgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChwcmVjIDwgdW50aWwubWluUHJlYylcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmhzID0gbWlzc2luZ0lmRW1wdHkoXG4gICAgICAgICAgcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiBwcmVjIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiA/IGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihoLCBsaHMsIHJocywgYXNzb2NpYXRpdml0eSkgOiBbaCwgbGhzLCByaHNdO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJtYXRjaGZpeFwiKSB7XG4gICAgY29uc3QgaCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWU7XG4gICAgaWYgKGgpXG4gICAgICByZXR1cm4gKF9wYXJzZXIsIGJvZHkpID0+IHtcbiAgICAgICAgaWYgKGJvZHkgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGJvZHkpKVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW2gsIGJvZHldO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWUgPz8gaWRUcmlnZ2VyO1xuICAgIGlmIChwYXJzZVJlc3VsdClcbiAgICAgIHJldHVybiAoKSA9PiBwYXJzZVJlc3VsdDtcbiAgfVxuICBpZiAoXCJwYXJzZVwiIGluIGVudHJ5KSB7XG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBlbnRyeS5wYXJzZTtcbiAgICByZXR1cm4gKCkgPT4gcGFyc2VSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRFbnRyeShlbnRyeSwgb25FcnJvcikge1xuICBsZXQgc3ViamVjdCA9IGVudHJ5Lm5hbWUgPz8gZW50cnlbXCJsYXRleFRyaWdnZXJcIl0gPz8gZW50cnlbXCJpZGVudGlmaWVyVHJpZ2dlclwiXSA/PyBlbnRyeVtcIm9wZW5EZWxpbWl0ZXJcIl07XG4gIGlmICghc3ViamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBzdWJqZWN0ID0gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN1YmplY3QgPSBcIj8/P1wiO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShzdWJqZWN0KSlcbiAgICBzdWJqZWN0ID0gdG9rZW5zVG9TdHJpbmcoc3ViamVjdCk7XG4gIGlmIChcInRyaWdnZXJcIiBpbiBlbnRyeSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgVGhlICd0cmlnZ2VyJyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiBVc2UgJ2xhdGV4VHJpZ2dlcicgb3IgJ2lkZW50aWZpZXJUcmlnZ2VyJyBpbnN0ZWFkYFxuICAgICAgXVxuICAgIH0pO1xuICB9XG4gIGlmIChcImtpbmRcIiBpbiBlbnRyeSAmJiAhW1xuICAgIFwiZXhwcmVzc2lvblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwiaW5maXhcIixcbiAgICBcInBvc3RmaXhcIixcbiAgICBcInByZWZpeFwiLFxuICAgIFwibWF0Y2hmaXhcIixcbiAgICBcImVudmlyb25tZW50XCJcbiAgXS5pbmNsdWRlcyhlbnRyeS5raW5kKSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgVGhlICdraW5kJyBwcm9wZXJ0eSBtdXN0IGJlIG9uZSBvZiAnZXhwcmVzc2lvbicsICdzeW1ib2wnLCAnZnVuY3Rpb24nLCAnaW5maXgnLCAncG9zdGZpeCcsICdwcmVmaXgnLCAnbWF0Y2hmaXgnLCAnZW52aXJvbm1lbnQnYFxuICAgICAgXVxuICAgIH0pO1xuICB9XG4gIGlmIChlbnRyeS5zZXJpYWxpemUgIT09IHZvaWQgMCAmJiAhZW50cnkubmFtZSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgQSAnbmFtZScgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBpZiBhICdzZXJpYWxpemUnIGhhbmRsZXIgaXMgcHJvdmlkZWRgXG4gICAgICBdXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChcImlkZW50aWZpZXJUcmlnZ2VyXCIgaW4gZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5LmlkZW50aWZpZXJUcmlnZ2VyICE9PSBcInN0cmluZ1wiIHx8ICFpc1ZhbGlkSWRlbnRpZmllcihlbnRyeS5pZGVudGlmaWVyVHJpZ2dlcikpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYFRoZSAnaWRlbnRpZmllclRyaWdnZXInIHByb3BlcnR5IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyYFxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKFwibmFtZVwiIGluIGVudHJ5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeS5uYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoZW50cnkubmFtZSAhPT0gdm9pZCAwKVxuICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICBgVGhlICduYW1lJyBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nYFxuICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNWYWxpZElkZW50aWZpZXIoZW50cnkubmFtZSkpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIGVudHJ5Lm5hbWUsXG4gICAgICAgICAgYFRoZSAnbmFtZScgcHJvcGVydHkgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJgXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNNYXRjaGZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGlmIChcImxhdGV4VHJpZ2dlclwiIGluIGVudHJ5IHx8IFwiaWRlbnRpZmllclRyaWdnZXJcIiBpbiBpc1ByZWZpeEVudHJ5KSB7XG4gICAgICBvbkVycm9yKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICBtZXNzYWdlOiBbXG4gICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgIGAnbWF0Y2hmaXgnIG9wZXJhdG9ycyB1c2UgYSAnb3BlbkRlbGltaXRlcicgYW5kICdjbG9zZURlbGltaXRlcicgaW5zdGVhZCBvZiBhICdsYXRleFRyaWdnZXInIG9yICdpZGVudGlmaWVyVHJpZ2dlcicuIGBcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZW50cnkub3BlblRyaWdnZXIgfHwgIWVudHJ5LmNsb3NlVHJpZ2dlcikge1xuICAgICAgb25FcnJvcih7XG4gICAgICAgIHNldmVyaXR5OiBcIndhcm5pbmdcIixcbiAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICBcIkV4cGVjdGVkIGBvcGVuRGVsaW1pdGVyYCBhbmQgYSBgY2xvc2VEZWxpbWl0ZXJgIGZvciBtYXRjaGZpeCBvcGVyYXRvclwiXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVudHJ5Lm9wZW5UcmlnZ2VyICE9PSB0eXBlb2YgZW50cnkuY2xvc2VUcmlnZ2VyKSB7XG4gICAgICBvbkVycm9yKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICBtZXNzYWdlOiBbXG4gICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgIFwiRXhwZWN0ZWQgYG9wZW5EZWxpbWl0ZXJgIGFuZCBgY2xvc2VEZWxpbWl0ZXJgIHRvIGJvdGggYmUgc3RyaW5ncyBvciBhcnJheSBvZiBMYXRleFRva2VuXCJcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0luZml4RW50cnkoZW50cnkpIHx8IGlzUG9zdGZpeEVudHJ5KGVudHJ5KSB8fCBpc1ByZWZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5LmxhdGV4VHJpZ2dlcikgJiYgKGVudHJ5LmxhdGV4VHJpZ2dlclswXSA9PT0gXCJfXCIgfHwgZW50cnkubGF0ZXhUcmlnZ2VyWzBdID09PSBcIl5cIikgfHwgdHlwZW9mIGVudHJ5LmxhdGV4VHJpZ2dlciA9PT0gXCJzdHJpbmdcIiAmJiAoZW50cnkubGF0ZXhUcmlnZ2VyLnN0YXJ0c1dpdGgoXCJeXCIpIHx8IGVudHJ5LmxhdGV4VHJpZ2dlci5zdGFydHNXaXRoKFwiX1wiKSkpIHtcbiAgICAgIGlmIChlbnRyeS5wcmVjZWRlbmNlICE9PSB2b2lkIDAgfHwgZW50cnlbXCJhc3NvY2lhdGl2aXR5XCJdICE9PSB2b2lkIDApIHtcbiAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgXCJwcmVjZWRlbmNlXCIgb3IgXCJhc3NvY2lhdGl2aXR5XCIgZm9yIHN1cGVyc2NyaXB0L3N1YnNjcmlwdCBvcGVyYXRvcmBcbiAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5wcmVjZWRlbmNlID09PSB2b2lkIDApIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYEV4cGVjdGVkIGEgXCJwcmVjZWRlbmNlXCIgZm9yICR7ZW50cnkua2luZH0gb3BlcmF0b3JgXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZW50cnlbXCJhc3NvY2lhdGl2aXR5XCJdICE9PSB2b2lkIDApIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgJ1VuZXhwZWN0ZWQgXCJhc3NvY2lhdGl2aXR5XCIgb3BlcmF0b3InXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzTWF0Y2hmaXhFbnRyeShlbnRyeSkgJiYgIWlzRW52aXJvbm1lbnRFbnRyeShlbnRyeSkpIHtcbiAgICBpZiAoIWVudHJ5LmxhdGV4VHJpZ2dlciAmJiAhZW50cnkuaWRlbnRpZmllclRyaWdnZXIgJiYgIWVudHJ5Lm5hbWUpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJ25hbWUnLCBhICdsYXRleFRyaWdnZXInIG9yIGEgJ2lkZW50aWZpZXJUcmlnZ2VyJ2BcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChlbnRyeVtcInBhcnNlXCJdID09PSB2b2lkIDAgJiYgZW50cnkubmFtZSA9PT0gdm9pZCAwKSB7XG4gICAgb25FcnJvcih7XG4gICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICBtZXNzYWdlOiBbXG4gICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGBFeHBlY3RlZCBhICdwYXJzZScgb3IgJ25hbWUnYFxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbnZhciBERUZBVUxUX0xBVEVYX0RJQ1RJT05BUlkgPSB7XG4gIGFsZ2VicmE6IERFRklOSVRJT05TX0FMR0VCUkEsXG4gIGFyaXRobWV0aWM6IERFRklOSVRJT05TX0FSSVRITUVUSUMsXG4gIGNhbGN1bHVzOiBERUZJTklUSU9OU19DQUxDVUxVUyxcbiAgY29tcGxleDogREVGSU5JVElPTlNfQ09NUExFWCxcbiAgY29yZTogREVGSU5JVElPTlNfQ09SRSxcbiAgbG9naWM6IERFRklOSVRJT05TX0xPR0lDLFxuICByZWxvcDogREVGSU5JVElPTlNfSU5FUVVBTElUSUVTLFxuICBvdGhlcjogREVGSU5JVElPTlNfT1RIRVJTLFxuICBwaHlzaWNzOiBbXG4gICAge1xuICAgICAgbmFtZTogXCJtdTBcIixcbiAgICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG11XzBcIlxuICAgIH1cbiAgXSxcbiAgc2V0czogREVGSU5JVElPTlNfU0VUUyxcbiAgc3RhdGlzdGljczogREVGSU5JVElPTlNfU1RBVElTVElDUyxcbiAgc3ltYm9sczogREVGSU5JVElPTlNfU1lNQk9MUyxcbiAgdHJpZ29ub21ldHJ5OiBERUZJTklUSU9OU19UUklHT05PTUVUUllcbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvcGFyc2UtaWRlbnRpZmllci50c1xudmFyIElERU5USUZJRVJfUFJFRklYID0ge1xuICAvLyBUaG9zZSBhcmUgXCJncm91cGluZ1wiIHByZWZpeCB0aGF0IGFsc28gc3BlY2lmeSBzcGFjaW5nXG4gIC8vIGFyb3VuZCB0aGUgc3ltYm9sLiBXZSBpZ25vcmUgdGhlIHNwYWNpbmcsIHRob3VnaC5cbiAgXCJcXFxcbWF0aG9yZFwiOiBcIlwiLFxuICBcIlxcXFxtYXRob3BcIjogXCJcIixcbiAgXCJcXFxcbWF0aGJpblwiOiBcIlwiLFxuICBcIlxcXFxtYXRocmVsXCI6IFwiXCIsXG4gIFwiXFxcXG1hdGhvcGVuXCI6IFwiXCIsXG4gIFwiXFxcXG1hdGhjbG9zZVwiOiBcIlwiLFxuICBcIlxcXFxtYXRocHVuY3RcIjogXCJcIixcbiAgXCJcXFxcbWF0aGlubmVyXCI6IFwiXCIsXG4gIC8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gc3BlY2lmeSBhbiBpZGVudGlmaWVyXG4gIC8vIGl0IGRlZmluZXMgYm90aCBzcGFjaW5nIGFuZCBmb250LiBCeSBkZWZhdWx0LCBpZGVudGlmaWVyc1xuICAvLyBhcmUgd3JhcHBlciB3aXRoIGBcXFxcb3BlcmF0b3JuYW1le31gLlxuICBcIlxcXFxvcGVyYXRvcm5hbWVcIjogXCJcIixcbiAgLy8gVGhlc2Ugc3R5bGluZyBjb21tYW5kcyBhcmUgdXNlZCB0byBjaGFuZ2UgdGhlIGZvbnQgb2YgYW4gaWRlbnRpZmllclxuICAvLyBUaGV5IG1heSBiZSBwcm9ibGVtYXRpYywgYXMgYWRqYWNlbnQgaWRlbnRpZmllcnMgbWF5IGJlIG1lcmdlZFxuICAvLyBpbnRvIGEgc2luZ2xlIGlkZW50aWZpZXIgd2hlbiB1c2VkIGluIGVkaXRvcnMsIHN1Y2ggYSBNYXRoTGl2ZS5cbiAgLy8gRm9yIGV4YW1wbGUgYFxcbWF0aHJte3NwZWVkfVxcbWF0aHJte3NvdW5kfWAgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYFxcbWF0aHJte3NwZWVkc291bmR9YFxuICBcIlxcXFxtYXRocm1cIjogXCJfdXByaWdodFwiLFxuICBcIlxcXFxtYXRoaXRcIjogXCJfaXRhbGljXCIsXG4gIFwiXFxcXG1hdGhiZlwiOiBcIl9ib2xkXCIsXG4gIFwiXFxcXG1hdGhzY3JcIjogXCJfc2NyaXB0XCIsXG4gIFwiXFxcXG1hdGhjYWxcIjogXCJfY2FsbGlncmFwaGljXCIsXG4gIFwiXFxcXG1hdGhmcmFrXCI6IFwiX2ZyYWt0dXJcIixcbiAgXCJcXFxcbWF0aHNmXCI6IFwiX3NhbnNzZXJpZlwiLFxuICBcIlxcXFxtYXRodHRcIjogXCJfbW9ub3NwYWNlXCIsXG4gIFwiXFxcXG1hdGhiYlwiOiBcIl9kb3VibGVzdHJ1Y2tcIlxufTtcbnZhciBJREVOVElGSUVSX01PRElGSUVSID0ge1xuICBcIlxcXFxtYXRocmluZ1wiOiBcIl9yaW5nXCIsXG4gIFwiXFxcXGhhdFwiOiBcIl9oYXRcIixcbiAgXCJcXFxcdGlsZGVcIjogXCJfdGlsZGVcIixcbiAgXCJcXFxcdmVjXCI6IFwiX3ZlY1wiLFxuICBcIlxcXFxvdmVybGluZVwiOiBcIl9iYXJcIixcbiAgXCJcXFxcdW5kZXJsaW5lXCI6IFwiX3VuZGVyYmFyXCIsXG4gIFwiXFxcXGRvdFwiOiBcIl9kb3RcIixcbiAgXCJcXFxcZGRvdFwiOiBcIl9kZG90XCIsXG4gIFwiXFxcXGRkZG90XCI6IFwiX2RkZG90XCIsXG4gIFwiXFxcXGRkZGRvdFwiOiBcIl9kZGRkb3RcIixcbiAgXCJcXFxcYWN1dGVcIjogXCJfYWN1dGVcIixcbiAgXCJcXFxcZ3JhdmVcIjogXCJfZ3JhdmVcIixcbiAgXCJcXFxcYnJldmVcIjogXCJfYnJldmVcIixcbiAgXCJcXFxcY2hlY2tcIjogXCJfY2hlY2tcIlxufTtcbmZ1bmN0aW9uIHBhcnNlSWRlbnRpZmllclRva2VuKHBhcnNlciwgb3B0aW9ucykge1xuICBpZiAocGFyc2VyLmF0RW5kKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCB0b2tlbiA9IHBhcnNlci5wZWVrO1xuICBsZXQgc3BlY2lhbCA9IHtcbiAgICBcIlxcXFxfXCI6IFwiX1wiLFxuICAgIFwiXFxcXCNcIjogXCJoYXNoXCJcbiAgfVt0b2tlbl07XG4gIGlmICghc3BlY2lhbCAmJiAhb3B0aW9ucy50b3BsZXZlbCkge1xuICAgIHNwZWNpYWwgPSB7XG4gICAgICBcIitcIjogXCJwbHVzXCIsXG4gICAgICBcIi1cIjogXCJtaW51c1wiLFxuICAgICAgXCJcXFxccGx1c21uXCI6IFwicG1cIixcbiAgICAgIFwiXFxcXHBtXCI6IFwicG1cIixcbiAgICAgIFwiXFxcXGFzdFwiOiBcImFzdFwiLFxuICAgICAgXCJcXFxcZGFnXCI6IFwiZGFnXCIsXG4gICAgICBcIlxcXFxkZGFnXCI6IFwiZGRhZ1wiLFxuICAgICAgXCJcXFxcYm90XCI6IFwiYm90dG9tXCIsXG4gICAgICBcIlxcXFx0b3BcIjogXCJ0b3BcIixcbiAgICAgIFwiXFxcXGJ1bGxldFwiOiBcImJ1bGxldFwiLFxuICAgICAgXCJcXFxcY2lyXCI6IFwiY2lyY2xlXCIsXG4gICAgICBcIlxcXFxkaWFtb25kXCI6IFwiZGlhbW9uZFwiLFxuICAgICAgXCJcXFxcdGltZXNcIjogXCJ0aW1lc1wiLFxuICAgICAgXCJcXFxcc3F1YXJlXCI6IFwic3F1YXJlXCIsXG4gICAgICBcIlxcXFxzdGFyXCI6IFwic3RhclwiXG4gICAgfVt0b2tlbl07XG4gIH1cbiAgaWYgKHNwZWNpYWwpIHtcbiAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgcmV0dXJuIHNwZWNpYWw7XG4gIH1cbiAgY29uc3QgaSA9IFNZTUJPTFMuZmluZEluZGV4KCh4KSA9PiB4WzFdID09PSB0b2tlbik7XG4gIGlmIChpID49IDApIHtcbiAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgcmV0dXJuIFNZTUJPTFNbaV1bMF07XG4gIH1cbiAgcmV0dXJuIHBhcnNlci5tYXRjaENoYXIoKSA/PyBwYXJzZXIubmV4dFRva2VuKCk7XG59XG5mdW5jdGlvbiBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcikge1xuICBsZXQgaWQgPSBtYXRjaFByZWZpeGVkSWRlbnRpZmllcihwYXJzZXIpO1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgcHJlZml4ID0gSURFTlRJRklFUl9NT0RJRklFUltwYXJzZXIucGVla10gPz8gbnVsbDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICBpZiAoIXBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IHBhcnNlSWRlbnRpZmllckJvZHkocGFyc2VyKTtcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCAhcGFyc2VyLm1hdGNoKFwiPH0+XCIpKSB7XG4gICAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZCA9IGAke2JvZHl9JHtwcmVmaXh9YDtcbiAgfVxuICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICBpZCA9IFwiXCI7XG4gICAgd2hpbGUgKCFwYXJzZXIuYXRFbmQpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gcGFyc2VyLnBlZWs7XG4gICAgICBpZiAodG9rZW4gPT09IFwiPH0+XCIgfHwgdG9rZW4gPT09IFwiX1wiIHx8IHRva2VuID09PSBcIl5cIilcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCBuZXh0ID0gcGFyc2VJZGVudGlmaWVyVG9rZW4ocGFyc2VyLCB7IHRvcGxldmVsOiBmYWxzZSB9KTtcbiAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlkICs9IG5leHQ7XG4gICAgfVxuICAgIHdoaWxlICghcGFyc2VyLmF0RW5kICYmIC9cXGQvLnRlc3QocGFyc2VyLnBlZWspKVxuICAgICAgaWQgKz0gcGFyc2VyLm5leHRUb2tlbigpO1xuICB9XG4gIHdoaWxlICghcGFyc2VyLmF0RW5kKSB7XG4gICAgaWYgKHBhcnNlci5tYXRjaChcIlxcXFxkZWdyZWVcIikpXG4gICAgICBpZCArPSBcIl9kZWdcIjtcbiAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXlwiLCBcIlxcXFxwcmltZVwiXSkpXG4gICAgICBpZCArPSBcIl9wcmltZVwiO1xuICAgIGVsc2UgaWYgKHBhcnNlci5tYXRjaEFsbChbXCJeXCIsIFwiPHs+XCIsIFwiXFxcXHByaW1lXCIsIFwiPH0+XCJdKSlcbiAgICAgIGlkICs9IFwiX3ByaW1lXCI7XG4gICAgZWxzZSBpZiAocGFyc2VyLm1hdGNoQWxsKFtcIl5cIiwgXCI8ez5cIiwgXCJcXFxcZG91YmxlcHJpbWVcIiwgXCI8fT5cIl0pKVxuICAgICAgaWQgKz0gXCJfZHByaW1lXCI7XG4gICAgZWxzZSBpZiAocGFyc2VyLm1hdGNoQWxsKFtcIl5cIiwgXCI8ez5cIiwgXCJcXFxccHJpbWVcIiwgXCJcXFxccHJpbWVcIiwgXCI8fT5cIl0pKVxuICAgICAgaWQgKz0gXCJfZHByaW1lXCI7XG4gICAgZWxzZVxuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3Qgc3VwcyA9IFtdO1xuICBjb25zdCBzdWJzMiA9IFtdO1xuICB3aGlsZSAoIXBhcnNlci5hdEVuZCkge1xuICAgIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgICBjb25zdCBoYXNCcmFjZSA9IHBhcnNlci5tYXRjaChcIjx7PlwiKTtcbiAgICAgIGNvbnN0IHN1YjIgPSBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcik7XG4gICAgICBpZiAoaGFzQnJhY2UgJiYgIXBhcnNlci5tYXRjaChcIjx9PlwiKSB8fCBzdWIyID09PSBudWxsKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN1YnMyLnB1c2goc3ViMik7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICBjb25zdCBoYXNCcmFjZSA9IHBhcnNlci5tYXRjaChcIjx7PlwiKTtcbiAgICAgIGNvbnN0IHN1cCA9IHBhcnNlSWRlbnRpZmllckJvZHkocGFyc2VyKTtcbiAgICAgIGlmIChoYXNCcmFjZSAmJiAhcGFyc2VyLm1hdGNoKFwiPH0+XCIpIHx8IHN1cCA9PT0gbnVsbCkge1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBzdXBzLnB1c2goc3VwKTtcbiAgICB9IGVsc2VcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChzdXBzLmxlbmd0aCA+IDApXG4gICAgaWQgKz0gXCJfX1wiICsgc3Vwcy5qb2luKFwiXCIpO1xuICBpZiAoc3ViczIubGVuZ3RoID4gMClcbiAgICBpZCArPSBcIl9cIiArIHN1YnMyLmpvaW4oXCJcIik7XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIG1hdGNoUHJlZml4ZWRJZGVudGlmaWVyKHBhcnNlcikge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgcHJlZml4ID0gSURFTlRJRklFUl9QUkVGSVhbcGFyc2VyLnBlZWtdID8/IG51bGw7XG4gIGlmIChwcmVmaXggPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgaWYgKHBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgIGxldCBib2R5ID0gXCJcIjtcbiAgICBjb25zdCBkaWdpdCA9IHtcbiAgICAgIDA6IFwiemVyb1wiLFxuICAgICAgMTogXCJvbmVcIixcbiAgICAgIDI6IFwidHdvXCIsXG4gICAgICAzOiBcInRocmVlXCIsXG4gICAgICA0OiBcImZvdXJcIixcbiAgICAgIDU6IFwiZml2ZVwiLFxuICAgICAgNjogXCJzaXhcIixcbiAgICAgIDc6IFwic2V2ZW5cIixcbiAgICAgIDg6IFwiZWlnaHRcIixcbiAgICAgIDk6IFwibmluZVwiXG4gICAgfVtwYXJzZXIucGVla10gPz8gXCJcIjtcbiAgICBpZiAoZGlnaXQpIHtcbiAgICAgIGJvZHkgPSBkaWdpdDtcbiAgICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICB9XG4gICAgYm9keSArPSBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcik7XG4gICAgaWYgKGJvZHkgPT09IG51bGwgfHwgIXBhcnNlci5tYXRjaChcIjx9PlwiKSkge1xuICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHByZWZpeCA9PT0gXCJfdXByaWdodFwiICYmIGJvZHkubGVuZ3RoID4gMSlcbiAgICAgIHJldHVybiBib2R5O1xuICAgIHJldHVybiBib2R5ICsgcHJlZml4O1xuICB9XG4gIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlSW52YWxpZElkZW50aWZpZXIocGFyc2VyKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICBjb25zdCBpZCA9IG1hdGNoUHJlZml4ZWRJZGVudGlmaWVyKHBhcnNlcik7XG4gIGlmIChpZCA9PT0gbnVsbCB8fCBpc1ZhbGlkSWRlbnRpZmllcihpZCkpIHtcbiAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcGFyc2VyLmVycm9yKFxuICAgIFtcImludmFsaWQtaWRlbnRpZmllclwiLCB7IHN0cjogdmFsaWRhdGVJZGVudGlmaWVyKGlkKSB9XSxcbiAgICBzdGFydFxuICApO1xufVxuZnVuY3Rpb24gcGFyc2VJZGVudGlmaWVyKHBhcnNlcikge1xuICBpZiAoL15bYS16QS1aXSQvLnRlc3QocGFyc2VyLnBlZWspIHx8IC9eXFxwe1hJRFN9JC91LnRlc3QocGFyc2VyLnBlZWspKVxuICAgIHJldHVybiBwYXJzZXIubmV4dFRva2VuKCk7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICBsZXQgaWQgPSBtYXRjaFByZWZpeGVkSWRlbnRpZmllcihwYXJzZXIpO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBcIlwiO1xuICAgIHdoaWxlICghcGFyc2VyLmF0RW5kICYmIE9OTFlfRU1PSklTLnRlc3QoaWQgKyBwYXJzZXIucGVlaykpXG4gICAgICBpZCArPSBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgaWYgKCFpZClcbiAgICAgIGlkID0gbnVsbDtcbiAgfVxuICBpZCA/PyAoaWQgPSBwYXJzZUlkZW50aWZpZXJUb2tlbihwYXJzZXIsIHsgdG9wbGV2ZWw6IHRydWUgfSkpO1xuICBpZiAoaWQpIHtcbiAgICBpZCA9IGlkLm5vcm1hbGl6ZSgpO1xuICAgIGlmIChpc1ZhbGlkSWRlbnRpZmllcihpZCkpXG4gICAgICByZXR1cm4gaWQ7XG4gIH1cbiAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L3BhcnNlLnRzXG52YXIgREVMSU1JVEVSX1NIT1JUSEFORCA9IHtcbiAgXCIoXCI6IFtcIlxcXFxscGFyZW5cIiwgXCIoXCJdLFxuICBcIilcIjogW1wiXFxcXHJwYXJlblwiLCBcIilcIl0sXG4gIFwiW1wiOiBbXCJcXFxcbGJyYWNrXCJdLFxuICBcIl1cIjogW1wiXFxcXHJicmFja1wiXSxcbiAgXCI8XCI6IFtcIjxcIiwgXCJcXFxcbGFuZ2xlXCJdLFxuICBcIj5cIjogW1wiPlwiLCBcIlxcXFxyYW5nbGVcIl0sXG4gIFwie1wiOiBbXCJcXFxce1wiLCBcIlxcXFxsYnJhY2VcIl0sXG4gIFwifVwiOiBbXCJcXFxcfVwiLCBcIlxcXFxyYnJhY2VcIl0sXG4gIFwiOlwiOiBbXCI6XCIsIFwiXFxcXGNvbG9uXCJdLFxuICBcInxcIjogW1wifFwiLCBcIlxcXFx8XCIsIFwiXFxcXGx2ZXJ0XCIsIFwiXFxcXHJ2ZXJ0XCJdLFxuICAvL3NwZWNpYWw6ICdcXGx2ZXJ0YCB3aGVuIG9wZW4sIGBcXHJ2ZXJ0YCB3aGVuIGNsb3NlXG4gIFwifHxcIjogW1wifHxcIiwgXCJcXFxcVmVydFwiLCBcIlxcXFxsVmVydFwiLCBcIlxcXFxyVmVydFwiXSxcbiAgLy8gc3BlY2lhbDogYFxcbFZlcnRgIHdoZW4gb3BlbiwgYFxcclZlcnRgIHdoZW4gY2xvc2VcbiAgXCJcXFxcbGZsb29yXCI6IFtcIlxcXFxsZmxvb3JcIl0sXG4gIFwiXFxcXHJmbG9vclwiOiBbXCJcXFxccmZsb29yXCJdLFxuICBcIlxcXFxsY2VpbFwiOiBbXCJcXFxcbGNlaWxcIl0sXG4gIFwiXFxcXHJjZWlsXCI6IFtcIlxcXFxyY2VpbFwiXSxcbiAgXCJcXFxcdWxjb3JuZXJcIjogW1wiXFxcXHVsY29ybmVyXCJdLFxuICBcIlxcXFx1cmNvcm5lclwiOiBbXCJcXFxcdXJjb3JuZXJcIl0sXG4gIFwiXFxcXGxsY29ybmVyXCI6IFtcIlxcXFxsbGNvcm5lclwiXSxcbiAgXCJcXFxcbHJjb3JuZXJcIjogW1wiXFxcXGxyY29ybmVyXCJdLFxuICBcIlxcXFxsZ3JvdXBcIjogW1wiXFxcXGxncm91cFwiXSxcbiAgXCJcXFxccmdyb3VwXCI6IFtcIlxcXFxyZ3JvdXBcIl0sXG4gIFwiXFxcXGxtb3VzdGFjaGVcIjogW1wiXFxcXGxtb3VzdGFjaGVcIl0sXG4gIFwiXFxcXHJtb3VzdGFjaGVcIjogW1wiXFxcXHJtb3VzdGFjaGVcIl1cbn07XG52YXIgT1BFTl9ERUxJTUlURVJfUFJFRklYID0ge1xuICBcIlxcXFxsZWZ0XCI6IFwiXFxcXHJpZ2h0XCIsXG4gIFwiXFxcXGJpZ2xcIjogXCJcXFxcYmlnclwiLFxuICBcIlxcXFxCaWdsXCI6IFwiXFxcXEJpZ3JcIixcbiAgXCJcXFxcYmlnZ2xcIjogXCJcXFxcYmlnZ3JcIixcbiAgXCJcXFxcQmlnZ2xcIjogXCJcXFxcQmlnZ3JcIixcbiAgXCJcXFxcYmlnXCI6IFwiXFxcXGJpZ1wiLFxuICBcIlxcXFxCaWdcIjogXCJcXFxcQmlnXCIsXG4gIFwiXFxcXGJpZ2dcIjogXCJcXFxcYmlnZ1wiLFxuICBcIlxcXFxCaWdnXCI6IFwiXFxcXEJpZ2dcIlxufTtcbnZhciBDTE9TRV9ERUxJTUlURVIgPSB7XG4gIFwiKFwiOiBcIilcIixcbiAgXCJbXCI6IFwiXVwiLFxuICBcIlxcXFx7XCI6IFwiXFxcXH1cIixcbiAgXCJcXFxcbGJyYWNlXCI6IFwiXFxcXHJicmFjZVwiLFxuICBcIlxcXFxscGFyZW5cIjogXCJcXFxccnBhcmVuXCIsXG4gIFwiXFxcXGxhbmdsZVwiOiBcIlxcXFxyYW5nbGVcIixcbiAgXCJcXFxcbGZsb29yXCI6IFwiXFxcXHJmbG9vclwiLFxuICBcIlxcXFxsY2VpbFwiOiBcIlxcXFxyY2VpbFwiLFxuICBcIlxcXFx2ZXJ0XCI6IFwiXFxcXHZlcnRcIixcbiAgXCJcXFxcbHZlcnRcIjogXCJcXFxccnZlcnRcIixcbiAgXCJcXFxcVmVydFwiOiBcIlxcXFxWZXJ0XCIsXG4gIFwiXFxcXGxWZXJ0XCI6IFwiXFxcXHJWZXJ0XCIsXG4gIFwiXFxcXGxicmFja1wiOiBcIlxcXFxyYnJhY2tcIixcbiAgXCJcXFxcdWxjb3JuZXJcIjogXCJcXFxcdXJjb3JuZXJcIixcbiAgXCJcXFxcbGxjb3JuZXJcIjogXCJcXFxcbHJjb3JuZXJcIixcbiAgXCJcXFxcbGdyb3VwXCI6IFwiXFxcXHJncm91cFwiLFxuICBcIlxcXFxsbW91c3RhY2hlXCI6IFwiXFxcXHJtb3VzdGFjaGVcIlxufTtcbnZhciBERUZBVUxUX0xBVEVYX05VTUJFUl9PUFRJT05TID0ge1xuICBwcmVjaXNpb246IDYsXG4gIC8vIHdpdGggbWFjaGluZSBudW1iZXJzLCB1cCB0byAxNSBhc3N1bWluZyAyXjUzIGJpdHMgZmxvYXRpbmcgcG9pbnRzXG4gIHBvc2l0aXZlSW5maW5pdHk6IFwiXFxcXGluZnR5XCIsXG4gIG5lZ2F0aXZlSW5maW5pdHk6IFwiLVxcXFxpbmZ0eVwiLFxuICBub3RBTnVtYmVyOiBcIlxcXFxvcGVyYXRvcm5hbWV7TmFOfVwiLFxuICBkZWNpbWFsTWFya2VyOiBcIi5cIixcbiAgLy8gVXNlIGB7LH1gIGZvciBjb21tYSBhcyBhIGRlY2ltYWwgbWFya2VyXG4gIGdyb3VwU2VwYXJhdG9yOiBcIlxcXFwsXCIsXG4gIC8vIGZvciB0aG91c2FuZHMsIGV0Yy4uLlxuICBleHBvbmVudFByb2R1Y3Q6IFwiXFxcXGNkb3RcIixcbiAgYmVnaW5FeHBvbmVudE1hcmtlcjogXCIxMF57XCIsXG4gIC8vIGNvdWxkIGJlICdlJ1xuICBlbmRFeHBvbmVudE1hcmtlcjogXCJ9XCIsXG4gIG5vdGF0aW9uOiBcImF1dG9cIixcbiAgdHJ1bmNhdGlvbk1hcmtlcjogXCJcXFxcbGRvdHNcIixcbiAgYmVnaW5SZXBlYXRpbmdEaWdpdHM6IFwiXFxcXG92ZXJsaW5le1wiLFxuICBlbmRSZXBlYXRpbmdEaWdpdHM6IFwifVwiLFxuICBpbWFnaW5hcnlVbml0OiBcIlxcXFxpbWFnaW5hcnlJXCIsXG4gIGF2b2lkRXhwb25lbnRzSW5SYW5nZTogWy03LCAyMF1cbn07XG52YXIgREVGQVVMVF9QQVJTRV9MQVRFWF9PUFRJT05TID0ge1xuICBhcHBseUludmlzaWJsZU9wZXJhdG9yOiBcImF1dG9cIixcbiAgc2tpcFNwYWNlOiB0cnVlLFxuICBwYXJzZUFyZ3VtZW50c09mVW5rbm93bkxhdGV4Q29tbWFuZHM6IHRydWUsXG4gIHBhcnNlTnVtYmVyczogdHJ1ZSxcbiAgcGFyc2VVbmtub3duSWRlbnRpZmllcjogKGlkLCBwYXJzZXIpID0+IHBhcnNlci5jb21wdXRlRW5naW5lPy5sb29rdXBGdW5jdGlvbihpZCkgIT09IHZvaWQgMCA/IFwiZnVuY3Rpb25cIiA6IFwic3ltYm9sXCIsXG4gIHByZXNlcnZlTGF0ZXg6IGZhbHNlXG59O1xudmFyIF9QYXJzZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHRva2Vucywgb3B0aW9ucywgZGljdGlvbmFyeTIsIGNvbXB1dGVFbmdpbmUpIHtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAvLyBBIHBhcnNpbmcgYm91bmRhcnkgaXMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgdGhhdCBpbmRpY2F0ZSB0aGF0IGFcbiAgICAvLyByZWN1cnNpdmUgcGFyc2luZyBvcGVyYXRpb24gc2hvdWxkIHN0b3AuXG4gICAgLy8gSW4gYSB0cmFkaXRpb25hbCBwYXJzZXIsIGtlZXBpbmcgdHJhY2sgb2YgcGFyc2luZyBib3VuZGFyaWVzIHdvdWxkXG4gICAgLy8gbm90IGJlIG5lY2Vzc2FyeS4gSG93ZXZlciwgYmVjYXVzZSB3ZSBhdHRlbXB0IHRvIGRlbGl2ZXIgdGhlIGJlc3RcbiAgICAvLyBpbnRlcnByZXRhdGlvbiBvZiBhIHBhcnRpYWwgZXhwcmVzc2lvbiwgYm91bmRhcmllcyBhbGxvdyB1cyB0byBmYWlsXG4gICAgLy8gcGFyc2luZyBtb3JlIGxvY2FsbHkuXG4gICAgLy8gRm9yIGV4YW1wbGUsIGluIGBcXGJlZ2lue2Nhc2VzfSB8IFxcZW5ke2Nhc2VzfWAsIHdpdGhvdXQgYm91bmRhcnlcbiAgICAvLyBkZXRlY3Rpb24sIHRoZSBwYXJzaW5nIG9mIGB8YCB3b3VsZCBhdHRlbXB0IHRvIGdvYmxlIHVwIGBcXGVuZHtjYXNlc31gXG4gICAgLy8gd2hpY2ggd291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gdW5leHBlY3RlZCBjb21tYW5kLCBhbmQgdGhlIHdob2xlIGBcXGJlZ2luYFxuICAgIC8vIHdvdWxkIGJlIHJlamVjdGVkIGFzIGFuIHVuYmFsYW5jZWQgZW52aXJvbm1lbnQuIFdpdGggYFxcZW5ke2Nhc2VzfWAgYXMgYVxuICAgIC8vIGJvdW5kYXJ5LCB0aGUgcGFyc2luZyBvZiB0aGUgYHxgIGFyZ3VtZW50IHN0b3BzIGFzIHNvb24gYXMgaXQgZW5jb3VudGVyc1xuICAgIC8vIHRoZSBgXFxlbmR7Y2FzZXN9YCBhbmQgY2FuIHByb3Blcmx5IHJlcG9ydCBhbiB1bmV4cGVjdGVkIHRva2Ugb24gdGhlIGB8YFxuICAgIC8vIG9ubHkgd2hpbGUgY29ycmVjdGx5IGludGVycHJldGluZyB0aGUgYFxcYmVnaW57Y2FzZXN9Li4uXFxlbmR7Y2FzZXN9YFxuICAgIHRoaXMuX2JvdW5kYXJpZXMgPSBbXTtcbiAgICAvLyBUaG9zZSB0d28gcHJvcGVydGllcyBhcmUgdXNlZCB0byBkZXRlY3QgaW5maW5pdGUgbG9vcHMgd2hpbGUgcGFyc2luZ1xuICAgIHRoaXMuX2xhc3RQZWVrID0gXCJcIjtcbiAgICB0aGlzLl9wZWVrQ291bnRlciA9IDA7XG4gICAgdGhpcy5fdG9rZW5zID0gdG9rZW5zO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfTEFURVhfTlVNQkVSX09QVElPTlMsXG4gICAgICAuLi5ERUZBVUxUX1BBUlNFX0xBVEVYX09QVElPTlMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLl9kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTI7XG4gICAgdGhpcy5jb21wdXRlRW5naW5lID0gY29tcHV0ZUVuZ2luZTtcbiAgICB0aGlzLl9wb3NpdGl2ZUluZmluaXR5VG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLnBvc2l0aXZlSW5maW5pdHksIFtdKTtcbiAgICB0aGlzLl9uZWdhdGl2ZUluZmluaXR5VG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLm5lZ2F0aXZlSW5maW5pdHksIFtdKTtcbiAgICB0aGlzLl9ub3RBTnVtYmVyVG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLm5vdEFOdW1iZXIsIFtdKTtcbiAgICB0aGlzLl9kZWNpbWFsTWFya2VyVG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLmRlY2ltYWxNYXJrZXIsIFtdKTtcbiAgICB0aGlzLl9ncm91cFNlcGFyYXRvclRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5ncm91cFNlcGFyYXRvciwgW10pO1xuICAgIHRoaXMuX2V4cG9uZW50UHJvZHVjdFRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5leHBvbmVudFByb2R1Y3QsIFtdKTtcbiAgICB0aGlzLl9iZWdpbkV4cG9uZW50TWFya2VyVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuYmVnaW5FeHBvbmVudE1hcmtlcixcbiAgICAgIFtdXG4gICAgKTtcbiAgICB0aGlzLl9lbmRFeHBvbmVudE1hcmtlclRva2VucyA9IHRva2VuaXplKFxuICAgICAgdGhpcy5vcHRpb25zLmVuZEV4cG9uZW50TWFya2VyLFxuICAgICAgW11cbiAgICApO1xuICAgIHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh0aGlzLm9wdGlvbnMudHJ1bmNhdGlvbk1hcmtlciwgW10pO1xuICAgIHRoaXMuX2JlZ2luUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuYmVnaW5SZXBlYXRpbmdEaWdpdHMsXG4gICAgICBbXVxuICAgICk7XG4gICAgdGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuZW5kUmVwZWF0aW5nRGlnaXRzLFxuICAgICAgW11cbiAgICApO1xuICAgIHRoaXMuX2ltYWdpbmFyeU51bWJlclRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5pbWFnaW5hcnlVbml0LCBbXSk7XG4gIH1cbiAgdXBkYXRlT3B0aW9ucyhvcHQpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvcHQpKVxuICAgICAgaWYgKGsgaW4gdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc1trXSA9IHY7XG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChrID09PSBcInBvc2l0aXZlSW5maW5pdHlcIilcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aXZlSW5maW5pdHlUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwibmVnYXRpdmVJbmZpbml0eVwiKVxuICAgICAgICAgICAgdGhpcy5fbmVnYXRpdmVJbmZpbml0eVRva2VucyA9IHRva2VuaXplKHYsIFtdKTtcbiAgICAgICAgICBpZiAoayA9PT0gXCJub3RBTnVtYmVyXCIpXG4gICAgICAgICAgICB0aGlzLl9ub3RBTnVtYmVyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImRlY2ltYWxNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2RlY2ltYWxNYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiZ3JvdXBTZXBhcmF0b3JcIilcbiAgICAgICAgICAgIHRoaXMuX2dyb3VwU2VwYXJhdG9yVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImV4cG9uZW50UHJvZHVjdFwiKVxuICAgICAgICAgICAgdGhpcy5fZXhwb25lbnRQcm9kdWN0VG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImJlZ2luRXhwb25lbnRNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2JlZ2luRXhwb25lbnRNYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiZW5kRXhwb25lbnRNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2VuZEV4cG9uZW50TWFya2VyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcInRydW5jYXRpb25NYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiYmVnaW5SZXBlYXRpbmdEaWdpdHNcIilcbiAgICAgICAgICAgIHRoaXMuX2JlZ2luUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImVuZFJlcGVhdGluZ0RpZ2l0c1wiKVxuICAgICAgICAgICAgdGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImltYWdpbmFyeU51bWJlclwiKVxuICAgICAgICAgICAgdGhpcy5faW1hZ2luYXJ5TnVtYmVyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgb3B0aW9uIFwiJHtrfVwiYCk7XG4gIH1cbiAgZ2V0IGF0RW5kKCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMuX3Rva2Vucy5sZW5ndGg7XG4gIH1cbiAgZ2V0IHBlZWsoKSB7XG4gICAgY29uc3QgcGVlayA9IHRoaXMuX3Rva2Vuc1t0aGlzLmluZGV4XTtcbiAgICBpZiAocGVlayA9PT0gdGhpcy5fbGFzdFBlZWspXG4gICAgICB0aGlzLl9wZWVrQ291bnRlciArPSAxO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuX3BlZWtDb3VudGVyID0gMDtcbiAgICBpZiAodGhpcy5fcGVla0NvdW50ZXIgPj0gMTAyNCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZyBcIiR7dGhpcy5sYXRleCgwKX1cIiBhdCBcIiR7dGhpcy5fbGFzdFBlZWt9XCIgKGluZGV4ICR7dGhpcy5pbmRleH0pYFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZyBcIiR7dGhpcy5sYXRleCgwKX1cIiBhdCAke3RoaXMuX2xhc3RQZWVrfSAoaW5kZXggJHt0aGlzLmluZGV4fSlgXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0UGVlayA9IHBlZWs7XG4gICAgcmV0dXJuIHBlZWs7XG4gIH1cbiAgbmV4dFRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLl90b2tlbnNbdGhpcy5pbmRleCsrXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWZcbiAgICogLSBhdCBlbmQgb2YgdGhlIHRva2VuIHN0cmVhbVxuICAgKiAtIHRoZSBgdC5jb25kaXRpb25gIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgKiBOb3RlOiB0aGUgYG1pblByZWNgIGNvbmRpdGlvbiBpcyBub3QgY2hlY2tlZC4gSXQgc2hvdWxkIGJlIGNoZWNrZWQgc2VwYXJhdGVseS5cbiAgICovXG4gIGF0VGVybWluYXRvcih0KSB7XG4gICAgcmV0dXJuIHRoaXMuYXRCb3VuZGFyeSB8fCAoKHQ/LmNvbmRpdGlvbiAmJiB0LmNvbmRpdGlvbih0aGlzKSkgPz8gZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBjdXJyZW50IHRva2VuIG1hdGNoZXMgYW55IG9mIHRoZSBib3VuZGFyaWVzIHdlIGFyZVxuICAgKiB3YWl0aW5nIGZvci5cbiAgICovXG4gIGdldCBhdEJvdW5kYXJ5KCkge1xuICAgIGlmICh0aGlzLmF0RW5kKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGZvciAoY29uc3QgYm91bmRhcnkgb2YgdGhpcy5fYm91bmRhcmllcykge1xuICAgICAgaWYgKHRoaXMubWF0Y2hBbGwoYm91bmRhcnkudG9rZW5zKSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYWRkQm91bmRhcnkoYm91bmRhcnkpIHtcbiAgICB0aGlzLl9ib3VuZGFyaWVzLnB1c2goeyBpbmRleDogdGhpcy5pbmRleCwgdG9rZW5zOiBib3VuZGFyeSB9KTtcbiAgfVxuICByZW1vdmVCb3VuZGFyeSgpIHtcbiAgICB0aGlzLl9ib3VuZGFyaWVzLnBvcCgpO1xuICB9XG4gIG1hdGNoQm91bmRhcnkoKSB7XG4gICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gdGhpcy5fYm91bmRhcmllc1t0aGlzLl9ib3VuZGFyaWVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG1hdGNoMiA9IGN1cnJlbnRCb3VuZGFyeSAmJiB0aGlzLm1hdGNoQWxsKGN1cnJlbnRCb3VuZGFyeS50b2tlbnMpO1xuICAgIGlmIChtYXRjaDIpXG4gICAgICB0aGlzLl9ib3VuZGFyaWVzLnBvcCgpO1xuICAgIHJldHVybiBtYXRjaDI7XG4gIH1cbiAgYm91bmRhcnlFcnJvcihtc2cpIHtcbiAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSB0aGlzLl9ib3VuZGFyaWVzW3RoaXMuX2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5fYm91bmRhcmllcy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5lcnJvcihtc2csIGN1cnJlbnRCb3VuZGFyeS5pbmRleCk7XG4gIH1cbiAgbGF0ZXgoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyh0aGlzLl90b2tlbnMuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICB9XG4gIGxhdGV4QWhlYWQobikge1xuICAgIHJldHVybiB0aGlzLmxhdGV4KHRoaXMuaW5kZXgsIHRoaXMuaW5kZXggKyBuKTtcbiAgfVxuICAvLyBsYXRleEJlZm9yZSgpOiBzdHJpbmcge1xuICAvLyAgIHJldHVybiB0aGlzLmxhdGV4KDAsIHRoaXMuaW5kZXgpO1xuICAvLyB9XG4gIC8vIGxhdGV4QWZ0ZXIoKTogc3RyaW5nIHtcbiAgLy8gICByZXR1cm4gdGhpcy5sYXRleCh0aGlzLmluZGV4KTtcbiAgLy8gfVxuICAvKipcbiAgICogUmV0dXJuIGF0IG1vc3QgYHRoaXMuX2RpY3Rpb25hcnkubG9va2FoZWFkYCBMYVRlWCB0b2tlbnMuXG4gICAqXG4gICAqIFRoZSBpbmRleCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgY29ycmVzcG9uZCB0byB0aGUgbnVtYmVyIG9mIHRva2Vucy5cbiAgICogTm90ZSB0aGF0IHNpbmNlIGEgdG9rZW4gY2FuIGJlIGxvbmdlciB0aGFuIG9uZSBjaGFyICgnXFxcXHBpJywgYnV0IGFsc29cbiAgICogc29tZSBhc3RyYWwgcGxhbmUgdW5pY29kZSBjaGFyYWN0ZXJzKSwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXG4gICAqIGRvZXMgbm90IG1hdGNoIHRoYXQgaW5kZXguIEhvd2V2ZXIsIGtub3dpbmcgdGhlIGluZGV4IGlzIGltcG9ydGFudFxuICAgKiB0byBrbm93IGJ5IGhvdyBtYW55IHRva2VucyB0byBhZHZhbmNlLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYFtlbXB0eSwgJ1xcXFxzcXJ0JywgJ1xcXFxzcXJ0eycsICdcXFxcc3FydHsyJywgJ1xcXFxzcXJ0ezJ9J11gXG4gICAqXG4gICAqL1xuICBsb29rQWhlYWQoKSB7XG4gICAgbGV0IG4gPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuX2RpY3Rpb25hcnkubG9va2FoZWFkLFxuICAgICAgdGhpcy5fdG9rZW5zLmxlbmd0aCAtIHRoaXMuaW5kZXhcbiAgICApO1xuICAgIGlmIChuIDw9IDApXG4gICAgICByZXR1cm4gW107XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKG4gPiAwKVxuICAgICAgcmVzdWx0LnB1c2goW24sIHRoaXMubGF0ZXhBaGVhZChuLS0pXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwZWVrRGVmaW5pdGlvbnMoa2luZCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGRlZnMgPSBbLi4udGhpcy5nZXREZWZzKGtpbmQpXTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKVxuICAgICAgaWYgKGRlZi5sYXRleFRyaWdnZXIgPT09IFwiXCIpXG4gICAgICAgIHJlc3VsdC5wdXNoKFtkZWYsIDBdKTtcbiAgICBmb3IgKGNvbnN0IFtuLCB0b2tlbnNdIG9mIHRoaXMubG9va0FoZWFkKCkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpXG4gICAgICAgIGlmIChkZWYubGF0ZXhUcmlnZ2VyID09PSB0b2tlbnMpXG4gICAgICAgICAgcmVzdWx0LnB1c2goW2RlZiwgbl0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICBpZiAoZGVmLmlkZW50aWZpZXJUcmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUNvbXBsZXhJZCh0aGlzLCBkZWYuaWRlbnRpZmllclRyaWdnZXIpO1xuICAgICAgICBpZiAobiA+IDApXG4gICAgICAgICAgcmVzdWx0LnB1c2goW2RlZiwgbl0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBTa2lwIHN0cmljdGx5IGA8c3BhY2U+YCB0b2tlbnMuXG4gICAqIFRvIGFsc28gc2tpcCBge31gIHNlZSBgc2tpcFNwYWNlKClgLlxuICAgKiBUbyBza2lwIHZpc3VhbCBzcGFjZSAoZS5nLiBgXFwsYCkgc2VlIGBza2lwVmlzdWFsU3BhY2UoKWAuXG4gICAqL1xuICBza2lwU3BhY2VUb2tlbnMoKSB7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goXCI8c3BhY2U+XCIpKSB7XG4gICAgfVxuICB9XG4gIC8qKiBXaGlsZSBwYXJzaW5nIGluIG1hdGggbW9kZSwgc2tpcCBhcHBsaWNhYmxlIHNwYWNlcywgd2hpY2ggaW5jbHVkZXMgYHt9YC5cbiAgICogRG8gbm90IHVzZSB0byBza2lwIHNwYWNlcyB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nLiBTZWUgIGBza2lwU3BhY2VUb2tlbnMoKWBcbiAgICogaW5zdGVhZC5cbiAgICovXG4gIHNraXBTcGFjZSgpIHtcbiAgICBpZiAoIXRoaXMuYXRFbmQgJiYgdGhpcy5wZWVrID09PSBcIjx7PlwiKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKHRoaXMubWF0Y2goXCI8c3BhY2U+XCIpKSB7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZXh0VG9rZW4oKSA9PT0gXCI8fT5cIikge1xuICAgICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcFNwYWNlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIjxzcGFjZT5cIikpXG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2tpcFZpc3VhbFNwYWNlKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLnNraXBTcGFjZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIGlmIChbXG4gICAgICBcIlxcXFwhXCIsXG4gICAgICBcIlxcXFwsXCIsXG4gICAgICBcIlxcXFw6XCIsXG4gICAgICBcIlxcXFw7XCIsXG4gICAgICBcIlxcXFxlbnNraXBcIixcbiAgICAgIFwiXFxcXGVuc3BhY2VcIixcbiAgICAgIFwiXFxcXHNwYWNlXCIsXG4gICAgICBcIlxcXFxxdWFkXCIsXG4gICAgICBcIlxcXFxxcXVhZFwiXG4gICAgXS5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgdGhpcy5za2lwVmlzdWFsU3BhY2UoKTtcbiAgICB9XG4gICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgfVxuICBtYXRjaCh0b2tlbikge1xuICAgIGlmICh0aGlzLl90b2tlbnNbdGhpcy5pbmRleF0gPT09IHRva2VuKSB7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hdGNoQWxsKHRva2Vucykge1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChBcnJheS5pc0FycmF5KHRva2VucykpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBtYXRjaGVkID0gdHJ1ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZG8ge1xuICAgICAgbWF0Y2hlZCA9IHRoaXMuX3Rva2Vuc1t0aGlzLmluZGV4ICsgaV0gPT09IHRva2Vuc1tpKytdO1xuICAgIH0gd2hpbGUgKG1hdGNoZWQgJiYgaSA8IHRva2Vucy5sZW5ndGgpO1xuICAgIGlmIChtYXRjaGVkKVxuICAgICAgdGhpcy5pbmRleCArPSBpO1xuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG4gIG1hdGNoQW55KHRva2Vucykge1xuICAgIGlmICh0b2tlbnMuaW5jbHVkZXModGhpcy5fdG9rZW5zW3RoaXMuaW5kZXhdKSlcbiAgICAgIHJldHVybiB0aGlzLl90b2tlbnNbdGhpcy5pbmRleCsrXTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBtYXRjaENoYXIoKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGxldCBjYXJldENvdW50ID0gMDtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIl5cIikpXG4gICAgICBjYXJldENvdW50ICs9IDE7XG4gICAgaWYgKGNhcmV0Q291bnQgPCAyKVxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIGlmIChjYXJldENvdW50ID49IDIpIHtcbiAgICAgIGxldCBkaWdpdHMgPSBcIlwiO1xuICAgICAgbGV0IG4gPSAwO1xuICAgICAgd2hpbGUgKG4gIT0gY2FyZXRDb3VudCkge1xuICAgICAgICBjb25zdCBkaWdpdCA9IHRoaXMubWF0Y2hBbnkoW1xuICAgICAgICAgIFwiMFwiLFxuICAgICAgICAgIFwiMVwiLFxuICAgICAgICAgIFwiMlwiLFxuICAgICAgICAgIFwiM1wiLFxuICAgICAgICAgIFwiNFwiLFxuICAgICAgICAgIFwiNVwiLFxuICAgICAgICAgIFwiNlwiLFxuICAgICAgICAgIFwiN1wiLFxuICAgICAgICAgIFwiOFwiLFxuICAgICAgICAgIFwiOVwiLFxuICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgIFwiYlwiLFxuICAgICAgICAgIFwiY1wiLFxuICAgICAgICAgIFwiZFwiLFxuICAgICAgICAgIFwiZVwiLFxuICAgICAgICAgIFwiZlwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoIWRpZ2l0KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkaWdpdHMgKz0gZGlnaXQ7XG4gICAgICAgIG4gKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChkaWdpdHMubGVuZ3RoID09PSBjYXJldENvdW50KVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoTnVtYmVyLnBhcnNlSW50KGRpZ2l0cywgMTYpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCJcXFxcY2hhclwiKSkge1xuICAgICAgbGV0IGNvZGVwb2ludCA9IE1hdGguZmxvb3IodGhpcy5tYXRjaExhdGV4TnVtYmVyKCkgPz8gTnVtYmVyLk5hTik7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb2RlcG9pbnQpIHx8IGNvZGVwb2ludCA8IDAgfHwgY29kZXBvaW50ID4gMTExNDExMSkge1xuICAgICAgICBjb2RlcG9pbnQgPSAxMDA2NztcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIlxcXFx1bmljb2RlXCIpKSB7XG4gICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgICAgY29uc3QgY29kZXBvaW50ID0gdGhpcy5tYXRjaExhdGV4TnVtYmVyKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpICYmIGNvZGVwb2ludCAhPT0gbnVsbCAmJiBjb2RlcG9pbnQgPj0gMCAmJiBjb2RlcG9pbnQgPD0gMTExNDExMSkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2RlcG9pbnQgPSB0aGlzLm1hdGNoTGF0ZXhOdW1iZXIoKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCAhPT0gbnVsbCAmJiBjb2RlcG9pbnQgPj0gMCAmJiBjb2RlcG9pbnQgPD0gMTExNDExMSlcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZXBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBJZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBvcGVuIGRlbGltaXRlciwgc2V0IGEgYm91bmRhcnkgd2l0aFxuICAgKiB0aGUgY2xvc2UgdG9rZW4gYW5kIHJldHVybiB0cnVlLlxuICAgKlxuICAgKiBOb3RlIHRoaXMgbWV0aG9kIGhhbmRsZXMgZ2VuZXJpYyBkZWxpbWl0ZXJzLCBpLmUuICcoJyB3aWxsIG1hdGggYm90aFxuICAgKiAnKCcsICdcXGxlZnQoJywgJ1xcYmlnbCgnLCBldGMuLi5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBkZWZpbml0aW9ucyBmb3IgbWF0Y2hmaXggbWF5IG5lZWQgdG8gaW5jbHVkZSBzeW5vbnltc1xuICAgKiBmb3IgZXhhbXBsZTpcbiAgICpcbiAgICoge1xuICAgKiAgICBvcGVuRGVsaW1pdGVyOiAnKCcsXG4gICAqICAgIGNsb3NlRGVsaW1pdGVyOiAnKSdcbiAgICogfVxuICAgKlxuICAgKiBhbmRcbiAgICpcbiAgICoge1xuICAgKiAgIG9wZW5EZWxpbWl0ZXI6ICdcXFxcbHBhcmVuJyxcbiAgICogICBjbG9zZURlbGltaXRlcjogJ1xcXFxycGFyZW4nXG4gICAqIH1cbiAgICpcbiAgICogRm9yOlxuICAgKiAtICdbJzogJ1xcXFxsYnJhY2snIGFuZCAnXFxcXFsnXG4gICAqIC0gJ10nOiAnXFxcXHJicmFjaycgYW5kICdcXFxcXSdcbiAgICogLSAneyc6ICdcXFxcbGJyYWNlJyBhbmQgJ1xcXFx9J1xuICAgKiAtICd9JzogJ1xcXFxyYnJhY2UnIGFuZCAnXFxcXH0nXG4gICAqIC0gJzwnOiAnXFxcXGxhbmdsZSdcbiAgICogLSAnPic6ICdcXFxccmFuZ2xlJ1xuICAgKiAtICd8JzogJ1xcXFx2ZXJ0J1xuICAgKiAtICd8fCc6ICdcXFxcVmVydCdcbiAgICogLSAnfCc6ICdcXFxcbHZlcnQnIGFuZCAnXFxcXHJ2ZXJ0J1xuICAgKiAtICd8fCc6ICdcXFxcbFZlcnQnIGFuZCAnXFxcXHJWZXJ0J1xuICAgKi9cbiAgbWF0Y2hEZWxpbWl0ZXIob3BlbiwgY2xvc2UpIHtcbiAgICBpZiAodGhpcy5wZWVrID09PSBcIltcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcGVuKSkge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoY2xvc2UpKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQWxsKG9wZW4pKSB7XG4gICAgICAgIHRoaXMuYWRkQm91bmRhcnkoY2xvc2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGNsb3NlUHJlZml4ID0gT1BFTl9ERUxJTUlURVJfUFJFRklYW3RoaXMucGVla107XG4gICAgaWYgKGNsb3NlUHJlZml4KVxuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBpZiAob3BlbiA9PT0gXCJ8fFwiICYmIHRoaXMubWF0Y2hBbGwoW1wifFwiLCBcInxcIl0pKSB7XG4gICAgICB0aGlzLmFkZEJvdW5kYXJ5KFtcInxcIiwgXCJ8XCJdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWF0Y2gob3BlbikpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hZGRCb3VuZGFyeShjbG9zZVByZWZpeCA/IFtjbG9zZVByZWZpeCwgY2xvc2VdIDogW2Nsb3NlXSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcGFyc2VHcm91cCgpIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICBpZiAodGhpcy5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgdGhpcy5hZGRCb3VuZGFyeShbXCI8fT5cIl0pO1xuICAgICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2hCb3VuZGFyeSgpKVxuICAgICAgICByZXR1cm4gZXhwciA/PyBbXCJTZXF1ZW5jZVwiXTtcbiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmluZGV4O1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoQm91bmRhcnkoKSAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgZnJvbSk7XG4gICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVycl0gOiBlcnI7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBTb21lIExhVGVYIGNvbW1hbmRzIChidXQgbm90IGFsbCkgY2FuIGFjY2VwdCBhbiBhcmd1bWVudCB3aXRob3V0IGJyYWNlcyxcbiAgLy8gZm9yIGV4YW1wbGUgYF5gICwgYFxcc3FydGAgb3IgYFxcZnJhY2AuXG4gIC8vIFRoaXMgYXJndW1lbnQgd2lsbCB1c3VhbGx5IGJlIGEgc2luZ2xlIHRva2VuLCBidXQgY2FuIGJlIGEgc2VxdWVuY2Ugb2ZcbiAgLy8gdG9rZW5zIChlLmcuIGBcXHNxcnRcXGZyYWMxMmAgb3IgYFxcc3FydFxcb3BlcmF0b3JuYW1le3NwZWVkfWApLlxuICBwYXJzZVRva2VuKCkge1xuICAgIGNvbnN0IGV4Y2x1ZGluZyA9IFtcbiAgICAgIC4uLichXCIjJCUmKCksLzs6P0BbXVxcXFxgfH4nLnNwbGl0KFwiXCIpLFxuICAgICAgXCJcXFxcbGVmdFwiLFxuICAgICAgXCJcXFxcYmlnbFwiXG4gICAgXTtcbiAgICBpZiAoZXhjbHVkaW5nLmluY2x1ZGVzKHRoaXMucGVlaykpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoL15bMC05XSQvLnRlc3QodGhpcy5wZWVrKSlcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLm5leHRUb2tlbigpKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlR2VuZXJpY0V4cHJlc3Npb24oKSA/PyB0aGlzLnBhcnNlU3ltYm9sKCk7XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHBhcnNlT3B0aW9uYWxHcm91cCgpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICBpZiAodGhpcy5tYXRjaChcIltcIikpIHtcbiAgICAgIHRoaXMuYWRkQm91bmRhcnkoW1wiXVwiXSk7XG4gICAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaEJvdW5kYXJ5KCkpXG4gICAgICAgIHJldHVybiBleHByO1xuICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlFcnJvcihcImV4cGVjdGVkLWNsb3NpbmctZGVsaW1pdGVyXCIpO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGFuIGV4cHJlc3Npb24gaW4gYSB0YWJ1bGFyIGZvcm1hdCwgd2hlcmUgcm93cyBhcmUgc2VwYXJhdGVkIGJ5IGBcXFxcYFxuICAgKiBhbmQgY29sdW1ucyBieSBgJmAuXG4gICAqXG4gICAqIFJldHVybiByb3dzIG9mIHNwYXJzZSBjb2x1bW5zOiBlbXB0eSByb3dzIGFyZSBpbmRpY2F0ZWQgd2l0aCBgTm90aGluZ2AsXG4gICAqIGFuZCBlbXB0eSBjZWxscyBhcmUgYWxzbyBpbmRpY2F0ZWQgd2l0aCBgTm90aGluZ2AuXG4gICAqL1xuICBwYXJzZVRhYnVsYXIoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHJvdyA9IFtdO1xuICAgIGxldCBleHByID0gbnVsbDtcbiAgICB3aGlsZSAoIXRoaXMuYXRCb3VuZGFyeSkge1xuICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFwiJlwiKSkge1xuICAgICAgICByb3cucHVzaChleHByID8/IFwiTm90aGluZ1wiKTtcbiAgICAgICAgZXhwciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCJcXFxcXFxcXFwiKSB8fCB0aGlzLm1hdGNoKFwiXFxcXGNyXCIpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIHRoaXMucGFyc2VPcHRpb25hbEdyb3VwKCk7XG4gICAgICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgICAgIHJvdy5wdXNoKGV4cHIpO1xuICAgICAgICByZXN1bHQucHVzaChyb3cpO1xuICAgICAgICByb3cgPSBbXTtcbiAgICAgICAgZXhwciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjZWxsID0gW107XG4gICAgICAgIGxldCBwZWVrID0gdGhpcy5wZWVrO1xuICAgICAgICB3aGlsZSAocGVlayAhPT0gXCImXCIgJiYgcGVlayAhPT0gXCJcXFxcXFxcXFwiICYmIHBlZWsgIT09IFwiXFxcXGNyXCIgJiYgIXRoaXMuYXRCb3VuZGFyeSkge1xuICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICBtaW5QcmVjOiAwLFxuICAgICAgICAgICAgY29uZGl0aW9uOiAocCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwZWVrMiA9IHAucGVlaztcbiAgICAgICAgICAgICAgcmV0dXJuIHBlZWsyID09PSBcIiZcIiB8fCBwZWVrMiA9PT0gXCJcXFxcXFxcXFwiIHx8IHBlZWsyID09PSBcIlxcXFxjclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleHByKVxuICAgICAgICAgICAgY2VsbC5wdXNoKGV4cHIpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2VsbC5wdXNoKFtcIkVycm9yXCIsIFtcIid1bmV4cGVjdGVkLXRva2VuJ1wiLCBwZWVrXV0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgICAgICBwZWVrID0gdGhpcy5wZWVrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsLmxlbmd0aCA+IDEpXG4gICAgICAgICAgZXhwciA9IFtcIlNlcXVlbmNlXCIsIC4uLmNlbGxdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgZXhwciA9IGNlbGxbMF0gPz8gXCJOb3RoaW5nXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgcm93LnB1c2goZXhwcik7XG4gICAgaWYgKHJvdy5sZW5ndGggPiAwKVxuICAgICAgcmVzdWx0LnB1c2gocm93KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBQYXJzZSBhIGdyb3VwIGFzIGEgYSBzdHJpbmcsIGZvciBleGFtcGxlIGZvciBgXFxvcGVyYXRvcm5hbWVgIG9yIGBcXGJlZ2luYCAqL1xuICBwYXJzZVN0cmluZ0dyb3VwKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIjxzcGFjZT5cIikpIHtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgIHRoaXMuYWRkQm91bmRhcnkoW1wiPH0+XCJdKTtcbiAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VTdHJpbmdHcm91cENvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQm91bmRhcnkoKSlcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgIHRoaXMucmVtb3ZlQm91bmRhcnkoKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBQYXJzZSBhbiBlbnZpcm9ubWVudDogYFxcYmVnaW57ZW52fS4uLlxcZW5ke2VuZH1gXG4gICAqL1xuICBwYXJzZUVudmlyb25tZW50KHVudGlsKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGlmICghdGhpcy5tYXRjaChcIlxcXFxiZWdpblwiKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhcnNlU3RyaW5nR3JvdXAoKT8udHJpbSgpO1xuICAgIGlmICghbmFtZSlcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZW52aXJvbm1lbnQtbmFtZVwiLCBpbmRleCk7XG4gICAgdGhpcy5hZGRCb3VuZGFyeShbXCJcXFxcZW5kXCIsIFwiPHs+XCIsIC4uLm5hbWUuc3BsaXQoXCJcIiksIFwiPH0+XCJdKTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiB0aGlzLmdldERlZnMoXCJlbnZpcm9ubWVudFwiKSlcbiAgICAgIGlmIChkZWYuaWRlbnRpZmllclRyaWdnZXIgPT09IG5hbWUpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGRlZi5wYXJzZSh0aGlzLCB1bnRpbCk7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEJvdW5kYXJ5KCkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlFcnJvcihcInVuYmFsYW5jZWQtZW52aXJvbm1lbnRcIik7XG4gICAgICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGV4cHIsIGluZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB0aGlzLnBhcnNlVGFidWxhcigpO1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQm91bmRhcnkoKSlcbiAgICAgIHJldHVybiB0aGlzLmJvdW5kYXJ5RXJyb3IoXCJ1bmJhbGFuY2VkLWVudmlyb25tZW50XCIpO1xuICAgIHJldHVybiB0aGlzLmVycm9yKFtcInVua25vd24tZW52aXJvbm1lbnRcIiwgeyBzdHI6IG5hbWUgfV0sIGluZGV4KTtcbiAgfVxuICAvKiogSWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyBhIGArYCBvciBgLWAgc2lnbiwgcmV0dXJuIGl0IGFuZCBhZHZhbmNlIHRoZSBpbmRleC5cbiAgICogT3RoZXJ3aXNlIHJldHVybiBgJydgIGFuZCBkbyBub3QgYWR2YW5jZSAqL1xuICBwYXJzZU9wdGlvbmFsU2lnbigpIHtcbiAgICBsZXQgaXNOZWdhdGl2ZSA9ICEhdGhpcy5tYXRjaEFueShbXCItXCIsIFwiXFx1MjIxMlwiXSk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2hBbnkoW1wiK1wiLCBcIlxcdUZFNjJcIl0pIHx8IHRoaXMuc2tpcFNwYWNlKCkpXG4gICAgICBpZiAodGhpcy5tYXRjaEFueShbXCItXCIsIFwiXFx1MjIxMlwiXSkpXG4gICAgICAgIGlzTmVnYXRpdmUgPSAhaXNOZWdhdGl2ZTtcbiAgICByZXR1cm4gaXNOZWdhdGl2ZSA/IFwiLVwiIDogXCIrXCI7XG4gIH1cbiAgcGFyc2VEZWNpbWFsRGlnaXRzKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIG9wdGlvbnMud2l0aEdyb3VwaW5nID8/IChvcHRpb25zLndpdGhHcm91cGluZyA9IGZhbHNlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgd2hpbGUgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5uZXh0VG9rZW4oKSk7XG4gICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICB9XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGlmIChvcHRpb25zLndpdGhHcm91cGluZyAmJiB0aGlzLm9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoQWxsKHRoaXMuX2dyb3VwU2VwYXJhdG9yVG9rZW5zKSkge1xuICAgICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpXG4gICAgICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IHNhdmVkSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICB9XG4gIHBhcnNlU2lnbmVkSW50ZWdlcihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA/PyAob3B0aW9ucyA9IHt9KTtcbiAgICBvcHRpb25zLndpdGhHcm91cGluZyA/PyAob3B0aW9ucy53aXRoR3JvdXBpbmcgPSBmYWxzZSk7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IHNpZ24yID0gdGhpcy5wYXJzZU9wdGlvbmFsU2lnbigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKG9wdGlvbnMpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gc2lnbjIgPT09IFwiLVwiID8gXCItXCIgKyByZXN1bHQgOiByZXN1bHQ7XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHBhcnNlRXhwb25lbnQoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGlmICh0aGlzLm1hdGNoQW55KFtcImVcIiwgXCJFXCJdKSkge1xuICAgICAgY29uc3QgZXhwb25lbnQgPSB0aGlzLnBhcnNlU2lnbmVkSW50ZWdlcih7IHdpdGhHcm91cGluZzogZmFsc2UgfSk7XG4gICAgICBpZiAoZXhwb25lbnQpXG4gICAgICAgIHJldHVybiBcImVcIiArIGV4cG9uZW50O1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJcXFxcdGltZXNcIikpIHtcbiAgICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaChcIjFcIikgJiYgdGhpcy5tYXRjaChcIjBcIikgJiYgdGhpcy5tYXRjaChcIl5cIikpIHtcbiAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpXG4gICAgICAgICAgcmV0dXJuIFwiZVwiICsgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgICAgIGNvbnN0IGV4cG9uZW50ID0gdGhpcy5wYXJzZVNpZ25lZEludGVnZXIoKTtcbiAgICAgICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpICYmIGV4cG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIFwiZVwiICsgZXhwb25lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJcXFxcJVwiKSlcbiAgICAgIHJldHVybiBgZS0yYDtcbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwodGhpcy5fZXhwb25lbnRQcm9kdWN0VG9rZW5zKSkge1xuICAgICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQWxsKHRoaXMuX2JlZ2luRXhwb25lbnRNYXJrZXJUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50ID0gdGhpcy5wYXJzZVNpZ25lZEludGVnZXIoKTtcbiAgICAgICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hBbGwodGhpcy5fZW5kRXhwb25lbnRNYXJrZXJUb2tlbnMpICYmIGV4cG9uZW50KVxuICAgICAgICAgIHJldHVybiBcImVcIiArIGV4cG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcGFyc2VSZXBlYXRpbmdEZWNpbWFsKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgcmVwZWF0aW5nRGVjaW1hbHMyID0gXCJcIjtcbiAgICBpZiAodGhpcy5tYXRjaChcIihcIikpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2goXCIpXCIpKVxuICAgICAgICByZXR1cm4gXCIoXCIgKyByZXBlYXRpbmdEZWNpbWFsczIgKyBcIilcIjtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwoW2BcXFxcbGVmdGAsIFwiKFwiXSkpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2hBbGwoW2BcXFxccmlnaHRgLCBcIilcIl0pKVxuICAgICAgICByZXR1cm4gXCIoXCIgKyByZXBlYXRpbmdEZWNpbWFsczIgKyBcIilcIjtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwoW2BcXFxcb3ZlcmxpbmVgLCBcIjx7PlwiXSkpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2goXCI8fT5cIikpXG4gICAgICAgIHJldHVybiBcIihcIiArIHJlcGVhdGluZ0RlY2ltYWxzMiArIFwiKVwiO1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICBpZiAodGhpcy5tYXRjaEFsbCh0aGlzLl9iZWdpblJlcGVhdGluZ0RpZ2l0c1Rva2VucykpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2hBbGwodGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zKSlcbiAgICAgICAgcmV0dXJuIFwiKFwiICsgcmVwZWF0aW5nRGVjaW1hbHMyICsgXCIpXCI7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZSBhIG51bWJlciwgd2l0aCBhbiBvcHRpb25hbCBzaWduLCBleHBvbmVudCwgZGVjaW1hbCBtYXJrZXIsXG4gICAqIHJlcGVhdGluZyBkZWNpbWFscywgZXRjLi4uXG4gICAqL1xuICBwYXJzZU51bWJlcigpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wYXJzZU51bWJlcnMpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwVmlzdWFsU3BhY2UoKTtcbiAgICB0aGlzLm1hdGNoKFwiK1wiKTtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgZG90UHJlZml4ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpIHx8IHRoaXMubWF0Y2hBbGwodGhpcy5fZGVjaW1hbE1hcmtlclRva2VucykpIHtcbiAgICAgIGNvbnN0IHBlZWsgPSB0aGlzLnBlZWs7XG4gICAgICBpZiAocGVlayAhPT0gXCJcXFxcb3ZlcmxpbmVcIiAmJiBwZWVrICE9PSB0aGlzLl9iZWdpblJlcGVhdGluZ0RpZ2l0c1Rva2Vuc1swXSAmJiAhL1swLTlcXChdLy50ZXN0KHBlZWspKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBkb3RQcmVmaXggPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICBpZiAoIWRvdFByZWZpeCAmJiAodGhpcy5tYXRjaChcIi5cIikgfHwgdGhpcy5tYXRjaEFsbCh0aGlzLl9kZWNpbWFsTWFya2VyVG9rZW5zKSkpXG4gICAgICByZXN1bHQgKz0gXCIuXCIgKyB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICBlbHNlIGlmIChkb3RQcmVmaXgpXG4gICAgICByZXN1bHQgPSBcIjAuXCIgKyB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICBlbHNlXG4gICAgICBoYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgaWYgKGhhc0RlY2ltYWwpIHtcbiAgICAgIGNvbnN0IHJlcGVhdCA9IHRoaXMucGFyc2VSZXBlYXRpbmdEZWNpbWFsKCk7XG4gICAgICBpZiAocmVwZWF0KVxuICAgICAgICByZXN1bHQgKz0gcmVwZWF0O1xuICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaChcIlxcXFxsZG90c1wiKSB8fCB0aGlzLm1hdGNoQWxsKHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMpKSB7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgcmV0dXJuIHJlc3VsdCArIHRoaXMucGFyc2VFeHBvbmVudCgpO1xuICB9XG4gIC8qKlxuICAgKiBBIExhdGV4IG51bWJlciBjYW4gYmUgYSBkZWNpbWFsLCBoZXggb3Igb2N0YWwgbnVtYmVyLlxuICAgKiBJdCBpcyB1c2VkIGluIHNvbWUgTGF0ZXggY29tbWFuZHMsIHN1Y2ggYXMgYFxcY2hhcmBcbiAgICpcbiAgICogRnJvbSBUZVg6ODY5NSAoc2Nhbl9pbnQpOlxuICAgKiA+IEFuIGludGVnZXIgbnVtYmVyIGNhbiBiZSBwcmVjZWRlZCBieSBhbnkgbnVtYmVyIG9mIHNwYWNlcyBhbmQgYCsnIG9yXG4gICAqID4gYC0nIHNpZ25zLiBUaGVuIGNvbWVzIGVpdGhlciBhIGRlY2ltYWwgY29uc3RhbnQgKGkuZS4sIHJhZGl4IDEwKSwgYW5cbiAgICogPiBvY3RhbCBjb25zdGFudCAoaS5lLiwgcmFkaXggOCwgcHJlY2VkZWQgYnkgJyksIGEgaGV4YWRlY2ltYWwgY29uc3RhbnRcbiAgICogPiAocmFkaXggMTYsIHByZWNlZGVkIGJ5IFwiKSwgYW4gYWxwaGFiZXRpYyBjb25zdGFudCAocHJlY2VkZWQgYnkgYCksIG9yXG4gICAqID4gYW4gaW50ZXJuYWwgdmFyaWFibGUuXG4gICAqL1xuICBtYXRjaExhdGV4TnVtYmVyKGlzSW50ZWdlciA9IHRydWUpIHtcbiAgICBsZXQgbmVnYXRpdmUgPSBmYWxzZTtcbiAgICBsZXQgdG9rZW4gPSB0aGlzLnBlZWs7XG4gICAgd2hpbGUgKHRva2VuID09PSBcIjxzcGFjZT5cIiB8fCB0b2tlbiA9PT0gXCIrXCIgfHwgdG9rZW4gPT09IFwiLVwiKSB7XG4gICAgICBpZiAodG9rZW4gPT09IFwiLVwiKVxuICAgICAgICBuZWdhdGl2ZSA9ICFuZWdhdGl2ZTtcbiAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB0b2tlbiA9IHRoaXMucGVlaztcbiAgICB9XG4gICAgbGV0IHJhZGl4ID0gMTA7XG4gICAgbGV0IGRpZ2l0cyA9IFtcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIl07XG4gICAgaWYgKHRoaXMubWF0Y2goXCInXCIpKSB7XG4gICAgICByYWRpeCA9IDg7XG4gICAgICBkaWdpdHMgPSBbXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICAgIGlzSW50ZWdlciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKCdcIicpIHx8IHRoaXMubWF0Y2goXCJ4XCIpKSB7XG4gICAgICByYWRpeCA9IDE2O1xuICAgICAgZGlnaXRzID0gW1xuICAgICAgICBcIjBcIixcbiAgICAgICAgXCIxXCIsXG4gICAgICAgIFwiMlwiLFxuICAgICAgICBcIjNcIixcbiAgICAgICAgXCI0XCIsXG4gICAgICAgIFwiNVwiLFxuICAgICAgICBcIjZcIixcbiAgICAgICAgXCI3XCIsXG4gICAgICAgIFwiOFwiLFxuICAgICAgICBcIjlcIixcbiAgICAgICAgXCJBXCIsXG4gICAgICAgIFwiQlwiLFxuICAgICAgICBcIkNcIixcbiAgICAgICAgXCJEXCIsXG4gICAgICAgIFwiRVwiLFxuICAgICAgICBcIkZcIlxuICAgICAgXTtcbiAgICAgIGlzSW50ZWdlciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKFwiYFwiKSkge1xuICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKFwiXFxcXFwiKSAmJiB0b2tlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gKG5lZ2F0aXZlID8gLTEgOiAxKSAqICh0b2tlbi5jb2RlUG9pbnRBdCgxKSA/PyAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5lZ2F0aXZlID8gLTEgOiAxKSAqICh0b2tlbi5jb2RlUG9pbnRBdCgwKSA/PyAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgIHdoaWxlIChkaWdpdHMuaW5jbHVkZXModGhpcy5wZWVrKSkge1xuICAgICAgdmFsdWUgKz0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB9XG4gICAgaWYgKCFpc0ludGVnZXIgJiYgdGhpcy5tYXRjaChcIi5cIikpIHtcbiAgICAgIHZhbHVlICs9IFwiLlwiO1xuICAgICAgd2hpbGUgKGRpZ2l0cy5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICAgIHZhbHVlICs9IHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGlzSW50ZWdlciA/IE51bWJlci5wYXJzZUludCh2YWx1ZSwgcmFkaXgpIDogTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZWdhdGl2ZSA/IC1yZXN1bHQgOiByZXN1bHQ7XG4gIH1cbiAgcGFyc2VQcmVmaXhPcGVyYXRvcih1bnRpbCkge1xuICAgIGlmICghdW50aWwpXG4gICAgICB1bnRpbCA9IHsgbWluUHJlYzogMCB9O1xuICAgIGlmICghdW50aWwubWluUHJlYylcbiAgICAgIHVudGlsID0geyAuLi51bnRpbCwgbWluUHJlYzogMCB9O1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIG5dIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwicHJlZml4XCIpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQgKyBuO1xuICAgICAgY29uc3QgcmhzID0gZGVmLnBhcnNlKHRoaXMsIHVudGlsKTtcbiAgICAgIGlmIChyaHMpXG4gICAgICAgIHJldHVybiByaHM7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwYXJzZUluZml4T3BlcmF0b3IobGhzLCB1bnRpbCkge1xuICAgIHVudGlsID8/ICh1bnRpbCA9IHsgbWluUHJlYzogMCB9KTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodW50aWwubWluUHJlYyAhPT0gdm9pZCAwKTtcbiAgICBpZiAodW50aWwubWluUHJlYyA9PT0gdm9pZCAwKVxuICAgICAgdW50aWwgPSB7IC4uLnVudGlsLCBtaW5QcmVjOiAwIH07XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGZvciAoY29uc3QgW2RlZiwgbl0gb2YgdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJpbmZpeFwiKSkge1xuICAgICAgaWYgKGRlZi5wcmVjZWRlbmNlID49IHVudGlsLm1pblByZWMpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgbjtcbiAgICAgICAgY29uc3QgcmhzID0gZGVmLnBhcnNlKHRoaXMsIGxocywgdW50aWwpO1xuICAgICAgICBpZiAocmhzKVxuICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVGhpcyByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyAoYXMgaW4gYSBmdW5jdGlvbiBhcHBsaWNhdGlvbiksXG4gICAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guXG4gICAqXG4gICAqIC0gJ2VuY2xvc3VyZScgOiB3aWxsIGxvb2sgZm9yIGFuIGFyZ3VtZW50IGluc2lkZSBhbiBlbmNsb3N1cmVcbiAgICogICAob3Blbi9jbG9zZSBmZW5jZSlcbiAgICogLSAnaW1wbGljaXQnOiBlaXRoZXIgYW4gZXhwcmVzc2lvbiBpbnNpZGUgYSBwYWlyIG9mIGAoKWAsIG9yIGp1c3QgYSBwcm9kdWN0XG4gICAqICAoaS5lLiB3ZSBpbnRlcnByZXQgYFxcY29zIDJ4ICsgMWAgYXMgYFxcY29zKDJ4KSArIDFgKVxuICAgKlxuICAgKi9cbiAgcGFyc2VBcmd1bWVudHMoa2luZCA9IFwiZW5jbG9zdXJlXCIsIHVudGlsKSB7XG4gICAgaWYgKHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5wYXJzZUVuY2xvc3VyZSgpO1xuICAgIGlmIChraW5kID09PSBcImVuY2xvc3VyZVwiKSB7XG4gICAgICBpZiAoZ3JvdXAgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGdldFNlcXVlbmNlKGdyb3VwKSA/PyBbXTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgaWYgKGhlYWQoZ3JvdXApID09PSBcIkRlbGltaXRlclwiKVxuICAgICAgICByZXR1cm4gZ2V0U2VxdWVuY2UoZ3JvdXApID8/IFtdO1xuICAgICAgaWYgKGdyb3VwICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gW2dyb3VwXTtcbiAgICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiAzOTAgfSk7XG4gICAgICByZXR1cm4gcHJpbWFyeSA9PT0gbnVsbCA/IG51bGwgOiBbcHJpbWFyeV07XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzYXZlZEluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBJZiBtYXRjaGVzIHRoZSBub3JtYWxpemVkIG9wZW4gZGVsaW1pdGVyLCByZXR1cm4gdGhlXG4gICAqIGV4cGVjdGVkIGNsb3NpbmcgZGVsaW1pdGVyLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgYGRlbGltaXRlcmAgaXMgYChgLCBpdCB3b3VsZCBtYXRjaCBgXFxsZWZ0XFxscGFyZW5gIGFuZFxuICAgKiByZXR1cm4gYFsnXFxyaWdodCcsICdcXHJwYXJlbiddYCwgd2hpY2ggY2FuIGJlIG1hdGNoZWQgd2l0aCBgbWF0Y2hBbGwoKWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gbWF0Y2ggc2V2ZXJhbCB0b2tlbnMsIHVzZSBgbWF0Y2hBbGwoKWBcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtYXRjaE9wZW5EZWxpbWl0ZXIob3BlbkRlbGltLCBjbG9zZURlbGltKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGNsb3NlUHJlZml4ID0gT1BFTl9ERUxJTUlURVJfUFJFRklYW3RoaXMucGVla107XG4gICAgaWYgKGNsb3NlUHJlZml4KVxuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBjb25zdCBhbHRlcm5hdGl2ZXMgPSBERUxJTUlURVJfU0hPUlRIQU5EW29wZW5EZWxpbV0gPz8gW29wZW5EZWxpbV07XG4gICAgY29uc3QgcmVzdWx0ID0gY2xvc2VQcmVmaXggPyBbY2xvc2VQcmVmaXhdIDogW107XG4gICAgaWYgKGFsdGVybmF0aXZlcy5pbmNsdWRlcyhcInx8XCIpICYmIHRoaXMubWF0Y2hBbGwoW1wifFwiLCBcInxcIl0pKSB7XG4gICAgICByZXN1bHQucHVzaChcInxcIik7XG4gICAgICByZXN1bHQucHVzaChcInxcIik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoIWFsdGVybmF0aXZlcy5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKENMT1NFX0RFTElNSVRFUltvcGVuRGVsaW1dID09PSBjbG9zZURlbGltKSB7XG4gICAgICByZXN1bHQucHVzaChDTE9TRV9ERUxJTUlURVJbdGhpcy5wZWVrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGNsb3NlRGVsaW0pO1xuICAgIH1cbiAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gbWF0Y2hNaWRkbGVEZWxpbWl0ZXIoZGVsaW1pdGVyOiAnfCcgfCAnOicgfCBMYXRleFRva2VuKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgZGVsaW1pdGVycyA9IE1JRERMRV9ERUxJTUlURVJbZGVsaW1pdGVyXSA/PyBbZGVsaW1pdGVyXTtcbiAgLy8gICBpZiAoTUlERExFX0RFTElNSVRFUl9QUkVGSVguaW5jbHVkZXModGhpcy5wZWVrKSkge1xuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAvLyAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgIGlmIChkZWxpbWl0ZXJzLmluY2x1ZGVzKHRoaXMucGVlaykpIHtcbiAgLy8gICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgICB9XG4gIC8vICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJzLmluY2x1ZGUodGhpcy5wZWVrKSkge1xuICAvLyAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgIHJldHVybiB0cnVlO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gZmFsc2U7XG4gIC8vIH1cbiAgLyoqIEZvciBlcnJvciBoYW5kbGluZywgd2hlbiB0aGVyZSBpcyBwb3RlbnRpYWxseSBhIG1pc21hdGNoZWQgZGVsaW1pdGVyLlxuICAgKiBSZXR1cm4gYSBMYVRlWCBmcmFnbWVudCBvZiB0aGUgZXhwZWN0ZWQgY2xvc2luZyBkZWxpbWl0ZXJcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtYXRjaEVuY2xvc3VyZU9wZW4oKSB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZ2V0RGVmcyhcIm1hdGNoZml4XCIpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYub3BlbkRlbGltaXRlcikpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hBbGwoZGVmLm9wZW5EZWxpbWl0ZXIpKVxuICAgICAgICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyhkZWYuY2xvc2VEZWxpbWl0ZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsb3NlRGVsaW1pdGVyID0gdGhpcy5tYXRjaE9wZW5EZWxpbWl0ZXIoXG4gICAgICAgIGRlZi5vcGVuRGVsaW1pdGVyLFxuICAgICAgICBkZWYuY2xvc2VEZWxpbWl0ZXJcbiAgICAgICk7XG4gICAgICBpZiAoY2xvc2VEZWxpbWl0ZXIgIT09IG51bGwpXG4gICAgICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyhjbG9zZURlbGltaXRlcik7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVXNlZCBmb3IgZXJyb3IgaGFuZGxpbmdcbiAgICogQGludGVybmFsICovXG4gIG1hdGNoRW5jbG9zdXJlQ2xvc2UoKSB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZ2V0RGVmcyhcIm1hdGNoZml4XCIpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYuY2xvc2VEZWxpbWl0ZXIpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoQWxsKGRlZi5jbG9zZURlbGltaXRlcikpXG4gICAgICAgICAgcmV0dXJuIHRva2Vuc1RvU3RyaW5nKGRlZi5vcGVuRGVsaW1pdGVyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBsZXQgcGVlayA9IHRoaXMucGVlaztcbiAgICAgIGNvbnN0IHByZWZpeCA9IE9iamVjdC5rZXlzKE9QRU5fREVMSU1JVEVSX1BSRUZJWCkuZmluZChcbiAgICAgICAgKHgpID0+IE9QRU5fREVMSU1JVEVSX1BSRUZJWFt4XSA9PT0gcGVla1xuICAgICAgKTtcbiAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICBsZXQgb3BlbkRlbGltaXRlciA9IFtdO1xuICAgICAgcGVlayA9IHRoaXMucGVlaztcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGVsaW0gPSBPYmplY3Qua2V5cyhDTE9TRV9ERUxJTUlURVIpLmZpbmQoXG4gICAgICAgICh4KSA9PiBDTE9TRV9ERUxJTUlURVJbeF0gPT09IHBlZWtcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdEZWxpbSlcbiAgICAgICAgb3BlbkRlbGltaXRlciA9IFttYXRjaGluZ0RlbGltXTtcbiAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgIG9wZW5EZWxpbWl0ZXIgPSBbcHJlZml4LCAuLi5vcGVuRGVsaW1pdGVyXTtcbiAgICAgIGlmIChvcGVuRGVsaW1pdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgcmV0dXJuIHRva2Vuc1RvU3RyaW5nKG9wZW5EZWxpbWl0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGVuY2xvc3VyZSBpcyBhbiBvcGVuaW5nIG1hdGNoZml4IG9wZXJhdG9yLCBhbiBvcHRpb25hbCBleHByZXNzaW9uLFxuICAgKiBvcHRpb25hbGx5IGZvbGxvd2VkIG11bHRpcGxlIHRpbWVzIGJ5IGEgc2VwYXJhdG9yIGFuZCBhbm90aGVyIGV4cHJlc3Npb24sXG4gICAqIGFuZCBmaW5hbGx5IGEgY2xvc2luZyBtYXRjaGluZyBvcGVyYXRvci5cbiAgICovXG4gIHBhcnNlRW5jbG9zdXJlKCkge1xuICAgIGNvbnN0IGRlZnMgPSB0aGlzLmdldERlZnMoXCJtYXRjaGZpeFwiKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgZm9yIChjb25zdCBkZWYgb2YgZGVmcykge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgaWYgKCF0aGlzLm1hdGNoRGVsaW1pdGVyKGRlZi5vcGVuRGVsaW1pdGVyLCBkZWYuY2xvc2VEZWxpbWl0ZXIpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJvZHlTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgIGlmICghdGhpcy5tYXRjaEJvdW5kYXJ5KCkpIHtcbiAgICAgICAgY29uc3QgYm91bmRhcnkgPSB0aGlzLl9ib3VuZGFyaWVzW3RoaXMuX2JvdW5kYXJpZXMubGVuZ3RoIC0gMV0udG9rZW5zO1xuICAgICAgICB0aGlzLnJlbW92ZUJvdW5kYXJ5KCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBib2R5U3RhcnQ7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hBbGwoYm91bmRhcnkpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBkZWYucGFyc2UodGhpcywgYm9keSA/PyBbXCJTZXF1ZW5jZVwiXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEEgZ2VuZXJpYyBleHByZXNzaW9uIGlzIHVzZWQgZm9yIGRpY3Rpb25hcnkgZW50cmllcyB0aGF0IHRha2UgZG9cbiAgICogc29tZSBjb21wbGV4IChub24tc3RhbmRhcmQpIHBhcnNpbmcuIFRoaXMgaW5jbHVkZXMgdHJpZyBmdW5jdGlvbnMgKHRvXG4gICAqIHBhcnNlIGltcGxpY2l0IGFyZ3VtZW50cyksIGFuZCBpbnRlZ3JhbHMgKHRvIHBhcnNlIHRoZSBpbnRlZ3JhbmQgYW5kXG4gICAqIGxpbWl0cyBhbmQgdGhlIFwiZHhcIiB0ZXJtaW5hdG9yKS5cbiAgICovXG4gIHBhcnNlR2VuZXJpY0V4cHJlc3Npb24odW50aWwpIHtcbiAgICBpZiAodGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGxldCBleHByID0gbnVsbDtcbiAgICBjb25zdCBmbkRlZnMgPSB0aGlzLnBlZWtEZWZpbml0aW9ucyhcImV4cHJlc3Npb25cIikgPz8gW107XG4gICAgZm9yIChjb25zdCBbZGVmLCB0b2tlbkNvdW50XSBvZiBmbkRlZnMpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydCArIHRva2VuQ291bnQ7XG4gICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4cHIgPSBkZWYucGFyc2UodGhpcywgdW50aWwpO1xuICAgICAgICBpZiAoZXhwciAhPT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWYubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIGlzIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgcG9zdGZpeCBvcGVyYXRvcnNcbiAgICogKGBcXHByaW1lYC4uLikgYW5kIHNvbWUgYXJndW1lbnRzLlxuICAgKi9cbiAgcGFyc2VGdW5jdGlvbih1bnRpbCkge1xuICAgIGlmICh0aGlzLmF0VGVybWluYXRvcih1bnRpbCkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgbGV0IGZuID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIHRva2VuQ291bnRdIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwiZnVuY3Rpb25cIikpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydCArIHRva2VuQ291bnQ7XG4gICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZuID0gZGVmLnBhcnNlKHRoaXMsIHVudGlsKTtcbiAgICAgICAgaWYgKGZuICE9PSBudWxsKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4gPSBkZWYubmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgZm4gPSBwYXJzZUlkZW50aWZpZXIodGhpcyk7XG4gICAgICBpZiAoIXRoaXMuaXNGdW5jdGlvbkhlYWQoZm4pKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBmID0gdGhpcy5wYXJzZVBvc3RmaXhPcGVyYXRvcihmbik7XG4gICAgICBpZiAocGYgPT09IG51bGwpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZm4gPSBwZjtcbiAgICB9IHdoaWxlICh0cnVlKTtcbiAgICBjb25zdCBzZXEgPSB0aGlzLmlzRnVuY3Rpb25IZWFkKGZuKSA/IHRoaXMucGFyc2VBcmd1bWVudHMoKSA6IG51bGw7XG4gICAgcmV0dXJuIHNlcSA/IFtmbiwgLi4uc2VxXSA6IGZuO1xuICB9XG4gIHBhcnNlU3ltYm9sKHVudGlsKSB7XG4gICAgaWYgKHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIHRva2VuQ291bnRdIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwic3ltYm9sXCIpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQgKyB0b2tlbkNvdW50O1xuICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYucGFyc2UodGhpcywgdW50aWwpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIGRlZi5uYW1lO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgY29uc3QgaWQgPSBwYXJzZUlkZW50aWZpZXIodGhpcyk7XG4gICAgaWYgKGlkID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZVVua25vd25JZGVudGlmaWVyPy4oaWQsIHRoaXMpID09PSBcInN5bWJvbFwiKVxuICAgICAgcmV0dXJuIGlkO1xuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUGFyc2UgYSBzZXF1ZW5jZSBzdXBlcmZpeC9zdWJmaXggb3BlcmF0b3IsIGUuZy4gYF57Kn1gXG4gICAqXG4gICAqIFN1cGVyZml4IGFuZCBzdWJmaXggbmVlZCBzcGVjaWFsIGhhbmRsaW5nOlxuICAgKlxuICAgKiAtIHRoZXkgYWN0IG1vc3RseSBsaWtlIGFuIGluZml4IG9wZXJhdG9yLCBidXQgdGhleSBhcmUgY29tbXV0YXRpdmUsIGkuZS5cbiAgICogYHhfYV5iYCBzaG91bGQgYmUgcGFyc2VkIGlkZW50aWNhbGx5IHRvIGB4XmJfYWAuXG4gICAqXG4gICAqIC0gZnVydGhlcm1vcmUsIGluIExhVGVYIGB4XmFeYmAgcGFyc2VzIHRoZSBzYW1lIGFzIGB4XmF7fV5iYC5cbiAgICpcbiAgICovXG4gIHBhcnNlU3Vwc3ViKGxocykge1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChsaHMgIT09IG51bGwpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIGNvbnN0IHN1cGVyc2NyaXB0cyA9IFtdO1xuICAgIGNvbnN0IHN1YnNjcmlwdHMgPSBbXTtcbiAgICBsZXQgc3ViSW5kZXggPSBpbmRleDtcbiAgICB3aGlsZSAodGhpcy5wZWVrID09PSBcIl9cIiB8fCB0aGlzLnBlZWsgPT09IFwiXlwiKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikpIHtcbiAgICAgICAgc3ViSW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikgfHwgdGhpcy5tYXRjaChcIl5cIikpXG4gICAgICAgICAgc3Vic2NyaXB0cy5wdXNoKHRoaXMuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgc3ViSW5kZXgpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc3ViMiA9IHRoaXMucGFyc2VHcm91cCgpID8/IHRoaXMucGFyc2VUb2tlbigpID8/IHRoaXMucGFyc2VTdHJpbmdHcm91cCgpO1xuICAgICAgICAgIGlmIChzdWIyID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIGluZGV4KTtcbiAgICAgICAgICBzdWJzY3JpcHRzLnB1c2goc3ViMik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIl5cIikpIHtcbiAgICAgICAgc3ViSW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikgfHwgdGhpcy5tYXRjaChcIl5cIikpXG4gICAgICAgICAgc3VwZXJzY3JpcHRzLnB1c2godGhpcy5lcnJvcihcInN5bnRheC1lcnJvclwiLCBzdWJJbmRleCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzdXAgPSB0aGlzLnBhcnNlR3JvdXAoKSA/PyB0aGlzLnBhcnNlVG9rZW4oKTtcbiAgICAgICAgICBpZiAoc3VwID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIGluZGV4KTtcbiAgICAgICAgICBzdXBlcnNjcmlwdHMucHVzaChzdXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdWJJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIH1cbiAgICBpZiAoc3VwZXJzY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiBzdWJzY3JpcHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgcmV0dXJuIGxocztcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGxocztcbiAgICBpZiAoc3Vic2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZWZzID0gWy4uLnRoaXMuZ2V0RGVmcyhcImluZml4XCIpXS5maWx0ZXIoXG4gICAgICAgICh4KSA9PiB4LmxhdGV4VHJpZ2dlciA9PT0gXCJfXCJcbiAgICAgICk7XG4gICAgICBpZiAoZGVmcykge1xuICAgICAgICBjb25zdCBhcmcgPSBbXG4gICAgICAgICAgXCJTdWJzY3JpcHRcIixcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc3Vic2NyaXB0cy5sZW5ndGggPT09IDEgPyBzdWJzY3JpcHRzWzBdIDogW1wiTGlzdFwiLCAuLi5zdWJzY3JpcHRzXVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBhcmcsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBhcmc7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdXBlcnNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVmcyA9IFsuLi50aGlzLmdldERlZnMoXCJpbmZpeFwiKV0uZmlsdGVyKFxuICAgICAgICAoeCkgPT4geC5sYXRleFRyaWdnZXIgPT09IFwiXlwiXG4gICAgICApO1xuICAgICAgaWYgKGRlZnMpIHtcbiAgICAgICAgY29uc3QgYXJnID0gW1xuICAgICAgICAgIFwiU3VwZXJzY3JpcHRcIixcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc3VwZXJzY3JpcHRzLmxlbmd0aCA9PT0gMSA/IHN1cGVyc2NyaXB0c1swXSA6IFtcIkxpc3RcIiwgLi4uc3VwZXJzY3JpcHRzXVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBhcmcsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBhcmc7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwYXJzZVBvc3RmaXhPcGVyYXRvcihsaHMsIHVudGlsKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGxocyAhPT0gbnVsbCk7XG4gICAgaWYgKGxocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIG5dIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwicG9zdGZpeFwiKSkge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBsaHMsIHVudGlsKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogTWF0Y2ggYSBzdHJpbmcgdXNlZCBhcyBhIExhVGVYIGlkZW50aWZpZXIsIGZvciBleGFtcGxlIGFuIGVudmlyb25tZW50XG4gICAqIG5hbWUuXG4gICAqIE5vdCBzdWl0YWJsZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHRleHQsIGUuZy4gYXJndW1lbnQgb2YgYSBgXFx0ZXh0e31cbiAgICogY29tbWFuZC4gU2VlIGBtYXRjaENoYXIoKWAgaW5zdGVhZC5cbiAgICovXG4gIHBhcnNlU3RyaW5nR3JvdXBDb250ZW50KCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlICghdGhpcy5hdEJvdW5kYXJ5IHx8IGxldmVsID4gMCkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgaWYgKHRva2VuID09PSBcIjwkPlwiIHx8IHRva2VuID09PSBcIjwkJD5cIikge1xuICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuID09PSBcIjx7PlwiKSB7XG4gICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIHJlc3VsdCArPSBcIlxcXFx7XCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx9PlwiKSB7XG4gICAgICAgIGxldmVsIC09IDE7XG4gICAgICAgIHJlc3VsdCArPSBcIlxcXFx9XCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjxzcGFjZT5cIikge1xuICAgICAgICByZXN1bHQgKz0gXCIgXCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSBcIlxcXFxcIikge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIEFwcGx5IGFuIGludmlzaWJsZSBvcGVyYXRvciBiZXR3ZWVuIHR3byBleHByZXNzaW9ucy5cbiAgICpcbiAgICogSWYgdGhlIGBsaHNgIGlzIGFuIGxpdGVyYWwgaW50ZWdlciBhbmQgdGhlIGByaHNgIGlzIGEgbGl0ZXJhbCByYXRpb25hbFxuICAgKiAtPiAnaW52aXNpYmxlIHBsdXMnXG4gICAqXG4gICAqIFRoYXQgaXMgJzIgMy80JyAtPiBbJ0FkZCcsIDIsIFsnUmF0aW9uYWwnLCAzLCA0XV1cbiAgICpcbiAgICogSWYgYGxoc2AgaXMgYSBudW1iZXIgYW5kIGByaHNgIGlzIGEgbnVtYmVyIGJ1dCBub3QgYSBsaXRlcmFsIC0+ICdpbnZpc2libGUgbXVsdGlwbHknLlxuICAgKiAtIDJ4XG4gICAqIC0gMih4KzEpXG4gICAqIC0geCh4KzEpXG4gICAqIC0gZih4KWcoeSlcbiAgICogLSAyIHNpbih4KVxuICAgKiAtIDIgZih4KVxuICAgKiAtIHggZih4KVxuICAgKiAtICh4LTEpKHgrMSlcbiAgICogLSAoeCsxKTIgLT4gbm9cbiAgICogLSB4MiAtPiBub1xuICAgKiA9PiBsaHMgaXMgYSBudW1iZXIsIHJocyBpcyBhIG51bWJlciwgYnV0IG5vdCBhIGxpdGVyYWxcbiAgICovXG4gIGFwcGx5SW52aXNpYmxlT3BlcmF0b3IodW50aWwsIGxocykge1xuICAgIGlmIChsaHMgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLmFwcGx5SW52aXNpYmxlT3BlcmF0b3IgPT09IG51bGwgfHwgaGVhZChsaHMpID09PSBcIkVycm9yXCIgfHwgc3ltYm9sKGxocykgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShsaHMpIHx8IHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnBlZWtEZWZpbml0aW9ucyhcIm9wZXJhdG9yXCIpLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uSGVhZChsaHMpKSB7XG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUFyZ3VtZW50cyhcImVuY2xvc3VyZVwiLCB7IC4uLnVudGlsLCBtaW5QcmVjOiAwIH0pO1xuICAgICAgaWYgKGFyZ3MgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtsaHMsIC4uLmFyZ3NdO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgY29uc3QgcmhzID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oeyAuLi51bnRpbCwgbWluUHJlYzogMzkwIH0pO1xuICAgIGlmIChyaHMgPT09IG51bGwgfHwgc3ltYm9sKHJocykgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShyaHMpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhlYWQocmhzKSA9PT0gXCJFcnJvclwiKVxuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIlNlcXVlbmNlXCIsIGxocywgcmhzKTtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5hcHBseUludmlzaWJsZU9wZXJhdG9yID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwcGx5SW52aXNpYmxlT3BlcmF0b3IodGhpcywgbGhzLCByaHMpO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25IZWFkKGxocykpIHtcbiAgICAgIGNvbnN0IHNlcSA9IGdldFNlcXVlbmNlKHJocyk7XG4gICAgICByZXR1cm4gc2VxID8gW2xocywgLi4uc2VxXSA6IGxocztcbiAgICB9XG4gICAgY29uc3QgbGhzTnVtYmVyID0gbWFjaGluZVZhbHVlKGxocyk7XG4gICAgaWYgKGxoc051bWJlciAhPT0gbnVsbCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxoc051bWJlcikpIHtcbiAgICAgIGNvbnN0IHJoc0hlYWQgPSBoZWFkKHJocyk7XG4gICAgICBpZiAocmhzSGVhZCA9PT0gXCJEaXZpZGVcIiB8fCByaHNIZWFkID09PSBcIlJhdGlvbmFsXCIpIHtcbiAgICAgICAgY29uc3QgW24sIGRdID0gW21hY2hpbmVWYWx1ZShvcChyaHMsIDEpKSwgbWFjaGluZVZhbHVlKG9wKHJocywgMikpXTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwgJiYgZCAhPT0gbnVsbCAmJiBuID4gMCAmJiBuIDw9IDFlMyAmJiBkID4gMSAmJiBkIDw9IDFlMyAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIE51bWJlci5pc0ludGVnZXIoZCkpXG4gICAgICAgICAgcmV0dXJuIFtcIkFkZFwiLCBsaHMsIHJoc107XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkKHJocykgPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICAgIGlmIChoZWFkKG9wKHJocywgMSkpID09PSBcIlNlcXVlbmNlXCIpXG4gICAgICAgIHJldHVybiBbbGhzLCAuLi5vcHMob3AocmhzLCAxKSkgPz8gW11dO1xuICAgICAgaWYgKCFvcChyaHMsIDEpIHx8IHN5bWJvbChvcChyaHMsIDEpKSA9PT0gXCJOb3RoaW5nXCIpXG4gICAgICAgIHJldHVybiBhcHBseUFzc29jaWF0aXZlT3BlcmF0b3IoXG4gICAgICAgICAgXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgIGxocyxcbiAgICAgICAgICB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZXhwcmVzc2lvblwiLCBzdGFydClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhlYWQocmhzKSA9PT0gXCJTZXF1ZW5jZVwiIHx8IGhlYWQobGhzKSA9PT0gXCJTZXF1ZW5jZVwiIHx8IHN0cmluZ1ZhbHVlKGxocykgIT09IG51bGwgfHwgc3RyaW5nVmFsdWUocmhzKSAhPT0gbnVsbCB8fCBkaWN0aW9uYXJ5KGxocykgIT09IG51bGwgfHwgZGljdGlvbmFyeShyaHMpICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIlNlcXVlbmNlXCIsIGxocywgcmhzKTtcbiAgICByZXR1cm4gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKFwiTXVsdGlwbHlcIiwgbGhzLCByaHMpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGVycm9yIGhhbmRsaW5nIG1ldGhvZC4gV2UndmUgZW5jb3VudGVyZWQgYSBMYVRlWCBjb21tYW5kXG4gICAqIGJ1dCB3ZXJlIG5vdCBhYmxlIHRvIG1hdGNoIGl0IHRvIGFueSBlbnRyeSBpbiB0aGUgTGFUZVggZGljdGlvbmFyeSxcbiAgICogb3IgcmFuIGludG8gaXQgaW4gYW4gdW5leHBlY3RlZCBjb250ZXh0IChwb3N0Zml4IG9wZXJhdG9yIGxhY2tpbmcgYW5cbiAgICogYXJndW1lbnQsIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcGFyc2VVbmV4cGVjdGVkTGF0ZXhDb21tYW5kKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgb3BEZWZzID0gdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJvcGVyYXRvclwiKTtcbiAgICBpZiAob3BEZWZzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wRGVmcyA9IHRoaXMucGVla0RlZmluaXRpb25zKFwicG9zdGZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSk7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5uYW1lKVxuICAgICAgICAgIHJldHVybiBbZGVmLm5hbWUsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KV07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwidW5leHBlY3RlZC1vcGVyYXRvclwiLCBzdGFydCk7XG4gICAgICB9XG4gICAgICBvcERlZnMgPSB0aGlzLnBlZWtEZWZpbml0aW9ucyhcInByZWZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm5hbWUpXG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGRlZi5uYW1lLFxuICAgICAgICAgICAgLy8gQHRvZG86IHBhc3MgYSBwcmVjZWRlbmNlP1xuICAgICAgICAgICAgdGhpcy5wYXJzZUV4cHJlc3Npb24oKSA/PyB0aGlzLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydClcbiAgICAgICAgICBdO1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihcInVuZXhwZWN0ZWQtb3BlcmF0b3JcIiwgc3RhcnQpO1xuICAgICAgfVxuICAgICAgb3BEZWZzID0gdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJpbmZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSwge1xuICAgICAgICAgICAgbWluUHJlYzogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubmFtZSlcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZGVmLm5hbWUsXG4gICAgICAgICAgICB0aGlzLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydCksXG4gICAgICAgICAgICB0aGlzLnBhcnNlRXhwcmVzc2lvbigpID8/IHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KVxuICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwidW5leHBlY3RlZC1vcGVyYXRvclwiLCBzdGFydCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLnBlZWs7XG4gICAgaWYgKCFjb21tYW5kIHx8IGNvbW1hbmRbMF0gIT09IFwiXFxcXFwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgIGlmIChjb21tYW5kID09PSBcIlxcXFxlbmRcIikge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucGFyc2VTdHJpbmdHcm91cCgpO1xuICAgICAgaWYgKG5hbWUgPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZW52aXJvbm1lbnQtbmFtZVwiLCBzdGFydCk7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcihbXCJ1bmJhbGFuY2VkLWVudmlyb25tZW50XCIsIHsgc3RyOiBuYW1lIH1dLCBzdGFydCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLm1hdGNoKFwiW1wiKSkge1xuICAgICAgbGV0IGxldmVsID0gMDtcbiAgICAgIHdoaWxlICghdGhpcy5hdEVuZCAmJiBsZXZlbCA9PT0gMCAmJiB0aGlzLnBlZWsgIT09IFwiXVwiKSB7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiW1wiKVxuICAgICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiXVwiKVxuICAgICAgICAgIGxldmVsIC09IDE7XG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hdGNoKFwiXVwiKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICBjb25zdCBjbG9zZURlbGltaXRlciA9IHRoaXMubWF0Y2hFbmNsb3N1cmVPcGVuKCk7XG4gICAgaWYgKGNsb3NlRGVsaW1pdGVyKVxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXG4gICAgICAgIFtcImV4cGVjdGVkLWNsb3NlLWRlbGltaXRlclwiLCB7IHN0cjogY2xvc2VEZWxpbWl0ZXIgfV0sXG4gICAgICAgIGluZGV4XG4gICAgICApO1xuICAgIGNvbnN0IG9wZW5EZWxpbWl0ZXIgPSB0aGlzLm1hdGNoRW5jbG9zdXJlQ2xvc2UoKTtcbiAgICBpZiAob3BlbkRlbGltaXRlcilcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFxuICAgICAgICBbXCJleHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgc3RhcnRcbiAgICAgICk7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHdoaWxlICh0aGlzLm1hdGNoKFwiPHs+XCIpKSB7XG4gICAgICBsZXQgbGV2ZWwgPSAwO1xuICAgICAgd2hpbGUgKCF0aGlzLmF0RW5kICYmIGxldmVsID09PSAwICYmIHRoaXMucGVlayAhPT0gXCI8fT5cIikge1xuICAgICAgICBpZiAodGhpcy5wZWVrID09PSBcIjx7PlwiKVxuICAgICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiPH0+XCIpXG4gICAgICAgICAgbGV2ZWwgLT0gMTtcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0Y2goXCI8fT5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVycm9yKFtcInVuZXhwZWN0ZWQtY29tbWFuZFwiLCB7IHN0cjogY29tbWFuZCB9XSwgc3RhcnQpO1xuICB9XG4gIC8qKlxuICAgKiA8cHJpbWFyeT4gOj1cbiAgICogICg8bnVtYmVyPiB8IDxzeW1ib2w+IHwgPGVudmlyb25tZW50PiB8IDxtYXRjaGZpeC1leHByPilcbiAgICogICAgPHN1YnN1cD4qIDxwb3N0Zml4LW9wZXJhdG9yPipcbiAgICpcbiAgICogPHN5bWJvbD4gOjo9XG4gICAqICAoPHN5bWJvbC1pZD4gfCAoPGxhdGV4LWNvbW1hbmQ+PGxhdGV4LWFyZ3VtZW50cz4pKSA8YXJndW1lbnRzPlxuICAgKlxuICAgKiA8bWF0Y2hmaXgtZXhwcj4gOj1cbiAgICogIDxtYXRjaGZpeC1vcC1vcGVuPlxuICAgKiAgPGV4cHJlc3Npb24+XG4gICAqICAoPG1hdGNoZml4LW9wLXNlcGFyYXRvcj4gPGV4cHJlc3Npb24+KSpcbiAgICogIDxtYXRjaGZpeC1vcC1jbG9zZT5cbiAgICpcbiAgICovXG4gIHBhcnNlUHJpbWFyeSh1bnRpbCkge1xuICAgIGlmICh0aGlzLmF0Qm91bmRhcnkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpKVxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJ1bmV4cGVjdGVkLWNsb3NpbmctZGVsaW1pdGVyXCIsIHN0YXJ0KTtcbiAgICBpZiAodGhpcy5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oe1xuICAgICAgICBtaW5QcmVjOiAwLFxuICAgICAgICBjb25kaXRpb246IChwKSA9PiBwLnBlZWsgPT09IFwiPH0+XCJcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJleHBlY3RlZC1leHByZXNzaW9uXCIsIHN0YXJ0KTtcbiAgICAgIGlmICghdGhpcy5tYXRjaChcIjx9PlwiKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShcbiAgICAgICAgICBbXCJTZXF1ZW5jZVwiLCByZXN1bHQsIHRoaXMuZXJyb3IoXCJleHBlY3RlZC1jbG9zaW5nLWRlbGltaXRlclwiLCBzdGFydCldLFxuICAgICAgICAgIHN0YXJ0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bSA9IHRoaXMucGFyc2VOdW1iZXIoKTtcbiAgICAgIGlmIChudW0gIT09IG51bGwpXG4gICAgICAgIHJlc3VsdCA9IHsgbnVtIH07XG4gICAgfVxuICAgIHJlc3VsdCA/PyAocmVzdWx0ID0gdGhpcy5wYXJzZUVuY2xvc3VyZSgpKTtcbiAgICByZXN1bHQgPz8gKHJlc3VsdCA9IHRoaXMucGFyc2VFbnZpcm9ubWVudCh1bnRpbCkpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgdGhpcy5tYXRjaEFsbCh0aGlzLl9wb3NpdGl2ZUluZmluaXR5VG9rZW5zKSlcbiAgICAgIHJlc3VsdCA9IHsgbnVtOiBcIitJbmZpbml0eVwiIH07XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiB0aGlzLm1hdGNoQWxsKHRoaXMuX25lZ2F0aXZlSW5maW5pdHlUb2tlbnMpKVxuICAgICAgcmVzdWx0ID0geyBudW06IFwiLUluZmluaXR5XCIgfTtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsICYmIHRoaXMubWF0Y2hBbGwodGhpcy5fbm90QU51bWJlclRva2VucykpXG4gICAgICByZXN1bHQgPSB7IG51bTogXCJOYU5cIiB9O1xuICAgIHJlc3VsdCA/PyAocmVzdWx0ID0gdGhpcy5wYXJzZUdlbmVyaWNFeHByZXNzaW9uKHVudGlsKSA/PyB0aGlzLnBhcnNlRnVuY3Rpb24odW50aWwpID8/IHRoaXMucGFyc2VTeW1ib2wodW50aWwpID8/IHBhcnNlSW52YWxpZElkZW50aWZpZXIodGhpcykpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZGVjb3JhdGUocmVzdWx0LCBzdGFydCk7XG4gICAgICBsZXQgcG9zdGZpeCA9IG51bGw7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgZG8ge1xuICAgICAgICBwb3N0Zml4ID0gdGhpcy5wYXJzZVBvc3RmaXhPcGVyYXRvcihyZXN1bHQsIHVudGlsKTtcbiAgICAgICAgcmVzdWx0ID0gcG9zdGZpeCA/PyByZXN1bHQ7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSBpbmRleCAmJiBwb3N0Zml4ICE9PSBudWxsKSB7XG4gICAgICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHRoaXMuaW5kZXggIT09IGluZGV4LCBcIk5vIHRva2VuIGNvbnN1bWVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIH0gd2hpbGUgKHBvc3RmaXggIT09IG51bGwpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZVN1cHN1YihyZXN1bHQpO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHJlc3VsdCwgc3RhcnQpO1xuICB9XG4gIC8qKlxuICAgKiAgUGFyc2UgYW4gZXhwcmVzc2lvbjpcbiAgICpcbiAgICogPGV4cHJlc3Npb24+IDo6PVxuICAgKiAgfCA8cHJpbWFyeT5cbiAgICogIHwgPHByZWZpeC1vcD4gPHByaW1hcnk+XG4gICAqICB8IDxwcmltYXJ5PiA8aW5maXgtb3A+IDxleHByZXNzaW9uPlxuICAgKlxuICAgKiBTdG9wIHdoZW4gYW4gb3BlcmF0b3Igb2YgcHJlY2VkZW5jZSBsZXNzIHRoYW4gYHVudGlsLm1pblByZWNgXG4gICAqIGlzIGVuY291bnRlcmVkXG4gICAqL1xuICBwYXJzZUV4cHJlc3Npb24odW50aWwpIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICBpZiAodGhpcy5hdEJvdW5kYXJ5KSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdW50aWwgPz8gKHVudGlsID0geyBtaW5QcmVjOiAwIH0pO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh1bnRpbC5taW5QcmVjICE9PSB2b2lkIDApO1xuICAgIGlmICh1bnRpbC5taW5QcmVjID09PSB2b2lkIDApXG4gICAgICB1bnRpbCA9IHsgLi4udW50aWwsIG1pblByZWM6IDAgfTtcbiAgICBsZXQgbGhzID0gdGhpcy5wYXJzZVByZWZpeE9wZXJhdG9yKHsgLi4udW50aWwsIG1pblByZWM6IDAgfSk7XG4gICAgaWYgKGxocyA9PT0gbnVsbCkge1xuICAgICAgbGhzID0gdGhpcy5wYXJzZVByaW1hcnkodW50aWwpO1xuICAgICAgaWYgKGhlYWQobGhzKSA9PT0gXCJTZXF1ZW5jZVwiICYmIG5vcHMobGhzKSA9PT0gMClcbiAgICAgICAgbGhzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxocykge1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHdoaWxlICghZG9uZSAmJiAhdGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcnNlSW5maXhPcGVyYXRvcihsaHMsIHVudGlsKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYXBwbHlJbnZpc2libGVPcGVyYXRvcih1bnRpbCwgbGhzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbGhzID0gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxocyA/PyAobGhzID0gdGhpcy5wYXJzZVVuZXhwZWN0ZWRMYXRleENvbW1hbmQoKSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUobGhzLCBzdGFydCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBMYVRlWCBvciBvdGhlciByZXF1ZXN0ZWQgbWV0YWRhdGEgdG8gdGhlIGV4cHJlc3Npb25cbiAgICovXG4gIGRlY29yYXRlKGV4cHIsIHN0YXJ0KSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wcmVzZXJ2ZUxhdGV4KVxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgY29uc3QgbGF0ZXggPSB0aGlzLmxhdGV4KHN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgICAgZXhwciA9IHsgbGF0ZXgsIGZuOiBleHByIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZXhwciA9IHsgbGF0ZXgsIG51bTogTnVtYmVyKGV4cHIpLnRvU3RyaW5nKCkgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBleHByID0geyBsYXRleCwgc3ltOiBleHByIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByICE9PSBudWxsKSB7XG4gICAgICBleHByLmxhdGV4ID0gbGF0ZXg7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG4gIGVycm9yKGNvZGUsIGZyb21Ub2tlbikge1xuICAgIGxldCBtc2c7XG4gICAgaWYgKHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoIWNvZGUuc3RhcnRzV2l0aChcIidcIikpO1xuICAgICAgbXNnID0geyBzdHI6IGNvZGUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KCFjb2RlWzBdLnN0YXJ0c1dpdGgoXCInXCIpKTtcbiAgICAgIG1zZyA9IFtcIkVycm9yQ29kZVwiLCB7IHN0cjogY29kZVswXSB9LCAuLi5jb2RlLnNsaWNlKDEpXTtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXggPSB0aGlzLmxhdGV4KGZyb21Ub2tlbiwgdGhpcy5pbmRleCk7XG4gICAgcmV0dXJuIGxhdGV4ID8gW1wiRXJyb3JcIiwgbXNnLCBbXCJMYXRleFwiLCB7IHN0cjogbGF0ZXggfV1dIDogW1wiRXJyb3JcIiwgbXNnXTtcbiAgfVxuICBpc0Z1bmN0aW9uSGVhZChleHByKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcyA9IHN5bWJvbChleHByKTtcbiAgICBpZiAoIXMpXG4gICAgICByZXR1cm4gdGhpcy5jb21wdXRlRW5naW5lLmJveChleHByKS5kb21haW4uaXNGdW5jdGlvbjtcbiAgICBpZiAodGhpcy5jb21wdXRlRW5naW5lICYmIHRoaXMuY29tcHV0ZUVuZ2luZS5sb29rdXBGdW5jdGlvbihzKSAhPT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZVVua25vd25JZGVudGlmaWVyPy4ocywgdGhpcykgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogUmV0dXJuIGFsbCBkZWZzIG9mIHRoZSBzcGVjaWZpZWQga2luZCAqL1xuICAqZ2V0RGVmcyhraW5kKSB7XG4gICAgaWYgKGtpbmQgPT09IFwib3BlcmF0b3JcIikge1xuICAgICAgZm9yIChjb25zdCBkZWYgb2YgdGhpcy5fZGljdGlvbmFyeS5kZWZzKVxuICAgICAgICBpZiAoL15wcmVmaXh8aW5maXh8cG9zdGZpeC8udGVzdChkZWYua2luZCkpXG4gICAgICAgICAgeWllbGQgZGVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRlZiBvZiB0aGlzLl9kaWN0aW9uYXJ5LmRlZnMpXG4gICAgICAgIGlmIChkZWYua2luZCA9PT0ga2luZClcbiAgICAgICAgICB5aWVsZCBkZWY7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcGFyc2VDb21wbGV4SWQocGFyc2VyLCBpZCkge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcGFyc2VJZGVudGlmaWVyKHBhcnNlcik/LnRyaW0oKTtcbiAgaWYgKGNhbmRpZGF0ZSA9PT0gbnVsbClcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgcmVzdWx0ID0gY2FuZGlkYXRlICE9PSBpZCA/IDAgOiBwYXJzZXIuaW5kZXggLSBzdGFydDtcbiAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvc2VyaWFsaXplLW51bWJlci50c1xuZnVuY3Rpb24gZm9ybWF0RnJhY3Rpb25hbFBhcnQobSwgb3B0aW9ucykge1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG0ubGVuZ3RoO1xuICBjb25zdCBvcmlnaW5hbE0gPSBtO1xuICBpZiAob3B0aW9ucy5iZWdpblJlcGVhdGluZ0RpZ2l0cyAmJiBvcHRpb25zLmVuZFJlcGVhdGluZ0RpZ2l0cykge1xuICAgIG0gPSBtLnNsaWNlKDAsIC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubGVuZ3RoIC0gMTY7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gbS5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE3OyBqKyspIHtcbiAgICAgICAgY29uc3QgY3ljbGUgPSBtLnN1YnN0cmluZyhpLCBpICsgaiArIDEpO1xuICAgICAgICBjb25zdCB0aW1lcyA9IE1hdGguZmxvb3IoKG0ubGVuZ3RoIC0gb2Zmc2V0Lmxlbmd0aCkgLyBjeWNsZS5sZW5ndGgpO1xuICAgICAgICBpZiAodGltZXMgPD0gMylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKChvZmZzZXQgKyBjeWNsZS5yZXBlYXQodGltZXMgKyAxKSkuc3RhcnRzV2l0aChtKSkge1xuICAgICAgICAgIGlmIChjeWNsZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZzZXQucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZmZzZXQucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcikgKyBvcHRpb25zLmJlZ2luUmVwZWF0aW5nRGlnaXRzICsgY3ljbGUgKyBvcHRpb25zLmVuZFJlcGVhdGluZ0RpZ2l0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleHRyYURpZ2l0cyA9IG9yaWdpbmFsTGVuZ3RoID4gb3B0aW9ucy5wcmVjaXNpb24gLSAxO1xuICBtID0gb3JpZ2luYWxNO1xuICBpZiAoZXh0cmFEaWdpdHMpXG4gICAgbSA9IG0uc3Vic3RyaW5nKDAsIG9wdGlvbnMucHJlY2lzaW9uIC0gMSk7XG4gIGlmIChvcHRpb25zLmdyb3VwU2VwYXJhdG9yKSB7XG4gICAgbSA9IG0ucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcik7XG4gICAgaWYgKG0uZW5kc1dpdGgob3B0aW9ucy5ncm91cFNlcGFyYXRvcikpIHtcbiAgICAgIG0gPSBtLnNsaWNlKDAsIC1vcHRpb25zLmdyb3VwU2VwYXJhdG9yLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIGlmIChleHRyYURpZ2l0cylcbiAgICByZXR1cm4gbSArIG9wdGlvbnMudHJ1bmNhdGlvbk1hcmtlcjtcbiAgcmV0dXJuIG07XG59XG5mdW5jdGlvbiBmb3JtYXRFeHBvbmVudChleHAyLCBvcHRpb25zKSB7XG4gIGlmICghZXhwMilcbiAgICByZXR1cm4gXCJcIjtcbiAgaWYgKG9wdGlvbnMuYmVnaW5FeHBvbmVudE1hcmtlcikge1xuICAgIHJldHVybiBvcHRpb25zLmJlZ2luRXhwb25lbnRNYXJrZXIgKyBleHAyICsgKG9wdGlvbnMuZW5kRXhwb25lbnRNYXJrZXIgPz8gXCJcIik7XG4gIH1cbiAgcmV0dXJuIFwiMTBee1wiICsgZXhwMiArIFwifVwiO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKGV4cHIsIG9wdGlvbnMpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGxldCBudW07XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIikge1xuICAgIG51bSA9IGV4cHI7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBleHByKSB7XG4gICAgbnVtID0gZXhwci5udW07XG4gIH0gZWxzZVxuICAgIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChudW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpdmVJbmZpbml0eTtcbiAgICBlbHNlIGlmIChudW0gPT09IC1JbmZpbml0eSlcbiAgICAgIHJldHVybiBvcHRpb25zLm5lZ2F0aXZlSW5maW5pdHk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzTmFOKG51bSkpXG4gICAgICByZXR1cm4gb3B0aW9ucy5ub3RBTnVtYmVyO1xuICAgIGxldCByZXN1bHQyID0gdm9pZCAwO1xuICAgIGlmIChvcHRpb25zLm5vdGF0aW9uID09PSBcImVuZ2luZWVyaW5nXCIpXG4gICAgICByZXN1bHQyID0gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKFxuICAgICAgICBudW0udG9FeHBvbmVudGlhbCgpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAzXG4gICAgICApO1xuICAgIGVsc2UgaWYgKG9wdGlvbnMubm90YXRpb24gPT09IFwic2NpZW50aWZpY1wiKVxuICAgICAgcmVzdWx0MiA9IHNlcmlhbGl6ZVNjaWVudGlmaWNOb3RhdGlvbk51bWJlcihudW0udG9FeHBvbmVudGlhbCgpLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0MiA/PyBzZXJpYWxpemVBdXRvTm90YXRpb25OdW1iZXIobnVtLnRvU3RyaW5nKCksIG9wdGlvbnMpO1xuICB9XG4gIG51bSA9IG51bS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tcXHUwMDA5LVxcdTAwMGRcXHUwMDIwXFx1MDBhMF0vZywgXCJcIik7XG4gIGlmIChudW0gPT09IFwiaW5maW5pdHlcIiB8fCBudW0gPT09IFwiK2luZmluaXR5XCIpXG4gICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpdmVJbmZpbml0eTtcbiAgZWxzZSBpZiAobnVtID09PSBcIi1pbmZpbml0eVwiKVxuICAgIHJldHVybiBvcHRpb25zLm5lZ2F0aXZlSW5maW5pdHk7XG4gIGVsc2UgaWYgKG51bSA9PT0gXCJuYW5cIilcbiAgICByZXR1cm4gb3B0aW9ucy5ub3RBTnVtYmVyO1xuICBpZiAoIS9eWy0rXFwuXT9bMC05XS8udGVzdChudW0pKVxuICAgIHJldHVybiBcIlwiO1xuICBudW0gPSBudW0ucmVwbGFjZSgvW25kXSQvLCBcIlwiKTtcbiAgaWYgKC9cXChbMC05XStcXCkvLnRlc3QobnVtKSkge1xuICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IG51bS5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4qKSQvKSA/PyBbXTtcbiAgICBudW0gPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwob3B0aW9ucy5wcmVjaXNpb24gLyByZXBlYXQubGVuZ3RoKSkgKyB0cmFpbDtcbiAgfVxuICBsZXQgc2lnbjIgPSBcIlwiO1xuICBpZiAobnVtWzBdID09PSBcIi1cIikge1xuICAgIHNpZ24yID0gXCItXCI7XG4gICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTtcbiAgfSBlbHNlIGlmIChudW1bMF0gPT09IFwiK1wiKSB7XG4gICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTtcbiAgfVxuICB3aGlsZSAobnVtWzBdID09PSBcIjBcIilcbiAgICBudW0gPSBudW0uc3Vic3RyaW5nKDEpO1xuICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICBudW0gPSBcIjBcIjtcbiAgZWxzZSBpZiAobnVtWzBdID09PSBcIi5cIilcbiAgICBudW0gPSBcIjBcIiArIG51bTtcbiAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgaWYgKG9wdGlvbnMubm90YXRpb24gPT09IFwiZW5naW5lZXJpbmdcIilcbiAgICByZXN1bHQgPSBzZXJpYWxpemVTY2llbnRpZmljTm90YXRpb25OdW1iZXIobnVtLCBvcHRpb25zLCAzKTtcbiAgZWxzZSBpZiAob3B0aW9ucy5ub3RhdGlvbiA9PT0gXCJzY2llbnRpZmljXCIpXG4gICAgcmVzdWx0ID0gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKG51bSwgb3B0aW9ucyk7XG4gIHJldHVybiBzaWduMiArIChyZXN1bHQgPz8gc2VyaWFsaXplQXV0b05vdGF0aW9uTnVtYmVyKG51bSwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKHZhbFN0cmluZywgb3B0aW9ucywgZXhwTXVsdGlwbGUgPSAxKSB7XG4gIGxldCBtID0gdmFsU3RyaW5nLm1hdGNoKC9eKC4qKVtlfEVdKFstK10/WzAtOV0rKSQvKTtcbiAgaWYgKCFtKSB7XG4gICAgbGV0IHNpZ24yID0gXCJcIjtcbiAgICBpZiAodmFsU3RyaW5nWzBdID09PSBcIi1cIikge1xuICAgICAgc2lnbjIgPSBcIi1cIjtcbiAgICAgIHZhbFN0cmluZyA9IHZhbFN0cmluZy5zdWJzdHJpbmcoMSk7XG4gICAgfSBlbHNlIGlmICh2YWxTdHJpbmdbMF0gPT09IFwiK1wiKSB7XG4gICAgICB2YWxTdHJpbmcgPSB2YWxTdHJpbmcuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBpZiAodmFsU3RyaW5nLmluZGV4T2YoXCIuXCIpIDwgMCkge1xuICAgICAgaWYgKHZhbFN0cmluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsU3RyaW5nID0gc2lnbjIgKyB2YWxTdHJpbmcgKyBcImUrMFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsU3RyaW5nID0gc2lnbjIgKyB2YWxTdHJpbmdbMF0gKyBcIi5cIiArIHZhbFN0cmluZy5zbGljZSgxKSArIFwiZStcIiArICh2YWxTdHJpbmcubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IFtfLCB3aG9sZSwgZnJhY3Rpb25dID0gdmFsU3RyaW5nLm1hdGNoKC9eKC4qKVxcLiguKikkLyk7XG4gICAgICBpZiAoIWZyYWN0aW9uKVxuICAgICAgICBmcmFjdGlvbiA9IFwiXCI7XG4gICAgICB3aGlsZSAod2hvbGUuc3RhcnRzV2l0aChcIjBcIikpXG4gICAgICAgIHdob2xlID0gd2hvbGUuc3Vic3RyaW5nKDEpO1xuICAgICAgaWYgKCF3aG9sZSkge1xuICAgICAgICB2YWxTdHJpbmcgPSBzaWduMiArIFwiMC5cIiArIGZyYWN0aW9uICsgXCJlKzBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbFN0cmluZyA9IHNpZ24yICsgd2hvbGVbMF0gKyBcIi5cIiArIHdob2xlLnNsaWNlKDEpICsgZnJhY3Rpb24gKyBcImUrXCIgKyAod2hvbGUubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbSA9IHZhbFN0cmluZy5tYXRjaCgvXiguKilbZXxFXShbLStdP1swLTldKykkLyk7XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG0pO1xuICBpZiAoIW0pXG4gICAgcmV0dXJuIHNlcmlhbGl6ZUF1dG9Ob3RhdGlvbk51bWJlcih2YWxTdHJpbmcsIG9wdGlvbnMpO1xuICBsZXQgZXhwb25lbnQgPSBwYXJzZUludChtWzJdKTtcbiAgbGV0IG1hbnRpc3NhID0gbVsxXTtcbiAgaWYgKE1hdGguYWJzKGV4cG9uZW50KSAlIGV4cE11bHRpcGxlICE9PSAwKSB7XG4gICAgY29uc3QgYWRqdXN0ID0gZXhwb25lbnQgPiAwID8gZXhwb25lbnQgJSBleHBNdWx0aXBsZSA6IC0oKGV4cE11bHRpcGxlICsgZXhwb25lbnQpICUgZXhwTXVsdGlwbGUpO1xuICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj0gMCA/IGV4cG9uZW50IC0gYWRqdXN0IDogZXhwb25lbnQgKyBhZGp1c3Q7XG4gICAgbGV0IFtfLCB3aG9sZSwgZnJhY3Rpb25dID0gbWFudGlzc2EubWF0Y2goL14oLiopXFwuKC4qKSQvKSA/PyBbXG4gICAgICBcIlwiLFxuICAgICAgbWFudGlzc2EsXG4gICAgICBcIlwiXG4gICAgXTtcbiAgICBtYW50aXNzYSA9IHdob2xlICsgKGZyYWN0aW9uICsgXCIwMDAwMDAwMDAwMDAwMDAwMFwiKS5zbGljZSgwLCBNYXRoLmFicyhhZGp1c3QpKSArIFwiLlwiICsgZnJhY3Rpb24uc2xpY2UoTWF0aC5hYnMoYWRqdXN0KSk7XG4gIH1cbiAgY29uc3QgYXZvaWQgPSBvcHRpb25zLmF2b2lkRXhwb25lbnRzSW5SYW5nZTtcbiAgaWYgKGF2b2lkICYmIGV4cG9uZW50ID49IGF2b2lkWzBdICYmIGV4cG9uZW50IDw9IGF2b2lkWzFdKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCBmcmFjdGlvbmFsUGFydCA9IFwiXCI7XG4gIGxldCB3aG9sZVBhcnQgPSBtYW50aXNzYTtcbiAgbSA9IHdob2xlUGFydC5tYXRjaCgvXiguKilcXC4oLiopJC8pO1xuICBpZiAobSkge1xuICAgIHdob2xlUGFydCA9IG1bMV07XG4gICAgZnJhY3Rpb25hbFBhcnQgPSBtWzJdO1xuICB9XG4gIGNvbnN0IGV4cFN0cmluZyA9IGV4cG9uZW50ICE9PSAwID8gZm9ybWF0RXhwb25lbnQoTnVtYmVyKGV4cG9uZW50KS50b1N0cmluZygpLCBvcHRpb25zKSA6IFwiXCI7XG4gIGlmIChvcHRpb25zLmdyb3VwU2VwYXJhdG9yKSB7XG4gICAgd2hvbGVQYXJ0ID0gd2hvbGVQYXJ0LnJlcGxhY2UoXG4gICAgICAvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcbiAgICAgIG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3JcbiAgICApO1xuICAgIGZyYWN0aW9uYWxQYXJ0ID0gZm9ybWF0RnJhY3Rpb25hbFBhcnQoZnJhY3Rpb25hbFBhcnQsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChmcmFjdGlvbmFsUGFydClcbiAgICBmcmFjdGlvbmFsUGFydCA9IG9wdGlvbnMuZGVjaW1hbE1hcmtlciArIGZyYWN0aW9uYWxQYXJ0O1xuICBpZiAoIWV4cFN0cmluZylcbiAgICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQ7XG4gIGlmICh3aG9sZVBhcnQgPT09IFwiMVwiICYmICFmcmFjdGlvbmFsUGFydClcbiAgICByZXR1cm4gZXhwU3RyaW5nO1xuICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQgKyBvcHRpb25zLmV4cG9uZW50UHJvZHVjdCArIGV4cFN0cmluZztcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUF1dG9Ob3RhdGlvbk51bWJlcih2YWxTdHJpbmcsIG9wdGlvbnMpIHtcbiAgbGV0IG0gPSB2YWxTdHJpbmcubWF0Y2goL14oLiopW2V8RV0oWy0rXT9bMC05XSspJC9pKTtcbiAgbGV0IGV4cG9uZW50ID0gdm9pZCAwO1xuICBpZiAobT8uWzFdICYmIG1bMl0pIHtcbiAgICBleHBvbmVudCA9IGZvcm1hdEV4cG9uZW50KG1bMl0sIG9wdGlvbnMpO1xuICB9XG4gIGxldCB3aG9sZVBhcnQgPSBtPy5bMV0gPz8gdmFsU3RyaW5nO1xuICBsZXQgZnJhY3Rpb25hbFBhcnQgPSBcIlwiO1xuICBtID0gKGV4cG9uZW50ID8gbVsxXSA6IHZhbFN0cmluZykubWF0Y2goL14oLiopXFwuKC4qKSQvKTtcbiAgaWYgKG0/LlsxXSAmJiBtWzJdKSB7XG4gICAgd2hvbGVQYXJ0ID0gbVsxXTtcbiAgICBmcmFjdGlvbmFsUGFydCA9IG1bMl07XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICB3aG9sZVBhcnQgPSB3aG9sZVBhcnQucmVwbGFjZShcbiAgICAgIC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFxuICAgICAgb3B0aW9ucy5ncm91cFNlcGFyYXRvclxuICAgICk7XG4gICAgZnJhY3Rpb25hbFBhcnQgPSBmb3JtYXRGcmFjdGlvbmFsUGFydChmcmFjdGlvbmFsUGFydCwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGZyYWN0aW9uYWxQYXJ0KVxuICAgIGZyYWN0aW9uYWxQYXJ0ID0gb3B0aW9ucy5kZWNpbWFsTWFya2VyICsgZnJhY3Rpb25hbFBhcnQ7XG4gIGlmICghZXhwb25lbnQpXG4gICAgcmV0dXJuIHdob2xlUGFydCArIGZyYWN0aW9uYWxQYXJ0O1xuICBpZiAod2hvbGVQYXJ0ID09PSBcIjFcIiAmJiAhZnJhY3Rpb25hbFBhcnQpXG4gICAgcmV0dXJuIGV4cG9uZW50O1xuICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQgKyBvcHRpb25zLmV4cG9uZW50UHJvZHVjdCArIGV4cG9uZW50O1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L3NlcmlhbGl6ZXIudHNcbnZhciBBQ0NFTlRfTU9ESUZJRVJTID0ge1xuICBkZWc6IChzKSA9PiBgJHtzfVxcXFxkZWdyZWVgLFxuICBwcmltZTogKHMpID0+IGAke3N9XntcXFxccHJpbWV9YCxcbiAgZHByaW1lOiAocykgPT4gYCR7c31ee1xcXFxkb3VibGVwcmltZX1gLFxuICByaW5nOiAocykgPT4gYFxcXFxtYXRocmluZ3ske3N9fWAsXG4gIGhhdDogKHMpID0+IGBcXFxcaGF0eyR7c319YCxcbiAgdGlsZGU6IChzKSA9PiBgXFxcXHRpbGRleyR7c319YCxcbiAgdmVjOiAocykgPT4gYFxcXFx2ZWN7JHtzfX1gLFxuICBiYXI6IChzKSA9PiBgXFxcXG92ZXJsaW5leyR7c319YCxcbiAgdW5kZXJiYXI6IChzKSA9PiBgXFxcXHVuZGVybGluZXske3N9fWAsXG4gIGRvdDogKHMpID0+IGBcXFxcZG90eyR7c319YCxcbiAgZGRvdDogKHMpID0+IGBcXFxcZGRvdHske3N9fWAsXG4gIHRkb3Q6IChzKSA9PiBgXFxcXGRkZG90eyR7c319YCxcbiAgcWRvdDogKHMpID0+IGBcXFxcZGRkZG90eyR7c319YCxcbiAgLy8gU3VwcGxlbWVudGFsXG4gIGFjdXRlOiAocykgPT4gYFxcXFxhY3V0ZXske3N9fWAsXG4gIGdyYXZlOiAocykgPT4gYFxcXFxncmF2ZXske3N9fWAsXG4gIGJyZXZlOiAocykgPT4gYFxcXFxicmV2ZXske3N9fWAsXG4gIGNoZWNrOiAocykgPT4gYFxcXFxjaGVja3ske3N9fWBcbn07XG52YXIgU1RZTEVfTU9ESUZJRVJTID0ge1xuICB1cHJpZ2h0OiAocykgPT4gYFxcXFxtYXRocm17JHtzfX1gLFxuICBpdGFsaWM6IChzKSA9PiBgXFxcXG1hdGhpdHske3N9fWAsXG4gIGJvbGQ6IChzKSA9PiBgXFxcXG1hdGhiZnske3N9fWAsXG4gIHNjcmlwdDogKHMpID0+IGBcXFxcbWF0aHNjcnske3N9fWAsXG4gIGZyYWt0dXI6IChzKSA9PiBgXFxcXG1hdGhmcmFreyR7c319YCxcbiAgLy8gTm90ZSBVbmljb2RlIHVzZXMgJ2ZyYWt0dXInIGZvciAnZ290aGljJ1xuICBkb3VibGVzdHJ1Y2s6IChzKSA9PiBgXFxcXG1hdGhiYnske3N9fWAsXG4gIC8vIFVuaWNvZGUgdXNlcyAnZG91YmxlLXN0cnVjaycgZm9yICdibGFja2JvYXJkJ1xuICAvLyBTdXBwbGVtZW50YWxcbiAgYmxhY2tib2FyZDogKHMpID0+IGBcXFxcbWF0aGJieyR7c319YCxcbiAgY2FsbGlncmFwaGljOiAocykgPT4gYFxcXFxtYXRoY2FseyR7c319YCxcbiAgZ290aGljOiAocykgPT4gYFxcXFxtYXRoZnJha3ske3N9fWAsXG4gIHNhbnNzZXJpZjogKHMpID0+IGBcXFxcbWF0aHNmeyR7c319YCxcbiAgbW9ub3NwYWNlOiAocykgPT4gYFxcXFxtYXRodHR7JHtzfX1gXG59O1xudmFyIFNlcmlhbGl6ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGRpY3Rpb25hcnkyLCBvbkVycm9yKSB7XG4gICAgdGhpcy5sZXZlbCA9IC0xO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMuaW52aXNpYmxlTXVsdGlwbHkpIHtcbiAgICAgIGlmICghLyMxLy50ZXN0KG9wdGlvbnMuaW52aXNpYmxlTXVsdGlwbHkpIHx8ICEvIzIvLnRlc3Qob3B0aW9ucy5pbnZpc2libGVNdWx0aXBseSkpIHtcbiAgICAgICAgb25FcnJvcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogW1wiZXhwZWN0ZWQtYXJndW1lbnRcIiwgXCJpbnZpc2libGVNdWx0aXBseVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG4gICAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTI7XG4gICAgdGhpcy5jYW5vbmljYWwgPSB2b2lkIDA7XG4gIH1cbiAgdXBkYXRlT3B0aW9ucyhvcHQpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5vcHRpb25zKSlcbiAgICAgIGlmIChrIGluIG9wdClcbiAgICAgICAgdGhpcy5vcHRpb25zW2tdID0gb3B0W2tdO1xuICB9XG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGV4cHJlc3Npb24sIGFuZCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhbiBvcGVyYXRvclxuICAgKiBvZiBwcmVjZWRlbmNlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmVjLCB3cmFwIGl0IGluIHNvbWUgcGFyZW4uXG4gICAqIEB0b2RvOiBkb24ndCB3cmFwIEFicywgRmxvb3IsIENlaWwsIERlbGltaXRlclxuICAgKi9cbiAgd3JhcChleHByLCBwcmVjKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICBpZiAocHJlYyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICB0aGlzLnNlcmlhbGl6ZShleHByKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgdGhpcy5sZXZlbCArIDEpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cHIgPT09IFwibnVtYmVyXCIgfHwgaXNOdW1iZXJPYmplY3QoZXhwcikgfHwgdHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIgfHwgaXNTeW1ib2xPYmplY3QoZXhwcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZShleHByKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGhlYWQoZXhwcik7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUgIT09IFwiRGVsaW1pdGVyXCIgJiYgbmFtZSAhPT0gXCJTdWJzY3JpcHRcIikge1xuICAgICAgY29uc3QgZGVmID0gdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQobmFtZSk7XG4gICAgICBpZiAoZGVmICYmIChkZWYua2luZCA9PT0gXCJzeW1ib2xcIiB8fCBkZWYua2luZCA9PT0gXCJwcmVmaXhcIiB8fCBkZWYua2luZCA9PT0gXCJpbmZpeFwiIHx8IGRlZi5raW5kID09PSBcInBvc3RmaXhcIikgJiYgZGVmLnByZWNlZGVuY2UgPCBwcmVjKVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICAgIHRoaXMuc2VyaWFsaXplKGV4cHIpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKGV4cHIpO1xuICB9XG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgXCJzaG9ydFwiIGV4cHJlc3Npb24sIHdyYXAgaXQuXG4gICAqIERvIG5vdCB3cmFwIGlkZW50aWZpZXJzLCBwb3NpdGl2ZSBudW1iZXJzIG9yIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHNlcmlhbGl6ZXIgZm9yIHBvd2VyIGFuZCBkaXZpc2lvbiAoaS5lLiBcIihhKzEpL2JcIilcbiAgICpcbiAgICovXG4gIHdyYXBTaG9ydChleHByKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBleHByU3RyID0gdGhpcy5zZXJpYWxpemUoZXhwcik7XG4gICAgaWYgKHN5bWJvbChleHByKSAhPT0gbnVsbClcbiAgICAgIHJldHVybiBleHByU3RyO1xuICAgIGlmIChoZWFkKGV4cHIpID09PSBcIkRlbGltaXRlclwiICYmIG5vcHMoZXhwcikgPT09IDEpXG4gICAgICByZXR1cm4gZXhwclN0cjtcbiAgICBjb25zdCBpc051bSA9IGlzTnVtYmVyRXhwcmVzc2lvbihleHByKTtcbiAgICBpZiAoaXNOdW0gJiYgIS9eKC18XFwuKS8udGVzdChleHByU3RyKSlcbiAgICAgIHJldHVybiBleHByU3RyO1xuICAgIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICAgIGlmIChoICE9PSBcIkFkZFwiICYmIGggIT09IFwiTmVnYXRlXCIgJiYgaCAhPT0gXCJTdWJ0cmFjdFwiICYmIGggIT09IFwiUGx1c01pbnVzXCIgJiYgaCAhPT0gXCJNdWx0aXBseVwiKVxuICAgICAgcmV0dXJuIGV4cHJTdHI7XG4gICAgcmV0dXJuIHRoaXMud3JhcFN0cmluZyhcbiAgICAgIGV4cHJTdHIsXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JvdXBTdHlsZShleHByLCB0aGlzLmxldmVsICsgMSlcbiAgICApO1xuICB9XG4gIHdyYXBTdHJpbmcocywgc3R5bGUsIGZlbmNlKSB7XG4gICAgaWYgKHN0eWxlID09PSBcIm5vbmVcIilcbiAgICAgIHJldHVybiBzO1xuICAgIGlmIChmZW5jZSA9PT0gdm9pZCAwKVxuICAgICAgZmVuY2UgPSBcIigpXCI7XG4gICAgY29uc3Qgb3BlbkZlbmNlID0gZmVuY2U/LlswXSA/PyBcIi5cIjtcbiAgICBjb25zdCBjbG9zZUZlbmNlID0gZmVuY2U/LlsxXSA/PyBcIi5cIjtcbiAgICBpZiAoKG9wZW5GZW5jZSA9PT0gXCIuXCIgfHwgY2xvc2VGZW5jZSA9PT0gXCIuXCIpICYmIHN0eWxlID09PSBcInBhcmVuXCIpXG4gICAgICBzdHlsZSA9IFwibGVmdHJpZ2h0XCI7XG4gICAgaWYgKHN0eWxlID09PSBcImxlZnRyaWdodFwiKVxuICAgICAgcmV0dXJuIGBcXFxcbGVmdCR7b3BlbkZlbmNlfSR7c31cXFxccmlnaHQke2Nsb3NlRmVuY2V9fWA7XG4gICAgaWYgKHN0eWxlID09PSBcImJpZ1wiKVxuICAgICAgcmV0dXJuIGAke29wZW5GZW5jZSA9PT0gXCIuXCIgPyBcIlwiIDogYFxcXFxCaWdsJHtvcGVuRmVuY2V9YH0ke3N9JHtjbG9zZUZlbmNlID09PSBcIi5cIiA/IFwiXCIgOiBgXFxcXEJpZ3Ike2Nsb3NlRmVuY2V9YH0pYDtcbiAgICByZXR1cm4gb3BlbkZlbmNlICsgcyArIGNsb3NlRmVuY2U7XG4gIH1cbiAgd3JhcEFyZ3VtZW50cyhleHByKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcFN0cmluZyhcbiAgICAgIChvcHMoZXhwcikgPz8gW10pLm1hcCgoeCkgPT4gdGhpcy5zZXJpYWxpemUoeCkpLmpvaW4oXCIsIFwiKSxcbiAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICApO1xuICB9XG4gIHNlcmlhbGl6ZVN5bWJvbChleHByLCBkZWYpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIgfHwgaXNTeW1ib2xPYmplY3QoZXhwcikpO1xuICAgIGlmIChkZWY/LmtpbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUlkZW50aWZpZXIoc3ltYm9sKGV4cHIpID8/IFwiXCIpID8/IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBkZWY/LnNlcmlhbGl6ZT8uKHRoaXMsIGV4cHIpID8/IHNlcmlhbGl6ZUlkZW50aWZpZXIoc3ltYm9sKGV4cHIpKSA/PyBcIlwiO1xuICB9XG4gIHNlcmlhbGl6ZUZ1bmN0aW9uKGV4cHIsIGRlZikge1xuICAgIGlmIChkZWY/LnNlcmlhbGl6ZSlcbiAgICAgIHJldHVybiBkZWYuc2VyaWFsaXplKHRoaXMsIGV4cHIpO1xuICAgIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBzZXJpYWxpemVJZGVudGlmaWVyKGgsIFwiYXV0b1wiKSArIHRoaXMud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpID8/IFtdO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIHRoaXMuc2VyaWFsaXplKGFyZ3NbMF0pLFxuICAgICAgICBcIlxcXFxyaGRcIixcbiAgICAgICAgdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICAgIHRoaXMuc2VyaWFsaXplKGgpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICAgICAgKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5vcHRpb25zLmFwcGx5RnVuY3Rpb25TdHlsZShleHByLCB0aGlzLmxldmVsKTtcbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXG9wZXJhdG9ybmFtZXthcHBseX1cIixcbiAgICAgIHRoaXMud3JhcFN0cmluZyhcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoaCkgKyBcIiwgXCIgKyB0aGlzLnNlcmlhbGl6ZShbXCJMaXN0XCIsIC4uLmFyZ3NdKSxcbiAgICAgICAgc3R5bGVcbiAgICAgIClcbiAgICBdKTtcbiAgfVxuICBzZXJpYWxpemVEaWN0aW9uYXJ5KGRpY3QpIHtcbiAgICByZXR1cm4gYFxcXFxsZWZ0XFxcXGxicmFja1xcXFxiZWdpbnthcnJheX17bGxsfSR7T2JqZWN0LmtleXMoZGljdCkubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4gYFxcXFx0ZXh0YmZ7JHt4fX0gJiBcXFxccmlnaHRhcnJvdyAmICR7dGhpcy5zZXJpYWxpemUoZGljdFt4XSl9YDtcbiAgICB9KS5qb2luKFwiXFxcXFxcXFxcIil9XFxcXGVuZHthcnJheX1cXFxccmlnaHRcXFxccmJyYWNrYDtcbiAgfVxuICBzZXJpYWxpemUoZXhwciwgb3B0aW9ucykge1xuICAgIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgICBvcHRpb25zLmNhbm9uaWNhbCA9IHRydWU7XG4gICAgY29uc3Qgc2F2ZWRDYW5vbmljYWwgPSB0aGlzLmNhbm9uaWNhbDtcbiAgICBpZiAodGhpcy5jYW5vbmljYWwgPT09IHZvaWQgMClcbiAgICAgIHRoaXMuY2Fub25pY2FsID0gb3B0aW9ucy5jYW5vbmljYWw7XG4gICAgdGhpcy5sZXZlbCArPSAxO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSBzZXJpYWxpemVOdW1iZXIoZXhwciwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgaWYgKG51bWVyaWNWYWx1ZSlcbiAgICAgICAgICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xuICAgICAgICBjb25zdCBzID0gc3RyaW5nVmFsdWUoZXhwcik7XG4gICAgICAgIGlmIChzICE9PSBudWxsKVxuICAgICAgICAgIHJldHVybiBgXFxcXHRleHR7JHtzfX1gO1xuICAgICAgICBjb25zdCBkaWN0ID0gZGljdGlvbmFyeShleHByKTtcbiAgICAgICAgaWYgKGRpY3QgIT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRGljdGlvbmFyeShkaWN0KTtcbiAgICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IHN5bWJvbChleHByKTtcbiAgICAgICAgaWYgKHN5bWJvbE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVTeW1ib2woXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQoc3ltYm9sTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZuTmFtZSA9IGhlYWROYW1lKGV4cHIpO1xuICAgICAgICBpZiAoZm5OYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRnVuY3Rpb24oZXhwciwgdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQoZm5OYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWQoZXhwcikgIT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRnVuY3Rpb24oZXhwcik7XG4gICAgICAgIHRoaXMub25FcnJvcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgICAgICBcInN5bnRheC1lcnJvclwiLFxuICAgICAgICAgICAgICBleHByID8gSlNPTi5zdHJpbmdpZnkoZXhwcikgOiBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdKTtcbiAgICAgIH0pKCk7XG4gICAgICB0aGlzLmxldmVsIC09IDE7XG4gICAgICB0aGlzLmNhbm9uaWNhbCA9IHNhdmVkQ2Fub25pY2FsO1xuICAgICAgcmV0dXJuIHJlc3VsdCA/PyBcIlwiO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICB9XG4gICAgdGhpcy5sZXZlbCAtPSAxO1xuICAgIHRoaXMuY2Fub25pY2FsID0gc2F2ZWRDYW5vbmljYWw7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgYXBwbHlGdW5jdGlvblN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgbGV2ZWwpO1xuICB9XG4gIGdyb3VwU3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgbGV2ZWwpO1xuICB9XG4gIHJvb3RTdHlsZShleHByLCBsZXZlbCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm9vdFN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBmcmFjdGlvblN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mcmFjdGlvblN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBsb2dpY1N0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2dpY1N0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBwb3dlclN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3dlclN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBudW1lcmljU2V0U3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm51bWVyaWNTZXRTdHlsZShleHByLCBsZXZlbCk7XG4gIH1cbn07XG5mdW5jdGlvbiBzcGVjaWFsTmFtZShzKSB7XG4gIGNvbnN0IHByZWZpeCA9IHMubWF0Y2goL14oW15fXSspLyk/LlsxXSA/PyBcIlwiO1xuICBsZXQgaSA9IFNZTUJPTFMuZmluZEluZGV4KCh4KSA9PiBwcmVmaXggPT09IHhbMF0pO1xuICBpZiAoaSA+PSAwKVxuICAgIHJldHVybiBbU1lNQk9MU1tpXVsxXSwgcy5zdWJzdHJpbmcoU1lNQk9MU1tpXVswXS5sZW5ndGgpXTtcbiAgY29uc3QgRElHSVRTID0ge1xuICAgIHplcm86IFwiMFwiLFxuICAgIG9uZTogXCIxXCIsXG4gICAgdHdvOiBcIjJcIixcbiAgICB0aHJlZTogXCIzXCIsXG4gICAgZm91cjogXCI0XCIsXG4gICAgZml2ZTogXCI1XCIsXG4gICAgc2l4OiBcIjZcIixcbiAgICBzZXZlbjogXCI3XCIsXG4gICAgZWlnaHQ6IFwiOFwiLFxuICAgIG5pbmU6IFwiOVwiLFxuICAgIHRlbjogXCIxMFwiXG4gIH07XG4gIGkgPSBPYmplY3Qua2V5cyhESUdJVFMpLmZpbmRJbmRleCgoeCkgPT4gcy5zdGFydHNXaXRoKHgpKTtcbiAgaWYgKGkgPj0gMCkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKERJR0lUUylbaV07XG4gICAgcmV0dXJuIFtESUdJVFNba2V5XSwgcy5zdWJzdHJpbmcoa2V5Lmxlbmd0aCldO1xuICB9XG4gIGNvbnN0IGNvZGUgPSBzLmNvZGVQb2ludEF0KDApO1xuICBpID0gU1lNQk9MUy5maW5kSW5kZXgoKHgpID0+IHhbMl0gPT09IGNvZGUpO1xuICBpZiAoaSA+PSAwKVxuICAgIHJldHVybiBbU1lNQk9MU1tpXVsxXSwgcy5zdWJzdHJpbmcoMSldO1xuICBjb25zdCBFWFRSQV9TWU1CT0xTID0ge1xuICAgIHBsdXM6IFwiK1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBwbTogXCJcXFxccG1cIixcbiAgICBhc3Q6IFwiXFxcXGFzdFwiLFxuICAgIGRhZzogXCJcXFxcZGFnXCIsXG4gICAgZGRhZzogXCJcXFxcZGRhZ1wiLFxuICAgIGhhc2g6IFwiXFxcXCNcIixcbiAgICBib3R0b206IFwiXFxcXGJvdFwiLFxuICAgIHRvcDogXCJcXFxcdG9wXCIsXG4gICAgYnVsbGV0OiBcIlxcXFxidWxsZXRcIixcbiAgICBjaXJjbGU6IFwiXFxcXGNpcmNcIixcbiAgICBkaWFtb25kOiBcIlxcXFxkaWFtb25kXCIsXG4gICAgdGltZXM6IFwiXFxcXHRpbWVzXCIsXG4gICAgc3F1YXJlOiBcIlxcXFxzcXVhcmVcIixcbiAgICBzdGFyOiBcIlxcXFxzdGFyXCJcbiAgfTtcbiAgaSA9IE9iamVjdC5rZXlzKEVYVFJBX1NZTUJPTFMpLmZpbmRJbmRleCgoeCkgPT4gcHJlZml4ID09PSB4KTtcbiAgaWYgKGkgPj0gMCkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKEVYVFJBX1NZTUJPTFMpW2ldO1xuICAgIHJldHVybiBbRVhUUkFfU1lNQk9MU1trZXldLCBzLnN1YnN0cmluZyhrZXkubGVuZ3RoKV07XG4gIH1cbiAgcmV0dXJuIFtwcmVmaXgsIHMuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpXTtcbn1cbmZ1bmN0aW9uIHBhcnNlTW9kaWZpZXJzKHMpIHtcbiAgbGV0IFtib2R5LCByZXN0XSA9IHNwZWNpYWxOYW1lKHMpO1xuICBjb25zdCBhY2NlbnQgPSBbXTtcbiAgd2hpbGUgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG0gPSByZXN0Lm1hdGNoKC9eXyhbYS16QS1aXSspKC4qKS8pO1xuICAgIGlmICghbSlcbiAgICAgIGJyZWFrO1xuICAgIGlmICghQUNDRU5UX01PRElGSUVSU1ttWzFdXSlcbiAgICAgIGJyZWFrO1xuICAgIGFjY2VudC5wdXNoKG1bMV0pO1xuICAgIHJlc3QgPSBtWzJdO1xuICB9XG4gIGNvbnN0IHN0eWxlcyA9IFtdO1xuICB3aGlsZSAocmVzdC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbSA9IHJlc3QubWF0Y2goL15fKFthLXpBLVpdKykoLiopLyk7XG4gICAgaWYgKCFtKVxuICAgICAgYnJlYWs7XG4gICAgaWYgKCFTVFlMRV9NT0RJRklFUlNbbVsxXV0pXG4gICAgICBicmVhaztcbiAgICBzdHlsZXMucHVzaChtWzFdKTtcbiAgICByZXN0ID0gbVsyXTtcbiAgfVxuICByZXR1cm4gW2JvZHksIGFjY2VudCwgc3R5bGVzLCByZXN0XTtcbn1cbmZ1bmN0aW9uIHBhcnNlSWRlbnRpZmllckJvZHkyKHMsIHRvcExldmVsID0gdHJ1ZSwgc3R5bGUgPSBcImF1dG9cIikge1xuICBsZXQgW2JvZHksIGFjY2VudHMsIHN0eWxlcywgcmVzdF0gPSBwYXJzZU1vZGlmaWVycyhzKTtcbiAgZm9yIChjb25zdCBhY2NlbnQgb2YgYWNjZW50cykge1xuICAgIGlmIChBQ0NFTlRfTU9ESUZJRVJTW2FjY2VudF0pXG4gICAgICBib2R5ID0gQUNDRU5UX01PRElGSUVSU1thY2NlbnRdKGJvZHkpO1xuICB9XG4gIGlmICh0b3BMZXZlbCkge1xuICAgIGNvbnN0IHN1cHMgPSBbXTtcbiAgICBjb25zdCBzdWJzMiA9IFtdO1xuICAgIGNvbnN0IG0gPSBib2R5Lm1hdGNoKC9eKFteXFxkXS4qPykoXFxkKykkLyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHN1YnMyLnB1c2gobVsyXSk7XG4gICAgICBib2R5ID0gbVsxXTtcbiAgICB9XG4gICAgd2hpbGUgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aChcIl9fXCIpKSB7XG4gICAgICAgIGNvbnN0IFtzdXAsIHJlc3QyXSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKFxuICAgICAgICAgIHJlc3Quc3Vic3RyaW5nKDIpLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwibm9uZVwiXG4gICAgICAgICk7XG4gICAgICAgIHN1cHMucHVzaChzdXApO1xuICAgICAgICByZXN0ID0gcmVzdDI7XG4gICAgICB9IGVsc2UgaWYgKHJlc3Quc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgY29uc3QgW3N1YjIsIHJlc3QyXSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKFxuICAgICAgICAgIHJlc3Quc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwibm9uZVwiXG4gICAgICAgICk7XG4gICAgICAgIHN1YnMyLnB1c2goc3ViMik7XG4gICAgICAgIHJlc3QgPSByZXN0MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3Vwcy5sZW5ndGggPiAwKVxuICAgICAgYm9keSA9IGAke2JvZHl9Xnske3N1cHMuam9pbihcIixcIil9fWA7XG4gICAgaWYgKHN1YnMyLmxlbmd0aCA+IDApXG4gICAgICBib2R5ID0gYCR7Ym9keX1feyR7c3ViczIuam9pbihcIixcIil9fWA7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZTIgb2Ygc3R5bGVzKSB7XG4gICAgaWYgKFNUWUxFX01PRElGSUVSU1tzdHlsZTJdKVxuICAgICAgYm9keSA9IFNUWUxFX01PRElGSUVSU1tzdHlsZTJdKGJvZHkpO1xuICB9XG4gIGlmIChzdHlsZXMubGVuZ3RoID09PSAwICYmIHN0eWxlICE9PSBcIm5vbmVcIikge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgXCJhdXRvXCI6XG4gICAgICAgIGlmIChjb3VudFRva2Vucyhib2R5KSA+IDEpXG4gICAgICAgICAgYm9keSA9IGBcXFxcbWF0aHJteyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib3BlcmF0b3JcIjpcbiAgICAgICAgYm9keSA9IGBcXFxcb3BlcmF0b3JuYW1leyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgIGJvZHkgPSBgXFxcXG1hdGhpdHske2JvZHl9fWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVwcmlnaHRcIjpcbiAgICAgICAgYm9keSA9IGBcXFxcbWF0aHJteyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBbYm9keSwgcmVzdF07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVJZGVudGlmaWVyKHMsIHN0eWxlID0gXCJhdXRvXCIpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChPTkxZX0VNT0pJUy50ZXN0KHMpKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBtID0gcy5tYXRjaCgvXihfKykoLiopLyk7XG4gIGlmIChtKSB7XG4gICAgY29uc3QgW2JvZHkyLCByZXN0Ml0gPSBwYXJzZUlkZW50aWZpZXJCb2R5MihtWzJdLCB0cnVlLCBcIm5vbmVcIik7XG4gICAgcmV0dXJuIGBcXFxcb3BlcmF0b3JuYW1leyR7XCJcXFxcX1wiLnJlcGVhdChtWzFdLmxlbmd0aCkgKyBib2R5MiArIHJlc3QyfX1gO1xuICB9XG4gIGNvbnN0IFtib2R5LCByZXN0XSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKHMsIHRydWUsIHN0eWxlKTtcbiAgaWYgKHJlc3QubGVuZ3RoID4gMClcbiAgICByZXR1cm4gYFxcXFxvcGVyYXRvcm5hbWV7JHtzfX1gO1xuICByZXR1cm4gYm9keTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9sYXRleC1zeW50YXgudHNcbnZhciBERUZBVUxUX1NFUklBTElaRV9MQVRFWF9PUFRJT05TID0ge1xuICBpbnZpc2libGVNdWx0aXBseTogXCJcIixcbiAgLy8gJ1xcXFxjZG90JyxcbiAgaW52aXNpYmxlUGx1czogXCJcIixcbiAgLy8gJysnLFxuICAvLyBpbnZpc2libGVBcHBseTogJycsXG4gIG11bHRpcGx5OiBcIlxcXFx0aW1lc1wiLFxuICBtaXNzaW5nU3ltYm9sOiBcIlxcXFxibGFja3NxdWFyZVwiLFxuICAvLyBvcGVuR3JvdXA6ICcoJyxcbiAgLy8gY2xvc2VHcm91cDogJyknLFxuICAvLyBkaXZpZGU6ICdcXFxcZnJhY3sjMX17IzJ9JyxcbiAgLy8gc3VidHJhY3Q6ICcjMS0jMicsXG4gIC8vIGFkZDogJyMxKyMyJyxcbiAgLy8gbmVnYXRlOiAnLSMxJyxcbiAgLy8gc3F1YXJlUm9vdDogJ1xcXFxzcXJ0eyMxfScsXG4gIC8vIG50aFJvb3Q6ICdcXFxcc3FydFsjMl17IzF9JyxcbiAgYXBwbHlGdW5jdGlvblN0eWxlOiBnZXRBcHBseUZ1bmN0aW9uU3R5bGUsXG4gIGdyb3VwU3R5bGU6IGdldEdyb3VwU3R5bGUsXG4gIHJvb3RTdHlsZTogZ2V0Um9vdFN0eWxlLFxuICBmcmFjdGlvblN0eWxlOiBnZXRGcmFjdGlvblN0eWxlLFxuICBsb2dpY1N0eWxlOiBnZXRMb2dpY1N0eWxlLFxuICBwb3dlclN0eWxlOiBnZXRQb3dlclN0eWxlLFxuICBudW1lcmljU2V0U3R5bGU6IGdldE51bWVyaWNTZXRTdHlsZVxufTtcbnZhciBMYXRleFN5bnRheCA9IGNsYXNzIF9MYXRleFN5bnRheCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvbkVycm9yID0gKHdhcm5pbmdzKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpXG4gICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gb25FcnJvcjtcbiAgICB0aGlzLmNvbXB1dGVFbmdpbmUgPSBvcHRpb25zLmNvbXB1dGVFbmdpbmU7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGRlbGV0ZSBvcHRzLmRpY3Rpb25hcnk7XG4gICAgZGVsZXRlIG9wdHMub25FcnJvcjtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0xBVEVYX05VTUJFUl9PUFRJT05TLFxuICAgICAgLi4uREVGQVVMVF9QQVJTRV9MQVRFWF9PUFRJT05TLFxuICAgICAgLi4uREVGQVVMVF9TRVJJQUxJWkVfTEFURVhfT1BUSU9OUyxcbiAgICAgIC4uLm9wdHNcbiAgICB9O1xuICAgIHRoaXMuX2RpY3Rpb25hcnlJbnB1dCA9IG9wdGlvbnMuZGljdGlvbmFyeSA/PyBfTGF0ZXhTeW50YXguZ2V0RGljdGlvbmFyeSgpO1xuICAgIHRoaXMuX2RpY3Rpb25hcnkgPSBpbmRleExhdGV4RGljdGlvbmFyeShcbiAgICAgIHRoaXMuX2RpY3Rpb25hcnlJbnB1dCxcbiAgICAgIChzaWcpID0+IHRoaXMub25FcnJvcihbc2lnXSlcbiAgICApO1xuICB9XG4gIGdldCBkaWN0aW9uYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5SW5wdXQ7XG4gIH1cbiAgc2V0IGRpY3Rpb25hcnkodmFsKSB7XG4gICAgdGhpcy5fZGljdGlvbmFyeUlucHV0ID0gdmFsO1xuICAgIHRoaXMuX2RpY3Rpb25hcnkgPSBpbmRleExhdGV4RGljdGlvbmFyeSh2YWwsIChzaWcpID0+IHRoaXMub25FcnJvcihbc2lnXSkpO1xuICB9XG4gIHVwZGF0ZU9wdGlvbnMob3B0KSB7XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykpXG4gICAgICBpZiAoayBpbiBvcHQpXG4gICAgICAgIHRoaXMub3B0aW9uc1trXSA9IG9wdFtrXTtcbiAgICB0aGlzLnNlcmlhbGl6ZXIudXBkYXRlT3B0aW9ucyhvcHQpO1xuICB9XG4gIHN0YXRpYyBnZXREaWN0aW9uYXJ5KGNhdGVnb3J5ID0gXCJhbGxcIikge1xuICAgIGlmIChjYXRlZ29yeSA9PT0gXCJhbGxcIikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBPYmplY3Qua2V5cyhERUZBVUxUX0xBVEVYX0RJQ1RJT05BUlkpKVxuICAgICAgICBpZiAoREVGQVVMVF9MQVRFWF9ESUNUSU9OQVJZW2RvbWFpbl0pXG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4uREVGQVVMVF9MQVRFWF9ESUNUSU9OQVJZW2RvbWFpbl0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFERUZBVUxUX0xBVEVYX0RJQ1RJT05BUllbY2F0ZWdvcnldKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKFsuLi5ERUZBVUxUX0xBVEVYX0RJQ1RJT05BUllbY2F0ZWdvcnldXSk7XG4gIH1cbiAgcGFyc2UobGF0ZXgpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcihcbiAgICAgIHRva2VuaXplKGxhdGV4LCBbXSksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLl9kaWN0aW9uYXJ5LFxuICAgICAgdGhpcy5jb21wdXRlRW5naW5lXG4gICAgKTtcbiAgICBsZXQgZXhwciA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoIXBhcnNlci5hdEVuZCkge1xuICAgICAgY29uc3Qgb3BEZWZzID0gcGFyc2VyLnBlZWtEZWZpbml0aW9ucyhcImluZml4XCIpO1xuICAgICAgaWYgKG9wRGVmcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgcGFyc2VyLmluZGV4ICs9IG47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5wYXJzZShcbiAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgZXhwciA/PyBwYXJzZXIuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSxcbiAgICAgICAgICB7IG1pblByZWM6IDAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmIChkZWYubmFtZSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBkZWYubmFtZSxcbiAgICAgICAgICAgIGV4cHIgPz8gcGFyc2VyLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydCksXG4gICAgICAgICAgICBwYXJzZXIuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KVxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlci5pbmRleDtcbiAgICAgIGNvbnN0IGlkID0gcGFyc2VJZGVudGlmaWVyKHBhcnNlcik7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3QgaWRFcnJvciA9IHBhcnNlci5lcnJvcihbXCJ1bmV4cGVjdGVkLWlkZW50aWZpZXJcIiwgaWRdLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBleHByID8gW1wiU2VxdWVuY2VcIiwgZXhwciwgaWRFcnJvcl0gOiBpZEVycm9yO1xuICAgICAgfVxuICAgICAgbGV0IG9wZW5EZWxpbWl0ZXIgPSBwYXJzZXIucGVlaztcbiAgICAgIGNvbnN0IGNsb3NlRGVsaW1pdGVyID0gcGFyc2VyLm1hdGNoRW5jbG9zdXJlT3BlbigpO1xuICAgICAgaWYgKGNsb3NlRGVsaW1pdGVyKSB7XG4gICAgICAgIHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgcGFyc2VyLm1hdGNoKGNsb3NlRGVsaW1pdGVyKTtcbiAgICAgICAgY29uc3QgZW5jbG9zdXJlRXJyb3IgPSBwYXJzZXIuZXJyb3IoXG4gICAgICAgICAgW1widW5leHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVuY2xvc3VyZUVycm9yXSA6IGVuY2xvc3VyZUVycm9yO1xuICAgICAgfVxuICAgICAgb3BlbkRlbGltaXRlciA9IHBhcnNlci5tYXRjaEVuY2xvc3VyZUNsb3NlKCk7XG4gICAgICBpZiAob3BlbkRlbGltaXRlcikge1xuICAgICAgICBjb25zdCBlbmNsb3N1cmVFcnJvciA9IHBhcnNlci5lcnJvcihcbiAgICAgICAgICBbXCJleHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVuY2xvc3VyZUVycm9yXSA6IGVuY2xvc3VyZUVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdCA9IHBhcnNlci5pbmRleDtcbiAgICAgIGNvbnN0IHRva2VuID0gcGFyc2VyLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKCFwYXJzZXIuYXRFbmQpXG4gICAgICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pXG4gICAgICAgIHJldHVybiBwYXJzZXIuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgcmVzdCk7XG4gICAgICBjb25zdCBlcnJvciA9IHBhcnNlci5lcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgIHRva2VuLmxlbmd0aCA+IDEgJiYgdG9rZW4uc3RhcnRzV2l0aChcIlxcXFxcIikgPyBcInVuZXhwZWN0ZWQtY29tbWFuZFwiIDogXCJ1bmV4cGVjdGVkLXRva2VuXCIsXG4gICAgICAgICAgeyBzdHI6IHRva2Vuc1RvU3RyaW5nKFt0b2tlbl0pIH1cbiAgICAgICAgXSxcbiAgICAgICAgcmVzdFxuICAgICAgKTtcbiAgICAgIGV4cHIgPSBleHByID8gW1wiU2VxdWVuY2VcIiwgZXhwciwgZXJyb3JdIDogZXJyb3I7XG4gICAgfVxuICAgIGV4cHIgPz8gKGV4cHIgPSBbXCJTZXF1ZW5jZVwiXSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVzZXJ2ZUxhdGV4KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSlcbiAgICAgICAgZXhwciA9IHsgbGF0ZXgsIGZuOiBleHByIH07XG4gICAgICBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgZXhwciA9IHsgbGF0ZXgsIG51bTogTnVtYmVyKGV4cHIpLnRvU3RyaW5nKCkgfTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgICAgICBleHByID0geyBsYXRleCwgc3ltOiBleHByIH07XG4gICAgICBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByICE9PSBudWxsKVxuICAgICAgICBleHByLmxhdGV4ID0gbGF0ZXg7XG4gICAgfVxuICAgIHJldHVybiBleHByID8/IFtcIlNlcXVlbmNlXCJdO1xuICB9XG4gIHNlcmlhbGl6ZShleHByLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoZXhwciwgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6ZXIoKSB7XG4gICAgaWYgKHRoaXMuX3NlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplcjtcbiAgICB0aGlzLl9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLl9kaWN0aW9uYXJ5LFxuICAgICAgdGhpcy5vbkVycm9yXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplcjtcbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vdXRpbHMudHNcbnZhciBpbXBvcnRfY29tcGxleDIgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL251bWVyaWNzL251bWVyaWMudHNcbnZhciBpbXBvcnRfY29tcGxleCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xudmFyIE1BQ0hJTkVfUFJFQ0lTSU9OX0JJVFMgPSA1MztcbnZhciBNQUNISU5FX1BSRUNJU0lPTiA9IE1hdGgubG9nMTAoXG4gIE1hdGgucG93KDIsIE1BQ0hJTkVfUFJFQ0lTSU9OX0JJVFMpXG4pO1xudmFyIE1BQ0hJTkVfVE9MRVJBTkNFX0JJVFMgPSA3O1xudmFyIE1BQ0hJTkVfVE9MRVJBTkNFID0gTWF0aC5wb3coXG4gIDIsXG4gIC0oTUFDSElORV9QUkVDSVNJT05fQklUUyAtIE1BQ0hJTkVfVE9MRVJBTkNFX0JJVFMpXG4pO1xudmFyIE5VTUVSSUNfVE9MRVJBTkNFID0gTWF0aC5wb3coMTAsIC0xMCk7XG52YXIgU01BTExfSU5URUdFUiA9IDFlNjtcbnZhciBNQVhfSVRFUkFUSU9OID0gMWU2O1xudmFyIE1BWF9TWU1CT0xJQ19URVJNUyA9IDIwMDtcbnZhciBTTUFMTF9QUklNRVMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gIDIsXG4gIDMsXG4gIDUsXG4gIDcsXG4gIDExLFxuICAxMyxcbiAgMTcsXG4gIDE5LFxuICAyMyxcbiAgMjksXG4gIDMxLFxuICAzNyxcbiAgNDEsXG4gIDQzLFxuICA0NyxcbiAgNTMsXG4gIDU5LFxuICA2MSxcbiAgNjcsXG4gIDcxLFxuICA3MyxcbiAgNzksXG4gIDgzLFxuICA4OSxcbiAgOTcsXG4gIDEwMSxcbiAgMTAzLFxuICAxMDcsXG4gIDEwOSxcbiAgMTEzLFxuICAxMjcsXG4gIDEzMSxcbiAgMTM3LFxuICAxMzksXG4gIDE0OSxcbiAgMTUxLFxuICAxNTcsXG4gIDE2MyxcbiAgMTY3LFxuICAxNzMsXG4gIDE3OSxcbiAgMTgxLFxuICAxOTEsXG4gIDE5MyxcbiAgMTk3LFxuICAxOTksXG4gIDIxMSxcbiAgMjIzLFxuICAyMjcsXG4gIDIyOSxcbiAgMjMzLFxuICAyMzksXG4gIDI0MSxcbiAgMjUxLFxuICAyNTcsXG4gIDI2MyxcbiAgMjY5LFxuICAyNzEsXG4gIDI3NyxcbiAgMjgxLFxuICAyODMsXG4gIDI5MyxcbiAgMzA3LFxuICAzMTEsXG4gIDMxMyxcbiAgMzE3LFxuICAzMzEsXG4gIDMzNyxcbiAgMzQ3LFxuICAzNDksXG4gIDM1MyxcbiAgMzU5LFxuICAzNjcsXG4gIDM3MyxcbiAgMzc5LFxuICAzODMsXG4gIDM4OSxcbiAgMzk3LFxuICA0MDEsXG4gIDQwOSxcbiAgNDE5LFxuICA0MjEsXG4gIDQzMSxcbiAgNDMzLFxuICA0MzksXG4gIDQ0MyxcbiAgNDQ5LFxuICA0NTcsXG4gIDQ2MSxcbiAgNDYzLFxuICA0NjcsXG4gIDQ3OSxcbiAgNDg3LFxuICA0OTEsXG4gIDQ5OSxcbiAgNTAzLFxuICA1MDksXG4gIDUyMSxcbiAgNTIzLFxuICA1NDEsXG4gIDU0NyxcbiAgNTU3LFxuICA1NjMsXG4gIDU2OSxcbiAgNTcxLFxuICA1NzcsXG4gIDU4NyxcbiAgNTkzLFxuICA1OTksXG4gIDYwMSxcbiAgNjA3LFxuICA2MTMsXG4gIDYxNyxcbiAgNjE5LFxuICA2MzEsXG4gIDY0MSxcbiAgNjQzLFxuICA2NDcsXG4gIDY1MyxcbiAgNjU5LFxuICA2NjEsXG4gIDY3MyxcbiAgNjc3LFxuICA2ODMsXG4gIDY5MSxcbiAgNzAxLFxuICA3MDksXG4gIDcxOSxcbiAgNzI3LFxuICA3MzMsXG4gIDczOSxcbiAgNzQzLFxuICA3NTEsXG4gIDc1NyxcbiAgNzYxLFxuICA3NjksXG4gIDc3MyxcbiAgNzg3LFxuICA3OTcsXG4gIDgwOSxcbiAgODExLFxuICA4MjEsXG4gIDgyMyxcbiAgODI3LFxuICA4MjksXG4gIDgzOSxcbiAgODUzLFxuICA4NTcsXG4gIDg1OSxcbiAgODYzLFxuICA4NzcsXG4gIDg4MSxcbiAgODgzLFxuICA4ODcsXG4gIDkwNyxcbiAgOTExLFxuICA5MTksXG4gIDkyOSxcbiAgOTM3LFxuICA5NDEsXG4gIDk0NyxcbiAgOTUzLFxuICA5NjcsXG4gIDk3MSxcbiAgOTc3LFxuICA5ODMsXG4gIDk5MSxcbiAgOTk3LFxuICAxMDA5LFxuICAxMDEzLFxuICAxMDE5LFxuICAxMDIxLFxuICAxMDMxLFxuICAxMDMzLFxuICAxMDM5LFxuICAxMDQ5LFxuICAxMDUxLFxuICAxMDYxLFxuICAxMDYzLFxuICAxMDY5LFxuICAxMDg3LFxuICAxMDkxLFxuICAxMDkzLFxuICAxMDk3LFxuICAxMTAzLFxuICAxMTA5LFxuICAxMTE3LFxuICAxMTIzLFxuICAxMTI5LFxuICAxMTUxLFxuICAxMTUzLFxuICAxMTYzLFxuICAxMTcxLFxuICAxMTgxLFxuICAxMTg3LFxuICAxMTkzLFxuICAxMjAxLFxuICAxMjEzLFxuICAxMjE3LFxuICAxMjIzLFxuICAxMjI5LFxuICAxMjMxLFxuICAxMjM3LFxuICAxMjQ5LFxuICAxMjU5LFxuICAxMjc3LFxuICAxMjc5LFxuICAxMjgzLFxuICAxMjg5LFxuICAxMjkxLFxuICAxMjk3LFxuICAxMzAxLFxuICAxMzAzLFxuICAxMzA3LFxuICAxMzE5LFxuICAxMzIxLFxuICAxMzI3LFxuICAxMzYxLFxuICAxMzY3LFxuICAxMzczLFxuICAxMzgxLFxuICAxMzk5LFxuICAxNDA5LFxuICAxNDIzLFxuICAxNDI3LFxuICAxNDI5LFxuICAxNDMzLFxuICAxNDM5LFxuICAxNDQ3LFxuICAxNDUxLFxuICAxNDUzLFxuICAxNDU5LFxuICAxNDcxLFxuICAxNDgxLFxuICAxNDgzLFxuICAxNDg3LFxuICAxNDg5LFxuICAxNDkzLFxuICAxNDk5LFxuICAxNTExLFxuICAxNTIzLFxuICAxNTMxLFxuICAxNTQzLFxuICAxNTQ5LFxuICAxNTUzLFxuICAxNTU5LFxuICAxNTY3LFxuICAxNTcxLFxuICAxNTc5LFxuICAxNTgzLFxuICAxNTk3LFxuICAxNjAxLFxuICAxNjA3LFxuICAxNjA5LFxuICAxNjEzLFxuICAxNjE5LFxuICAxNjIxLFxuICAxNjI3LFxuICAxNjM3LFxuICAxNjU3LFxuICAxNjYzLFxuICAxNjY3LFxuICAxNjY5LFxuICAxNjkzLFxuICAxNjk3LFxuICAxNjk5LFxuICAxNzA5LFxuICAxNzIxLFxuICAxNzIzLFxuICAxNzMzLFxuICAxNzQxLFxuICAxNzQ3LFxuICAxNzUzLFxuICAxNzU5LFxuICAxNzc3LFxuICAxNzgzLFxuICAxNzg3LFxuICAxNzg5LFxuICAxODAxLFxuICAxODExLFxuICAxODIzLFxuICAxODMxLFxuICAxODQ3LFxuICAxODYxLFxuICAxODY3LFxuICAxODcxLFxuICAxODczLFxuICAxODc3LFxuICAxODc5LFxuICAxODg5LFxuICAxOTAxLFxuICAxOTA3LFxuICAxOTEzLFxuICAxOTMxLFxuICAxOTMzLFxuICAxOTQ5LFxuICAxOTUxLFxuICAxOTczLFxuICAxOTc5LFxuICAxOTg3LFxuICAxOTkzLFxuICAxOTk3LFxuICAxOTk5LFxuICAyMDAzLFxuICAyMDExLFxuICAyMDE3LFxuICAyMDI3LFxuICAyMDI5LFxuICAyMDM5LFxuICAyMDUzLFxuICAyMDYzLFxuICAyMDY5LFxuICAyMDgxLFxuICAyMDgzLFxuICAyMDg3LFxuICAyMDg5LFxuICAyMDk5LFxuICAyMTExLFxuICAyMTEzLFxuICAyMTI5LFxuICAyMTMxLFxuICAyMTM3LFxuICAyMTQxLFxuICAyMTQzLFxuICAyMTUzLFxuICAyMTYxLFxuICAyMTc5LFxuICAyMjAzLFxuICAyMjA3LFxuICAyMjEzLFxuICAyMjIxLFxuICAyMjM3LFxuICAyMjM5LFxuICAyMjQzLFxuICAyMjUxLFxuICAyMjY3LFxuICAyMjY5LFxuICAyMjczLFxuICAyMjgxLFxuICAyMjg3LFxuICAyMjkzLFxuICAyMjk3LFxuICAyMzA5LFxuICAyMzExLFxuICAyMzMzLFxuICAyMzM5LFxuICAyMzQxLFxuICAyMzQ3LFxuICAyMzUxLFxuICAyMzU3LFxuICAyMzcxLFxuICAyMzc3LFxuICAyMzgxLFxuICAyMzgzLFxuICAyMzg5LFxuICAyMzkzLFxuICAyMzk5LFxuICAyNDExLFxuICAyNDE3LFxuICAyNDIzLFxuICAyNDM3LFxuICAyNDQxLFxuICAyNDQ3LFxuICAyNDU5LFxuICAyNDY3LFxuICAyNDczLFxuICAyNDc3LFxuICAyNTAzLFxuICAyNTIxLFxuICAyNTMxLFxuICAyNTM5LFxuICAyNTQzLFxuICAyNTQ5LFxuICAyNTUxLFxuICAyNTU3LFxuICAyNTc5LFxuICAyNTkxLFxuICAyNTkzLFxuICAyNjA5LFxuICAyNjE3LFxuICAyNjIxLFxuICAyNjMzLFxuICAyNjQ3LFxuICAyNjU3LFxuICAyNjU5LFxuICAyNjYzLFxuICAyNjcxLFxuICAyNjc3LFxuICAyNjgzLFxuICAyNjg3LFxuICAyNjg5LFxuICAyNjkzLFxuICAyNjk5LFxuICAyNzA3LFxuICAyNzExLFxuICAyNzEzLFxuICAyNzE5LFxuICAyNzI5LFxuICAyNzMxLFxuICAyNzQxLFxuICAyNzQ5LFxuICAyNzUzLFxuICAyNzY3LFxuICAyNzc3LFxuICAyNzg5LFxuICAyNzkxLFxuICAyNzk3LFxuICAyODAxLFxuICAyODAzLFxuICAyODE5LFxuICAyODMzLFxuICAyODM3LFxuICAyODQzLFxuICAyODUxLFxuICAyODU3LFxuICAyODYxLFxuICAyODc5LFxuICAyODg3LFxuICAyODk3LFxuICAyOTAzLFxuICAyOTA5LFxuICAyOTE3LFxuICAyOTI3LFxuICAyOTM5LFxuICAyOTUzLFxuICAyOTU3LFxuICAyOTYzLFxuICAyOTY5LFxuICAyOTcxLFxuICAyOTk5LFxuICAzMDAxLFxuICAzMDExLFxuICAzMDE5LFxuICAzMDIzLFxuICAzMDM3LFxuICAzMDQxLFxuICAzMDQ5LFxuICAzMDYxLFxuICAzMDY3LFxuICAzMDc5LFxuICAzMDgzLFxuICAzMDg5LFxuICAzMTA5LFxuICAzMTE5LFxuICAzMTIxLFxuICAzMTM3LFxuICAzMTYzLFxuICAzMTY3LFxuICAzMTY5LFxuICAzMTgxLFxuICAzMTg3LFxuICAzMTkxLFxuICAzMjAzLFxuICAzMjA5LFxuICAzMjE3LFxuICAzMjIxLFxuICAzMjI5LFxuICAzMjUxLFxuICAzMjUzLFxuICAzMjU3LFxuICAzMjU5LFxuICAzMjcxLFxuICAzMjk5LFxuICAzMzAxLFxuICAzMzA3LFxuICAzMzEzLFxuICAzMzE5LFxuICAzMzIzLFxuICAzMzI5LFxuICAzMzMxLFxuICAzMzQzLFxuICAzMzQ3LFxuICAzMzU5LFxuICAzMzYxLFxuICAzMzcxLFxuICAzMzczLFxuICAzMzg5LFxuICAzMzkxLFxuICAzNDA3LFxuICAzNDEzLFxuICAzNDMzLFxuICAzNDQ5LFxuICAzNDU3LFxuICAzNDYxLFxuICAzNDYzLFxuICAzNDY3LFxuICAzNDY5LFxuICAzNDkxLFxuICAzNDk5LFxuICAzNTExLFxuICAzNTE3LFxuICAzNTI3LFxuICAzNTI5LFxuICAzNTMzLFxuICAzNTM5LFxuICAzNTQxLFxuICAzNTQ3LFxuICAzNTU3LFxuICAzNTU5LFxuICAzNTcxLFxuICAzNTgxLFxuICAzNTgzLFxuICAzNTkzLFxuICAzNjA3LFxuICAzNjEzLFxuICAzNjE3LFxuICAzNjIzLFxuICAzNjMxLFxuICAzNjM3LFxuICAzNjQzLFxuICAzNjU5LFxuICAzNjcxLFxuICAzNjczLFxuICAzNjc3LFxuICAzNjkxLFxuICAzNjk3LFxuICAzNzAxLFxuICAzNzA5LFxuICAzNzE5LFxuICAzNzI3LFxuICAzNzMzLFxuICAzNzM5LFxuICAzNzYxLFxuICAzNzY3LFxuICAzNzY5LFxuICAzNzc5LFxuICAzNzkzLFxuICAzNzk3LFxuICAzODAzLFxuICAzODIxLFxuICAzODIzLFxuICAzODMzLFxuICAzODQ3LFxuICAzODUxLFxuICAzODUzLFxuICAzODYzLFxuICAzODc3LFxuICAzODgxLFxuICAzODg5LFxuICAzOTA3LFxuICAzOTExLFxuICAzOTE3LFxuICAzOTE5LFxuICAzOTIzLFxuICAzOTI5LFxuICAzOTMxLFxuICAzOTQzLFxuICAzOTQ3LFxuICAzOTY3LFxuICAzOTg5LFxuICA0MDAxLFxuICA0MDAzLFxuICA0MDA3LFxuICA0MDEzLFxuICA0MDE5LFxuICA0MDIxLFxuICA0MDI3LFxuICA0MDQ5LFxuICA0MDUxLFxuICA0MDU3LFxuICA0MDczLFxuICA0MDc5LFxuICA0MDkxLFxuICA0MDkzLFxuICA0MDk5LFxuICA0MTExLFxuICA0MTI3LFxuICA0MTI5LFxuICA0MTMzLFxuICA0MTM5LFxuICA0MTUzLFxuICA0MTU3LFxuICA0MTU5LFxuICA0MTc3LFxuICA0MjAxLFxuICA0MjExLFxuICA0MjE3LFxuICA0MjE5LFxuICA0MjI5LFxuICA0MjMxLFxuICA0MjQxLFxuICA0MjQzLFxuICA0MjUzLFxuICA0MjU5LFxuICA0MjYxLFxuICA0MjcxLFxuICA0MjczLFxuICA0MjgzLFxuICA0Mjg5LFxuICA0Mjk3LFxuICA0MzI3LFxuICA0MzM3LFxuICA0MzM5LFxuICA0MzQ5LFxuICA0MzU3LFxuICA0MzYzLFxuICA0MzczLFxuICA0MzkxLFxuICA0Mzk3LFxuICA0NDA5LFxuICA0NDIxLFxuICA0NDIzLFxuICA0NDQxLFxuICA0NDQ3LFxuICA0NDUxLFxuICA0NDU3LFxuICA0NDYzLFxuICA0NDgxLFxuICA0NDgzLFxuICA0NDkzLFxuICA0NTA3LFxuICA0NTEzLFxuICA0NTE3LFxuICA0NTE5LFxuICA0NTIzLFxuICA0NTQ3LFxuICA0NTQ5LFxuICA0NTYxLFxuICA0NTY3LFxuICA0NTgzLFxuICA0NTkxLFxuICA0NTk3LFxuICA0NjAzLFxuICA0NjIxLFxuICA0NjM3LFxuICA0NjM5LFxuICA0NjQzLFxuICA0NjQ5LFxuICA0NjUxLFxuICA0NjU3LFxuICA0NjYzLFxuICA0NjczLFxuICA0Njc5LFxuICA0NjkxLFxuICA0NzAzLFxuICA0NzIxLFxuICA0NzIzLFxuICA0NzI5LFxuICA0NzMzLFxuICA0NzUxLFxuICA0NzU5LFxuICA0NzgzLFxuICA0Nzg3LFxuICA0Nzg5LFxuICA0NzkzLFxuICA0Nzk5LFxuICA0ODAxLFxuICA0ODEzLFxuICA0ODE3LFxuICA0ODMxLFxuICA0ODYxLFxuICA0ODcxLFxuICA0ODc3LFxuICA0ODg5LFxuICA0OTAzLFxuICA0OTA5LFxuICA0OTE5LFxuICA0OTMxLFxuICA0OTMzLFxuICA0OTM3LFxuICA0OTQzLFxuICA0OTUxLFxuICA0OTU3LFxuICA0OTY3LFxuICA0OTY5LFxuICA0OTczLFxuICA0OTg3LFxuICA0OTkzLFxuICA0OTk5LFxuICA1MDAzLFxuICA1MDA5LFxuICA1MDExLFxuICA1MDIxLFxuICA1MDIzLFxuICA1MDM5LFxuICA1MDUxLFxuICA1MDU5LFxuICA1MDc3LFxuICA1MDgxLFxuICA1MDg3LFxuICA1MDk5LFxuICA1MTAxLFxuICA1MTA3LFxuICA1MTEzLFxuICA1MTE5LFxuICA1MTQ3LFxuICA1MTUzLFxuICA1MTY3LFxuICA1MTcxLFxuICA1MTc5LFxuICA1MTg5LFxuICA1MTk3LFxuICA1MjA5LFxuICA1MjI3LFxuICA1MjMxLFxuICA1MjMzLFxuICA1MjM3LFxuICA1MjYxLFxuICA1MjczLFxuICA1Mjc5LFxuICA1MjgxLFxuICA1Mjk3LFxuICA1MzAzLFxuICA1MzA5LFxuICA1MzIzLFxuICA1MzMzLFxuICA1MzQ3LFxuICA1MzUxLFxuICA1MzgxLFxuICA1Mzg3LFxuICA1MzkzLFxuICA1Mzk5LFxuICA1NDA3LFxuICA1NDEzLFxuICA1NDE3LFxuICA1NDE5LFxuICA1NDMxLFxuICA1NDM3LFxuICA1NDQxLFxuICA1NDQzLFxuICA1NDQ5LFxuICA1NDcxLFxuICA1NDc3LFxuICA1NDc5LFxuICA1NDgzLFxuICA1NTAxLFxuICA1NTAzLFxuICA1NTA3LFxuICA1NTE5LFxuICA1NTIxLFxuICA1NTI3LFxuICA1NTMxLFxuICA1NTU3LFxuICA1NTYzLFxuICA1NTY5LFxuICA1NTczLFxuICA1NTgxLFxuICA1NTkxLFxuICA1NjIzLFxuICA1NjM5LFxuICA1NjQxLFxuICA1NjQ3LFxuICA1NjUxLFxuICA1NjUzLFxuICA1NjU3LFxuICA1NjU5LFxuICA1NjY5LFxuICA1NjgzLFxuICA1Njg5LFxuICA1NjkzLFxuICA1NzAxLFxuICA1NzExLFxuICA1NzE3LFxuICA1NzM3LFxuICA1NzQxLFxuICA1NzQzLFxuICA1NzQ5LFxuICA1Nzc5LFxuICA1NzgzLFxuICA1NzkxLFxuICA1ODAxLFxuICA1ODA3LFxuICA1ODEzLFxuICA1ODIxLFxuICA1ODI3LFxuICA1ODM5LFxuICA1ODQzLFxuICA1ODQ5LFxuICA1ODUxLFxuICA1ODU3LFxuICA1ODYxLFxuICA1ODY3LFxuICA1ODY5LFxuICA1ODc5LFxuICA1ODgxLFxuICA1ODk3LFxuICA1OTAzLFxuICA1OTIzLFxuICA1OTI3LFxuICA1OTM5LFxuICA1OTUzLFxuICA1OTgxLFxuICA1OTg3LFxuICA2MDA3LFxuICA2MDExLFxuICA2MDI5LFxuICA2MDM3LFxuICA2MDQzLFxuICA2MDQ3LFxuICA2MDUzLFxuICA2MDY3LFxuICA2MDczLFxuICA2MDc5LFxuICA2MDg5LFxuICA2MDkxLFxuICA2MTAxLFxuICA2MTEzLFxuICA2MTIxLFxuICA2MTMxLFxuICA2MTMzLFxuICA2MTQzLFxuICA2MTUxLFxuICA2MTYzLFxuICA2MTczLFxuICA2MTk3LFxuICA2MTk5LFxuICA2MjAzLFxuICA2MjExLFxuICA2MjE3LFxuICA2MjIxLFxuICA2MjI5LFxuICA2MjQ3LFxuICA2MjU3LFxuICA2MjYzLFxuICA2MjY5LFxuICA2MjcxLFxuICA2Mjc3LFxuICA2Mjg3LFxuICA2Mjk5LFxuICA2MzAxLFxuICA2MzExLFxuICA2MzE3LFxuICA2MzIzLFxuICA2MzI5LFxuICA2MzM3LFxuICA2MzQzLFxuICA2MzUzLFxuICA2MzU5LFxuICA2MzYxLFxuICA2MzY3LFxuICA2MzczLFxuICA2Mzc5LFxuICA2Mzg5LFxuICA2Mzk3LFxuICA2NDIxLFxuICA2NDI3LFxuICA2NDQ5LFxuICA2NDUxLFxuICA2NDY5LFxuICA2NDczLFxuICA2NDgxLFxuICA2NDkxLFxuICA2NTIxLFxuICA2NTI5LFxuICA2NTQ3LFxuICA2NTUxLFxuICA2NTUzLFxuICA2NTYzLFxuICA2NTY5LFxuICA2NTcxLFxuICA2NTc3LFxuICA2NTgxLFxuICA2NTk5LFxuICA2NjA3LFxuICA2NjE5LFxuICA2NjM3LFxuICA2NjUzLFxuICA2NjU5LFxuICA2NjYxLFxuICA2NjczLFxuICA2Njc5LFxuICA2Njg5LFxuICA2NjkxLFxuICA2NzAxLFxuICA2NzAzLFxuICA2NzA5LFxuICA2NzE5LFxuICA2NzMzLFxuICA2NzM3LFxuICA2NzYxLFxuICA2NzYzLFxuICA2Nzc5LFxuICA2NzgxLFxuICA2NzkxLFxuICA2NzkzLFxuICA2ODAzLFxuICA2ODIzLFxuICA2ODI3LFxuICA2ODI5LFxuICA2ODMzLFxuICA2ODQxLFxuICA2ODU3LFxuICA2ODYzLFxuICA2ODY5LFxuICA2ODcxLFxuICA2ODgzLFxuICA2ODk5LFxuICA2OTA3LFxuICA2OTExLFxuICA2OTE3LFxuICA2OTQ3LFxuICA2OTQ5LFxuICA2OTU5LFxuICA2OTYxLFxuICA2OTY3LFxuICA2OTcxLFxuICA2OTc3LFxuICA2OTgzLFxuICA2OTkxLFxuICA2OTk3LFxuICA3MDAxLFxuICA3MDEzLFxuICA3MDE5LFxuICA3MDI3LFxuICA3MDM5LFxuICA3MDQzLFxuICA3MDU3LFxuICA3MDY5LFxuICA3MDc5LFxuICA3MTAzLFxuICA3MTA5LFxuICA3MTIxLFxuICA3MTI3LFxuICA3MTI5LFxuICA3MTUxLFxuICA3MTU5LFxuICA3MTc3LFxuICA3MTg3LFxuICA3MTkzLFxuICA3MjA3LFxuICA3MjExLFxuICA3MjEzLFxuICA3MjE5LFxuICA3MjI5LFxuICA3MjM3LFxuICA3MjQzLFxuICA3MjQ3LFxuICA3MjUzLFxuICA3MjgzLFxuICA3Mjk3LFxuICA3MzA3LFxuICA3MzA5LFxuICA3MzIxLFxuICA3MzMxLFxuICA3MzMzLFxuICA3MzQ5LFxuICA3MzUxLFxuICA3MzY5LFxuICA3MzkzLFxuICA3NDExLFxuICA3NDE3LFxuICA3NDMzLFxuICA3NDUxLFxuICA3NDU3LFxuICA3NDU5LFxuICA3NDc3LFxuICA3NDgxLFxuICA3NDg3LFxuICA3NDg5LFxuICA3NDk5LFxuICA3NTA3LFxuICA3NTE3LFxuICA3NTIzLFxuICA3NTI5LFxuICA3NTM3LFxuICA3NTQxLFxuICA3NTQ3LFxuICA3NTQ5LFxuICA3NTU5LFxuICA3NTYxLFxuICA3NTczLFxuICA3NTc3LFxuICA3NTgzLFxuICA3NTg5LFxuICA3NTkxLFxuICA3NjAzLFxuICA3NjA3LFxuICA3NjIxLFxuICA3NjM5LFxuICA3NjQzLFxuICA3NjQ5LFxuICA3NjY5LFxuICA3NjczLFxuICA3NjgxLFxuICA3Njg3LFxuICA3NjkxLFxuICA3Njk5LFxuICA3NzAzLFxuICA3NzE3LFxuICA3NzIzLFxuICA3NzI3LFxuICA3NzQxLFxuICA3NzUzLFxuICA3NzU3LFxuICA3NzU5LFxuICA3Nzg5LFxuICA3NzkzLFxuICA3ODE3LFxuICA3ODIzLFxuICA3ODI5LFxuICA3ODQxLFxuICA3ODUzLFxuICA3ODY3LFxuICA3ODczLFxuICA3ODc3LFxuICA3ODc5LFxuICA3ODgzLFxuICA3OTAxLFxuICA3OTA3LFxuICA3OTE5XG5dKTtcbnZhciBMQVJHRVNUX1NNQUxMX1BSSU1FID0gNzkxOTtcbmZ1bmN0aW9uIHByaW1lRmFjdG9ycyhuKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMCAmJiBuIDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgblxuICApO1xuICBpZiAobiA8PSAzKVxuICAgIHJldHVybiB7IFtuXTogMSB9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgd2hpbGUgKG4gJSAyID09PSAwKSB7XG4gICAgY291bnQgKz0gMTtcbiAgICBuIC89IDI7XG4gIH1cbiAgaWYgKGNvdW50ID4gMClcbiAgICByZXN1bHRbMl0gPSBjb3VudDtcbiAgY291bnQgPSAwO1xuICB3aGlsZSAobiAlIDMgPT09IDApIHtcbiAgICBjb3VudCArPSAxO1xuICAgIG4gLz0gMztcbiAgfVxuICBpZiAoY291bnQgPiAwKVxuICAgIHJlc3VsdFszXSA9IGNvdW50O1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICB3aGlsZSAoIWRvbmUpIHtcbiAgICBpZiAobiA9PT0gMSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3Qgc3IgPSBNYXRoLnNxcnQobik7XG4gICAgZG9uZSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDY7IGkgPD0gc3IgKyA2OyBpICs9IDYpIHtcbiAgICAgIGlmIChuICUgKGkgLSAxKSA9PT0gMCkge1xuICAgICAgICByZXN1bHRbaSAtIDFdID0gKHJlc3VsdFtpIC0gMV0gPz8gMCkgKyAxO1xuICAgICAgICBuIC89IGkgLSAxO1xuICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG4gJSAoaSArIDEpID09PSAwKSB7XG4gICAgICAgIHJlc3VsdFtpICsgMV0gPSAocmVzdWx0W2kgKyAxXSA/PyAwKSArIDE7XG4gICAgICAgIG4gLz0gaSArIDE7XG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChyZXN1bHRbbl0gIT09IHZvaWQgMClcbiAgICByZXN1bHRbbl0gKz0gMTtcbiAgZWxzZVxuICAgIHJlc3VsdFtuXSA9IDE7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBmYWN0b3JQb3dlcihuLCBleHBvbmVudCkge1xuICBpZiAobiA+PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICByZXR1cm4gWzEsIG5dO1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID4gMCAmJiBuIDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICBjb25zdCBmYWN0b3JzID0gcHJpbWVGYWN0b3JzKG4pO1xuICBsZXQgZiA9IDE7XG4gIGxldCByID0gMTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGZhY3RvcnMpKSB7XG4gICAgY29uc3QgdiA9IHBhcnNlSW50KGspO1xuICAgIGYgPSBmICogTWF0aC5wb3codiwgTWF0aC5mbG9vcihmYWN0b3JzW2tdIC8gZXhwb25lbnQpKTtcbiAgICByID0gciAqIE1hdGgucG93KHYsIGZhY3RvcnNba10gJSBleHBvbmVudCk7XG4gIH1cbiAgcmV0dXJuIFtmLCByXTtcbn1cbmZ1bmN0aW9uIGdjZChhLCBiKSB7XG4gIGlmIChhID09PSAwKVxuICAgIHJldHVybiBiO1xuICBpZiAoYiA9PT0gMClcbiAgICByZXR1cm4gYTtcbiAgaWYgKGEgPT09IGIpXG4gICAgcmV0dXJuIGE7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSlcbiAgICByZXR1cm4gTmFOO1xuICB3aGlsZSAoYiAhPT0gMClcbiAgICBbYSwgYl0gPSBbYiwgYSAlIGJdO1xuICByZXR1cm4gYSA8IDAgPyAtYSA6IGE7XG59XG5mdW5jdGlvbiBsY20oYSwgYikge1xuICByZXR1cm4gYSAqIGIgLyBnY2QoYSwgYik7XG59XG5mdW5jdGlvbiBmYWN0b3JpYWwobikge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgbiA8IDApXG4gICAgcmV0dXJuIE5hTjtcbiAgbGV0IHZhbCA9IDE7XG4gIGZvciAobGV0IGkgPSAyOyBpIDw9IG47IGkrKylcbiAgICB2YWwgPSB2YWwgKiBpO1xuICByZXR1cm4gdmFsO1xufVxudmFyIGdhbW1hRyA9IDc7XG52YXIgbGFuY3pvc183X2MgPSBbXG4gIDAuOTk5OTk5OTk5OTk5ODA5OSxcbiAgNjc2LjUyMDM2ODEyMTg4NTEsXG4gIC0xMjU5LjEzOTIxNjcyMjQwMjgsXG4gIDc3MS4zMjM0Mjg3Nzc2NTMxLFxuICAtMTc2LjYxNTAyOTE2MjE0MDYsXG4gIDEyLjUwNzM0MzI3ODY4NjkwNSxcbiAgLTAuMTM4NTcxMDk1MjY1NzIwMTIsXG4gIDk5ODQzNjk1NzgwMTk1NzJlLTIxLFxuICAxNTA1NjMyNzM1MTQ5MzExNmUtMjNcbl07XG52YXIgZ2FtbWFHTG4gPSA2MDcgLyAxMjg7XG52YXIgZ2FtbWFQTG4gPSBbXG4gIDAuOTk5OTk5OTk5OTk5OTk3LFxuICA1Ny4xNTYyMzU2NjU4NjI5MixcbiAgLTU5LjU5Nzk2MDM1NTQ3NTQ5LFxuICAxNC4xMzYwOTc5NzQ3NDE3NCxcbiAgLTAuNDkxOTEzODE2MDk3NjIwMixcbiAgMzM5OTQ2NDk5ODQ4MTE4OGUtMjAsXG4gIDQ2NTIzNjI4OTI3MDQ4NTdlLTIwLFxuICAtOTgzNzQ0NzUzMDQ4Nzk1NmUtMjAsXG4gIDE1ODA4ODcwMzIyNDkxMjVlLTE5LFxuICAtMjEwMjY0NDQxNzI0MTA0ODhlLTIwLFxuICAyMTc0Mzk2MTgxMTUyMTI2ZS0xOSxcbiAgLTE2NDMxODEwNjUzNjc2MzllLTE5LFxuICA4NDQxODIyMzk4Mzg1Mjc0ZS0yMCxcbiAgLTI2MTkwODM4NDAxNTgxNGUtMTksXG4gIDM2ODk5MTgyNjU5NTMxNjJlLTIxXG5dO1xuZnVuY3Rpb24gbG5nYW1tYSh6KSB7XG4gIGlmICh6IDwgMClcbiAgICByZXR1cm4gTmFOO1xuICBsZXQgeCA9IGdhbW1hUExuWzBdO1xuICBmb3IgKGxldCBpID0gZ2FtbWFQTG4ubGVuZ3RoIC0gMTsgaSA+IDA7IC0taSlcbiAgICB4ICs9IGdhbW1hUExuW2ldIC8gKHogKyBpKTtcbiAgY29uc3QgdCA9IHogKyBnYW1tYUdMbiArIDAuNTtcbiAgcmV0dXJuIDAuNSAqIE1hdGgubG9nKDIgKiBNYXRoLlBJKSArICh6ICsgMC41KSAqIE1hdGgubG9nKHQpIC0gdCArIE1hdGgubG9nKHgpIC0gTWF0aC5sb2coeik7XG59XG5mdW5jdGlvbiBnYW1tYSh6KSB7XG4gIGlmICh6IDwgMC41KVxuICAgIHJldHVybiBNYXRoLlBJIC8gKE1hdGguc2luKE1hdGguUEkgKiB6KSAqIGdhbW1hKDEgLSB6KSk7XG4gIGlmICh6ID4gMTAwKVxuICAgIHJldHVybiBNYXRoLmV4cChsbmdhbW1hKHopKTtcbiAgeiAtPSAxO1xuICBsZXQgeCA9IGxhbmN6b3NfN19jWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGdhbW1hRyArIDI7IGkrKylcbiAgICB4ICs9IGxhbmN6b3NfN19jW2ldIC8gKHogKyBpKTtcbiAgY29uc3QgdCA9IHogKyBnYW1tYUcgKyAwLjU7XG4gIHJldHVybiBNYXRoLnNxcnQoMiAqIE1hdGguUEkpICogTWF0aC5wb3codCwgeiArIDAuNSkgKiBNYXRoLmV4cCgtdCkgKiB4O1xufVxuZnVuY3Rpb24gZnJvbURpZ2l0cyhzLCBiYXNlID0gMTApIHtcbiAgbGV0IHZhbHVlID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgayA9IHtcbiAgICAgIFwiIFwiOiAtMSxcbiAgICAgIFwiXFx4QTBcIjogLTEsXG4gICAgICAvLyBOQlNcbiAgICAgIFwiXFx1MjAwMFwiOiAtMSxcbiAgICAgIC8vIEVOIFFVQURcbiAgICAgIFwiXFx1MjAwMVwiOiAtMSxcbiAgICAgIC8vIEVNIFFVQURcbiAgICAgIFwiXFx1MjAwMlwiOiAtMSxcbiAgICAgIC8vIEVOIFNQQUNFXG4gICAgICBcIlxcdTIwMDNcIjogLTEsXG4gICAgICAvLyBFTSBTUEFDRVxuICAgICAgXCJcXHUyMDA0XCI6IC0xLFxuICAgICAgLy8gVEhSRUUtUEVSLUVNIFNQQUNFXG4gICAgICBcIlxcdTIwMDVcIjogLTEsXG4gICAgICAvLyBGT1VSLVBFUi1FTSBTUEFDRVxuICAgICAgXCJcXHUyMDA2XCI6IC0xLFxuICAgICAgLy8gU0lYLVBFUi1FTSBTUEFDRVxuICAgICAgXCJcXHUyMDA3XCI6IC0xLFxuICAgICAgLy8gRklHVVJFIFNQQUNFXG4gICAgICBcIlxcdTIwMDhcIjogLTEsXG4gICAgICAvLyBQVU5DVFVBVElPTiBTUEFDRVxuICAgICAgXCJcXHUyMDA5XCI6IC0xLFxuICAgICAgLy8gVEhJTiBTUEFDRVxuICAgICAgXCJcXHUyMDBBXCI6IC0xLFxuICAgICAgLy8gSEFJUiBTUEFDRVxuICAgICAgXCJcXHUyMDBCXCI6IC0xLFxuICAgICAgLy8gWldTXG4gICAgICBcIlxcdTIwMkZcIjogLTEsXG4gICAgICAvLyBOQVJST1cgTkJTXG4gICAgICBcIlxcdTIwNUZcIjogLTEsXG4gICAgICAvLyBNRURJVU0gTUFUSEVNQVRJQ0FMIFNQQUNFXG4gICAgICBcIl9cIjogLTEsXG4gICAgICBcIixcIjogLTEsXG4gICAgICBcIjBcIjogMCxcbiAgICAgIFwiMVwiOiAxLFxuICAgICAgXCIyXCI6IDIsXG4gICAgICBcIjNcIjogMyxcbiAgICAgIFwiNFwiOiA0LFxuICAgICAgXCI1XCI6IDUsXG4gICAgICBcIjZcIjogNixcbiAgICAgIFwiN1wiOiA3LFxuICAgICAgXCI4XCI6IDgsXG4gICAgICBcIjlcIjogOSxcbiAgICAgIFwiYVwiOiAxMCxcbiAgICAgIFwiYlwiOiAxMSxcbiAgICAgIFwiY1wiOiAxMixcbiAgICAgIFwiZFwiOiAxMyxcbiAgICAgIFwiZVwiOiAxNCxcbiAgICAgIFwiZlwiOiAxNSxcbiAgICAgIFwiZ1wiOiAxNixcbiAgICAgIFwiaFwiOiAxNyxcbiAgICAgIFwiaVwiOiAxOCxcbiAgICAgIFwialwiOiAxOSxcbiAgICAgIFwia1wiOiAyMCxcbiAgICAgIFwibFwiOiAyMSxcbiAgICAgIFwibVwiOiAyMixcbiAgICAgIFwiblwiOiAyMyxcbiAgICAgIFwib1wiOiAyNCxcbiAgICAgIFwicFwiOiAyNSxcbiAgICAgIFwicVwiOiAyNixcbiAgICAgIFwiclwiOiAyNyxcbiAgICAgIFwic1wiOiAyOCxcbiAgICAgIFwidFwiOiAyOSxcbiAgICAgIFwidVwiOiAzMCxcbiAgICAgIFwidlwiOiAzMSxcbiAgICAgIFwid1wiOiAzMixcbiAgICAgIFwieFwiOiAzMyxcbiAgICAgIFwieVwiOiAzNCxcbiAgICAgIFwielwiOiAzNVxuICAgIH1bc1tpXV07XG4gICAgaWYgKGsgIT09IC0xKSB7XG4gICAgICBpZiAoayA9PT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gW3ZhbHVlLCBzLnN1YnN0cmluZyhpKV07XG4gICAgICBpZiAoayA+PSBiYXNlKVxuICAgICAgICByZXR1cm4gW3ZhbHVlLCBzLnN1YnN0cmluZyhpKV07XG4gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGs7XG4gICAgfVxuICB9XG4gIHJldHVybiBbdmFsdWUsIFwiXCJdO1xufVxuZnVuY3Rpb24gYXNGbG9hdChleHByKSB7XG4gIGNvbnN0IG51bSA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gbnVtO1xuICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIHJldHVybiBudW0udG9OdW1iZXIoKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobnVtKSkge1xuICAgIGNvbnN0IFtuLCBkXSA9IG51bTtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGQgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gbiAvIGQ7XG4gICAgcmV0dXJuIE51bWJlcihuKSAvIE51bWJlcihkKTtcbiAgfVxuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoIShudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleC5kZWZhdWx0KSB8fCBudW0uaW0gIT09IDApO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGFzQmlnbnVtKGV4cHIpIHtcbiAgY29uc3QgbnVtID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChudW0gPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIGV4cHIuZW5naW5lLmJpZ251bShudW0pO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgY29uc3QgW24sIGRdID0gbnVtO1xuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBleHByLmVuZ2luZS5iaWdudW0obiAvIGQpO1xuICAgIHJldHVybiBleHByLmVuZ2luZS5iaWdudW0obikuZGl2KGQudG9TdHJpbmcoKSk7XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KCEobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXguZGVmYXVsdCkgfHwgbnVtLmltICE9PSAwKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBhc1NtYWxsSW50ZWdlcihleHByKSB7XG4gIGNvbnN0IG51bSA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgJiYgbnVtID49IC1TTUFMTF9JTlRFR0VSICYmIG51bSA8PSBTTUFMTF9JTlRFR0VSKVxuICAgICAgcmV0dXJuIG51bTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgaWYgKG51bS5pc0ludGVnZXIoKSkge1xuICAgICAgY29uc3QgbiA9IG51bS50b051bWJlcigpO1xuICAgICAgaWYgKG4gPj0gLVNNQUxMX0lOVEVHRVIgJiYgbiA8PSBTTUFMTF9JTlRFR0VSKVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGV4cHIuaXNDYW5vbmljYWwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHIgPSBudW07XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSB7XG4gICAgY29uc3QgW24sIGRdID0gcjtcbiAgICBsZXQgdjtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGQgPT09IFwibnVtYmVyXCIpXG4gICAgICB2ID0gbiAvIGQ7XG4gICAgZWxzZVxuICAgICAgdiA9IE51bWJlcihuKSAvIE51bWJlcihkKTtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2KSAmJiB2ID49IC1TTUFMTF9JTlRFR0VSICYmIHYgPD0gU01BTExfSU5URUdFUilcbiAgICAgIHJldHVybiB2O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2hvcChuLCB0b2xlcmFuY2UpIHtcbiAgaWYgKHR5cGVvZiBuID09PSBcIm51bWJlclwiICYmIE1hdGguYWJzKG4pIDw9IHRvbGVyYW5jZSlcbiAgICByZXR1cm4gMDtcbiAgaWYgKG4gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbi5hYnMoKS5sdGUodG9sZXJhbmNlKSlcbiAgICByZXR1cm4gMDtcbiAgaWYgKG4gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleC5kZWZhdWx0ICYmIE1hdGguYWJzKG4ucmUpIDw9IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhuLmltKSA8PSB0b2xlcmFuY2UpXG4gICAgcmV0dXJuIDA7XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gZXJmKHgpIHtcbiAgY29uc3QgYTEgPSAwLjI1NDgyOTU5MjtcbiAgY29uc3QgYTIgPSAtMC4yODQ0OTY3MzY7XG4gIGNvbnN0IGEzID0gMS40MjE0MTM3NDE7XG4gIGNvbnN0IGE0ID0gLTEuNDUzMTUyMDI3O1xuICBjb25zdCBhNSA9IDEuMDYxNDA1NDI5O1xuICBjb25zdCBwID0gMC4zMjc1OTExO1xuICBjb25zdCBzaWduMiA9IHggPCAwID8gLTEgOiAxO1xuICB4ID0gTWF0aC5hYnMoeCk7XG4gIGNvbnN0IHQgPSAxIC8gKDEgKyBwICogeCk7XG4gIGNvbnN0IHkgPSAoKCgoYTUgKiB0ICsgYTQpICogdCArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdDtcbiAgcmV0dXJuIHNpZ24yICogKDEgLSB5ICogTWF0aC5leHAoLXggKiB4KSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9udW1lcmljcy9udW1lcmljLWJpZ2ludC50c1xuZnVuY3Rpb24gYmlnaW50KGEpIHtcbiAgaWYgKHR5cGVvZiBhID09PSBcImJpZ2ludFwiKVxuICAgIHJldHVybiBhO1xuICBpZiAoYSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICByZXR1cm4gYmlnaW50KGEudG9TdHJpbmcoKSk7XG4gIGxldCBzID0gYS50b1N0cmluZygpO1xuICBjb25zdCBtID0gcy5tYXRjaCgvKFteXFwuXSspKD86XFwuKFswLTldKykpP2UoLispJC8pO1xuICBpZiAobSkge1xuICAgIHMgPSBtWzFdICsgKG1bMl0gPz8gXCJcIikgKyBcIjBcIi5yZXBlYXQocGFyc2VJbnQobVszXSkgLSAobVsyXSA/IG1bMl0ubGVuZ3RoIDogMCkpO1xuICB9XG4gIHJldHVybiBCaWdJbnQocyk7XG59XG5mdW5jdGlvbiBnY2QyKGEsIGIpIHtcbiAgd2hpbGUgKGIgIT09IEJpZ0ludCgwKSlcbiAgICBbYSwgYl0gPSBbYiwgYSAlIGJdO1xuICByZXR1cm4gYSA8IDAgPyAtYSA6IGE7XG59XG52YXIgUFJJTUVfV0hFRUxfSU5DID0gW1xuICBCaWdJbnQoNCksXG4gIEJpZ0ludCgyKSxcbiAgQmlnSW50KDQpLFxuICBCaWdJbnQoMiksXG4gIEJpZ0ludCg0KSxcbiAgQmlnSW50KDYpLFxuICBCaWdJbnQoMiksXG4gIEJpZ0ludCg2KVxuXTtcbmZ1bmN0aW9uIHByaW1lRmFjdG9yczIoZCkge1xuICBpZiAoZCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgY29uc3QgZmFjdG9ycyA9IHByaW1lRmFjdG9ycyhOdW1iZXIoZCkpO1xuICAgIGNvbnN0IHJlc3VsdDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZiBvZiBPYmplY3Qua2V5cyhmYWN0b3JzKSlcbiAgICAgIHJlc3VsdDIuc2V0KGJpZ2ludChmKSwgZmFjdG9yc1tmXSk7XG4gICAgcmV0dXJuIHJlc3VsdDI7XG4gIH1cbiAgbGV0IG4gPSBkO1xuICBjb25zdCByZXN1bHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgY291bnQyID0gMDtcbiAgbGV0IGNvdW50MyA9IDA7XG4gIGxldCBjb3VudDUgPSAwO1xuICBsZXQgayA9IEJpZ0ludCgxMCk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQyICs9IDE7XG4gICAgY291bnQ1ICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoNSk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQ1ICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoMyk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQzICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoMik7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQyICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGlmIChjb3VudDIgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCIyXCIsIGNvdW50Mik7XG4gIGlmIChjb3VudDMgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCIzXCIsIGNvdW50Myk7XG4gIGlmIChjb3VudDUgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCI1XCIsIGNvdW50NSk7XG4gIGsgPSBCaWdJbnQoNyk7XG4gIGxldCBrSW5kZXggPSBcIlwiO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChrICogayA8IG4pIHtcbiAgICBpZiAobiAlIGsgPT09IEJpZ0ludCgwKSkge1xuICAgICAgaWYgKCFrSW5kZXgpXG4gICAgICAgIGtJbmRleCA9IGsudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5zZXQoa0luZGV4LCAocmVzdWx0LmdldChrSW5kZXgpID8/IDApICsgMSk7XG4gICAgICBuID0gbiAvIGs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSBrICsgUFJJTUVfV0hFRUxfSU5DW2ldO1xuICAgICAga0luZGV4ID0gXCJcIjtcbiAgICAgIGkgPSBpIDwgNyA/IGkgKyAxIDogMDtcbiAgICB9XG4gIH1cbiAgaWYgKG4gIT09IEJpZ0ludCgxKSlcbiAgICByZXN1bHQuc2V0KG4udG9TdHJpbmcoKSwgKHJlc3VsdC5nZXQobi50b1N0cmluZygpKSA/PyAwKSArIDEpO1xuICBjb25zdCByID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbazIsIHZdIG9mIHJlc3VsdClcbiAgICByLnNldChiaWdpbnQoazIpLCB2KTtcbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBmYWN0b3JQb3dlcjIobiwgZXhwb25lbnQpIHtcbiAgY29uc3QgZmFjdG9ycyA9IHByaW1lRmFjdG9yczIobik7XG4gIGxldCBmID0gQmlnSW50KDEpO1xuICBsZXQgciA9IEJpZ0ludCgxKTtcbiAgY29uc3QgZXhwMiA9IGJpZ2ludChleHBvbmVudCk7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIGZhY3RvcnMpIHtcbiAgICBjb25zdCB2MiA9IGJpZ2ludCh2KTtcbiAgICBmID0gZiAqIGsgKiogKHYyIC8gZXhwMik7XG4gICAgciA9IHIgKiBrICoqICh2MiAlIGV4cDIpO1xuICB9XG4gIHJldHVybiBbZiwgcl07XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL3V0aWxzLnRzXG5mdW5jdGlvbiBpc0xhdGV4U3RyaW5nKHMpIHtcbiAgaWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoXCIkXCIpICYmIHMuZW5kc1dpdGgoXCIkXCIpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBsYXRleFN0cmluZyhzKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBzLnN0YXJ0c1dpdGgoXCIkXCIpICYmIHMuZW5kc1dpdGgoXCIkXCIpKVxuICAgIHJldHVybiBzLnNsaWNlKDEsIC0xKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRJbWFnaW5hcnlDb2VmKGV4cHIpIHtcbiAgaWYgKGV4cHIuc3ltYm9sID09PSBcIkltYWdpbmFyeVVuaXRcIilcbiAgICByZXR1cm4gMTtcbiAgY29uc3QgeiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAoeiAhPT0gbnVsbCAmJiB6IGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgyLmRlZmF1bHQgJiYgei5yZSA9PT0gMClcbiAgICByZXR1cm4gei5pbTtcbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgIGNvbnN0IHYgPSBnZXRJbWFnaW5hcnlDb2VmKGV4cHIub3AxKTtcbiAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIk11bHRpcGx5XCIgJiYgZXhwci5ub3BzID09PSAyKSB7XG4gICAgaWYgKGV4cHIub3AxLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpXG4gICAgICByZXR1cm4gYXNGbG9hdChleHByLm9wMik7XG4gICAgaWYgKGV4cHIub3AyLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpXG4gICAgICByZXR1cm4gYXNGbG9hdChleHByLm9wMSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBnZXRGcmVlVmFycyhleHByLCBzZXQpIHtcbiAgaWYgKGV4cHIuc3ltYm9sKSB7XG4gICAgY29uc3QgZGVmID0gZXhwci5lbmdpbmUubG9va3VwU3ltYm9sKGV4cHIuc3ltYm9sKTtcbiAgICBpZiAoZGVmPy52YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgc2V0LmFkZChleHByLnN5bWJvbCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXhwci5vcHMgJiYgIWV4cHIua2V5cylcbiAgICByZXR1cm47XG4gIGlmIChleHByLm9wcylcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLm9wcylcbiAgICAgIGdldEZyZWVWYXJzKG9wMywgc2V0KTtcbiAgaWYgKGV4cHIua2V5cylcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBleHByLmtleXMpXG4gICAgICBnZXRGcmVlVmFycyhleHByLmdldEtleShrZXkpLCBzZXQpO1xuICByZXR1cm47XG59XG5mdW5jdGlvbiBnZXRTeW1ib2xzKGV4cHIsIHNldCkge1xuICBpZiAoZXhwci5zeW1ib2wpIHtcbiAgICBzZXQuYWRkKGV4cHIuc3ltYm9sKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFleHByLm9wcyAmJiAhZXhwci5rZXlzKVxuICAgIHJldHVybjtcbiAgaWYgKGV4cHIub3BzKVxuICAgIGZvciAoY29uc3Qgb3AzIG9mIGV4cHIub3BzKVxuICAgICAgZ2V0U3ltYm9scyhvcDMsIHNldCk7XG4gIGlmIChleHByLmtleXMpXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZXhwci5rZXlzKVxuICAgICAgZ2V0U3ltYm9scyhleHByLmdldEtleShrZXkpLCBzZXQpO1xuICByZXR1cm47XG59XG5mdW5jdGlvbiBnZXRTdWJleHByZXNzaW9ucyhleHByLCBoZWFkMikge1xuICBjb25zdCByZXN1bHQgPSAhaGVhZDIgfHwgZXhwci5oZWFkID09PSBoZWFkMiA/IFtleHByXSA6IFtdO1xuICBpZiAoZXhwci5vcHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLm9wcylcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmdldFN1YmV4cHJlc3Npb25zKG9wMywgaGVhZDIpKTtcbiAgfSBlbHNlIGlmIChleHByLmtleXMpIHtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLmtleXMpXG4gICAgICByZXN1bHQucHVzaCguLi5nZXRTdWJleHByZXNzaW9ucyhleHByLmdldEtleShvcDMpLCBoZWFkMikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBiaWdudW1QcmVmZXJyZWQoY2UpIHtcbiAgcmV0dXJuIGNlLm51bWVyaWNNb2RlID09PSBcImJpZ251bVwiIHx8IGNlLm51bWVyaWNNb2RlID09PSBcImF1dG9cIjtcbn1cbmZ1bmN0aW9uIGNvbXBsZXhBbGxvd2VkKGNlKSB7XG4gIHJldHVybiBjZS5udW1lcmljTW9kZSA9PT0gXCJhdXRvXCIgfHwgY2UubnVtZXJpY01vZGUgPT09IFwiY29tcGxleFwiO1xufVxuZnVuY3Rpb24gaGFzaENvZGUocykge1xuICBsZXQgaGFzaDIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspXG4gICAgaGFzaDIgPSBNYXRoLmltdWwoMzEsIGhhc2gyKSArIHMuY2hhckNvZGVBdChpKSB8IDA7XG4gIHJldHVybiBNYXRoLmFicyhoYXNoMik7XG59XG5mdW5jdGlvbiBiaWdpbnRWYWx1ZShjZSwgZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihleHByKSA/IGJpZ2ludChleHByKSA6IG51bGw7XG4gIGlmIChpc051bWJlckV4cHJlc3Npb24oZXhwcikpIHtcbiAgICBjb25zdCBudW0gPSBpc051bWJlck9iamVjdChleHByKSA/IGV4cHIubnVtLnRvU3RyaW5nKCkgOiBleHByO1xuICAgIGxldCBzID0gbnVtLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW25kXSQvZywgXCJcIikucmVwbGFjZSgvW1xcdTAwMDktXFx1MDAwZFxcdTAwMjBcXHUwMGEwXS9nLCBcIlwiKTtcbiAgICBpZiAoL1xcKFswLTldK1xcKS8udGVzdChzKSkge1xuICAgICAgY29uc3QgW18sIGJvZHksIHJlcGVhdCwgdHJhaWxdID0gcy5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4qKSQvKSA/PyBbXTtcbiAgICAgIHMgPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwoY2UucHJlY2lzaW9uIC8gcmVwZWF0Lmxlbmd0aCkpICsgKHRyYWlsID8/IFwiXCIpO1xuICAgIH1cbiAgICBpZiAocyA9PT0gXCJuYW5cIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzID09PSBcImluZmluaXR5XCIgfHwgcyA9PT0gXCIraW5maW5pdHlcIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzID09PSBcIi1pbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHMuaW5jbHVkZXMoXCIuXCIpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJpZ2ludChzKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGFzQmlnaW50KGV4cHIpIHtcbiAgY29uc3QgbnVtID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChudW0gPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICByZXR1cm4gYmlnaW50KG51bSk7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbnVtLmlzSW50ZWdlcigpKVxuICAgIHJldHVybiBiaWdpbnQobnVtKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ydWxlcy50c1xuZnVuY3Rpb24gbWF0Y2hSdWxlcyhleHByLCBydWxlcywgc3ViMikge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgciA9IGFwcGx5UnVsZShydWxlLCBleHByLCBzdWIyKTtcbiAgICBpZiAociAhPT0gbnVsbClcbiAgICAgIHJlc3VsdC5wdXNoKHIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBib3hSdWxlcyhjZSwgcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbcmF3TGhzLCByYXdSaHMsIG9wdGlvbnNdIG9mIHJzKSB7XG4gICAgbGV0IGNvbmQ7XG4gICAgY29uc3QgbGF0ZXggPSBsYXRleFN0cmluZyhvcHRpb25zPy5jb25kaXRpb24pO1xuICAgIGlmIChsYXRleCkge1xuICAgICAgY29uc3QgY29uZFBhdHRlcm4gPSBjZS5wYXR0ZXJuKGxhdGV4KTtcbiAgICAgIGNvbmQgPSAoeCkgPT4gY29uZFBhdHRlcm4uc3Vicyh4KS52YWx1ZT8uc3ltYm9sID09PSBcIlRydWVcIjtcbiAgICB9IGVsc2VcbiAgICAgIGNvbmQgPSBvcHRpb25zPy5jb25kaXRpb247XG4gICAgcmVzdWx0LmFkZChbXG4gICAgICBjZS5wYXR0ZXJuKHJhd0xocyksXG4gICAgICBjZS5wYXR0ZXJuKHJhd1JocyksXG4gICAgICBvcHRpb25zPy5wcmlvcml0eSA/PyAwLFxuICAgICAgY29uZFxuICAgIF0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBhcHBseVJ1bGUoW2xocywgcmhzLCBfcHJpb3JpdHksIGNvbmRpdGlvbl0sIGV4cHIsIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBzdWIyID0gbGhzLm1hdGNoKGV4cHIsIHsgc3Vic3RpdHV0aW9uLCAuLi5vcHRpb25zIH0pO1xuICBpZiAoc3ViMiA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwiZnVuY3Rpb25cIiAmJiAhY29uZGl0aW9uKHN1YjIpKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gcmhzLnN1YnMoc3ViMiwgeyBjYW5vbmljYWw6IHRydWUgfSk7XG59XG5mdW5jdGlvbiByZXBsYWNlKGV4cHIsIHJ1bGVTZXQsIG9wdGlvbnMpIHtcbiAgY29uc3QgaXRlcmF0aW9uTGltaXQgPSBvcHRpb25zPy5pdGVyYXRpb25MaW1pdCA/PyAxO1xuICBsZXQgaXRlcmF0aW9uQ291bnQgPSAwO1xuICBjb25zdCBvbmNlID0gb3B0aW9ucz8ub25jZSA/PyBmYWxzZTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IGF0TGVhc3RPbmVSdWxlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgd2hpbGUgKCFkb25lICYmIGl0ZXJhdGlvbkNvdW50IDwgaXRlcmF0aW9uTGltaXQpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVTZXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlSdWxlKHJ1bGUsIGV4cHIsIHt9LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IGV4cHIpIHtcbiAgICAgICAgICBpZiAob25jZSlcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGF0TGVhc3RPbmVSdWxlID0gdHJ1ZTtcbiAgICAgICAgICBleHByID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpdGVyYXRpb25Db3VudCArPSAxO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gIH1cbiAgcmV0dXJuIGF0TGVhc3RPbmVSdWxlID8gZXhwciA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRXaWxkY2FyZE5hbWUocykge1xuICBjb25zdCBtID0gcy5tYXRjaCgvXihfXz9fP1thLXpBLVowLTldKykvKTtcbiAgaWYgKG0gPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBtWzFdO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9vcmRlci50c1xudmFyIGltcG9ydF9jb21wbGV4MyA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvcG9seW5vbWlhbHMudHNcbmZ1bmN0aW9uIHRvdGFsRGVncmVlKGV4cHIpIHtcbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiICYmIGV4cHIub3AyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRlZyA9IGFzU21hbGxJbnRlZ2VyKGV4cHIub3AyKTtcbiAgICBpZiAoZGVnICE9PSBudWxsICYmIGRlZyA+IDApXG4gICAgICByZXR1cm4gZGVnO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGxldCBkZWcgPSAxO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIGV4cHIub3BzKSB7XG4gICAgICBjb25zdCB0ID0gdG90YWxEZWdyZWUoYXJnKTtcbiAgICAgIGlmICh0ID4gMSlcbiAgICAgICAgZGVnID0gZGVnICsgdDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZztcbiAgfVxuICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIG1heERlZ3JlZShleHByKSB7XG4gIGlmIChleHByLmhlYWQgPT09IFwiUG93ZXJcIiAmJiBleHByLm9wMi5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBkZWcgPSBhc1NtYWxsSW50ZWdlcihleHByLm9wMik7XG4gICAgaWYgKGRlZyAhPT0gbnVsbCAmJiBkZWcgPiAwKVxuICAgICAgcmV0dXJuIGRlZztcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIk11bHRpcGx5XCIpIHtcbiAgICBsZXQgZGVnID0gMTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByLm9wcylcbiAgICAgIGRlZyA9IE1hdGgubWF4KGRlZywgdG90YWxEZWdyZWUoYXJnKSk7XG4gICAgcmV0dXJuIGRlZztcbiAgfVxuICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGxleChleHByKSB7XG4gIGlmIChleHByLnN5bWJvbClcbiAgICByZXR1cm4gZXhwci5zeW1ib2w7XG4gIGlmIChleHByLm9wcykge1xuICAgIGNvbnN0IGggPSB0eXBlb2YgZXhwci5oZWFkID09PSBcInN0cmluZ1wiID8gZXhwci5oZWFkIDogbGV4KGV4cHIuaGVhZCk7XG4gICAgcmV0dXJuIGggKyAnXCInICsgZXhwci5vcHMubWFwKCh4KSA9PiBsZXgoeCkpLmZpbHRlcigoeCkgPT4geC5sZW5ndGggPiAwKS5qb2luKCdcIicpO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9vcmRlci50c1xudmFyIERFRkFVTFRfQ09NUExFWElUWSA9IDFlNTtcbmZ1bmN0aW9uIHNvcnRBZGQoY2UsIG9wczIpIHtcbiAgcmV0dXJuIG9wczIuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFMZXggPSBsZXgoYSk7XG4gICAgY29uc3QgYkxleCA9IGxleChiKTtcbiAgICBpZiAoIWFMZXggJiYgIWJMZXgpXG4gICAgICByZXR1cm4gb3JkZXIoYSwgYik7XG4gICAgaWYgKCFhTGV4KVxuICAgICAgcmV0dXJuIDE7XG4gICAgaWYgKCFiTGV4KVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChhTGV4IDwgYkxleClcbiAgICAgIHJldHVybiAtMTtcbiAgICBpZiAoYUxleCA+IGJMZXgpXG4gICAgICByZXR1cm4gMTtcbiAgICBjb25zdCBhVG90YWxEZWcgPSB0b3RhbERlZ3JlZShhKTtcbiAgICBjb25zdCBiVG90YWxEZWcgPSB0b3RhbERlZ3JlZShiKTtcbiAgICBpZiAoYVRvdGFsRGVnICE9PSBiVG90YWxEZWcpXG4gICAgICByZXR1cm4gYlRvdGFsRGVnIC0gYVRvdGFsRGVnO1xuICAgIGNvbnN0IGFNYXhEZWcgPSBtYXhEZWdyZWUoYSk7XG4gICAgY29uc3QgYk1heERlZyA9IG1heERlZ3JlZShiKTtcbiAgICBpZiAoYU1heERlZyAhPT0gYk1heERlZylcbiAgICAgIHJldHVybiBhTWF4RGVnIC0gYk1heERlZztcbiAgICByZXR1cm4gb3JkZXIoYSwgYik7XG4gIH0pO1xufVxuZnVuY3Rpb24gb3JkZXIoYSwgYikge1xuICBpZiAoYSA9PT0gYilcbiAgICByZXR1cm4gMDtcbiAgaWYgKGEubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIGEubnVtZXJpY1ZhbHVlID09PSBiLm51bWVyaWNWYWx1ZSlcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgYWYgPSBhc0Zsb2F0KGEpO1xuICBpZiAoYWYgIT09IG51bGwpIHtcbiAgICBjb25zdCBiZiA9IGFzRmxvYXQoYik7XG4gICAgaWYgKGJmICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGFmIC0gYmY7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChhLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4My5kZWZhdWx0KSB7XG4gICAgaWYgKGIubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgzLmRlZmF1bHQpIHtcbiAgICAgIGlmIChhLm51bWVyaWNWYWx1ZS5yZSA9PT0gYi5udW1lcmljVmFsdWUucmUpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGEubnVtZXJpY1ZhbHVlLmltKSA9PT0gTWF0aC5hYnMoYi5udW1lcmljVmFsdWUuaW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGEubnVtZXJpY1ZhbHVlLmltIC0gYi5udW1lcmljVmFsdWUuaW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGEubnVtZXJpY1ZhbHVlLmltKSAtIE1hdGguYWJzKGIubnVtZXJpY1ZhbHVlLmltKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhLm51bWVyaWNWYWx1ZS5yZSAtIGIubnVtZXJpY1ZhbHVlLnJlO1xuICAgIH1cbiAgICBpZiAoYi5udW1lcmljVmFsdWUgIT09IG51bGwpXG4gICAgICByZXR1cm4gMTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGEubnVtZXJpY1ZhbHVlKSB7XG4gICAgaWYgKGIubnVtZXJpY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChhLmhlYWQgPT09IFwiU3FydFwiICYmIGEub3AxLm51bWVyaWNWYWx1ZSkge1xuICAgIGlmIChiLmhlYWQgPT09IFwiU3FydFwiICYmIGIub3AxLm51bWVyaWNWYWx1ZSlcbiAgICAgIHJldHVybiBvcmRlcihhLm9wMSwgYi5vcDEpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYS5zeW1ib2wpIHtcbiAgICBpZiAoYi5zeW1ib2wpIHtcbiAgICAgIGlmIChhLnN5bWJvbCA9PT0gYi5zeW1ib2wpXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgcmV0dXJuIGEuc3ltYm9sID4gYi5zeW1ib2wgPyAxIDogLTE7XG4gICAgfVxuICAgIGlmIChiLm51bWVyaWNWYWx1ZSAhPT0gbnVsbClcbiAgICAgIHJldHVybiAxO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYS5vcHMpIHtcbiAgICBpZiAoYi5vcHMpIHtcbiAgICAgIGNvbnN0IGFDb21wbGV4aXR5ID0gYS5mdW5jdGlvbkRlZmluaXRpb24/LmNvbXBsZXhpdHkgPz8gREVGQVVMVF9DT01QTEVYSVRZO1xuICAgICAgY29uc3QgYkNvbXBsZXhpdHkgPSBiLmZ1bmN0aW9uRGVmaW5pdGlvbj8uY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgICBpZiAoYUNvbXBsZXhpdHkgPT09IGJDb21wbGV4aXR5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYS5oZWFkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiLmhlYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoYS5oZWFkID09PSBiLmhlYWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRMZWFmQ291bnQoYSkgLSBnZXRMZWFmQ291bnQoYik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhLmhlYWQgPCBiLmhlYWQpXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldExlYWZDb3VudChhKSAtIGdldExlYWZDb3VudChiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhQ29tcGxleGl0eSAtIGJDb21wbGV4aXR5O1xuICAgIH1cbiAgICBpZiAoYi5udW1lcmljVmFsdWUgIT09IG51bGwgfHwgYi5zeW1ib2wpXG4gICAgICByZXR1cm4gMTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGEuc3RyaW5nKSB7XG4gICAgaWYgKGIuc3RyaW5nKSB7XG4gICAgICBpZiAoYS5zdHJpbmcubGVuZ3RoICE9PSBiLnN0cmluZy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBiLnN0cmluZy5sZW5ndGggLSBhLnN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAoYi5zdHJpbmcgPCBhLnN0cmluZylcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuc3RyaW5nID4gYi5zdHJpbmcpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChiLmtleXMpXG4gICAgICByZXR1cm4gLTE7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKGEua2V5cyAmJiBiLmtleXMpIHtcbiAgICBpZiAoYS5rZXlzQ291bnQgIT09IGIua2V5c0NvdW50KVxuICAgICAgcmV0dXJuIGIua2V5c0NvdW50IC0gYS5rZXlzQ291bnQ7XG4gICAgbGV0IGJDb21wbGV4aXR5ID0gMDtcbiAgICBsZXQgYUNvbXBsZXhpdHkgPSAwO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGIua2V5cylcbiAgICAgIGJDb21wbGV4aXR5ICs9IGIuZ2V0S2V5KGtleSkuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYS5rZXlzKVxuICAgICAgYUNvbXBsZXhpdHkgKz0gYS5nZXRLZXkoa2V5KS5jb21wbGV4aXR5ID8/IERFRkFVTFRfQ09NUExFWElUWTtcbiAgICByZXR1cm4gYUNvbXBsZXhpdHkgLSBiQ29tcGxleGl0eTtcbiAgfVxuICByZXR1cm4gKGEuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFkpIC0gKGIuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFkpO1xufVxuZnVuY3Rpb24gZ2V0TGVhZkNvdW50KGV4cHIpIHtcbiAgaWYgKGV4cHIua2V5cyAhPT0gbnVsbClcbiAgICByZXR1cm4gMSArIGV4cHIua2V5c0NvdW50O1xuICBpZiAoIWV4cHIub3BzKVxuICAgIHJldHVybiAxO1xuICByZXR1cm4gKHR5cGVvZiBleHByLmhlYWQgPT09IFwic3RyaW5nXCIgPyAxIDogZ2V0TGVhZkNvdW50KGV4cHIuaGVhZCkpICsgWy4uLmV4cHIub3BzXS5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgZ2V0TGVhZkNvdW50KHgpLCAwKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3N5bWJvbGljL2ZsYXR0ZW4udHNcbmZ1bmN0aW9uIGZsYXR0ZW5PcHMob3BzMiwgaGVhZDIpIHtcbiAgaWYgKCFoZWFkMilcbiAgICByZXR1cm4gb3BzMjtcbiAgaWYgKG9wczIuZXZlcnkoKHgpID0+ICF4Lm9wcyB8fCB4LmhlYWQgIT09IGhlYWQyKSlcbiAgICByZXR1cm4gb3BzMjtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICBpZiAoIWFyZy5vcHMgfHwgYXJnLmhlYWQgIT09IGhlYWQyKVxuICAgICAgcmVzdWx0LnB1c2goYXJnKTtcbiAgICBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmZsYXR0ZW5PcHMoYXJnLm9wcywgaGVhZDIpKTtcbiAgICB9XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHJlc3VsdC5sZW5ndGggIT09IG9wczIubGVuZ3RoKTtcbiAgaWYgKHJlc3VsdC5sZW5ndGggPT09IG9wczIubGVuZ3RoKVxuICAgIHJldHVybiBvcHMyO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZmxhdHRlblNlcXVlbmNlKHhzKSB7XG4gIGlmICh4cy5ldmVyeSgoeCkgPT4geC5oZWFkICE9PSBcIlNlcXVlbmNlXCIpKVxuICAgIHJldHVybiB4cztcbiAgY29uc3QgeXMgPSBbXTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKHguaXNWYWxpZCAmJiB4LmhlYWQgPT09IFwiU2VxdWVuY2VcIikge1xuICAgICAgaWYgKHgub3BzKVxuICAgICAgICB5cy5wdXNoKC4uLngub3BzKTtcbiAgICB9IGVsc2VcbiAgICAgIHlzLnB1c2goeCk7XG4gIH1cbiAgcmV0dXJuIHlzO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsKHhzKSB7XG4gIHJldHVybiB4cy5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkgPyB4cyA6IHhzLm1hcCgoeCkgPT4geC5jYW5vbmljYWwpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbnVtZXJpY3MvcmF0aW9uYWxzLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg0ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBpc1JhdGlvbmFsKHgpIHtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh4KTtcbn1cbmZ1bmN0aW9uIGlzTWFjaGluZVJhdGlvbmFsKHgpIHtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh4KSAmJiB0eXBlb2YgeFswXSA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzQmlnUmF0aW9uYWwoeCkge1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHgpICYmIHR5cGVvZiB4WzBdID09PSBcImJpZ2ludFwiO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbFplcm8oeCkge1xuICByZXR1cm4geFswXSA9PSAwO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbE9uZSh4KSB7XG4gIHJldHVybiB4WzBdID09PSB4WzFdO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbE5lZ2F0aXZlT25lKHgpIHtcbiAgcmV0dXJuIHhbMF0gPT09IC14WzFdO1xufVxuZnVuY3Rpb24gbWFjaGluZU51bWVyYXRvcih4KSB7XG4gIHJldHVybiBOdW1iZXIoeFswXSk7XG59XG5mdW5jdGlvbiBtYWNoaW5lRGVub21pbmF0b3IoeCkge1xuICByZXR1cm4gTnVtYmVyKHhbMV0pO1xufVxuZnVuY3Rpb24gaXNOZWcoeCkge1xuICByZXR1cm4geFswXSA8IDA7XG59XG5mdW5jdGlvbiBuZWcoeCkge1xuICByZXR1cm4gWy14WzBdLCB4WzFdXTtcbn1cbmZ1bmN0aW9uIGludmVyc2UoeCkge1xuICByZXR1cm4geFswXSA8IDAgPyBbLXhbMV0sIC14WzBdXSA6IFt4WzFdLCB4WzBdXTtcbn1cbmZ1bmN0aW9uIGFzUmF0aW9uYWwoZXhwcikge1xuICBjb25zdCBudW0gPSBleHByLm51bWVyaWNWYWx1ZTtcbiAgaWYgKG51bSA9PT0gbnVsbClcbiAgICByZXR1cm4gdm9pZCAwO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pKVxuICAgIHJldHVybiBudW07XG4gIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICByZXR1cm4gW251bSwgMV07XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbnVtLmlzSW50ZWdlcigpKVxuICAgIHJldHVybiBbYmlnaW50KG51bSksIEJpZ0ludCgxKV07XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBhc01hY2hpbmVSYXRpb25hbChyKSB7XG4gIHJldHVybiBbTnVtYmVyKHJbMF0pLCBOdW1iZXIoclsxXSldO1xufVxuZnVuY3Rpb24gYWRkMihsaHMsIHJocykge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShyaHMpIHx8IHJocy5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgIShyaHMgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgKTtcbiAgaWYgKHR5cGVvZiBsaHNbMF0gPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShsaHNbMF0pKVxuICAgIHJldHVybiBsaHM7XG4gIGNvbnN0IHJoc051bSA9IEFycmF5LmlzQXJyYXkocmhzKSA/IHJocyA6IHJocy5udW1lcmljVmFsdWU7XG4gIGlmIChyaHNOdW0gPT09IG51bGwpXG4gICAgcmV0dXJuIGxocztcbiAgaWYgKEFycmF5LmlzQXJyYXkocmhzTnVtKSkge1xuICAgIGlmIChpc0JpZ1JhdGlvbmFsKHJoc051bSkpIHtcbiAgICAgIGxocyA9IFtiaWdpbnQobGhzWzBdKSwgYmlnaW50KGxoc1sxXSldO1xuICAgICAgcmV0dXJuIFtyaHNOdW1bMV0gKiBsaHNbMF0gKyByaHNOdW1bMF0gKiBsaHNbMV0sIHJoc051bVsxXSAqIGxoc1sxXV07XG4gICAgfVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJoc051bVswXSkpXG4gICAgICByZXR1cm4gcmhzTnVtO1xuICAgIGlmIChpc0JpZ1JhdGlvbmFsKGxocykpIHtcbiAgICAgIGNvbnN0IGJpZ1JocyA9IFtiaWdpbnQocmhzTnVtWzBdKSwgYmlnaW50KHJoc051bVsxXSldO1xuICAgICAgcmV0dXJuIFtiaWdSaHNbMV0gKiBsaHNbMF0gKyBiaWdSaHNbMF0gKiBsaHNbMV0sIGJpZ1Joc1sxXSAqIGxoc1sxXV07XG4gICAgfVxuICAgIHJldHVybiBbcmhzTnVtWzFdICogbGhzWzBdICsgcmhzTnVtWzBdICogbGhzWzFdLCByaHNOdW1bMV0gKiBsaHNbMV1dO1xuICB9XG4gIGlmIChyaHNOdW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpIHtcbiAgICBpZiAocmhzTnVtLmlzTmFOKCkpXG4gICAgICByZXR1cm4gW051bWJlci5OYU4sIDFdO1xuICAgIGlmICghcmhzTnVtLmlzRmluaXRlKCkpXG4gICAgICByZXR1cm4gW3Joc051bS5pc05lZ2F0aXZlKCkgPyAtSW5maW5pdHkgOiBJbmZpbml0eSwgMV07XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHJoc051bS5pc0ludGVnZXIoKSk7XG4gICAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICBsaHMgPSBbYmlnaW50KGxoc1swXSksIGJpZ2ludChsaHNbMV0pXTtcbiAgICByZXR1cm4gW2xoc1swXSArIGxoc1sxXSAqIGJpZ2ludChyaHNOdW0udG9TdHJpbmcoKSksIGxoc1sxXV07XG4gIH1cbiAgaWYgKHJoc051bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4NC5kZWZhdWx0KVxuICAgIHJldHVybiBbTnVtYmVyLk5hTiwgMV07XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghTnVtYmVyLmlzRmluaXRlKHJoc051bSkgfHwgTnVtYmVyLmlzSW50ZWdlcihyaHNOdW0pKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmhzTnVtKSlcbiAgICByZXR1cm4gW3Joc051bSwgMV07XG4gIGlmIChpc01hY2hpbmVSYXRpb25hbChsaHMpKVxuICAgIHJldHVybiBbbGhzWzBdICsgbGhzWzFdICogcmhzTnVtLCBsaHNbMV1dO1xuICByZXR1cm4gW2xoc1swXSArIGxoc1sxXSAqIGJpZ2ludChyaHNOdW0pLCBsaHNbMV1dO1xufVxuZnVuY3Rpb24gbXVsMihsaHMsIHJocykge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShyaHMpIHx8IHJocy5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgIShyaHMgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmhzKSkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChsaHMpICYmIGlzTWFjaGluZVJhdGlvbmFsKHJocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc1swXSwgbGhzWzFdICogcmhzWzFdXTtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobGhzKSlcbiAgICAgIGxocyA9IFtiaWdpbnQobGhzWzBdKSwgYmlnaW50KGxoc1sxXSldO1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChyaHMpKVxuICAgICAgcmhzID0gW2JpZ2ludChyaHNbMF0pLCBiaWdpbnQocmhzWzFdKV07XG4gICAgcmV0dXJuIFtsaHNbMF0gKiByaHNbMF0sIGxoc1sxXSAqIHJoc1sxXV07XG4gIH1cbiAgY29uc3QgcmhzTnVtID0gcmhzLm51bWVyaWNWYWx1ZTtcbiAgaWYgKHJoc051bSAhPT0gbnVsbCAmJiB0eXBlb2YgcmhzTnVtID09PSBcIm51bWJlclwiKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIocmhzTnVtKSk7XG4gICAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc051bSwgbGhzWzFdXTtcbiAgICByZXR1cm4gW2xoc1swXSAqIGJpZ2ludChyaHNOdW0pLCBsaHNbMV1dO1xuICB9XG4gIGlmIChyaHNOdW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocmhzTnVtLmlzSW50ZWdlcigpKTtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobGhzKSlcbiAgICAgIHJldHVybiBbYmlnaW50KHJoc051bS50b1N0cmluZygpKSAqIGJpZ2ludChsaHNbMF0pLCBiaWdpbnQobGhzWzFdKV07XG4gICAgcmV0dXJuIFtiaWdpbnQocmhzTnVtLnRvU3RyaW5nKCkpICogbGhzWzBdLCBsaHNbMV1dO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHJoc051bSkpIHtcbiAgICBpZiAoaXNCaWdSYXRpb25hbChyaHNOdW0pKVxuICAgICAgcmV0dXJuIFtyaHNOdW1bMF0gKiBiaWdpbnQobGhzWzBdKSwgcmhzTnVtWzFdICogYmlnaW50KGxoc1sxXSldO1xuICAgIGVsc2UgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc051bVswXSwgbGhzWzFdICogcmhzTnVtWzFdXTtcbiAgICByZXR1cm4gW2xoc1swXSAqIGJpZ2ludChyaHNOdW1bMF0pLCBsaHNbMV0gKiBiaWdpbnQocmhzTnVtWzFdKV07XG4gIH1cbiAgcmV0dXJuIGxocztcbn1cbmZ1bmN0aW9uIHBvdzIociwgZXhwMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihleHAyKSk7XG4gIGlmIChleHAyID09PSAwKVxuICAgIHJldHVybiBbMSwgMV07XG4gIGlmIChleHAyIDwgMCkge1xuICAgIHIgPSBpbnZlcnNlKHIpO1xuICAgIGV4cDIgPSAtZXhwMjtcbiAgfVxuICBpZiAoZXhwMiA9PT0gMSlcbiAgICByZXR1cm4gcjtcbiAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKHIpKVxuICAgIHJldHVybiBbTWF0aC5wb3coclswXSwgZXhwMiksIE1hdGgucG93KHJbMV0sIGV4cDIpXTtcbiAgY29uc3QgYmlnZXhwID0gYmlnaW50KGV4cDIpO1xuICByZXR1cm4gW3JbMF0gKiogYmlnZXhwLCByWzFdICoqIGJpZ2V4cF07XG59XG5mdW5jdGlvbiByZWR1Y2VkUmF0aW9uYWwocikge1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwocikpIHtcbiAgICBpZiAoclswXSA9PT0gMSB8fCByWzFdID09PSAxKVxuICAgICAgcmV0dXJuIHI7XG4gICAgaWYgKHJbMV0gPCAwKVxuICAgICAgciA9IFstclswXSwgLXJbMV1dO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJbMV0pKVxuICAgICAgcmV0dXJuIFswLCAxXTtcbiAgICBjb25zdCBnMiA9IGdjZChyWzBdLCByWzFdKTtcbiAgICByZXR1cm4gZzIgPD0gMSA/IHIgOiBbclswXSAvIGcyLCByWzFdIC8gZzJdO1xuICB9XG4gIGlmIChyWzBdID09PSBCaWdJbnQoMSkgfHwgclsxXSA9PT0gQmlnSW50KDEpKVxuICAgIHJldHVybiByO1xuICBpZiAoclsxXSA8IDApXG4gICAgciA9IFstclswXSwgLXJbMV1dO1xuICBjb25zdCBnID0gZ2NkMihyWzBdLCByWzFdKTtcbiAgaWYgKGcgPD0gMSlcbiAgICByZXR1cm4gcjtcbiAgcmV0dXJuIFtyWzBdIC8gZywgclsxXSAvIGddO1xufVxuZnVuY3Rpb24gcmF0aW9uYWxpemUoeCkge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSlcbiAgICByZXR1cm4geDtcbiAgY29uc3QgZnJhY3Rpb25hbCA9IHggJSAxO1xuICBpZiAoZnJhY3Rpb25hbCA9PT0gMClcbiAgICByZXR1cm4geDtcbiAgY29uc3QgZXBzID0gMWUtMTU7XG4gIGxldCBhID0gTWF0aC5mbG9vcih4KTtcbiAgbGV0IGgxID0gMTtcbiAgbGV0IGsxID0gMDtcbiAgbGV0IGggPSBhO1xuICBsZXQgayA9IDE7XG4gIHdoaWxlICh4IC0gYSA+IGVwcyAqIGsgKiBrKSB7XG4gICAgeCA9IDEgLyAoeCAtIGEpO1xuICAgIGEgPSBNYXRoLmZsb29yKHgpO1xuICAgIGNvbnN0IGgyID0gaDE7XG4gICAgaDEgPSBoO1xuICAgIGNvbnN0IGsyID0gazE7XG4gICAgazEgPSBrO1xuICAgIGggPSBoMiArIGEgKiBoMTtcbiAgICBrID0gazIgKyBhICogazE7XG4gIH1cbiAgcmV0dXJuIFtoLCBrXTtcbn1cbmZ1bmN0aW9uIGFzQ29lZmZpY2llbnQoZXhwcikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoZXhwci5pc0Nhbm9uaWNhbCk7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGNvbnN0IHJlc3QgPSBbXTtcbiAgICBsZXQgY29lZiA9IFsxLCAxXTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByLm9wcykge1xuICAgICAgY29uc3QgbjIgPSBhcmcubnVtZXJpY1ZhbHVlO1xuICAgICAgaWYgKG4yICE9PSBudWxsICYmICh0eXBlb2YgbjIgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihuMikgfHwgbjIgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbjIuaXNJbnRlZ2VyKCkgfHwgaXNSYXRpb25hbChuMikpKVxuICAgICAgICBjb2VmID0gbXVsMihjb2VmLCBhcmcpO1xuICAgICAgZWxzZVxuICAgICAgICByZXN0LnB1c2goYXJnKTtcbiAgICB9XG4gICAgY29lZiA9IHJlZHVjZWRSYXRpb25hbChjb2VmKTtcbiAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgIHJldHVybiBbWzEsIDFdLCBleHByXTtcbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gW2NvZWYsIGNlLl9PTkVdO1xuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiBbY29lZiwgcmVzdFswXV07XG4gICAgcmV0dXJuIFtjb2VmLCBjZS5tdWwocmVzdCldO1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiRGl2aWRlXCIpIHtcbiAgICBsZXQgW2NvZWYxLCBudW1lcl0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICBjb25zdCBbY29lZjIsIGRlbm9tXSA9IGFzQ29lZmZpY2llbnQoZXhwci5vcDIpO1xuICAgIGNvbnN0IGNvZWYgPSByZWR1Y2VkUmF0aW9uYWwobXVsMihjb2VmMSwgaW52ZXJzZShjb2VmMikpKTtcbiAgICBpZiAoZGVub20uaXNPbmUpXG4gICAgICByZXR1cm4gW2NvZWYsIG51bWVyXTtcbiAgICByZXR1cm4gW2NvZWYsIGNlLmRpdihudW1lciwgZGVub20pXTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIlBvd2VyXCIpIHtcbiAgICBpZiAoZXhwci5vcDIubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgICAgcmV0dXJuIFtbMSwgMV0sIGV4cHJdO1xuICAgIGxldCBbY29lZiwgYmFzZV0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgIHJldHVybiBbWzEsIDFdLCBleHByXTtcbiAgICBjb25zdCBleHBvbmVudCA9IGV4cHIub3AyO1xuICAgIGNvbnN0IGUgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKGUgPT09IC0xKVxuICAgICAgcmV0dXJuIFtpbnZlcnNlKGNvZWYpLCBjZS5pbnYoYmFzZSldO1xuICAgIGlmIChlICE9PSBudWxsKVxuICAgICAgcmV0dXJuIFtwb3cyKGNvZWYsIGUpLCBjZS5wb3coYmFzZSwgZXhwb25lbnQpXTtcbiAgICBpZiAoZXhwb25lbnQubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkoZXhwb25lbnQubnVtZXJpY1ZhbHVlKSkge1xuICAgICAgY29uc3QgW2VuLCBlZF0gPSBhc01hY2hpbmVSYXRpb25hbChleHBvbmVudC5udW1lcmljVmFsdWUpO1xuICAgICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSBhc01hY2hpbmVSYXRpb25hbChjb2VmKTtcbiAgICAgIGlmIChudW1lciA+IDAgJiYgTWF0aC5hYnMoZW4pID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFtuQ29lZiwgblJlc3RdID0gZmFjdG9yUG93ZXIobnVtZXIsIGVkKTtcbiAgICAgICAgY29uc3QgW2RDb2VmLCBkUmVzdF0gPSBmYWN0b3JQb3dlcihkZW5vbSwgZWQpO1xuICAgICAgICBpZiAobkNvZWYgPT09IDEgJiYgZENvZWYgPT09IDEpXG4gICAgICAgICAgcmV0dXJuIFtbMSwgMV0sIGV4cHJdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGVuID09PSAxID8gW25Db2VmLCBkQ29lZl0gOiBbZENvZWYsIG5Db2VmXSxcbiAgICAgICAgICBjZS5wb3coY2UubXVsKFtjZS5udW1iZXIoW25SZXN0LCBkUmVzdF0pLCBiYXNlXSksIGV4cG9uZW50KVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1sxLCAxXSwgZXhwcl07XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJBZGRcIikge1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCBbY29lZiwgcmVzdF0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICByZXR1cm4gW25lZyhjb2VmKSwgcmVzdF07XG4gIH1cbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobiAhPT0gbnVsbCkge1xuICAgIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgICBpZiAobi5pc0ludGVnZXIoKSlcbiAgICAgICAgcmV0dXJuIFtbYmlnaW50KG4udG9TdHJpbmcoKSksIEJpZ0ludCgxKV0sIGNlLl9PTkVdO1xuICAgICAgaWYgKG4uaXNOZWdhdGl2ZSgpKVxuICAgICAgICByZXR1cm4gW1stMSwgMV0sIGNlLm51bWJlcihuLm5lZygpKV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobikpXG4gICAgICAgIHJldHVybiBbW24sIDFdLCBjZS5fT05FXTtcbiAgICAgIGlmIChuIDwgMClcbiAgICAgICAgcmV0dXJuIFtbLTEsIDFdLCBjZS5udW1iZXIoLW4pXTtcbiAgICB9XG4gICAgaWYgKGlzUmF0aW9uYWwobikpXG4gICAgICByZXR1cm4gW24sIGNlLl9PTkVdO1xuICAgIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQgJiYgbi5yZSA8IDApXG4gICAgICByZXR1cm4gW1stMSwgMV0sIGNlLm51bWJlcihjZS5jb21wbGV4KC1uLnJlLCAtbi5pbSkpXTtcbiAgfVxuICByZXR1cm4gW1sxLCAxXSwgZXhwcl07XG59XG5mdW5jdGlvbiBzaWduRGlmZihsaHMsIHJocywgdG9sZXJhbmNlKSB7XG4gIGlmIChsaHMgPT09IHJocylcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgbGhzTiA9IGxocy5OKCk7XG4gIGNvbnN0IHJoc04gPSByaHMuTigpO1xuICBjb25zdCBsaHNOdW0gPSBsaHNOLm51bWVyaWNWYWx1ZTtcbiAgY29uc3QgcmhzTnVtID0gcmhzTi5udW1lcmljVmFsdWU7XG4gIGlmIChsaHNOdW0gPT09IG51bGwgfHwgcmhzTnVtID09PSBudWxsKSB7XG4gICAgY29uc3QgbGhzUyA9IGxocy5zZ247XG4gICAgY29uc3QgcmhzUyA9IHJocy5zZ247XG4gICAgaWYgKHR5cGVvZiBsaHNTICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiByaHNTICE9PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAobGhzUyA9PT0gMCAmJiByaHNTID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKGxoc1MgPCAwICYmIHJoc1MgPiAwKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChsaHNTID4gMCAmJiByaHNTIDwgMClcbiAgICAgIHJldHVybiAxO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgdG9sZXJhbmNlID8/ICh0b2xlcmFuY2UgPSBsaHMuZW5naW5lLnRvbGVyYW5jZSk7XG4gIGlmIChsaHNOdW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdCAmJiByaHNOdW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgICByZXR1cm4gY2hvcChsaHNOdW0ucmUgLSByaHNOdW0ucmUsIHRvbGVyYW5jZSkgPT09IDAgJiYgY2hvcChsaHNOdW0uaW0gLSByaHNOdW0uaW0sIHRvbGVyYW5jZSkgPT09IDAgPyAwIDogdm9pZCAwO1xuICBpZiAobGhzTnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQgfHwgcmhzTnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGlzUmF0aW9uYWwobGhzTnVtKSB8fCBpc1JhdGlvbmFsKHJoc051bSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBsaHNOdW0gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHJoc051bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChjaG9wKHJoc051bSAtIGxoc051bSwgdG9sZXJhbmNlKSA9PT0gMClcbiAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiBsaHNOdW0gPCByaHNOdW0gPyAtMSA6IDE7XG4gIH1cbiAgY29uc3QgY2UgPSBsaHMuZW5naW5lO1xuICBjb25zdCBkZWx0YSA9IGNlLmJpZ251bShyaHNOdW0pLnN1YihjZS5iaWdudW0obGhzTnVtKSk7XG4gIGlmIChjaG9wKGRlbHRhLCB0b2xlcmFuY2UpID09PSAwKVxuICAgIHJldHVybiAwO1xuICByZXR1cm4gZGVsdGEuaXNQb3MoKSA/IDEgOiAtMTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3N5bWJvbGljL3N1bS50c1xudmFyIGltcG9ydF9jb21wbGV4NSA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xudmFyIFN1bSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIHhzLCBvcHRpb25zKSB7XG4gICAgLy8gSWYgYGZhbHNlYCwgdGhlIHJ1bm5pbmcgc3VtcyBhcmUgbm90IGNhbGN1bGF0ZWRcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgdGhpcy5faW1hZ2luYXJ5ID0gMDtcbiAgICB0aGlzLl9wb3NJbmZpbml0eUNvdW50ID0gMDtcbiAgICB0aGlzLl9uZWdJbmZpbml0eUNvdW50ID0gMDtcbiAgICB0aGlzLl9uYU5Db3VudCA9IDA7XG4gICAgLy8gRWFjaCB0ZXJtIGlzIGZhY3RvcmVkIGFzIHRoZSBwcm9kdWN0IG9mIGEgcmF0aW9uYWwgYW5kIGFuIGV4cHJlc3Npb25cbiAgICAvLyBGb3Igbm93LCBvbmx5IHJhdGlvbmFscyBhcmUgZmFjdG9yZWQsIHNvIGAxLjJ4ICsgMi41eGAgYXJlIG5vdCBjb21iaW5lZC5cbiAgICB0aGlzLl90ZXJtcyA9IFtdO1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IG9wdGlvbnMuY2Fub25pY2FsO1xuICAgIHRoaXMuZW5naW5lID0gY2U7XG4gICAgdGhpcy5fcmF0aW9uYWwgPSBiaWdudW1QcmVmZXJyZWQoY2UpID8gW0JpZ0ludCgwKSwgQmlnSW50KDEpXSA6IFswLCAxXTtcbiAgICB0aGlzLl9iaWdudW0gPSBjZS5fQklHTlVNX1pFUk87XG4gICAgdGhpcy5fbnVtYmVyID0gMDtcbiAgICBpZiAoeHMpXG4gICAgICBmb3IgKGNvbnN0IHggb2YgeHMpXG4gICAgICAgIHRoaXMuYWRkVGVybSh4KTtcbiAgfVxuICBnZXQgaXNFbXB0eSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHRoaXMuX3Rlcm1zLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5fdGVybXMubGVuZ3RoID09PSAwICYmIGlzUmF0aW9uYWxaZXJvKHRoaXMuX3JhdGlvbmFsKSAmJiB0aGlzLl9pbWFnaW5hcnkgPT09IDAgJiYgdGhpcy5fbnVtYmVyID09PSAwICYmIHRoaXMuX2JpZ251bS5pc1plcm8oKSAmJiB0aGlzLl9uZWdJbmZpbml0eUNvdW50ID09PSAwICYmIHRoaXMuX3Bvc0luZmluaXR5Q291bnQgPT09IDAgJiYgdGhpcy5fbmFOQ291bnQgPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHRlcm0gdG8gdGhlIHN1bS5cbiAgICpcbiAgICogQSB0ZXJtIGlzIGEgcmF0aW9uYWwgY29lZmZpY2llbnQgYW5kIGFuIGV4cHJlc3Npb24uXG4gICAqIE9wdGlvbmFsbHksIHRoZSB0ZXJtIGlzIG11bHRpcGxpZWQgYnkgdGhlIGNvbnN0YW50IGBjYCBiZWZvcmUgYmVpbmcgYWRkZWQuXG4gICAqXG4gICAqIElmIHRoZSBzdW0gYWxyZWFkeSBoYXMgdGhpcyB0ZXJtLCB0aGUgY29lZmZpY2llbnQgaXMgYWRkZWRcbiAgICogdG8gdGhlIHByZXZpb3VzIG9uZS4gT3RoZXJ3aXNlLCBhIG5ldyBlbnRyeSBpcyBhZGRlZC5cbiAgICpcbiAgICogRS5nLiBcIjJ4ICsgeCArIDEvNSB5XCJcbiAgICogIC0+IFtbJ3gnLCBbMywgMV1dLCBbJ3knLCBbMSwgNV1dXVxuICAgKi9cbiAgYWRkVGVybSh0ZXJtLCBjKSB7XG4gICAgaWYgKHRlcm0uaXNOb3RoaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0ZXJtLmlzTmFOIHx8IHRlcm0uaXNJbWFnaW5hcnkgJiYgIWNvbXBsZXhBbGxvd2VkKHRoaXMuZW5naW5lKSkge1xuICAgICAgdGhpcy5fbmFOQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKSB7XG4gICAgICBpZiAodGVybS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHRlcm0uaXNJbmZpbml0eSkge1xuICAgICAgICAgIGlmICh0ZXJtLmlzUG9zaXRpdmUpXG4gICAgICAgICAgICB0aGlzLl9wb3NJbmZpbml0eUNvdW50ICs9IDE7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbmVnSW5maW5pdHlDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gYXNSYXRpb25hbCh0ZXJtKTtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICB0aGlzLl9yYXRpb25hbCA9IGFkZDIodGhpcy5fcmF0aW9uYWwsIGMgPT09IHZvaWQgMCA/IHIgOiBtdWwyKHIsIGMpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtID0gdGVybS5udW1lcmljVmFsdWU7XG4gICAgICAgIGlmIChudW0gIT09IG51bGwgJiYgdHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghTnVtYmVyLmlzSW50ZWdlcihudW0pKTtcbiAgICAgICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKHRoaXMuZW5naW5lKSlcbiAgICAgICAgICAgIHRoaXMuX2JpZ251bSA9IHRoaXMuX2JpZ251bS5hZGQobnVtKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLl9udW1iZXIgKz0gbnVtO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtICE9PSBudWxsICYmIG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghbnVtLmlzSW50ZWdlcigpKTtcbiAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uYWRkKG51bSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW0gIT09IG51bGwgJiYgbnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg1LmRlZmF1bHQpIHtcbiAgICAgICAgICBsZXQgcmUgPSBudW0ucmU7XG4gICAgICAgICAgbGV0IGltID0gbnVtLmltO1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJlKSkge1xuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBhZGQyKHRoaXMuX3JhdGlvbmFsLCBtdWwyKFtyZSwgMV0sIGMgPz8gWzEsIDFdKSk7XG4gICAgICAgICAgICByZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpKVxuICAgICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uYWRkKHJlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5fbnVtYmVyICs9IHJlO1xuICAgICAgICAgICAgcmUgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbSkpIHtcbiAgICAgICAgICAgIGlmIChjID09PSB2b2lkIDApXG4gICAgICAgICAgICAgIHRoaXMuX2ltYWdpbmFyeSArPSBpbTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGMpKVxuICAgICAgICAgICAgICB0aGlzLl9pbWFnaW5hcnkgKz0gaW0gKiBjWzBdIC8gY1sxXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5faW1hZ2luYXJ5ICs9IHRoaXMuZW5naW5lLmJpZ251bShjWzBdKS5tdWwoaW0pLmRpdih0aGlzLmVuZ2luZS5iaWdudW0oY1sxXSkpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICBpbSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZSA9PT0gMCAmJiBpbSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB0ZXJtID0gdGhpcy5lbmdpbmUubnVtYmVyKHRoaXMuZW5naW5lLmNvbXBsZXgocmUsIGltKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvZWY7XG4gICAgW2NvZWYsIHRlcm1dID0gYXNDb2VmZmljaWVudCh0ZXJtKTtcbiAgICBpZiAoaXNSYXRpb25hbFplcm8oY29lZikpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGMgIT09IHZvaWQgMClcbiAgICAgIGNvZWYgPSBtdWwyKGNvZWYsIGMpO1xuICAgIGlmICh0ZXJtLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIHRoaXMuYWRkVGVybSh0ZXJtLm9wMSwgbmVnKGNvZWYpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRlcm0uaGVhZCA9PT0gXCJBZGRcIikge1xuICAgICAgZm9yIChjb25zdCB4IG9mIHRlcm0ub3BzKVxuICAgICAgICB0aGlzLmFkZFRlcm0oeCwgY29lZik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBoYXNUZXJtID0gZmFsc2U7XG4gICAgaWYgKHRlcm0ubnVtZXJpY1ZhbHVlID09PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5fdGVybXMubGVuZ3RoID4gNTAwKSB7XG4gICAgICAgIGNvbnN0IGggPSB0ZXJtLmhhc2g7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGVybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fdGVybXNbaV0udGVybS5udW1lcmljVmFsdWUgPT09IG51bGwgJiYgaCA9PT0gdGhpcy5fdGVybXNbaV0udGVybS5oYXNoICYmIHRlcm0uaXNTYW1lKHRoaXMuX3Rlcm1zW2ldLnRlcm0pKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtc1tpXS5jb2VmID0gYWRkMih0aGlzLl90ZXJtc1tpXS5jb2VmLCBjb2VmKTtcbiAgICAgICAgICAgIGhhc1Rlcm0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Rlcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Rlcm1zW2ldLnRlcm0ubnVtZXJpY1ZhbHVlID09PSBudWxsICYmIHRlcm0uaXNTYW1lKHRoaXMuX3Rlcm1zW2ldLnRlcm0pKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtc1tpXS5jb2VmID0gYWRkMih0aGlzLl90ZXJtc1tpXS5jb2VmLCBjb2VmKTtcbiAgICAgICAgICAgIGhhc1Rlcm0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzVGVybSlcbiAgICAgIHRoaXMuX3Rlcm1zLnB1c2goeyB0ZXJtLCBjb2VmIH0pO1xuICB9XG4gIC8vIEZvciBkZWJ1Z2dpbmdcbiAgdG9TdHJpbmcoKSB7XG4gICAgY29uc3QgeHMgPSB0aGlzLnRlcm1zKFwiZXhwcmVzc2lvblwiKTtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIFwiMFwiO1xuICAgIHJldHVybiB4cy5tYXAoKHgpID0+IHgudG9TdHJpbmcoKSkuam9pbihcIlxcXFxuXCIpO1xuICB9XG4gIHRlcm1zKG1vZGUpIHtcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGlmICh0aGlzLl9uYU5Db3VudCA+IDApXG4gICAgICByZXR1cm4gW2NlLl9OQU5dO1xuICAgIGlmICh0aGlzLl9pbWFnaW5hcnkgIT09IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBbY2UuX05BTl07XG4gICAgaWYgKHRoaXMuX3Bvc0luZmluaXR5Q291bnQgPiAwICYmIHRoaXMuX25lZ0luZmluaXR5Q291bnQgPiAwKVxuICAgICAgcmV0dXJuIFtjZS5fTkFOXTtcbiAgICBpZiAodGhpcy5fcG9zSW5maW5pdHlDb3VudCA+IDApXG4gICAgICByZXR1cm4gW2NlLl9QT1NJVElWRV9JTkZJTklUWV07XG4gICAgaWYgKHRoaXMuX25lZ0luZmluaXR5Q291bnQgPiAwKVxuICAgICAgcmV0dXJuIFtjZS5fTkVHQVRJVkVfSU5GSU5JVFldO1xuICAgIGNvbnN0IHhzID0gW107XG4gICAgZm9yIChjb25zdCB7IGNvZWYsIHRlcm0gfSBvZiB0aGlzLl90ZXJtcykge1xuICAgICAgaWYgKCFpc1JhdGlvbmFsWmVybyhjb2VmKSkge1xuICAgICAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgICAgICB4cy5wdXNoKHRlcm0pO1xuICAgICAgICBlbHNlIGlmIChpc1JhdGlvbmFsTmVnYXRpdmVPbmUoY29lZikpXG4gICAgICAgICAgeHMucHVzaChjZS5uZWcodGVybSkpO1xuICAgICAgICBlbHNlIGlmIChtYWNoaW5lRGVub21pbmF0b3IoY29lZikgPT09IDEpXG4gICAgICAgICAgeHMucHVzaChjZS5tdWwoW2NlLm51bWJlcihjb2VmWzBdKSwgdGVybV0pKTtcbiAgICAgICAgZWxzZSBpZiAobWFjaGluZU51bWVyYXRvcihjb2VmKSA9PT0gMSlcbiAgICAgICAgICB4cy5wdXNoKGNlLmRpdih0ZXJtLCBjZS5udW1iZXIoY29lZlsxXSkpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHhzLnB1c2goY2UubXVsKFtjZS5udW1iZXIoY29lZiksIHRlcm1dKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpIHtcbiAgICAgICAgbGV0IHN1bTIgPSB0aGlzLl9iaWdudW0uYWRkKHRoaXMuX251bWJlcik7XG4gICAgICAgIGlmICghaXNSYXRpb25hbFplcm8odGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICAgIHN1bTIgPSBzdW0yLmFkZChcbiAgICAgICAgICAgIGNlLmJpZ251bSh0aGlzLl9yYXRpb25hbFswXSkuZGl2KGNlLmJpZ251bSh0aGlzLl9yYXRpb25hbFsxXSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KHN1bTIudG9OdW1iZXIoKSwgdGhpcy5faW1hZ2luYXJ5KSkpO1xuICAgICAgICBlbHNlIGlmICghc3VtMi5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgc3VtMiA9IHRoaXMuX2JpZ251bS50b051bWJlcigpICsgdGhpcy5fbnVtYmVyO1xuICAgICAgICBpZiAoIWlzUmF0aW9uYWxaZXJvKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICBzdW0yICs9IG1hY2hpbmVOdW1lcmF0b3IodGhpcy5fcmF0aW9uYWwpIC8gbWFjaGluZURlbm9taW5hdG9yKHRoaXMuX3JhdGlvbmFsKTtcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KHN1bTIsIHRoaXMuX2ltYWdpbmFyeSkpKTtcbiAgICAgICAgZWxzZSBpZiAoc3VtMiAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNSYXRpb25hbFplcm8odGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9yYXRpb25hbCkpO1xuICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMCkge1xuICAgICAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgICByZXR1cm4gW2NlLl9OQU5dO1xuICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KDAsIHRoaXMuX2ltYWdpbmFyeSkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpKSB7XG4gICAgICAgIGNvbnN0IHN1bTIgPSB0aGlzLl9iaWdudW0uYWRkKHRoaXMuX251bWJlcik7XG4gICAgICAgIGlmICghc3VtMi5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuX2JpZ251bS5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9iaWdudW0pKTtcbiAgICAgICAgaWYgKHRoaXMuX251bWJlciAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9udW1iZXIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHMoeHMsIFwiQWRkXCIpO1xuICB9XG4gIGFzRXhwcmVzc2lvbihtb2RlKSB7XG4gICAgY29uc3QgY2UgPSB0aGlzLmVuZ2luZTtcbiAgICBjb25zdCB4cyA9IHRoaXMudGVybXMobW9kZSk7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBpZiAoeHMubGVuZ3RoID09PSAxKVxuICAgICAgcmV0dXJuIHhzWzBdO1xuICAgIHJldHVybiBjZS5fZm4oXCJBZGRcIiwgc29ydEFkZChjZSwgeHMpKTtcbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvZG9tYWlucy50c1xudmFyIERPTUFJTl9DT05TVFJVQ1RPUlMgPSBbXG4gIFwiSW52YWxpZERvbWFpblwiLFxuICBcIkRpY3Rpb25hcnlcIixcbiAgXCJGdW5jdGlvblwiLFxuICBcIkxpc3RcIixcbiAgXCJUdXBsZVwiLFxuICBcIkludGVyc2VjdGlvblwiLFxuICBcIlVuaW9uXCIsXG4gIFwiTWF5YmVcIixcbiAgXCJTZXF1ZW5jZVwiLFxuICBcIkludGVydmFsXCIsXG4gIFwiUmFuZ2VcIixcbiAgXCJIZWFkXCIsXG4gIFwiU3ltYm9sXCIsXG4gIFwiVmFsdWVcIlxuXTtcbnZhciBET01BSU5fQUxJQVMgPSB7XG4gIC8vIEZ1bmN0aW9uOiBbJ0Z1bmN0aW9uJywgWydTZXF1ZW5jZScsICdBbnl0aGluZyddLCAnQW55dGhpbmcnXSxcbiAgTnVtZXJpY0Z1bmN0aW9uOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIk51bWJlclwiXSwgXCJOdW1iZXJcIl0sXG4gIFJlYWxGdW5jdGlvbjogW1xuICAgIFwiRnVuY3Rpb25cIixcbiAgICBbXCJTZXF1ZW5jZVwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiXSxcbiAgICBcIkV4dGVuZGVkUmVhbE51bWJlclwiXG4gIF0sXG4gIFRyaWdvbm9tZXRyaWNGdW5jdGlvbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gIC8vIEh5cGVyYm9saWNGdW5jdGlvbjogWydGdW5jdGlvbicsICdOdW1iZXInLCAnTnVtYmVyJ10sXG4gIExvZ2ljT3BlcmF0b3I6IFtcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJNYXliZUJvb2xlYW5cIixcbiAgICBbXCJNYXliZVwiLCBcIk1heWJlQm9vbGVhblwiXSxcbiAgICBcIk1heWJlQm9vbGVhblwiXG4gIF0sXG4gIFByZWRpY2F0ZTogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXSwgXCJNYXliZUJvb2xlYW5cIl0sXG4gIFJlbGF0aW9uYWxPcGVyYXRvcjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBcIkFueXRoaW5nXCIsIFwiTWF5YmVCb29sZWFuXCJdXG4gIC8vIFBvc2l0aXZlSW50ZWdlcjogWydSYW5nZScsIDEsICtJbmZpbml0eV0sXG4gIC8vIE5vbk5lZ2F0aXZlSW50ZWdlcjogWydSYW5nZScsIDAsICtJbmZpbml0eV0sXG4gIC8vIE5lZ2F0aXZlSW50ZWdlcjogWydSYW5nZScsIC1JbmZpbml0eSwgLTFdLFxuICAvLyBOb25Qb3NpdGl2ZUludGVnZXI6IFsnUmFuZ2UnLCAtSW5maW5pdHksIDBdLFxuICAvLyBQb3NpdGl2ZU51bWJlcjogWydJbnRlcnZhbCcsIFsnT3BlbicsIDBdLCArSW5maW5pdHldLFxuICAvLyBOb25OZWdhdGl2ZU51bWJlcjogWydJbnRlcnZhbCcsIDAsICtJbmZpbml0eV0sXG4gIC8vIE5lZ2F0aXZlTnVtYmVyOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCBbJ09wZW4nLCAwXV0sXG4gIC8vIE5vblBvc2l0aXZlTnVtYmVyOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCAwXSxcbn07XG52YXIgRE9NQUlOX0xJVEVSQUwgPSB7XG4gIEFueXRoaW5nOiBbXSxcbiAgVmFsdWU6IFwiQW55dGhpbmdcIixcbiAgRG9tYWluOiBcIkFueXRoaW5nXCIsXG4gIERvbWFpbkV4cHJlc3Npb246IFwiRG9tYWluXCIsXG4gIFZvaWQ6IFwiTm90aGluZ1wiLFxuICBOb3RoaW5nOiBbXG4gICAgXCJEb21haW5FeHByZXNzaW9uXCIsXG4gICAgXCJCb29sZWFuXCIsXG4gICAgXCJTdHJpbmdcIixcbiAgICBcIlN5bWJvbFwiLFxuICAgIFwiVHVwbGVcIixcbiAgICBcIkxpc3RcIixcbiAgICBcIkRpY3Rpb25hcnlcIixcbiAgICBcIkluZmluaXRlU2V0XCIsXG4gICAgXCJGaW5pdGVTZXRcIixcbiAgICBcIkltYWdpbmFyeU51bWJlclwiLFxuICAgIFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIixcbiAgICBcIlBvc2l0aXZlSW50ZWdlclwiLFxuICAgIFwiTmVnYXRpdmVJbnRlZ2VyXCIsXG4gICAgXCJOb25Qb3NpdGl2ZUludGVnZXJcIixcbiAgICBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgIFwiUG9zaXRpdmVOdW1iZXJcIixcbiAgICBcIk5lZ2F0aXZlTnVtYmVyXCIsXG4gICAgXCJOb25Qb3NpdGl2ZU51bWJlclwiLFxuICAgIFwiTm9uTmVnYXRpdmVOdW1iZXJcIixcbiAgICBcIlNjYWxhclwiLFxuICAgIFwiVHJpZ29ub21ldHJpY0Z1bmN0aW9uXCIsXG4gICAgXCJMb2dpY09wZXJhdG9yXCIsXG4gICAgXCJSZWxhdGlvbmFsT3BlcmF0b3JcIlxuICBdLFxuICBNYXliZUJvb2xlYW46IFwiVmFsdWVcIixcbiAgQm9vbGVhbjogXCJNYXliZUJvb2xlYW5cIixcbiAgU3RyaW5nOiBcIkJvb2xlYW5cIixcbiAgU3ltYm9sOiBcIkJvb2xlYW5cIixcbiAgQ29sbGVjdGlvbjogXCJWYWx1ZVwiLFxuICBMaXN0OiBcIkNvbGxlY3Rpb25cIixcbiAgRGljdGlvbmFyeTogXCJDb2xsZWN0aW9uXCIsXG4gIFNlcXVlbmNlOiBcIkNvbGxlY3Rpb25cIixcbiAgVHVwbGU6IFwiU2VxdWVuY2VcIixcbiAgU2V0OiBcIkNvbGxlY3Rpb25cIixcbiAgSW5maW5pdGVTZXQ6IFwiU2V0XCIsXG4gIEZpbml0ZVNldDogXCJTZXRcIixcbiAgLy9cbiAgLy8gRnVuY3Rpb25hbCBEb21haW5zXG4gIC8vXG4gIEZ1bmN0aW9uOiBcIkFueXRoaW5nXCIsXG4gIFByZWRpY2F0ZTogXCJGdW5jdGlvblwiLFxuICBMb2dpY09wZXJhdG9yOiBcIlByZWRpY2F0ZVwiLFxuICBSZWxhdGlvbmFsT3BlcmF0b3I6IFwiUHJlZGljYXRlXCIsXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfbWF0aGVtYXRpY2FsX2Z1bmN0aW9uc1xuICBOdW1lcmljRnVuY3Rpb246IFwiRnVuY3Rpb25cIixcbiAgUmVhbEZ1bmN0aW9uOiBcIk51bWVyaWNGdW5jdGlvblwiLFxuICBUcmlnb25vbWV0cmljRnVuY3Rpb246IFwiUmVhbEZ1bmN0aW9uXCIsXG4gIC8vXG4gIC8vIE51bWVyaWMgRG9tYWluc1xuICAvL1xuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYXRlZ29yeV9vZl9zZXRzXG4gIE51bWJlcjogXCJWYWx1ZVwiLFxuICBFeHRlbmRlZENvbXBsZXhOdW1iZXI6IFwiTnVtYmVyXCIsXG4gIENvbXBsZXhOdW1iZXI6IFwiRXh0ZW5kZWRDb21wbGV4TnVtYmVyXCIsXG4gIEltYWdpbmFyeU51bWJlcjogXCJDb21wbGV4TnVtYmVyXCIsXG4gIEV4dGVuZGVkUmVhbE51bWJlcjogXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIixcbiAgUmVhbE51bWJlcjogW1wiQ29tcGxleE51bWJlclwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiXSxcbiAgUG9zaXRpdmVOdW1iZXI6IFwiTm9uTmVnYXRpdmVOdW1iZXJcIixcbiAgTm9uTmVnYXRpdmVOdW1iZXI6IFwiUmVhbE51bWJlclwiLFxuICBOb25Qb3NpdGl2ZU51bWJlcjogXCJOZWdhdGl2ZU51bWJlclwiLFxuICBOZWdhdGl2ZU51bWJlcjogXCJSZWFsTnVtYmVyXCIsXG4gIFRyYW5zY2VuZGVudGFsTnVtYmVyOiBcIlJlYWxOdW1iZXJcIixcbiAgQWxnZWJyYWljTnVtYmVyOiBcIlJlYWxOdW1iZXJcIixcbiAgUmF0aW9uYWxOdW1iZXI6IFwiQWxnZWJyYWljTnVtYmVyXCIsXG4gIC8vIE5hdHVyYWxOdW1iZXI6ICdJbnRlZ2VyJyxcbiAgSW50ZWdlcjogXCJSYXRpb25hbE51bWJlclwiLFxuICBQb3NpdGl2ZUludGVnZXI6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIsXG4gIE5vbk5lZ2F0aXZlSW50ZWdlcjogXCJJbnRlZ2VyXCIsXG4gIE5vblBvc2l0aXZlSW50ZWdlcjogXCJOZWdhdGl2ZUludGVnZXJcIixcbiAgTmVnYXRpdmVJbnRlZ2VyOiBcIkludGVnZXJcIixcbiAgLy9cbiAgLy8gVGVuc29yaWFsIERvbWFpbnNcbiAgLy9cbiAgVGVuc29yOiBcIlZhbHVlXCIsXG4gIE1hdHJpeDogXCJUZW5zb3JcIixcbiAgU2NhbGFyOiBbXCJSb3dcIiwgXCJDb2x1bW5cIl0sXG4gIFJvdzogXCJWZWN0b3JcIixcbiAgQ29sdW1uOiBcIlZlY3RvclwiLFxuICBWZWN0b3I6IFwiTWF0cml4XCJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9uYW1lZF9tYXRyaWNlc1xuICAvLyBDb21wbGV4VGVuc29yOiAnVGVuc29yJyxcbiAgLy8gUmVhbFRlbnNvcjogJ0NvbXBsZXhUZW5zb3InLFxuICAvLyBJbnRlZ2VyVGVuc29yOiAnUmVhbFRlbnNvcicsXG4gIC8vIExvZ2ljYWxUZW5zb3I6ICdJbnRlZ2VyVGVuc29yJyxcbiAgLy8gU3F1YXJlTWF0cml4OiAnTWF0cml4JyxcbiAgLy8gTW9ub21pYWxNYXRyaXg6ICdTcXVhcmVNYXRyaXgnLFxuICAvLyBUcmlhbmd1bGFyTWF0cml4OiAnU3F1YXJlTWF0cml4JyxcbiAgLy8gVXBwZXJUcmlhbmd1bGFyTWF0cml4OiAnVHJpYW5ndWxhck1hdHJpeCcsXG4gIC8vIExvd2VyVHJpYW5ndWxhck1hdHJpeDogJ1RyaWFuZ3VsYXJNYXRyaXgnLFxuICAvLyBQZXJtdXRhdGlvbk1hdHJpeDogWydNb25vbWlhbE1hdHJpeCcsICdMb2dpY2FsVGVuc29yJywgJ09ydGhvZ29uYWxNYXRyaXgnXSxcbiAgLy8gT3J0aG9nb25hbE1hdHJpeDogWydTcXVhcmVNYXRyaXgnLCAnUmVhbFRlbnNvciddLFxuICAvLyBEaWFnb25hbE1hdHJpeDogWydVcHBlclRyaWFuZ3VsYXJNYXRyaXgnLCAnTG93ZXJUcmlhbmd1bGFyTWF0cml4J10sXG4gIC8vIElkZW50aXR5TWF0cml4OiBbJ0RpYWdvbmFsTWF0cml4JywgJ1N5bW1ldHJpY01hdHJpeCcsICdQZXJtdXRhdGlvbk1hdHJpeCddLFxuICAvLyBaZXJvTWF0cml4OiBbJ0RpYWdvbmFsTWF0cml4JywgJ1N5bW1ldHJpY01hdHJpeCcsICdQZXJtdXRhdGlvbk1hdHJpeCddLFxuICAvLyBTeW1tZXRyaWNNYXRyaXg6IFsnSGVybWl0aWFuTWF0cml4JywgJ1NxdWFyZU1hdHJpeCcsICdSZWFsVGVuc29yJ10sXG4gIC8vIEhlcm1pdGlhbk1hdHJpeDogJ0NvbXBsZXhUZW5zb3InLFxuICAvLyBRdWF0ZXJuaW9uOiBbJ1NxdWFyZU1hdHJpeCcsICdDb21wbGV4VGVuc29yJ10sXG59O1xudmFyIGdEb21haW5MaXRlcmFscztcbmZ1bmN0aW9uIGlzRG9tYWluTGl0ZXJhbChzKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBET01BSU5fTElURVJBTFtzXSAhPT0gdm9pZCAwO1xufVxuZnVuY3Rpb24gYW5jZXN0b3JzKGRvbSkge1xuICBpZiAoIWdEb21haW5MaXRlcmFscykge1xuICAgIGdEb21haW5MaXRlcmFscyA9IHt9O1xuICAgIGFuY2VzdG9ycyhcIlZvaWRcIik7XG4gIH1cbiAgaWYgKGdEb21haW5MaXRlcmFsc1tkb21dKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGdEb21haW5MaXRlcmFsc1tkb21dKTtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICBpZiAodHlwZW9mIGRvbSAhPT0gXCJzdHJpbmdcIiB8fCAhRE9NQUlOX0xJVEVSQUxbZG9tXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb20pKVxuICAgICAgdGhyb3cgRXJyb3IoYFVua25vd24gZG9tYWluIGxpdGVyYWwgJHtkb219YCk7XG4gICAgaWYgKCFET01BSU5fQ09OU1RSVUNUT1JTLmluY2x1ZGVzKGRvbVswXSkpXG4gICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBkb21haW4gY29uc3RydWN0b3IgJHtkb21bMF19YCk7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJGdW5jdGlvblwiIHx8IGRvbVswXSA9PT0gXCJIZWFkXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiRnVuY3Rpb25cIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJTeW1ib2xcIilcbiAgICAgIHJldHVybiBhbmNlc3RvcnMoXCJTeW1ib2xcIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJUdXBsZVwiKVxuICAgICAgcmV0dXJuIGFuY2VzdG9ycyhcIlR1cGxlXCIpO1xuICAgIGlmIChkb21bMF0gPT09IFwiTGlzdFwiKVxuICAgICAgcmV0dXJuIGFuY2VzdG9ycyhcIkxpc3RcIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJEaWN0aW9uYXJ5XCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiRGljdGlvbmFyeVwiKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIlJhbmdlXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiSW50ZWdlclwiKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIkludGVydmFsXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiUmVhbE51bWJlckV4dGVuZGVkXCIpO1xuICAgIGlmIChkb21bMF0gPT09IFwiTWF5YmVcIiB8fCBkb21bMF0gPT09IFwiU2VxdWVuY2VcIilcbiAgICAgIHJldHVybiBhbmNlc3RvcnMoZG9tWzFdKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIkxpdGVyYWxcIilcbiAgICAgIHJldHVybiBbXCJBbnl0aGluZ1wiXTtcbiAgICBpZiAoZG9tWzBdID09PSBcIlVuaW9uXCIpXG4gICAgICByZXR1cm4gW1wiQW55dGhpbmdcIl07XG4gICAgaWYgKGRvbVswXSA9PT0gXCJJbnRlcnNlY3Rpb25cIilcbiAgICAgIHJldHVybiBbXCJBbnl0aGluZ1wiXTtcbiAgICByZXR1cm4gW1wiQW55dGhpbmdcIl07XG4gIH1cbiAgaWYgKHR5cGVvZiBET01BSU5fTElURVJBTFtkb21dID09PSBcInN0cmluZ1wiKVxuICAgIHJlc3VsdCA9IFtET01BSU5fTElURVJBTFtkb21dLCAuLi5hbmNlc3RvcnMoRE9NQUlOX0xJVEVSQUxbZG9tXSldO1xuICBlbHNlIGlmIChBcnJheS5pc0FycmF5KERPTUFJTl9MSVRFUkFMW2RvbV0pKVxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIERPTUFJTl9MSVRFUkFMW2RvbV0pIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcmVudCk7XG4gICAgICByZXN1bHQucHVzaCguLi5hbmNlc3RvcnMocGFyZW50KSk7XG4gICAgfVxuICBnRG9tYWluTGl0ZXJhbHNbZG9tXSA9IG5ldyBTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvbWFpblNldHNMaWJyYXJ5KCkge1xuICBjb25zdCB0YWJsZSA9IHt9O1xuICBmb3IgKGNvbnN0IGRvbSBvZiBPYmplY3Qua2V5cyhET01BSU5fTElURVJBTCkpIHtcbiAgICBpZiAoZG9tICE9PSBcIkRvbWFpblwiICYmIGRvbSAhPT0gXCJOb3RoaW5nXCIgJiYgZG9tICE9PSBcIlN0cmluZ1wiICYmIGRvbSAhPT0gXCJTeW1ib2xcIiAmJiBkb20gIT09IFwiTGlzdFwiICYmIGRvbSAhPT0gXCJUdXBsZVwiICYmIGRvbSAhPT0gXCJTZXF1ZW5jZVwiKVxuICAgICAgdGFibGVbZG9tXSA9IHsgZG9tYWluOiBcIlNldFwiIH07XG4gIH1cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9hYnN0cmFjdC1ib3hlZC1leHByZXNzaW9uLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg2ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3V0aWxzLnRzXG5mdW5jdGlvbiBpc1N5bWJvbERlZmluaXRpb24oZGVmKSB7XG4gIHJldHVybiAhIWRlZiAmJiB0eXBlb2YgZGVmID09PSBcIm9iamVjdFwiICYmIChcImRvbWFpblwiIGluIGRlZiB8fCBcInZhbHVlXCIgaW4gZGVmIHx8IFwiY29uc3RhbnRcIiBpbiBkZWYpO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkRlZmluaXRpb24oZGVmKSB7XG4gIGlmIChkZWYgPT09IHZvaWQgMCB8fCBkZWYgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIGRlZiAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChcImNvbXBsZXhpdHlcIiBpbiBkZWYgfHwgXCJudW1lcmljXCIgaW4gZGVmIHx8IFwic2lnbmF0dXJlXCIgaW4gZGVmKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoIShcImRvbWFpblwiIGluIGRlZikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVmLmRvbWFpbiA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBkZWYuZG9tYWluID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBkZWYuZG9tYWluID09PSBcIkZ1bmN0aW9uXCI7XG4gIHJldHVybiBkZWYuZG9tYWluLmlzRnVuY3Rpb247XG59XG5mdW5jdGlvbiBub3JtYWxpemVMaW1pdHMocmFuZ2UpIHtcbiAgbGV0IGxvd2VyID0gMTtcbiAgbGV0IHVwcGVyID0gbG93ZXIgKyBNQVhfSVRFUkFUSU9OO1xuICBsZXQgaW5kZXggPSBcIk5vdGhpbmdcIjtcbiAgbGV0IGlzRmluaXRlMiA9IHRydWU7XG4gIGlmIChyYW5nZS5oZWFkID09PSBcIlR1cGxlXCIgfHwgcmFuZ2UuaGVhZCA9PT0gXCJUcmlwbGVcIiB8fCByYW5nZS5oZWFkID09PSBcIlBhaXJcIiB8fCByYW5nZS5oZWFkID09PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSAocmFuZ2Uub3AxLmhlYWQgPT09IFwiSG9sZFwiID8gcmFuZ2Uub3AxLm9wMS5zeW1ib2wgOiByYW5nZS5vcDEuc3ltYm9sKSA/PyBcIk5vdGhpbmdcIjtcbiAgICBsb3dlciA9IGFzU21hbGxJbnRlZ2VyKHJhbmdlLm9wMikgPz8gMTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShsb3dlcikpXG4gICAgICBpc0Zpbml0ZTIgPSBmYWxzZTtcbiAgICBpZiAocmFuZ2Uub3AzLmlzTm90aGluZyB8fCByYW5nZS5vcDMuaXNJbmZpbml0eSkge1xuICAgICAgaXNGaW5pdGUyID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHUgPSBhc1NtYWxsSW50ZWdlcihyYW5nZS5vcDMpO1xuICAgICAgaWYgKHUgPT09IG51bGwpXG4gICAgICAgIGlzRmluaXRlMiA9IGZhbHNlO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHVwcGVyID0gdTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodXBwZXIpKVxuICAgICAgICAgIGlzRmluaXRlMiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzRmluaXRlMiAmJiBOdW1iZXIuaXNGaW5pdGUobG93ZXIpKVxuICAgICAgdXBwZXIgPSBsb3dlciArIE1BWF9JVEVSQVRJT047XG4gIH1cbiAgcmV0dXJuIFtpbmRleCwgbG93ZXIsIHVwcGVyLCBpc0Zpbml0ZTJdO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvY29tcGlsZS50c1xudmFyIENvbXB1dGVFbmdpbmVGdW5jdGlvbiA9IGNsYXNzIGV4dGVuZHMgRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3Rvcihib2R5KSB7XG4gICAgc3VwZXIoXCJfU1lTXCIsIFwiX1wiLCBgcmV0dXJuICR7Ym9keX1gKTtcbiAgICB0aGlzLnN5cyA9IHtcbiAgICAgIGZhY3RvcmlhbCxcbiAgICAgIGdhbW1hLFxuICAgICAgbG5nYW1tYSxcbiAgICAgIGdjZCxcbiAgICAgIGxjbSxcbiAgICAgIGNob3BcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgYXBwbHk6ICh0YXJnZXQsIHRoaXNBcmcsIGFyZ3VtZW50c0xpc3QpID0+IHN1cGVyLmFwcGx5KHRoaXNBcmcsIFt0aGlzLnN5cywgLi4uYXJndW1lbnRzTGlzdF0pLFxuICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpXG4gICAgICAgICAgcmV0dXJuICgpID0+IGJvZHk7XG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjb21waWxlVG9KYXZhc2NyaXB0KGV4cHIpIHtcbiAgY29uc3QganMgPSBjb21waWxlKGV4cHIsIGV4cHIuZnJlZVZhcnMpO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgQ29tcHV0ZUVuZ2luZUZ1bmN0aW9uKGpzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7ZX1cbiR7ZXhwci5sYXRleH1cbiR7anN9YCk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJlZVZhcnMgPSBbXSwgcHJlYyA9IDApIHtcbiAgY29uc3QgZiA9IGFzRmxvYXQoZXhwcik7XG4gIGlmIChmICE9PSBudWxsKVxuICAgIHJldHVybiBmLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHMgPSBleHByLnN5bWJvbDtcbiAgaWYgKHMgIT09IG51bGwpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBUcnVlOiBcInRydWVcIixcbiAgICAgIEZhbHNlOiBcImZhbHNlXCIsXG4gICAgICBQaTogXCJNYXRoLlBJXCIsXG4gICAgICBFeHBvbmVudGlhbEU6IFwiTWF0aC5FXCIsXG4gICAgICBJOiBcIk1hdGguSVwiLFxuICAgICAgTmFOOiBcIk51bWJlci5OYU5cIixcbiAgICAgIEltYWdpbmFyeVVuaXQ6IFwiTmFOXCIsXG4gICAgICBIYWxmOiBcIjAuNVwiLFxuICAgICAgTWFjaGluZUVwc2lsb246IFwiTnVtYmVyLkVQU0lMT05cIixcbiAgICAgIEdvbGRlblJhdGlvOiBcIigoMSArIE1hdGguc3FydCg1KSkgLyAyKVwiLFxuICAgICAgQ2F0YWxhbkNvbnN0YW50OiBcIjAuOTE1OTY1NTk0MTc3MjE5MDFcIixcbiAgICAgIEV1bGVyR2FtbWE6IFwiMC41NzcyMTU2NjQ5MDE1MzI4NlwiXG4gICAgfVtzXTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChmcmVlVmFycy5pbmNsdWRlcyhzKSlcbiAgICAgIHJldHVybiBgXy4ke3N9YDtcbiAgICByZXR1cm4gcztcbiAgfVxuICBjb25zdCBzdHIgPSBleHByLnN0cmluZztcbiAgaWYgKHN0ciAhPT0gbnVsbClcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbiAgY29uc3Qga2V5cyA9IGV4cHIua2V5cztcbiAgaWYgKGtleXMgIT09IG51bGwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGV4cHIuZ2V0S2V5KGtleSk7XG4gICAgICBpZiAodmFsdWUpXG4gICAgICAgIHJlc3VsdC5wdXNoKGAke2tleX06ICR7Y29tcGlsZSh2YWx1ZSwgZnJlZVZhcnMsIDApfWApO1xuICAgIH1cbiAgICByZXR1cm4gYHske3Jlc3VsdC5qb2luKFwiLCBcIil9fWA7XG4gIH1cbiAgY29uc3QgaCA9IGV4cHIuaGVhZDtcbiAgaWYgKHR5cGVvZiBoID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGV4cHIub3AxO1xuICAgICAgaWYgKGFyZyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gYC0ke2NvbXBpbGUoYXJnLCBmcmVlVmFycywgMyl9YDtcbiAgICB9XG4gICAgaWYgKGggPT09IFwiRXJyb3JcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yXCIpO1xuICAgIGlmIChoID09PSBcIlN1bVwiKVxuICAgICAgcmV0dXJuIGNvbXBpbGVMb29wKGV4cHIsIFwiK1wiKTtcbiAgICBpZiAoaCA9PT0gXCJQcm9kdWN0XCIpXG4gICAgICByZXR1cm4gY29tcGlsZUxvb3AoZXhwciwgXCIqXCIpO1xuICAgIGlmIChoID09PSBcIlJvb3RcIikge1xuICAgICAgY29uc3QgYXJnID0gZXhwci5vcDE7XG4gICAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSb290OiBubyBhcmd1bWVudFwiKTtcbiAgICAgIGNvbnN0IGV4cDIgPSBleHByLm9wMjtcbiAgICAgIGlmIChleHAyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gYE1hdGguc3FydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycywgMCl9KWA7XG4gICAgICByZXR1cm4gYE1hdGgucG93KCR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX0sIDEvJHtjb21waWxlKGV4cDIsIGZyZWVWYXJzKX1gO1xuICAgIH1cbiAgICBpZiAoaCA9PT0gXCJGYWN0b3JpYWxcIikge1xuICAgICAgY29uc3QgYXJnID0gZXhwci5vcDE7XG4gICAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWN0b3JpYWw6IG5vIGFyZ3VtZW50XCIpO1xuICAgICAgcmV0dXJuIGBfU1lTLmZhY3RvcmlhbCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgfVxuICAgIGlmIChoID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGV4cHIub3AxO1xuICAgICAgaWYgKGFyZyA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG93ZXI6IG5vIGFyZ3VtZW50XCIpO1xuICAgICAgY29uc3QgZXhwMiA9IGFzRmxvYXQoZXhwci5vcDIpO1xuICAgICAgaWYgKGV4cDIgPT09IDAuNSlcbiAgICAgICAgcmV0dXJuIGBNYXRoLnNxcnQoJHtjb21waWxlKGFyZywgZnJlZVZhcnMpfSlgO1xuICAgICAgaWYgKGV4cDIgPT09IDEgLyAzKVxuICAgICAgICByZXR1cm4gYE1hdGguY2JydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgICBpZiAoZXhwMiA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGNvbXBpbGUoYXJnLCBmcmVlVmFycyk7XG4gICAgICBpZiAoZXhwMiA9PT0gLTEpXG4gICAgICAgIHJldHVybiBgMSAvICR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX1gO1xuICAgICAgaWYgKGV4cDIgPT09IC0wLjUpXG4gICAgICAgIHJldHVybiBgMSAvIE1hdGguc3FydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgfVxuICAgIGlmIChoID09PSBcIlNxdWFyZVwiKSB7XG4gICAgICBjb25zdCBhcmcgPSBleHByLm9wMTtcbiAgICAgIGlmIChhcmcgPT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNxdWFyZTogbm8gYXJndW1lbnRcIik7XG4gICAgICByZXR1cm4gYE1hdGgucG93KCR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX0sIDIpYDtcbiAgICB9XG4gICAgY29uc3QgT1BTID0ge1xuICAgICAgQWRkOiBbXCIrXCIsIDExXSxcbiAgICAgIE5lZ2F0ZTogW1wiLVwiLCAxNF0sXG4gICAgICAvLyBVbmFyeSBvcGVyYXRvclxuICAgICAgU3VidHJhY3Q6IFtcIi1cIiwgMTFdLFxuICAgICAgTXVsdGlwbHk6IFtcIipcIiwgMTJdLFxuICAgICAgRGl2aWRlOiBbXCIvXCIsIDEzXSxcbiAgICAgIEVxdWFsOiBbXCI9PT1cIiwgOF0sXG4gICAgICBOb3RFcXVhbDogW1wiIT09XCIsIDhdLFxuICAgICAgTGVzc0VxdWFsOiBbXCI8PVwiLCA5XSxcbiAgICAgIEdyZWF0ZXJFcXVhbDogW1wiPj1cIiwgOV0sXG4gICAgICBMZXNzOiBbXCI8XCIsIDldLFxuICAgICAgR3JlYXRlcjogW1wiPlwiLCA5XSxcbiAgICAgIEFuZDogW1wiJiZcIiwgNF0sXG4gICAgICBPcjogW1wifHxcIiwgM10sXG4gICAgICBOb3Q6IFtcIiFcIiwgMTRdXG4gICAgICAvLyBVbmFyeSBvcGVyYXRvclxuICAgICAgLy8gWG9yOiBbJ14nLCA2XSwgLy8gVGhhdCdzIGJpdHdpc2UgWE9SLCBub3QgbG9naWNhbCBYT1JcbiAgICAgIC8vIFBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHVzZSBgYSA/ICFiIDogYmAgaW5zdGVhZCBvZiBgYSBeIGJgXG4gICAgfTtcbiAgICBjb25zdCBvcDMgPSBPUFNbaF07XG4gICAgaWYgKG9wMyAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBhcmdzMiA9IGV4cHIub3BzO1xuICAgICAgaWYgKGFyZ3MyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGxldCByZXN1bHRTdHI7XG4gICAgICBpZiAoYXJnczIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJlc3VsdFN0ciA9IGAke29wM1swXX0ke2NvbXBpbGUoYXJnczJbMF0sIGZyZWVWYXJzLCBvcDNbMV0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRTdHIgPSBhcmdzMi5tYXAoKGFyZykgPT4gY29tcGlsZShhcmcsIGZyZWVWYXJzLCBvcDNbMV0pKS5qb2luKGAgJHtvcDNbMF19IGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wM1sxXSA8IHByZWMgPyBgKCR7cmVzdWx0U3RyfSlgIDogcmVzdWx0U3RyO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIEFiczogXCJNYXRoLmFic1wiLFxuICAgICAgQXJjY29zOiBcIk1hdGguYWNvc1wiLFxuICAgICAgQXJjb3NoOiBcIk1hdGguYWNvc2hcIixcbiAgICAgIEFyc2luOiBcIk1hdGguYXNpblwiLFxuICAgICAgQXJzaW5oOiBcIk1hdGguYXNpbmhcIixcbiAgICAgIEFyY3RhbjogXCJNYXRoLmF0YW5cIixcbiAgICAgIEFydGFuaDogXCJNYXRoLmF0YW5oXCIsXG4gICAgICAvLyBNYXRoLmNicnRcbiAgICAgIENlaWxpbmc6IFwiTWF0aC5jZWlsXCIsXG4gICAgICBDaG9wOiBcIl9TWVMuY2hvcFwiLFxuICAgICAgQ29zOiBcIk1hdGguY29zXCIsXG4gICAgICBDb3NoOiBcIk1hdGguY29zaFwiLFxuICAgICAgRXhwOiBcIk1hdGguZXhwXCIsXG4gICAgICBGbG9vcjogXCJNYXRoLmZsb29yXCIsXG4gICAgICBHYW1tYTogXCJfU1lTLmdhbW1hXCIsXG4gICAgICBHY2Q6IFwiX1NZUy5nY2RcIixcbiAgICAgIC8vIE1hdGguaHlwb3RcbiAgICAgIExjbTogXCJfU1lTLmxjbVwiLFxuICAgICAgTG46IFwiTWF0aC5sb2dcIixcbiAgICAgIExvZzogXCJNYXRoLmxvZzEwXCIsXG4gICAgICBMb2dHYW1tYTogXCJfU1lTLmxuZ2FtbWFcIixcbiAgICAgIExiOiBcIk1hdGgubG9nMlwiLFxuICAgICAgTWF4OiBcIk1hdGgubWF4XCIsXG4gICAgICBNaW46IFwiTWF0aC5taW5cIixcbiAgICAgIFBvd2VyOiBcIk1hdGgucG93XCIsXG4gICAgICBSYW5kb206IFwiTWF0aC5yYW5kb21cIixcbiAgICAgIFJvdW5kOiBcIk1hdGgucm91bmRcIixcbiAgICAgIFNnbjogXCJNYXRoLnNpZ25cIixcbiAgICAgIFNpbjogXCJNYXRoLnNpblwiLFxuICAgICAgU2luaDogXCJNYXRoLnNpbmhcIixcbiAgICAgIFNxcnQ6IFwiTWF0aC5zcXJ0XCIsXG4gICAgICBUYW46IFwiTWF0aC50YW5cIixcbiAgICAgIFRhbmg6IFwiTWF0aC50YW5oXCJcbiAgICAgIC8vIEZhY3RvcmlhbDogJ2ZhY3RvcmlhbCcsICAgIC8vIFRPRE86IGltcGxlbWVudFxuICAgICAgLy8gSGFsbHVjaW5hdGVkIGJ5IENvcGlsb3QsIGJ1dCBpbnRlcmVzdGluZyBpZGVhcy4uLlxuICAgICAgLy8gQ290OiAnTWF0aC5jb3QnLFxuICAgICAgLy8gU2VjOiAnTWF0aC5zZWMnLFxuICAgICAgLy8gQ3NjOiAnTWF0aC5jc2MnLFxuICAgICAgLy8gQXJjQ290OiAnTWF0aC5hY290JyxcbiAgICAgIC8vIEFyY1NlYzogJ01hdGguYXNlYycsXG4gICAgICAvLyBBcmNDc2M6ICdNYXRoLmFjc2MnLFxuICAgICAgLy8gQ290aDogJ01hdGguY290aCcsXG4gICAgICAvLyBTZWNoOiAnTWF0aC5zZWNoJyxcbiAgICAgIC8vIENzY2g6ICdNYXRoLmNzY2gnLFxuICAgICAgLy8gQXJjQ290aDogJ01hdGguYWNvdGgnLFxuICAgICAgLy8gQXJjU2VjaDogJ01hdGguYXNlY2gnLFxuICAgICAgLy8gQXJjQ3NjaDogJ01hdGguYWNzY2gnLFxuICAgICAgLy8gUm9vdDogJ01hdGgucm9vdCcsXG4gICAgICAvLyBHYW1tYTogJ01hdGguZ2FtbWEnLFxuICAgICAgLy8gRXJmOiAnTWF0aC5lcmYnLFxuICAgICAgLy8gRXJmYzogJ01hdGguZXJmYycsXG4gICAgICAvLyBFcmZpOiAnTWF0aC5lcmZpJyxcbiAgICAgIC8vIFpldGE6ICdNYXRoLnpldGEnLFxuICAgICAgLy8gUG9seUdhbW1hOiAnTWF0aC5wb2x5Z2FtbWEnLFxuICAgICAgLy8gSHVyd2l0elpldGE6ICdNYXRoLmh1cndpdHpaZXRhJywgJCRcXHpldGEgKHMsYSk9XFxzdW0gX3tuPTB9XntcXGluZnR5IH17XFxmcmFjIHsxfXsobithKV57c319fSQkXG4gICAgICAvLyBEaXJpY2hsZXRFdGE6ICdNYXRoLmRpcmljaGxldEV0YScsXG4gICAgICAvLyBCZXRhOiAnTWF0aC5iZXRhJyxcbiAgICAgIC8vIEJpbm9taWFsOiAnTWF0aC5iaW5vbWlhbCcsXG4gICAgICAvLyBNb2Q6ICdNYXRoLm1vZCcsXG4gICAgICAvLyBRdW90aWVudDogJ01hdGgucXVvdGllbnQnLFxuICAgICAgLy8gR0NEOiAnTWF0aC5nY2QnLFxuICAgICAgLy8gTENNOiAnTWF0aC5sY20nLFxuICAgICAgLy8gRGl2aXNvcnM6ICdNYXRoLmRpdmlzb3JzJyxcbiAgICAgIC8vIFByaW1lUTogJ01hdGguaXNQcmltZScsXG4gICAgICAvLyBQcmltZVBpOiAnTWF0aC5wcmltZVBpJyxcbiAgICAgIC8vIFByaW1lOiAnTWF0aC5wcmltZScsXG4gICAgICAvLyBOZXh0UHJpbWU6ICdNYXRoLm5leHRQcmltZScsXG4gICAgICAvLyBQcmV2aW91c1ByaW1lOiAnTWF0aC5wcmV2UHJpbWUnLFxuICAgICAgLy8gUHJpbWVQb3dlclE6ICdNYXRoLmlzUHJpbWVQb3dlcicsXG4gICAgICAvLyBQcmltZVBvd2VyUGk6ICdNYXRoLnByaW1lUG93ZXJQaScsXG4gICAgICAvLyBQcmltZVBvd2VyOiAnTWF0aC5wcmltZVBvd2VyJyxcbiAgICAgIC8vIE5leHRQcmltZVBvd2VyOiAnTWF0aC5uZXh0UHJpbWVQb3dlcicsXG4gICAgICAvLyBQcmV2aW91c1ByaW1lUG93ZXI6ICdNYXRoLnByZXZQcmltZVBvd2VyJyxcbiAgICAgIC8vIFByaW1lRmFjdG9yczogJ01hdGgucHJpbWVGYWN0b3JzJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTogJ01hdGguZGl2aXNvclNpZ21hJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTA6ICdNYXRoLmRpdmlzb3JTaWdtYTAnLFxuICAgICAgLy8gRGl2aXNvclNpZ21hMTogJ01hdGguZGl2aXNvclNpZ21hMScsXG4gICAgICAvLyBEaXZpc29yU2lnbWEyOiAnTWF0aC5kaXZpc29yU2lnbWEyJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTM6ICdNYXRoLmRpdmlzb3JTaWdtYTMnLFxuICAgICAgLy8gRGl2aXNvclNpZ21hNDogJ01hdGguZGl2aXNvclNpZ21hNCcsXG4gICAgICAvLyBEaXZpc29yQ291bnQ6ICdNYXRoLmRpdmlzb3JDb3VudCcsXG4gICAgICAvLyBEaXZpc29yU3VtOiAnTWF0aC5kaXZpc29yU3VtJyxcbiAgICAgIC8vIE1vZWJpdXNNdTogJ01hdGgubW9lYml1c011JyxcbiAgICAgIC8vIExpb3V2aWxsZUxhbWJkYTogJ01hdGgubGlvdXZpbGxlTGFtYmRhJyxcbiAgICAgIC8vIENhcm1pY2hhZWxMYW1iZGE6ICdNYXRoLmNhcm1pY2hhZWxMYW1iZGEnLFxuICAgICAgLy8gRXVsZXJQaGk6ICdNYXRoLmV1bGVyUGhpJyxcbiAgICAgIC8vIEV1bGVyUHNpOiAnTWF0aC5ldWxlclBzaScsXG4gICAgICAvLyBFdWxlckdhbW1hOiAnTWF0aC5ldWxlckdhbW1hJyxcbiAgICAgIC8vIEhhcm1vbmljTnVtYmVyOiAnTWF0aC5oYXJtb25pY051bWJlcicsXG4gICAgICAvLyBCZXJub3VsbGlCOiAnTWF0aC5iZXJub3VsbGlCJyxcbiAgICAgIC8vIFN0aXJsaW5nUzE6ICdNYXRoLnN0aXJsaW5nUzEnLFxuICAgICAgLy8gU3RpcmxpbmdTMjogJ01hdGguc3RpcmxpbmdTMicsXG4gICAgICAvLyBCZWxsQjogJ01hdGguYmVsbEInLFxuICAgICAgLy8gQmVsbE51bWJlcjogJ01hdGguYmVsbE51bWJlcicsXG4gICAgICAvLyBMYWhTOiAnTWF0aC5sYWhTJyxcbiAgICAgIC8vIExhaEw6ICdNYXRoLmxhaEwnLFxuICAgICAgLy8gUmllbWFublI6ICdNYXRoLnJpZW1hbm5SJyxcbiAgICAgIC8vIFJpZW1hbm5aZXRhOiAnTWF0aC5yaWVtYW5uWmV0YScsXG4gICAgICAvLyBSaWVtYW5uWGk6ICdNYXRoLnJpZW1hbm5YaScsXG4gICAgICAvLyBSaWVtYW5uSDogJ01hdGgucmllbWFubkgnLFxuICAgICAgLy8gUmllbWFublo6ICdNYXRoLnJpZW1hbm5aJyxcbiAgICAgIC8vIFJpZW1hbm5TOiAnTWF0aC5yaWVtYW5uUycsXG4gICAgICAvLyBSaWVtYW5uWGlaZXJvOiAnTWF0aC5yaWVtYW5uWGlaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5aZXRhWmVybzogJ01hdGgucmllbWFublpldGFaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5IWmVybzogJ01hdGgucmllbWFubkhaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVybzogJ01hdGgucmllbWFublNaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5QcmltZUNvdW50OiAnTWF0aC5yaWVtYW5uUHJpbWVDb3VudCcsXG4gICAgICAvLyBSaWVtYW5uUkxvZzogJ01hdGgucmllbWFublJMb2cnLFxuICAgICAgLy8gUmllbWFublJMb2dEZXJpdmF0aXZlOiAnTWF0aC5yaWVtYW5uUkxvZ0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublJMb2daZXJvOiAnTWF0aC5yaWVtYW5uUkxvZ1plcm8nLFxuICAgICAgLy8gUmllbWFublJMb2daZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublJMb2daZXJvRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uUlplcm86ICdNYXRoLnJpZW1hbm5SWmVybycsXG4gICAgICAvLyBSaWVtYW5uUkRlcml2YXRpdmU6ICdNYXRoLnJpZW1hbm5SRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uWGlaZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublhpWmVyb0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublpldGFaZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublpldGFaZXJvRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uSFplcm9EZXJpdmF0aXZlOiAnTWF0aC5yaWVtYW5uSFplcm9EZXJpdmF0aXZlJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmU6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublNaZXJvRGVyaXZhdGl2ZTI6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmUyJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmUzOiAnTWF0aC5yaWVtYW5uU1plcm9EZXJpdmF0aXZlMycsXG4gICAgICAvLyBSaWVtYW5uU1plcm9EZXJpdmF0aXZlNDogJ01hdGgucmllbWFublNaZXJvRGVyaXZhdGl2ZTQnLFxuICAgICAgLy8gUmllbWFublNaZXJvRGVyaXZhdGl2ZTU6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmU1JyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmU2OiAnTWF0aC5yaWVtYW5uU1plcm9EZXJpdmF0aXZlNicsXG4gICAgfVtoXSA/PyBoO1xuICAgIGNvbnN0IGFyZ3MgPSBleHByLm9wcztcbiAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKVxuICAgICAgICByZXN1bHQucHVzaChjb21waWxlKGFyZywgZnJlZVZhcnMpKTtcbiAgICAgIHJldHVybiBgJHtmbn0oJHtyZXN1bHQuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVMb29wKGV4cHIsIG9wMykge1xuICBjb25zdCBhcmdzID0gZXhwci5vcHM7XG4gIGlmIChhcmdzID09PSBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlN1bTogbm8gYXJndW1lbnRzXCIpO1xuICBpZiAoIWV4cHIub3AxIHx8ICFleHByLm9wMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdW06IG5vIGxpbWl0c1wiKTtcbiAgY29uc3QgW2luZGV4LCBsb3dlciwgdXBwZXIsIGlzRmluaXRlMl0gPSBub3JtYWxpemVMaW1pdHMoZXhwci5vcDIpO1xuICBjb25zdCBmbiA9IGNvbXBpbGUoZXhwci5vcDEsIFsuLi5leHByLm9wMS5mcmVlVmFycywgaW5kZXhdLCAwKTtcbiAgcmV0dXJuIGAoKCkgPT4ge1xuICBsZXQgYWNjID0gJHtvcDMgPT09IFwiK1wiID8gXCIwXCIgOiBcIjFcIn07XG4gIGNvbnN0IGZuID0gKF8pID0+ICR7Zm59O1xuICBmb3IgKGxldCBpID0gJHtsb3dlcn07IGkgPD0gJHt1cHBlcn07IGkrKylcbiAgICBhY2MgJHtvcDN9PSBmbih7IC4uLl8sICR7aW5kZXh9OiBpIH0pO1xuICByZXR1cm4gYWNjO1xufSkoKWA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2Fic3RyYWN0LWJveGVkLWV4cHJlc3Npb24udHNcbnZhciBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIG1ldGFkYXRhKSB7XG4gICAgdGhpcy5lbmdpbmUgPSBjZTtcbiAgICBpZiAobWV0YWRhdGE/LmxhdGV4ICE9PSB2b2lkIDApXG4gICAgICB0aGlzLl9sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHRoaXMuX3dpa2lkYXRhID0gbWV0YWRhdGEud2lraWRhdGE7XG4gIH1cbiAgLyoqIGBPYmplY3QudmFsdWVPZigpYDogcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIGZvciB0aGUgb2JqZWN0XG4gICAqXG4gICAqL1xuICB2YWx1ZU9mKCkge1xuICAgIGlmICh0aGlzLnN5bWJvbCA9PT0gXCJUcnVlXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYXNGbG9hdCh0aGlzKSA/PyB0aGlzLnN0cmluZyA/PyB0aGlzLnN5bWJvbCA/PyBKU09OLnN0cmluZ2lmeSh0aGlzLmpzb24pO1xuICB9XG4gIC8qKiBPYmplY3QudG9TdHJpbmcoKSAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAodGhpcy5zeW1ib2wpXG4gICAgICByZXR1cm4gdGhpcy5zeW1ib2w7XG4gICAgaWYgKHRoaXMuc3RyaW5nKVxuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIGNvbnN0IG51bSA9IHRoaXMubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICAgICAgcmV0dXJuIGAke251bVswXS50b1N0cmluZygpfS8ke251bVsxXS50b1N0cmluZygpfWA7XG4gICAgICBpZiAoaXNCaWdSYXRpb25hbChudW0pKVxuICAgICAgICByZXR1cm4gYCR7bnVtWzBdLnRvU3RyaW5nKCl9LyR7bnVtWzFdLnRvU3RyaW5nKCl9YDtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDYuQ29tcGxleCkge1xuICAgICAgICBjb25zdCBpbSA9IG51bS5pbSA9PT0gMSA/IFwiXCIgOiBudW0uaW0gPT09IC0xID8gXCItXCIgOiBudW0uaW0udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG51bS5yZSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gaW0gKyBcImlcIjtcbiAgICAgICAgaWYgKG51bS5pbSA8IDApXG4gICAgICAgICAgcmV0dXJuIGAke251bS5yZS50b1N0cmluZygpfSR7aW19aWA7XG4gICAgICAgIHJldHVybiBgJHtudW0ucmUudG9TdHJpbmcoKX0rJHtpbX1pYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuanNvbik7XG4gIH1cbiAgW1N5bWJvbC50b1ByaW1pdGl2ZV0oaGludCkge1xuICAgIGlmIChoaW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwibnVtYmVyXCIgPyB2IDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfVxuICAvKiogQ2FsbGVkIGJ5IGBKU09OLnN0cmluZ2lmeSgpYCB3aGVuIHNlcmlhbGl6aW5nIHRvIGpzb24gKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLmpzb247XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXQgcmF3SnNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uO1xuICB9XG4gIGdldCBzY29wZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogT2JqZWN0LmlzKCkgKi9cbiAgaXMocmhzKSB7XG4gICAgaWYgKHJocyA9PT0gbnVsbCB8fCByaHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5pc1NhbWUodGhpcy5lbmdpbmUuYm94KHJocykpO1xuICB9XG4gIGdldCBsYXRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXggPz8gdGhpcy5lbmdpbmUuc2VyaWFsaXplKHRoaXMpO1xuICB9XG4gIHNldCBsYXRleCh2YWwpIHtcbiAgICB0aGlzLl9sYXRleCA9IHZhbDtcbiAgfVxuICBnZXQgc3ltYm9sKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBpc05vdGhpbmcoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBzdHJpbmcoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3ViZXhwcmVzc2lvbnMoaGVhZDIpIHtcbiAgICByZXR1cm4gZ2V0U3ViZXhwcmVzc2lvbnModGhpcywgaGVhZDIpO1xuICB9XG4gIGdldCBzdWJleHByZXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJleHByZXNzaW9ucyhcIlwiKTtcbiAgfVxuICBnZXQgc3ltYm9scygpIHtcbiAgICBjb25zdCBzZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGdldFN5bWJvbHModGhpcywgc2V0KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXQpO1xuICB9XG4gIGdldCBmcmVlVmFycygpIHtcbiAgICBjb25zdCBzZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGdldEZyZWVWYXJzKHRoaXMsIHNldCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbiAgfVxuICBnZXQgZXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN1YmV4cHJlc3Npb25zKFwiRXJyb3JcIik7XG4gIH1cbiAgLy8gT25seSByZXR1cm4gbm9uLW51bGwgZm9yIGZ1bmN0aW9uc1xuICBnZXQgb3BzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBub3BzKCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBvcDEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnN5bWJvbChcIk5vdGhpbmdcIik7XG4gIH1cbiAgZ2V0IG9wMigpIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuc3ltYm9sKFwiTm90aGluZ1wiKTtcbiAgfVxuICBnZXQgb3AzKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc0V4YWN0KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKiBGb3IgYSBzeW1ib2wsIHRydWUgaWYgdGhlIHN5bWJvbCBpcyBhIGZyZWUgdmFyaWFibGUgKG5vIHZhbHVlKSAqL1xuICBnZXQgaXNGcmVlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogRm9yIGEgc3ltYm9sLCB0cnVlIGlmIHRoZSBzeW1ib2wgaXMgYSBjb25zdGFudCAodW5jaGFuZ2VhYmxlIHZhbHVlKSAqL1xuICBnZXQgaXNDb25zdGFudCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGNhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhcHBseShfZm4sIF9oZWFkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc3Vicyhfc3ViLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhbm9uaWNhbClcbiAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBzb2x2ZShfdmFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJlcGxhY2UoX3J1bGVzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaGFzKF92KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc05hTigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc1plcm8oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOb3RaZXJvKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzT25lKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIE5vdCArLSBJbmZpbml0eSwgbm90IE5hTlxuICBnZXQgaXNGaW5pdGUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzT2RkKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNDb21wb3NpdGUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgbnVtZXJpY1ZhbHVlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBzZ24oKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXNMZXNzKF9yaHMpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzTGVzc0VxdWFsKF9yaHMpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzR3JlYXRlcihfcmhzKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpc0dyZWF0ZXJFcXVhbChfcmhzKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvLyB4ID4gMFxuICBnZXQgaXNQb3NpdGl2ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPj0gMFxuICBnZXQgaXNOb25OZWdhdGl2ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPCAwXG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgLy8geCA8PSAwXG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaXNDb21wYXRpYmxlKF9kb20sIF9raW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgd2lraWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpa2lkYXRhO1xuICB9XG4gIHNldCB3aWtpZGF0YSh2YWwpIHtcbiAgICB0aGlzLl93aWtpZGF0YSA9IHZhbDtcbiAgfVxuICBnZXQgY29tcGxleGl0eSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBiYXNlZERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgc3ltYm9sRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBmdW5jdGlvbkRlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBiaW5kKF9zY29wZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB1bmJpbmQoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBrZXlzQ291bnQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZ2V0S2V5KF9rZXkpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGhhc0tleShfa2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHNldCB2YWx1ZShfdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgXFxcXCgke3RoaXMubGF0ZXh9XFxcXClgKTtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5kb21haW4oXCJWb2lkXCIpO1xuICB9XG4gIHNldCBkb21haW4oX2RvbWFpbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY2hhbmdlIHRoZSBkb21haW4gb2YgXFxcXCgke3RoaXMubGF0ZXh9XFxcXClgKTtcbiAgfVxuICBnZXQgZXhwbGljaXREb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0ludGVnZXIoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNSYXRpb25hbCgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzUmVhbCgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIFJlYWwgb3IgKy1JbmZpbml0eVxuICBnZXQgaXNFeHRlbmRlZFJlYWwoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzRXh0ZW5kZWRDb21wbGV4KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgc2ltcGxpZnkoX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBldmFsdWF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxpZnkob3B0aW9ucyk7XG4gIH1cbiAgTihfb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKCk7XG4gIH1cbiAgY29tcGlsZSh0byA9IFwiamF2YXNjcmlwdFwiLCBvcHRpb25zKSB7XG4gICAgaWYgKHRvICE9PSBcImphdmFzY3JpcHRcIilcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgb3B0aW9ucyA/PyAob3B0aW9ucyA9IHsgb3B0aW1pemU6IFtcInNpbXBsaWZ5XCIsIFwiZXZhbHVhdGVcIl0gfSk7XG4gICAgbGV0IGV4cHIgPSB0aGlzO1xuICAgIGlmIChvcHRpb25zLm9wdGltaXplLmluY2x1ZGVzKFwic2ltcGxpZnlcIikpXG4gICAgICBleHByID0gZXhwci5zaW1wbGlmeSgpO1xuICAgIGlmIChvcHRpb25zLm9wdGltaXplLmluY2x1ZGVzKFwiZXZhbHVhdGVcIikpXG4gICAgICBleHByID0gZXhwci5ldmFsdWF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29tcGlsZVRvSmF2YXNjcmlwdChleHByKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL3NlcmlhbGl6ZS50c1xudmFyIGltcG9ydF9jb21wbGV4OCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbnVtZXJpY3MvbnVtZXJpYy1iaWdudW0udHNcbmZ1bmN0aW9uIGZhY3RvcmlhbDIoY2UsIG4pIHtcbiAgaWYgKCFuLmlzSW50ZWdlcigpIHx8IG4uaXNOZWdhdGl2ZSgpKVxuICAgIHJldHVybiBjZS5fQklHTlVNX05BTjtcbiAgaWYgKG4ubGVzc1RoYW4oMTApKVxuICAgIHJldHVybiBjZS5iaWdudW0oXG4gICAgICBbMSwgMSwgMiwgNiwgMjQsIDEyMCwgNzIwLCA1MDQwLCA0MDMyMCwgMzYyODgwLCAzNjI4ODAwXVtuLnRvTnVtYmVyKCldXG4gICAgKTtcbiAgaWYgKG4uZ3QoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgbGV0IHZhbDIgPSBjZS5fQklHTlVNX09ORTtcbiAgICBsZXQgaSA9IGNlLl9CSUdOVU1fVFdPO1xuICAgIHdoaWxlIChpLmxlc3NUaGFuKG4pKSB7XG4gICAgICB2YWwyID0gdmFsMi5tdWwoaSk7XG4gICAgICBpID0gaS5hZGQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWwyO1xuICB9XG4gIGlmIChuLm1vZHVsbygyKS5lcSgxKSkge1xuICAgIHJldHVybiBuLnRpbWVzKGZhY3RvcmlhbDIoY2UsIG4ubWludXMoMSkpKTtcbiAgfVxuICBsZXQgbG9vcCA9IG4udG9OdW1iZXIoKTtcbiAgbGV0IHN1bTIgPSBuO1xuICBsZXQgdmFsID0gbjtcbiAgd2hpbGUgKGxvb3AgPiAyKSB7XG4gICAgbG9vcCAtPSAyO1xuICAgIHN1bTIgPSBzdW0yLmFkZChsb29wKTtcbiAgICB2YWwgPSB2YWwubXVsKHN1bTIpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG52YXIgZ2FtbWFHMiA9IDc7XG5mdW5jdGlvbiBsbmdhbW1hMihjZSwgeikge1xuICBpZiAoei5pc05lZ2F0aXZlKCkpXG4gICAgcmV0dXJuIGNlLl9CSUdOVU1fTkFOO1xuICBjb25zdCBHQU1NQV9QX0xOID0gY2UuY2FjaGUoXCJnYW1tYS1wLWxuXCIsICgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCIwLjk5OTk5OTk5OTk5OTk5NzA5MTgyXCIsXG4gICAgICBcIjU3LjE1NjIzNTY2NTg2MjkyMzUxN1wiLFxuICAgICAgXCItNTkuNTk3OTYwMzU1NDc1NDkxMjQ4XCIsXG4gICAgICBcIjE0LjEzNjA5Nzk3NDc0MTc0NzE3NFwiLFxuICAgICAgXCItMC40OTE5MTM4MTYwOTc2MjAxOTk3OFwiLFxuICAgICAgXCIwLjMzOTk0NjQ5OTg0ODExODg4Njk5ZS00XCIsXG4gICAgICBcIjAuNDY1MjM2Mjg5MjcwNDg1NzU2NjVlLTRcIixcbiAgICAgIFwiLTAuOTgzNzQ0NzUzMDQ4Nzk1NjQ2NzdlLTRcIixcbiAgICAgIFwiMC4xNTgwODg3MDMyMjQ5MTI0ODg4NGUtM1wiLFxuICAgICAgXCItMC4yMTAyNjQ0NDE3MjQxMDQ4ODMxOWUtM1wiLFxuICAgICAgXCIwLjIxNzQzOTYxODExNTIxMjY0MzJlLTNcIixcbiAgICAgIFwiLTAuMTY0MzE4MTA2NTM2NzYzODkwMjJlLTNcIixcbiAgICAgIFwiMC44NDQxODIyMzk4Mzg1Mjc0MzI5M2UtNFwiLFxuICAgICAgXCItMC4yNjE5MDgzODQwMTU4MTQwODY3ZS00XCIsXG4gICAgICBcIjAuMzY4OTkxODI2NTk1MzE2MjI3MDRlLTVcIlxuICAgIF0ubWFwKCh4MikgPT4gY2UuYmlnbnVtKHgyKSk7XG4gIH0pO1xuICBsZXQgeCA9IEdBTU1BX1BfTE5bMF07XG4gIGZvciAobGV0IGkgPSBHQU1NQV9QX0xOLmxlbmd0aCAtIDE7IGkgPiAwOyAtLWkpIHtcbiAgICB4ID0geC5hZGQoR0FNTUFfUF9MTltpXS5kaXYoei5hZGQoaSkpKTtcbiAgfVxuICBjb25zdCBHQU1NQV9HX0xOID0gY2UuY2FjaGUoXCJnYW1tYS1nLWxuXCIsICgpID0+IGNlLmJpZ251bSg2MDcpLmRpdigxMjgpKTtcbiAgY29uc3QgdCA9IHouYWRkKEdBTU1BX0dfTE4pLmFkZChjZS5fQklHTlVNX0hBTEYpO1xuICByZXR1cm4gY2UuX0JJR05VTV9ORUdBVElWRV9PTkUuYWNvcygpLm11bChjZS5fQklHTlVNX1RXTykubG9nKCkubXVsKGNlLl9CSUdOVU1fSEFMRikuYWRkKFxuICAgIHQubG9nKCkubXVsKHouYWRkKGNlLl9CSUdOVU1fSEFMRikpLm1pbnVzKHQpLmFkZCh4LmxvZygpKS5taW51cyh6LmxvZygpKVxuICApO1xufVxuZnVuY3Rpb24gZ2FtbWEyKGNlLCB6KSB7XG4gIGlmICh6Lmxlc3NUaGFuKGNlLl9CSUdOVU1fSEFMRikpIHtcbiAgICBjb25zdCBwaSA9IGNlLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKTtcbiAgICByZXR1cm4gcGkuZGl2KFxuICAgICAgcGkubXVsKHopLnNpbigpLm11bChnYW1tYTIoY2UsIGNlLl9CSUdOVU1fT05FLnN1Yih6KSkpXG4gICAgKTtcbiAgfVxuICBpZiAoei5ncmVhdGVyVGhhbigxMDApKVxuICAgIHJldHVybiBsbmdhbW1hMihjZSwgeikuZXhwKCk7XG4gIHogPSB6LnN1YigxKTtcbiAgY29uc3QgTEFOQ1pPU183X0MgPSBjZS5jYWNoZShcImxhbmN6b3MtNy1jXCIsICgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCIwLjk5OTk5OTk5OTk5OTgwOTkzMjI3Njg0NzAwNDczNDc4XCIsXG4gICAgICBcIjY3Ni41MjAzNjgxMjE4ODUwOTg1NjcwMDkxOTA0NDQwMTlcIixcbiAgICAgIFwiLTEyNTkuMTM5MjE2NzIyNDAyODcwNDcxNTYwNzg3NTUyODNcIixcbiAgICAgIFwiNzcxLjMyMzQyODc3NzY1MzA3ODg0ODY1MjgyNTg4OTRcIixcbiAgICAgIFwiLTE3Ni42MTUwMjkxNjIxNDA1OTkwNjU4NDU1MTM1NFwiLFxuICAgICAgXCIxMi41MDczNDMyNzg2ODY5MDQ4MTQ0NTg5MzY4NTNcIixcbiAgICAgIFwiLTAuMTM4NTcxMDk1MjY1NzIwMTE2ODk1NTQ3MDdcIixcbiAgICAgIFwiOS45ODQzNjk1NzgwMTk1NzA4NTk1NjNlLTZcIixcbiAgICAgIFwiMS41MDU2MzI3MzUxNDkzMTE1NTgzNGUtN1wiXG4gICAgXS5tYXAoKHgyKSA9PiBjZS5iaWdudW0oeDIpKTtcbiAgfSk7XG4gIGxldCB4ID0gTEFOQ1pPU183X0NbMF07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZ2FtbWFHMiArIDI7IGkrKylcbiAgICB4ID0geC5hZGQoTEFOQ1pPU183X0NbaV0uZGl2KHouYWRkKGkpKSk7XG4gIGNvbnN0IHQgPSB6LmFkZChnYW1tYUcyKS5hZGQoY2UuX0JJR05VTV9IQUxGKTtcbiAgcmV0dXJuIGNlLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKS50aW1lcyhjZS5fQklHTlVNX1RXTykuc3FydCgpLm11bCh4Lm11bCh0Lm5lZygpLmV4cCgpKS5tdWwodC5wb3coei5hZGQoY2UuX0JJR05VTV9IQUxGKSkpKTtcbn1cbmZ1bmN0aW9uIGlzSW5NYWNoaW5lUmFuZ2UoZCkge1xuICBpZiAoIWQuaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGQuZC5sZW5ndGggPiAzIHx8IGQuZC5sZW5ndGggPT09IDMgJiYgZC5kWzBdID49IDkwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGQucHJlY2lzaW9uKCkgPD0gMTYpO1xuICByZXR1cm4gZC5lIDwgMzA4ICYmIGQuZSA+IC0zMDY7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9zeW1ib2xpYy9wcm9kdWN0LnRzXG52YXIgaW1wb3J0X2NvbXBsZXg3ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG52YXIgUHJvZHVjdCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIHhzLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBPdGhlciB0ZXJtcyBvZiB0aGUgcHJvZHVjdCwgYHRlcm1gIGlzIHRoZSBrZXlcbiAgICB0aGlzLl90ZXJtcyA9IFtdO1xuICAgIHRoaXMuX2hhc0luZmluaXR5ID0gZmFsc2U7XG4gICAgdGhpcy5faGFzWmVybyA9IGZhbHNlO1xuICAgIC8vIElmIGBmYWxzZWAsIHRoZSBydW5uaW5nIHByb2R1Y3RzIGFyZSBub3QgY2FsY3VsYXRlZFxuICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IG9wdGlvbnMuY2Fub25pY2FsO1xuICAgIHRoaXMuZW5naW5lID0gY2U7XG4gICAgdGhpcy5fc2lnbiA9IDE7XG4gICAgdGhpcy5fcmF0aW9uYWwgPSBiaWdudW1QcmVmZXJyZWQoY2UpID8gW0JpZ0ludCgxKSwgQmlnSW50KDEpXSA6IFsxLCAxXTtcbiAgICB0aGlzLl9jb21wbGV4ID0gaW1wb3J0X2NvbXBsZXg3LmRlZmF1bHQuT05FO1xuICAgIHRoaXMuX2JpZ251bSA9IGNlLl9CSUdOVU1fT05FO1xuICAgIHRoaXMuX251bWJlciA9IDE7XG4gICAgaWYgKHhzKVxuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKVxuICAgICAgICB0aGlzLmFkZFRlcm0oeCk7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB0aGlzLl90ZXJtcy5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9oYXNJbmZpbml0eSA9PT0gZmFsc2UgJiYgdGhpcy5faGFzWmVybyA9PT0gZmFsc2UgJiYgdGhpcy5fc2lnbiA9PT0gMSAmJiBpc1JhdGlvbmFsT25lKHRoaXMuX3JhdGlvbmFsKSAmJiAvLyBpc1JhdGlvbmFsT25lKHRoaXMuX3NxdWFyZVJvb3RSYXRpb25hbCkgJiZcbiAgICB0aGlzLl9jb21wbGV4LnJlID09PSAxICYmIHRoaXMuX2NvbXBsZXguaW0gPT09IDAgJiYgdGhpcy5fYmlnbnVtLmVxKHRoaXMuZW5naW5lLl9CSUdOVU1fT05FKSAmJiB0aGlzLl9udW1iZXIgPT09IDE7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHRlcm0gdG8gdGhlIHByb2R1Y3QuXG4gICAqXG4gICAqIElmIGB0aGlzLl9pc0Nhbm9uaWNhbGAgYSBydW5uaW5nIHByb2R1Y3Qgb2YgZXhhY3QgdGVybXMgaXMga2VwdC5cbiAgICogT3RoZXJ3aXNlLCB0ZXJtcyBhbmQgdGhlaXIgZXhwb25lbnQgYXJlIHRhbGxpZWQuXG4gICAqL1xuICBhZGRUZXJtKHRlcm0pIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodGVybS5pc0Nhbm9uaWNhbCk7XG4gICAgaWYgKHRlcm0uaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGVybS5vcHMpXG4gICAgICAgIHRoaXMuYWRkVGVybSh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKSB7XG4gICAgICBpZiAodGVybS5pc05vdGhpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICh0ZXJtLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGVybS5pc09uZSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0ZXJtLmlzWmVybykge1xuICAgICAgICAgIHRoaXMuX2hhc1plcm8gPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVybS5pc05lZ2F0aXZlT25lKSB7XG4gICAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlcm0uaXNJbmZpbml0eSkge1xuICAgICAgICAgIHRoaXMuX2hhc0luZmluaXR5ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGVybS5pc05lZ2F0aXZlKVxuICAgICAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bSA9IHRlcm0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmIChudW0gPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgbnVtID0gLW51bTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICAgICAgICAgIHRoaXMuX3JhdGlvbmFsID0gbXVsMih0aGlzLl9yYXRpb25hbCwgW251bSwgMV0pO1xuICAgICAgICAgIGVsc2UgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpXG4gICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0ubXVsKG51bSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbnVtYmVyICo9IG51bTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIGlmIChudW0uaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgbnVtID0gbnVtLm5lZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtLmlzSW50ZWdlcigpKVxuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBtdWwyKHRoaXMuX3JhdGlvbmFsLCBbYmlnaW50KG51bSksIEJpZ0ludCgxKV0pO1xuICAgICAgICAgIGVsc2UgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpXG4gICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0ubXVsKG51bSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbnVtYmVyICo9IG51bS50b051bWJlcigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg3LmRlZmF1bHQpIHtcbiAgICAgICAgICB0aGlzLl9jb21wbGV4ID0gdGhpcy5fY29tcGxleC5tdWwobnVtKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmF0aW9uYWwobnVtKSkge1xuICAgICAgICAgIHRoaXMuX3JhdGlvbmFsID0gbXVsMih0aGlzLl9yYXRpb25hbCwgbnVtKTtcbiAgICAgICAgICBpZiAoaXNOZWcodGhpcy5fcmF0aW9uYWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3QgPSB0ZXJtO1xuICAgIGlmICh0aGlzLl9pc0Nhbm9uaWNhbCkge1xuICAgICAgbGV0IGNvZWY7XG4gICAgICBbY29lZiwgcmVzdF0gPSBhc0NvZWZmaWNpZW50KHRlcm0pO1xuICAgICAgdGhpcy5fcmF0aW9uYWwgPSBtdWwyKHRoaXMuX3JhdGlvbmFsLCBjb2VmKTtcbiAgICAgIGlmIChpc05lZyh0aGlzLl9yYXRpb25hbCkpIHtcbiAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdC5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgcmVzdC5pc09uZSlcbiAgICAgIHJldHVybjtcbiAgICBsZXQgZXhwb25lbnQgPSBbMSwgMV07XG4gICAgaWYgKHJlc3QuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgICBjb25zdCByID0gYXNSYXRpb25hbChyZXN0Lm9wMik7XG4gICAgICBpZiAocikge1xuICAgICAgICBleHBvbmVudCA9IHI7XG4gICAgICAgIHJlc3QgPSByZXN0Lm9wMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3QuaGVhZCA9PT0gXCJEaXZpZGVcIikge1xuICAgICAgdGhpcy5hZGRUZXJtKHJlc3Qub3AxKTtcbiAgICAgIGV4cG9uZW50ID0gWy0xLCAxXTtcbiAgICAgIHJlc3QgPSByZXN0Lm9wMjtcbiAgICB9XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMuX3Rlcm1zKSB7XG4gICAgICBpZiAoeC50ZXJtLmlzU2FtZShyZXN0KSkge1xuICAgICAgICB4LmV4cG9uZW50ID0gYWRkMih4LmV4cG9uZW50LCBleHBvbmVudCk7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQpXG4gICAgICB0aGlzLl90ZXJtcy5wdXNoKHsgdGVybTogcmVzdCwgZXhwb25lbnQgfSk7XG4gIH1cbiAgdW5pdFRlcm1zKG1vZGUpIHtcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGlmIChtb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKCFjb21wbGV4QWxsb3dlZChjZSkgJiYgdGhpcy5fY29tcGxleC5pbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKGNlKSkge1xuICAgICAgICBsZXQgYjIgPSBjZS5fQklHTlVNX09ORTtcbiAgICAgICAgaWYgKCFpc1JhdGlvbmFsT25lKHRoaXMuX3JhdGlvbmFsKSkge1xuICAgICAgICAgIGlmIChpc0JpZ1JhdGlvbmFsKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICAgIGIyID0gY2UuYmlnbnVtKHRoaXMuX3JhdGlvbmFsWzBdLnRvU3RyaW5nKCkpLmRpdihjZS5iaWdudW0odGhpcy5fcmF0aW9uYWxbMV0udG9TdHJpbmcoKSkpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGIyID0gY2UuYmlnbnVtKHRoaXMuX3JhdGlvbmFsWzBdKS5kaXYodGhpcy5fcmF0aW9uYWxbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGIyID0gYjIubXVsKHRoaXMuX2JpZ251bSkubXVsKHRoaXMuX3NpZ24gKiB0aGlzLl9udW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IHogPSB0aGlzLl9jb21wbGV4Lm11bChiMi50b051bWJlcigpKTtcbiAgICAgICAgICBpZiAoei5lcXVhbHMoMSkpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgcmV0dXJuIFt7IGV4cG9uZW50OiBbMSwgMV0sIHRlcm1zOiBbY2UubnVtYmVyKHopXSB9XTtcbiAgICAgICAgfVxuICAgICAgICBiMiA9IGIyLm11bCh0aGlzLl9jb21wbGV4LnJlKTtcbiAgICAgICAgaWYgKGIyLmVxdWFscygxKSlcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBbeyBleHBvbmVudDogWzEsIDFdLCB0ZXJtczogW2NlLm51bWJlcihiMildIH1dO1xuICAgICAgfVxuICAgICAgbGV0IG4yID0gMTtcbiAgICAgIGlmICghaXNSYXRpb25hbE9uZSh0aGlzLl9yYXRpb25hbCkpIHtcbiAgICAgICAgaWYgKGlzQmlnUmF0aW9uYWwodGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICAgIG4yID0gTnVtYmVyKHRoaXMuX3JhdGlvbmFsWzBdKSAvIE51bWJlcih0aGlzLl9yYXRpb25hbFsxXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBuMiA9IHRoaXMuX3JhdGlvbmFsWzBdIC8gdGhpcy5fcmF0aW9uYWxbMV07XG4gICAgICB9XG4gICAgICBuMiAqPSB0aGlzLl9zaWduICogdGhpcy5fbnVtYmVyICogdGhpcy5fYmlnbnVtLnRvTnVtYmVyKCk7XG4gICAgICBpZiAodGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgICBjb25zdCB6ID0gdGhpcy5fY29tcGxleC5tdWwobjIpO1xuICAgICAgICBpZiAoei5lcXVhbHMoMSkpXG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gW3sgZXhwb25lbnQ6IFsxLCAxXSwgdGVybXM6IFtjZS5udW1iZXIoeildIH1dO1xuICAgICAgfVxuICAgICAgbjIgKj0gdGhpcy5fY29tcGxleC5yZTtcbiAgICAgIGlmIChuMiA9PT0gMSlcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFt7IGV4cG9uZW50OiBbMSwgMV0sIHRlcm1zOiBbY2UubnVtYmVyKG4yKV0gfV07XG4gICAgfVxuICAgIGNvbnN0IHhzID0gW107XG4gICAgY29uc3QgdW5pdFRlcm1zID0gW107XG4gICAgaWYgKHRoaXMuX2hhc0luZmluaXR5KVxuICAgICAgdW5pdFRlcm1zLnB1c2goY2UuX1BPU0lUSVZFX0lORklOSVRZKTtcbiAgICB0aGlzLl9yYXRpb25hbCA9IHJlZHVjZWRSYXRpb25hbCh0aGlzLl9yYXRpb25hbCk7XG4gICAgaWYgKHRoaXMuX2NvbXBsZXgucmUgIT09IDEgfHwgdGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMuX2NvbXBsZXguaW0gPT09IDApXG4gICAgICAgIHRoaXMuX251bWJlciAqPSBNYXRoLmFicyh0aGlzLl9jb21wbGV4LnJlKTtcbiAgICAgIGlmICh0aGlzLl9jb21wbGV4LnJlIDwgMClcbiAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHVuaXRUZXJtcy5wdXNoKGNlLm51bWJlcih0aGlzLl9jb21wbGV4KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBuID0gdGhpcy5fc2lnbiAqIHRoaXMuX251bWJlcjtcbiAgICBsZXQgYiA9IHRoaXMuX2JpZ251bTtcbiAgICBpZiAoIWlzUmF0aW9uYWxPbmUodGhpcy5fcmF0aW9uYWwpKSB7XG4gICAgICBpZiAobW9kZSA9PT0gXCJyYXRpb25hbFwiKSB7XG4gICAgICAgIGlmIChtYWNoaW5lTnVtZXJhdG9yKHRoaXMuX3JhdGlvbmFsKSAhPT0gMSkge1xuICAgICAgICAgIGlmIChpc0JpZ1JhdGlvbmFsKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICAgIGIgPSBiLm11bChjZS5iaWdudW0odGhpcy5fcmF0aW9uYWxbMF0pKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBuICo9IHRoaXMuX3JhdGlvbmFsWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYWNoaW5lRGVub21pbmF0b3IodGhpcy5fcmF0aW9uYWwpICE9PSAxKVxuICAgICAgICAgIHhzLnB1c2goe1xuICAgICAgICAgICAgZXhwb25lbnQ6IFstMSwgMV0sXG4gICAgICAgICAgICB0ZXJtczogW2NlLm51bWJlcih0aGlzLl9yYXRpb25hbFsxXSldXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gLTEpIHtcbiAgICAgICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIobmVnKHRoaXMuX3JhdGlvbmFsKSkpO1xuICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIodGhpcy5fcmF0aW9uYWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFiLmVxdWFscyhjZS5fQklHTlVNX09ORSkpXG4gICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIoYi5tdWwobikpKTtcbiAgICBlbHNlIGlmIChuICE9PSAxKVxuICAgICAgdW5pdFRlcm1zLnB1c2goY2UubnVtYmVyKG4pKTtcbiAgICBpZiAodW5pdFRlcm1zLmxlbmd0aCA+IDApXG4gICAgICB4cy5wdXNoKHsgZXhwb25lbnQ6IFsxLCAxXSwgdGVybXM6IHVuaXRUZXJtcyB9KTtcbiAgICByZXR1cm4geHM7XG4gIH1cbiAgLyoqIFRoZSB0ZXJtcyBvZiB0aGUgcHJvZHVjdCwgZ3JvdXBlZCBieSBkZWdyZWVzLlxuICAgKlxuICAgKiBJZiBgbW9kZWAgaXMgYHJhdGlvbmFsYCwgcmF0aW9uYWxzIGFyZSBzcGxpdCBpbnRvIHNlcGFyYXRlIG51bWVyYXRvciBhbmRcbiAgICogZGVub21pbmF0b3IsIHNvIHRoYXQgYSByYXRpb25hbCBleHByZXNzaW9uIGNhbiBiZSBjcmVhdGVkIGxhdGVyXG4gICAqIElmIGBtb2RlYCBpcyBgZXhwcmVzc2lvbmAsIGEgcmVndWxhciBleHByZXNzaW9uIGlzIHJldHVybmVkLCB3aXRob3V0XG4gICAqIHNwbGl0dGluZyByYXRpb25hbHNcbiAgICogSWYgYG1vZGVgIGlzIGBudW1lcmljYCwgdGhlIGxpdGVyYWxzIGFyZSBjb21iaW5lZCBpbnRvIG9uZSBleHByZXNzaW9uXG4gICAqXG4gICAqL1xuICBncm91cGVkQnlEZWdyZWVzKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIGlmICghKFwibW9kZVwiIGluIG9wdGlvbnMpKVxuICAgICAgb3B0aW9ucy5tb2RlID0gXCJleHByZXNzaW9uXCI7XG4gICAgY29uc3QgY2UgPSB0aGlzLmVuZ2luZTtcbiAgICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKHRoaXMuX2NvbXBsZXguaW0gIT09IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodGhpcy5faGFzSW5maW5pdHkpXG4gICAgICAgIHJldHVybiBbeyBleHBvbmVudDogWzEsIDFdLCB0ZXJtczogW2NlLl9QT1NJVElWRV9JTkZJTklUWV0gfV07XG4gICAgfVxuICAgIGNvbnN0IHhzID0gdGhpcy51bml0VGVybXMob3B0aW9ucy5tb2RlID8/IFwiZXhwcmVzc2lvblwiKTtcbiAgICBpZiAoeHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fdGVybXMpIHtcbiAgICAgIGNvbnN0IGV4cG9uZW50ID0gcmVkdWNlZFJhdGlvbmFsKHQuZXhwb25lbnQpO1xuICAgICAgaWYgKGV4cG9uZW50WzBdID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgICAgIGlmIChleHBvbmVudFswXSA9PT0geC5leHBvbmVudFswXSAmJiBleHBvbmVudFsxXSA9PT0geC5leHBvbmVudFsxXSkge1xuICAgICAgICAgIHgudGVybXMucHVzaCh0LnRlcm0pO1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgeHMucHVzaCh7IGV4cG9uZW50LCB0ZXJtczogW3QudGVybV0gfSk7XG4gICAgfVxuICAgIHJldHVybiB4cztcbiAgfVxuICBhc0V4cHJlc3Npb24obW9kZSA9IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IGNlID0gdGhpcy5lbmdpbmU7XG4gICAgaWYgKHRoaXMuX2hhc0luZmluaXR5KSB7XG4gICAgICBpZiAodGhpcy5faGFzWmVybylcbiAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICBpZiAodGhpcy5fdGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChtYWNoaW5lTnVtZXJhdG9yKHRoaXMuX3JhdGlvbmFsKSA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgcmV0dXJuIGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2hhc1plcm8pXG4gICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgY29uc3QgZ3JvdXBlZFRlcm1zID0gdGhpcy5ncm91cGVkQnlEZWdyZWVzKHtcbiAgICAgIG1vZGU6IG1vZGUgPT09IFwiTlwiID8gXCJudW1lcmljXCIgOiBcImV4cHJlc3Npb25cIlxuICAgIH0pO1xuICAgIGlmIChncm91cGVkVGVybXMgPT09IG51bGwpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBjb25zdCB0ZXJtcyA9IHRlcm1zQXNFeHByZXNzaW9ucyhjZSwgZ3JvdXBlZFRlcm1zKTtcbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGNlLl9PTkU7XG4gICAgaWYgKHRlcm1zLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiB0ZXJtc1swXTtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuX2ZuKFwiTXVsdGlwbHlcIiwgdGVybXMpO1xuICB9XG4gIC8qKiBUaGUgcHJvZHVjdCwgZXhwcmVzc2VkIGFzIGEgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciAqL1xuICBhc051bWVyYXRvckRlbm9taW5hdG9yKCkge1xuICAgIGNvbnN0IHhzID0gdGhpcy5ncm91cGVkQnlEZWdyZWVzKHsgbW9kZTogXCJyYXRpb25hbFwiIH0pO1xuICAgIGlmICh4cyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBbdGhpcy5lbmdpbmUuX05BTiwgdGhpcy5lbmdpbmUuX05BTl07XG4gICAgY29uc3QgeHNOdW1lcmF0b3IgPSBbXTtcbiAgICBjb25zdCB4c0Rlbm9taW5hdG9yID0gW107XG4gICAgZm9yIChjb25zdCB4IG9mIHhzKVxuICAgICAgaWYgKHguZXhwb25lbnRbMF0gPj0gMClcbiAgICAgICAgeHNOdW1lcmF0b3IucHVzaCh4KTtcbiAgICAgIGVsc2VcbiAgICAgICAgeHNEZW5vbWluYXRvci5wdXNoKHtcbiAgICAgICAgICBleHBvbmVudDogbmVnKHguZXhwb25lbnQpLFxuICAgICAgICAgIHRlcm1zOiB4LnRlcm1zXG4gICAgICAgIH0pO1xuICAgIGNvbnN0IGNlID0gdGhpcy5lbmdpbmU7XG4gICAgY29uc3QgbnVtZXJhdG9yVGVybXMgPSB0ZXJtc0FzRXhwcmVzc2lvbnMoY2UsIHhzTnVtZXJhdG9yKTtcbiAgICBsZXQgbnVtZXJhdG9yID0gY2UuX09ORTtcbiAgICBpZiAobnVtZXJhdG9yVGVybXMubGVuZ3RoID09PSAxKVxuICAgICAgbnVtZXJhdG9yID0gbnVtZXJhdG9yVGVybXNbMF07XG4gICAgZWxzZSBpZiAobnVtZXJhdG9yVGVybXMubGVuZ3RoID4gMClcbiAgICAgIG51bWVyYXRvciA9IGNlLl9mbihcIk11bHRpcGx5XCIsIG51bWVyYXRvclRlcm1zKTtcbiAgICBjb25zdCBkZW5vbWluYXRvclRlcm1zID0gdGVybXNBc0V4cHJlc3Npb25zKGNlLCB4c0Rlbm9taW5hdG9yKTtcbiAgICBsZXQgZGVub21pbmF0b3IgPSBjZS5fT05FO1xuICAgIGlmIChkZW5vbWluYXRvclRlcm1zLmxlbmd0aCA9PT0gMSlcbiAgICAgIGRlbm9taW5hdG9yID0gZGVub21pbmF0b3JUZXJtc1swXTtcbiAgICBlbHNlIGlmIChkZW5vbWluYXRvclRlcm1zLmxlbmd0aCA+IDApXG4gICAgICBkZW5vbWluYXRvciA9IGNlLl9mbihcIk11bHRpcGx5XCIsIGRlbm9taW5hdG9yVGVybXMpO1xuICAgIHJldHVybiBbbnVtZXJhdG9yLCBkZW5vbWluYXRvcl07XG4gIH1cbiAgYXNSYXRpb25hbEV4cHJlc3Npb24oKSB7XG4gICAgY29uc3QgW251bWVyYXRvciwgZGVub21pbmF0b3JdID0gdGhpcy5hc051bWVyYXRvckRlbm9taW5hdG9yKCk7XG4gICAgaWYgKGRlbm9taW5hdG9yLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRlbm9taW5hdG9yLmlzT25lKVxuICAgICAgICByZXR1cm4gbnVtZXJhdG9yO1xuICAgICAgaWYgKGRlbm9taW5hdG9yLmlzTmVnYXRpdmVPbmUpXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5uZWcobnVtZXJhdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLl9mbihcIkRpdmlkZVwiLCBbbnVtZXJhdG9yLCBkZW5vbWluYXRvcl0pO1xuICB9XG59O1xuZnVuY3Rpb24gZGVncmVlS2V5KGV4cG9uZW50KSB7XG4gIGlmIChpc1JhdGlvbmFsT25lKGV4cG9uZW50KSlcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgW24sIGRdID0gW21hY2hpbmVOdW1lcmF0b3IoZXhwb25lbnQpLCBtYWNoaW5lRGVub21pbmF0b3IoZXhwb25lbnQpXTtcbiAgaWYgKG4gPiAwICYmIE51bWJlci5pc0ludGVnZXIobiAvIGQpKVxuICAgIHJldHVybiAxO1xuICBpZiAobiA+IDApXG4gICAgcmV0dXJuIDI7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4gLyBkKSlcbiAgICByZXR1cm4gMztcbiAgcmV0dXJuIDQ7XG59XG5mdW5jdGlvbiBkZWdyZWVPcmRlcihhLCBiKSB7XG4gIGNvbnN0IGtleUEgPSBkZWdyZWVLZXkoYS5leHBvbmVudCk7XG4gIGNvbnN0IGtleUIgPSBkZWdyZWVLZXkoYi5leHBvbmVudCk7XG4gIGlmIChrZXlBICE9PSBrZXlCKVxuICAgIHJldHVybiBrZXlBIC0ga2V5QjtcbiAgY29uc3QgW2FfbiwgYV9kXSA9IFtcbiAgICBtYWNoaW5lTnVtZXJhdG9yKGEuZXhwb25lbnQpLFxuICAgIG1hY2hpbmVEZW5vbWluYXRvcihhLmV4cG9uZW50KVxuICBdO1xuICBjb25zdCBbYl9uLCBiX2RdID0gW1xuICAgIG1hY2hpbmVOdW1lcmF0b3IoYi5leHBvbmVudCksXG4gICAgbWFjaGluZURlbm9taW5hdG9yKGIuZXhwb25lbnQpXG4gIF07XG4gIHJldHVybiBhX24gLyBhX2QgLSBiX24gLyBiX2Q7XG59XG5mdW5jdGlvbiB0ZXJtc0FzRXhwcmVzc2lvbnMoY2UsIHRlcm1zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHRlcm1zLnNvcnQoZGVncmVlT3JkZXIpLm1hcCgoeCkgPT4ge1xuICAgIGNvbnN0IHQgPSBmbGF0dGVuT3BzKHgudGVybXMsIFwiTXVsdGlwbHlcIik7XG4gICAgY29uc3QgYmFzZSA9IHQubGVuZ3RoIDw9IDEgPyB0WzBdIDogY2UuX2ZuKFwiTXVsdGlwbHlcIiwgdC5zb3J0KG9yZGVyKSk7XG4gICAgaWYgKGlzUmF0aW9uYWxPbmUoeC5leHBvbmVudCkpXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICByZXR1cm4gY2UucG93KGJhc2UsIHguZXhwb25lbnQpO1xuICB9KTtcbiAgcmV0dXJuIGZsYXR0ZW5PcHMocmVzdWx0LCBcIk11bHRpcGx5XCIpID8/IHJlc3VsdDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vc2VyaWFsaXplLnRzXG5mdW5jdGlvbiBzdWJ0cmFjdChjZSwgYSwgYiwgbWV0YWRhdGEpIHtcbiAgaWYgKGEubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKGlzUmF0aW9uYWwoYS5udW1lcmljVmFsdWUpKSB7XG4gICAgICBpZiAobWFjaGluZU51bWVyYXRvcihhLm51bWVyaWNWYWx1ZSkgPCAwKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgY2UsXG4gICAgICAgICAgXCJTdWJ0cmFjdFwiLFxuICAgICAgICAgIFtiLCBjZS5udW1iZXIobmVnKGEubnVtZXJpY1ZhbHVlKSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdDAgPSBhc1NtYWxsSW50ZWdlcihhKTtcbiAgICBpZiAodDAgIT09IG51bGwgJiYgdDAgPCAwKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgICAgW2IsIGNlLm51bWJlcigtdDApXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gIH1cbiAgaWYgKGEuaGVhZCA9PT0gXCJOZWdhdGVcIilcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlN1YnRyYWN0XCIsIFtiLCBhLm9wMV0sIG1ldGFkYXRhKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBhcmdzLCBtZXRhZGF0YSkge1xuICBjb25zdCBleGNsdXNpb25zID0gY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLmV4Y2x1ZGU7XG4gIGlmIChoZWFkMiA9PT0gXCJBZGRcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMiAmJiAhZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlN1YnRyYWN0XCIpKSB7XG4gICAgY29uc3Qgc3ViMiA9IHN1YnRyYWN0KGNlLCBhcmdzWzBdLCBhcmdzWzFdLCBtZXRhZGF0YSkgPz8gc3VidHJhY3QoY2UsIGFyZ3NbMV0sIGFyZ3NbMF0sIG1ldGFkYXRhKTtcbiAgICBpZiAoc3ViMilcbiAgICAgIHJldHVybiBzdWIyO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEaXZpZGVcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMiAmJiBleGNsdXNpb25zLmluY2x1ZGVzKFwiRGl2aWRlXCIpKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgIGNlLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIlBvd2VyXCIsIFthcmdzWzFdLCBjZS5fTkVHQVRJVkVfT05FXSldLFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJNdWx0aXBseVwiICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiTmVnYXRlXCIpKSB7XG4gICAgaWYgKGFzRmxvYXQoYXJnc1swXSkgPT09IC0xKSB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiTmVnYXRlXCIsIFthcmdzWzFdXSk7XG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJOZWdhdGVcIixcbiAgICAgICAgW2NlLl9mbihcIk11bHRpcGx5XCIsIGFyZ3Muc2xpY2UoMSkpXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJNdWx0aXBseVwiICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiRGl2aWRlXCIpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb2R1Y3QoY2UsIGFyZ3MsIHtcbiAgICAgIGNhbm9uaWNhbDogZmFsc2VcbiAgICB9KS5hc1JhdGlvbmFsRXhwcmVzc2lvbigpO1xuICAgIGlmIChyZXN1bHQuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIHJlc3VsdC5oZWFkLCByZXN1bHQub3BzLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIlBvd2VyXCIpIHtcbiAgICBpZiAoIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJFeHBcIikgJiYgYXJnc1swXT8uc3ltYm9sID09PSBcIkV4cG9uZW50aWFsRVwiKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJFeHBcIiwgW2FyZ3NbMV1dLCBtZXRhZGF0YSk7XG4gICAgaWYgKGFyZ3NbMV0/Lm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZXhwMiA9IGFzU21hbGxJbnRlZ2VyKGFyZ3NbMV0pO1xuICAgICAgaWYgKGV4cDIgPT09IDIgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJTcXVhcmVcIikpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU3F1YXJlXCIsIFthcmdzWzBdXSwgbWV0YWRhdGEpO1xuICAgICAgaWYgKGV4cDIgIT09IG51bGwgJiYgZXhwMiA8IDAgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJEaXZpZGVcIikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgICBjZSxcbiAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgIFtjZS5fT05FLCBleHAyID09PSAtMSA/IGFyZ3NbMF0gOiBjZS5wb3coYXJnc1swXSwgLWV4cDIpXSxcbiAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgciA9IGFyZ3NbMV0ubnVtZXJpY1ZhbHVlO1xuICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiU3FydFwiKSAmJiByID09PSAwLjUpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU3FydFwiLCBbYXJnc1swXV0sIG1ldGFkYXRhKTtcbiAgICAgIGlmICghZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNxcnRcIikgJiYgciA9PT0gLTAuNSlcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgICBjZSxcbiAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgIFtjZS5fT05FLCBjZS5fZm4oXCJTcXJ0XCIsIFthcmdzWzBdXSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICBpZiAoaXNSYXRpb25hbChyKSkge1xuICAgICAgICBjb25zdCBuID0gbWFjaGluZU51bWVyYXRvcihyKTtcbiAgICAgICAgY29uc3QgZCA9IG1hY2hpbmVEZW5vbWluYXRvcihyKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBpZiAoIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJTcXJ0XCIpICYmIGQgPT09IDIpXG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlNxcnRcIiwgW2FyZ3NbMF1dLCBtZXRhZGF0YSk7XG4gICAgICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiUm9vdFwiKSlcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIlJvb3RcIixcbiAgICAgICAgICAgICAgW2FyZ3NbMF0sIGNlLm51bWJlcihyWzFdKV0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuID09PSAtMSkge1xuICAgICAgICAgIGlmICghZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNxcnRcIikgJiYgZCA9PT0gMilcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgICBbY2UuX09ORSwgY2UuX2ZuKFwiU3FydFwiLCBbYXJnc1swXV0pXSxcbiAgICAgICAgICAgICAgbWV0YWRhdGFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiUm9vdFwiKSlcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgICBbY2UuX09ORSwgY2UuX2ZuKFwiUm9vdFwiLCBbYXJnc1swXSwgY2UubnVtYmVyKHJbMV0pXSldLFxuICAgICAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBoZWFkMiwgYXJncywgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBoZWFkMiwgYXJncywgbWV0YWRhdGEpIHtcbiAgY29uc3QgZXhjbHVzaW9ucyA9IGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5leGNsdWRlO1xuICBpZiAoKGhlYWQyID09PSBcIlJhdGlvbmFsXCIgfHwgaGVhZDIgPT09IFwiRGl2aWRlXCIpICYmIGFyZ3MubGVuZ3RoID09PSAyICYmIGFzU21hbGxJbnRlZ2VyKGFyZ3NbMF0pID09PSAxICYmIGFzU21hbGxJbnRlZ2VyKGFyZ3NbMV0pID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiSGFsZlwiKSkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBcIkhhbGZcIiwge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICB3aWtpZGF0YTogXCJRMzkzNzMxNzJcIlxuICAgIH0pO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG51bTAgPSBhcmdzWzBdLm51bWVyaWNWYWx1ZTtcbiAgICBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIgJiYgbnVtMCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBudW0wID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcihjZSwgLW51bTApO1xuICAgICAgaWYgKG51bTAgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBudW0wLm5lZygpKTtcbiAgICAgIGlmIChudW0wIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg4LkNvbXBsZXgpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBudW0wLm5lZygpKTtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG51bTApKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcihjZSwgbmVnKG51bTApKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiBleGNsdXNpb25zLmluY2x1ZGVzKGhlYWQyKSkge1xuICAgIGlmIChoZWFkMiA9PT0gXCJSYXRpb25hbFwiICYmIGFyZ3MubGVuZ3RoID09PSAyKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJEaXZpZGVcIiwgYXJncywgbWV0YWRhdGEpO1xuICAgIGlmIChoZWFkMiA9PT0gXCJDb21wbGV4XCIgJiYgYXJncy5sZW5ndGggPT09IDIpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJBZGRcIixcbiAgICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIk11bHRpcGx5XCIsIFthcmdzWzFdLCBjZS5zeW1ib2woXCJJbWFnaW5hcnlVbml0XCIpXSldLFxuICAgICAgICBtZXRhZGF0YVxuICAgICAgKTtcbiAgICBpZiAoaGVhZDIgPT09IFwiU3FydFwiICYmIGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIFwiUG93ZXJcIixcbiAgICAgICAgW2FyZ3NbMF0sIGV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJIYWxmXCIpID8gY2UubnVtYmVyKFsxLCAyXSkgOiBjZS5fSEFMRl0sXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuICAgIGlmIChoZWFkMiA9PT0gXCJSb290XCIgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1sxXS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG4gPSBhc1NtYWxsSW50ZWdlcihhcmdzWzFdKTtcbiAgICAgIGlmIChuID09PSAyKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlNxcnRcIiwgW2FyZ3NbMF1dKTtcbiAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuIDwgMClcbiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICAgICAgY2UsXG4gICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgW2NlLl9PTkUsIGNlLl9mbihcIlBvd2VyXCIsIFthcmdzWzBdLCBjZS5udW1iZXIoWzEsIC1uXSldKV0sXG4gICAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgY2UsXG4gICAgICAgICAgXCJQb3dlclwiLFxuICAgICAgICAgIFthcmdzWzBdLCBjZS5udW1iZXIoWzEsIC1uXSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJTcXVhcmVcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBcIlBvd2VyXCIsXG4gICAgICAgIFthcmdzWzBdLCBjZS5udW1iZXIoMildLFxuICAgICAgICBtZXRhZGF0YVxuICAgICAgKTtcbiAgICBpZiAoaGVhZDIgPT09IFwiRXhwXCIgJiYgYXJncy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJQb3dlclwiLFxuICAgICAgICBbY2Uuc3ltYm9sKFwiRXhwb25lbnRpYWxFXCIpLCBhcmdzWzBdXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgaWYgKGhlYWQyID09PSBcIlN1YnRyYWN0XCIgJiYgYXJncy5sZW5ndGggPT09IDIpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJBZGRcIixcbiAgICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIk5lZ2F0ZVwiLCBbYXJnc1sxXV0pXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgaWYgKGhlYWQyID09PSBcIlN1YnRyYWN0XCIgJiYgYXJncy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIk5lZ2F0ZVwiLCBhcmdzLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiICYmIGFyZ3MubGVuZ3RoID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiU3VidHJhY3RcIikpIHtcbiAgICBpZiAoYXJnc1sxXS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHQxID0gYXNTbWFsbEludGVnZXIoYXJnc1sxXSk7XG4gICAgICBpZiAodDEgIT09IG51bGwgJiYgdDEgPCAwKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICAgIGNlLFxuICAgICAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgICAgICBbYXJnc1swXSwgY2UubnVtYmVyKC10MSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmdzWzFdLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBcIlN1YnRyYWN0XCIsXG4gICAgICAgIFthcmdzWzBdLCBhcmdzWzFdLm9wMV0sXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiVHVwbGVcIikge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiAhZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNpbmdsZVwiKSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU2luZ2xlXCIsIGFyZ3MsIG1ldGFkYXRhKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJQYWlyXCIpKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJQYWlyXCIsIGFyZ3MsIG1ldGFkYXRhKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDMgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJUcmlwbGVcIikpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlRyaXBsZVwiLCBhcmdzLCBtZXRhZGF0YSk7XG4gIH1cbiAgY29uc3QganNvbkhlYWQgPSB0eXBlb2YgaGVhZDIgPT09IFwic3RyaW5nXCIgPyBfZXNjYXBlSnNvblN0cmluZyhoZWFkMikgOiBoZWFkMi5qc29uO1xuICBjb25zdCBmbiA9IFtqc29uSGVhZCwgLi4uYXJncy5tYXAoKHgpID0+IHguanNvbildO1xuICBjb25zdCBtZCA9IHsgLi4ubWV0YWRhdGEgPz8ge30gfTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5tZXRhZGF0YS5pbmNsdWRlcyhcImxhdGV4XCIpKSB7XG4gICAgbWQubGF0ZXggPSBfZXNjYXBlSnNvblN0cmluZyhtZC5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBmbiB9KSk7XG4gIH0gZWxzZVxuICAgIG1kLmxhdGV4ID0gXCJcIjtcbiAgaWYgKCFjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJ3aWtpZGF0YVwiKSlcbiAgICBtZC53aWtpZGF0YSA9IFwiXCI7XG4gIGlmICghbWQubGF0ZXggJiYgIW1kLndpa2lkYXRhICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwiZnVuY3Rpb25cIikpXG4gICAgcmV0dXJuIGZuO1xuICBpZiAobWQubGF0ZXggJiYgbWQud2lraWRhdGEpXG4gICAgcmV0dXJuIHsgZm4sIGxhdGV4OiBtZC5sYXRleCwgd2lraWRhdGE6IG1kLndpa2lkYXRhIH07XG4gIGlmIChtZC5sYXRleClcbiAgICByZXR1cm4geyBmbiwgbGF0ZXg6IG1kLmxhdGV4IH07XG4gIGlmIChtZC53aWtpZGF0YSlcbiAgICByZXR1cm4geyBmbiwgd2lraWRhdGE6IG1kLndpa2lkYXRhIH07XG4gIHJldHVybiB7IGZuIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3RyaW5nKGNlLCBzKSB7XG4gIHMgPSBfZXNjYXBlSnNvblN0cmluZyhzKTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwic3RyaW5nXCIpKVxuICAgIHJldHVybiBgJyR7c30nYDtcbiAgcmV0dXJuIHsgc3RyOiBzIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBzeW0sIG1ldGFkYXRhKSB7XG4gIGlmIChzeW0gPT09IFwiSGFsZlwiICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5leGNsdWRlLmluY2x1ZGVzKFwiSGFsZlwiKSkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBbMSwgMl0sIG1ldGFkYXRhKTtcbiAgfVxuICBtZXRhZGF0YSA9IHsgLi4ubWV0YWRhdGEgfTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5tZXRhZGF0YS5pbmNsdWRlcyhcImxhdGV4XCIpKSB7XG4gICAgbWV0YWRhdGEubGF0ZXggPSBtZXRhZGF0YS5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBzeW0gfSk7XG4gICAgaWYgKG1ldGFkYXRhLmxhdGV4ICE9PSB2b2lkIDApXG4gICAgICBtZXRhZGF0YS5sYXRleCA9IF9lc2NhcGVKc29uU3RyaW5nKG1ldGFkYXRhLmxhdGV4KTtcbiAgfSBlbHNlXG4gICAgbWV0YWRhdGEubGF0ZXggPSB2b2lkIDA7XG4gIGlmIChjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJ3aWtpZGF0YVwiKSkge1xuICAgIGlmIChtZXRhZGF0YS53aWtpZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCB3aWtpZGF0YSA9IGNlLmxvb2t1cFN5bWJvbChzeW0pPy53aWtpZGF0YTtcbiAgICAgIGlmICh3aWtpZGF0YSAhPT0gdm9pZCAwKVxuICAgICAgICBtZXRhZGF0YS53aWtpZGF0YSA9IF9lc2NhcGVKc29uU3RyaW5nKHdpa2lkYXRhKTtcbiAgICB9XG4gIH0gZWxzZVxuICAgIG1ldGFkYXRhLndpa2lkYXRhID0gdm9pZCAwO1xuICBzeW0gPSBfZXNjYXBlSnNvblN0cmluZyhzeW0pO1xuICBpZiAobWV0YWRhdGEubGF0ZXggPT09IHZvaWQgMCAmJiBtZXRhZGF0YS53aWtpZGF0YSA9PT0gdm9pZCAwICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwic3ltYm9sXCIpKVxuICAgIHJldHVybiBzeW07XG4gIGlmIChtZXRhZGF0YS5sYXRleCAhPT0gdm9pZCAwICYmIG1ldGFkYXRhLndpa2lkYXRhICE9PSB2b2lkIDApXG4gICAgcmV0dXJuIHsgc3ltLCBsYXRleDogbWV0YWRhdGEubGF0ZXgsIHdpa2lkYXRhOiBtZXRhZGF0YS53aWtpZGF0YSB9O1xuICBpZiAobWV0YWRhdGEubGF0ZXggIT09IHZvaWQgMClcbiAgICByZXR1cm4geyBzeW0sIGxhdGV4OiBtZXRhZGF0YS5sYXRleCB9O1xuICBpZiAobWV0YWRhdGEud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICByZXR1cm4geyBzeW0sIHdpa2lkYXRhOiBtZXRhZGF0YS53aWtpZGF0YSB9O1xuICByZXR1cm4geyBzeW0gfTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUpzb25OdW1iZXIoY2UsIHZhbHVlLCBtZXRhZGF0YSkge1xuICBtZXRhZGF0YSA9IHsgLi4ubWV0YWRhdGEgfTtcbiAgaWYgKCFjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJsYXRleFwiKSlcbiAgICBtZXRhZGF0YS5sYXRleCA9IHZvaWQgMDtcbiAgY29uc3Qgc2hvcnRoYW5kQWxsb3dlZCA9IG1ldGFkYXRhLmxhdGV4ID09PSB2b2lkIDAgJiYgbWV0YWRhdGEud2lraWRhdGEgPT09IHZvaWQgMCAmJiAhY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikgJiYgY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLnNob3J0aGFuZHMuaW5jbHVkZXMoXCJudW1iZXJcIik7XG4gIGNvbnN0IGV4Y2x1c2lvbnMgPSBjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuZXhjbHVkZTtcbiAgbGV0IG51bSA9IFwiXCI7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgIGlmICh2YWx1ZS5pc05hTigpKVxuICAgICAgbnVtID0gXCJOYU5cIjtcbiAgICBlbHNlIGlmICghdmFsdWUuaXNGaW5pdGUoKSlcbiAgICAgIG51bSA9IHZhbHVlLmlzUG9zaXRpdmUoKSA/IFwiK0luZmluaXR5XCIgOiBcIi1JbmZpbml0eVwiO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKHNob3J0aGFuZEFsbG93ZWQgJiYgaXNJbk1hY2hpbmVSYW5nZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS50b051bWJlcigpO1xuICAgICAgaWYgKHZhbHVlLmlzSW50ZWdlcigpICYmIHZhbHVlLmUgPCB2YWx1ZS5wcmVjaXNpb24oKSArIDQpXG4gICAgICAgIG51bSA9IHZhbHVlLnRvRml4ZWQoMCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLnByZWNpc2lvbjtcbiAgICAgICAgY29uc3QgcyA9IHByZWNpc2lvbiA9PT0gXCJtYXhcIiA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZS50b1ByZWNpc2lvbihcbiAgICAgICAgICBwcmVjaXNpb24gPT09IFwiYXV0b1wiID8gY2UucHJlY2lzaW9uIDogcHJlY2lzaW9uXG4gICAgICAgICk7XG4gICAgICAgIG51bSA9IHJlcGVhdGluZ0RlY2ltYWxzKGNlLCBzKTtcbiAgICAgICAgaWYgKHNob3J0aGFuZEFsbG93ZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWx1ZS50b051bWJlcigpO1xuICAgICAgICAgIGlmICh2YWwudG9TdHJpbmcoKSA9PT0gbnVtKVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgICBtZXRhZGF0YS5sYXRleCA9IG1ldGFkYXRhLmxhdGV4ID8/IGNlLnNlcmlhbGl6ZSh7IG51bSB9KTtcbiAgICByZXR1cm4gbWV0YWRhdGEubGF0ZXggIT09IHZvaWQgMCA/IHsgbnVtLCBsYXRleDogbWV0YWRhdGEubGF0ZXggfSA6IHNob3J0aGFuZEFsbG93ZWQgPyBudW0gOiB7IG51bSB9O1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4OC5Db21wbGV4KSB7XG4gICAgaWYgKHZhbHVlLmlzSW5maW5pdGUoKSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBcIkNvbXBsZXhJbmZpbml0eVwiLCBtZXRhZGF0YSk7XG4gICAgaWYgKHZhbHVlLmlzTmFOKCkpIHtcbiAgICAgIG51bSA9IFwiTmFOXCI7XG4gICAgICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgICAgIG1ldGFkYXRhLmxhdGV4ID0gbWV0YWRhdGEubGF0ZXggPz8gY2Uuc2VyaWFsaXplKHsgbnVtIH0pO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmxhdGV4ICE9PSB2b2lkIDAgPyB7IG51bSwgbGF0ZXg6IG1ldGFkYXRhLmxhdGV4IH0gOiB7IG51bSB9O1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgY2UsXG4gICAgICBcIkNvbXBsZXhcIixcbiAgICAgIFtjZS5udW1iZXIodmFsdWUucmUpLCBjZS5udW1iZXIodmFsdWUuaW0pXSxcbiAgICAgIHtcbiAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgIHdpa2lkYXRhOiBcIlExMTU2N1wiXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBpZiAoaXNSYXRpb25hbCh2YWx1ZSkpIHtcbiAgICBjb25zdCBhbGxvd1JhdGlvbmFsID0gIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJSYXRpb25hbFwiKTtcbiAgICBpZiAoc2hvcnRoYW5kQWxsb3dlZCAmJiBjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuc2hvcnRoYW5kcy5pbmNsdWRlcyhcImZ1bmN0aW9uXCIpICYmIGlzTWFjaGluZVJhdGlvbmFsKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlWzBdID09PSAxICYmIHZhbHVlWzFdID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiSGFsZlwiKSlcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25TeW1ib2woY2UsIFwiSGFsZlwiLCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm4gW2FsbG93UmF0aW9uYWwgPyBcIlJhdGlvbmFsXCIgOiBcIkRpdmlkZVwiLCB2YWx1ZVswXSwgdmFsdWVbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgY2UsXG4gICAgICBhbGxvd1JhdGlvbmFsID8gXCJSYXRpb25hbFwiIDogXCJEaXZpZGVcIixcbiAgICAgIFtjZS5udW1iZXIodmFsdWVbMF0pLCBjZS5udW1iZXIodmFsdWVbMV0pXSxcbiAgICAgIHsgLi4ubWV0YWRhdGEgfVxuICAgICk7XG4gIH1cbiAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgbnVtID0gXCJOYU5cIjtcbiAgZWxzZSBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpXG4gICAgbnVtID0gdmFsdWUgPiAwID8gXCIrSW5maW5pdHlcIiA6IFwiLUluZmluaXR5XCI7XG4gIGVsc2Uge1xuICAgIGlmIChzaG9ydGhhbmRBbGxvd2VkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIG51bSA9IHJlcGVhdGluZ0RlY2ltYWxzKGNlLCB2YWx1ZS50b1N0cmluZygpKTtcbiAgfVxuICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgbWV0YWRhdGEubGF0ZXggPSBtZXRhZGF0YS5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBudW0gfSk7XG4gIHJldHVybiBtZXRhZGF0YS5sYXRleCAhPT0gdm9pZCAwID8geyBudW0sIGxhdGV4OiBtZXRhZGF0YS5sYXRleCB9IDogeyBudW0gfTtcbn1cbmZ1bmN0aW9uIF9lc2NhcGVKc29uU3RyaW5nKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiByZXBlYXRpbmdEZWNpbWFscyhjZSwgcykge1xuICBpZiAoIWNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5yZXBlYXRpbmdEZWNpbWFscylcbiAgICByZXR1cm4gcztcbiAgbGV0IFtfLCB3aG9sZXBhcnQsIGZyYWN0aW9uYWxQYXJ0LCBleHBvbmVudF0gPSBzLm1hdGNoKC9eKC4qKVxcLihbMC05XSspKFtlfEVdWy0rXT9bMC05XSspPyQvKSA/PyBbXTtcbiAgaWYgKCFmcmFjdGlvbmFsUGFydClcbiAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsYXN0RGlnaXQgPSBmcmFjdGlvbmFsUGFydFtmcmFjdGlvbmFsUGFydC5sZW5ndGggLSAxXTtcbiAgZnJhY3Rpb25hbFBhcnQgPSBmcmFjdGlvbmFsUGFydC5zbGljZSgwLCAtMSk7XG4gIGNvbnN0IE1BWF9SRVBFQVRJTkdfUEFUVEVSTl9MRU5HVEggPSAxNjtcbiAgbGV0IHByZWZpeCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhY3Rpb25hbFBhcnQubGVuZ3RoIC0gTUFYX1JFUEVBVElOR19QQVRURVJOX0xFTkdUSDsgaSsrKSB7XG4gICAgcHJlZml4ID0gZnJhY3Rpb25hbFBhcnQuc3Vic3RyaW5nKDAsIGkpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDw9IE1BWF9SRVBFQVRJTkdfUEFUVEVSTl9MRU5HVEg7IGorKykge1xuICAgICAgY29uc3QgcmVwZXRlbmQgPSBmcmFjdGlvbmFsUGFydC5zdWJzdHJpbmcoaSwgaSArIGogKyAxKTtcbiAgICAgIGNvbnN0IHRpbWVzID0gTWF0aC5mbG9vcihcbiAgICAgICAgKGZyYWN0aW9uYWxQYXJ0Lmxlbmd0aCAtIHByZWZpeC5sZW5ndGgpIC8gcmVwZXRlbmQubGVuZ3RoXG4gICAgICApO1xuICAgICAgaWYgKHRpbWVzIDwgMylcbiAgICAgICAgYnJlYWs7XG4gICAgICBpZiAoKHByZWZpeCArIHJlcGV0ZW5kLnJlcGVhdCh0aW1lcyArIDEpKS5zdGFydHNXaXRoKGZyYWN0aW9uYWxQYXJ0KSkge1xuICAgICAgICBpZiAocmVwZXRlbmQgPT09IFwiMFwiKSB7XG4gICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gXCIwXCIpXG4gICAgICAgICAgICByZXR1cm4gd2hvbGVwYXJ0ICsgXCIuXCIgKyBwcmVmaXggKyAoZXhwb25lbnQgPz8gXCJcIik7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdob2xlcGFydCArIFwiLlwiICsgcHJlZml4ICsgXCIoXCIgKyByZXBldGVuZCArIFwiKVwiICsgKGV4cG9uZW50ID8/IFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmcmFjdGlvbmFsUGFydCArPSBsYXN0RGlnaXQ7XG4gIHdoaWxlIChmcmFjdGlvbmFsUGFydC5lbmRzV2l0aChcIjBcIikpXG4gICAgZnJhY3Rpb25hbFBhcnQgPSBmcmFjdGlvbmFsUGFydC5zbGljZSgwLCAtMSk7XG4gIGlmIChleHBvbmVudClcbiAgICByZXR1cm4gYCR7d2hvbGVwYXJ0fS4ke2ZyYWN0aW9uYWxQYXJ0fSR7ZXhwb25lbnQudG9Mb3dlckNhc2UoKX1gO1xuICByZXR1cm4gYCR7d2hvbGVwYXJ0fS4ke2ZyYWN0aW9uYWxQYXJ0fWA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveGVkLWRvbWFpbi50c1xudmFyIF9Cb3hlZERvbWFpbiA9IGNsYXNzIF9fQm94ZWREb21haW4gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBkb20sIG1ldGFkYXRhKSB7XG4gICAgc3VwZXIoY2UsIG1ldGFkYXRhKTtcbiAgICB0aGlzLl92YWx1ZSA9IG1ha2VDYW5vbmljYWwoY2UsIGRvbSk7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKiBCb3hlZCBkb21haW5zIGFyZSBhbHdheXMgY2Fub25pY2FsLiAqL1xuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmN0b3IgIT09IFwiSW52YWxpZERvbWFpblwiO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIHJldHVybiBbXCJEb21haW5cIiwgc2VyaWFsaXplKHRoaXMuZW5naW5lLCB0aGlzLl92YWx1ZSldO1xuICB9XG4gIGdldCBsaXRlcmFsKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0IGN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVswXTtcbiAgfVxuICBnZXQgZG9tYWluQXJncygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnNsaWNlKDEpO1xuICB9XG4gIGdldCBkb21haW5BcmcxKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVbMV07XG4gIH1cbiAgZ2V0IGNvZG9tYWluKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKHRoaXMuX3ZhbHVlW3RoaXMuX3ZhbHVlLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBnZXQgaGFzaCgpIHtcbiAgICBpZiAodGhpcy5faGFzaCA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5faGFzaCA9IGhhc2hDb2RlKGhhc2godGhpcy5fdmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgfVxuICBpc0VxdWFsKHJocykge1xuICAgIHJldHVybiBpc0VxdWFsKHRoaXMuX3ZhbHVlLCByaHMpO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLl92YWx1ZSwgcmhzKTtcbiAgfVxuICBpcyhyaHMpIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLl92YWx1ZSwgcmhzKTtcbiAgfVxuICBpc0NvbXBhdGlibGUoZG9tLCBjb21wYXRpYmlsaXR5ID0gXCJjb3ZhcmlhbnRcIikge1xuICAgIGNvbnN0IGxocyA9IHRoaXMuX3ZhbHVlO1xuICAgIGNvbnN0IHJocyA9IGRvbSBpbnN0YW5jZW9mIF9fQm94ZWREb21haW4gPyBkb20uX3ZhbHVlIDogZG9tO1xuICAgIGNvbnN0IHJoc0N0b3IgPSBBcnJheS5pc0FycmF5KHJocykgPyByaHNbMF0gOiBudWxsO1xuICAgIGlmIChyaHNDdG9yKSB7XG4gICAgICBjb25zdCByaHNQYXJhbSA9IHJoc1sxXTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkNvdmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEobGhzLCByaHNQYXJhbSk7XG4gICAgICBpZiAocmhzQ3RvciA9PT0gXCJDb250cmF2YXJpYW50XCIpXG4gICAgICAgIHJldHVybiBpc1N1YmRvbWFpbk9mMShyaHNQYXJhbSwgbGhzKTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkludmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gIWlzU3ViZG9tYWluT2YxKHJoc1BhcmFtLCBsaHMpICYmICFpc1N1YmRvbWFpbk9mMShsaHMsIHJoc1BhcmFtKTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkJpdmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEobGhzLCByaHNQYXJhbSkgJiYgaXNTdWJkb21haW5PZjEocmhzUGFyYW0sIGxocyk7XG4gICAgfVxuICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBcImNvdmFyaWFudFwiKVxuICAgICAgcmV0dXJuIGlzU3ViZG9tYWluT2YxKGxocywgcmhzKTtcbiAgICBpZiAoY29tcGF0aWJpbGl0eSA9PT0gXCJjb250cmF2YXJpYW50XCIpXG4gICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEocmhzLCBsaHMpO1xuICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBcImJpdmFyaWFudFwiKVxuICAgICAgcmV0dXJuIGlzU3ViZG9tYWluT2YxKHJocywgbGhzKSAmJiBpc1N1YmRvbWFpbk9mMShsaHMsIHJocyk7XG4gICAgcmV0dXJuICFpc1N1YmRvbWFpbk9mMShyaHMsIGxocykgJiYgIWlzU3ViZG9tYWluT2YxKGxocywgcmhzKTtcbiAgfVxuICBtYXRjaChyaHMsIF9vcHRpb25zKSB7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX19Cb3hlZERvbWFpbikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc1NhbWUocmhzKSlcbiAgICAgIHJldHVybiB7fTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgaGVhZCgpIHtcbiAgICByZXR1cm4gXCJEb21haW5cIjtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5kb21haW4oXCJEb21haW5cIik7XG4gIH1cbiAgZ2V0IGlzTm90aGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPT09IFwiTm90aGluZ1wiO1xuICB9XG4gIGdldCBpc0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmN0b3IgPT09IFwiRnVuY3Rpb25cIiB8fCB0aGlzLl92YWx1ZSA9PT0gXCJGdW5jdGlvblwiO1xuICB9XG4gIC8vIGdldCBpc1ByZWRpY2F0ZSgpOiBib29sZWFuIHtcbiAgLy8gICBpZiAodGhpcy5kb21haW5MaXRlcmFsID09PSAnUHJlZGljYXRlJykgcmV0dXJuIHRydWU7XG4gIC8vICAgaWYgKHRoaXMuZG9tYWluQ29uc3RydWN0b3IgIT09ICdGdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgLy8gICBjb25zdCByZXN1bHREb21haW4gPSB0aGlzLl92YWx1ZVt0aGlzLl92YWx1ZS5sZW5ndGhdO1xuICAvLyAgIGlmICghKHJlc3VsdERvbWFpbiBpbnN0YW5jZW9mIF9Eb21haW4pKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHJlc3VsdERvbWFpbi5pc0Jvb2xlYW47XG4gIC8vIH1cbiAgLy8gZ2V0IGlzTnVtZXJpY0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdOdW1lcmljRnVuY3Rpb24nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gICBpZiAodGhpcy5kb21haW5Db25zdHJ1Y3RvciAhPT0gJ0Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAvLyAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuZG9tYWluUGFyYW1zISlcbiAgLy8gICAgIGlmICghaXNOdW1lcmljU3ViZG9tYWluKGFyZywgJ051bWJlcicpKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHRydWU7XG4gIC8vIH1cbiAgLy8gZ2V0IGlzQm9vbGVhbigpOiBib29sZWFuIHtcbiAgLy8gICBjb25zdCBkb20gPSB0aGlzLmRvbWFpbkxpdGVyYWw7XG4gIC8vICAgcmV0dXJuIGRvbSA9PT0gJ0Jvb2xlYW4nIHx8IGRvbSA9PT0gJ01heWJlQm9vbGVhbic7XG4gIC8vIH1cbiAgLy8gZ2V0IGlzUmVhbEZ1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdSZWFsRnVuY3Rpb24nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gICBpZiAodGhpcy5kb21haW5Db25zdHJ1Y3RvciAhPT0gJ0Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAvLyAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuZG9tYWluUGFyYW1zISlcbiAgLy8gICAgIGlmICghaXNOdW1lcmljU3ViZG9tYWluKGFyZywgJ0V4dGVuZGVkUmVhbE51bWJlcicpKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHRydWU7XG4gIC8vIH1cbiAgZ2V0IGlzTnVtZXJpYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbXBhdGlibGUodGhpcy5lbmdpbmUuZG9tYWluKFwiTnVtYmVyXCIpKTtcbiAgfVxuICAvLyBnZXQgaXNMb2dpY09wZXJhdG9yKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdMb2dpY09wZXJhdG9yJykgcmV0dXJuIHRydWU7XG4gIC8vICAgaWYgKCF0aGlzLmNvZG9tYWluPy5pc0Jvb2xlYW4pIHJldHVybiBmYWxzZTtcbiAgLy8gICBjb25zdCBwYXJhbXMgPSB0aGlzLmRvbWFpblBhcmFtcyE7XG4gIC8vICAgaWYgKHBhcmFtcy5sZW5ndGggPCAxIHx8IHBhcmFtcy5sZW5ndGggPiAyKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgaWYgKCFwYXJhbXNbMF0uaXNCb29sZWFuKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlO1xuICAvLyAgIGlmICghcGFyYW1zWzFdLmlzQm9vbGVhbikgcmV0dXJuIGZhbHNlO1xuICAvLyAgIHJldHVybiB0cnVlO1xuICAvLyB9XG4gIGdldCBpc1JlbGF0aW9uYWxPcGVyYXRvcigpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgPT09IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5jdG9yICE9PSBcIkZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZG9tYWluQXJncy5sZW5ndGggIT09IDIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmNvZG9tYWluLmlzQ29tcGF0aWJsZShcIk1heWJlQm9vbGVhblwiKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbmZ1bmN0aW9uIGJveERvbWFpbihjZSwgZG9tLCBtZXRhZGF0YSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkb20pICYmIGRvbVswXSA9PT0gXCJEb21haW5cIilcbiAgICBkb20gPSBkb21bMV07XG4gIGlmIChkb20gaW5zdGFuY2VvZiBfQm94ZWREb21haW4pXG4gICAgcmV0dXJuIGRvbTtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIGRvbSA9IGRvbS5qc29uO1xuICBpZiAodHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGV4cHIgPSBET01BSU5fQUxJQVNbZG9tXTtcbiAgICBpZiAoZXhwcilcbiAgICAgIHJldHVybiBib3hEb21haW4oY2UsIGV4cHIpO1xuICAgIGlmICghaXNEb21haW5MaXRlcmFsKGRvbSkpXG4gICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgZG9tYWluIGxpdGVyYWwsIGdvdCBcIiArIGRvbSk7XG4gICAgcmV0dXJuIG5ldyBfQm94ZWREb21haW4oY2UsIGRvbSwgbWV0YWRhdGEpO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShkb20pIHx8IGRvbS5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBhIHZhbGlkIGRvbWFpblwiKTtcbiAgY29uc3QgY29uc3RydWN0b3IgPSBkb21bMF07XG4gIGlmICghRE9NQUlOX0NPTlNUUlVDVE9SUy5pbmNsdWRlcyhjb25zdHJ1Y3RvcikpXG4gICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBkb21haW4gY29uc3RydWN0b3IsIGdvdCBcIiArIGNvbnN0cnVjdG9yKTtcbiAgcmV0dXJuIG5ldyBfQm94ZWREb21haW4oY2UsIGRvbSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gbWFrZUNhbm9uaWNhbChjZSwgZG9tKSB7XG4gIGlmIChkb20gPT09IHZvaWQgMCB8fCB0eXBlb2YgZG9tID09PSBcIm51bWJlclwiKVxuICAgIHRocm93IEVycm9yKFwiRXhwZWN0ZWQgYSBkb21haW4gZXhwcmVzc2lvblwiKTtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIF9Cb3hlZERvbWFpbilcbiAgICByZXR1cm4gZG9tLl92YWx1ZTtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIWlzRG9tYWluTGl0ZXJhbChkb20pKVxuICAgICAgdGhyb3cgRXJyb3IoXCJVbmtub3duIGRvbWFpbiBsaXRlcmFsXCIpO1xuICAgIHJldHVybiBkb207XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KGRvbSkgJiYgdHlwZW9mIGRvbSA9PT0gXCJvYmplY3RcIilcbiAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgZG9tYWluIGV4cHJlc3Npb25cIik7XG4gIGlmICghZG9tKVxuICAgIDtcbiAgY29uc3QgY3RvciA9IGRvbVswXTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGN0b3IpO1xuICBpZiAoY3RvciA9PT0gXCJSYW5nZVwiKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gXCJJbnRlZ2VyXCI7XG4gICAgbGV0IGZpcnN0ID0gMTtcbiAgICBsZXQgbGFzdCA9IEluZmluaXR5O1xuICAgIGlmIChkb20ubGVuZ3RoID09PSAyKSB7XG4gICAgICBsYXN0ID0gZG9tWzFdO1xuICAgIH0gZWxzZSBpZiAoZG9tLmxlbmd0aCA9PT0gMykge1xuICAgICAgZmlyc3QgPSBkb21bMV07XG4gICAgICBsYXN0ID0gZG9tWzJdO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdE51bSA9IGFzUmFuZ2VCb3VuZChjZSwgZmlyc3QpO1xuICAgIGNvbnN0IGxhc3ROdW0gPSBhc1JhbmdlQm91bmQoY2UsIGxhc3QpO1xuICAgIGlmIChmaXJzdE51bSA9PT0gbnVsbCB8fCBsYXN0TnVtID09PSBudWxsKVxuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcmFuZ2UgWyR7Zmlyc3ROdW19LCAke2xhc3ROdW19XSBgKTtcbiAgICBpZiAobGFzdE51bSA8IGZpcnN0TnVtKVxuICAgICAgW2ZpcnN0LCBsYXN0XSA9IFtsYXN0LCBmaXJzdF07XG4gICAgaWYgKGZpcnN0TnVtID09PSAtSW5maW5pdHkgJiYgbGFzdE51bSA9PT0gSW5maW5pdHkpXG4gICAgICByZXR1cm4gXCJJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAxICYmIGxhc3ROdW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAwICYmIGxhc3ROdW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAtSW5maW5pdHkgJiYgbGFzdE51bSA9PT0gLTEpXG4gICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICBpZiAoZmlyc3ROdW0gPT09IC1JbmZpbml0eSAmJiBsYXN0TnVtID09PSAwKVxuICAgICAgcmV0dXJuIFwiTm9uUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFtcIlJhbmdlXCIsIGNlLm51bWJlcihmaXJzdE51bSksIGNlLm51bWJlcihsYXN0TnVtKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiSW50ZXJ2YWxcIikge1xuICAgIGlmIChkb20ubGVuZ3RoICE9PSAzKVxuICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIHJhbmdlIFwiICsgZG9tKTtcbiAgICBsZXQgW2lzTGVmdE9wZW4sIGZpcnN0XSA9IG1heWJlT3BlbihjZSwgZG9tWzFdKTtcbiAgICBsZXQgW2lzUmlnaHRPcGVuLCBsYXN0XSA9IG1heWJlT3BlbihjZSwgZG9tWzJdKTtcbiAgICBpZiAoZmlyc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gbnVsbClcbiAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCByYW5nZSBcIiArIGRvbSk7XG4gICAgaWYgKGxhc3QgPCBmaXJzdCkge1xuICAgICAgW2ZpcnN0LCBsYXN0XSA9IFtsYXN0LCBmaXJzdF07XG4gICAgICBbaXNMZWZ0T3BlbiwgaXNSaWdodE9wZW5dID0gW2lzUmlnaHRPcGVuLCBpc0xlZnRPcGVuXTtcbiAgICB9XG4gICAgaWYgKGZpcnN0ID09PSAwICYmIGxhc3QgPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIGlzTGVmdE9wZW4gPyBcIlBvc2l0aXZlTnVtYmVyXCIgOiBcIk5vbk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgaWYgKGZpcnN0ID09PSAtSW5maW5pdHkgJiYgbGFzdCA9PT0gMClcbiAgICAgIHJldHVybiBpc1JpZ2h0T3BlbiA/IFwiTmVnYXRpdmVOdW1iZXJcIiA6IFwiTm9uUG9zaXRpdmVOdW1iZXJcIjtcbiAgICByZXR1cm4gW1xuICAgICAgXCJJbnRlcnZhbFwiLFxuICAgICAgaXNMZWZ0T3BlbiA/IFtcIk9wZW5cIiwgY2UubnVtYmVyKGZpcnN0KV0gOiBjZS5udW1iZXIoZmlyc3QpLFxuICAgICAgaXNSaWdodE9wZW4gPyBbXCJPcGVuXCIsIGNlLm51bWJlcihsYXN0KV0gOiBjZS5udW1iZXIobGFzdClcbiAgICBdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgLi4uZG9tLnNsaWNlKDEpLm1hcCgoeCkgPT4gbWFrZUNhbm9uaWNhbChjZSwgeCkpXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJEaWN0aW9uYXJ5XCIpIHtcbiAgICByZXR1cm4gW1wiRGljdGlvbmFyeVwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJMaXN0XCIpIHtcbiAgICByZXR1cm4gW1wiTGlzdFwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJUdXBsZVwiKSB7XG4gICAgcmV0dXJuIFtcIlR1cGxlXCIsIC4uLmRvbS5zbGljZSgxKS5tYXAoKHgpID0+IG1ha2VDYW5vbmljYWwoY2UsIHgpKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiVW5pb25cIikge1xuICAgIHJldHVybiBbXCJVbmlvblwiLCAuLi5kb20uc2xpY2UoMSkubWFwKCh4KSA9PiBtYWtlQ2Fub25pY2FsKGNlLCB4KSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkludGVyc2VjdGlvblwiKSB7XG4gICAgcmV0dXJuIFtcIkludGVyc2VjdGlvblwiLCAuLi5kb20uc2xpY2UoMSkubWFwKCh4KSA9PiBtYWtlQ2Fub25pY2FsKGNlLCB4KSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkNvdmFyaWFudFwiIHx8IGN0b3IgPT09IFwiQ29udHJhdmFyaWFudFwiIHx8IGN0b3IgPT09IFwiSW52YXJpYW50XCIpIHtcbiAgICByZXR1cm4gW2N0b3IsIG1ha2VDYW5vbmljYWwoY2UsIGRvbVsxXSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIk1heWJlXCIpIHtcbiAgICByZXR1cm4gW1wiTWF5YmVcIiwgbWFrZUNhbm9uaWNhbChjZSwgZG9tWzFdKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiU2VxdWVuY2VcIikge1xuICAgIHJldHVybiBbXCJTZXF1ZW5jZVwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJIZWFkXCIpIHtcbiAgICByZXR1cm4gW1wiSGVhZFwiLCBkb21bMV1dO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlN5bWJvbFwiKSB7XG4gICAgcmV0dXJuIFtcIlN5bWJvbFwiLCBkb21bMV1dO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlZhbHVlXCIpIHtcbiAgICByZXR1cm4gW1wiVmFsdWVcIiwgY2UuYm94KGRvbVsxXSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkludmFsaWREb21haW5cIikge1xuICAgIHJldHVybiBbXCJJbnZhbGlkRG9tYWluXCIsIGRvbVsxXV07XG4gIH1cbiAgdGhyb3cgRXJyb3IoXCJVbmV4cGVjdGVkIGRvbWFpbiBjb25zdHJ1Y3RvciBcIiArIGN0b3IpO1xufVxuZnVuY3Rpb24gYXNSYW5nZUJvdW5kKGNlLCBleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gZXhwcjtcbiAgY29uc3QgeCA9IGNlLmJveChleHByKS5ldmFsdWF0ZSgpO1xuICByZXR1cm4geC5pc0luZmluaXR5ID8geC5pc1Bvc2l0aXZlID8gSW5maW5pdHkgOiAtSW5maW5pdHkgOiBhc1NtYWxsSW50ZWdlcih4KTtcbn1cbmZ1bmN0aW9uIG1heWJlT3BlbihjZSwgZXhwcikge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSAmJiBleHByWzBdID09PSBcIk9wZW5cIilcbiAgICByZXR1cm4gW3RydWUsIGFzUmFuZ2VCb3VuZChjZSwgZXhwclsxXSldO1xuICByZXR1cm4gW2ZhbHNlLCBhc1JhbmdlQm91bmQoY2UsIGV4cHIpXTtcbn1cbmZ1bmN0aW9uIGlzRG9tYWluKGV4cHIpIHtcbiAgaWYgKGV4cHIgaW5zdGFuY2VvZiBfQm94ZWREb21haW4pXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChleHByIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pXG4gICAgZXhwciA9IGV4cHIuanNvbjtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBpc0RvbWFpbkxpdGVyYWwoZXhwcik7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgaWYgKGV4cHIubGVuZ3RoIDw9IDEpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY3RvciA9IGV4cHJbMF07XG4gICAgaWYgKHR5cGVvZiBjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFET01BSU5fQ09OU1RSVUNUT1JTLmluY2x1ZGVzKGN0b3IpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdG9yID09PSBcIkludmFsaWREb21haW5cIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3RvciA9PT0gXCJMaXN0XCIpXG4gICAgICByZXR1cm4gZXhwci5sZW5ndGggPT09IDIgJiYgaXNWYWxpZERvbWFpbihleHByWzFdKTtcbiAgICBpZiAoY3RvciA9PT0gXCJUdXBsZVwiIHx8IGN0b3IgPT09IFwiRnVuY3Rpb25cIiB8fCBjdG9yID09PSBcIk1heWJlXCIgfHwgY3RvciA9PT0gXCJTZXF1ZW5jZVwiIHx8IGN0b3IgPT09IFwiSW50ZXJzZWN0aW9uXCIgfHwgY3RvciA9PT0gXCJVbmlvblwiKVxuICAgICAgcmV0dXJuIGV4cHIuc2xpY2UoMSwgLTEpLmV2ZXJ5KCh4KSA9PiBpc1ZhbGlkRG9tYWluKHgpKTtcbiAgICByZXR1cm4gZXhwci5ldmVyeSgoeCkgPT4geCAhPT0gbnVsbCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNWYWxpZERvbWFpbihleHByKSB7XG4gIGlmIChleHByIGluc3RhbmNlb2YgX0JveGVkRG9tYWluKVxuICAgIHJldHVybiBleHByLmlzVmFsaWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpICYmIGV4cHJbMF0gPT09IFwiSW52YWxpZERvbWFpblwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzRG9tYWluKGV4cHIpO1xufVxuZnVuY3Rpb24gaXNTdWJkb21haW5PZjEobGhzLCByaHMpIHtcbiAgY29uc3QgW3Jlc3VsdCwgcmVzdF0gPSBpc1N1YmRvbWFpbk9mKFtsaHNdLCByaHMpO1xuICBpZiAocmVzdWx0ICYmIHJlc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1N1YmRvbWFpbk9mKHhsaHMsIHJocykge1xuICBsZXQgbGhzID0geGxocy5zaGlmdCgpO1xuICBjb25zdCByaHNMaXRlcmFsID0gdHlwZW9mIHJocyA9PT0gXCJzdHJpbmdcIiA/IHJocyA6IG51bGw7XG4gIGlmIChyaHNMaXRlcmFsID09PSBcIkFueXRoaW5nXCIpXG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgY29uc3QgbGhzTGl0ZXJhbCA9IHR5cGVvZiBsaHMgPT09IFwic3RyaW5nXCIgPyBsaHMgOiBudWxsO1xuICBpZiAobGhzTGl0ZXJhbCAmJiByaHNMaXRlcmFsKSB7XG4gICAgaWYgKGxoc0xpdGVyYWwgPT09IHJoc0xpdGVyYWwpXG4gICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgIHJldHVybiBbYW5jZXN0b3JzKGxoc0xpdGVyYWwpLmluY2x1ZGVzKHJoc0xpdGVyYWwpLCB4bGhzXTtcbiAgfVxuICBpZiAocmhzTGl0ZXJhbCkge1xuICAgIGlmICghbGhzKVxuICAgICAgO1xuICAgIGNvbnN0IGxoc0NvbnN0cnVjdG9yID0gbGhzWzBdO1xuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJGdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIFtyaHNMaXRlcmFsID09PSBcIkZ1bmN0aW9uXCIsIHhsaHNdO1xuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJEaWN0aW9uYXJ5XCIpXG4gICAgICByZXR1cm4gW3Joc0xpdGVyYWwgPT09IFwiRGljdGlvbmFyeVwiLCB4bGhzXTtcbiAgICBpZiAobGhzQ29uc3RydWN0b3IgPT09IFwiTGlzdFwiKVxuICAgICAgcmV0dXJuIFtyaHNMaXRlcmFsID09PSBcIkxpc3RcIiwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIlR1cGxlXCIpXG4gICAgICByZXR1cm4gW3Joc0xpdGVyYWwgPT09IFwiVHVwbGVcIiwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIkludGVyc2VjdGlvblwiKSB7XG4gICAgfVxuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJJbnRlcnZhbFwiKVxuICAgICAgcmV0dXJuIFtpc1N1YmRvbWFpbk9mMShcIkV4dGVuZGVkUmVhbE51bWJlclwiLCByaHNMaXRlcmFsKSwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIlJhbmdlXCIpXG4gICAgICByZXR1cm4gW2lzU3ViZG9tYWluT2YxKFwiSW50ZWdlclwiLCByaHNMaXRlcmFsKSwgeGxoc107XG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgfVxuICBjb25zdCByaHNDb25zdHJ1Y3RvciA9IHJoc1swXTtcbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICBpZiAobGhzTGl0ZXJhbCA9PT0gXCJGdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgICBpZiAobGhzTGl0ZXJhbClcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGlmIChsaHNbMF0gIT09IFwiRnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGlmIChsaHMubGVuZ3RoID09PSAxICYmIHJocy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgIGlmICghaXNTdWJkb21haW5PZjEoXG4gICAgICBsaHNbbGhzLmxlbmd0aCAtIDFdLFxuICAgICAgcmhzW3Jocy5sZW5ndGggLSAxXVxuICAgICkpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBjb25zdCBsaHNQYXJhbXMgPSBsaHMuc2xpY2UoMSwgLTEpO1xuICAgIGxldCByaHNQYXJhbXMgPSByaHMuc2xpY2UoMSwgLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxoc1BhcmFtcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGlmIChyaHNQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGxoc0N0b3IgPSBBcnJheS5pc0FycmF5KGxoc1BhcmFtc1tpXSkgPyBsaHNQYXJhbXNbaV1bMF0gOiBudWxsO1xuICAgICAgICBpZiAobGhzQ3RvciAhPT0gXCJNYXliZVwiKVxuICAgICAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoMiA9IGZhbHNlO1xuICAgICAgICBbbWF0Y2gyLCByaHNQYXJhbXNdID0gaXNTdWJkb21haW5PZihyaHNQYXJhbXMsIGxoc1BhcmFtc1tpXSk7XG4gICAgICAgIGlmICghbWF0Y2gyKVxuICAgICAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Joc1BhcmFtcy5sZW5ndGggPT09IDAsIHhsaHNdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJJbnRlcnNlY3Rpb25cIikge1xuICAgIHJldHVybiBbXG4gICAgICByaHMuc2xpY2UoMSwgLTEpLmV2ZXJ5KFxuICAgICAgICAoeCkgPT4gaXNTdWJkb21haW5PZjEobGhzLCB4KVxuICAgICAgKSxcbiAgICAgIHhsaHNcbiAgICBdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJVbmlvblwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHJocy5zbGljZSgxLCAtMSkuc29tZSgoeCkgPT4gaXNTdWJkb21haW5PZjEobGhzLCB4KSksXG4gICAgICB4bGhzXG4gICAgXTtcbiAgfVxuICBpZiAocmhzQ29uc3RydWN0b3IgPT09IFwiTWF5YmVcIikge1xuICAgIGlmIChsaHNMaXRlcmFsID09PSBcIk5vdGhpbmdcIilcbiAgICAgIHJldHVybiBbdHJ1ZSwgeGxoc107XG4gICAgcmV0dXJuIGlzU3ViZG9tYWluT2YoXG4gICAgICBbbGhzLCAuLi54bGhzXSxcbiAgICAgIHJoc1sxXVxuICAgICk7XG4gIH1cbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIlNlcXVlbmNlXCIpIHtcbiAgICBjb25zdCBzZXEgPSByaHNbMV07XG4gICAgaWYgKCFpc1N1YmRvbWFpbk9mMShsaHMsIHNlcSkpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBsaHMgPSB4bGhzLnNoaWZ0KCk7XG4gICAgbGV0IG1hdGNoMiA9IHRydWU7XG4gICAgd2hpbGUgKHhsaHMubGVuZ3RoID4gMCAmJiBtYXRjaDIpIHtcbiAgICAgIFttYXRjaDIsIHhsaHNdID0gaXNTdWJkb21haW5PZih4bGhzLCBzZXEpO1xuICAgICAgbGhzID0geGxocy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJUdXBsZVwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxocykgfHwgbGhzWzBdICE9PSBcIlR1cGxlXCIpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBpZiAobGhzLmxlbmd0aCA+IHJocy5sZW5ndGgpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSByaHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBpZiAoIWxoc1tpXSB8fCAhaXNTdWJkb21haW5PZjEoXG4gICAgICAgIGxoc1tpXSxcbiAgICAgICAgcmhzW2ldXG4gICAgICApKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICB9XG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgfVxuICBpZiAocmhzQ29uc3RydWN0b3IgPT09IFwiUmFuZ2VcIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsaHMpIHx8IGxoc1swXSAhPT0gXCJSYW5nZVwiKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgeGxoc107XG4gICAgY29uc3QgbGhzTWluID0gYXNGbG9hdChsaHNbMV0pO1xuICAgIGNvbnN0IGxoc01heCA9IGFzRmxvYXQobGhzWzJdKTtcbiAgICBjb25zdCByaHNNaW4gPSBhc0Zsb2F0KHJoc1sxXSk7XG4gICAgY29uc3QgcmhzTWF4ID0gYXNGbG9hdChyaHNbMl0pO1xuICAgIHJldHVybiBbXG4gICAgICBsaHNNaW4gIT09IG51bGwgJiYgbGhzTWF4ICE9PSBudWxsICYmIHJoc01pbiAhPT0gbnVsbCAmJiByaHNNYXggIT09IG51bGwgJiYgbGhzTWluID49IHJoc01pbiAmJiBsaHNNYXggPD0gcmhzTWF4LFxuICAgICAgeGxoc1xuICAgIF07XG4gIH1cbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIkludGVydmFsXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGhzKSB8fCBsaHNbMF0gIT09IFwiSW50ZXJ2YWxcIilcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGNvbnN0IGxoc01pbiA9IGFzRmxvYXQobGhzWzFdKTtcbiAgICBjb25zdCBsaHNNYXggPSBhc0Zsb2F0KGxoc1syXSk7XG4gICAgY29uc3QgcmhzTWluID0gYXNGbG9hdChyaHNbMV0pO1xuICAgIGNvbnN0IHJoc01heCA9IGFzRmxvYXQocmhzWzJdKTtcbiAgICByZXR1cm4gW1xuICAgICAgbGhzTWluICE9PSBudWxsICYmIGxoc01heCAhPT0gbnVsbCAmJiByaHNNaW4gIT09IG51bGwgJiYgcmhzTWF4ICE9PSBudWxsICYmIGxoc01pbiA+PSByaHNNaW4gJiYgbGhzTWF4IDw9IHJoc01heCxcbiAgICAgIHhsaHNcbiAgICBdO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIGRvbWFpbiBjb25zdHJ1Y3RvciBcIiArIHJoc0NvbnN0cnVjdG9yKTtcbiAgcmV0dXJuIFtmYWxzZSwgeGxoc107XG59XG5mdW5jdGlvbiBzaGFyZWRBbmNlc3RvckRvbWFpbihhLCBiKSB7XG4gIGNvbnN0IGFMaXRlcmFsID0gZG9tYWluTGl0ZXJhbEFuY2VzdG9yKGEpO1xuICBjb25zdCBiTGl0ZXJhbCA9IGRvbWFpbkxpdGVyYWxBbmNlc3RvcihiKTtcbiAgY29uc3QgYUFuY2VzdG9ycyA9IFthTGl0ZXJhbCwgLi4uYW5jZXN0b3JzKGFMaXRlcmFsKV07XG4gIGNvbnN0IGJBbmNlc3RvcnMgPSBbYkxpdGVyYWwsIC4uLmFuY2VzdG9ycyhiTGl0ZXJhbCldO1xuICB3aGlsZSAoIWJBbmNlc3RvcnMuaW5jbHVkZXMoYUFuY2VzdG9yc1swXSkpXG4gICAgYUFuY2VzdG9ycy5zaGlmdCgpO1xuICByZXR1cm4gYS5lbmdpbmUuZG9tYWluKGFBbmNlc3RvcnNbMF0pO1xufVxuZnVuY3Rpb24gZG9tYWluTGl0ZXJhbEFuY2VzdG9yKGRvbSkge1xuICBsZXQgcmVzdWx0ID0gZG9tLmxpdGVyYWw7XG4gIGlmIChyZXN1bHQpXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgcmVzdWx0ID0gZG9tLmN0b3I7XG4gIGlmIChyZXN1bHQgPT09IFwiTWF5YmVcIilcbiAgICByZXR1cm4gXCJBbnl0aGluZ1wiO1xuICBpZiAocmVzdWx0ID09PSBcIkludGVydmFsXCIpXG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICBpZiAocmVzdWx0ID09PSBcIlJhbmdlXCIpXG4gICAgcmV0dXJuIFwiSW50ZWdlclwiO1xuICBpZiAocmVzdWx0ID09PSBcIkhlYWRcIilcbiAgICByZXR1cm4gXCJGdW5jdGlvblwiO1xuICBpZiAocmVzdWx0ID09PSBcIlVuaW9uXCIpXG4gICAgcmV0dXJuIFwiQW55dGhpbmdcIjtcbiAgaWYgKHJlc3VsdCA9PT0gXCJJbnRlcnNlY3Rpb25cIilcbiAgICByZXR1cm4gXCJBbnl0aGluZ1wiO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VyaWFsaXplKGNlLCBkb20pIHtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIHJldHVybiBkb20uanNvbjtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGRvbTtcbiAgaWYgKGRvbVswXSA9PT0gXCJJbnZhbGlkRG9tYWluXCIpIHtcbiAgICByZXR1cm4gW1wiSW52YWxpZERvbWFpblwiLCBzZXJpYWxpemUoY2UsIGRvbVsxXSldO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IFtzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBkb21bMF0pXTtcbiAgaWYgKGRvbS5sZW5ndGggPiAxKVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRvbS5sZW5ndGggLSAxOyBpKyspXG4gICAgICByZXN1bHQucHVzaChzZXJpYWxpemUoY2UsIGRvbVtpXSkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaGFzaChkb20pIHtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIFwiZG9tYWluOlwiICsgZG9tO1xuICBsZXQgcyA9IFwiZG9tYWluOlwiICsgdGhpcy5jdG9yO1xuICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmRvbWFpbkFyZ3MpXG4gICAgcyArPSBcIjpcIiArIGhhc2goYXJnKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBpc0VxdWFsKGxocywgcmhzKSB7XG4gIGlmICh0eXBlb2YgcmhzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSA9PT0gcmhzO1xuICBpZiAocmhzIGluc3RhbmNlb2YgX0JveGVkRG9tYWluKVxuICAgIHJldHVybiBpc0VxdWFsKGxocywgcmhzLl92YWx1ZSk7XG4gIGlmICh0eXBlb2YgbGhzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBsaHMgPT09IHJocztcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkobGhzKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShyaHMpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGxoc1swXSAhPT0gcmhzWzBdKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHJocy5sZW5ndGggIT09IGxocy5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgaWYgKGxoc1tpXSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKSB7XG4gICAgICBpZiAoIShyaHNbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghcmhzW2ldLmlzRXF1YWwocmhzW2ldKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxoc1tpXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHR5cGVvZiByaHNbaV0gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChsaHNbaV0gIT09IHJoc1tpXSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwobGhzW2ldLCByaHNbaV0pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi92YWxpZGF0ZS50c1xuZnVuY3Rpb24gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBvcHMyLCBjb3VudCkge1xuICBpZiAob3BzMi5sZW5ndGggPT09IGNvdW50KVxuICAgIHJldHVybiBvcHMyO1xuICBjb25zdCB4cyA9IFsuLi5vcHMyLnNsaWNlKDAsIGNvdW50KV07XG4gIGxldCBpID0gTWF0aC5taW4oY291bnQsIG9wczIubGVuZ3RoKTtcbiAgd2hpbGUgKGkgPCBjb3VudCkge1xuICAgIHhzLnB1c2goY2UuZXJyb3IoXCJtaXNzaW5nXCIpKTtcbiAgICBpICs9IDE7XG4gIH1cbiAgd2hpbGUgKGkgPCBvcHMyLmxlbmd0aCkge1xuICAgIHhzLnB1c2goY2UuZXJyb3IoXCJ1bmV4cGVjdGVkLWFyZ3VtZW50XCIsIG9wczJbaV0pKTtcbiAgICBpICs9IDE7XG4gIH1cbiAgcmV0dXJuIHhzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVOdW1lcmljQXJncyhjZSwgb3BzMiwgY291bnQpIHtcbiAgaWYgKCFjZS5zdHJpY3QpXG4gICAgcmV0dXJuIG9wczI7XG4gIGxldCB4cztcbiAgaWYgKGNvdW50ID09PSB2b2lkIDApXG4gICAgeHMgPSBvcHMyO1xuICBlbHNlIHtcbiAgICB4cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGgubWF4KGNvdW50IC0gMSwgb3BzMi5sZW5ndGggLSAxKTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IGNvdW50IC0gMSlcbiAgICAgICAgeHMucHVzaChjZS5lcnJvcihcInVuZXhwZWN0ZWQtYXJndW1lbnRcIiwgb3BzMltpXSkpO1xuICAgICAgZWxzZVxuICAgICAgICB4cy5wdXNoKG9wczJbaV0gIT09IHZvaWQgMCA/IGNlLmJveChvcHMyW2ldKSA6IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB4cy5tYXAoXG4gICAgKG9wMykgPT4gb3AzICYmICFvcDMuaXNWYWxpZCB8fCBvcDMuaXNOdW1iZXIgPyBvcDMgOiBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIFwiTnVtYmVyXCIsIG9wMy5kb21haW5dLCBvcDMpXG4gICk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVNpZ25hdHVyZShzaWcsIG9wczIsIGNvZG9tYWluKSB7XG4gIGNvbnN0IGNlID0gc2lnLmVuZ2luZTtcbiAgaWYgKCFjZS5zdHJpY3QpXG4gICAgcmV0dXJuIG9wczI7XG4gIGNvbnN0IG9wc0RvbWFpbiA9IG9wczIubWFwKCh4KSA9PiB4LmRvbWFpbik7XG4gIGNvbnN0IHRhcmdldFNpZyA9IGNlLmRvbWFpbihbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIC4uLm9wc0RvbWFpbixcbiAgICBjb2RvbWFpbiA/PyBcIkFueXRoaW5nXCJcbiAgXSk7XG4gIGlmIChzaWcuaXNDb21wYXRpYmxlKHRhcmdldFNpZykpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGV4cGVjdGVkQXJncyA9IHNpZy5kb21haW5BcmdzLnNsaWNlKDAsIC0xKTtcbiAgY29uc3QgY291bnQgPSBNYXRoLm1heChleHBlY3RlZEFyZ3MubGVuZ3RoLCBvcHNEb21haW4ubGVuZ3RoKTtcbiAgbGV0IG5ld09wcyA9IFtdO1xuICBsZXQgcmVzdCA9IFsuLi5vcHMyXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQgLSAxOyBpKyspXG4gICAgW25ld09wcywgcmVzdF0gPSB2YWxpZGF0ZU5leHRBcmd1bWVudChcbiAgICAgIGNlLFxuICAgICAgZXhwZWN0ZWRBcmdzW2ldLFxuICAgICAgbmV3T3BzLFxuICAgICAgcmVzdFxuICAgICk7XG4gIHdoaWxlIChuZXdPcHMubGVuZ3RoID4gMCAmJiBuZXdPcHNbbmV3T3BzLmxlbmd0aCAtIDFdLnN5bWJvbCA9PT0gXCJOb3RoaW5nXCIpXG4gICAgbmV3T3BzLnBvcCgpO1xuICByZXR1cm4gbmV3T3BzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBcmd1bWVudChjZSwgYXJnLCBkb20pIHtcbiAgaWYgKGRvbSA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBjZS5lcnJvcihcInVuZXhwZWN0ZWQtYXJndW1lbnRcIiwgYXJnKTtcbiAgaWYgKGFyZyA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBjZS5lcnJvcihcIm1pc3NpbmdcIik7XG4gIGlmICghYXJnLmlzVmFsaWQpXG4gICAgcmV0dXJuIGFyZztcbiAgaWYgKGFyZz8uZG9tYWluLmlzQ29tcGF0aWJsZShkb20pKVxuICAgIHJldHVybiBhcmc7XG4gIHJldHVybiBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIGRvbSwgYXJnLmRvbWFpbl0sIGFyZyk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU5leHRBcmd1bWVudChjZSwgZG9tLCBtYXRjaGVkLCBvcHMyKSB7XG4gIGxldCBuZXh0ID0gb3BzMi5zaGlmdCgpO1xuICBpZiAoZG9tID09PSB2b2lkIDApXG4gICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoXCJ1bmV4cGVjdGVkLWFyZ3VtZW50XCIsIG5leHQpXSwgb3BzMl07XG4gIGlmICghQXJyYXkuaXNBcnJheShkb20pKSB7XG4gICAgaWYgKCFuZXh0KVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoXCJtaXNzaW5nXCIpXSwgb3BzMl07XG4gICAgaWYgKCFuZXh0LmRvbWFpbi5pc0NvbXBhdGlibGUoZG9tKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgWy4uLm1hdGNoZWQsIGNlLmVycm9yKFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgZG9tLCBuZXh0LmRvbWFpbl0sIG5leHQpXSxcbiAgICAgICAgb3BzMlxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgbmV4dF0sIG9wczJdO1xuICB9XG4gIGNvbnN0IGN0b3IgPSBkb21bMF07XG4gIGlmIChuZXh0ID09PSB2b2lkIDApIHtcbiAgICBsZXQgdmFsaWQgPSBmYWxzZTtcbiAgICBpZiAoY3RvciA9PT0gXCJVbmlvblwiKSB7XG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8PSBkb20ubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgIGlmIChkb21ba10gPT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdG9yID09PSBcIk1heWJlXCIpXG4gICAgICB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHZhbGlkKVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2Uuc3ltYm9sKFwiTm90aGluZ1wiKV0sIG9wczJdO1xuICAgIHJldHVybiBbWy4uLm1hdGNoZWQsIGNlLmVycm9yKFwibWlzc2luZ1wiKV0sIG9wczJdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlVuaW9uXCIpIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBrID0gMTsgayA8PSBkb20ubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICBpZiAobmV4dC5kb21haW4uaXNDb21wYXRpYmxlKGRvbVtrXSkpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvdW5kKVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgbmV4dF0sIG9wczJdO1xuICAgIHJldHVybiBbXG4gICAgICBbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBkb20sIG5leHQuZG9tYWluXSwgbmV4dCldLFxuICAgICAgb3BzMlxuICAgIF07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiU2VxdWVuY2VcIikge1xuICAgIGNvbnN0IHNlcSA9IGRvbVsxXTtcbiAgICBpZiAoIW5leHQgfHwgIW5leHQuZG9tYWluLmlzQ29tcGF0aWJsZShzZXEpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBzZXEsIG5leHQuZG9tYWluXSwgbmV4dCldLFxuICAgICAgICBvcHMyXG4gICAgICBdO1xuICAgIH1cbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5tYXRjaGVkLCBuZXh0XTtcbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgIG5leHQgPSBvcHMyLnNoaWZ0KCk7XG4gICAgICBpZiAoIW5leHQpXG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgIGVsc2UgaWYgKCFuZXh0LmRvbWFpbi5pc0NvbXBhdGlibGUoc2VxKSkge1xuICAgICAgICBvcHMyLnVuc2hpZnQobmV4dCk7XG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXN1bHQucHVzaChuZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIG9wczJdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIk1heWJlXCIpIHtcbiAgICBpZiAobmV4dCA9PT0gdm9pZCAwIHx8IG5leHQuc3ltYm9sID09PSBcIk5vdGhpbmdcIilcbiAgICAgIHJldHVybiBbWy4uLm1hdGNoZWQsIGNlLnN5bWJvbChcIk5vdGhpbmdcIildLCBvcHMyXTtcbiAgICByZXR1cm4gdmFsaWRhdGVOZXh0QXJndW1lbnQoY2UsIGRvbVsxXSwgbWF0Y2hlZCwgW25leHQsIC4uLm9wczJdKTtcbiAgfVxuICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIGN0b3JcIiwgY3Rvcik7XG4gIHJldHVybiBbWy4uLm1hdGNoZWQsIG5leHRdLCBvcHMyXTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQXJndW1lbnRzKGNlLCBhcmdzLCBkb21zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gZG9tcy5sZW5ndGggJiYgYXJncy5ldmVyeSgoeCwgaSkgPT4geC5kb21haW4uaXNDb21wYXRpYmxlKGRvbXNbaV0pKSlcbiAgICByZXR1cm4gYXJncztcbiAgY29uc3QgeHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG9tcy5sZW5ndGggLSAxOyBpKyspXG4gICAgeHMucHVzaCh2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzW2ldLCBkb21zW2ldKSk7XG4gIGZvciAobGV0IGkgPSBkb21zLmxlbmd0aDsgaSA8PSBhcmdzLmxlbmd0aCAtIDE7IGkrKylcbiAgICB4cy5wdXNoKGNlLmVycm9yKFwidW5leHBlY3RlZC1hcmd1bWVudFwiLCBhcmdzW2ldKSk7XG4gIHJldHVybiB4cztcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy1hZGQudHNcbmZ1bmN0aW9uIGNhbm9uaWNhbEFkZChjZSwgb3BzMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQob3BzMi5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkpO1xuICBvcHMyID0gb3BzMi5maWx0ZXIoKHgpID0+IHgubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICF4LmlzWmVybyk7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gY2UubnVtYmVyKDApO1xuICBpZiAob3BzMi5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuIG9wczJbMF07XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMikge1xuICAgIGxldCBpbSA9IDA7XG4gICAgbGV0IHJlID0gMDtcbiAgICByZSA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgaWYgKHJlICE9PSBudWxsICYmIHJlICE9PSAwKVxuICAgICAgaW0gPSBnZXRJbWFnaW5hcnlDb2VmKG9wczJbMV0pO1xuICAgIGVsc2Uge1xuICAgICAgaW0gPSBnZXRJbWFnaW5hcnlDb2VmKG9wczJbMF0pO1xuICAgICAgaWYgKGltICE9PSAwICYmIG9wczJbMV0ubnVtZXJpY1ZhbHVlICE9PSBudWxsKVxuICAgICAgICByZSA9IGFzRmxvYXQob3BzMlsxXSk7XG4gICAgfVxuICAgIGlmIChyZSAhPT0gbnVsbCAmJiBpbSAhPT0gbnVsbCAmJiBpbSAhPT0gMClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChyZSwgaW0pKTtcbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPiAxKVxuICAgIG9wczIgPSBzb3J0QWRkKGNlLCBvcHMyKTtcbiAgcmV0dXJuIGNlLl9mbihcIkFkZFwiLCBvcHMyKTtcbn1cbmZ1bmN0aW9uIGRvbWFpbkFkZChfY2UsIGFyZ3MpIHtcbiAgbGV0IGRvbSA9IG51bGw7XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoIWFyZy5pc051bWVyaWMpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIWRvbSlcbiAgICAgIGRvbSA9IGFyZztcbiAgICBlbHNlXG4gICAgICBkb20gPSBzaGFyZWRBbmNlc3RvckRvbWFpbihkb20sIGFyZyk7XG4gIH1cbiAgcmV0dXJuIGRvbTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5QWRkKGNlLCBhcmdzKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChhcmdzLmxlbmd0aCA+IDEsIGBzaW1wbGlmeUFkZDogbm90IGVub3VnaCBhcmdzYCk7XG4gIGNvbnN0IHN1bTIgPSBuZXcgU3VtKGNlKTtcbiAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcbiAgICBhcmcgPSBhcmcuc2ltcGxpZnkoKTtcbiAgICBpZiAoYXJnLmlzSW1hZ2luYXJ5ICYmIGFyZy5pc0luZmluaXR5KVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkNvbXBsZXhJbmZpbml0eVwiKTtcbiAgICBpZiAoYXJnLmlzTmFOIHx8IGFyZy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoIWFyZy5pc1plcm8pXG4gICAgICBzdW0yLmFkZFRlcm0oYXJnKTtcbiAgfVxuICByZXR1cm4gc3VtMi5hc0V4cHJlc3Npb24oXCJleHByZXNzaW9uXCIpO1xufVxuZnVuY3Rpb24gZXZhbEFkZE51bShvcHMyKSB7XG4gIGxldCBzdW0yID0gMDtcbiAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgIGNvbnN0IHYgPSBvcDMubnVtZXJpY1ZhbHVlO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIilcbiAgICAgIHN1bTIgKz0gdjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gc3VtMjtcbn1cbmZ1bmN0aW9uIGV2YWxBZGQoY2UsIG9wczIsIG1vZGUgPSBcImV2YWx1YXRlXCIpIHtcbiAgaWYgKG1vZGUgPT09IFwiTlwiICYmIGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIikge1xuICAgIG9wczIgPSBvcHMyLm1hcCgoeCkgPT4geC5OKCkpO1xuICAgIGNvbnN0IHN1bTIgPSBldmFsQWRkTnVtKG9wczIpO1xuICAgIGlmIChzdW0yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihzdW0yKTtcbiAgfVxuICBmb3IgKGNvbnN0IGFyZyBvZiBvcHMyKSB7XG4gICAgaWYgKGFyZy5pc0ltYWdpbmFyeSAmJiBhcmcuaXNJbmZpbml0eSlcbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJDb21wbGV4SW5maW5pdHlcIik7XG4gICAgaWYgKGFyZy5pc05hTiB8fCBhcmcuc3ltYm9sID09PSBcIlVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgaWYgKCFhcmcuaXNFeGFjdClcbiAgICAgIG1vZGUgPSBcIk5cIjtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJOXCIpXG4gICAgb3BzMiA9IG9wczIubWFwKCh4KSA9PiB4Lk4oKSk7XG4gIGVsc2VcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguZXZhbHVhdGUoKSk7XG4gIHJldHVybiBuZXcgU3VtKGNlLCBvcHMyKS5hc0V4cHJlc3Npb24obW9kZSA9PT0gXCJOXCIgPyBcIm51bWVyaWNcIiA6IFwiZXhwcmVzc2lvblwiKTtcbn1cbmZ1bmN0aW9uIGNhbm9uaWNhbFN1bW1hdGlvbihjZSwgYm9keSwgcmFuZ2UpIHtcbiAgYm9keSA/PyAoYm9keSA9IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gIGxldCBpbmRleCA9IG51bGw7XG4gIGxldCBsb3dlciA9IG51bGw7XG4gIGxldCB1cHBlciA9IG51bGw7XG4gIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSByYW5nZTtcbiAgfSBlbHNlIGlmIChyYW5nZSkge1xuICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICBsb3dlciA9IHJhbmdlLm9wcz8uWzFdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgICB1cHBlciA9IHJhbmdlLm9wcz8uWzJdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgfVxuICBpZiAoaW5kZXg/LmhlYWQgPT09IFwiSG9sZFwiKVxuICAgIGluZGV4ID0gaW5kZXgub3AxO1xuICBpZiAoaW5kZXg/LmhlYWQgPT09IFwiUmVsZWFzZUhvbGRcIilcbiAgICBpbmRleCA9IGluZGV4Lm9wMT8uZXZhbHVhdGUoKTtcbiAgaW5kZXggPz8gKGluZGV4ID0gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKSk7XG4gIGlmICghaW5kZXguc3ltYm9sKVxuICAgIGluZGV4ID0gY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBpbmRleC5kb21haW5dKTtcbiAgaWYgKGluZGV4LnN5bWJvbClcbiAgICBjZS5wdXNoU2NvcGUoeyBbaW5kZXguc3ltYm9sXTogeyBkb21haW46IFwiSW50ZWdlclwiIH0gfSk7XG4gIGNvbnN0IGZuID0gYm9keS5jYW5vbmljYWw7XG4gIGlmIChpbmRleC5zeW1ib2wpIHtcbiAgICBjZS5wb3BTY29wZSgpO1xuICAgIGluZGV4ID0gaW5kZXggPSBjZS5ob2xkKGluZGV4KTtcbiAgfVxuICBpZiAobG93ZXIgJiYgbG93ZXIuaXNGaW5pdGUpXG4gICAgbG93ZXIgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBsb3dlciwgXCJJbnRlZ2VyXCIpO1xuICBpZiAodXBwZXIgJiYgdXBwZXIuaXNGaW5pdGUpXG4gICAgdXBwZXIgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCB1cHBlciwgXCJJbnRlZ2VyXCIpO1xuICBpZiAobG93ZXIgJiYgdXBwZXIpXG4gICAgcmFuZ2UgPSBjZS50dXBsZShbaW5kZXgsIGxvd2VyLCB1cHBlcl0pO1xuICBlbHNlIGlmICh1cHBlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgY2UubnVtYmVyKDEpLCB1cHBlcl0pO1xuICBlbHNlIGlmIChsb3dlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXJdKTtcbiAgZWxzZVxuICAgIHJhbmdlID0gaW5kZXg7XG4gIHJldHVybiBjZS5fZm4oXCJTdW1cIiwgW2ZuLCByYW5nZV0pO1xufVxuZnVuY3Rpb24gZXZhbFN1bW1hdGlvbihjZSwgZXhwciwgcmFuZ2UsIG1vZGUpIHtcbiAgY29uc3QgW2luZGV4LCBsb3dlciwgdXBwZXIsIGlzRmluaXRlMl0gPSBub3JtYWxpemVMaW1pdHMocmFuZ2UpO1xuICBjb25zdCBmbiA9IGV4cHI7XG4gIGlmIChtb2RlICE9PSBcIk5cIiAmJiAobG93ZXIgPj0gdXBwZXIgfHwgdXBwZXIgLSBsb3dlciA+PSBNQVhfU1lNQk9MSUNfVEVSTVMpKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCByZXN1bHQgPSBudWxsO1xuICBjb25zdCBzYXZlZENvbnRleHQgPSBjZS5jb250ZXh0O1xuICBjZS5jb250ZXh0ID0gZm4uc2NvcGUgPz8gY2UuY29udGV4dDtcbiAgaWYgKG1vZGUgPT09IFwic2ltcGxpZnlcIikge1xuICAgIGNvbnN0IHRlcm1zID0gW107XG4gICAgaWYgKCFmbi5zY29wZSlcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKVxuICAgICAgICB0ZXJtcy5wdXNoKGZuLnNpbXBsaWZ5KCkpO1xuICAgIGVsc2VcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKSB7XG4gICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgIHRlcm1zLnB1c2goZm4uc2ltcGxpZnkoKSk7XG4gICAgICB9XG4gICAgcmVzdWx0ID0gY2UuYWRkKHRlcm1zKS5zaW1wbGlmeSgpO1xuICB9XG4gIGlmIChtb2RlID09PSBcImV2YWx1YXRlXCIpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdO1xuICAgIGlmICghZm4uc2NvcGUpXG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKylcbiAgICAgICAgdGVybXMucHVzaChmbi5ldmFsdWF0ZSgpKTtcbiAgICBlbHNlXG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICB0ZXJtcy5wdXNoKGZuLmV2YWx1YXRlKCkpO1xuICAgICAgfVxuICAgIHJlc3VsdCA9IGNlLmFkZCh0ZXJtcykuZXZhbHVhdGUoKTtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJOXCIpIHtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsICYmICFmbi5zY29wZSkge1xuICAgICAgY29uc3QgbiA9IGZuLk4oKTtcbiAgICAgIGlmICghaXNGaW5pdGUyKSB7XG4gICAgICAgIGlmIChuLmlzWmVybylcbiAgICAgICAgICByZXN1bHQgPSBjZS5fWkVSTztcbiAgICAgICAgZWxzZSBpZiAobi5pc1Bvc2l0aXZlKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgZm4uaXNQdXJlKVxuICAgICAgICByZXN1bHQgPSBjZS5tdWwoW2NlLm51bWJlcih1cHBlciAtIGxvd2VyICsgMSksIG5dKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBpc0Zpbml0ZTIpIHtcbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpKSB7XG4gICAgICAgIGxldCBzdW0yID0gY2UuYmlnbnVtKDApO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzQmlnbnVtKGZuLk4oKSk7XG4gICAgICAgICAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRlcm0uaXNGaW5pdGUoKSkge1xuICAgICAgICAgICAgc3VtMiA9IHRlcm07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VtMiA9IHN1bTIuYWRkKHRlcm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICAgICAgcmVzdWx0ID0gY2UubnVtYmVyKHN1bTIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBcIm1hY2hpbmVcIjtcbiAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzRmxvYXQoZm4uTigpKTtcbiAgICAgICAgICBpZiAodGVybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRlcm0pKSB7XG4gICAgICAgICAgICBzdW0yID0gdGVybTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdW0yICs9IHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIoc3VtMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNlLnNldCh7IFtpbmRleF06IDFlMyB9KTtcbiAgICAgIGNvbnN0IG5NYXggPSBmbi5OKCk7XG4gICAgICBjZS5zZXQoeyBbaW5kZXhdOiA5OTkgfSk7XG4gICAgICBjb25zdCBuTWF4TWludXNPbmUgPSBmbi5OKCk7XG4gICAgICBjb25zdCByYXRpbyA9IGFzRmxvYXQoY2UuZGl2KG5NYXgsIG5NYXhNaW51c09uZSkuTigpKTtcbiAgICAgIGlmIChyYXRpbyAhPT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUocmF0aW8pICYmIE1hdGguYWJzKHJhdGlvKSA+IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICBjb25zdCBudW1lcmljTW9kZSA9IGNlLm51bWVyaWNNb2RlO1xuICAgICAgICBjZS5udW1lcmljTW9kZSA9IFwibWFjaGluZVwiO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzRmxvYXQoZm4uTigpKTtcbiAgICAgICAgICBpZiAodGVybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChNYXRoLmFicyh0ZXJtKSA8IE51bWJlci5FUFNJTE9OIHx8ICFOdW1iZXIuaXNGaW5pdGUodGVybSkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBzdW0yICs9IHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIoc3VtMik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNlLmNvbnRleHQgPSBzYXZlZENvbnRleHQ7XG4gIHJldHVybiByZXN1bHQgPz8gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvbmVnYXRlLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg5ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBuZWdhdGVMaXRlcmFsKGV4cHIsIG1ldGFkYXRhKSB7XG4gIGxldCBuID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChuID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIpXG4gICAgbiA9IC1uO1xuICBlbHNlIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIG4gPSBuLm5lZygpO1xuICBlbHNlIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg5LkNvbXBsZXgpXG4gICAgbiA9IG4ubmVnKCk7XG4gIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobikpXG4gICAgbiA9IG5lZyhuKTtcbiAgcmV0dXJuIGV4cHIuZW5naW5lLm51bWJlcihuLCB7IG1ldGFkYXRhIH0pO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsTmVnYXRlKGV4cHIsIG1ldGFkYXRhKSB7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGV4cHIub3AxO1xuICBpZiAoZXhwci5udW1lcmljVmFsdWUgIT09IG51bGwpXG4gICAgcmV0dXJuIG5lZ2F0ZUxpdGVyYWwoZXhwciwgbWV0YWRhdGEpO1xuICBpZiAoZXhwci5oZWFkID09PSBcIkFkZFwiKSB7XG4gICAgbGV0IG9wczIgPSBleHByLm9wcy5tYXAoKHgpID0+IGNhbm9uaWNhbE5lZ2F0ZSh4KSk7XG4gICAgb3BzMiA9IGZsYXR0ZW5PcHMob3BzMiwgXCJBZGRcIik7XG4gICAgcmV0dXJuIGV4cHIuZW5naW5lLmFkZChvcHMyLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgcmV0dXJuIG5lZ2F0ZVByb2R1Y3QoZXhwci5lbmdpbmUsIGV4cHIub3BzKTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBleHByLmVuZ2luZS5fZm4oXCJEaXZpZGVcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShleHByLm9wMSksIGV4cHIub3AyXSk7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChleHByLmhlYWQgIT09IFwiU3VidHJhY3RcIik7XG4gIHJldHVybiBleHByLmVuZ2luZS5fZm4oXCJOZWdhdGVcIiwgW2V4cHJdLCBtZXRhZGF0YSk7XG59XG5mdW5jdGlvbiBuZWdhdGVQcm9kdWN0KGNlLCBhcmdzKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmICghZG9uZSAmJiBhcmcuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChhcmcub3AxKTtcbiAgICB9IGVsc2VcbiAgICAgIHJlc3VsdC5wdXNoKGFyZyk7XG4gIH1cbiAgaWYgKGRvbmUpXG4gICAgcmV0dXJuIGNlLm11bChyZXN1bHQpO1xuICByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChkb25lIHx8IGFyZy5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgIWFyZy5pc0ludGVnZXIpXG4gICAgICByZXN1bHQucHVzaChhcmcpO1xuICAgIGVsc2Uge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChjYW5vbmljYWxOZWdhdGUoYXJnKSk7XG4gICAgfVxuICB9XG4gIGlmIChkb25lKVxuICAgIHJldHVybiBjZS5tdWwocmVzdWx0KTtcbiAgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoZG9uZSB8fCBhcmcubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICFhcmcuaXNOdW1iZXIpXG4gICAgICByZXN1bHQucHVzaChhcmcpO1xuICAgIGVsc2Uge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChjYW5vbmljYWxOZWdhdGUoYXJnKSk7XG4gICAgfVxuICB9XG4gIGlmIChkb25lKVxuICAgIHJldHVybiBjZS5tdWwocmVzdWx0KTtcbiAgcmV0dXJuIGNlLl9mbihcIk5lZ2F0ZVwiLCBbY2UuX2ZuKFwiTXVsdGlwbHlcIiwgYXJncyldKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NOZWdhdGUoX2NlLCB4LCBfbW9kZSA9IFwic2ltcGxpZnlcIikge1xuICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKHgpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvZXhwYW5kLnRzXG5mdW5jdGlvbiBkaXN0cmlidXRlMihsaHMsIHJocykge1xuICBpZiAobGhzLmhlYWQgPT09IFwiTmVnYXRlXCIgJiYgcmhzLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGRpc3RyaWJ1dGUyKGxocy5vcDEsIHJocy5vcDEpO1xuICBpZiAobGhzLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShkaXN0cmlidXRlMihsaHMub3AxLCByaHMpKTtcbiAgaWYgKHJocy5oZWFkID09PSBcIk5lZ2F0ZVwiKVxuICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUoZGlzdHJpYnV0ZTIobGhzLCByaHMub3AxKSk7XG4gIGNvbnN0IGNlID0gbGhzLmVuZ2luZTtcbiAgaWYgKGxocy5oZWFkID09PSBcIkRpdmlkZVwiICYmIHJocy5oZWFkID09PSBcIkRpdmlkZVwiKSB7XG4gICAgY29uc3QgZGVub20gPSBjZS5tdWwoW2xocy5vcDIsIHJocy5vcDJdKTtcbiAgICByZXR1cm4gY2UuZGl2KGRpc3RyaWJ1dGUyKGxocy5vcDEsIHJocy5vcDEpLCBkZW5vbSk7XG4gIH1cbiAgaWYgKGxocy5oZWFkID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBjZS5kaXYoZGlzdHJpYnV0ZTIobGhzLm9wMSwgcmhzKSwgbGhzLm9wMik7XG4gIGlmIChyaHMuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2UuZGl2KGRpc3RyaWJ1dGUyKGxocywgcmhzLm9wMSksIHJocy5vcDIpO1xuICBpZiAobGhzLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgcmV0dXJuIGNlLmFkZChsaHMub3BzLm1hcCgoeCkgPT4gZGlzdHJpYnV0ZTIoeCwgcmhzKSkpO1xuICBpZiAocmhzLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgcmV0dXJuIGNlLmFkZChyaHMub3BzLm1hcCgoeCkgPT4gZGlzdHJpYnV0ZTIobGhzLCB4KSkpO1xuICByZXR1cm4gY2UubXVsKFtsaHMsIHJoc10pO1xufVxuZnVuY3Rpb24gZGlzdHJpYnV0ZShleHByKSB7XG4gIGlmIChleHByLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gZXhwclswXTtcbiAgaWYgKGV4cHIubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiBkaXN0cmlidXRlMihleHByWzBdLCBleHByWzFdKTtcbiAgcmV0dXJuIGRpc3RyaWJ1dGUyKGV4cHJbMF0sIGRpc3RyaWJ1dGUoZXhwci5zbGljZSgxKSkpO1xufVxudmFyIGJpbm9taWFscyA9IFtcbiAgWzFdLFxuICBbMSwgMV0sXG4gIFsxLCAyLCAxXSxcbiAgWzEsIDMsIDMsIDFdLFxuICBbMSwgNCwgNiwgNCwgMV0sXG4gIFsxLCA1LCAxMCwgMTAsIDUsIDFdLFxuICBbMSwgNiwgMTUsIDIwLCAxNSwgNiwgMV0sXG4gIFsxLCA3LCAyMSwgMzUsIDM1LCAyMSwgNywgMV0sXG4gIFsxLCA4LCAyOCwgNTYsIDcwLCA1NiwgMjgsIDgsIDFdXG5dO1xuZnVuY3Rpb24gY2hvb3NlKG4sIGspIHtcbiAgd2hpbGUgKG4gPj0gYmlub21pYWxzLmxlbmd0aCkge1xuICAgIGNvbnN0IHMgPSBiaW5vbWlhbHMubGVuZ3RoO1xuICAgIGNvbnN0IG5leHRSb3cgPSBbMV07XG4gICAgY29uc3QgcHJldiA9IGJpbm9taWFsc1tzIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzOyBpKyspXG4gICAgICBuZXh0Um93W2ldID0gcHJldltpIC0gMV0gKyBwcmV2W2ldO1xuICAgIG5leHRSb3dbc10gPSAxO1xuICAgIGJpbm9taWFscy5wdXNoKG5leHRSb3cpO1xuICB9XG4gIHJldHVybiBiaW5vbWlhbHNbbl1ba107XG59XG5mdW5jdGlvbiBtdWx0aW5vbWlhbENvZWZmaWNpZW50KGspIHtcbiAgbGV0IG4gPSBrLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKTtcbiAgbGV0IHByb2QgPSAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBwcm9kICo9IGNob29zZShuLCBrW2ldKTtcbiAgICBuIC09IGtbaV07XG4gIH1cbiAgcmV0dXJuIHByb2Q7XG59XG5mdW5jdGlvbiogcG93ZXJzKG4sIGV4cDIpIHtcbiAgaWYgKG4gPT09IDEpIHtcbiAgICB5aWVsZCBbZXhwMl07XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGV4cDI7IGkgKz0gMSlcbiAgICBmb3IgKGNvbnN0IHAgb2YgcG93ZXJzKG4gLSAxLCBleHAyIC0gaSkpXG4gICAgICB5aWVsZCBbaSwgLi4ucF07XG59XG5mdW5jdGlvbiBleHBhbmRNdWx0aW5vbWlhbChleHByKSB7XG4gIGlmIChleHByLmhlYWQgIT09IFwiUG93ZXJcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgZXhwMiA9IGFzU21hbGxJbnRlZ2VyKGV4cHIub3AyKTtcbiAgaWYgKGV4cDIgPT09IG51bGwgfHwgZXhwMiA8IDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChleHAyID09PSAwKVxuICAgIHJldHVybiBleHByLmVuZ2luZS5fT05FO1xuICBpZiAoZXhwMiA9PT0gMSlcbiAgICByZXR1cm4gZXhwci5vcDE7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGlmIChleHByLm9wMS5oZWFkID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgY29uc3Qgc2lnbjIgPSBleHAyICUgMiA9PT0gMCA/IDEgOiAtMTtcbiAgICBjb25zdCByZXN1bHQyID0gZXhwYW5kTXVsdGlub21pYWwoY2UucG93KGV4cHIub3AxLm9wMSwgZXhwci5vcDIpKTtcbiAgICBpZiAocmVzdWx0MiA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzaWduMiA+IDApXG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICByZXR1cm4gY2UubmVnKHJlc3VsdDIpO1xuICB9XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChleHByLm9wMS5oZWFkICE9PSBcIlN1YnRyYWN0XCIpO1xuICBpZiAoZXhwci5vcDEuaGVhZCAhPT0gXCJBZGRcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgdGVybXMgPSBleHByLm9wMS5vcHM7XG4gIGNvbnN0IGl0ID0gcG93ZXJzKHRlcm1zLmxlbmd0aCwgZXhwMik7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbCBvZiBpdCkge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBbY2UubnVtYmVyKG11bHRpbm9taWFsQ29lZmZpY2llbnQodmFsKSldO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodmFsW2ldICE9PSAwKSB7XG4gICAgICAgIGlmICh2YWxbaV0gPT09IDEpXG4gICAgICAgICAgcHJvZHVjdC5wdXNoKHRlcm1zW2ldKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHByb2R1Y3QucHVzaChjZS5wb3codGVybXNbaV0sIHZhbFtpXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucHVzaChjZS5tdWwocHJvZHVjdCkpO1xuICB9XG4gIHJldHVybiBjZS5hZGQocmVzdWx0KTtcbn1cbmZ1bmN0aW9uIGV4cGFuZE51bWVyYXRvcihleHByKSB7XG4gIGlmIChleHByLmhlYWQgIT09IFwiRGl2aWRlXCIpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGV4cGFuZGVkTnVtZXJhdG9yID0gZXhwYW5kMihleHByLm9wMSk7XG4gIGlmIChleHBhbmRlZE51bWVyYXRvciA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgY2UgPSBleHByLmVuZ2luZTtcbiAgaWYgKGV4cGFuZGVkTnVtZXJhdG9yLmhlYWQgPT09IFwiQWRkXCIpIHtcbiAgICByZXR1cm4gY2UuYWRkKGV4cGFuZGVkTnVtZXJhdG9yLm9wcy5tYXAoKHgpID0+IGNlLmRpdih4LCBleHByLm9wMikpKTtcbiAgfVxuICByZXR1cm4gZXhwci5lbmdpbmUuZGl2KGV4cGFuZGVkTnVtZXJhdG9yLCBleHByLm9wMik7XG59XG5mdW5jdGlvbiBleHBhbmQyKGV4cHIpIHtcbiAgaWYgKCFleHByKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgcmVzdWx0ID0gZXhwYW5kTnVtZXJhdG9yKGV4cHIpO1xuICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgIHJldHVybiByZXN1bHQ7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIHJlc3VsdCA9IGRpc3RyaWJ1dGUoZXhwci5vcHMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiQWRkXCIpIHtcbiAgICBjb25zdCBvcHMyID0gZXhwci5vcHMubWFwKCh4KSA9PiBleHBhbmQyKHgpID8/IHgpO1xuICAgIHJldHVybiBzaW1wbGlmeUFkZChleHByLmVuZ2luZSwgb3BzMik7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgIHJlc3VsdCA9IGV4cGFuZDIoZXhwci5vcDEpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICByZXR1cm4gZXhwci5lbmdpbmUubmVnKHJlc3VsdCk7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgcmVzdWx0ID0gZXhwYW5kTXVsdGlub21pYWwoZXhwcik7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbClcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9zb2x2ZS50c1xudmFyIFVOSVZBUklBVEVfUk9PVFMgPSBbXG4gIC8vIGF4ID0gMFxuICBbW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9hXCJdLCAwXSxcbiAgLy8geCArIGEgPSAwXG4gIFtcbiAgICBbXCJBZGRcIiwgXCJfYVwiLCBcIl94XCJdLFxuICAgIFtcIk5lZ2F0ZVwiLCBcIl9hXCJdXG4gIF0sXG4gIFtbXCJBZGRcIiwgW1wiTmVnYXRlXCIsIFwiX3hcIl0sIFwiX2FcIl0sIFwiX2FcIl0sXG4gIC8vIGF4ICsgYiA9IDBcbiAgW1xuICAgIFtcIkFkZFwiLCBbXCJNdWx0aXBseVwiLCBcIl94XCIsIFwiX2FcIl0sIFwiX2JcIl0sXG4gICAgW1wiRGl2aWRlXCIsIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLCBcIl9hXCJdXG4gIF0sXG4gIC8vIFF1YWRyYXRpYyBmb3JtdWxhIChyZWFsKVxuICAvLyBheF4yICsgYnggKyBjID0gMFxuICBbXG4gICAgW1xuICAgICAgXCJBZGRcIixcbiAgICAgIFtcIk11bHRpcGx5XCIsIFtcIlBvd2VyXCIsIFwiX3hcIiwgMl0sIFwiX2FcIl0sXG4gICAgICBbXCJNdWx0aXBseVwiLCBcIl94XCIsIFwiX2JcIl0sXG4gICAgICBcIl9jXCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiRGl2aWRlXCIsXG4gICAgICBbXG4gICAgICAgIFwiQWRkXCIsXG4gICAgICAgIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLFxuICAgICAgICBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBcIl9iXCJdLCBbXCJNdWx0aXBseVwiLCA0LCBcIl9hXCIsIFwiX2NcIl1dXVxuICAgICAgXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDIsIFwiX2FcIl1cbiAgICBdXG4gICAgLy8gKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzUmVhbCA9PT0gdHJ1ZSxcbiAgXSxcbiAgW1xuICAgIFtcbiAgICAgIFwiQWRkXCIsXG4gICAgICBbXCJNdWx0aXBseVwiLCBbXCJQb3dlclwiLCBcIl94XCIsIDJdLCBcIl9hXCJdLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9iXCJdLFxuICAgICAgXCJfY1wiXG4gICAgXSxcbiAgICBbXG4gICAgICBcIkRpdmlkZVwiLFxuICAgICAgW1xuICAgICAgICBcIlN1YnRyYWN0XCIsXG4gICAgICAgIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLFxuICAgICAgICBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBcIl9iXCJdLCBbXCJNdWx0aXBseVwiLCA0LCBcIl9hXCIsIFwiX2NcIl1dXVxuICAgICAgXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDIsIFwiX2FcIl1cbiAgICBdXG4gICAgLy8gKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzUmVhbCA9PT0gdHJ1ZSxcbiAgXSxcbiAgLy8gYXheMiArIGJ4ID0gMFxuICBbXG4gICAgW1wiQWRkXCIsIFtcIk11bHRpcGx5XCIsIFtcIlBvd2VyXCIsIFwiX3hcIiwgMl0sIFwiX2FcIl0sIFtcIk11bHRpcGx5XCIsIFwiX3hcIiwgXCJfYlwiXV0sXG4gICAgMFxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF0sXG4gIFtcbiAgICBbXCJBZGRcIiwgW1wiTXVsdGlwbHlcIiwgW1wiUG93ZXJcIiwgXCJfeFwiLCAyXSwgXCJfYVwiXSwgW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9iXCJdXSxcbiAgICBbXCJEaXZpZGVcIiwgW1wiTmVnYXRlXCIsIFwiX2JcIl0sIFwiX2FcIl1cbiAgICAvLyAoX2NlLCB2YXJzKTogYm9vbGVhbiA9PiB2YXJzLnguaXNSZWFsID09PSB0cnVlLFxuICBdLFxuICAvLyBheF4yICsgYiA9IDBcbiAgW1xuICAgIFtcIkFkZFwiLCBbXCJNdWx0aXBseVwiLCBbXCJQb3dlclwiLCBcIl94XCIsIDJdLCBcIl9hXCJdLCBcIl9iXCJdLFxuICAgIFtcIlNxcnRcIiwgW1wiRGl2aWRlXCIsIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLCBcIl9hXCJdXVxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF0sXG4gIFtcbiAgICBbXCJBZGRcIiwgW1wiTXVsdGlwbHlcIiwgW1wiUG93ZXJcIiwgXCJfeFwiLCAyXSwgXCJfYVwiXSwgXCJfYlwiXSxcbiAgICBbXCJOZWdhdGVcIiwgW1wiU3FydFwiLCBbXCJEaXZpZGVcIiwgW1wiTmVnYXRlXCIsIFwiX2JcIl0sIFwiX2FcIl1dXVxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF1cbiAgLy8gUXVhZHJhdGljIGZvcm11bGEgKGNvbXBsZXgpXG4gIC8vIFtcbiAgLy8gICAnJGF4XjIgKyBieCArIGMkJyxcbiAgLy8gICBbXG4gIC8vICAgICAnJC1cXFxcZnJhY3tifXsyYX0gLSBcXFxcaW1hZ2luYXJ5SSBcXFxcZnJhY3tcXFxcc3FydHs0YWMgLSBiXjJ9fXsyYX0kJyxcbiAgLy8gICAgICckLVxcXFxmcmFje2J9ezJhfSArIFxcXFxpbWFnaW5hcnlJIFxcXFxmcmFje1xcXFxzcXJ0ezRhYyAtIGJeMn19ezJhfSQnLFxuICAvLyAgIF0sXG4gIC8vICAgKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzSW1hZ2luYXJ5ID09PSB0cnVlLFxuICAvLyBdLFxuXTtcbmZ1bmN0aW9uIGZpbmRVbml2YXJpYXRlUm9vdHMoZXhwciwgeCkge1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAoZXhwci5oZWFkID09PSBcIkVxdWFsXCIpIHtcbiAgICBleHByID0gY2UuYWRkKFtleHByLm9wMS5jYW5vbmljYWwsIGNlLm5lZyhleHByLm9wMi5jYW5vbmljYWwpXSkuc2ltcGxpZnkoKTtcbiAgfVxuICBjb25zdCBydWxlcyA9IGNlLmNhY2hlKFxuICAgIFwidW5pdmFyaWF0ZS1yb290cy1ydWxlc1wiLFxuICAgICgpID0+IGJveFJ1bGVzKGNlLCBVTklWQVJJQVRFX1JPT1RTKVxuICApO1xuICBsZXQgcmVzdWx0ID0gbWF0Y2hSdWxlcyhcbiAgICBleHByLnN1YnMoeyBbeF06IFwiX3hcIiB9LCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgcnVsZXMsXG4gICAgeyBfeDogY2Uuc3ltYm9sKFwiX3hcIikgfVxuICApO1xuICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnN0IGV4cGFuZGVkRXhwciA9IGV4cGFuZDIoZXhwci5jYW5vbmljYWwpO1xuICAgIGlmIChleHBhbmRlZEV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gW107XG4gICAgcmVzdWx0ID0gbWF0Y2hSdWxlcyhcbiAgICAgIGV4cGFuZGVkRXhwci5zdWJzKHsgW3hdOiBcIl94XCIgfSwgeyBjYW5vbmljYWw6IGZhbHNlIH0pLFxuICAgICAgcnVsZXMsXG4gICAgICB7XG4gICAgICAgIF94OiBjZS5zeW1ib2woXCJfeFwiKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5tYXAoKHgyKSA9PiB4Mi5jYW5vbmljYWwuZXZhbHVhdGUoKSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9hc3N1bWUudHNcbmZ1bmN0aW9uIGFzc3VtZShwcm9wb3NpdGlvbikge1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFbGVtZW50XCIpXG4gICAgcmV0dXJuIGFzc3VtZUVsZW1lbnQocHJvcG9zaXRpb24pO1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFcXVhbFwiKVxuICAgIHJldHVybiBhc3N1bWVFcXVhbGl0eShwcm9wb3NpdGlvbik7XG4gIGlmIChpc0luZXF1YWxpdHkocHJvcG9zaXRpb24pKVxuICAgIHJldHVybiBhc3N1bWVJbmVxdWFsaXR5KHByb3Bvc2l0aW9uKTtcbiAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVFcXVhbGl0eShwcm9wb3NpdGlvbikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFcXVhbFwiKTtcbiAgY29uc3QgZnJlZVZhcnMgPSBwcm9wb3NpdGlvbi5mcmVlVmFycztcbiAgaWYgKGZyZWVWYXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnN0IHZhbCA9IHByb3Bvc2l0aW9uLmV2YWx1YXRlKCk7XG4gICAgaWYgKHZhbC5zeW1ib2wgPT09IFwiVHJ1ZVwiKVxuICAgICAgcmV0dXJuIFwidGF1dG9sb2d5XCI7XG4gICAgaWYgKHZhbC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICAgIHJldHVybiBcImNvbnRyYWRpY3Rpb25cIjtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5sb2cocHJvcG9zaXRpb24uY2Fub25pY2FsLmV2YWx1YXRlKCkpO1xuICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICB9XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBjb25zdCBsaHMgPSBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sO1xuICBpZiAobGhzICYmICFoYXNWYWx1ZShjZSwgbGhzKSAmJiAhcHJvcG9zaXRpb24ub3AyLmhhcyhsaHMpKSB7XG4gICAgY29uc3QgdmFsID0gcHJvcG9zaXRpb24ub3AyLmV2YWx1YXRlKCk7XG4gICAgaWYgKCF2YWwuaXNWYWxpZClcbiAgICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICAgIGNvbnN0IGRlZiA9IGNlLmxvb2t1cFN5bWJvbChsaHMpO1xuICAgIGlmICghZGVmKSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wobGhzLCB7IHZhbHVlOiB2YWwgfSk7XG4gICAgICByZXR1cm4gXCJva1wiO1xuICAgIH1cbiAgICBpZiAoZGVmLmRvbWFpbiAmJiAhdmFsLmRvbWFpbi5pc0NvbXBhdGlibGUoZGVmLmRvbWFpbikpXG4gICAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gICAgZGVmLnZhbHVlID0gdmFsO1xuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKGZyZWVWYXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGxoczIgPSBmcmVlVmFyc1swXTtcbiAgICBjb25zdCBzb2xzID0gZmluZFVuaXZhcmlhdGVSb290cyhwcm9wb3NpdGlvbiwgbGhzMik7XG4gICAgaWYgKHNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjZS5hc3N1bXB0aW9ucy5zZXQoXG4gICAgICAgIGNlLmZuKFwiRXF1YWxcIiwgW1xuICAgICAgICAgIGNlLmFkZChbcHJvcG9zaXRpb24ub3AxLmNhbm9uaWNhbCwgY2UubmVnKHByb3Bvc2l0aW9uLm9wMi5jYW5vbmljYWwpXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgICAwXG4gICAgICAgIF0pLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBzb2xzLmxlbmd0aCA9PT0gMSA/IHNvbHNbMF0gOiBjZS5mbihcIkxpc3RcIiwgc29scyk7XG4gICAgY29uc3QgZGVmID0gY2UubG9va3VwU3ltYm9sKGxoczIpO1xuICAgIGlmICghZGVmKSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wobGhzMiwgeyB2YWx1ZTogdmFsIH0pO1xuICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICB9XG4gICAgaWYgKGRlZi5kb21haW4gJiYgIXNvbHMuZXZlcnkoKHNvbCkgPT4gdmFsLmRvbWFpbi5pc0NvbXBhdGlibGUoc29sLmRvbWFpbikpKVxuICAgICAgcmV0dXJuIFwiY29udHJhZGljdGlvblwiO1xuICAgIGRlZi52YWx1ZSA9IHZhbDtcbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGNlLmFzc3VtcHRpb25zLnNldChwcm9wb3NpdGlvbiwgdHJ1ZSk7XG4gIHJldHVybiBcIm9rXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVJbmVxdWFsaXR5KHByb3Bvc2l0aW9uKSB7XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBpZiAocHJvcG9zaXRpb24ub3AxLnN5bWJvbCAmJiAhaGFzRGVmKGNlLCBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sKSkge1xuICAgIGlmIChwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5pc1plcm8pIHtcbiAgICAgIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkxlc3NcIikge1xuICAgICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICAgIGRvbWFpbjogY2UuZG9tYWluKFwiTmVnYXRpdmVOdW1iZXJcIilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiTGVzc0VxdWFsXCIpIHtcbiAgICAgICAgY2UuZGVmaW5lU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wsIHtcbiAgICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIk5vblBvc2l0aXZlTnVtYmVyXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkdyZWF0ZXJcIikge1xuICAgICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICAgIGRvbWFpbjogY2UuZG9tYWluKFwiUG9zaXRpdmVOdW1iZXJcIilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiR3JlYXRlckVxdWFsXCIpIHtcbiAgICAgICAgY2UuZGVmaW5lU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wsIHtcbiAgICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIkV4dGVuZGVkUmVhbE51bWJlclwiKVxuICAgICAgfSk7XG4gICAgICBjZS5hc3N1bXB0aW9ucy5zZXQocHJvcG9zaXRpb24sIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGxldCBvcDMgPSBcIlwiO1xuICBsZXQgbGhzO1xuICBsZXQgcmhzO1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJMZXNzXCIpIHtcbiAgICBsaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgcmhzID0gcHJvcG9zaXRpb24ub3AyO1xuICAgIG9wMyA9IFwiPFwiO1xuICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiTGVzc0VxdWFsXCIpIHtcbiAgICBsaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgcmhzID0gcHJvcG9zaXRpb24ub3AyO1xuICAgIG9wMyA9IFwiPD1cIjtcbiAgfSBlbHNlIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkdyZWF0ZXJcIikge1xuICAgIGxocyA9IHByb3Bvc2l0aW9uLm9wMjtcbiAgICByaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgb3AzID0gXCI8XCI7XG4gIH0gZWxzZSBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJHcmVhdGVyRXF1YWxcIikge1xuICAgIGxocyA9IHByb3Bvc2l0aW9uLm9wMjtcbiAgICByaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgb3AzID0gXCI8PVwiO1xuICB9XG4gIGlmICghb3AzKVxuICAgIHJldHVybiBcImludGVybmFsLWVycm9yXCI7XG4gIGNvbnN0IHAgPSBjZS5hZGQoW2xocy5jYW5vbmljYWwsIGNlLm5lZyhyaHMuY2Fub25pY2FsKV0pLnNpbXBsaWZ5KCk7XG4gIGNvbnN0IHJlc3VsdCA9IGNlLmJveChbb3AzID09PSBcIjxcIiA/IFwiTGVzc1wiIDogXCJMZXNzRXF1YWxcIiwgcCwgMF0pLmV2YWx1YXRlKCk7XG4gIGlmIChyZXN1bHQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gXCJ0YXV0b2xvZ3lcIjtcbiAgaWYgKHJlc3VsdC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gIGNvbnN0IGZyZWVWYXJzID0gcmVzdWx0LmZyZWVWYXJzO1xuICBpZiAoZnJlZVZhcnMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICBpZiAoZnJlZVZhcnMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKCFjZS5sb29rdXBTeW1ib2woZnJlZVZhcnNbMF0pKVxuICAgICAgY2UuZGVmaW5lU3ltYm9sKGZyZWVWYXJzWzBdLCB7IGRvbWFpbjogXCJFeHRlbmRlZFJlYWxOdW1iZXJcIiB9KTtcbiAgfVxuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocmVzdWx0LmhlYWQgPT09IFwiTGVzc1wiIHx8IHJlc3VsdC5oZWFkID09PSBcIkxlc3NFcXVhbFwiKTtcbiAgY2UuYXNzdW1wdGlvbnMuc2V0KHJlc3VsdCwgdHJ1ZSk7XG4gIHJldHVybiBcIm9rXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVFbGVtZW50KHByb3Bvc2l0aW9uKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkVsZW1lbnRcIik7XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBjb25zdCB1bmRlZnMgPSB1bmRlZmluZWRJZGVudGlmaWVycyhwcm9wb3NpdGlvbi5vcDEpO1xuICBpZiAodW5kZWZzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGRvbSA9IGNlLmRvbWFpbihwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5qc29uKTtcbiAgICBpZiAoIWRvbS5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgaWYgKGRvbS5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSlcbiAgICAgIGNlLmRlZmluZUZ1bmN0aW9uKHVuZGVmc1swXSwgeyBzaWduYXR1cmU6IHsgZG9tYWluOiBcIkZ1bmN0aW9uXCIgfSB9KTtcbiAgICBlbHNlXG4gICAgICBjZS5kZWZpbmVTeW1ib2wodW5kZWZzWzBdLCB7IGRvbWFpbjogZG9tIH0pO1xuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wgJiYgaGFzRGVmKGNlLCBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sKSkge1xuICAgIGNvbnN0IGRvbSA9IGNlLmRvbWFpbihwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5qc29uKTtcbiAgICBpZiAoIWRvbS5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgY29uc3QgZGVmID0gY2UubG9va3VwU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wpO1xuICAgIGlmIChkZWYpIHtcbiAgICAgIGlmIChkZWYuZG9tYWluICYmICFkb20uaXNDb21wYXRpYmxlKGRlZi5kb21haW4pKVxuICAgICAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gICAgICBkZWYuZG9tYWluID0gZG9tO1xuICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICB9XG4gICAgY29uc3QgZmRlZiA9IGNlLmxvb2t1cEZ1bmN0aW9uKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wpO1xuICAgIGlmIChmZGVmPy5zaWduYXR1cmU/LmRvbWFpbikge1xuICAgICAgaWYgKCFkb20uaXNDb21wYXRpYmxlKGZkZWYuc2lnbmF0dXJlLmRvbWFpbikpXG4gICAgICAgIHJldHVybiBcImNvbnRyYWRpY3Rpb25cIjtcbiAgICAgIGlmIChkb20uaXNDb21wYXRpYmxlKGZkZWYuc2lnbmF0dXJlLmRvbWFpbiwgXCJiaXZhcmlhbnRcIikpXG4gICAgICAgIHJldHVybiBcInRhdXRvbG9neVwiO1xuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgfVxuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKHVuZGVmcy5sZW5ndGggPiAwKSB7XG4gICAgY2UuYXNzdW1wdGlvbnMuc2V0KHByb3Bvc2l0aW9uLCB0cnVlKTtcbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGNvbnN0IHZhbCA9IHByb3Bvc2l0aW9uLmV2YWx1YXRlKCk7XG4gIGlmICh2YWwuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gXCJ0YXV0b2xvZ3lcIjtcbiAgaWYgKHZhbC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xufVxuZnVuY3Rpb24gaGFzRGVmKGNlLCBzKSB7XG4gIHJldHVybiAoY2UubG9va3VwU3ltYm9sKHMpID8/IGNlLmxvb2t1cEZ1bmN0aW9uKHMpKSAhPT0gdm9pZCAwO1xufVxuZnVuY3Rpb24gdW5kZWZpbmVkSWRlbnRpZmllcnMoZXhwcikge1xuICByZXR1cm4gZXhwci5zeW1ib2xzLmZpbHRlcigoeCkgPT4gIWhhc0RlZihleHByLmVuZ2luZSwgeCkpO1xufVxuZnVuY3Rpb24gaGFzVmFsdWUoY2UsIHMpIHtcbiAgaWYgKGNlLmxvb2t1cEZ1bmN0aW9uKHMpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNlLmxvb2t1cFN5bWJvbChzKT8udmFsdWUgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzSW5lcXVhbGl0eShleHByKSB7XG4gIGNvbnN0IGggPSBleHByLmhlYWQ7XG4gIGlmICh0eXBlb2YgaCAhPT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBbXCJMZXNzXCIsIFwiR3JlYXRlclwiLCBcIkxlc3NFcXVhbFwiLCBcIkdyZWF0ZXJFcXVhbFwiXS5pbmNsdWRlcyhoKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94LnRzXG52YXIgaW1wb3J0X2NvbXBsZXgxMyA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1kaWN0aW9uYXJ5LnRzXG52YXIgQm94ZWREaWN0aW9uYXJ5ID0gY2xhc3MgX0JveGVkRGljdGlvbmFyeSBleHRlbmRzIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY2UsIGRpY3QsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIHN1cGVyKGNlLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB0aGlzLl92YWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3QgY2Fub25pY2FsMiA9IG9wdGlvbnMuY2Fub25pY2FsID8/IHRydWU7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGljdCkpXG4gICAgICB0aGlzLl92YWx1ZS5zZXQoa2V5LCBjZS5ib3goZGljdFtrZXldLCB7IGNhbm9uaWNhbDogY2Fub25pY2FsMiB9KSk7XG4gICAgY2UuX3JlZ2lzdGVyKHRoaXMpO1xuICB9XG4gIHVuYmluZCgpIHtcbiAgICBmb3IgKGNvbnN0IFtfaywgdl0gb2YgdGhpcy5fdmFsdWUpXG4gICAgICB2LnVuYmluZCgpO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGhhc2goKSB7XG4gICAgbGV0IGggPSBoYXNoQ29kZShcIkRpY3Rpb25hcnlcIik7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgdGhpcy5fdmFsdWUpXG4gICAgICBoIF49IGhhc2hDb2RlKGspIF4gdi5oYXNoO1xuICAgIHJldHVybiBoO1xuICB9XG4gIGdldCBjb21wbGV4aXR5KCkge1xuICAgIHJldHVybiA5NztcbiAgfVxuICBnZXQgaGVhZCgpIHtcbiAgICByZXR1cm4gXCJEaWN0aW9uYXJ5XCI7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0S2V5KGtleSkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5nZXQoa2V5KTtcbiAgfVxuICBoYXNLZXkoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmhhcyhrZXkpO1xuICB9XG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5rZXlzKCk7XG4gIH1cbiAgZ2V0IGtleXNDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUuc2l6ZTtcbiAgfVxuICBoYXMoeCkge1xuICAgIGZvciAoY29uc3QgW19rLCB2XSBvZiB0aGlzLl92YWx1ZSlcbiAgICAgIGlmICh2Lmhhcyh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBkb21haW4oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW1wiRGljdGlvbmFyeVwiXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLl92YWx1ZSlcbiAgICAgIHJlc3VsdC5wdXNoKFtcIlR1cGxlXCIsIGssIHYuZG9tYWluXSk7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihyZXN1bHQpO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIGlmICh0aGlzLmVuZ2luZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuc2hvcnRoYW5kcy5pbmNsdWRlcyhcImRpY3Rpb25hcnlcIikpIHtcbiAgICAgIGNvbnN0IGRpY3QgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuX3ZhbHVlLmtleXMoKSlcbiAgICAgICAgZGljdFtrZXldID0gdGhpcy5fdmFsdWUuZ2V0KGtleSkuanNvbjtcbiAgICAgIHJldHVybiB7IGRpY3QgfTtcbiAgICB9XG4gICAgY29uc3Qga3ZzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5fdmFsdWUua2V5cygpKVxuICAgICAga3ZzLnB1c2goXG4gICAgICAgIHRoaXMuZW5naW5lLl9mbihcIktleVZhbHVlUGFpclwiLCBbXG4gICAgICAgICAgdGhpcy5lbmdpbmUuc3RyaW5nKGtleSksXG4gICAgICAgICAgdGhpcy5fdmFsdWUuZ2V0KGtleSlcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgXCJEaWN0aW9uYXJ5XCIsIGt2cywge1xuICAgICAgbGF0ZXg6IHRoaXMuX2xhdGV4XG4gICAgfSk7XG4gIH1cbiAgLyoqIFN0cnVjdHVyYWwgZXF1YWxpdHkgKi9cbiAgaXNTYW1lKHJocykge1xuICAgIGlmICh0aGlzID09PSByaHMpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWREaWN0aW9uYXJ5KSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmFsdWUuc2l6ZSAhPT0gcmhzLl92YWx1ZS5zaXplKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHRoaXMuX3ZhbHVlKSB7XG4gICAgICBjb25zdCByaHNWID0gcmhzLmdldEtleShrKTtcbiAgICAgIGlmICghcmhzViB8fCAhdi5pc1NhbWUocmhzVikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbWF0Y2gocmhzLCBfb3B0aW9ucykge1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZERpY3Rpb25hcnkpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuX3ZhbHVlLnNpemUgIT09IHJocy5fdmFsdWUuc2l6ZSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLl92YWx1ZSkge1xuICAgICAgY29uc3QgcmhzViA9IHJocy5nZXRLZXkoayk7XG4gICAgICBpZiAoIXJoc1YpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbSA9IHYubWF0Y2gocmhzVik7XG4gICAgICBpZiAobSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4ubSB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBNYXRoZW1hdGljYWwgZXF1YWxpdHkgKi9cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkRGljdGlvbmFyeSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFyaHMua2V5cyB8fCB0aGlzLl92YWx1ZS5zaXplICE9PSByaHMuX3ZhbHVlLnNpemUpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgdGhpcy5fdmFsdWUpIHtcbiAgICAgIGNvbnN0IHJoc1YgPSByaHMuZ2V0S2V5KGspO1xuICAgICAgaWYgKCFyaHNWIHx8ICF2LmlzRXF1YWwocmhzVikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXBwbHkoZm4sIGhlYWQyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKVxuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmVuZ2luZS5ib3goZm4odGhpcy5nZXRLZXkoa2V5KSkpO1xuICAgIGlmIChoZWFkMilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbihoZWFkMiwgW3sgZGljdDogcmVzdWx0IH1dKTtcbiAgICByZXR1cm4gbmV3IF9Cb3hlZERpY3Rpb25hcnkodGhpcy5lbmdpbmUsIHJlc3VsdCk7XG4gIH1cbiAgZXZhbHVhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFwcGx5KCh4KSA9PiB4LmV2YWx1YXRlKG9wdGlvbnMpID8/IHgpO1xuICB9XG4gIGdldCBpc0Nhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNDYW5vbmljYWw7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdmFsO1xuICB9XG4gIGdldCBjYW5vbmljYWwoKSB7XG4gICAgaWYgKHRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5KCh4KSA9PiB4LmNhbm9uaWNhbCk7XG4gICAgcmVzdWx0LmlzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHNpbXBsaWZ5KG9wdGlvbnMpIHtcbiAgICBpZiAoIShvcHRpb25zPy5yZWN1cnNpdmUgPz8gdHJ1ZSkpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gdGhpcy5hcHBseSgoeCkgPT4geC5zaW1wbGlmeShvcHRpb25zKSA/PyB4KTtcbiAgfVxuICBOKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseSgoeCkgPT4geC5OKG9wdGlvbnMpKTtcbiAgfVxuICByZXBsYWNlKHJ1bGVzLCBvcHRpb25zKSB7XG4gICAgbGV0IGNoYW5nZUNvdW50ID0gMDtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0S2V5KGtleSk7XG4gICAgICBjb25zdCBuZXdWYWwgPSB2YWwucmVwbGFjZShydWxlcywgb3B0aW9ucyk7XG4gICAgICBpZiAobmV3VmFsICE9PSBudWxsKVxuICAgICAgICBjaGFuZ2VDb3VudCArPSAxO1xuICAgICAgcmVzdWx0W2tleV0gPSBuZXdWYWwgPz8gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlQ291bnQgPT09IDAgPyBudWxsIDogbmV3IF9Cb3hlZERpY3Rpb25hcnkodGhpcy5lbmdpbmUsIHJlc3VsdCk7XG4gIH1cbiAgc3VicyhzdWIyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKVxuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldEtleShrZXkpLnN1YnMoc3ViMiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBfQm94ZWREaWN0aW9uYXJ5KHRoaXMuZW5naW5lLCByZXN1bHQsIG9wdGlvbnMpO1xuICB9XG59O1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1mdW5jdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTAgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3NpbXBsaWZ5LXJ1bGVzLnRzXG52YXIgU0lNUExJRllfUlVMRVMgPSBbXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94ZWQtZnVuY3Rpb24udHNcbmZ1bmN0aW9uIGNoZWFwZXN0KG9sZEV4cHIsIG5ld0V4cHIpIHtcbiAgaWYgKG5ld0V4cHIgPT09IG51bGwgfHwgbmV3RXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBvbGRFeHByO1xuICBpZiAob2xkRXhwciA9PT0gbmV3RXhwcilcbiAgICByZXR1cm4gb2xkRXhwcjtcbiAgY29uc3QgY2UgPSBvbGRFeHByLmVuZ2luZTtcbiAgY29uc3QgYm94ZWROZXdFeHByID0gY2UuYm94KG5ld0V4cHIpO1xuICBpZiAoY2UuY29zdEZ1bmN0aW9uKGJveGVkTmV3RXhwcikgPD0gMS4yICogY2UuY29zdEZ1bmN0aW9uKG9sZEV4cHIpKSB7XG4gICAgcmV0dXJuIGJveGVkTmV3RXhwcjtcbiAgfVxuICByZXR1cm4gb2xkRXhwcjtcbn1cbnZhciBCb3hlZEZ1bmN0aW9uID0gY2xhc3MgX0JveGVkRnVuY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBoZWFkMiwgb3BzMiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPz8gKG9wdGlvbnMuY2Fub25pY2FsID0gZmFsc2UpO1xuICAgIHN1cGVyKGNlLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB0aGlzLl9zY29wZSA9IGNlLmNvbnRleHQ7XG4gICAgdGhpcy5faGVhZCA9IGhlYWQyO1xuICAgIHRoaXMuX29wcyA9IG9wczI7XG4gICAgdGhpcy5fZGVmID0gb3B0aW9ucy5kZWYgPz8gbnVsbDtcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwpIHtcbiAgICAgIGlmICghdGhpcy5fZGVmKVxuICAgICAgICB0aGlzLl9kZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMiwgY2UuY29udGV4dCk7XG4gICAgICB0aGlzLl9jYW5vbmljYWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jb2RvbWFpbiA9IG51bGw7XG4gICAgaWYgKCFvcHRpb25zLmNhbm9uaWNhbCkge1xuICAgICAgdGhpcy5fY29kb21haW4gPSBjZS5kb21haW4oXCJBbnl0aGluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aGlzLl9jb2RvbWFpbiA9IHRoaXMuX2hlYWQuZG9tYWluLmNvZG9tYWluO1xuICAgICAgZWxzZSBpZiAodGhpcy5fZGVmKSB7XG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuX2RlZi5zaWduYXR1cmU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2lnLmNvZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aGlzLl9jb2RvbWFpbiA9IHNpZy5jb2RvbWFpbihjZSwgdGhpcy5fb3BzKSA/PyBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvZG9tYWluID0gc2lnLmNvZG9tYWluID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fY29kb21haW4pXG4gICAgICAgIHRoaXMuX2NvZG9tYWluID0gY2UuZGVmYXVsdERvbWFpbiA/PyBjZS5kb21haW4oXCJWb2lkXCIpO1xuICAgIH1cbiAgICBjZS5fcmVnaXN0ZXIodGhpcyk7XG4gIH1cbiAgLy9cbiAgLy8gTk9OLUNBTk9OSUNBTCBPUiBDQU5PTklDQUwgT1BFUkFUSU9OU1xuICAvL1xuICAvLyBUaG9zZSBvcGVyYXRpb25zL3Byb3BlcnRpZXMgY2FuIGJlIGFwcGxpZWQgdG8gYSBjYW5vbmljYWwgb3JcbiAgLy8gbm9uLWNhbm9uaWNhbCBleHByZXNzaW9uXG4gIC8vXG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICBsZXQgaCA9IDA7XG4gICAgZm9yIChjb25zdCBvcDMgb2YgdGhpcy5fb3BzKVxuICAgICAgaCA9IGggPDwgMSBeIG9wMy5oYXNoIHwgMDtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYWQgPT09IFwic3RyaW5nXCIpXG4gICAgICBoID0gaCBeIGhhc2hDb2RlKHRoaXMuX2hlYWQpIHwgMDtcbiAgICBlbHNlXG4gICAgICBoID0gaCBeIHRoaXMuX2hlYWQuaGFzaCB8IDA7XG4gICAgdGhpcy5faGFzaCA9IGg7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0aGlzLl9jYW5vbmljYWwgPT09IHRoaXM7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX2Nhbm9uaWNhbCA9IHZhbCA/IHRoaXMgOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICBpZiAodGhpcy5faXNQdXJlICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faXNQdXJlO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgdGhpcy5faXNQdXJlID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSB2b2lkIDA7XG4gICAgaWYgKHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uPy5wdXJlICE9PSB2b2lkIDApXG4gICAgICByZXN1bHQgPSB0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbi5wdXJlO1xuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKVxuICAgICAgcmVzdWx0ID0gdGhpcy5fb3BzLmV2ZXJ5KCh4KSA9PiB4LmlzUHVyZSk7XG4gICAgdGhpcy5faXNQdXJlID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0IGpzb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCAmJiB0aGlzLl9jYW5vbmljYWwgPT09IHRoaXMpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkNhbm9uaWNhbEZ1bmN0aW9uKFxuICAgICAgICB0aGlzLmVuZ2luZSxcbiAgICAgICAgdGhpcy5faGVhZCxcbiAgICAgICAgdGhpcy5fb3BzLFxuICAgICAgICB7IGxhdGV4OiB0aGlzLl9sYXRleCwgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhIH1cbiAgICAgICk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgdGhpcy5faGVhZCwgdGhpcy5fb3BzLCB7XG4gICAgICBsYXRleDogdGhpcy5fbGF0ZXgsXG4gICAgICB3aWtpZGF0YTogdGhpcy5fd2lraWRhdGFcbiAgICB9KTtcbiAgfVxuICBnZXQgcmF3SnNvbigpIHtcbiAgICBjb25zdCBoZWFkMiA9IHR5cGVvZiB0aGlzLl9oZWFkID09PSBcInN0cmluZ1wiID8gdGhpcy5faGVhZCA6IHRoaXMuX2hlYWQuanNvbjtcbiAgICByZXR1cm4gW2hlYWQyLCAuLi50aGlzLm9wcy5tYXAoKHgpID0+IHgucmF3SnNvbildO1xuICB9XG4gIGdldCBzY29wZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NvcGU7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWQ7XG4gIH1cbiAgZ2V0IG9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BzO1xuICB9XG4gIGdldCBub3BzKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHMubGVuZ3RoO1xuICB9XG4gIGdldCBvcDEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1swXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBvcDIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1sxXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBvcDMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1syXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIGlmICh0aGlzLl9oZWFkID09PSBcIkVycm9yXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiICYmICF0aGlzLl9oZWFkLmlzVmFsaWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX29wcy5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKTtcbiAgfVxuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIGlmICh0aGlzLl9jYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcy5fY2Fub25pY2FsO1xuICAgIHRoaXMuX2Nhbm9uaWNhbCA9IHRoaXMuaXNWYWxpZCA/IG1ha2VDYW5vbmljYWxGdW5jdGlvbih0aGlzLmVuZ2luZSwgdGhpcy5faGVhZCwgdGhpcy5fb3BzKSA6IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuX2Nhbm9uaWNhbDtcbiAgfVxuICAqbWFwKGZuKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgdGhpcy5fb3BzLmxlbmd0aClcbiAgICAgIHlpZWxkIGZuKHRoaXMuX29wc1tpKytdKTtcbiAgfVxuICBzdWJzKHN1YjIsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICBjb25zdCBvcHMyID0gdGhpcy5fb3BzLm1hcCgoeCkgPT4geC5zdWJzKHN1YjIsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgb3BzMi5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKSlcbiAgICAgIHJldHVybiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24odGhpcy5lbmdpbmUsIHRoaXMuX2hlYWQsIG9wczIpO1xuICAgIHJldHVybiBuZXcgX0JveGVkRnVuY3Rpb24odGhpcy5lbmdpbmUsIHRoaXMuX2hlYWQsIG9wczIsIHtcbiAgICAgIGNhbm9uaWNhbDogZmFsc2VcbiAgICB9KTtcbiAgfVxuICByZXBsYWNlKHJ1bGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHJlcGxhY2UodGhpcywgcnVsZXMsIG9wdGlvbnMpO1xuICB9XG4gIGhhcyh4KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWQgPT09IHgpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHguaW5jbHVkZXModGhpcy5faGVhZCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLl9vcHMpXG4gICAgICBpZiAoYXJnLmhhcyh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKiBgaXNTYW1lYCBpcyBzdHJ1Y3R1cmFsL3N5bWJvbGljIGVxdWFsaXR5ICovXG4gIGlzU2FtZShyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkRnVuY3Rpb24pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLm5vcHMgIT09IHJocy5ub3BzKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5oZWFkICE9PSByaHMuaGVhZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHJocy5oZWFkID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBlbHNlIGlmICghcmhzLmhlYWQgfHwgIXRoaXMuaGVhZC5pc1NhbWUocmhzLmhlYWQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxoc1RhaWwgPSB0aGlzLl9vcHM7XG4gICAgY29uc3QgcmhzVGFpbCA9IHJocy5fb3BzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzVGFpbC5sZW5ndGg7IGkrKylcbiAgICAgIGlmICghbGhzVGFpbFtpXS5pc1NhbWUocmhzVGFpbFtpXSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBtYXRjaChyaHMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWRGdW5jdGlvbikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgaWYgKHR5cGVvZiB0aGlzLmhlYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmICh0aGlzLmhlYWQgIT09IHJocy5oZWFkKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiByaHMuaGVhZCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyaHMuaGVhZClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgbSA9IHRoaXMuaGVhZC5tYXRjaChyaHMuaGVhZCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChtID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4ubSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaHNUYWlsID0gdGhpcy5fb3BzO1xuICAgIGNvbnN0IHJoc1RhaWwgPSByaHMuX29wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxoc1RhaWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG0gPSBsaHNUYWlsW2ldLm1hdGNoKHJoc1RhaWxbaV0sIG9wdGlvbnMpO1xuICAgICAgaWYgKG0gPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmVzdWx0ID0geyAuLi5yZXN1bHQsIC4uLm0gfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvL1xuICAvLyBDQU5PTklDQUwgT1BFUkFUSU9OU1xuICAvL1xuICAvLyBUaGVzZSBvcGVyYXRpb25zIGFwcGx5IG9ubHkgdG8gY2Fub25pY2FsIGV4cHJlc3Npb25zXG4gIC8vXG4gIHVuYmluZCgpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICB0aGlzLl9udW1lcmljVmFsdWUgPSB2b2lkIDA7XG4gIH1cbiAgZ2V0IHdpa2lkYXRhKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHRoaXMuX3dpa2lkYXRhID8/IHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uPy53aWtpZGF0YSA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgaWYgKCFkZWYpXG4gICAgICByZXR1cm4gW107XG4gICAgaWYgKCFkZWYuZGVzY3JpcHRpb24pXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICh0eXBlb2YgZGVmLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIFtkZWYuZGVzY3JpcHRpb25dO1xuICAgIHJldHVybiBkZWYuZGVzY3JpcHRpb247XG4gIH1cbiAgZ2V0IHVybCgpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbkRlZmluaXRpb24/LnVybCA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGNvbXBsZXhpdHkoKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbkRlZmluaXRpb24/LmNvbXBsZXhpdHkgPz8gREVGQVVMVF9DT01QTEVYSVRZO1xuICB9XG4gIGdldCBmdW5jdGlvbkRlZmluaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAodGhpcy5fZGVmICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuX2RlZjtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGJpbmQoX3Njb3BlKSB7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCB8fCAhdGhpcy5pc1B1cmUpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICghdGhpcy5fdmFsdWUpXG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZXZhbHVhdGUoKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgLyoqIGBpc0VxdWFsYCBpcyBtYXRoZW1hdGljYWwgZXF1YWxpdHkgKi9cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChzICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGlmZiA9IHRoaXMuZW5naW5lLmJveChbXCJTdWJ0cmFjdFwiLCB0aGlzLCByaHNdKS5zaW1wbGlmeSgpO1xuICAgIGlmIChkaWZmLmlzWmVybylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmlzU2FtZShyaHMpO1xuICB9XG4gIGlzTGVzcyhyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8IDA7XG4gIH1cbiAgaXNMZXNzRXF1YWwocmhzKSB7XG4gICAgY29uc3QgcyA9IHNpZ25EaWZmKHRoaXMsIHJocyk7XG4gICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHMgPD0gMDtcbiAgfVxuICBpc0dyZWF0ZXIocmhzKSB7XG4gICAgY29uc3QgcyA9IHNpZ25EaWZmKHRoaXMsIHJocyk7XG4gICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHMgPiAwO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIGNvbnN0IHMgPSBzaWduRGlmZih0aGlzLCByaHMpO1xuICAgIGlmIChzID09PSB2b2lkIDApXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIHJldHVybiBzID49IDA7XG4gIH1cbiAgZ2V0IGlzWmVybygpIHtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBzID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHMgPT09IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOb3RaZXJvKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHMgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gcyAhPT0gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc09uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VxdWFsKHRoaXMuZW5naW5lLl9PTkUpO1xuICB9XG4gIGdldCBpc05lZ2F0aXZlT25lKCkge1xuICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy5lbmdpbmUuX05FR0FUSVZFX09ORSk7XG4gIH1cbiAgLy8geCA+IDBcbiAgZ2V0IGlzUG9zaXRpdmUoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMuc2duO1xuICAgIGlmIChzID09PSBudWxsKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBzID4gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPD0gMFxuICBnZXQgaXNOb25Qb3NpdGl2ZSgpIHtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBzID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHMgPD0gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPCAwXG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHMgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gcyA8IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvLyB4ID49IDBcbiAgZ2V0IGlzTm9uTmVnYXRpdmUoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMuc2duO1xuICAgIGlmIChzID09PSBudWxsKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBzID49IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIk51bWJlclwiKTtcbiAgfVxuICBnZXQgaXNJbnRlZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJJbnRlZ2VyXCIpO1xuICB9XG4gIGdldCBpc1JhdGlvbmFsKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJSYXRpb25hbE51bWJlclwiKTtcbiAgfVxuICBnZXQgaXNBbGdlYnJhaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIkFsZ2VicmFpY051bWJlclwiKTtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJSZWFsTnVtYmVyXCIpO1xuICB9XG4gIGdldCBpc0V4dGVuZGVkUmVhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21haW4uaXNDb21wYXRpYmxlKFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCIpO1xuICB9XG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIkNvbXBsZXhOdW1iZXJcIik7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJJbWFnaW5hcnlOdW1iZXJcIik7XG4gIH1cbiAgZ2V0IHNnbigpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGNvbnN0IGhlYWQyID0gdGhpcy5oZWFkO1xuICAgIGlmIChoZWFkMiA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgY29uc3QgcyA9IHRoaXMuX29wc1swXT8uc2duO1xuICAgICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBzID09PSAwID8gMCA6IHMgPiAwID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiTXVsdGlwbHlcIikge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLl9vcHMucmVkdWNlKChhY2MsIHgpID0+IGFjYyAqICh4LnNnbiA/PyBOYU4pLCAxKTtcbiAgICAgIGlmIChpc05hTih0b3RhbCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgaWYgKHRvdGFsID4gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBpZiAodG90YWwgPCAwKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkFkZFwiKSB7XG4gICAgICBsZXQgcG9zQ291bnQgPSAwO1xuICAgICAgbGV0IG5lZ0NvdW50ID0gMDtcbiAgICAgIGxldCB6ZXJvQ291bnQgPSAwO1xuICAgICAgY29uc3QgY291bnQgPSB0aGlzLl9vcHMubGVuZ3RoO1xuICAgICAgZm9yIChjb25zdCBvcDMgb2YgdGhpcy5fb3BzKSB7XG4gICAgICAgIGNvbnN0IHMgPSBvcDMuc2duO1xuICAgICAgICBpZiAocyA9PT0gbnVsbCB8fCBzID09PSB2b2lkIDApXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChzID09PSAwKVxuICAgICAgICAgIHplcm9Db3VudCArPSAxO1xuICAgICAgICBpZiAocyA+IDApXG4gICAgICAgICAgcG9zQ291bnQgKz0gMTtcbiAgICAgICAgaWYgKHMgPCAwKVxuICAgICAgICAgIG5lZ0NvdW50ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoemVyb0NvdW50ID09PSBjb3VudClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAocG9zQ291bnQgPT09IGNvdW50KVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChuZWdDb3VudCA9PT0gY291bnQpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiRGl2aWRlXCIpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLl9vcHNbMF0/LnNnbjtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLl9vcHNbMV0/LnNnbjtcbiAgICAgIGlmIChuID09PSBudWxsIHx8IGQgPT09IG51bGwgfHwgbiA9PT0gdm9pZCAwIHx8IGQgPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAobiA+IDAgJiYgZCA+IDAgfHwgbiA8IDAgJiYgZCA8IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiU3F1YXJlXCIpIHtcbiAgICAgIGlmICh0aGlzLl9vcHNbMF0/LmlzSW1hZ2luYXJ5KVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAodGhpcy5fb3BzWzBdPy5pc1plcm8pXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJBYnNcIikge1xuICAgICAgaWYgKHRoaXMuX29wc1swXT8uaXNaZXJvKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiU3FydFwiKSB7XG4gICAgICBpZiAodGhpcy5fb3BzWzBdPy5pc1plcm8pXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgaWYgKHRoaXMuX29wc1swXT8uaXNJbWFnaW5hcnkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJQb3dlclwiKSB7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJSb290XCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkxuXCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkZsb29yXCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkNlaWxcIikge1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiUm91bmRcIikge1xuICAgIH1cbiAgICBjb25zdCB2ID0gYXNGbG9hdCh0aGlzLk4oKSk7XG4gICAgaWYgKHYgPT09IG51bGwpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICh2ID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHYgPCAwKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIHJldHVybiAxO1xuICB9XG4gIC8vXG4gIC8vIEFVVE8tQ0FOT05JQ0FMIE9QRVJBVElPTlNcbiAgLy9cbiAgLy8gVGhlIG9wZXJhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZG9uZSBvbiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlXG4gIC8vIGV4cHJlc3Npb25cbiAgLy9cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29kb21haW47XG4gIH1cbiAgLy8gc2ltcGxpZnkob3B0aW9ucz86IFNpbXBsaWZ5T3B0aW9ucyk6IEJveGVkRXhwcmVzc2lvbiB7XG4gIC8vICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zaW1wbGlmeUFsbChvcHRpb25zKTtcbiAgLy8gICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIHJlc3VsdFswXTtcbiAgLy8gICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAvLyAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiB7XG4gIC8vICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIC8vICAgICByZXR1cm4gY2UuY29zdEZ1bmN0aW9uKGEpIC0gY2UuY29zdEZ1bmN0aW9uKGIpO1xuICAvLyAgIH0pO1xuICAvLyAgIHJldHVybiByZXN1bHRbMF07XG4gIC8vIH1cbiAgc2ltcGxpZnkob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKSB7XG4gICAgICBjb25zdCBjYW5vbmljYWwyID0gdGhpcy5jYW5vbmljYWw7XG4gICAgICBpZiAoIWNhbm9uaWNhbDIuaXNDYW5vbmljYWwgfHwgIWNhbm9uaWNhbDIuaXNWYWxpZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gY2Fub25pY2FsMi5zaW1wbGlmeShvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgcmVjdXJzaXZlID0gb3B0aW9ucz8ucmVjdXJzaXZlID8/IHRydWU7XG4gICAgbGV0IGV4cHI7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgZXhwciA9IGV4cGFuZDIodGhpcyk7XG4gICAgICBpZiAoZXhwciAhPT0gbnVsbCkge1xuICAgICAgICBleHByID0gZXhwci5zaW1wbGlmeSh7IC4uLm9wdGlvbnMsIHJlY3Vyc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiBjaGVhcGVzdCh0aGlzLCBleHByKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgY29uc3QgdGFpbCA9IHJlY3Vyc2l2ZSA/IGhvbGRNYXAoXG4gICAgICB0aGlzLl9vcHMsXG4gICAgICBkZWY/LmhvbGQgPz8gXCJub25lXCIsXG4gICAgICBkZWY/LmFzc29jaWF0aXZlID8gZGVmLm5hbWUgOiBcIlwiLFxuICAgICAgKHgpID0+IHguc2ltcGxpZnkob3B0aW9ucylcbiAgICApIDogdGhpcy5fb3BzO1xuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgZXhwcjIgPSBhcHBseSh0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICAgIGlmICh0eXBlb2YgZXhwcjIuaGVhZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGV4cHIyO1xuICAgICAgcmV0dXJuIGV4cHIyLnNpbXBsaWZ5KG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZGVmKSB7XG4gICAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgICBleHByID0gdGFpbFswXT8uY2Fub25pY2FsID8/IHRoaXM7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2lnID0gZGVmLnNpZ25hdHVyZTtcbiAgICAgICAgaWYgKHNpZz8uc2ltcGxpZnkpXG4gICAgICAgICAgZXhwciA9IHNpZy5zaW1wbGlmeSh0aGlzLmVuZ2luZSwgdGFpbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZXhwcilcbiAgICAgIGV4cHIgPSB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBlbHNlXG4gICAgICBleHByID0gY2hlYXBlc3QodGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCksIGV4cHIpO1xuICAgIGV4cHIgPSBjaGVhcGVzdCh0aGlzLCBleHByKTtcbiAgICBjb25zdCBydWxlcyA9IG9wdGlvbnM/LnJ1bGVzID8/IHRoaXMuZW5naW5lLmNhY2hlKFxuICAgICAgXCJzdGFuZGFyZC1zaW1wbGlmaWNhdGlvbi1ydWxlc1wiLFxuICAgICAgKCkgPT4gYm94UnVsZXModGhpcy5lbmdpbmUsIFNJTVBMSUZZX1JVTEVTKSxcbiAgICAgIChydWxlczIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbbGhzLCByaHMsIF9wcmlvcml0eSwgX2NvbmRpdGlvbl0gb2YgcnVsZXMyKSB7XG4gICAgICAgICAgbGhzLnVuYmluZCgpO1xuICAgICAgICAgIHJocy51bmJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVsZXMyO1xuICAgICAgfVxuICAgICk7XG4gICAgbGV0IGl0ZXJhdGlvbkNvdW50ID0gMDtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG5ld0V4cHIgPSBleHByLnJlcGxhY2UocnVsZXMpO1xuICAgICAgaWYgKG5ld0V4cHIgIT09IG51bGwpIHtcbiAgICAgICAgZXhwciA9IGNoZWFwZXN0KGV4cHIsIG5ld0V4cHIpO1xuICAgICAgICBpZiAoZXhwciA9PT0gbmV3RXhwcilcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGl0ZXJhdGlvbkNvdW50ICs9IDE7XG4gICAgfSB3aGlsZSAoIWRvbmUgJiYgaXRlcmF0aW9uQ291bnQgPCB0aGlzLmVuZ2luZS5pdGVyYXRpb25MaW1pdCk7XG4gICAgcmV0dXJuIGNoZWFwZXN0KHRoaXMsIGV4cHIpO1xuICB9XG4gIGV2YWx1YXRlKG9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgY29uc3QgY2Fub25pY2FsMiA9IHRoaXMuY2Fub25pY2FsO1xuICAgICAgaWYgKCFjYW5vbmljYWwyLmlzQ2Fub25pY2FsIHx8ICFjYW5vbmljYWwyLmlzVmFsaWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbDIuZXZhbHVhdGUob3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uO1xuICAgIGNvbnN0IHRhaWwgPSBob2xkTWFwKFxuICAgICAgdGhpcy5fb3BzLFxuICAgICAgZGVmPy5ob2xkID8/IFwibm9uZVwiLFxuICAgICAgZGVmPy5hc3NvY2lhdGl2ZSA/IGRlZi5uYW1lIDogXCJcIixcbiAgICAgICh4KSA9PiB4LmV2YWx1YXRlKG9wdGlvbnMpXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGV4cHIgPSBhcHBseSh0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICAgIGlmICh0eXBlb2YgZXhwci5oZWFkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIHJldHVybiBleHByLmV2YWx1YXRlKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIWRlZilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgcmV0dXJuIHRhaWxbMF0gPz8gdGhpcztcbiAgICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICAgIGlmICghc2lnIHx8ICFzaWcuZXZhbHVhdGUpXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCk7XG4gICAgaWYgKHR5cGVvZiBzaWcuZXZhbHVhdGUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBhcHBseShzaWcuZXZhbHVhdGUsIHRhaWwpO1xuICAgIHJldHVybiBzaWcuZXZhbHVhdGUodGhpcy5lbmdpbmUsIHRhaWwpID8/IHRoaXMuZW5naW5lLmZuKHRoaXMuX2hlYWQsIHRhaWwpO1xuICB9XG4gIE4ob3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9udW1lcmljVmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5fbnVtZXJpY1ZhbHVlO1xuICAgIGlmICh0aGlzLmVuZ2luZS5zdHJpY3QgJiYgIXRoaXMuaXNWYWxpZClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgY29uc3QgY2Fub25pY2FsMiA9IHRoaXMuY2Fub25pY2FsO1xuICAgICAgaWYgKCFjYW5vbmljYWwyLmlzQ2Fub25pY2FsIHx8ICFjYW5vbmljYWwyLmlzVmFsaWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbDIuTihvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgY29uc3QgdGFpbCA9IGhvbGRNYXAoXG4gICAgICB0aGlzLl9vcHMsXG4gICAgICBkZWY/LmhvbGQgPz8gXCJub25lXCIsXG4gICAgICBkZWY/LmFzc29jaWF0aXZlID8gZGVmLm5hbWUgOiBcIlwiLFxuICAgICAgKHgpID0+IHguTihvcHRpb25zKVxuICAgICk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBleHByID0gYXBwbHkodGhpcy5faGVhZCwgdGFpbCk7XG4gICAgICBpZiAodHlwZW9mIGV4cHIuaGVhZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICByZXR1cm4gZXhwci5OKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIWRlZilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgcmV0dXJuIHRhaWxbMF0gPz8gdGhpcztcbiAgICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICAgIGxldCByZXN1bHQgPSBzaWc/Lk4/Lih0aGlzLmVuZ2luZSwgdGFpbCkgPz8gdGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCkuZXZhbHVhdGUoKTtcbiAgICBjb25zdCBudW0gPSByZXN1bHQubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICghY29tcGxleEFsbG93ZWQodGhpcy5lbmdpbmUpICYmIG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTAuZGVmYXVsdClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbmdpbmUuX05BTjtcbiAgICAgIGVsc2UgaWYgKCFiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpICYmIG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbmdpbmUubnVtYmVyKG51bS50b051bWJlcigpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQdXJlKVxuICAgICAgdGhpcy5fbnVtZXJpY1ZhbHVlID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc29sdmUodmFycykge1xuICAgIGlmICh2YXJzLmxlbmd0aCAhPT0gMSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvb3RzID0gZmluZFVuaXZhcmlhdGVSb290cyh0aGlzLnNpbXBsaWZ5KCksIHZhcnNbMF0pO1xuICAgIHJldHVybiByb290cztcbiAgfVxufTtcbmZ1bmN0aW9uIG1ha2VOdW1lcmljRnVuY3Rpb24oY2UsIGhlYWQyLCBzZW1pT3BzLCBtZXRhZGF0YSkge1xuICBsZXQgb3BzMiA9IFtdO1xuICBpZiAoaGVhZDIgPT09IFwiQWRkXCIgfHwgaGVhZDIgPT09IFwiTXVsdGlwbHlcIilcbiAgICBvcHMyID0gdmFsaWRhdGVOdW1lcmljQXJncyhcbiAgICAgIGNlLFxuICAgICAgZmxhdHRlbk9wcyhmbGF0dGVuU2VxdWVuY2UoY2UuY2Fub25pY2FsKHNlbWlPcHMpKSwgaGVhZDIpXG4gICAgKTtcbiAgZWxzZSBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIgfHwgaGVhZDIgPT09IFwiU3F1YXJlXCIgfHwgaGVhZDIgPT09IFwiU3FydFwiKVxuICAgIG9wczIgPSB2YWxpZGF0ZU51bWVyaWNBcmdzKGNlLCBmbGF0dGVuU2VxdWVuY2UoY2UuY2Fub25pY2FsKHNlbWlPcHMpKSwgMSk7XG4gIGVsc2UgaWYgKGhlYWQyID09PSBcIkRpdmlkZVwiIHx8IGhlYWQyID09PSBcIlBvd2VyXCIpXG4gICAgb3BzMiA9IHZhbGlkYXRlTnVtZXJpY0FyZ3MoY2UsIGZsYXR0ZW5TZXF1ZW5jZShjZS5jYW5vbmljYWwoc2VtaU9wcykpLCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoIW9wczIuZXZlcnkoKHgpID0+IHguaXNWYWxpZCkpXG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMiwgb3BzMiwgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiKVxuICAgIHJldHVybiBjZS5hZGQob3BzMiwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGNlLm5lZyhvcHMyWzBdID8/IGNlLmVycm9yKFwibWlzc2luZ1wiKSwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTXVsdGlwbHlcIilcbiAgICByZXR1cm4gY2UubXVsKG9wczIsIG1ldGFkYXRhKTtcbiAgaWYgKGhlYWQyID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBjZS5kaXYob3BzMlswXSwgb3BzMlsxXSwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiUG93ZXJcIilcbiAgICByZXR1cm4gY2UucG93KG9wczJbMF0sIG9wczJbMV0sIG1ldGFkYXRhKTtcbiAgaWYgKGhlYWQyID09PSBcIlNxdWFyZVwiKVxuICAgIHJldHVybiBjZS5wb3cob3BzMlswXSwgY2UubnVtYmVyKDIpLCBtZXRhZGF0YSk7XG4gIGlmIChoZWFkMiA9PT0gXCJTcXJ0XCIpIHtcbiAgICBjb25zdCBvcDMgPSBvcHMyWzBdLmNhbm9uaWNhbDtcbiAgICBpZiAoaXNSYXRpb25hbChvcDMubnVtZXJpY1ZhbHVlKSlcbiAgICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgXCJTcXJ0XCIsIFtvcDNdLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IHRydWUgfSk7XG4gICAgcmV0dXJuIGNlLnBvdyhvcDMsIGNlLl9IQUxGLCBtZXRhZGF0YSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBvcHMyLCBtZXRhZGF0YSkge1xuICBpZiAodHlwZW9mIGhlYWQyICE9PSBcInN0cmluZ1wiKVxuICAgIGhlYWQyID0gaGVhZDIuZXZhbHVhdGUoKS5zeW1ib2wgPz8gaGVhZDI7XG4gIGlmICh0eXBlb2YgaGVhZDIgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBtYWtlTnVtZXJpY0Z1bmN0aW9uKGNlLCBoZWFkMiwgb3BzMiwgbWV0YWRhdGEpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmICghaGVhZDIuaXNWYWxpZClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIGhlYWQyLFxuICAgICAgICBvcHMyLm1hcCgoeCkgPT4gY2UuYm94KHgsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSksXG4gICAgICAgIHsgbWV0YWRhdGEsIGNhbm9uaWNhbDogZmFsc2UgfVxuICAgICAgKTtcbiAgfVxuICBjb25zdCBkZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMiwgY2UuY29udGV4dCk7XG4gIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIgfHwgIWRlZikge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihcbiAgICAgIGNlLFxuICAgICAgaGVhZDIsXG4gICAgICBmbGF0dGVuU2VxdWVuY2Uob3BzMi5tYXAoKHgpID0+IGNlLmJveCh4KSkpLFxuICAgICAgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiB0cnVlIH1cbiAgICApO1xuICB9XG4gIGxldCB4cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wczIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXBwbGljYWJsZShkZWYuaG9sZCwgb3BzMi5sZW5ndGggLSAxLCBpKSkge1xuICAgICAgeHMucHVzaChjZS5ib3gob3BzMltpXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB5ID0gY2UuYm94KG9wczJbaV0sIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICAgIGlmICh5LmhlYWQgPT09IFwiUmVsZWFzZUhvbGRcIilcbiAgICAgICAgeHMucHVzaCh5Lm9wMS5jYW5vbmljYWwpO1xuICAgICAgZWxzZVxuICAgICAgICB4cy5wdXNoKHkpO1xuICAgIH1cbiAgfVxuICBpZiAoIXhzLmV2ZXJ5KCh4KSA9PiB4LmlzVmFsaWQpKVxuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgaGVhZDIsIHhzLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICBpZiAoc2lnLmNhbm9uaWNhbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzaWcuY2Fub25pY2FsKGNlLCB4cyk7XG4gICAgICBpZiAocmVzdWx0KVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgaGVhZDIsIHhzLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICB9XG4gIHhzID0gZmxhdHRlblNlcXVlbmNlKHhzKTtcbiAgaWYgKGRlZi5hc3NvY2lhdGl2ZSlcbiAgICB4cyA9IGZsYXR0ZW5PcHMoeHMsIGhlYWQyKTtcbiAgaWYgKCF4cy5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKSlcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGhlYWQyLCB4cywgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgeHMgPSB2YWxpZGF0ZVNpZ25hdHVyZShzaWcuZG9tYWluLCB4cykgPz8geHM7XG4gIGlmICgheHMuZXZlcnkoKHgpID0+IHguaXNWYWxpZCkpXG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMiwgeHMsIHsgbWV0YWRhdGEsIGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gIGlmICh4cy5sZW5ndGggPT09IDEgJiYgeHNbMF0uaGVhZCA9PT0gaGVhZDIpIHtcbiAgICBpZiAoZGVmLmludm9sdXRpb24pXG4gICAgICByZXR1cm4geHNbMF0ub3AxO1xuICAgIGlmIChkZWYuaWRlbXBvdGVudClcbiAgICAgIHhzID0geHNbMF0ub3BzO1xuICB9XG4gIGlmICh4cy5sZW5ndGggPiAxICYmIGRlZi5jb21tdXRhdGl2ZSA9PT0gdHJ1ZSlcbiAgICB4cyA9IHhzLnNvcnQob3JkZXIpO1xuICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGhlYWQyLCB4cywgeyBtZXRhZGF0YSwgZGVmLCBjYW5vbmljYWw6IHRydWUgfSk7XG59XG5mdW5jdGlvbiBhcHBseShmbiwgYXJncykge1xuICBjb25zdCBjZSA9IGZuLmVuZ2luZTtcbiAgaWYgKGZuLmhlYWQgIT09IFwiTGFtYmRhXCIpXG4gICAgcmV0dXJuIGNlLl9mbihmbi5ldmFsdWF0ZSgpLCBhcmdzKTtcbiAgY29uc3Qgc3ViczIgPSB7XG4gICAgXCJfX1wiOiBjZS50dXBsZShhcmdzKSxcbiAgICBcIl8jXCI6IGNlLm51bWJlcihhcmdzLmxlbmd0aClcbiAgfTtcbiAgbGV0IG4gPSAxO1xuICBmb3IgKGNvbnN0IG9wMyBvZiBhcmdzKVxuICAgIHN1YnMyW2BfJHtuKyt9YF0gPSBvcDM7XG4gIHN1YnMyW1wiX1wiXSA9IHN1YnMyW1wiXzFcIl07XG4gIGNvbnN0IHNhdmVkQ29udGV4dCA9IGNlLmNvbnRleHQ7XG4gIGNlLmNvbnRleHQgPSBmbi5zY29wZSA/PyBudWxsO1xuICBjb25zdCByZXN1bHQgPSBmbi5zdWJzKHN1YnMyKTtcbiAgY2UuY29udGV4dCA9IHNhdmVkQ29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdC5vcDEuZXZhbHVhdGUoKTtcbn1cbmZ1bmN0aW9uIGhvbGRNYXAoeHMsIHNraXAsIGFzc29jaWF0aXZlSGVhZCwgZikge1xuICBpZiAoeHMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBbXTtcbiAgeHMgPSBmbGF0dGVuT3BzKHhzLCBhc3NvY2lhdGl2ZUhlYWQpO1xuICBpZiAoc2tpcCA9PT0gXCJhbGxcIilcbiAgICByZXR1cm4geHM7XG4gIGlmIChza2lwID09PSBcIm5vbmVcIikge1xuICAgIGNvbnN0IHJlc3VsdDIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICAgIGNvbnN0IGggPSB4LmhlYWQ7XG4gICAgICBpZiAoaCA9PT0gXCJIb2xkXCIpXG4gICAgICAgIHJlc3VsdDIucHVzaCh4KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBvcDMgPSBoID09PSBcIlJlbGVhc2VIb2xkXCIgPyB4Lm9wMSA6IHg7XG4gICAgICAgIGlmIChvcDMpIHtcbiAgICAgICAgICBjb25zdCB5ID0gZihvcDMpO1xuICAgICAgICAgIGlmICh5ICE9PSBudWxsKVxuICAgICAgICAgICAgcmVzdWx0Mi5wdXNoKHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGF0dGVuT3BzKHJlc3VsdDIsIGFzc29jaWF0aXZlSGVhZCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoeHNbaV0uaGVhZCA9PT0gXCJIb2xkXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHhzW2ldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHkgPSB2b2lkIDA7XG4gICAgICBpZiAoeHNbaV0uaGVhZCA9PT0gXCJSZWxlYXNlSG9sZFwiKVxuICAgICAgICB5ID0geHNbaV0ub3AxO1xuICAgICAgZWxzZSBpZiAoYXBwbGljYWJsZShza2lwLCB4cy5sZW5ndGggLSAxLCBpKSlcbiAgICAgICAgeSA9IHhzW2ldO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHQucHVzaCh4c1tpXSk7XG4gICAgICBpZiAoeSkge1xuICAgICAgICBjb25zdCB4ID0gZih5KTtcbiAgICAgICAgaWYgKHggIT09IG51bGwpXG4gICAgICAgICAgcmVzdWx0LnB1c2goeCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmbGF0dGVuT3BzKHJlc3VsdCwgYXNzb2NpYXRpdmVIZWFkKTtcbn1cbmZ1bmN0aW9uIGFwcGxpY2FibGUoc2tpcCwgY291bnQsIGluZGV4KSB7XG4gIGlmIChza2lwID09PSBcImFsbFwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHNraXAgPT09IFwibm9uZVwiKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoc2tpcCA9PT0gXCJmaXJzdFwiKVxuICAgIHJldHVybiBpbmRleCAhPT0gMDtcbiAgaWYgKHNraXAgPT09IFwicmVzdFwiKVxuICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgaWYgKHNraXAgPT09IFwibGFzdFwiKVxuICAgIHJldHVybiBpbmRleCAhPT0gY291bnQ7XG4gIGlmIChza2lwID09PSBcIm1vc3RcIilcbiAgICByZXR1cm4gaW5kZXggPT09IGNvdW50O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveGVkLW51bWJlci50c1xudmFyIGltcG9ydF9jb21wbGV4MTIgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2RvbWFpbi11dGlscy50c1xudmFyIGltcG9ydF9jb21wbGV4MTEgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbmZ1bmN0aW9uIGluZmVyTnVtZXJpY0RvbWFpbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgIHJldHVybiBcIkV4dGVuZGVkUmVhbE51bWJlclwiO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlID4gMClcbiAgICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgICBpZiAodmFsdWUgPCAwKVxuICAgICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICAgIHJldHVybiBcIkludGVnZXJcIjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID4gMClcbiAgICAgIHJldHVybiBcIlBvc2l0aXZlTnVtYmVyXCI7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHJldHVybiBcIk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpIHtcbiAgICBpZiAodmFsdWUuaXNOYU4oKSlcbiAgICAgIHJldHVybiBcIk51bWJlclwiO1xuICAgIGlmICghdmFsdWUuaXNGaW5pdGUoKSlcbiAgICAgIHJldHVybiBcIkV4dGVuZGVkUmVhbE51bWJlclwiO1xuICAgIGlmICh2YWx1ZS5pc0ludGVnZXIoKSkge1xuICAgICAgaWYgKHZhbHVlLmlzUG9zaXRpdmUoKSlcbiAgICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgICBpZiAodmFsdWUuaXNOZWdhdGl2ZSgpKVxuICAgICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICAgIHJldHVybiBcIkludGVnZXJcIjtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmlzUG9zaXRpdmUoKSlcbiAgICAgIHJldHVybiBcIlBvc2l0aXZlTnVtYmVyXCI7XG4gICAgaWYgKHZhbHVlLmlzTmVnYXRpdmUoKSlcbiAgICAgIHJldHVybiBcIk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTEuQ29tcGxleCkge1xuICAgIGNvbnN0IGMgPSB2YWx1ZTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoYy5pbSAhPT0gMCk7XG4gICAgaWYgKGMucmUgPT09IDApXG4gICAgICByZXR1cm4gXCJJbWFnaW5hcnlOdW1iZXJcIjtcbiAgICByZXR1cm4gXCJDb21wbGV4TnVtYmVyXCI7XG4gIH1cbiAgaWYgKGlzUmF0aW9uYWwodmFsdWUpKSB7XG4gICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSB2YWx1ZTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICB0eXBlb2YgbnVtZXIgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc05hTihudW1lcikgJiYgIU51bWJlci5pc05hTihkZW5vbSlcbiAgICApO1xuICAgIHJldHVybiBcIlJhdGlvbmFsTnVtYmVyXCI7XG4gIH1cbiAgcmV0dXJuIFwiTnVtYmVyXCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9udW1lcmljcy9wcmltZXMudHNcbnZhciBMQVJHRV9QUklNRSA9IDExMjU4OTk5MDY4NDI1OTc7XG5mdW5jdGlvbiBpc1ByaW1lKG4pIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8ICFOdW1iZXIuaXNGaW5pdGUobikgfHwgTnVtYmVyLmlzTmFOKG4pIHx8IG4gPD0gMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobiA8PSBMQVJHRVNUX1NNQUxMX1BSSU1FKVxuICAgIHJldHVybiBTTUFMTF9QUklNRVMuaGFzKG4pO1xuICBmb3IgKGNvbnN0IHNtYWxsUHJpbWUgb2YgU01BTExfUFJJTUVTKSB7XG4gICAgaWYgKG4gJSBzbWFsbFByaW1lID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChuID49IExBUkdFX1BSSU1FKSB7XG4gICAgcmV0dXJuIHByb2JhYmx5UHJpbWUobiwgMzApID8gdm9pZCAwIDogZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG4gPT09IGxlYXN0RmFjdG9yKG4pO1xufVxuZnVuY3Rpb24gbGVhc3RGYWN0b3Iobikge1xuICBpZiAobiA9PT0gMSlcbiAgICByZXR1cm4gMTtcbiAgaWYgKG4gJSAyID09PSAwKVxuICAgIHJldHVybiAyO1xuICBpZiAobiAlIDMgPT09IDApXG4gICAgcmV0dXJuIDM7XG4gIGlmIChuICUgNSA9PT0gMClcbiAgICByZXR1cm4gNTtcbiAgY29uc3QgbSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG4pKTtcbiAgbGV0IGkgPSA3O1xuICB3aGlsZSAoaSA8PSBtKSB7XG4gICAgaWYgKG4gJSBpID09PSAwKVxuICAgICAgcmV0dXJuIGk7XG4gICAgaWYgKG4gJSAoaSArIDQpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyA0O1xuICAgIGlmIChuICUgKGkgKyA2KSA9PT0gMClcbiAgICAgIHJldHVybiBpICsgNjtcbiAgICBpZiAobiAlIChpICsgMTApID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxMDtcbiAgICBpZiAobiAlIChpICsgMTIpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxMjtcbiAgICBpZiAobiAlIChpICsgMTYpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxNjtcbiAgICBpZiAobiAlIChpICsgMjIpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAyMjtcbiAgICBpZiAobiAlIChpICsgMjQpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAyNDtcbiAgICBpICs9IDMwO1xuICB9XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gcHJvYmFibHlQcmltZShuLCBrKSB7XG4gIGxldCBzID0gMCwgZCA9IG4gLSAxO1xuICB3aGlsZSAoZCAlIDIgPT09IDApIHtcbiAgICBkIC89IDI7XG4gICAgKytzO1xuICB9XG4gIFdpdG5lc3NMb29wOlxuICAgIGRvIHtcbiAgICAgIGxldCB4ID0gTWF0aC5wb3coMiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChuIC0gMykpLCBkKSAlIG47XG4gICAgICBpZiAoeCA9PT0gMSB8fCB4ID09PSBuIC0gMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICBmb3IgKGxldCBpID0gcyAtIDE7IGktLTsgKSB7XG4gICAgICAgIHggPSB4ICogeCAlIG47XG4gICAgICAgIGlmICh4ID09PSAxKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHggPT09IG4gLSAxKVxuICAgICAgICAgIGNvbnRpbnVlIFdpdG5lc3NMb29wO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gd2hpbGUgKC0tayk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1udW1iZXIudHNcbnZhciBCb3hlZE51bWJlciA9IGNsYXNzIF9Cb3hlZE51bWJlciBleHRlbmRzIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEJ5IHRoZSB0aW1lIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIHRoZSBgdmFsdWVgIHNob3VsZCBoYXZlIGJlZW5cbiAgICogc2NyZWVuZWQgZm9yIGNhc2VzIHdoZXJlIGl0J3MgYSB3ZWxsLWtub3duIHZhbHVlICgwLCBOYU4sICtJbmZpbml0eSxcbiAgICogZXRjLi4uKSBvciBub24tbm9ybWFsIChjb21wbGV4IG51bWJlciB3aXRoIGltID0gMCwgcmF0aW9uYWwgd2l0aFxuICAgKiBkZW5vbSA9IDEsIGV0Yy4uLikuXG4gICAqXG4gICAqIFRoaXMgaXMgZG9uZSBpbiBgY2UubnVtYmVyKClgLiBJbiBnZW5lcmFsLCB1c2UgYGNlLm51bWJlcigpYCByYXRoZXJcbiAgICogdGhhbiBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAqXG4gICAqIFdlIG1heSBzdG9yZSBhcyBhIG1hY2hpbmUgbnVtYmVyIGlmIGEgRGVjaW1hbCBpcyBwYXNzZWQgdGhhdCBpcyBpbiBtYWNoaW5lXG4gICAqIHJhbmdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihjZSwgb3B0aW9ucz8ubWV0YWRhdGEpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1JhdGlvbmFsKHZhbHVlKSkge1xuICAgICAgY29uc3QgW24sIGRdID0gdmFsdWU7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgIHR5cGVvZiBuICE9PSBcIm51bWJlclwiIHx8IE51bWJlci5pc0ludGVnZXIobikgJiYgTnVtYmVyLmlzSW50ZWdlcihkKSAmJiBkICE9PSBuICYmIGQgIT09IDFcbiAgICAgICk7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgICEodHlwZW9mIG4gPT09IFwiYmlnaW50XCIgJiYgdHlwZW9mIGQgPT0gXCJiaWdpbnRcIikgfHwgZCAhPT0gbiAmJiBkICE9PSBCaWdJbnQoMSlcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucz8uY2Fub25pY2FsID8/IHRydWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBjYW5vbmljYWxOdW1iZXIoY2UsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5faXNDYW5vbmljYWwgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5faXNDYW5vbmljYWwgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSB8fCAhTnVtYmVyLmlzTmFOKHZhbHVlLnJlKSAmJiAhTnVtYmVyLmlzTmFOKHZhbHVlLmltKSAmJiBjZS5jaG9wKHZhbHVlLmltKSAhPT0gMFxuICAgICAgKTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gY2Fub25pY2FsTnVtYmVyKGNlLCB2YWx1ZSk7XG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICBsZXQgaCA9IDA7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIGggPSBoYXNoQ29kZSh0aGlzLl92YWx1ZS50b1N0cmluZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIGggPSBoYXNoQ29kZShcbiAgICAgICAgdGhpcy5fdmFsdWUucmUudG9TdHJpbmcoKSArIFwiICtpIFwiICsgdGhpcy5fdmFsdWUuaW0udG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICBoID0gaGFzaENvZGUodGhpcy5fdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgZWxzZVxuICAgICAgaCA9IGhhc2hDb2RlKFxuICAgICAgICB0aGlzLl92YWx1ZVswXS50b1N0cmluZygpICsgXCIgLyBcIiArIHRoaXMuX3ZhbHVlWzFdLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgdGhpcy5faGFzaCA9IGg7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiTnVtYmVyXCI7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgaXNFeGFjdCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNJbnRlZ2VyKCk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KVxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUucmUpICYmIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUuaW0pO1xuICAgIHJldHVybiBpc1JhdGlvbmFsKHRoaXMuX3ZhbHVlKTtcbiAgfVxuICBnZXQgaXNDYW5vbmljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ2Fub25pY2FsO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbCh2YWwpIHtcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHZhbDtcbiAgfVxuICBnZXQgY29tcGxleGl0eSgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0IG51bWVyaWNWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICBpZiAodGhpcy5fZG9tYWluID09PSB2b2lkIDApXG4gICAgICB0aGlzLl9kb21haW4gPSB0aGlzLmVuZ2luZS5kb21haW4oaW5mZXJOdW1lcmljRG9tYWluKHRoaXMuX3ZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpbjtcbiAgfVxuICBnZXQganNvbigpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcih0aGlzLmVuZ2luZSwgdGhpcy5fdmFsdWUsIHtcbiAgICAgIGxhdGV4OiB0aGlzLl9sYXRleFxuICAgIH0pO1xuICB9XG4gIGdldCBzZ24oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlIDwgMClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlID4gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlLmlzWmVybygpKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGlmICh0aGlzLl92YWx1ZS5pc05lZ2F0aXZlKCkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICh0aGlzLl92YWx1ZS5pc1Bvc2l0aXZlKCkpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSB0aGlzLl92YWx1ZTtcbiAgICAgIGlmIChudW1lciA9PT0gMCAmJiBkZW5vbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAobnVtZXIgPCAwKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtZXIgPiAwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpc1NhbWUocmhzKSB7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZE51bWJlcikpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHR5cGVvZiByaHMuX3ZhbHVlICE9PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPT09IHJocy5fdmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpIHtcbiAgICAgIGlmICghKHJocy5fdmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmVxKHJocy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaHMuX3ZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgW3Joc04sIHJoc0RdID0gcmhzLl92YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZVswXSA9PT0gcmhzTiAmJiB0aGlzLl92YWx1ZVsxXSA9PT0gcmhzRDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSB7XG4gICAgICBpZiAoIShyaHMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmVxdWFscyhyaHMuX3ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRXF1YWwocmhzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTYW1lKHJocyk7XG4gIH1cbiAgbWF0Y2gocmhzLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFcXVhbFdpdGhUb2xlcmFuY2UocmhzLCBvcHRpb25zPy5udW1lcmljVG9sZXJhbmNlID8/IDApKVxuICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBDb21wYXJlIHRoaXMgd2l0aCBhbm90aGVyIEJveGVkTnVtYmVyLlxuICAgKiBgcmhzYCBtdXN0IGJlIGEgQm94ZWROdW1iZXIuIFVzZSBgaXNFcXVhbFdpdGhUb2xlcmFuY2UocmhzLk4oKSlgXG4gICAqIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIGlzRXF1YWxXaXRoVG9sZXJhbmNlKHJocywgdG9sZXJhbmNlKSB7XG4gICAgcmV0dXJuIHJocyBpbnN0YW5jZW9mIF9Cb3hlZE51bWJlciAmJiBzaWduRGlmZih0aGlzLCByaHMsIHRvbGVyYW5jZSkgPT09IDA7XG4gIH1cbiAgaXNMZXNzKHJocykge1xuICAgIGNvbnN0IHMgPSBzaWduRGlmZih0aGlzLCByaHMpO1xuICAgIGlmIChzID09PSB2b2lkIDApXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIHJldHVybiBzIDwgMDtcbiAgfVxuICBpc0xlc3NFcXVhbChyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8PSAwO1xuICB9XG4gIGlzR3JlYXRlcihyaHMpIHtcbiAgICByZXR1cm4gcmhzLmlzTGVzc0VxdWFsKHRoaXMpO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIHJldHVybiByaHMuaXNMZXNzKHRoaXMpO1xuICB9XG4gIC8qKiB4ID4gMCwgc2FtZSBhcyBgaXNHcmVhdGVyKDApYCAqL1xuICBnZXQgaXNQb3NpdGl2ZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID4gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA+IDA7XG4gIH1cbiAgLyoqIHggPj0gMCwgc2FtZSBhcyBgaXNHcmVhdGVyRXF1YWwoMClgICovXG4gIGdldCBpc05vbk5lZ2F0aXZlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPj0gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA+PSAwO1xuICB9XG4gIC8qKiB4IDwgMCwgc2FtZSBhcyBgaXNMZXNzKDApYCAqL1xuICBnZXQgaXNOZWdhdGl2ZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDwgMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8IDA7XG4gIH1cbiAgLyoqIHggPD0gMCwgc2FtZSBhcyBgaXNMZXNzRXF1YWwoMClgICovXG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPD0gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8PSAwO1xuICB9XG4gIGdldCBpc1plcm8oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pc1plcm8oKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNaZXJvKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc05vdFplcm8oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIXRoaXMuX3ZhbHVlLmlzWmVybygpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIHJldHVybiAhdGhpcy5fdmFsdWUuaXNaZXJvKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZ2V0IGlzT25lKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gMSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHModGhpcy5lbmdpbmUuX0JJR05VTV9PTkUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pbSA9PT0gMCAmJiB0aGlzLl92YWx1ZS5yZSA9PT0gMTtcbiAgICByZXR1cm4gaXNSYXRpb25hbE9uZSh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAtMSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHModGhpcy5lbmdpbmUuX0JJR05VTV9ORUdBVElWRV9PTkUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSlcbiAgICAgIHJldHVybiBpc1JhdGlvbmFsTmVnYXRpdmVPbmUodGhpcy5fdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHMoLTEpO1xuICB9XG4gIGdldCBpc09kZCgpIHtcbiAgICBpZiAodGhpcy5pc09uZSB8fCB0aGlzLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1plcm8pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzSW50ZWdlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlICUgMiAhPT0gMDtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZS5tb2QoMikuaXNaZXJvKCk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIGlmICh0aGlzLmlzT25lIHx8IHRoaXMuaXNOZWdhdGl2ZU9uZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1plcm8pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuaXNJbnRlZ2VyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgJSAyID09PSAwO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUubW9kKDIpLmlzWmVybygpO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW50ZWdlciB8fCAhdGhpcy5pc0Zpbml0ZSB8fCB0aGlzLmlzTm9uUG9zaXRpdmUgfHwgdGhpcy5pc09uZSB8fCB0aGlzLmlzWmVybylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIGlzUHJpbWUodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gaXNQcmltZSh0aGlzLl92YWx1ZS50b051bWJlcigpKTtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0NvbXBvc2l0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbnRlZ2VyIHx8ICF0aGlzLmlzRmluaXRlIHx8IHRoaXMuaXNOb25Qb3NpdGl2ZSB8fCB0aGlzLmlzT25lIHx8IHRoaXMuaXNaZXJvKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gIWlzUHJpbWUodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIWlzUHJpbWUodGhpcy5fdmFsdWUudG9OdW1iZXIoKSk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuICFOdW1iZXIuaXNGaW5pdGUodGhpcy5fdmFsdWUpICYmICFOdW1iZXIuaXNOYU4odGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIXRoaXMuX3ZhbHVlLmlzRmluaXRlKCkgJiYgIXRoaXMuX3ZhbHVlLmlzTmFOKCk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KVxuICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZS5pc0Zpbml0ZSgpICYmICF0aGlzLl92YWx1ZS5pc05hTigpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgaXNOYU4oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNOYU4oKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNOYU4oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzRmluaXRlKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0luZmluaXR5ICYmICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgaXNJbnRlZ2VyKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0aGlzLl92YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pc0ludGVnZXIoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzUmF0aW9uYWwoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICBpZiAodGhpcy5pc1JhdGlvbmFsKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIGlmICghdGhpcy5pc0Zpbml0ZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuY2hvcCh0aGlzLl92YWx1ZS5pbSkgPT09IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gUmVhbCBvciArLUluZmluaXR5XG4gIGdldCBpc0V4dGVuZGVkUmVhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5IHx8IHRoaXMuaXNSZWFsO1xuICB9XG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBpc0ltYWdpbmFyeSgpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpIHtcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLl92YWx1ZS5pbSAhPT0gMCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc0V4dGVuZGVkQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5IHx8ICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBjYW5vbmljYWwoKSB7XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLm51bWJlcihjYW5vbmljYWxOdW1iZXIodGhpcy5lbmdpbmUsIHRoaXMuX3ZhbHVlKSk7XG4gIH1cbiAgc2ltcGxpZnkoX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5jYW5vbmljYWw7XG4gIH1cbiAgTihfb3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGNvbnN0IFtudW1lciwgZGVub21dID0gdGhpcy5fdmFsdWU7XG4gICAgaWYgKHR5cGVvZiBudW1lciA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZGVub20gPT09IFwibnVtYmVyXCIgJiYgIWJpZ251bVByZWZlcnJlZChjZSkpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG51bWVyIC8gZGVub20pO1xuICAgIHJldHVybiBjZS5udW1iZXIoY2UuYmlnbnVtKG51bWVyKS5kaXYoY2UuYmlnbnVtKGRlbm9tKSkpO1xuICB9XG59O1xuZnVuY3Rpb24gY2Fub25pY2FsTnVtYmVyKGNlLCB2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsICYmIGlzSW5NYWNoaW5lUmFuZ2UodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZS50b051bWJlcigpO1xuICBpZiAoIWlzUmF0aW9uYWwodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgdmFsdWUgPSByZWR1Y2VkUmF0aW9uYWwodmFsdWUpO1xuICBpZiAoaXNCaWdSYXRpb25hbCh2YWx1ZSkpIHtcbiAgICBsZXQgW24yLCBkMl0gPSB2YWx1ZTtcbiAgICBpZiAobjIgPiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiAmJiBuMiA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIGQyID4gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgJiYgZDIgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICAgIHZhbHVlID0gW051bWJlcihuMiksIE51bWJlcihkMildO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGQyIDwgMClcbiAgICAgICAgW24yLCBkMl0gPSBbLW4yLCAtZDJdO1xuICAgICAgaWYgKGQyID09PSBCaWdJbnQoMSkpXG4gICAgICAgIHJldHVybiBjZS5iaWdudW0objIpO1xuICAgICAgaWYgKGQyID09PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgaWYgKG4yID09PSBkMilcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICByZXR1cm4gbjIgPCAwID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW24yLCBkMl07XG4gICAgfVxuICB9XG4gIGxldCBbbiwgZF0gPSB2YWx1ZTtcbiAgaWYgKE51bWJlci5pc05hTihuKSB8fCBOdW1iZXIuaXNOYU4oZCkpXG4gICAgcmV0dXJuIE5hTjtcbiAgaWYgKGQgPCAwKVxuICAgIFtuLCBkXSA9IFstbiwgLWRdO1xuICBpZiAoZCA9PT0gMSlcbiAgICByZXR1cm4gbjtcbiAgaWYgKGQgPT09IDApIHtcbiAgICBpZiAobiA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKG4pKVxuICAgICAgcmV0dXJuIE5hTjtcbiAgICBpZiAobiA8IDApXG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIHJldHVybiBJbmZpbml0eTtcbiAgfVxuICBpZiAobiA9PT0gMClcbiAgICByZXR1cm4gbjtcbiAgcmV0dXJuIFtuLCBkXTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94ZWQtc3RyaW5nLnRzXG52YXIgQm94ZWRTdHJpbmcgPSBjbGFzcyBfQm94ZWRTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBleHByLCBtZXRhZGF0YSkge1xuICAgIHN1cGVyKGNlLCBtZXRhZGF0YSk7XG4gICAgdGhpcy5fc3RyaW5nID0gZXhwci5ub3JtYWxpemUoKTtcbiAgICBjZS5fcmVnaXN0ZXIodGhpcyk7XG4gIH1cbiAgZ2V0IGhhc2goKSB7XG4gICAgcmV0dXJuIGhhc2hDb2RlKFwiU3RyaW5nXCIgKyB0aGlzLl9zdHJpbmcpO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uU3RyaW5nKHRoaXMuZW5naW5lLCB0aGlzLl9zdHJpbmcpO1xuICB9XG4gIGdldCBoZWFkKCkge1xuICAgIHJldHVybiBcIlN0cmluZ1wiO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbChfdmEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKFwiU3RyaW5nXCIpO1xuICB9XG4gIGdldCBjb21wbGV4aXR5KCkge1xuICAgIHJldHVybiAxOTtcbiAgfVxuICBnZXQgc3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJpbmc7XG4gIH1cbiAgaXNFcXVhbChyaHMpIHtcbiAgICByZXR1cm4gcmhzLnN0cmluZyA9PT0gdGhpcy5fc3RyaW5nO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICByZXR1cm4gcmhzLnN0cmluZyA9PT0gdGhpcy5fc3RyaW5nO1xuICB9XG4gIG1hdGNoKHJocywgX29wdGlvbnMpIHtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWRTdHJpbmcpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuX3N0cmluZyA9PT0gcmhzLl9zdHJpbmcpXG4gICAgICByZXR1cm4ge307XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveC50c1xuZnVuY3Rpb24gYm94TnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIgfHwgbnVtIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICByZXR1cm4gbmV3IEJveGVkTnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpO1xuICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pICYmIG51bS5sZW5ndGggPT09IDIgJiYgbnVtWzBdIGluc3RhbmNlb2YgRGVjaW1hbCAmJiBudW1bMV0gaW5zdGFuY2VvZiBEZWNpbWFsKSB7XG4gICAgaWYgKCFudW1bMF0uaXNJbnRlZ2VyKCkgfHwgIW51bVsxXS5pc0ludGVnZXIoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFycmF5IGFyZ3VtZW50IHRvIGBib3hOdW1iZXIoKWAgc2hvdWxkIGJlIHR3byBpbnRlZ2Vyc1wiKTtcbiAgICBudW0gPSBbYmlnaW50KG51bVswXS50b1N0cmluZygpKSwgYmlnaW50KG51bVsxXS50b1N0cmluZygpKV07XG4gIH1cbiAgaWYgKGlzUmF0aW9uYWwobnVtKSkge1xuICAgIGlmIChudW0ubGVuZ3RoICE9PSAyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFycmF5IGFyZ3VtZW50IHRvIGBib3hOdW1iZXIoKWAgc2hvdWxkIGJlIHR3byBpbnRlZ2VycyBvciB0d28gYmlnbnVtc1wiXG4gICAgICApO1xuICAgIGNvbnN0IFtuLCBkXSA9IG51bTtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwiYmlnaW50XCIgJiYgdHlwZW9mIGQgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgIGlmIChuID09PSBkKVxuICAgICAgICByZXR1cm4gZCA9PT0gQmlnSW50KDApID8gY2UuX05BTiA6IGNlLl9PTkU7XG4gICAgICBpZiAobiA9PT0gQmlnSW50KDApKVxuICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICBpZiAoZCA9PT0gQmlnSW50KDEpKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG4sIG9wdGlvbnMpO1xuICAgICAgaWYgKGQgPT09IEJpZ0ludCgtMSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoLW4sIG9wdGlvbnMpO1xuICAgICAgaWYgKG4gPT09IEJpZ0ludCgxKSAmJiBkID09PSBCaWdJbnQoMikpXG4gICAgICAgIHJldHVybiBjZS5fSEFMRjtcbiAgICAgIHJldHVybiBuZXcgQm94ZWROdW1iZXIoY2UsIFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbiAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZCAhPT0gXCJudW1iZXJcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBcnJheSBhcmd1bWVudCB0byBgYm94TnVtYmVyKClgIHNob3VsZCBiZSB0d28gaW50ZWdlcnMgb3IgdHdvIGJpZ251bXNcIlxuICAgICAgKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgIU51bWJlci5pc0ludGVnZXIoZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcnJheSBhcmd1bWVudCB0byBgYm94TnVtYmVyKClgIHNob3VsZCBiZSB0d28gaW50ZWdlcnNcIik7XG4gICAgaWYgKGQgPT09IG4pXG4gICAgICByZXR1cm4gZCA9PT0gMCA/IGNlLl9OQU4gOiBjZS5fT05FO1xuICAgIGlmIChuID09PSAwKVxuICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgIGlmIChkID09PSAxKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihuLCBvcHRpb25zKTtcbiAgICBpZiAoZCA9PT0gLTEpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKC1uLCBvcHRpb25zKTtcbiAgICBpZiAobiA9PT0gMSAmJiBkID09PSAyKVxuICAgICAgcmV0dXJuIGNlLl9IQUxGO1xuICAgIHJldHVybiBuZXcgQm94ZWROdW1iZXIoY2UsIFtuLCBkXSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTMuQ29tcGxleCkge1xuICAgIGlmIChudW0uaXNOYU4oKSlcbiAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgIGlmIChudW0uaXNaZXJvKCkpXG4gICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgaWYgKG51bS5pc0luZmluaXRlKCkpXG4gICAgICByZXR1cm4gY2UuX0NPTVBMRVhfSU5GSU5JVFk7XG4gICAgaWYgKGNlLmNob3AobnVtLmltKSA9PT0gMClcbiAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLnJlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbmV3IEJveGVkTnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpO1xuICB9XG4gIGxldCBzdHJOdW0gPSBcIlwiO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJzdHJpbmdcIilcbiAgICBzdHJOdW0gPSBudW07XG4gIGVsc2UgaWYgKHR5cGVvZiBudW0gPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBudW0pIHtcbiAgICBpZiAodHlwZW9mIG51bS5udW0gPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5udW0sIG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgbnVtLm51bSAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hdGhKU09OIGBudW1gIHByb3BlcnR5IHNob3VsZCBiZSBhIHN0cmluZyBvZiBkaWdpdHNcIik7XG4gICAgc3RyTnVtID0gbnVtLm51bTtcbiAgfVxuICBpZiAoc3RyTnVtKSB7XG4gICAgc3RyTnVtID0gc3RyTnVtLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKC9bMC05XVtuZF0kLy50ZXN0KHN0ck51bSkpXG4gICAgICBzdHJOdW0gPSBzdHJOdW0uc2xpY2UoMCwgLTEpO1xuICAgIHN0ck51bSA9IHN0ck51bS5yZXBsYWNlKC9bXFx1MDAwOS1cXHUwMDBkXFx1MDAyMFxcdTAwYTBdL2csIFwiXCIpO1xuICAgIGlmIChzdHJOdW0gPT09IFwibmFuXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoc3RyTnVtID09PSBcImluZmluaXR5XCIgfHwgc3RyTnVtID09PSBcIitpbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAoc3RyTnVtID09PSBcIi1pbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAoc3RyTnVtID09PSBcIjBcIilcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBpZiAoc3RyTnVtID09PSBcIjFcIilcbiAgICAgIHJldHVybiBjZS5fT05FO1xuICAgIGlmIChzdHJOdW0gPT09IFwiLTFcIilcbiAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfT05FO1xuICAgIGlmICgvXFwoWzAtOV0rXFwpLy50ZXN0KHN0ck51bSkpIHtcbiAgICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IHN0ck51bS5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4rKT8kLykgPz8gW107XG4gICAgICBzdHJOdW0gPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwoY2UucHJlY2lzaW9uIC8gcmVwZWF0Lmxlbmd0aCkpICsgKHRyYWlsID8/IFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYm94TnVtYmVyKGNlLCBjZS5iaWdudW0oc3RyTnVtKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBib3hIb2xkKGNlLCBleHByLCBvcHRpb25zKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBjZS5lcnJvcihcIm1pc3NpbmdcIik7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pXG4gICAgcmV0dXJuIGV4cHI7XG4gIGV4cHIgPSBtaXNzaW5nSWZFbXB0eShleHByKTtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBib3goY2UsIGV4cHIsIG9wdGlvbnMpO1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgIGNvbnN0IGJveGVkID0gZXhwci5tYXAoKHgpID0+IGJveEhvbGQoY2UsIHgsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGJveGVkWzBdLCBib3hlZC5zbGljZSgxKSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKFwiZGljdFwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZXhwci5kaWN0KTtcbiAgICBpZiAoXCJmblwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gYm94SG9sZChjZSwgZXhwci5mbiwgb3B0aW9ucyk7XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIGV4cHIuc3RyKTtcbiAgICBpZiAoXCJzeW1cIiBpbiBleHByKVxuICAgICAgcmV0dXJuIGJveChjZSwgZXhwci5zeW0sIG9wdGlvbnMpO1xuICAgIGlmIChcIm51bVwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gYm94KGNlLCBleHByLm51bSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGJveChjZSwgZXhwciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBib3hGdW5jdGlvbihjZSwgaGVhZDIsIG9wczIsIG9wdGlvbnMpIHtcbiAgaWYgKGhlYWQyID09PSBcIkhvbGRcIikge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgXCJIb2xkXCIsIFtib3hIb2xkKGNlLCBvcHMyWzBdLCBvcHRpb25zKV0sIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjYW5vbmljYWw6IHRydWVcbiAgICB9KTtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiRXJyb3JcIiB8fCBoZWFkMiA9PT0gXCJFcnJvckNvZGVcIikge1xuICAgIHJldHVybiBjZS5fZm4oXG4gICAgICBoZWFkMixcbiAgICAgIG9wczIubWFwKCh4KSA9PiBjZS5ib3goeCwgeyBjYW5vbmljYWw6IGZhbHNlIH0pKSxcbiAgICAgIG9wdGlvbnMubWV0YWRhdGFcbiAgICApO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEb21haW5cIilcbiAgICByZXR1cm4gY2UuZG9tYWluKG9wczJbMF0sIG9wdGlvbnMubWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTnVtYmVyXCIgJiYgb3BzMi5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuIGJveChjZSwgb3BzMlswXSwgb3B0aW9ucyk7XG4gIGlmIChoZWFkMiA9PT0gXCJTdHJpbmdcIikge1xuICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIFwiXCIsIG9wdGlvbnMubWV0YWRhdGEpO1xuICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoXG4gICAgICBjZSxcbiAgICAgIG9wczIubWFwKCh4KSA9PiBhc1N0cmluZyh4KSA/PyBcIlwiKS5qb2luKFwiXCIpLFxuICAgICAgb3B0aW9ucy5tZXRhZGF0YVxuICAgICk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIlN5bWJvbFwiICYmIG9wczIubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBjZS5zeW1ib2wob3BzMi5tYXAoKHgpID0+IGFzU3RyaW5nKHgpID8/IFwiXCIpLmpvaW4oXCJcIiksIG9wdGlvbnMpO1xuICB9XG4gIGlmICgoaGVhZDIgPT09IFwiRGl2aWRlXCIgfHwgaGVhZDIgPT09IFwiUmF0aW9uYWxcIikgJiYgb3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAob3BzMlswXSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uICYmIG9wczJbMV0gaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikge1xuICAgICAgaWYgKGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIikge1xuICAgICAgICBjb25zdCBbZm4sIGZkXSA9IFthc0Zsb2F0KG9wczJbMF0pLCBhc0Zsb2F0KG9wczJbMV0pXTtcbiAgICAgICAgaWYgKGZuICE9PSBudWxsICYmIE51bWJlci5pc0ludGVnZXIoZm4pICYmIGZkICE9PSBudWxsICYmIE51bWJlci5pc0ludGVnZXIoZmQpKVxuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoW2ZuLCBmZF0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgW24sIGRdID0gW2FzQmlnaW50KG9wczJbMF0pLCBhc0JpZ2ludChvcHMyWzFdKV07XG4gICAgICBpZiAobiAhPT0gbnVsbCAmJiBkICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtuLCBkXSA9IFtcbiAgICAgICAgYmlnaW50VmFsdWUoY2UsIG9wczJbMF0pLFxuICAgICAgICBiaWdpbnRWYWx1ZShjZSwgb3BzMlsxXSlcbiAgICAgIF07XG4gICAgICBpZiAobiAhPT0gbnVsbCAmJiBkICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGhlYWQyID0gXCJEaXZpZGVcIjtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiQ29tcGxleFwiKSB7XG4gICAgaWYgKG9wczIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBvcDEyID0gYm94KGNlLCBvcHMyWzBdLCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IGltID0gYXNGbG9hdChvcDEyKTtcbiAgICAgIGlmIChpbSAhPT0gbnVsbCAmJiBpbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGltKSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY2UubXVsKFtvcDEyLCBjZS5fSV0pO1xuICAgIH1cbiAgICBpZiAob3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IG9wMTIgPSBib3goY2UsIG9wczJbMF0sIG9wdGlvbnMpO1xuICAgICAgY29uc3Qgb3AyMiA9IGJveChjZSwgb3BzMlsxXSwgb3B0aW9ucyk7XG4gICAgICBjb25zdCByZSA9IGFzRmxvYXQob3AxMik7XG4gICAgICBjb25zdCBpbSA9IGFzRmxvYXQob3AyMik7XG4gICAgICBpZiAoaW0gIT09IG51bGwgJiYgcmUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGltID09PSAwICYmIHJlID09PSAwKVxuICAgICAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICAgICAgaWYgKGltICE9PSBudWxsICYmIGltICE9PSAwKVxuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChyZSwgaW0pLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG9wMTI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2UuYWRkKFtvcDEyLCBjZS5tdWwoW29wMjIsIGNlLl9JXSldLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB9XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIk5lZ2F0ZVwiICYmIG9wczIubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3Qgb3AxMiA9IG9wczJbMF07XG4gICAgaWYgKHR5cGVvZiBvcDEyID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcigtb3AxMiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wMTIgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDEyLm5lZygpLCBvcHRpb25zKTtcbiAgICBjb25zdCBudW0gPSBjZS5ib3gob3AxMiwgb3B0aW9ucykubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKC1udW0sIG9wdGlvbnMpO1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLm5lZygpLCBvcHRpb25zKTtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEzLkNvbXBsZXgpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLm5lZygpKTtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG51bSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobmVnKG51bSkpO1xuICAgIH1cbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiRGljdGlvbmFyeVwiKSB7XG4gICAgY29uc3QgZGljdCA9IHt9O1xuICAgIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGNlLmJveChvcDMpO1xuICAgICAgY29uc3QgaGVhZDMgPSBhcmcuaGVhZDtcbiAgICAgIGlmIChoZWFkMyA9PT0gXCJLZXlWYWx1ZVBhaXJcIiB8fCBoZWFkMyA9PT0gXCJQYWlyXCIgfHwgaGVhZDMgPT09IFwiVHVwbGVcIiAmJiBhcmcubm9wcyA9PT0gMikge1xuICAgICAgICBjb25zdCBrZXkgPSBhcmcub3AxO1xuICAgICAgICBpZiAoa2V5LmlzVmFsaWQgJiYgIWtleS5pc05vdGhpbmcpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZy5vcDI7XG4gICAgICAgICAgbGV0IGsgPSBrZXkuc3ltYm9sID8/IGtleS5zdHJpbmc7XG4gICAgICAgICAgaWYgKCFrICYmIChrZXkubnVtZXJpY1ZhbHVlICE9PSBudWxsIHx8IGtleS5zdHJpbmcpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdHlwZW9mIGtleS5udW1lcmljVmFsdWUgPT09IFwibnVtYmVyXCIgPyBrZXkubnVtZXJpY1ZhbHVlIDogYXNTbWFsbEludGVnZXIoa2V5KTtcbiAgICAgICAgICAgIGlmIChuICYmIE51bWJlci5pc0Zpbml0ZShuKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pKVxuICAgICAgICAgICAgICBrID0gbi50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaylcbiAgICAgICAgICAgIGRpY3Rba10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZGljdCwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY2Fub25pY2FsKVxuICAgIHJldHVybiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBvcHMyLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKFxuICAgIGNlLFxuICAgIGhlYWQyLFxuICAgIG9wczIubWFwKCh4KSA9PiBib3goY2UsIHgsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSksXG4gICAgb3B0aW9uc1xuICApO1xufVxuZnVuY3Rpb24gYm94KGNlLCBleHByLCBvcHRpb25zKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gY2UuX2ZuKFwiU2VxdWVuY2VcIiwgW10pO1xuICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICBpZiAoZXhwciBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIHJldHVybiBvcHRpb25zLmNhbm9uaWNhbCA/IGV4cHIuY2Fub25pY2FsIDogZXhwcjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpIHtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwoZXhwcikpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGV4cHJbMF0pICYmIE51bWJlci5pc0ludGVnZXIoZXhwclsxXSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgICByZXR1cm4gYm94RnVuY3Rpb24oY2UsIFwiRGl2aWRlXCIsIGV4cHIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdSYXRpb25hbChleHByKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgaWYgKHR5cGVvZiBleHByWzBdID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIGJveEZ1bmN0aW9uKGNlLCBleHByWzBdLCBleHByLnNsaWNlKDEpLCBvcHRpb25zKTtcbiAgICBjb25zdCBvcHMyID0gZXhwci5zbGljZSgxKS5tYXAoKHgpID0+IGJveChjZSwgeCwgb3B0aW9ucykpO1xuICAgIGNvbnN0IGhlYWQyID0gYm94KGNlLCBleHByWzBdLCBvcHRpb25zKTtcbiAgICBpZiAoaGVhZDIuc3ltYm9sKVxuICAgICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMi5zeW1ib2wsIG9wczIpO1xuICAgIHJldHVybiBhcHBseShoZWFkMiwgb3BzMik7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm51bWJlclwiIHx8IGV4cHIgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEzLkNvbXBsZXggfHwgZXhwciBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgcmV0dXJuIGNlLm51bWJlcihleHByKTtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGV4cHIuc3RhcnRzV2l0aChcIidcIikgJiYgZXhwci5lbmRzV2l0aChcIidcIikpXG4gICAgICByZXR1cm4gbmV3IEJveGVkU3RyaW5nKGNlLCBleHByLnNsaWNlKDEsIC0xKSk7XG4gICAgaWYgKC9eWystXT9bMC05XS8udGVzdChleHByKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgaWYgKCFpc1ZhbGlkSWRlbnRpZmllcihleHByKSlcbiAgICAgIHJldHVybiBjZS5lcnJvcihcImludmFsaWQtaWRlbnRpZmllclwiLCB7IHN0cjogZXhwciB9KTtcbiAgICByZXR1cm4gY2Uuc3ltYm9sKGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbGF0ZXg6IGV4cHIubGF0ZXgsXG4gICAgICB3aWtpZGF0YTogZXhwci53aWtpZGF0YVxuICAgIH07XG4gICAgaWYgKFwiZGljdFwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZXhwci5kaWN0LCB7IGNhbm9uaWNhbDogdHJ1ZSwgbWV0YWRhdGEgfSk7XG4gICAgaWYgKFwiZm5cIiBpbiBleHByKSB7XG4gICAgICBpZiAodHlwZW9mIGV4cHIuZm5bMF0gPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBib3hGdW5jdGlvbihjZSwgZXhwci5mblswXSwgZXhwci5mbi5zbGljZSgxKSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBib3goY2UsIGV4cHIuZm5bMF0sIG9wdGlvbnMpLFxuICAgICAgICBleHByLmZuLnNsaWNlKDEpLm1hcCgoeCkgPT4gYm94KGNlLCB4LCBvcHRpb25zKSksXG4gICAgICAgIHsgbWV0YWRhdGEgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIGV4cHIuc3RyLCBtZXRhZGF0YSk7XG4gICAgaWYgKFwic3ltXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBjZS5zeW1ib2woZXhwci5zeW0sIG9wdGlvbnMpO1xuICAgIGlmIChcIm51bVwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBjZS5zeW1ib2woXCJVbmRlZmluZWRcIik7XG59XG5mdW5jdGlvbiBhc1N0cmluZyhleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZXhwcjtcbiAgaWYgKGV4cHIgaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikge1xuICAgIHJldHVybiBleHByLnN0cmluZyA/PyBleHByLnN5bWJvbCA/PyBleHByLnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBleHByLnN0cjtcbiAgICBpZiAoXCJmblwiIGluIGV4cHIgJiYgZXhwci5mblswXSA9PT0gXCJTdHJpbmdcIiAmJiB0eXBlb2YgZXhwci5mblsxXSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBleHByLmZuWzFdO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgaWYgKGV4cHJbMF0gPT09IFwiU3RyaW5nXCIgJiYgdHlwZW9mIGV4cHJbMV0gPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gZXhwclsxXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL251bWVyaWNzL251bWVyaWMtY29tcGxleC50c1xuZnVuY3Rpb24gZ2FtbWEzKGMpIHtcbiAgcmV0dXJuIGM7XG59XG5mdW5jdGlvbiBsbmdhbW1hMyhjKSB7XG4gIHJldHVybiBjO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9hcml0aG1ldGljLXBvd2VyLnRzXG52YXIgaW1wb3J0X2NvbXBsZXgxNSA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvdXRpbHMudHNcbnZhciBpbXBvcnRfY29tcGxleDE0ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBtYWtlUG9zaXRpdmUoZXhwcikge1xuICBpZiAoZXhwci5oZWFkID09PSBcIk5lZ2F0ZVwiKVxuICAgIHJldHVybiBbLTEsIGV4cHIub3AxXTtcbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobiA9PT0gbnVsbClcbiAgICByZXR1cm4gWzEsIGV4cHJdO1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgbiA8IDApXG4gICAgcmV0dXJuIFstMSwgY2UubnVtYmVyKC1uKV07XG4gIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0ICYmIG4uaXNOZWdhdGl2ZSgpKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihuLm5lZygpKV07XG4gIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNC5kZWZhdWx0ICYmIG4ucmUgPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihjZS5jb21wbGV4KC1uLnJlLCAtbi5pbSkpXTtcbiAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKG4pICYmIG5bMF0gPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihbLW5bMF0sIG5bMV1dKV07XG4gIGlmIChpc0JpZ1JhdGlvbmFsKG4pICYmIG5bMF0gPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihbLW5bMF0sIG5bMV1dKV07XG4gIHJldHVybiBbMSwgZXhwcl07XG59XG5mdW5jdGlvbiBhcHBseTIoZXhwciwgZm4sIGJpZ0ZuLCBjb21wbGV4Rm4pIHtcbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQobiAhPT0gbnVsbCk7XG4gIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpICYmIGJpZ0ZuKVxuICAgICAgcmV0dXJuIGNlLmNob3AoYmlnRm4oY2UuYmlnbnVtKG4pKSk7XG4gICAgcmV0dXJuIGNlLmNob3AoZm4obikpO1xuICB9XG4gIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuPy4obikgPz8gZm4obi50b051bWJlcigpKSk7XG4gIGlmIChpc01hY2hpbmVSYXRpb25hbChuKSkge1xuICAgIGlmICghYmlnbnVtUHJlZmVycmVkKGNlKSB8fCAhYmlnRm4pXG4gICAgICByZXR1cm4gY2UuY2hvcChmbihuWzBdIC8gblsxXSkpO1xuICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuKGNlLmJpZ251bShuWzBdKS5kaXYoblsxXSkpKTtcbiAgfVxuICBpZiAoaXNCaWdSYXRpb25hbChuKSkge1xuICAgIGlmIChiaWdGbilcbiAgICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuKGNlLmJpZ251bShuWzBdKS5kaXYoY2UuYmlnbnVtKG5bMV0pKSkpO1xuICAgIHJldHVybiBjZS5jaG9wKGZuKE51bWJlcihuWzBdKSAvIE51bWJlcihuWzFdKSkpO1xuICB9XG4gIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNC5kZWZhdWx0KSB7XG4gICAgaWYgKCFjb21wbGV4Rm4gfHwgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBOYU47XG4gICAgcmV0dXJuIGNlLmNob3AoY29tcGxleEZuKG4pKTtcbiAgfVxuICByZXR1cm4gTmFOO1xufVxuZnVuY3Rpb24gYXBwbHlOKGV4cHIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSB7XG4gIGlmICgoZXhwcj8ubnVtZXJpY1ZhbHVlID8/IG51bGwpID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIHJldHVybiBleHByLmVuZ2luZS5udW1iZXIoYXBwbHkyKGV4cHIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSk7XG59XG5mdW5jdGlvbiBhcHBseTIyKGV4cHIxLCBleHByMiwgZm4sIGJpZ0ZuLCBjb21wbGV4Rm4pIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGV4cHIxLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBleHByMi5udW1lcmljVmFsdWUgIT09IG51bGwpO1xuICBjb25zdCBjZSA9IGV4cHIxLmVuZ2luZTtcbiAgbGV0IG0xID0gZXhwcjEubnVtZXJpY1ZhbHVlO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobTEpKVxuICAgIG0xID0gbTFbMF0gLyBtMVsxXTtcbiAgbGV0IG0yID0gZXhwcjIubnVtZXJpY1ZhbHVlO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobTIpKVxuICAgIG0yID0gbTJbMF0gLyBtMlsxXTtcbiAgaWYgKCFiaWdudW1QcmVmZXJyZWQoY2UpICYmIHR5cGVvZiBtMSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgbTIgPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIGZuKG0xLCBtMik7XG4gIGxldCBiMSA9IHZvaWQgMDtcbiAgaWYgKG0xIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIGIxID0gbTE7XG4gIGVsc2UgaWYgKGlzQmlnUmF0aW9uYWwobTEpKVxuICAgIGIxID0gY2UuYmlnbnVtKG0xWzBdKS5kaXYoY2UuYmlnbnVtKG0xWzFdKSk7XG4gIGVsc2UgaWYgKG0xICE9PSBudWxsICYmIHR5cGVvZiBtMSA9PT0gXCJudW1iZXJcIilcbiAgICBiMSA9IGNlLmJpZ251bShtMSk7XG4gIGxldCBiMiA9IHZvaWQgMDtcbiAgaWYgKG0yIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIGIyID0gbTI7XG4gIGVsc2UgaWYgKGlzQmlnUmF0aW9uYWwobTIpKVxuICAgIGIxID0gY2UuYmlnbnVtKG0yWzBdKS5kaXYoY2UuYmlnbnVtKG0yWzFdKSk7XG4gIGVsc2UgaWYgKG0yICE9PSBudWxsICYmIHR5cGVvZiBtMiA9PT0gXCJudW1iZXJcIilcbiAgICBiMiA9IGNlLmJpZ251bShtMik7XG4gIGlmIChiMSAmJiBiMilcbiAgICByZXR1cm4gYmlnRm4/LihiMSwgYjIpID8/IGZuKGIxLnRvTnVtYmVyKCksIGIyLnRvTnVtYmVyKCkpO1xuICBpZiAobTEgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE0LmRlZmF1bHQgfHwgbTIgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE0LmRlZmF1bHQpIHtcbiAgICBpZiAoIWNvbXBsZXhGbiB8fCAhY29tcGxleEFsbG93ZWQoY2UpKVxuICAgICAgcmV0dXJuIE5hTjtcbiAgICByZXR1cm4gY29tcGxleEZuKFxuICAgICAgY2UuY29tcGxleChtMSA/PyBiMT8udG9OdW1iZXIoKSA/PyBOYU4pLFxuICAgICAgY2UuY29tcGxleChtMiA/PyBiMj8udG9OdW1iZXIoKSA/PyBOYU4pXG4gICAgKTtcbiAgfVxuICByZXR1cm4gTmFOO1xufVxuZnVuY3Rpb24gYXBwbHkyTihleHByMSwgZXhwcjIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSB7XG4gIGlmIChleHByMS5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgZXhwcjIubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIHJldHVybiBleHByMS5lbmdpbmUubnVtYmVyKGFwcGx5MjIoZXhwcjEsIGV4cHIyLCBmbiwgYmlnRm4sIGNvbXBsZXhGbikpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9hcml0aG1ldGljLXBvd2VyLnRzXG5mdW5jdGlvbiBjYW5vbmljYWxQb3dlcihjZSwgYmFzZSwgZXhwb25lbnQsIG1ldGFkYXRhKSB7XG4gIGlmIChleHBvbmVudC5zeW1ib2wgPT09IFwiQ29tcGxleEluZmluaXR5XCIpXG4gICAgcmV0dXJuIGNlLl9OQU47XG4gIGlmIChleHBvbmVudC5pc1plcm8pXG4gICAgcmV0dXJuIGNlLl9PTkU7XG4gIGlmIChleHBvbmVudC5pc09uZSlcbiAgICByZXR1cm4gYmFzZTtcbiAgaWYgKGV4cG9uZW50LmlzTmVnYXRpdmVPbmUpXG4gICAgcmV0dXJuIGNlLmludihiYXNlKTtcbiAgaWYgKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmIChiYXNlLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbnVtQmFzZSA9IGFzRmxvYXQoYmFzZSk7XG4gICAgICBpZiAobnVtQmFzZSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGNlLl9PTkU7XG4gICAgICBpZiAobnVtQmFzZSA9PT0gMCkge1xuICAgICAgICBpZiAoZXhwb25lbnQuaXNQb3NpdGl2ZSlcbiAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgIGlmIChleHBvbmVudC5pc05lZ2F0aXZlKVxuICAgICAgICAgIHJldHVybiBjZS5fQ09NUExFWF9JTkZJTklUWTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvbmVudC5pc05lZ2F0aXZlT25lKVxuICAgICAgICByZXR1cm4gY2UuaW52KGJhc2UpO1xuICAgICAgY29uc3QgZSA9IGFzRmxvYXQoZXhwb25lbnQpO1xuICAgICAgaWYgKGUgPT09IDAuNSB8fCBlID09PSAtMC41KSB7XG4gICAgICAgIGNvbnN0IGIgPSBhc1NtYWxsSW50ZWdlcihiYXNlKTtcbiAgICAgICAgaWYgKGIgIT09IG51bGwgJiYgYiA+IDApIHtcbiAgICAgICAgICBjb25zdCBbY29lZiwgcmFkaWNhbmRdID0gZmFjdG9yUG93ZXIoYiwgMik7XG4gICAgICAgICAgaWYgKHJhZGljYW5kID09PSAxICYmIGNvZWYgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAoY29lZiAhPT0gMSkge1xuICAgICAgICAgICAgaWYgKHJhZGljYW5kID09PSAxKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGUgPj0gMCA/IGNvZWYgOiBbMSwgY29lZl0pO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgICAgIGNlLm51bWJlcihjb2VmKSxcbiAgICAgICAgICAgICAgY2UuX2ZuKFwiU3FydFwiLCBbY2UubnVtYmVyKHJhZGljYW5kKV0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGUgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlNxcnRcIiwgW2Jhc2VdLCBtZXRhZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGNlLmludihjZS5fZm4oXCJTcXJ0XCIsIFtiYXNlXSksIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlBvd2VyXCIsIFtiYXNlLCBjZS5fSEFMRl0sIG1ldGFkYXRhKTtcbiAgICAgICAgcmV0dXJuIGNlLl9mbihcIlBvd2VyXCIsIFtiYXNlLCBjZS5udW1iZXIoWy0xLCAyXSldLCBtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZS5pc0luZmluaXR5KSB7XG4gICAgICAgIGlmIChleHBvbmVudC5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE1LmRlZmF1bHQpIHtcbiAgICAgICAgICBjb25zdCByZSA9IGV4cG9uZW50Lm51bWVyaWNWYWx1ZS5yZTtcbiAgICAgICAgICBpZiAocmUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICBpZiAocmUgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgICAgICAgIGlmIChyZSA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX0NPTVBMRVhfSU5GSU5JVFk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2UuaXNOZWdhdGl2ZSkge1xuICAgICAgICAgIGlmIChleHBvbmVudC5pc0luZmluaXR5KVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZS5pc1Bvc2l0aXZlKSB7XG4gICAgICAgICAgaWYgKGV4cG9uZW50LmlzTmVnYXRpdmVPbmUpXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKGV4cG9uZW50LmlzSW5maW5pdHkpXG4gICAgICAgICAgICByZXR1cm4gZXhwb25lbnQuaXNOZWdhdGl2ZSA/IGNlLl9aRVJPIDogY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXhwb25lbnQuaXNJbmZpbml0eSAmJiAoYmFzZS5pc09uZSB8fCBiYXNlLmlzTmVnYXRpdmVPbmUpKVxuICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICB9XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJQb3dlclwiICYmIGJhc2Uub3AxLmlzUmVhbCkge1xuICAgIGNvbnN0IGEgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGIgPSBhc1NtYWxsSW50ZWdlcihiYXNlLm9wMik7XG4gICAgICBpZiAoYiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5udW1iZXIoYSAqIGIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhc2Uub3AxLmlzTm9uTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGFyID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgICBpZiAoYXIpIHtcbiAgICAgICAgY29uc3QgYnIgPSBhc1JhdGlvbmFsKGJhc2Uub3AyKTtcbiAgICAgICAgaWYgKGJyKVxuICAgICAgICAgIHJldHVybiBjZS5wb3coYmFzZS5vcDEsIGNlLm51bWJlcihtdWwyKGFyLCBicikpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgY29uc3QgZSA9IGFzU21hbGxJbnRlZ2VyKGV4cG9uZW50KTtcbiAgICBpZiAoZSAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5fZm4oXG4gICAgICAgIFwiTXVsdGlwbHlcIixcbiAgICAgICAgYmFzZS5vcHMubWFwKCh4KSA9PiBjZS5wb3coeCwgZXhwb25lbnQpKVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gY2UuX2ZuKFwiUG93ZXJcIiwgW2Jhc2UsIGV4cG9uZW50XSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gc3F1YXJlKGNlLCBiYXNlKSB7XG4gIGNvbnN0IG51bSA9IGJhc2UubnVtZXJpY1ZhbHVlO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gY2UubnVtYmVyKG51bSAqIG51bSk7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgcmV0dXJuIGNlLm51bWJlcihudW0ucG93KDIpKTtcbiAgaWYgKG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTUuZGVmYXVsdClcbiAgICByZXR1cm4gY2UubnVtYmVyKG51bS5wb3coMikpO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICByZXR1cm4gY2UubnVtYmVyKFtudW1bMV0gKiBudW1bMV0sIG51bVswXSAqIG51bVswXV0pO1xuICBpZiAoaXNCaWdSYXRpb25hbChudW0pKVxuICAgIHJldHVybiBjZS5udW1iZXIoW251bVsxXSAqIG51bVsxXSwgbnVtWzBdICogbnVtWzBdXSk7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiTXVsdGlwbHlcIilcbiAgICByZXR1cm4gY2UuX2ZuKFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgYmFzZS5vcHMubWFwKCh4KSA9PiBzcXVhcmUoY2UsIHgpKVxuICAgICk7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiUG93ZXJcIikge1xuICAgIGNvbnN0IGV4cDIgPSBhc1NtYWxsSW50ZWdlcihiYXNlLm9wMik7XG4gICAgaWYgKGV4cDIgIT09IG51bGwpXG4gICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5udW1iZXIoZXhwMiAqIDIpKTtcbiAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5tdWwoW2NlLm51bWJlcigyKSwgYmFzZS5vcDJdKSk7XG4gIH1cbiAgcmV0dXJuIGNlLnBvdyhiYXNlLCBjZS5udW1iZXIoMikpO1xufVxuZnVuY3Rpb24gbnVtRXZhbFBvd2VyKGNlLCBiYXNlLCBleHBvbmVudCkge1xuICBpZiAoYmFzZS5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgZXhwb25lbnQubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChiYXNlLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTUuZGVmYXVsdCkge1xuICAgIGlmIChleHBvbmVudC5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE1LmRlZmF1bHQpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGJhc2UubnVtZXJpY1ZhbHVlLnBvdyhleHBvbmVudC5udW1lcmljVmFsdWUpKTtcbiAgICByZXR1cm4gY2UubnVtYmVyKGJhc2UubnVtZXJpY1ZhbHVlLnBvdyhhc0Zsb2F0KGV4cG9uZW50KSA/PyBOYU4pKTtcbiAgfVxuICBpZiAoZXhwb25lbnQubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNS5kZWZhdWx0KSB7XG4gICAgY29uc3QgYiA9IGFzRmxvYXQoYmFzZSkgPz8gbnVsbDtcbiAgICBpZiAoYiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChiKS5wb3coZXhwb25lbnQubnVtZXJpY1ZhbHVlKSk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBjb25zdCBpbnZFeHAgPSByb290RXhwKGV4cG9uZW50KTtcbiAgaWYgKGJpZ251bVByZWZlcnJlZChjZSkgfHwgYmFzZS5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgfHwgZXhwb25lbnQubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgY29uc3QgYmlnQmFzZSA9IGFzQmlnbnVtKGJhc2UpO1xuICAgIGNvbnN0IGJpZ0V4cCA9IGFzQmlnbnVtKGV4cG9uZW50KTtcbiAgICBpZiAoIWJpZ0Jhc2UgfHwgIWJpZ0V4cClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKGludkV4cCA9PT0gMikge1xuICAgICAgaWYgKGJpZ0Jhc2UuaXNOZWcoKSlcbiAgICAgICAgcmV0dXJuIGNvbXBsZXhBbGxvd2VkKGNlKSA/IGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGJpZ0Jhc2UubmVnKCkuc3FydCgpLnRvTnVtYmVyKCkpKSA6IGNlLl9OQU47XG4gICAgICByZXR1cm4gY2UubnVtYmVyKGJpZ0Jhc2Uuc3FydCgpKTtcbiAgICB9XG4gICAgaWYgKCFiaWdFeHAuaXNJbnRlZ2VyKCkgJiYgYmlnQmFzZS5pc05lZygpKSB7XG4gICAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICBjb25zdCB6QmFzZSA9IGNlLmNvbXBsZXgoYmlnQmFzZS50b051bWJlcigpKTtcbiAgICAgIGNvbnN0IHpFeHAgPSBjZS5jb21wbGV4KGJpZ0V4cC50b051bWJlcigpKTtcbiAgICAgIHJldHVybiBjZS5udW1iZXIoekJhc2UucG93KHpFeHApKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlLm51bWJlcihiaWdCYXNlLnBvdyhiaWdFeHApKTtcbiAgfVxuICBjb25zdCBmbG9hdEV4cCA9IGFzRmxvYXQoZXhwb25lbnQpID8/IE5hTjtcbiAgY29uc3QgZmxvYXRCYXNlID0gYXNGbG9hdChiYXNlKSA/PyBOYU47XG4gIGlmIChpbnZFeHAgPT09IDIpIHtcbiAgICBpZiAoZmxvYXRCYXNlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXhBbGxvd2VkKGNlKSA/IGNlLm11bChbY2UuX0ksIGNlLm51bWJlcihNYXRoLnNxcnQoLWZsb2F0QmFzZSkpXSkgOiBjZS5fTkFOO1xuICAgIH1cbiAgICByZXR1cm4gY2UubnVtYmVyKE1hdGguc3FydChmbG9hdEJhc2UpKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmxvYXRFeHApICYmIGZsb2F0QmFzZSA8IDApIHtcbiAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgIGNvbnN0IHpCYXNlID0gY2UuY29tcGxleChmbG9hdEJhc2UpO1xuICAgIGNvbnN0IHpFeHAgPSBjZS5jb21wbGV4KGZsb2F0RXhwKTtcbiAgICByZXR1cm4gY2UubnVtYmVyKHpCYXNlLnBvdyh6RXhwKSk7XG4gIH1cbiAgcmV0dXJuIGNlLm51bWJlcihNYXRoLnBvdyhmbG9hdEJhc2UsIGZsb2F0RXhwKSk7XG59XG5mdW5jdGlvbiBwcm9jZXNzUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50LCBtb2RlKSB7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGxldCBjID0gYmlnbnVtUHJlZmVycmVkKGNlKSA/IFtCaWdJbnQoMSksIEJpZ0ludCgxKV0gOiBbMSwgMV07XG4gICAgY29uc3QgeHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBiYXNlLm9wcykge1xuICAgICAgY29uc3QgciA9IGFzUmF0aW9uYWwob3AzKTtcbiAgICAgIGlmIChyKVxuICAgICAgICBjID0gbXVsMihjLCByKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeHMucHVzaChvcDMpO1xuICAgIH1cbiAgICBpZiAoIWlzUmF0aW9uYWxPbmUoYykpXG4gICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgcHJvY2Vzc1NxcnQoY2UsIGNlLm51bWJlcihjKSwgbW9kZSkgPz8gY2UuX09ORSxcbiAgICAgICAgY2UucG93KFxuICAgICAgICAgIHByb2Nlc3NQb3dlcihjZSwgY2UubXVsKHhzKSwgZXhwb25lbnQsIG1vZGUpID8/IGNlLm11bCh4cyksXG4gICAgICAgICAgZXhwb25lbnRcbiAgICAgICAgKVxuICAgICAgXSk7XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgaWYgKGFzU21hbGxJbnRlZ2VyKGJhc2Uub3AyKSA9PT0gLTEgJiYgYXNTbWFsbEludGVnZXIoZXhwb25lbnQpID09PSAtMSlcbiAgICAgIHJldHVybiBiYXNlLm9wMTtcbiAgICBjb25zdCBlMSA9IGFzUmF0aW9uYWwoYmFzZS5vcDIpO1xuICAgIGNvbnN0IGUyID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgaWYgKGUxICYmIGUyKSB7XG4gICAgICBjb25zdCBlID0gbXVsMihlMSwgZTIpO1xuICAgICAgaWYgKGlzUmF0aW9uYWxaZXJvKGUpKVxuICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgIGlmIChpc1JhdGlvbmFsT25lKGUpKVxuICAgICAgICByZXR1cm4gYmFzZS5vcDE7XG4gICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBlKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFwiTlwiKSB7XG4gICAgICBjb25zdCBlZjEgPSBhc0Zsb2F0KGJhc2Uub3AyKTtcbiAgICAgIGNvbnN0IGVmMiA9IGFzRmxvYXQoZXhwb25lbnQpO1xuICAgICAgaWYgKGVmMSAhPT0gbnVsbCAmJiBlZjIgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWYgPSBlZjEgKiBlZjI7XG4gICAgICAgIGlmIChlZiA9PT0gMClcbiAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgaWYgKGVmID09PSAxKVxuICAgICAgICAgIHJldHVybiBiYXNlLm9wMTtcbiAgICAgICAgcmV0dXJuIGNlLnBvdyhiYXNlLm9wMSwgZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobW9kZSAhPT0gXCJOXCIgJiYgYmFzZS5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgYmFzZS5pc0ludGVnZXIpIHtcbiAgICBjb25zdCBzbWFsbEV4cHIgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKHNtYWxsRXhwcilcbiAgICAgIHJldHVybiBudW1FdmFsUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50KTtcbiAgICBjb25zdCByID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgaWYgKHIpIHtcbiAgICAgIGNvbnN0IFtuLCBkXSA9IFttYWNoaW5lTnVtZXJhdG9yKHIpLCBtYWNoaW5lRGVub21pbmF0b3IocildO1xuICAgICAgaWYgKChuID09PSAxIHx8IG4gPT09IC0xKSAmJiAoZCA9PT0gMiB8fCBkID09PSAzKSkge1xuICAgICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKGNlKSB8fCBiYXNlLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIGNvbnN0IGJpZ0Jhc2UgPSBhc0JpZ2ludChiYXNlKTtcbiAgICAgICAgICBpZiAoZCAlIDIgPT09IDAgJiYgYmlnQmFzZSA8IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIGNvbnN0IHNpZ24yID0gYmlnQmFzZSA8IDAgPyBkICUgMiA9PT0gMCA/IGNlLl9JIDogY2UuX05FR0FUSVZFX09ORSA6IGNlLl9PTkU7XG4gICAgICAgICAgY29uc3QgW2ZhY3Rvciwgcm9vdF0gPSBmYWN0b3JQb3dlcjIoXG4gICAgICAgICAgICBiaWdCYXNlID4gMCA/IGJpZ0Jhc2UgOiAtYmlnQmFzZSxcbiAgICAgICAgICAgIGRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyb290ID09PSBCaWdJbnQoMSkgJiYgZmFjdG9yID09PSBCaWdJbnQoMSkpXG4gICAgICAgICAgICByZXR1cm4gc2lnbjI7XG4gICAgICAgICAgaWYgKGZhY3RvciAhPT0gQmlnSW50KDEpKSB7XG4gICAgICAgICAgICBpZiAocm9vdCA9PT0gQmlnSW50KDEpKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgICAgICAgICBzaWduMixcbiAgICAgICAgICAgICAgICBjZS5udW1iZXIobiA+PSAwID8gZmFjdG9yIDogW0JpZ0ludCgxKSwgZmFjdG9yXSlcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgICAgICAgc2lnbjIsXG4gICAgICAgICAgICAgIGNlLm51bWJlcihmYWN0b3IpLFxuICAgICAgICAgICAgICBjZS5wb3coY2UubnVtYmVyKHJvb3QpLCBleHBvbmVudClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYmFzZS5udW1lcmljVmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBpZiAoYmFzZS5udW1lcmljVmFsdWUgPCAwICYmIGQgJSAyID09PSAwICYmICFjb21wbGV4QWxsb3dlZChjZSkpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICBjb25zdCBbZmFjdG9yLCByb290XSA9IGZhY3RvclBvd2VyKE1hdGguYWJzKGJhc2UubnVtZXJpY1ZhbHVlKSwgZCk7XG4gICAgICAgICAgY29uc3Qgc2lnbjIgPSBiYXNlLm51bWVyaWNWYWx1ZSA8IDAgPyBkICUgMiA9PT0gMCA/IGNlLl9JIDogY2UuX05FR0FUSVZFX09ORSA6IGNlLl9PTkU7XG4gICAgICAgICAgaWYgKHJvb3QgPT09IDEgJiYgZmFjdG9yID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIHNpZ24yO1xuICAgICAgICAgIGlmIChmYWN0b3IgIT09IDEpIHtcbiAgICAgICAgICAgIGlmIChyb290ID09PSAxKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubXVsKFtzaWduMiwgY2UubnVtYmVyKG4gPj0gMCA/IGZhY3RvciA6IFsxLCBmYWN0b3JdKV0pO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgICAgIHNpZ24yLFxuICAgICAgICAgICAgICBjZS5udW1iZXIoZmFjdG9yKSxcbiAgICAgICAgICAgICAgY2UucG93KGNlLm51bWJlcihyb290KSwgZXhwb25lbnQpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChiYXNlLmlzTmVnYXRpdmUpIHtcbiAgICAgICAgaWYgKCFjb21wbGV4QWxsb3dlZClcbiAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgcmV0dXJuIGNlLm11bChbY2UuX0ksIGNlLmZuKFwiU3FydFwiLCBbY2UubmVnKGJhc2UpXSldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGlmIChtb2RlICE9PSBcInNpbXBsaWZ5XCIgJiYgYmFzZS5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgZXhwb25lbnQubnVtZXJpY1ZhbHVlICE9PSBudWxsKVxuICAgIHJldHVybiBudW1FdmFsUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50KTtcbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NTcXJ0KGNlLCBiYXNlLCBtb2RlKSB7XG4gIGlmIChiYXNlLmlzT25lKVxuICAgIHJldHVybiBjZS5fT05FO1xuICBpZiAoYmFzZS5pc1plcm8pXG4gICAgcmV0dXJuIGNlLl9aRVJPO1xuICBpZiAoYmFzZS5pc05lZ2F0aXZlT25lKVxuICAgIHJldHVybiBjb21wbGV4QWxsb3dlZChjZSkgPyBjZS5fSSA6IGNlLl9OQU47XG4gIGlmIChiYXNlLmlzTmVnYXRpdmUgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICByZXR1cm4gY2UuX05BTjtcbiAgY29uc3QgciA9IGFzUmF0aW9uYWwoYmFzZSk7XG4gIGlmIChtb2RlID09PSBcIk5cIiB8fCBtb2RlID09PSBcImV2YWx1YXRlXCIgJiYgIXIpXG4gICAgcmV0dXJuIGFwcGx5TihcbiAgICAgIGJhc2UsXG4gICAgICAoeCkgPT4geCA8IDAgPyBjZS5jb21wbGV4KHgpLnNxcnQoKSA6IE1hdGguc3FydCh4KSxcbiAgICAgICh4KSA9PiB4LmlzTmVnKCkgPyBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkuc3FydCgpIDogeC5zcXJ0KCksXG4gICAgICAoeCkgPT4geC5zcXJ0KClcbiAgICApO1xuICBjb25zdCBuID0gYXNTbWFsbEludGVnZXIoYmFzZSk7XG4gIGlmIChuICE9PSBudWxsKSB7XG4gICAgY29uc3QgW2ZhY3Rvciwgcm9vdF0gPSBmYWN0b3JQb3dlcihNYXRoLmFicyhuKSwgMik7XG4gICAgaWYgKG4gPCAwKSB7XG4gICAgICBpZiAocm9vdCA9PT0gMSlcbiAgICAgICAgY2UubXVsKFtjZS5udW1iZXIoY2UuY29tcGxleCgwLCBmYWN0b3IpKV0pO1xuICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgIGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGZhY3RvcikpLFxuICAgICAgICBjZS5zcXJ0KGNlLm51bWJlcihyb290KSlcbiAgICAgIF0pO1xuICAgIH1cbiAgICBpZiAocm9vdCA9PT0gMSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZmFjdG9yKTtcbiAgICByZXR1cm4gY2UubXVsKFtjZS5udW1iZXIoZmFjdG9yKSwgY2Uuc3FydChjZS5udW1iZXIocm9vdCkpXSk7XG4gIH1cbiAgaWYgKHIpIHtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwocikgJiYgIWJpZ251bVByZWZlcnJlZChjZSkpIHtcbiAgICAgIGNvbnN0IFtuMiwgZF0gPSByO1xuICAgICAgaWYgKE1hdGguYWJzKG4yKSA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIGQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICBjb25zdCBbbkZhY3RvciwgblJvb3RdID0gZmFjdG9yUG93ZXIoTWF0aC5hYnMobjIpLCAyKTtcbiAgICAgICAgY29uc3QgW2RGYWN0b3IsIGRSb290XSA9IGZhY3RvclBvd2VyKGQsIDIpO1xuICAgICAgICBpZiAobjIgPCAwKVxuICAgICAgICAgIHJldHVybiBjZS5tdWwoW1xuICAgICAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgICAgICBjZS5zcXJ0KGNlLm51bWJlcihbblJvb3QsIGRSb290XSkpLFxuICAgICAgICAgICAgY2UuX0lcbiAgICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgICAgY2Uuc3FydChjZS5udW1iZXIoW25Sb290LCBkUm9vdF0pKVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQmlnUmF0aW9uYWwocikgfHwgYmlnbnVtUHJlZmVycmVkKGNlKSkge1xuICAgICAgY29uc3QgbjIgPSBiaWdpbnQoclswXSk7XG4gICAgICBjb25zdCBbbkZhY3RvciwgblJvb3RdID0gZmFjdG9yUG93ZXIyKG4yID4gMCA/IG4yIDogLW4yLCAyKTtcbiAgICAgIGNvbnN0IFtkRmFjdG9yLCBkUm9vdF0gPSBmYWN0b3JQb3dlcjIoYmlnaW50KHJbMV0pLCAyKTtcbiAgICAgIGlmIChuMiA8IDApXG4gICAgICAgIHJldHVybiBjZS5tdWwoW1xuICAgICAgICAgIGNlLm51bWJlcihbbkZhY3RvciwgZEZhY3Rvcl0pLFxuICAgICAgICAgIGNlLnNxcnQoY2UubnVtYmVyKFtuUm9vdCwgZFJvb3RdKSksXG4gICAgICAgICAgY2UuX0lcbiAgICAgICAgXSk7XG4gICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgIGNlLnNxcnQoY2UubnVtYmVyKFtuUm9vdCwgZFJvb3RdKSlcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcm9vdEV4cChleHBvbmVudCkge1xuICBpZiAodHlwZW9mIGV4cG9uZW50Lm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGludiA9IDEgLyBleHBvbmVudC5udW1lcmljVmFsdWU7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW52KSlcbiAgICAgIHJldHVybiBpbnY7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgIGNvbnN0IGludiA9IGV4cG9uZW50LmVuZ2luZS5fQklHTlVNX09ORS5kaXYoZXhwb25lbnQubnVtZXJpY1ZhbHVlKTtcbiAgICBpZiAoaW52LmlzSW50KCkpXG4gICAgICByZXR1cm4gaW52LnRvTnVtYmVyKCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFpc1JhdGlvbmFsKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFtuLCBkXSA9IFtcbiAgICBtYWNoaW5lTnVtZXJhdG9yKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSksXG4gICAgbWFjaGluZURlbm9taW5hdG9yKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSlcbiAgXTtcbiAgaWYgKG4gIT09IDEgJiYgbiAhPT0gLTEpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuICogZDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy1tdWx0aXBseS50c1xuZnVuY3Rpb24gY2Fub25pY2FsTXVsdGlwbHkoY2UsIG9wczIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIuZXZlcnkoKHgpID0+IHguaXNDYW5vbmljYWwpKTtcbiAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBjZS5udW1iZXIoMSk7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgaWYgKG9wczIubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiBtdWx0aXBseTIob3BzMlswXSwgb3BzMlsxXSk7XG4gIGNvbnN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdChjZSk7XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBpZiAob3AzLmlzTmFOIHx8IG9wMy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBwcm9kdWN0LmFkZFRlcm0ob3AzKTtcbiAgfVxuICByZXR1cm4gcHJvZHVjdC5hc0V4cHJlc3Npb24oKTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5TXVsdGlwbHkoY2UsIG9wczIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIuZXZlcnkoKHgpID0+IHguaGVhZCAhPT0gXCJNdWx0aXBseVwiKSk7XG4gIGNvbnN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdChjZSk7XG4gIGZvciAobGV0IG9wMyBvZiBvcHMyKSB7XG4gICAgb3AzID0gb3AzLnNpbXBsaWZ5KCk7XG4gICAgaWYgKG9wMy5pc05hTiB8fCBvcDMuc3ltYm9sID09PSBcIlVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgcHJvZHVjdC5hZGRUZXJtKG9wMyk7XG4gIH1cbiAgcmV0dXJuIHByb2R1Y3QuYXNFeHByZXNzaW9uKCk7XG59XG5mdW5jdGlvbiBldmFsTXVsdGlwbHkoY2UsIG9wczIsIG1vZGUgPSBcImV2YWx1YXRlXCIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIubGVuZ3RoID4gMSwgXCJldmFsTXVsdGlwbHkoKTogbm8gYXJndW1lbnRzXCIpO1xuICBpZiAobW9kZSA9PT0gXCJOXCIpIHtcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguTigpKTtcbiAgICBpZiAoKGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIiB8fCBjZS5udW1lcmljTW9kZSA9PT0gXCJhdXRvXCIpICYmIG9wczIuZXZlcnkoKHgpID0+IHR5cGVvZiB4Lm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIikpIHtcbiAgICAgIGxldCBwcm9kID0gMTtcbiAgICAgIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpXG4gICAgICAgIHByb2QgKj0gb3AzLm51bWVyaWNWYWx1ZTtcbiAgICAgIHJldHVybiBjZS5udW1iZXIocHJvZCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBpZiAob3AzLmlzTmFOIHx8IG9wMy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoIW9wMy5pc0V4YWN0KVxuICAgICAgbW9kZSA9IFwiTlwiO1xuICB9XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChvcHMyLmV2ZXJ5KCh4KSA9PiB4LmhlYWQgIT09IFwiTXVsdGlwbHlcIikpO1xuICBpZiAobW9kZSA9PT0gXCJOXCIpXG4gICAgb3BzMiA9IG9wczIubWFwKCh4KSA9PiB4Lk4oKSk7XG4gIGVsc2VcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguZXZhbHVhdGUoKSk7XG4gIHJldHVybiBuZXcgUHJvZHVjdChjZSwgb3BzMikuYXNFeHByZXNzaW9uKG1vZGUpO1xufVxuZnVuY3Rpb24gbXVsdGlwbHkyKG9wMTIsIG9wMjIsIG1ldGFkYXRhKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChvcDEyLmlzQ2Fub25pY2FsKTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wMjIuaXNDYW5vbmljYWwpO1xuICBjb25zdCBjZSA9IG9wMTIuZW5naW5lO1xuICBpZiAob3AxMi5zeW1ib2wgPT09IFwiSW1hZ2luYXJ5VW5pdFwiKSB7XG4gICAgY29uc3QgZiA9IGFzRmxvYXQob3AyMik7XG4gICAgaWYgKGYgIT09IG51bGwpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGNlLmNvbXBsZXgoMCwgZikpO1xuICB9XG4gIGlmIChvcDIyLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpIHtcbiAgICBjb25zdCBmID0gYXNGbG9hdChvcDEyKTtcbiAgICBpZiAoZiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleCgwLCBmKSk7XG4gIH1cbiAgaWYgKG9wMTIubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIG9wMjIubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgZjEgPSBhc0Zsb2F0KG9wMTIpO1xuICAgIGNvbnN0IGYyID0gYXNGbG9hdChvcDIyKTtcbiAgICBpZiAoZjEgIT09IG51bGwgJiYgY2UuaXNDb21wbGV4KG9wMjIpKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihjZS5jb21wbGV4KGYxICogb3AyMi5yZSwgZjEgKiBvcDIyLmltKSk7XG4gICAgaWYgKGYyICE9PSBudWxsICYmIGNlLmlzQ29tcGxleChvcDEyKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChmMiAqIG9wMTIucmUsIGYyICogb3AxMi5pbSkpO1xuICB9XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDIyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDEyLmlzSW50ZWdlciAmJiBvcDIyLmlzSW50ZWdlcikge1xuICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgb3AxMixcbiAgICAgIG9wMjIsXG4gICAgICAoYSwgYikgPT4gYSAqIGIsXG4gICAgICAoYSwgYikgPT4gYS5tdWwoYilcbiAgICApID8/IGNlLl9OQU47XG4gIH1cbiAgaWYgKG9wMTIuaXNOYU4gfHwgb3AyMi5pc05hTiB8fCBvcDEyLnN5bWJvbCA9PT0gXCJVbmRlZmluZWRcIiB8fCBvcDIyLnN5bWJvbCA9PT0gXCJVbmRlZmluZWRcIilcbiAgICByZXR1cm4gY2UuX05BTjtcbiAgaWYgKG9wMTIuaXNOb3RoaW5nKVxuICAgIHJldHVybiBvcDIyO1xuICBpZiAob3AyMi5pc05vdGhpbmcpXG4gICAgcmV0dXJuIG9wMTI7XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmIChvcDEyLmlzT25lKVxuICAgICAgcmV0dXJuIG9wMjI7XG4gICAgaWYgKG9wMTIuaXNOZWdhdGl2ZU9uZSlcbiAgICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUob3AyMik7XG4gIH1cbiAgaWYgKG9wMjIubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKG9wMjIuaXNPbmUpXG4gICAgICByZXR1cm4gb3AxMjtcbiAgICBpZiAob3AyMi5pc05lZ2F0aXZlT25lKVxuICAgICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShvcDEyKTtcbiAgfVxuICBsZXQgc2lnbjIgPSAxO1xuICBsZXQgW3QsIGNdID0gb3AxMi5udW1lcmljVmFsdWUgIT09IG51bGwgPyBbb3AxMiwgb3AyMl0gOiBbb3AyMiwgb3AxMl07XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0LmhlYWQgIT09IFwiU3VidHJhY3RcIik7XG4gIGlmICh0LmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICB0ID0gdC5vcDE7XG4gICAgc2lnbjIgPSAtc2lnbjI7XG4gIH1cbiAgaWYgKGMubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgciA9IGFzUmF0aW9uYWwoYyk7XG4gICAgaWYgKHIpIHtcbiAgICAgIGlmIChpc1JhdGlvbmFsT25lKHIpKVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIGlmIChpc1JhdGlvbmFsWmVybyhyKSlcbiAgICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgICAgaWYgKHQuaGVhZCA9PT0gXCJBZGRcIikge1xuICAgICAgICBpZiAoc2lnbjIgPCAwKVxuICAgICAgICAgIGMgPSBjYW5vbmljYWxOZWdhdGUoYyk7XG4gICAgICAgIHJldHVybiBjZS5hZGQoXG4gICAgICAgICAgdC5vcHMubWFwKCh4KSA9PiBtdWx0aXBseTIoYywgeCkpLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB0ciA9IGFzUmF0aW9uYWwodCk7XG4gICAgICBpZiAodHIpIHtcbiAgICAgICAgY29uc3QgcCA9IG11bDIociwgdHIpO1xuICAgICAgICByZXR1cm4gY2UubnVtYmVyKHNpZ24yIDwgMCA/IG5lZyhwKSA6IHAsIHsgbWV0YWRhdGEgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbjIgPCAwKVxuICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTXVsdGlwbHlcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShjKSwgdF0sIG1ldGFkYXRhKTtcbiAgICAgIHJldHVybiBjZS5fZm4oXCJNdWx0aXBseVwiLCBbYywgdF0sIG1ldGFkYXRhKTtcbiAgICB9XG4gIH1cbiAgaWYgKGMuaGFzaCA9PT0gdC5oYXNoICYmIGMuaXNTYW1lKHQpKVxuICAgIHJldHVybiBzcXVhcmUoY2UsIGMpO1xuICBjb25zdCBwcm9kdWN0ID0gbmV3IFByb2R1Y3QoY2UsIFtjLCB0XSk7XG4gIGlmIChzaWduMiA+IDApXG4gICAgcmV0dXJuIHByb2R1Y3QuYXNFeHByZXNzaW9uKCk7XG4gIHJldHVybiBjYW5vbmljYWxOZWdhdGUocHJvZHVjdC5hc0V4cHJlc3Npb24oKSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsUHJvZHVjdChjZSwgYm9keSwgcmFuZ2UpIHtcbiAgYm9keSA/PyAoYm9keSA9IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gIGxldCBpbmRleCA9IG51bGw7XG4gIGxldCBsb3dlciA9IG51bGw7XG4gIGxldCB1cHBlciA9IG51bGw7XG4gIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSByYW5nZTtcbiAgfSBlbHNlIGlmIChyYW5nZSkge1xuICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICBsb3dlciA9IHJhbmdlLm9wcz8uWzFdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgICB1cHBlciA9IHJhbmdlLm9wcz8uWzJdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgfVxuICBpZiAoaW5kZXggJiYgaW5kZXguaGVhZCA9PT0gXCJIb2xkXCIpXG4gICAgaW5kZXggPSBpbmRleC5vcDE7XG4gIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIlJlbGVhc2VIb2xkXCIpXG4gICAgaW5kZXggPSBpbmRleC5vcDEuZXZhbHVhdGUoKTtcbiAgaW5kZXggPz8gKGluZGV4ID0gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKSk7XG4gIGlmICghaW5kZXguc3ltYm9sKVxuICAgIGluZGV4ID0gY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBpbmRleC5kb21haW5dKTtcbiAgZWxzZVxuICAgIGluZGV4ID0gY2UuaG9sZChpbmRleCk7XG4gIGlmIChsb3dlciAmJiBsb3dlci5pc0Zpbml0ZSlcbiAgICBsb3dlciA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIGxvd2VyLCBcIkludGVnZXJcIik7XG4gIGlmICh1cHBlciAmJiB1cHBlci5pc0Zpbml0ZSlcbiAgICB1cHBlciA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIHVwcGVyLCBcIkludGVnZXJcIik7XG4gIGlmIChsb3dlciAmJiB1cHBlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXIsIHVwcGVyXSk7XG4gIGVsc2UgaWYgKHVwcGVyKVxuICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBjZS5udW1iZXIoMSksIHVwcGVyXSk7XG4gIGVsc2UgaWYgKGxvd2VyKVxuICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBsb3dlcl0pO1xuICBlbHNlXG4gICAgcmFuZ2UgPSBpbmRleDtcbiAgcmV0dXJuIGNlLl9mbihcIlByb2R1Y3RcIiwgW2JvZHkuY2Fub25pY2FsLCByYW5nZV0pO1xufVxuZnVuY3Rpb24gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBleHByLCByYW5nZSwgbW9kZSkge1xuICBjb25zdCBbaW5kZXgsIGxvd2VyLCB1cHBlciwgaXNGaW5pdGUyXSA9IG5vcm1hbGl6ZUxpbWl0cyhyYW5nZSk7XG4gIGNvbnN0IGZuID0gZXhwcjtcbiAgaWYgKG1vZGUgIT09IFwiTlwiICYmIChsb3dlciA+PSB1cHBlciB8fCB1cHBlciAtIGxvd2VyID49IE1BWF9TWU1CT0xJQ19URVJNUykpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IHNhdmVkQ29udGV4dCA9IGNlLmNvbnRleHQ7XG4gIGNlLmNvbnRleHQgPSBmbi5zY29wZSA/PyBjZS5jb250ZXh0O1xuICBpZiAobW9kZSA9PT0gXCJzaW1wbGlmeVwiKSB7XG4gICAgY29uc3QgdGVybXMgPSBbXTtcbiAgICBpZiAoIWZuLnNjb3BlKVxuICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspXG4gICAgICAgIHRlcm1zLnB1c2goZm4uc2ltcGxpZnkoKSk7XG4gICAgZWxzZVxuICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgY2Uuc2V0KHsgW2luZGV4XTogaSB9KTtcbiAgICAgICAgdGVybXMucHVzaChmbi5zaW1wbGlmeSgpKTtcbiAgICAgIH1cbiAgICByZXN1bHQgPSBjZS5tdWwodGVybXMpLnNpbXBsaWZ5KCk7XG4gIH1cbiAgaWYgKG1vZGUgPT09IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IHRlcm1zID0gW107XG4gICAgaWYgKCFmbi5zY29wZSlcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKVxuICAgICAgICB0ZXJtcy5wdXNoKGZuLmV2YWx1YXRlKCkpO1xuICAgIGVsc2VcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKSB7XG4gICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgIHRlcm1zLnB1c2goZm4uZXZhbHVhdGUoKSk7XG4gICAgICB9XG4gICAgcmVzdWx0ID0gY2UubXVsKHRlcm1zKS5ldmFsdWF0ZSgpO1xuICB9XG4gIGlmIChtb2RlID09PSBcIk5cIikge1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgIWZuLnNjb3BlKSB7XG4gICAgICBjb25zdCBuID0gZm4uTigpO1xuICAgICAgaWYgKCFpc0Zpbml0ZTIpIHtcbiAgICAgICAgaWYgKG4uaXNaZXJvKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9aRVJPO1xuICAgICAgICBlbHNlIGlmIChuLmlzUG9zaXRpdmUpXG4gICAgICAgICAgcmVzdWx0ID0gY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzdWx0ID0gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBmbi5pc1B1cmUpXG4gICAgICAgIHJlc3VsdCA9IGNlLnBvdyhuLCBjZS5udW1iZXIodXBwZXIgLSBsb3dlciArIDEpKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBpc0Zpbml0ZTIpIHtcbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpKSB7XG4gICAgICAgIGxldCBwcm9kdWN0MiA9IGNlLmJpZ251bSgxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICAgIGNvbnN0IHRlcm0gPSBhc0JpZ251bShmbi5OKCkpO1xuICAgICAgICAgIGlmICh0ZXJtID09PSBudWxsIHx8ICF0ZXJtLmlzRmluaXRlKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRlcm0gIT09IG51bGwgPyBjZS5udW1iZXIodGVybSkgOiB2b2lkIDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvZHVjdDIgPSBwcm9kdWN0Mi5tdWwodGVybSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIocHJvZHVjdDIpO1xuICAgICAgfVxuICAgICAgbGV0IHByb2R1Y3QgPSAxO1xuICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgIGNlLm51bWVyaWNNb2RlID0gXCJtYWNoaW5lXCI7XG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICBjb25zdCB0ZXJtID0gYXNGbG9hdChmbi5OKCkpO1xuICAgICAgICBpZiAodGVybSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHRlcm0pKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGVybSAhPT0gbnVsbCA/IGNlLm51bWJlcih0ZXJtKSA6IHZvaWQgMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwcm9kdWN0ICo9IHRlcm07XG4gICAgICB9XG4gICAgICBjZS5udW1lcmljTW9kZSA9IG51bWVyaWNNb2RlO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgcmVzdWx0ID0gY2UubnVtYmVyKHByb2R1Y3QpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBjZS5zZXQoeyBbaW5kZXhdOiAxZTMgfSk7XG4gICAgICBjb25zdCBuTWF4ID0gZm4uTigpO1xuICAgICAgY2Uuc2V0KHsgW2luZGV4XTogOTk5IH0pO1xuICAgICAgY29uc3Qgbk1heE1pbnVzT25lID0gZm4uTigpO1xuICAgICAgY29uc3QgcmF0aW8gPSBhc0Zsb2F0KGNlLmRpdihuTWF4LCBuTWF4TWludXNPbmUpLk4oKSk7XG4gICAgICBpZiAocmF0aW8gIT09IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHJhdGlvKSAmJiBNYXRoLmFicyhyYXRpbykgPiAxKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwcm9kdWN0ID0gMTtcbiAgICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBcIm1hY2hpbmVcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICAgIGNvbnN0IHRlcm0gPSBhc0Zsb2F0KGZuLk4oKSk7XG4gICAgICAgICAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTWF0aC5hYnMoMSAtIHRlcm0pIDwgTnVtYmVyLkVQU0lMT04gfHwgIU51bWJlci5pc0Zpbml0ZSh0ZXJtKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIHByb2R1Y3QgKj0gdGVybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLm51bWJlcihwcm9kdWN0KTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2UuY29udGV4dCA9IHNhdmVkQ29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdCA/PyB2b2lkIDA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L2FyaXRobWV0aWMtZGl2aWRlLnRzXG5mdW5jdGlvbiBjYW5vbmljYWxEaXZpZGUoY2UsIG9wMTIsIG9wMjIpIHtcbiAgaWYgKCFvcDEyLmlzVmFsaWQgfHwgIW9wMjIuaXNWYWxpZClcbiAgICByZXR1cm4gY2UuX2ZuKFwiRGl2aWRlXCIsIFtvcDEyLCBvcDIyXSk7XG4gIGlmIChvcDEyLmhlYWQgPT09IFwiTmVnYXRlXCIgJiYgb3AyMi5oZWFkID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgb3AxMiA9IG9wMTIub3AxO1xuICAgIG9wMjIgPSBvcDIyLm9wMTtcbiAgfVxuICBpZiAob3AxMi5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgb3AyMi5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICBpZiAob3AyMi5pc09uZSlcbiAgICAgIHJldHVybiBvcDEyO1xuICAgIGlmIChvcDIyLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gY2UubmVnKG9wMTIpO1xuICAgIGlmIChvcDEyLmlzT25lKVxuICAgICAgcmV0dXJuIGNlLmludihvcDIyKTtcbiAgICBpZiAob3AxMi5pc05lZ2F0aXZlT25lKVxuICAgICAgcmV0dXJuIGNlLm5lZyhjZS5pbnYob3AyMikpO1xuICAgIGNvbnN0IHIxID0gYXNSYXRpb25hbChvcDEyKTtcbiAgICBjb25zdCByMiA9IGFzUmF0aW9uYWwob3AyMik7XG4gICAgaWYgKHIxICYmIHIyICYmICFpc1JhdGlvbmFsWmVybyhyMikpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG11bDIocjEsIGludmVyc2UocjIpKSk7XG4gIH1cbiAgaWYgKG9wMTIuaGVhZCA9PT0gXCJEaXZpZGVcIiAmJiBvcDIyLmhlYWQgPT09IFwiRGl2aWRlXCIpIHtcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKFxuICAgICAgY2UsXG4gICAgICBjZS5tdWwoW29wMTIub3AxLCBvcDIyLm9wMl0pLFxuICAgICAgY2UubXVsKFtvcDEyLm9wMiwgb3AyMi5vcDFdKVxuICAgICk7XG4gIH1cbiAgaWYgKG9wMTIuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKGNlLCBjZS5tdWwoW29wMTIub3AxLCBvcDIyXSksIG9wMTIub3AyKTtcbiAgaWYgKG9wMjIuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKGNlLCBjZS5tdWwoW29wMTIsIG9wMjIub3AyXSksIG9wMjIub3AxKTtcbiAgY29uc3QgbnVtMSA9IG9wMTIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtMSAhPT0gbnVsbCkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0xKSkge1xuICAgICAgY29uc3QgW2EsIGJdID0gbnVtMTtcbiAgICAgIHJldHVybiBjYW5vbmljYWxEaXZpZGUoY2UsIGNlLm51bWJlcihhKSwgY2UubXVsKFtjZS5udW1iZXIoYiksIG9wMjJdKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ1JhdGlvbmFsKG51bTEpKSB7XG4gICAgICBjb25zdCBbYSwgYl0gPSBudW0xO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbERpdmlkZShjZSwgY2UubnVtYmVyKGEpLCBjZS5tdWwoW2NlLm51bWJlcihiKSwgb3AyMl0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbnVtMiA9IG9wMjIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtMiAhPT0gbnVsbCkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0yKSkge1xuICAgICAgY29uc3QgW2EsIGJdID0gbnVtMjtcbiAgICAgIHJldHVybiBjYW5vbmljYWxEaXZpZGUoY2UsIGNlLm11bChbb3AxMiwgY2UubnVtYmVyKGIpXSksIGNlLm51bWJlcihhKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ1JhdGlvbmFsKG51bTIpKSB7XG4gICAgICBjb25zdCBbYSwgYl0gPSBudW0yO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbERpdmlkZShjZSwgY2UubXVsKFtvcDEyLCBjZS5udW1iZXIoYildKSwgY2UubnVtYmVyKGEpKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2MxLCB0MV0gPSBhc0NvZWZmaWNpZW50KG9wMTIpO1xuICBjb25zdCBbYzIsIHQyXSA9IGFzQ29lZmZpY2llbnQob3AyMik7XG4gIGlmICghaXNSYXRpb25hbE9uZShjMSkgfHwgIWlzUmF0aW9uYWxPbmUoYzIpKSB7XG4gICAgY29uc3QgW2NuLCBjZF0gPSBtdWwyKGMxLCBpbnZlcnNlKGMyKSk7XG4gICAgY29uc3QgZW4gPSBjZS5tdWwoW2NlLm51bWJlcihjbiksIHQxXSk7XG4gICAgaWYgKGVuLmlzWmVybylcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBjb25zdCBlZCA9IGNlLm11bChbY2UubnVtYmVyKGNkKSwgdDJdKTtcbiAgICBpZiAoZWQuaXNPbmUpXG4gICAgICByZXR1cm4gZW47XG4gICAgcmV0dXJuIGNlLl9mbihcIkRpdmlkZVwiLCBbZW4sIGVkXSk7XG4gIH1cbiAgbGV0IFtuU2lnbiwgbl0gPSBtYWtlUG9zaXRpdmUob3AxMik7XG4gIGxldCBbZFNpZ24sIGRdID0gbWFrZVBvc2l0aXZlKG9wMjIpO1xuICBuID0gbi5jYW5vbmljYWw7XG4gIGQgPSBkLmNhbm9uaWNhbDtcbiAgaWYgKGQubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIGQuaXNPbmUpXG4gICAgcmV0dXJuIG5TaWduICogZFNpZ24gPCAwID8gY2Fub25pY2FsTmVnYXRlKG4pIDogbjtcbiAgaWYgKG5TaWduICogZFNpZ24gPiAwKVxuICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgW24sIGRdKTtcbiAgaWYgKG4ubnVtZXJpY1ZhbHVlKVxuICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShuKSwgZF0pO1xuICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKGNlLl9mbihcIkRpdmlkZVwiLCBbbiwgZF0pKTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5RGl2aWRlKGNlLCBvcDEyLCBvcDIyKSB7XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDIyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHIxID0gYXNSYXRpb25hbChvcDEyKTtcbiAgICBjb25zdCByMiA9IGFzUmF0aW9uYWwob3AyMik7XG4gICAgaWYgKHIxICYmIHIyICYmICFpc1JhdGlvbmFsWmVybyhyMikpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG11bDIocjEsIGludmVyc2UocjIpKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9kdWN0KGNlLCBbb3AxMiwgY2UuaW52KG9wMjIpXSkuYXNSYXRpb25hbEV4cHJlc3Npb24oKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy50c1xudmFyIGltcG9ydF9jb21wbGV4MTYgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbnZhciBBUklUSE1FVElDX0xJQlJBUlkgPSBbXG4gIHtcbiAgICAvL1xuICAgIC8vIEZ1bmN0aW9uc1xuICAgIC8vXG4gICAgQWJzOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzMxNzk4MlwiLFxuICAgICAgLy8gbWFnbml0dWRlICdRMTIwODEyIChmb3IgcmVhbHMpXG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk5vbk5lZ2F0aXZlTnVtYmVyXCJdLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzQWJzKGNlLCBvcHMyWzBdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzQWJzKGNlLCBvcHMyWzBdLCBcImV2YWx1YXRlXCIpLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IHByb2Nlc3NBYnMoY2UsIG9wczJbMF0sIFwiTlwiKVxuICAgICAgfVxuICAgIH0sXG4gICAgQWRkOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzIwNDNcIixcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEzMDAsXG4gICAgICBob2xkOiBcImFsbFwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogXCJOdW1lcmljRnVuY3Rpb25cIixcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gZG9tYWluQWRkKFxuICAgICAgICAgIGNlLFxuICAgICAgICAgIGFyZ3MubWFwKCh4KSA9PiB4LmRvbWFpbilcbiAgICAgICAgKSxcbiAgICAgICAgLy8gY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNhbm9uaWNhbEFkZChjZSwgYXJncyksIC8vIG5ldmVyIGNhbGxlZDogc2hvcnRwYXRoXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHNpbXBsaWZ5QWRkKGNlLCBvcHMyKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbEFkZChjZSwgb3BzMiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbEFkZChjZSwgb3BzMiwgXCJOXCIpXG4gICAgICB9XG4gICAgfSxcbiAgICBDZWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSb3VuZHMgYSBudW1iZXIgdXAgdG8gdGhlIG5leHQgbGFyZ2VzdCBpbnRlZ2VyXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjUwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJJbnRlZ2VyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKF9jZSwgb3BzMikgPT4gYXBwbHlOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgTWF0aC5jZWlsLFxuICAgICAgICAgICh4KSA9PiB4LmNlaWwoKSxcbiAgICAgICAgICAoeikgPT4gei5jZWlsKDApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIENob3A6IHtcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGlkZW1wb3RlbnQ6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIENvbXBsZXg6IHtcbiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY29udmVydGVkIGR1cmluZyBib3hpbmcsIHNvIHVubGlrZWx5IHRvIGVuY291bnRlclxuICAgICAgd2lraWRhdGE6IFwiUTExNTY3XCIsXG4gICAgICBjb21wbGV4aXR5OiA1MDBcbiAgICB9LFxuICAgIERpdmlkZToge1xuICAgICAgd2lraWRhdGE6IFwiUTEyMjY5MzlcIixcbiAgICAgIGNvbXBsZXhpdHk6IDI1MDAsXG4gICAgICAvLyAtIGlmIG51bWVyIHByb2R1Y3Qgb2YgbnVtYmVycywgb3IgZGVub20gcHJvZHVjdCBvZiBudW1iZXJzLFxuICAgICAgLy8gaS5lLiBcdTIyMUEyeC8yIC0+IDAuNzA3eCwgMi9cdTIyMUEyeCAtPiAxLjQxNDJ4XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBhcmdzID0gdmFsaWRhdGVBcmd1bWVudHMoY2UsIGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpLCBbXG4gICAgICAgICAgICBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIGNlLmRpdihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgYXJncykgPT4gc2ltcGxpZnlEaXZpZGUoY2UsIGFyZ3NbMF0sIGFyZ3NbMV0pLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBhcHBseTJOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgb3BzMlsxXSxcbiAgICAgICAgICAobiwgZCkgPT4gbiAvIGQsXG4gICAgICAgICAgKG4sIGQpID0+IG4uZGl2KGQpLFxuICAgICAgICAgIChuLCBkKSA9PiBuLmRpdihkKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBFeHA6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlExNjg2OThcIixcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAzNTAwLFxuICAgICAgLy8gRXhwKHgpIC0+IGVeeFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IHZhbGlkYXRlQXJndW1lbnRzKGNlLCBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKSwgW1xuICAgICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJQb3dlclwiLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gY2UucG93KGNlLnN5bWJvbChcIkV4cG9uZW50aWFsRVwiKSwgYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEZhY3RvcmlhbDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiRmFjdG9yaWFsIEZ1bmN0aW9uXCIsXG4gICAgICB3aWtpZGF0YTogXCJRMTIwOTc2XCIsXG4gICAgICBjb21wbGV4aXR5OiA5ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBhc1NtYWxsSW50ZWdlcihvcHMyWzBdKTtcbiAgICAgICAgICBpZiAobiAhPT0gbnVsbCAmJiBuID49IDApIHtcbiAgICAgICAgICAgIGlmICghYmlnbnVtUHJlZmVycmVkKGNlKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihmYWN0b3JpYWwobikpO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihmYWN0b3JpYWwyKGNlLCBjZS5iaWdudW0obikpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtID0gb3BzMlswXS5udW1lcmljVmFsdWU7XG4gICAgICAgICAgaWYgKG51bSAhPT0gbnVsbCAmJiBudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE2LmRlZmF1bHQpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGdhbW1hMyhudW0uYWRkKDEpKSk7XG4gICAgICAgICAgY29uc3QgZiA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKGYgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGdhbW1hKDEgKyBmKSk7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgRmxvb3I6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlE1Njg2MDc4M1wiLFxuICAgICAgY29tcGxleGl0eTogMTI1MCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBhcHBseU4oXG4gICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICBNYXRoLmZsb29yLFxuICAgICAgICAgICh4KSA9PiB4LmZsb29yKCksXG4gICAgICAgICAgKHopID0+IHouZmxvb3IoMClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgR2FtbWE6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlExOTA1NzNcIixcbiAgICAgIGNvbXBsZXhpdHk6IDhlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiBnYW1tYSh4KSxcbiAgICAgICAgICAoeCkgPT4gZ2FtbWEyKGNlLCB4KSxcbiAgICAgICAgICAoeCkgPT4gZ2FtbWEzKHgpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIExvZ0dhbW1hOiB7XG4gICAgICBjb21wbGV4aXR5OiA4ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBhcHBseU4oXG4gICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAoeCkgPT4gbG5nYW1tYSh4KSxcbiAgICAgICAgICAoeCkgPT4gbG5nYW1tYTIoY2UsIHgpLFxuICAgICAgICAgICh4KSA9PiBsbmdhbW1hMyh4KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBMbjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTmF0dXJhbCBMb2dhcml0aG1cIixcbiAgICAgIHdpa2lkYXRhOiBcIlEyMDQwMzdcIixcbiAgICAgIGNvbXBsZXhpdHk6IDRlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZyh4KSA6IGNlLmNvbXBsZXgoeCkubG9nKCksXG4gICAgICAgICAgKHgpID0+ICF4LmlzTmVnKCkgPyB4LmxuKCkgOiBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkubG9nKCksXG4gICAgICAgICAgKHopID0+IHoubG9nKClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgTG9nOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJMb2coeiwgYiA9IDEwKSA9IExvZ2FyaXRobSBvZiBiYXNlIGJcIixcbiAgICAgIHdpa2lkYXRhOiBcIlExMTE5N1wiLFxuICAgICAgY29tcGxleGl0eTogNDEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIk1heWJlXCIsIFwiTnVtYmVyXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBvcHMyID0gY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSk7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCBbdmFsaWRhdGVBcmd1bWVudChjZSwgb3BzMlswXSwgXCJOdW1iZXJcIildKTtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIG9wczJbMF0sIFwiTnVtYmVyXCIpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIG9wczJbMV0sIFwiTnVtYmVyXCIpO1xuICAgICAgICAgICAgaWYgKGJhc2UubnVtZXJpY1ZhbHVlID09PSAxMClcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCBbYXJnXSk7XG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTG9nXCIsIFthcmcsIGJhc2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIG9wczIsIDIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczJbMV0gPT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZzEwKHgpIDogY2UuY29tcGxleCh4KS5sb2coKS5kaXYoTWF0aC5MTjEwKSxcbiAgICAgICAgICAgICAgKHgpID0+ICF4LmlzTmVnKCkgPyBkZWNpbWFsX2RlZmF1bHQubG9nMTAoeCkgOiBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkubG9nKCkuZGl2KE1hdGguTE4xMCksXG4gICAgICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMTApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAgIG9wczJbMV0sXG4gICAgICAgICAgICAoYSwgYikgPT4gTWF0aC5sb2coYSkgLyBNYXRoLmxvZyhiKSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhLmxvZyhiKSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhLmxvZygpLmRpdih0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IE1hdGgubG9nKGIpIDogYi5sb2coKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBMYjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiQmFzZS0yIExvZ2FyaXRobVwiLFxuICAgICAgd2lraWRhdGE6IFwiUTU4MTE2OFwiLFxuICAgICAgY29tcGxleGl0eTogNDEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZzIoeCkgOiBjZS5jb21wbGV4KHgpLmxvZygpLmRpdihNYXRoLkxOMiksXG4gICAgICAgICAgKHgpID0+IHguaXNOZWcoKSA/IGRlY2ltYWxfZGVmYXVsdC5sb2cxMCh4KSA6IGNlLmNvbXBsZXgoeC50b051bWJlcigpKS5sb2coKS5kaXYoTWF0aC5MTjIpLFxuICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMilcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgTGc6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkJhc2UtMTAgTG9nYXJpdGhtXCIsXG4gICAgICB3aWtpZGF0YTogXCJROTY2NTgyXCIsXG4gICAgICBjb21wbGV4aXR5OiA0MTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gYXBwbHlOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgKHgpID0+IHggPj0gMCA/IE1hdGgubG9nMTAoeCkgOiBjZS5jb21wbGV4KHgpLmxvZygpLmRpdihNYXRoLkxOMTApLFxuICAgICAgICAgICh4KSA9PiAheC5pc05lZygpID8gZGVjaW1hbF9kZWZhdWx0LmxvZzEwKHgpIDogY2UuY29tcGxleCh4LnRvTnVtYmVyKCkpLmxvZygpLmRpdihNYXRoLkxOMTApLFxuICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMTApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIE1heDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTWF4aW11bSBvZiB0d28gb3IgbW9yZSBudW1iZXJzXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIk1heFwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBjb25zdCByZXN0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgICAgICAgICAgaWYgKCFvcDMuaXNOdW1iZXIgfHwgb3AzLm51bWVyaWNWYWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXN0LnB1c2gob3AzKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFyZXN1bHQgfHwgb3AzLmlzR3JlYXRlcihyZXN1bHQpKVxuICAgICAgICAgICAgICByZXN1bHQgPSBvcDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuYm94KHJlc3VsdCA/IFtcIk1heFwiLCByZXN1bHQsIC4uLnJlc3RdIDogW1wiTWF4XCIsIC4uLnJlc3RdKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ID8/IGNlLl9OQU47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE1pbjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTWluaW11bSBvZiB0d28gb3IgbW9yZSBudW1iZXJzXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIk1pblwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBjb25zdCByZXN0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgICAgICAgICAgaWYgKCFvcDMuaXNOdW1iZXIgfHwgb3AzLm51bWVyaWNWYWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXN0LnB1c2gob3AzKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFyZXN1bHQgfHwgb3AzLmlzTGVzcyhyZXN1bHQpKVxuICAgICAgICAgICAgICByZXN1bHQgPSBvcDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuYm94KHJlc3VsdCA/IFtcIk1pblwiLCByZXN1bHQsIC4uLnJlc3RdIDogW1wiTWluXCIsIC4uLnJlc3RdKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ID8/IGNlLl9OQU47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE11bHRpcGx5OiB7XG4gICAgICB3aWtpZGF0YTogXCJRNDAyNzZcIixcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgICBpZGVtcG90ZW50OiB0cnVlLFxuICAgICAgY29tcGxleGl0eTogMjEwMCxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBcIk51bWVyaWNGdW5jdGlvblwiLFxuICAgICAgICAvLyBOZXZlciBjYWxsZWQ6IGZhc3RwYXRoXG4gICAgICAgIC8vIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNhbm9uaWNhbE11bHRpcGx5KGNlLCBhcmdzKTtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gc2ltcGxpZnlNdWx0aXBseShjZSwgb3BzMiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxNdWx0aXBseShjZSwgb3BzMiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGx5KGNlLCBvcHMyLCBcIk5cIilcbiAgICAgIH1cbiAgICB9LFxuICAgIE5lZ2F0ZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQWRkaXRpdmUgSW52ZXJzZVwiLFxuICAgICAgd2lraWRhdGE6IFwiUTcxNTM1OFwiLFxuICAgICAgY29tcGxleGl0eTogMmUzLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzWzBdLmRvbWFpbjtcbiAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgICBjb25zdCBuZWdEb21haW4gPSB7XG4gICAgICAgICAgICBQb3NpdGl2ZU51bWJlcjogXCJOZWdhdGl2ZU51bWJlclwiLFxuICAgICAgICAgICAgTm9uTmVnYXRpdmVOdW1iZXI6IFwiTm9uUG9zaXRpdmVOdW1iZXJcIixcbiAgICAgICAgICAgIE5vblBvc2l0aXZlTnVtYmVyOiBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIsXG4gICAgICAgICAgICBOZWdhdGl2ZU51bWJlcjogXCJQb3NpdGl2ZU51bWJlclwiLFxuICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyOiBcIk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyOiBcIk5vblBvc2l0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyOiBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyOiBcIlBvc2l0aXZlSW50ZWdlclwiXG4gICAgICAgICAgfVthcmcubGl0ZXJhbF07XG4gICAgICAgICAgaWYgKG5lZ0RvbWFpbilcbiAgICAgICAgICAgIHJldHVybiBjZS5kb21haW4obmVnRG9tYWluKTtcbiAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICB9LFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShhcmdzKSksIFtcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTmVnYXRlXCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUoYXJnc1swXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHByb2Nlc3NOZWdhdGUoY2UsIG9wczJbMF0sIFwic2ltcGxpZnlcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHByb2Nlc3NOZWdhdGUoY2UsIG9wczJbMF0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gcHJvY2Vzc05lZ2F0ZShjZSwgb3BzMlswXSwgXCJOXCIpLFxuICAgICAgICBzZ246IChfY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gYXJnc1swXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAocyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIGlmIChzID4gMClcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocyA8IDApXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBQb3dlcjoge1xuICAgICAgd2lraWRhdGE6IFwiUTMzNDU2XCIsXG4gICAgICBjb21tdXRhdGl2ZTogZmFsc2UsXG4gICAgICBjb21wbGV4aXR5OiAzNTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IHZhbGlkYXRlQXJndW1lbnRzKGNlLCBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKSwgW1xuICAgICAgICAgICAgXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiUG93ZXJcIiwgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIGNlLnBvdyhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gcHJvY2Vzc1Bvd2VyKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzUG93ZXIoY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChjZS5udW1lcmljTW9kZSA9PT0gXCJtYWNoaW5lXCIgJiYgdHlwZW9mIG9wczJbMF0ubnVtZXJpY1ZhbHVlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBvcHMyWzFdLm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoXG4gICAgICAgICAgICAgIE1hdGgucG93KG9wczJbMF0ubnVtZXJpY1ZhbHVlLCBvcHMyWzFdLm51bWVyaWNWYWx1ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NQb3dlcihjZSwgb3BzMlswXSwgb3BzMlsxXSwgXCJOXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlZmluZWQgYXMgUmVhbE51bWJlciBmb3IgYWxsIHBvd2VyIGluIFJlYWxOdW1iZXIgd2hlbiBiYXNlID4gMDtcbiAgICAgICAgLy8gd2hlbiB4IDwgMCwgb25seSBkZWZpbmVkIGlmIG4gaXMgYW4gaW50ZWdlclxuICAgICAgICAvLyBpZiB4IGlzIGEgbm9uLXplcm8gY29tcGxleCwgZGVmaW5lZCBhcyBDb21wbGV4TnVtYmVyXG4gICAgICAgIC8vIFNxdWFyZSByb290IG9mIGEgcHJpbWUgaXMgaXJyYXRpb25hbCAoQWxnZWJyYWljTnVtYmVyKVxuICAgICAgICAvLyBodHRwczovL3Byb29md2lraS5vcmcvd2lraS9TcXVhcmVfUm9vdF9vZl9QcmltZV9pc19JcnJhdGlvbmFsXG4gICAgICAgIC8vIGV2YWxEb21haW46IChjZSwgYmFzZTogQm94ZWRFeHByZXNzaW9uLCBwb3dlcjogQm94ZWRFeHByZXNzaW9uKSA7XG4gICAgICB9XG4gICAgfSxcbiAgICBQcm9kdWN0OiB7XG4gICAgICB3aWtpZGF0YTogXCJROTAxNzE4XCIsXG4gICAgICBjb21wbGV4aXR5OiAxZTMsXG4gICAgICBob2xkOiBcImZpcnN0XCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICAvLyBbXG4gICAgICAgICAgLy8gICAnTWF5YmUnLFxuICAgICAgICAgIFwiVHVwbGVcIixcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgLy8gXSxcbiAgICAgICAgICBcIk51bWJlclwiXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGRvbWFpbkFkZChjZSwgYXJncyksXG4gICAgICAgIC8vIFRoZSAnYm9keScgYW5kICdyYW5nZScgbmVlZCB0byBiZSBpbnRlcnByZXRlZCBieSBjYW5vbmljYWxNdWx0aXBsaWNhdGlvbigpLiBEb24ndCBjYW5vbmljYWxpemUgdGhlbSB5ZXQuXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjYW5vbmljYWxQcm9kdWN0KGNlLCBvcHMyWzBdLCBvcHMyWzFdKSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsTXVsdGlwbGljYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcIk5cIilcbiAgICAgIH1cbiAgICB9LFxuICAgIFJhdGlvbmFsOiB7XG4gICAgICBjb21wbGV4aXR5OiAyNDAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgW1wiTWF5YmVcIiwgXCJOdW1iZXJcIl0sIFwiUmF0aW9uYWxOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJSYXRpb25hbFwiLCBbY2UuZXJyb3IoXCJtaXNzaW5nXCIpXSk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlJhdGlvbmFsXCIsIFtcbiAgICAgICAgICAgICAgdmFsaWRhdGVBcmd1bWVudChjZSwgYXJnc1swXSwgXCJFeHRlbmRlZFJlYWxOdW1iZXJcIilcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgYXJncywgW1wiSW50ZWdlclwiLCBcIkludGVnZXJcIl0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJSYXRpb25hbFwiLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gY2UuZGl2KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICB9LFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4gc2ltcGxpZnlEaXZpZGUoY2UsIG9wczJbMF0sIG9wczJbMV0pO1xuICAgICAgICB9LFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBbbiwgZF0gPSBbYXNTbWFsbEludGVnZXIob3BzMlswXSksIGFzU21hbGxJbnRlZ2VyKG9wczJbMV0pXTtcbiAgICAgICAgICAgIGlmIChuICE9PSBudWxsICYmIGQgIT09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoW24sIGRdKTtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGYgPSBhc0Zsb2F0KG9wczJbMF0uTigpKTtcbiAgICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihyYXRpb25hbGl6ZShmKSk7XG4gICAgICAgIH0sXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAgIG9wczJbMV0sXG4gICAgICAgICAgICAoYSwgYikgPT4gYSAvIGIsXG4gICAgICAgICAgICAoYSwgYikgPT4gYS5kaXYoYiksXG4gICAgICAgICAgICAoYSwgYikgPT4gYS5kaXYoYilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBSb290OiB7XG4gICAgICBjb21wbGV4aXR5OiAzMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiUm9vdFwiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGFyZ3MsIDIpKTtcbiAgICAgICAgICBjb25zdCBbYmFzZSwgZXhwMl0gPSBbXG4gICAgICAgICAgICB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzBdLCBcIk51bWJlclwiKSxcbiAgICAgICAgICAgIHZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMV0sIFwiTnVtYmVyXCIpXG4gICAgICAgICAgXTtcbiAgICAgICAgICBpZiAoIWV4cDIuaXNWYWxpZCB8fCAhYmFzZS5pc1ZhbGlkKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlJvb3RcIiwgW2Jhc2UsIGV4cDJdKTtcbiAgICAgICAgICByZXR1cm4gY2UucG93KGJhc2UsIGNlLmludihleHAyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFJvdW5kOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjUwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgIE1hdGgucm91bmQsXG4gICAgICAgICAgKHgpID0+IHgucm91bmQoKSxcbiAgICAgICAgICAoeCkgPT4geC5yb3VuZCgwKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgW1wiUmFuZ2VcIiwgLTEsIDFdXSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHMgPSBvcHMyWzBdLnNnbjtcbiAgICAgICAgICBpZiAocyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICAgICAgICBpZiAocyA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fT05FO1xuICAgICAgICAgIGlmIChzID09PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfT05FO1xuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gb3BzMlswXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKHMgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAocyA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX09ORTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9LFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gb3BzMlswXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKHMgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAocyA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX09ORTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduR2FtbWE6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBzaWduIG9mIHRoZSBnYW1tYSBmdW5jdGlvbjogLTEgb3IgKzFcIixcbiAgICAgIGNvbXBsZXhpdHk6IDc5MDBcbiAgICAgIC8vIEB0b2RvXG4gICAgfSxcbiAgICBTcXJ0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTcXVhcmUgUm9vdFwiLFxuICAgICAgd2lraWRhdGE6IFwiUTEzNDIzN1wiLFxuICAgICAgY29tcGxleGl0eTogM2UzLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJTcXJ0XCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5wb3coYXJnc1swXSwgY2UuX0hBTEYpO1xuICAgICAgICB9LFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzU3FydChjZSwgb3BzMlswXSwgXCJzaW1wbGlmeVwiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gcHJvY2Vzc1NxcnQoY2UsIG9wczJbMF0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gcHJvY2Vzc1NxcnQoY2UsIG9wczJbMF0sIFwiTlwiKVxuICAgICAgICAvLyBldmFsRG9tYWluOiBTcXVhcmUgcm9vdCBvZiBhIHByaW1lIGlzIGlycmF0aW9uYWxcbiAgICAgICAgLy8gaHR0cHM6Ly9wcm9vZndpa2kub3JnL3dpa2kvU3F1YXJlX1Jvb3Rfb2ZfUHJpbWVfaXNfSXJyYXRpb25hbFxuICAgICAgfVxuICAgIH0sXG4gICAgU3F1YXJlOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzA3NTE3NVwiLFxuICAgICAgY29tcGxleGl0eTogMzEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGFyZ3MgPSBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3F1YXJlXCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5wb3coYXJnc1swXSwgY2UubnVtYmVyKDIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgU3VidHJhY3Q6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlE0MDc1NFwiLFxuICAgICAgY29tcGxleGl0eTogMTM1MCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIk1heWJlXCIsIFwiTnVtYmVyXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBhcmdzID0gY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShhcmdzKSk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShhcmdzWzBdKTtcbiAgICAgICAgICBhcmdzID0gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBhcmdzLCAyKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3VidHJhY3RcIiwgYXJncyk7XG4gICAgICAgICAgaWYgKCFhcmdzLmV2ZXJ5KCh4KSA9PiB4LmlzVmFsaWQpKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlN1YnRyYWN0XCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5hZGQoW2FyZ3NbMF0sIGNhbm9uaWNhbE5lZ2F0ZShhcmdzWzFdKV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTdW06IHtcbiAgICAgIHdpa2lkYXRhOiBcIlEyMTgwMDVcIixcbiAgICAgIGNvbXBsZXhpdHk6IDFlMyxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICAvLyBbXG4gICAgICAgICAgLy8gICAnTWF5YmUnLFxuICAgICAgICAgIFwiVHVwbGVcIixcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgLy8gXSxcbiAgICAgICAgICBcIk51bWJlclwiXG4gICAgICAgIF0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjYW5vbmljYWxTdW1tYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0pLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBldmFsU3VtbWF0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsU3VtbWF0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcImV2YWx1YXRlXCIpLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxTdW1tYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiTlwiKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAge1xuICAgIC8vXG4gICAgLy8gQ29uc3RhbnRzXG4gICAgLy8gTm90ZTogY29uc3RhbnRzIGFyZSBwdXQgaW4gYSBzZXBhcmF0ZSwgc3Vic2VxdWVudCwgZGljdGlvbmFyeSBiZWNhdXNlXG4gICAgLy8gc29tZSBvZiB0aGUgdmFsdWVzIChDYXRhbGFuQ29uc3RhbnQpIHJlZmVyZW5jZSBzb21lIGZ1bmN0aW9uIG5hbWVzIChBZGQuLi4pXG4gICAgLy8gdGhhdCBhcmUgZGVmaW5lZCBhYm92ZS4gVGhpcyBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgIC8vXG4gICAgZToge1xuICAgICAgZG9tYWluOiBcIlRyYW5zY2VuZGVudGFsTnVtYmVyXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJuZXZlclwiLFxuICAgICAgdmFsdWU6IFwiRXhwb25lbnRpYWxFXCJcbiAgICB9LFxuICAgIGk6IHtcbiAgICAgIGRvbWFpbjogXCJJbWFnaW5hcnlOdW1iZXJcIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcIm5ldmVyXCIsXG4gICAgICBmbGFnczogeyBpbWFnaW5hcnk6IHRydWUgfSxcbiAgICAgIHZhbHVlOiBcIkltYWdpbmFyeVVuaXRcIlxuICAgIH0sXG4gICAgTWFjaGluZUVwc2lsb246IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbmV4dCBsYXJnZXIgZmxvYXRpbmcgcG9pbnQgbnVtYmVyXG4gICAgICAgKlxuICAgICAgICogICAgMl57XHUyMjEyNTJ9XG4gICAgICAgKlxuICAgICAgICogU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hY2hpbmVfZXBzaWxvblxuICAgICAgICovXG4gICAgICBkb21haW46IFwiUmVhbE51bWJlclwiLFxuICAgICAgaG9sZFVudGlsOiBcIk5cIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgZmxhZ3M6IHsgcmVhbDogdHJ1ZSB9LFxuICAgICAgdmFsdWU6IHsgbnVtOiBOdW1iZXIuRVBTSUxPTi50b1N0cmluZygpIH1cbiAgICB9LFxuICAgIEhhbGY6IHtcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcImV2YWx1YXRlXCIsXG4gICAgICB2YWx1ZTogW1wiUmF0aW9uYWxcIiwgMSwgMl1cbiAgICB9LFxuICAgIEltYWdpbmFyeVVuaXQ6IHtcbiAgICAgIGRvbWFpbjogXCJJbWFnaW5hcnlOdW1iZXJcIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcImV2YWx1YXRlXCIsXG4gICAgICB3aWtpZGF0YTogXCJRMTkzNzk2XCIsXG4gICAgICBmbGFnczogeyBpbWFnaW5hcnk6IHRydWUgfSxcbiAgICAgIHZhbHVlOiBbXCJDb21wbGV4XCIsIDAsIDFdXG4gICAgfSxcbiAgICBFeHBvbmVudGlhbEU6IHtcbiAgICAgIGRvbWFpbjogXCJUcmFuc2NlbmRlbnRhbE51bWJlclwiLFxuICAgICAgZmxhZ3M6IHsgYWxnZWJyYWljOiBmYWxzZSwgcmVhbDogdHJ1ZSB9LFxuICAgICAgd2lraWRhdGE6IFwiUTgyNDM1XCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICB2YWx1ZTogKGVuZ2luZSkgPT4gYmlnbnVtUHJlZmVycmVkKGVuZ2luZSkgPyBlbmdpbmUuX0JJR05VTV9PTkUuZXhwKCkgOiBNYXRoLmV4cCgxKVxuICAgIH0sXG4gICAgR29sZGVuUmF0aW86IHtcbiAgICAgIGRvbWFpbjogXCJBbGdlYnJhaWNOdW1iZXJcIixcbiAgICAgIHdpa2lkYXRhOiBcIlE0MTY5MFwiLFxuICAgICAgY29uc3RhbnQ6IHRydWUsXG4gICAgICBmbGFnczogeyBhbGdlYnJhaWM6IHRydWUgfSxcbiAgICAgIGhvbGRVbnRpbDogXCJzaW1wbGlmeVwiLFxuICAgICAgdmFsdWU6IFtcIkRpdmlkZVwiLCBbXCJBZGRcIiwgMSwgW1wiU3FydFwiLCA1XV0sIDJdXG4gICAgfSxcbiAgICBDYXRhbGFuQ29uc3RhbnQ6IHtcbiAgICAgIGRvbWFpbjogXCJSZWFsTnVtYmVyXCIsXG4gICAgICBmbGFnczogeyBhbGdlYnJhaWM6IHZvaWQgMCB9LFxuICAgICAgLy8gTm90IHByb3ZlbiBpcnJhdGlvbmFsIG9yIHRyYW5zY2VuZGVudGFsXG4gICAgICB3aWtpZGF0YTogXCJRODU1MjgyXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICB2YWx1ZToge1xuICAgICAgICAvLyBGcm9tIGh0dHA6Ly93d3cuZnVsbGJvb2tzLmNvbS9NaXNjZWxsYW5lb3VzLU1hdGhlbWF0aWNhbC1Db25zdGFudHMxLmh0bWxcbiAgICAgICAgbnVtOiBgMC45MTU5NjU1OTQxNzcyMTkwMTUwNTQ2MDM1MTQ5MzIzODQxMTA3NzQxNDkzNzQyODE2N1xuICAgICAgICAgICAgICAgICAgMjEzNDI2NjQ5ODExOTYyMTc2MzAxOTc3NjI1NDc2OTQ3OTM1NjUxMjkyNjExNTEwNjJcbiAgICAgICAgICAgICAgICAgIDQ4NTc0NDIyNjE5MTk2MTk5NTc5MDM1ODk4ODAzMzI1ODU5MDU5NDMxNTk0NzM3NDgxXG4gICAgICAgICAgICAgICAgICAxNTg0MDY5OTUzMzIwMjg3NzMzMTk0NjA1MTkwMzg3Mjc0NzgxNjQwODc4NjU5MDkwMlxuICAgICAgICAgICAgICAgICAgNDcwNjQ4NDE1MjE2MzAwMDIyODcyNzY0MDk0MjM4ODI1OTk1Nzc0MTUwODgxNjM5NzRcbiAgICAgICAgICAgICAgICAgIDcwMjUyNDgyMDExNTYwNzA3NjQ0ODgzODA3ODczMzcwNDg5OTAwODY0Nzc1MTEzMjI1XG4gICAgICAgICAgICAgICAgICA5OTcxMzQzNDA3NDg1NDA3NTUzMjMwNzY4NTY1MzM1NzY4MDk1ODM1MjYwMjE5MzgyM1xuICAgICAgICAgICAgICAgICAgMjM5NTA4MDA3MjA2ODAzNTU3NjEwNDgyMzU3MzM5NDIzMTkxNDk4Mjk4MzYxODk5NzdcbiAgICAgICAgICAgICAgICAgIDA2OTAzNjQwNDE4MDg2MjE3OTQxMTAxOTE3NTMyNzQzMTQ5OTc4MjMzOTc2MTA1NTEyXG4gICAgICAgICAgICAgICAgICAyNDc3OTUzMDMyNDg3NTM3MTg3ODY2NTgyODA4MjM2MDU3MDIyNTU5NDE5NDgxODA5N1xuICAgICAgICAgICAgICAgICAgNTM1MDk3MTEzMTU3MTI2MTU4MDQyNDI3MjM2MzY0Mzk4NTAwMTczODI4NzU5Nzc5NzZcbiAgICAgICAgICAgICAgICAgIDUzMDY4MzcwMDkyOTgwODczODg3NDk1NjEwODkzNjU5NzcxOTQwOTY4NzI2ODQ0NDQxXG4gICAgICAgICAgICAgICAgICA2NjgwNDYyMTYyNDMzOTg2NDgzODkxNjI4MDQ0ODI4MTUwNjI3MzAyMjc0MjA3Mzg4NFxuICAgICAgICAgICAgICAgICAgMzExNzIyMTgyNzIxOTA0NzIyNTU4NzA1MzE5MDg2ODU3MzU0MjM0OTg1Mzk0OTgzMDlcbiAgICAgICAgICAgICAgICAgIDkxOTExNTk2NzM4ODQ2NDUwODYxNTE1MjQ5OTYyNDIzNzA0Mzc0NTE3NzczNzIzNTE3XG4gICAgICAgICAgICAgICAgICA3NTQ0MDcwODUzODQ2NDQwMTMyMTc0ODM5Mjk5OTk0NzU3MjQ0NjE5OTc1NDk2MTk3NVxuICAgICAgICAgICAgICAgICAgODcwNjQwMDc0NzQ4NzA3MDE0OTA5Mzc2Nzg4NzMwNDU4Njk5Nzk4NjA2NDQ4NzQ5NzRcbiAgICAgICAgICAgICAgICAgIDY0Mzg3MjA2MjM4NTEzNzEyMzkyNzM2MzA0OTk4NTAzNTM5MjIzOTI4Nzg3OTc5MDYzXG4gICAgICAgICAgICAgICAgICAzNjQ0MDMyMzU0Nzg0NTM1ODUxOTI3Nzc3Nzg3MjcwOTA2MDgzMDMxOTk0MzAxMzMyM1xuICAgICAgICAgICAgICAgICAgMTY3MTI0NzYxNTg3MDk3OTI0NTU0NzkxMTkwOTIxMjYyMDE4NTQ4MDM5NjM5MzQyNDNcbiAgICAgICAgICAgICAgICAgIGBcbiAgICAgIH1cbiAgICB9LFxuICAgIEV1bGVyR2FtbWE6IHtcbiAgICAgIC8vIEZyb20gaHR0cDovL3d3dy5mdWxsYm9va3MuY29tL01pc2NlbGxhbmVvdXMtTWF0aGVtYXRpY2FsLUNvbnN0YW50czIuaHRtbFxuICAgICAgZG9tYWluOiBcIlJlYWxOdW1iZXJcIixcbiAgICAgIGZsYWdzOiB7IGFsZ2VicmFpYzogdm9pZCAwIH0sXG4gICAgICAvLyBOb3QgcHJvdmVuIGlycmF0aW9uYWwgb3IgdHJhbnNjZW5kZW50YWxcbiAgICAgIHdpa2lkYXRhOiBcIlEyNzMwMjNcIixcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIG51bTogYDAuNTc3MjE1NjY0OTAxNTMyODYwNjA2NTEyMDkwMDgyNDAyNDMxMDQyMTU5MzM1OTM5OTIzNTk4ODA1NzY3MjM0ODg0ODY3NzI2Nzc3NjZcbiAgICAgICAgICA0NjcwOTM2OTQ3MDYzMjkxNzQ2NzQ5NTE0NjMxNDQ3MjQ5ODA3MDgyNDgwOTYwNTA0MDE0NDg2NTQyODM2MjI0MTczOTk3NjQ0OTIzNTNcbiAgICAgICAgICA2MjUzNTAwMzMzNzQyOTM3MzM3NzM3NjczOTQyNzkyNTk1MjU4MjQ3MDk0OTE2MDA4NzM1MjAzOTQ4MTY1NjcwODUzMjMzMTUxNzc2NjFcbiAgICAgICAgICAxNTI4NjIxMTk5NTAxNTA3OTg0NzkzNzQ1MDg1NzA1NzQwMDI5OTIxMzU0Nzg2MTQ2Njk0MDI5NjA0MzI1NDIxNTE5MDU4Nzc1NTM1MjZcbiAgICAgICAgICA3MzMxMzk5MjU0MDEyOTY3NDIwNTEzNzU0MTM5NTQ5MTExNjg1MTAyODA3OTg0MjM0ODc3NTg3MjA1MDM4NDMxMDkzOTk3MzYxMzcyNTVcbiAgICAgICAgICAzMDYwODg5MzMxMjY3NjAwMTcyNDc5NTM3ODM2NzU5MjcxMzUxNTc3MjI2MTAyNzM0OTI5MTM5NDA3OTg0MzAxMDM0MTc3NzE3NzgwODhcbiAgICAgICAgICAxNTQ5NTcwNjYxMDc1MDEwMTYxOTE2NjMzNDAxNTIyNzg5MzU4Njc5NjU0OTcyNTIwMzYyMTI4NzkyMjY1NTU5NTM2Njk2MjgxNzYzODhcbiAgICAgICAgICA3OTI3MjY4MDEzMjQzMTAxMDQ3NjUwNTk2MzcwMzk0NzM5NDk1NzYzODkwNjU3Mjk2NzkyOTYwMTAwOTAxNTEyNTE5NTk1MDkyMjI0MzVcbiAgICAgICAgICAwMTQwOTM0OTg3MTIyODI0Nzk0OTc0NzE5NTY0Njk3NjMxODUwNjY3NjEyOTA2MzgxMTA1MTgyNDE5NzQ0NDg2NzgzNjM4MDg2MTc0OTRcbiAgICAgICAgICA1NTE2OTg5Mjc5MjMwMTg3NzM5MTA3Mjk0NTc4MTU1NDMxNjAwNTAwMjE4Mjg0NDA5NjA1Mzc3MjQzNDIwMzI4NTQ3ODM2NzAxNTE3NzNcbiAgICAgICAgICA5NDM5ODcwMDMwMjM3MDMzOTUxODMyODY5MDAwMTU1ODE5Mzk4ODA0MjcwNzQxMTU0MjIyNzgxOTcxNjUyMzAxMTA3MzU2NTgzMzk2NzNgXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgUHJlSW5jcmVtZW50OiB7XG4gICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSB9XG4gICAgfSxcbiAgICBQcmVEZWNyZW1lbnQ6IHtcbiAgICAgIHNpZ25hdHVyZTogeyBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdIH1cbiAgICB9XG4gIH1cbl07XG5mdW5jdGlvbiBwcm9jZXNzQWJzKGNlLCBhcmcsIG1vZGUpIHtcbiAgaWYgKG1vZGUgIT09IFwic2ltcGxpZnlcIikge1xuICAgIGNvbnN0IG51bSA9IGFyZy5udW1lcmljVmFsdWU7XG4gICAgaWYgKG51bSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoTWF0aC5hYnMobnVtKSk7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5hYnMoKSk7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNi5kZWZhdWx0KVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5hYnMoKSk7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICAgICAgcmV0dXJuIGNlLm51bWJlcihcbiAgICAgICAgICBtb2RlID09PSBcIk5cIiA/IE1hdGguYWJzKG51bVswXSAvIG51bVsxXSkgOiBbTWF0aC5hYnMobnVtWzBdKSwgbnVtWzFdXVxuICAgICAgICApO1xuICAgICAgaWYgKGlzQmlnUmF0aW9uYWwobnVtKSkge1xuICAgICAgICBjb25zdCBbbiwgZF0gPSBudW07XG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoXG4gICAgICAgICAgbW9kZSA9PT0gXCJOXCIgPyBjZS5iaWdudW0obikuZGl2KGNlLmJpZ251bShkKSkuYWJzKCkgOiBbbiA+IDAgPyBuIDogLW4sIGRdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChhcmcuaXNOb25OZWdhdGl2ZSlcbiAgICByZXR1cm4gYXJnO1xuICBpZiAoYXJnLmlzTmVnYXRpdmUpXG4gICAgcmV0dXJuIGNlLm5lZyhhcmcpO1xuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jYWxjdWx1cy50c1xudmFyIENBTENVTFVTX0xJQlJBUlkgPSBbXG4gIHtcbiAgICAvL1xuICAgIC8vIEZ1bmN0aW9uc1xuICAgIC8vXG4gICAgSW50ZWdyYXRlOiB7XG4gICAgICB3aWtpZGF0YTogXCJRODAwOTFcIixcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBbXCJVbmlvblwiLCBcIk5vdGhpbmdcIiwgXCJUdXBsZVwiLCBcIlN5bWJvbFwiXSxcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBvcHMyWzBdID8/IGNlLmVycm9yKFwibWlzc2luZ1wiKTtcbiAgICAgICAgICBsZXQgcmFuZ2UgPSBvcHMyWzFdO1xuICAgICAgICAgIGxldCBpbmRleCA9IG51bGw7XG4gICAgICAgICAgbGV0IGxvd2VyID0gbnVsbDtcbiAgICAgICAgICBsZXQgdXBwZXIgPSBudWxsO1xuICAgICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgICAgICAgICBpbmRleCA9IHJhbmdlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICAgICAgICAgIGxvd2VyID0gcmFuZ2Uub3BzPy5bMV0/LmNhbm9uaWNhbCA/PyBudWxsO1xuICAgICAgICAgICAgdXBwZXIgPSByYW5nZS5vcHM/LlsyXT8uY2Fub25pY2FsID8/IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIkhvbGRcIilcbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXgub3AxO1xuICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIlJlbGVhc2VIb2xkXCIpXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4Lm9wMS5ldmFsdWF0ZSgpO1xuICAgICAgICAgIGluZGV4ID8/IChpbmRleCA9IGNlLnN5bWJvbChcIk5vdGhpbmdcIikpO1xuICAgICAgICAgIGlmICghaW5kZXguc3ltYm9sKVxuICAgICAgICAgICAgaW5kZXggPSBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIFwiU3ltYm9sXCIsIGluZGV4LmRvbWFpbl0pO1xuICAgICAgICAgIGlmIChsb3dlcilcbiAgICAgICAgICAgIGxvd2VyID0gdmFsaWRhdGVBcmd1bWVudChjZSwgbG93ZXIsIFwiTnVtYmVyXCIpO1xuICAgICAgICAgIGlmICh1cHBlcilcbiAgICAgICAgICAgIHVwcGVyID0gdmFsaWRhdGVBcmd1bWVudChjZSwgdXBwZXIsIFwiTnVtYmVyXCIpO1xuICAgICAgICAgIGlmIChsb3dlciAmJiB1cHBlcilcbiAgICAgICAgICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBsb3dlciwgdXBwZXJdKTtcbiAgICAgICAgICBlbHNlIGlmICh1cHBlcilcbiAgICAgICAgICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBjZS5fTkVHQVRJVkVfSU5GSU5JVFksIHVwcGVyXSk7XG4gICAgICAgICAgZWxzZSBpZiAobG93ZXIpXG4gICAgICAgICAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXJdKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByYW5nZSA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJJbnRlZ3JhdGVcIiwgW2JvZHkuY2Fub25pY2FsLCByYW5nZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jb2xsZWN0aW9ucy50c1xudmFyIENPTExFQ1RJT05TX0xJQlJBUlkgPSB7XG4gIFNlcXVlbmNlOiB7XG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIlxuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvY29tcGxleC50c1xudmFyIENPTVBMRVhfTElCUkFSWSA9IFtcbiAge1xuICAgIFJlYWw6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDMgPSBvcHMyWzBdLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICBpZiAob3AzID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoY2UuaXNDb21wbGV4KG9wMykpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKG9wMy5yZSk7XG4gICAgICAgICAgcmV0dXJuIG9wczJbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEltYWdpbmFyeToge1xuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMyA9IG9wczJbMF0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICAgIGlmIChvcDMgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGlmIChjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIob3AzLmltKTtcbiAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEFyZ3VtZW50OiB7XG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3AzID0gb3BzMlswXS5udW1lcmljVmFsdWU7XG4gICAgICAgICAgaWYgKG9wMyA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKGNlLmlzQ29tcGxleChvcDMpKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDMuYXJnKCkpO1xuICAgICAgICAgIGNvbnN0IGYgPSBhc0Zsb2F0KG9wczJbMF0pO1xuICAgICAgICAgIGlmIChmID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoZiA+PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigwKTtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKE1hdGguUEkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBBYnNBcmc6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJUdXBsZVwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMyA9IG9wczJbMF0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICAgIGlmIChvcDMgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGlmIChjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiBjZS50dXBsZShbY2UubnVtYmVyKG9wMy5hYnMoKSksIGNlLm51bWJlcihvcDMuYXJnKCkpXSk7XG4gICAgICAgICAgY29uc3QgZiA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS50dXBsZShbXG4gICAgICAgICAgICBjZS5udW1iZXIoTWF0aC5hYnMoZikpLFxuICAgICAgICAgICAgY2UubnVtYmVyKGYgPj0gMCA/IDAgOiBNYXRoLlBJKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb25qdWdhdGU6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDMgPSBvcHMyWzBdLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICBpZiAob3AzID09PSBudWxsIHx8ICFjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDMuY29uanVnYXRlKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb21wbGV4Um9vdHM6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJMaXN0XCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgY29uc3QgbiA9IGFzRmxvYXQob3BzMlsxXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwgfHwgbiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDw9IDApXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGNvbnN0IHJvb3RzID0gW107XG4gICAgICAgICAgY29uc3QgW3JlLCBpbV0gPSBjZS5pc0NvbXBsZXgoeCkgPyBbeC5yZSwgeC5pbV0gOiBbeCwgMF07XG4gICAgICAgICAgY29uc3QgYXJnID0gTWF0aC5hdGFuMihpbSwgcmUpO1xuICAgICAgICAgIGNvbnN0IG1vZDIgPSBNYXRoLnNxcnQocmUgKiByZSArIGltICogaW0pO1xuICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCB0aGV0YSA9IChhcmcgKyAyICogTWF0aC5QSSAqIGspIC8gbjtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnBvdyhtb2QyLCAxIC8gbik7XG4gICAgICAgICAgICByb290cy5wdXNoKFtyICogTWF0aC5jb3ModGhldGEpLCByICogTWF0aC5zaW4odGhldGEpXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjZS5ib3goW1xuICAgICAgICAgICAgXCJMaXN0XCIsXG4gICAgICAgICAgICAuLi5yb290cy5tYXAoXG4gICAgICAgICAgICAgIChyKSA9PiBjZS5udW1iZXIoclsxXSAhPT0gMCA/IGNlLmNvbXBsZXgoclswXSwgclsxXSkgOiByWzBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciBBYnMgKG1hZ25pdHVkZSkgc2VlIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3Byb2Nlc3NBYnNcbiAgfVxuXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvcmFuZG9tLWV4cHJlc3Npb24udHNcbmZ1bmN0aW9uIG9uZU9mKHhzKSB7XG4gIHJldHVybiB4c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB4cy5sZW5ndGgpXTtcbn1cbmZ1bmN0aW9uIHJhbmRvbUV4cHJlc3Npb25XaXRoSGVhZChoZWFkMiwgbGV2ZWwpIHtcbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiIHx8IGhlYWQyID09PSBcIk11bHRpcGx5XCIpIHtcbiAgICBjb25zdCBvcHMyID0gW107XG4gICAgbGV0IGNvdW50ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEyKTtcbiAgICB3aGlsZSAoY291bnQgPiAwKSB7XG4gICAgICBvcHMyLnB1c2gocmFuZG9tRXhwcmVzc2lvbihsZXZlbCArIDEpKTtcbiAgICAgIGNvdW50IC09IDE7XG4gICAgfVxuICAgIHJldHVybiBbaGVhZDIsIC4uLm9wczJdO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEaXZpZGVcIiB8fCBoZWFkMiA9PT0gXCJQb3dlclwiKSB7XG4gICAgcmV0dXJuIFtoZWFkMiwgcmFuZG9tRXhwcmVzc2lvbihsZXZlbCArIDEpLCByYW5kb21FeHByZXNzaW9uKGxldmVsICsgMSldO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJSb290XCIpIHtcbiAgICByZXR1cm4gW2hlYWQyLCByYW5kb21FeHByZXNzaW9uKGxldmVsICsgMSksIHJhbmRvbUV4cHJlc3Npb24oMTApXTtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwidHJpZ1wiKVxuICAgIHJldHVybiByYW5kb21UcmlnKCk7XG4gIHJldHVybiBbaGVhZDIsIHJhbmRvbUV4cHJlc3Npb24obGV2ZWwgKyAxKV07XG59XG5mdW5jdGlvbiByYW5kb21UcmlnKCkge1xuICByZXR1cm4gW1xuICAgIG9uZU9mKFtcbiAgICAgIFwiQ29zXCIsXG4gICAgICBcIlNpblwiLFxuICAgICAgXCJUYW5cIixcbiAgICAgIFwiU2luaFwiLFxuICAgICAgXCJBcmNjb3NcIixcbiAgICAgIFwiQXJzaW5oXCIsXG4gICAgICBbXCJJbnZlcnNlRnVuY3Rpb25cIiwgXCJDb3NcIl1cbiAgICBdKSxcbiAgICBvbmVPZihbXG4gICAgICBcIlBpXCIsXG4gICAgICBcIi0xXCIsXG4gICAgICBcIjBcIixcbiAgICAgIFwiMVwiLFxuICAgICAgW1wiRGl2aWRlXCIsIFwiUGlcIiwgLTVdLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgLTIsIFtcIkRpdmlkZVwiLCBcIlBpXCIsIDExXV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCBcIkhhbGZcIiwgXCJQaVwiXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDUsIFwiUGlcIl0sXG4gICAgICBbXCJNdWx0aXBseVwiLCAxMiwgXCJQaVwiXSxcbiAgICAgIFtcIkRpdmlkZVwiLCBcIlBpXCIsIDVdLFxuICAgICAgW1wiRGl2aWRlXCIsIFwiUGlcIiwgOV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCA1LCBbXCJEaXZpZGVcIiwgXCJQaVwiLCA5XV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCAyLCBbXCJEaXZpZGVcIiwgXCJQaVwiLCAxMV1dLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgMiwgW1wiRGl2aWRlXCIsIFwiUGlcIiwgM11dXG4gICAgXSlcbiAgXTtcbn1cbmZ1bmN0aW9uIHJhbmRvbUV4cHJlc3Npb24obGV2ZWwpIHtcbiAgbGV2ZWwgPz8gKGxldmVsID0gMSk7XG4gIGlmIChsZXZlbCA9PT0gMSkge1xuICAgIGNvbnN0IGggPSBvbmVPZihbXG4gICAgICBbXG4gICAgICAgIFwiU3FydFwiLFxuICAgICAgICBbXG4gICAgICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgICAgIDYsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJTdW1cIixcbiAgICAgICAgICAgIFtcIkRpdmlkZVwiLCAxLCBbXCJQb3dlclwiLCBcIm5cIiwgMl1dLFxuICAgICAgICAgICAgW1wiVHJpcGxlXCIsIFtcIkhvbGRcIiwgXCJuXCJdLCAxLCB7IG51bTogXCIrSW5maW5pdHlcIiB9XVxuICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgICAgXSxcbiAgICAgIFwiQWRkXCIsXG4gICAgICBcIkFkZFwiLFxuICAgICAgXCJBZGRcIixcbiAgICAgIFwiQWRkXCIsXG4gICAgICBcIkFkZFwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJEaXZpZGVcIixcbiAgICAgIFwiRGl2aWRlXCIsXG4gICAgICBcIkRpdmlkZVwiLFxuICAgICAgXCJSb290XCIsXG4gICAgICBcIlNxcnRcIixcbiAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgIFwiTmVnYXRlXCIsXG4gICAgICBcInRyaWdcIlxuICAgIF0pO1xuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiByYW5kb21FeHByZXNzaW9uV2l0aEhlYWQoaCwgMSk7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgaWYgKGxldmVsID09PSAyKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgaWYgKHIgPiAwLjc1KVxuICAgICAgcmV0dXJuIHJhbmRvbUV4cHJlc3Npb24oMSk7XG4gICAgaWYgKHIgPiAwLjUpXG4gICAgICByZXR1cm4gcmFuZG9tRXhwcmVzc2lvbigzKTtcbiAgICBjb25zdCBoID0gb25lT2YoW1xuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJBZGRcIixcbiAgICAgIFwiUG93ZXJcIixcbiAgICAgIFwidHJpZ1wiLFxuICAgICAgXCJMblwiLFxuICAgICAgXCJFeHBcIlxuICAgIF0pO1xuICAgIHJldHVybiByYW5kb21FeHByZXNzaW9uV2l0aEhlYWQoaCwgMik7XG4gIH1cbiAgcmV0dXJuIG9uZU9mKFtcbiAgICAtMTIzNDVlLTksXG4gICAgLTIsXG4gICAgLTIsXG4gICAgLTIsXG4gICAgLTMsXG4gICAgLTUsXG4gICAgLTYsXG4gICAgLTEyLFxuICAgIC0xNjU0ZS02MCxcbiAgICAwLFxuICAgIDAsXG4gICAgMTIzNDVlLTgsXG4gICAgMTY1NGUtNjAsXG4gICAgMSxcbiAgICAyLFxuICAgIDIsXG4gICAgMixcbiAgICAyLFxuICAgIDMsXG4gICAgMyxcbiAgICA1LFxuICAgIDUsXG4gICAgNixcbiAgICA2LFxuICAgIDEyMzQuNTY3OCxcbiAgICA1Njc4LjEyMzQsXG4gICAgMTAsXG4gICAgMTUsXG4gICAgMTgsXG4gICAgMzAsXG4gICAgNjAsXG4gICAgMTIzNGU1NCxcbiAgICBcIjEyMzQ1Njc4OS4xMjM0NTY3ODkxMjM0NWUyMDBcIixcbiAgICBcIjk4NzY1NDMyMS4xMjM0NTY3ODkxMjM0NVwiLFxuICAgIFtcIlJhdGlvbmFsXCIsIC02LCAxMF0sXG4gICAgW1wiUmF0aW9uYWxcIiwgLTEyLCAxNV0sXG4gICAgW1wiUmF0aW9uYWxcIiwgLTE1LCAxMl0sXG4gICAgW1wiUmF0aW9uYWxcIiwgMywgNV0sXG4gICAgW1wiUmF0aW9uYWxcIiwgMTIsIDE1XSxcbiAgICBbXCJSYXRpb25hbFwiLCAxNSwgMTJdLFxuICAgIFwiRXhwb25lbnRpYWxFXCIsXG4gICAgLy8gJ0ltYWdpbmFyeVVuaXQnLFxuICAgIFtcIlNxcnRcIiwgM10sXG4gICAgW1wiU3FydFwiLCA1XSxcbiAgICBbXCJTcXJ0XCIsIDE1XSxcbiAgICBbXCJTcXJ0XCIsIDI1XSxcbiAgICBbXCJDb21wbGV4XCIsIC0xLjEsIDEuMV0sXG4gICAgW1wiQ29tcGxleFwiLCA0LCA1XSxcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBbXCJBZGRcIiwgXCJ4XCIsIDFdLFxuICAgIFtcIkRpdmlkZVwiLCBcInhcIiwgM10sXG4gICAgW1wiU3F1YXJlXCIsIFwieFwiXSxcbiAgICBbXCJQb3dlclwiLCBcInhcIiwgM10sXG4gICAgW1wiUG93ZXJcIiwgXCJ4XCIsIDRdLFxuICAgIFtcIlN1YnRyYWN0XCIsIFwieFwiLCAxXSxcbiAgICBbXCJBZGRcIiwgXCJ4XCIsIDFdLFxuICAgIC8vICdhJyxcbiAgICAvLyAnYicsXG4gICAgXCJQaVwiXG4gIF0pO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jb3JlLnRzXG52YXIgQ09SRV9MSUJSQVJZID0gW1xuICB7XG4gICAgTm90aGluZzogeyBkb21haW46IFwiTm90aGluZ1wiIH1cbiAgfSxcbiAgLy9cbiAgLy8gRGF0YSBTdHJ1Y3R1cmVzXG4gIC8vXG4gIHtcbiAgICBMaXN0OiB7XG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiTWF5YmVcIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXV0sIFwiTGlzdFwiXVxuICAgICAgfVxuICAgIH0sXG4gICAgS2V5VmFsdWVQYWlyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJBIGtleS92YWx1ZSBwYWlyXCIsXG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlN0cmluZ1wiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBbXCJUdXBsZVwiLCBcIlN0cmluZ1wiLCBcIkFueXRoaW5nXCJdXG4gICAgICAgIF0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGNlLmRvbWFpbihbXCJUdXBsZVwiLCBcIlN0cmluZ1wiLCBhcmdzWzFdLmRvbWFpbl0pLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMF0/LmNhbm9uaWNhbCwgXCJTdHJpbmdcIik7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzFdPy5jYW5vbmljYWwsIFwiVmFsdWVcIik7XG4gICAgICAgICAgcmV0dXJuIGNlLnR1cGxlKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFNpbmdsZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQSB0dXBsZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnRcIixcbiAgICAgIGNvbXBsZXhpdHk6IDgyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkFueXRoaW5nXCIsIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIl1dLFxuICAgICAgICBjb2RvbWFpbjogKGNlLCBhcmdzKSA9PiBjZS5kb21haW4oW1wiVHVwbGVcIiwgYXJnc1swXS5kb21haW5dKSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IGNlLnR1cGxlKHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgY2Fub25pY2FsKG9wczIpLCAxKSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFBhaXI6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdHVwbGUgb2YgdHdvIGVsZW1lbnRzXCIsXG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIkFueXRoaW5nXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXVxuICAgICAgICBdLFxuICAgICAgICBjb2RvbWFpbjogKGNlLCBhcmdzKSA9PiBjZS5kb21haW4oW1wiVHVwbGVcIiwgYXJnc1swXS5kb21haW4sIGFyZ3NbMV0uZG9tYWluXSksXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS50dXBsZSh2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMikpXG4gICAgICB9XG4gICAgfSxcbiAgICBUcmlwbGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdHVwbGUgb2YgdGhyZWUgZWxlbWVudHNcIixcbiAgICAgIGNvbXBsZXhpdHk6IDgyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBcIkFueXRoaW5nXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiLCBcIkFueXRoaW5nXCJdXG4gICAgICAgIF0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGNlLmRvbWFpbihbXCJUdXBsZVwiLCBhcmdzWzBdLmRvbWFpbiwgYXJnc1sxXS5kb21haW4sIGFyZ3NbMl0uZG9tYWluXSksXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS50dXBsZSh2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMykpXG4gICAgICB9XG4gICAgfSxcbiAgICBUdXBsZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQSBmaXhlZCBudW1iZXIgb2YgaGV0ZXJvZ2VuZW91cyBlbGVtZW50c1wiLFxuICAgICAgY29tcGxleGl0eTogODIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgICBbXCJUdXBsZVwiLCBbXCJTZXF1ZW5jZVwiLCBcIkFueXRoaW5nXCJdXVxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UudHVwbGUoY2Fub25pY2FsKG9wczIpKSxcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gY2UuZG9tYWluKFtcIlR1cGxlXCIsIC4uLmFyZ3MubWFwKCh4KSA9PiB4LmRvbWFpbildKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy9cbiAgLy8gSW5lcnQgZnVuY3Rpb25zXG4gIC8vXG4gIHtcbiAgICBCYXNlRm9ybToge1xuICAgICAgZGVzY3JpcHRpb246IFwiYEJhc2VGb3JtKGV4cHIsIGJhc2U9MTApYFwiLFxuICAgICAgY29tcGxleGl0eTogOWUzLFxuICAgICAgaW5lcnQ6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFtcIk1heWJlXCIsIFwiSW50ZWdlclwiXSwgXCJWYWx1ZVwiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IGFyZ3NbMF0uZG9tYWluXG4gICAgICB9XG4gICAgfSxcbiAgICBEZWxpbWl0ZXI6IHtcbiAgICAgIC8vIFVzZSB0byByZXByZXNlbnQgZ3JvdXBzIG9mIGV4cHJlc3Npb25zLiBOYW1lZCBhZnRlciBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWxpbWl0ZXJcbiAgICAgIGNvbXBsZXhpdHk6IDllMyxcbiAgICAgIGhvbGQ6IFwiZmlyc3RcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLFxuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdLFxuICAgICAgICBjb2RvbWFpbjogKF9jZSwgYXJncykgPT4gYXJnc1swXS5kb21haW4sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBhcmdzWzBdPy5jYW5vbmljYWwgPz8gY2UuYm94KFtcIlNlcXVlbmNlXCJdKVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJyb3I6IHtcbiAgICAgIC8qKlxuICAgICAgICogLSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGBbXCJFcnJvckNvZGVcIl1gXG4gICAgICAgKiBleHByZXNzaW9uIGluZGljYXRpbmcgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuXG4gICAgICAgKiAtIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQsIGluZGljYXRlcyB0aGUgY29udGV4dC9sb2NhdGlvblxuICAgICAgICogb2YgdGhlIGVycm9yLiBJZiB0aGUgZXJyb3Igb2NjdXIgd2hpbGUgcGFyc2luZyBhIExhVGVYIHN0cmluZyxcbiAgICAgICAqIGZvciBleGFtcGxlLCB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIGBMYXRleGAgZXhwcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgY29tcGxleGl0eTogNTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBbXCJNYXliZVwiLCBcIkFueXRoaW5nXCJdLCBcIlZvaWRcIl0sXG4gICAgICAgIC8vIFRvIG1ha2UgYSBjYW5vbmljYWwgZXhwcmVzc2lvbiwgZG9uJ3QgY2Fub25pY2FsaXplIHRoZSBhcmdzXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJFcnJvclwiLCBhcmdzKVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJyb3JDb2RlOiB7XG4gICAgICBjb21wbGV4aXR5OiA1MDAsXG4gICAgICBob2xkOiBcImFsbFwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlN0cmluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLFxuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvZGUgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzBdLCBcIlN0cmluZ1wiKS5zdHJpbmc7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IFwiaW5jb21wYXRpYmxlLWRvbWFpblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiRXJyb3JDb2RlXCIsIFtcbiAgICAgICAgICAgICAgY2Uuc3RyaW5nKGNvZGUpLFxuICAgICAgICAgICAgICBjZS5kb21haW4oYXJnc1sxXSA/PyBcIkFueXRoaW5nXCIpLFxuICAgICAgICAgICAgICBjZS5kb21haW4oYXJnc1syXSA/PyBcIkFueXRoaW5nXCIpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkVycm9yQ29kZVwiLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSG9sZDoge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gYXJnc1swXS5zeW1ib2wgPyBjZS5kb21haW4oXCJTeW1ib2xcIikgOiBjZS5kb21haW4oXCJBbnl0aGluZ1wiKSxcbiAgICAgICAgLy8gVG8gbWFrZSBhIGNhbm9uaWNhbCBleHByZXNzaW9uLCBkb24ndCBjYW5vbmljYWxpemUgdGhlIGFyZ3NcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGFyZ3MubGVuZ3RoICE9PSAxID8gY2UuX2ZuKFwiSG9sZFwiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGFyZ3MsIDEpKSA6IGNlLl9mbihcIkhvbGRcIiwgW3ZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMF0sIFwiQW55dGhpbmdcIildKVxuICAgICAgfVxuICAgIH0sXG4gICAgSG9yaXpvbnRhbFNwYWNpbmc6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgICByZXR1cm4gYXJnc1swXS5jYW5vbmljYWw7XG4gICAgICAgICAgcmV0dXJuIGNlLmJveChbXCJTZXF1ZW5jZVwiXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFN0eWxlOiB7XG4gICAgICBjb21wbGV4aXR5OiA5ZTMsXG4gICAgICBpbmVydDogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiRGljdGlvbmFyeVwiXSxcbiAgICAgICAgICAvLyBAdG9kb1xuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdXG4gICAgICB9XG4gICAgICAvLyBAdG9kbzogc2ltcGxpZnk6IG1lcmdlIFN0eWxlKFN0eWxlKHgsIHMxKSwgczIpLCAgU3R5bGUoeCkgLT4geFxuICAgIH1cbiAgfSxcbiAge1xuICAgIEFwcGx5OiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgIGV2YWx1YXRlOiAoX2NlLCBvcHMyKSA9PiBhcHBseShvcHMyWzBdLCBvcHMyLnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH0sXG4gICAgQWJvdXQ6IHsgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJGdW5jdGlvblwiIH0gfSxcbiAgICBCbG9jazoge1xuICAgICAgLyoqIENyZWF0ZSBhIGxvY2FsIHNjb3BlLiBGaXJzdCBhcmd1bWVudCBpcyBhIGRpY3Rpb25hcnkgb2YgbG9jYWwgdmFyaWFibGVzLlxuICAgICAgICogVGhleSBhcmUgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgc2NvcGUuIFRoZSBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAqIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgc2NvcGUuXG4gICAgICAgKiBbXCJCbG9ja1wiLCBbXCJMaXN0XCIsIFtcIkVxdWFsXCIsIFwieFwiLCAxXV0sIFsuLi5dXVxuICAgICAgICovXG4gICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIkZ1bmN0aW9uXCIgfVxuICAgIH0sXG4gICAgRGVyaXZhdGl2ZToge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJGdW5jdGlvblwiLCBbXCJNYXliZVwiLCBcIk51bWJlclwiXSwgXCJGdW5jdGlvblwiXVxuICAgICAgfVxuICAgIH0sXG4gICAgRG9tYWluOiB7XG4gICAgICAvKiogUmV0dXJuIHRoZSBkb21haW4gb2YgYW4gZXhwcmVzc2lvbiAqL1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBcIkRvbWFpblwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IGNlLmRvbWFpbih2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMSlbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBFdmFsdWF0ZToge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IGFyZ3NbMF0uZG9tYWluLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UuX2ZuKFwiRXZhbHVhdGVcIiwgdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBjYW5vbmljYWwob3BzMiksIDEpKSxcbiAgICAgICAgZXZhbHVhdGU6IChfY2UsIG9wczIpID0+IG9wczJbMF0uZXZhbHVhdGUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgSGVhZDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogXCJGdW5jdGlvblwiLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3AxMiA9IG9wczJbMF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcDEyPy5oZWFkID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChvcDEyLmhlYWQpO1xuICAgICAgICAgIHJldHVybiBvcDEyPy5oZWFkID8/IGNlLnN5bWJvbChcIk5vdGhpbmdcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEh0bWw6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiVmFsdWVcIiwgXCJTdHJpbmdcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKFwiXCIpO1xuICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIExhbWJkYToge1xuICAgICAgd2lraWRhdGE6IFwiUTU2NzYxMlwiLFxuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiQW55dGhpbmdcIiwgXCJGdW5jdGlvblwiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIG9wczIpID0+IG9wczJbMF0uZG9tYWluLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UuX2ZuKFwiTGFtYmRhXCIsIHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgb3BzMiwgMSkpXG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduYXR1cmVzOiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlN5bWJvbFwiLCBbXCJNYXliZVwiLCBbXCJMaXN0XCIsIFwiRG9tYWluXCJdXV0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgb3BzMiA9IHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgb3BzMiwgMSk7XG4gICAgICAgICAgaWYgKCFvcHMyWzBdLnN5bWJvbClcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJTaWduYXR1cmVzXCIsIFtcbiAgICAgICAgICAgICAgY2UuZXJyb3IoXG4gICAgICAgICAgICAgICAgW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBvcHMyWzBdLmRvbWFpbl0sXG4gICAgICAgICAgICAgICAgb3BzMlswXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU2lnbmF0dXJlc1wiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHMyWzBdLnN5bWJvbDtcbiAgICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjZS5sb29rdXBGdW5jdGlvbihuYW1lKTtcbiAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIkxpc3RcIiwgW3Jlc3VsdC5zaWduYXR1cmUuZG9tYWluXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFN1YnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYFN1YnNjcmlwdGAgZnVuY3Rpb24gY2FuIHRha2Ugc2V2ZXJhbCBmb3JtczpcbiAgICAgICAqXG4gICAgICAgKiBJZiBgb3AxYCBpcyBhIHN0cmluZywgdGhlIHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBhIG51bWJlciBpblxuICAgICAgICogYmFzZSBgb3AyYCAoMiB0byAzNikuXG4gICAgICAgKlxuICAgICAgICogSWYgYG9wMWAgaXMgYW4gaW5kZXhhYmxlIGNvbGxlY3Rpb24sIGB4YDpcbiAgICAgICAqIC0gYHhfKmAgLT4gYEF0KHgsICopYFxuICAgICAgICpcbiAgICAgICAqIE90aGVyd2lzZTpcbiAgICAgICAqIC0gYHhfMGAgLT4gU3ltYm9sIFwieF8wXCJcbiAgICAgICAqIC0gYHhfbmAgLT4gU3ltYm9sIFwieF9uXCJcbiAgICAgICAqIC0gYHhfe1xcdGV4dHttYXh9fWAgLT4gU3ltYm9sIGB4X21heGBcbiAgICAgICAqIC0gYHhfeyhuKzEpfWAgLT4gYEF0KHgsIG4rMSlgXG4gICAgICAgKiAtIGB4X3tuKzF9YCAtPiAgYFN1YnNjcmlwdCh4LCBuKzEpYFxuICAgICAgICovXG4gICAgICAvLyBUaGUgbGFzdCAoc3Vic2NyaXB0KSBhcmd1bWVudCBjYW4gaW5jbHVkZSBhIGRlbGltaXRlciB0aGF0XG4gICAgICAvLyBuZWVkcyB0byBiZSBpbnRlcnByZXRlZC4gV2l0aG91dCB0aGUgaG9sZCwgaXQgd291bGQgZ2V0XG4gICAgICAvLyByZW1vdmVkIGR1cmluZyBjYW5vbmljYWxpemF0aW9uLlxuICAgICAgaG9sZDogXCJsYXN0XCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkFueXRoaW5nXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAoYXJnc1swXS5pc0Z1bmN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3NbMF0uZG9tYWluO1xuICAgICAgICAgIHJldHVybiBhcmdzWzBdLmRvbWFpbjtcbiAgICAgICAgfSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDEyID0gYXJnc1swXTtcbiAgICAgICAgICBjb25zdCBvcDIyID0gYXJnc1sxXTtcbiAgICAgICAgICBpZiAob3AxMi5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhc1NtYWxsSW50ZWdlcihvcDIyKTtcbiAgICAgICAgICAgIGlmIChiYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmIChiYXNlID4gMSAmJiBiYXNlIDw9IDM2KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZhbHVlLCByZXN0XSA9IGZyb21EaWdpdHMob3AxMi5zdHJpbmcsIGJhc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2UuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFtcInVuZXhwZWN0ZWQtZGlnaXRcIiwgeyBzdHI6IHJlc3RbMF0gfV0sXG4gICAgICAgICAgICAgICAgICAgIFtcIkxhdGV4XCIsIGNlLnN0cmluZyhvcDEyLnN0cmluZyldXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3AxMi5zeW1ib2wpIHtcbiAgICAgICAgICAgIGlmIChvcDEyLnN5bWJvbERlZmluaXRpb24/LmF0KVxuICAgICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiQXRcIiwgW29wMTIsIG9wMjIuY2Fub25pY2FsXSk7XG4gICAgICAgICAgICBjb25zdCBzdWIyID0gb3AyMi5zdHJpbmcgPz8gb3AyMi5zeW1ib2wgPz8gYXNTbWFsbEludGVnZXIob3AyMik/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoc3ViMilcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChvcDEyLnN5bWJvbCArIFwiX1wiICsgc3ViMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcDIyLmhlYWQgPT09IFwiU2VxdWVuY2VcIilcbiAgICAgICAgICAgIGNlLl9mbihcIlN1YnNjcmlwdFwiLCBbb3AxMiwgY2UuX2ZuKFwiTGlzdFwiLCBvcDIyLm9wcyldKTtcbiAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3Vic2NyaXB0XCIsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTeW1ib2w6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDUwMCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnN0cnVjdCBhIG5ldyBzeW1ib2wgd2l0aCBhIG5hbWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGFyZ3VtZW50c1wiLFxuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIkFueXRoaW5nXCJdLCBcIkFueXRoaW5nXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IG9wczIubWFwKFxuICAgICAgICAgICAgKHgpID0+IHguc3ltYm9sID8/IHguc3RyaW5nID8/IGFzU21hbGxJbnRlZ2VyKHgpPy50b1N0cmluZygpID8/IFwiXCJcbiAgICAgICAgICApLmpvaW4oXCJcIik7XG4gICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChhcmcpO1xuICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGEgYFtcIlN5bWJvbFwiXWAgZXhwcmVzc2lvbiBpcyBuZXZlciBldmFsdWF0ZWQsIGl0IGdldHNcbiAgICAgICAgLy8gdHJhbnNmb3JtZWQgaW50byBzb21ldGhpbmcgZWxzZSAoYSBzeW1ib2wpIGR1cmluZyBjYW5vbmljYWxpemF0aW9uXG4gICAgICB9XG4gICAgfSxcbiAgICBUYWlsOiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFtcIkxpc3RcIiwgXCJWYWx1ZVwiXV0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IG9wczJbMF0gPyBjZS5fZm4oXCJMaXN0XCIsIG9wczJbMF0ub3BzID8/IFtdKSA6IGNlLl9mbihcIkxpc3RcIiwgW10pXG4gICAgICB9XG4gICAgfSxcbiAgICBUaW1pbmc6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImBUaW1pbmcoZXhwcilgIGV2YWx1YXRlcyBgZXhwcmAgYW5kIHJldHVybiBhIGBQYWlyYCBvZiB0aGUgbnVtYmVyIG9mIHNlY29uZCBlbGFwc2VkIGZvciB0aGUgZXZhbHVhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZXZhbHVhdGlvblwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlZhbHVlXCIsXG4gICAgICAgICAgW1wiTWF5YmVcIiwgXCJJbnRlZ2VyXCJdLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiVmFsdWVcIiwgXCJOdW1iZXJcIl1cbiAgICAgICAgXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyWzFdLnN5bWJvbCA9PT0gXCJOb3RoaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSBvcHMyWzBdLmV2YWx1YXRlKCk7XG4gICAgICAgICAgICBjb25zdCB0aW1pbmcgPSAxZTMgKiAoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgIHJldHVybiBjZS5wYWlyKGNlLm51bWJlcih0aW1pbmcpLCByZXN1bHQyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG4gPSBNYXRoLm1heCgzLCBNYXRoLnJvdW5kKGFzU21hbGxJbnRlZ2VyKG9wczJbMV0pID8/IDMpKTtcbiAgICAgICAgICBsZXQgdGltaW5ncyA9IFtdO1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgd2hpbGUgKG4gPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICByZXN1bHQgPSBvcHMyWzBdLmV2YWx1YXRlKCk7XG4gICAgICAgICAgICB0aW1pbmdzLnB1c2goMWUzICogKGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCkpO1xuICAgICAgICAgICAgbiAtPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtYXgyID0gTWF0aC5tYXgoLi4udGltaW5ncyk7XG4gICAgICAgICAgY29uc3QgbWluMiA9IE1hdGgubWluKC4uLnRpbWluZ3MpO1xuICAgICAgICAgIHRpbWluZ3MgPSB0aW1pbmdzLmZpbHRlcigoeCkgPT4geCA+IG1pbjIgJiYgeCA8IG1heDIpO1xuICAgICAgICAgIGNvbnN0IHN1bTIgPSB0aW1pbmdzLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKTtcbiAgICAgICAgICBpZiAoc3VtMiA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5wYWlyKGNlLm51bWJlcihtYXgyKSwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gY2UucGFpcihjZS5udW1iZXIoc3VtMiAvIHRpbWluZ3MubGVuZ3RoKSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB7bmFtZTogJ1BhdHRlcm4nLH0sXG4gIH0sXG4gIC8vXG4gIC8vIFN0cmluZy1yZWxhdGVkXG4gIC8vXG4gIHtcbiAgICBGcm9tRGlnaXRzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogYFxcYEZyb21EaWdpdHMocywgYmFzZT0xMClcXGAgICAgICAgcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZyBcXGBzXFxgIGluIGJhc2UgXFxgYmFzZVxcYC5gLFxuICAgICAgLy8gQHRvZG8gY291bGQgYWNjZXB0IGAweGNhZmVgLCBgMGIwMTAxMGAgb3IgYChkZWFkYmVlZilfMTZgIGFzIHN0cmluZyBmb3JtYXRzXG4gICAgICAvLyBAdG9kbyBjb3VsZCBhY2NlcHQgXCJyb21hblwiLi4uIGFzIGJhc2VcbiAgICAgIC8vIEB0b2RvIGNvdWxkIGFjY2VwdCBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgYXMgdGhlIChwYWRkZWQpIGxlbmd0aCBvZiB0aGUgb3V0cHV0XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlN0cmluZ1wiLCBbXCJNYXliZVwiLCBbXCJSYW5nZVwiLCAxLCAzNl1dLCBcIkludGVnZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDEyID0gb3BzMlswXTtcbiAgICAgICAgICBpZiAoIW9wMTIuc3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgXCJTdHJpbmdcIiwgb3AxMi5kb21haW5dLCBvcDEyKTtcbiAgICAgICAgICBjb25zdCBvcDIyID0gb3BzMlsxXTtcbiAgICAgICAgICBpZiAob3AyMi5pc05vdGhpbmcpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKE51bWJlci5wYXJzZUludChvcDEyLnN0cmluZywgMTApKTtcbiAgICAgICAgICBpZiAob3AyMi5udW1lcmljVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihbXCJ1bmV4cGVjdGVkLWJhc2VcIiwgb3AyMi5sYXRleF0sIG9wMjIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXNlID0gYXNGbG9hdChvcDIyKTtcbiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYmFzZSkgfHwgYmFzZSA8IDIgfHwgYmFzZSA+IDM2KVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcInVuZXhwZWN0ZWQtYmFzZVwiLCBiYXNlXSwgb3AyMik7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCByZXN0XSA9IGZyb21EaWdpdHMob3AxMi5zdHJpbmcsIGJhc2UpO1xuICAgICAgICAgIGlmIChyZXN0KVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcInVuZXhwZWN0ZWQtZGlnaXRcIiwgeyBzdHI6IHJlc3RbMF0gfV0sIHtcbiAgICAgICAgICAgICAgc3RyOiByZXN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSW50ZWdlclN0cmluZzoge1xuICAgICAgZGVzY3JpcHRpb246IGBcXGBJbnRlZ2VyU3RyaW5nKG4sIGJhc2U9MTApXFxgICAgICAgIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50ZWdlciBcXGBuXFxgIGluIGJhc2UgXFxgYmFzZVxcYC5gLFxuICAgICAgLy8gQHRvZG8gY291bGQgYWNjZXB0IGAweGNhZmVgLCBgMGIwMTAxMGAgb3IgYChkZWFkYmVlZilfMTZgIGFzIHN0cmluZyBmb3JtYXRzXG4gICAgICAvLyBAdG9kbyBjb3VsZCBhY2NlcHQgXCJyb21hblwiLi4uIGFzIGJhc2VcbiAgICAgIC8vIEB0b2RvIGNvdWxkIGFjY2VwdCBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgYXMgdGhlIChwYWRkZWQpIGxlbmd0aCBvZiB0aGUgb3V0cHV0XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkludGVnZXJcIiwgW1wiTWF5YmVcIiwgXCJJbnRlZ2VyXCJdLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMTIgPSBvcHMyWzBdO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGFzRmxvYXQob3AxMikgPz8gTmFOO1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsKSB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UuZXJyb3IoXG4gICAgICAgICAgICAgIFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgXCJJbnRlZ2VyXCIsIG9wMTIuZG9tYWluXSxcbiAgICAgICAgICAgICAgb3AxMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb3AyMiA9IG9wczJbMV07XG4gICAgICAgICAgaWYgKG9wMjIuaXNOb3RoaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBvcDFOdW0gPSBvcDEyLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3AxTnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKE1hdGguYWJzKG9wMU51bSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAob3AxTnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKG9wMU51bS5hYnMoKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXG4gICAgICAgICAgICAgIE1hdGguYWJzKE1hdGgucm91bmQoYXNGbG9hdChvcDEyKSA/PyBOYU4pKS50b1N0cmluZygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXNTbWFsbEludGVnZXIob3AyMikgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihcbiAgICAgICAgICAgICAgW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIkludGVnZXJcIiwgb3AyMi5kb21haW5dLFxuICAgICAgICAgICAgICBvcDIyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXNlID0gYXNTbWFsbEludGVnZXIob3AyMik7XG4gICAgICAgICAgaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNilcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihbXCJvdXQtb2YtcmFuZ2VcIiwgMiwgMzYsIGJhc2VdLCBvcDIyKTtcbiAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKE1hdGguYWJzKHZhbCkudG9TdHJpbmcoYmFzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTdHJpbmc6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJNYXliZVwiLCBcIkFueXRoaW5nXCJdLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXCJcIik7XG4gICAgICAgICAgcmV0dXJuIGNlLnN0cmluZyhvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC50b1N0cmluZygpKS5qb2luKFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy9cbiAgLy8gTGFUZVgtcmVsYXRlZFxuICAvL1xuICB7XG4gICAgLy8gSm9pbiBvciBtb3JlIExhdGV4VG9rZW5zIGludG8gYSBMYVRlWCBzdHJpbmdcbiAgICBKb2luTGF0ZXhUb2tlbnM6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIkxhdGV4XCIsIFtcbiAgICAgICAgICAgIGNlLnN0cmluZyh0b2tlbnNUb1N0cmluZyhvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC5sYXRleCkpKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBWYWx1ZSBwcmVzZXJ2aW5nIHR5cGUgY29udmVyc2lvbi90YWcgaW5kaWNhdGluZyB0aGUgc3RyaW5nXG4gICAgLy8gaXMgYSBMYVRlWCBzdHJpbmdcbiAgICBMYXRleDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiTWF5YmVcIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXV0sIFwiU3RyaW5nXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN0cmluZyhcIlwiKTtcbiAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKGpvaW5MYXRleChvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC50b1N0cmluZygpKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBTZXJpYWxpemUgb25lIG9yIG1vcmUgZXhwcmVzc2lvbnMgdG8gTGFUZVhcbiAgICBTZXJpYWxpemVMYXRleDoge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gY2UuZm4oXCJMYXRleFwiLCBbY2Uuc3RyaW5nKGpvaW5MYXRleChvcHMyLm1hcCgoeCkgPT4geC5sYXRleCkpKV0pXG4gICAgICB9XG4gICAgfSxcbiAgICBTcGxpdEFzTGF0ZXhUb2tlbnM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNwbGl0IGEgTGFUZVggc3RyaW5nIGludG8gYSBsaXN0IG9mIExhVGVYIHRva2Vuc1wiLFxuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFwiQW55dGhpbmdcIl0sIFtcIkxpc3RcIiwgXCJTdHJpbmdcIl1dLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxpc3RcIiwgW10pO1xuICAgICAgICAgIGxldCBsYXRleCA9IFwiXCI7XG4gICAgICAgICAgaWYgKG9wczJbMF0uaGVhZCA9PT0gXCJMYXRleFwiKVxuICAgICAgICAgICAgbGF0ZXggPSBvcHMyWzBdLm9wMS5zdHJpbmcgPz8gXCJcIjtcbiAgICAgICAgICBlbHNlIGlmIChvcHMyWzBdLmhlYWQgPT09IFwiTGF0ZXhTdHJpbmdcIilcbiAgICAgICAgICAgIGxhdGV4ID0gam9pbkxhdGV4KG9wczJbMF0ub3BzLm1hcCgob3AzKSA9PiBvcDMubGF0ZXgpKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsYXRleCA9IG9wczJbMF0ubGF0ZXg7XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcbiAgICAgICAgICAgIFwiTGlzdFwiLFxuICAgICAgICAgICAgdG9rZW5pemUobGF0ZXgsIFtdKS5tYXAoKHgpID0+IGNlLnN0cmluZyh4KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBQYXJzZUxhdGV4OiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJQYXJzZSBhIExhVGVYIHN0cmluZyBhbmQgZXZhbHVhdGUgdG8gYSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLCBcIkFueXRoaW5nXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwIHx8ICFvcHMyWzBdLnN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjZS5ib3goW1wiU2VxdWVuY2VcIl0pO1xuICAgICAgICAgIHJldHVybiBjZS5wYXJzZShvcHMyWzBdLnN0cmluZykgPz8gY2UuYm94KFtcIlNlcXVlbmNlXCJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAge1xuICAgIFJhbmRvbUV4cHJlc3Npb246IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgX29wcykgPT4gY2UuYm94KHJhbmRvbUV4cHJlc3Npb24oKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L2xvZ2ljLnRzXG52YXIgTE9HSUNfTElCUkFSWSA9IHtcbiAgVHJ1ZTogeyB3aWtpZGF0YTogXCJRMTY3NTE3OTNcIiwgZG9tYWluOiBcIkJvb2xlYW5cIiwgY29uc3RhbnQ6IHRydWUgfSxcbiAgRmFsc2U6IHtcbiAgICB3aWtpZGF0YTogXCJRNTQzMjYxOVwiLFxuICAgIGRvbWFpbjogXCJCb29sZWFuXCIsXG4gICAgY29uc3RhbnQ6IHRydWVcbiAgfSxcbiAgTWF5YmU6IHtcbiAgICB3aWtpZGF0YTogXCJRNzgxNTQ2XCIsXG4gICAgZG9tYWluOiBcIk1heWJlQm9vbGVhblwiLFxuICAgIGNvbnN0YW50OiB0cnVlXG4gIH0sXG4gIC8vIEB0b2RvOiBzcGVjaWZ5IGEgYGNhbm9uaWNhbGAgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBib29sZWFuXG4gIC8vIGV4cHJlc3Npb25zIGludG8gQ05GIChDb25qdW5jdGl2ZSBOb3JtYWwgRm9ybSlcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uanVuY3RpdmVfbm9ybWFsX2Zvcm1cbiAgLy8gdXNpbmcgcnVsZXMgKHdpdGggYSBydWxlIHNldCB0aGF0J3Mga2luZGEgdGhlIGludmVyc2Ugb2YgdGhlXG4gIC8vIGxvZ2ljIHJ1bGVzIGZvciBzaW1wbGlmeSlcbiAgQW5kOiB7XG4gICAgd2lraWRhdGE6IFwiUTE5MTA4MVwiLFxuICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgYXNzb2NpYXRpdmU6IHRydWUsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxZTQsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NBbmQsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc0FuZFxuICAgIH1cbiAgfSxcbiAgT3I6IHtcbiAgICB3aWtpZGF0YTogXCJRMTY1MTcwNFwiLFxuICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgYXNzb2NpYXRpdmU6IHRydWUsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxZTQsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NPcixcbiAgICAgIGV2YWx1YXRlOiBwcm9jZXNzT3JcbiAgICB9XG4gIH0sXG4gIE5vdDoge1xuICAgIHdpa2lkYXRhOiBcIlExOTA1NThcIixcbiAgICBpbnZvbHV0aW9uOiB0cnVlLFxuICAgIGNvbXBsZXhpdHk6IDEwMTAwLFxuICAgIC8vIEB0b2RvOiB0aGlzIG1heSBub3QgYmUgbmVlZGVkLCBzaW5jZSB3ZSBhbHNvIGhhdmUgcnVsZXMuXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NOb3QsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc05vdFxuICAgIH1cbiAgfSxcbiAgRXF1aXZhbGVudDoge1xuICAgIHdpa2lkYXRhOiBcIlEyMjA0MzNcIixcbiAgICBjb21wbGV4aXR5OiAxMDIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJMb2dpY09wZXJhdG9yXCIsXG4gICAgICBzaW1wbGlmeTogcHJvY2Vzc0VxdWl2YWxlbnQsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc0VxdWl2YWxlbnRcbiAgICB9XG4gIH0sXG4gIEltcGxpZXM6IHtcbiAgICB3aWtpZGF0YTogXCJRNzg4MTIyOVwiLFxuICAgIGNvbXBsZXhpdHk6IDEwMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIkxvZ2ljT3BlcmF0b3JcIixcbiAgICAgIHNpbXBsaWZ5OiBwcm9jZXNzSW1wbGllcyxcbiAgICAgIGV2YWx1YXRlOiBwcm9jZXNzSW1wbGllc1xuICAgIH1cbiAgfSxcbiAgRXhpc3RzOiB7IHNpZ25hdHVyZTogeyBkb21haW46IFwiTWF5YmVCb29sZWFuXCIgfSB9LFxuICBJZjoge1xuICAgIGhvbGQ6IFwicmVzdFwiLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIkZ1bmN0aW9uXCIsXG4gICAgICBjb2RvbWFpbjogKGNlLCBvcHMyKSA9PiBjZS5kb21haW4oW1wiVW5pb25cIiwgb3BzMlswXSwgb3BzMlsxXV0pLFxuICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICBjb25zdCBjb25kID0gb3BzMlswXTtcbiAgICAgICAgaWYgKGNvbmQgJiYgY29uZC5zeW1ib2wgPT09IFwiVHJ1ZVwiKVxuICAgICAgICAgIHJldHVybiBvcHMyWzFdID8gb3BzMlsxXS5zaW1wbGlmeSgpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG9wczJbMl0gPyBvcHMyWzJdLnNpbXBsaWZ5KCkgOiBjZS5ib3goXCJOb3RoaW5nXCIpO1xuICAgICAgfSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgY29uZCA9IG9wczJbMF07XG4gICAgICAgIGlmIChjb25kICYmIGNvbmQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgICAgICByZXR1cm4gb3BzMlsxXSA/IG9wczJbMV0uZXZhbHVhdGUoKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICAgIHJldHVybiBvcHMyWzJdID8gb3BzMlsyXS5ldmFsdWF0ZSgpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgIH0sXG4gICAgICAvLyBAdG9kbzogcHJvYmFibHkgZG9uJ3QgbmVlZCBhIE4oKSBoYW5kbGVyLiBEb2Vzbid0IG1ha2UgYSBkaWZmZXJlbmNlXG4gICAgICAvLyBmb3IgdGhlIGV2YWx1YXRpb24gb2YgYm9vbGVhbnMuIEFsc28sIGRvbid0IG5lZWQgdG8gY2FsbCBOKCkgb24gdGhlXG4gICAgICAvLyBhcmd1bWVudHMsIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgZG9uZSB0aGF0LiBTYW1lIGZvciBldmFsdWF0ZSgpXG4gICAgICAvLyBhbmQgc2ltcGxpZnkoKSBhYm92ZVxuICAgICAgTjogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmQgPSBvcHMyWzBdO1xuICAgICAgICBpZiAoY29uZCAmJiBjb25kLnN5bWJvbCA9PT0gXCJUcnVlXCIpXG4gICAgICAgICAgcmV0dXJuIG9wczJbMV0gPyBvcHMyWzFdLk4oKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICAgIHJldHVybiBvcHMyWzJdID8gb3BzMlsyXS5OKCkgOiBjZS5ib3goXCJOb3RoaW5nXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTG9vcDoge1xuICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IG9wczJbMF0/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFwiTm90aGluZ1wiKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IG9wczJbMF0gPz8gY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgaWYgKGJvZHkuaXNOb3RoaW5nKVxuICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXN1bHQgPSBib2R5LmV2YWx1YXRlKCk7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICB9IHdoaWxlIChyZXN1bHQuaGVhZCAhPT0gXCJSZXR1cm5cIiAmJiBpIDwgY2UuaXRlcmF0aW9uTGltaXQpO1xuICAgICAgICBpZiAocmVzdWx0LmhlYWQgPT09IFwiUmV0dXJuXCIpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5vcDE7XG4gICAgICAgIHJldHVybiBjZS5lcnJvcihcIml0ZXJhdGlvbi1saW1pdC1leGNlZWRlZFwiKTtcbiAgICAgIH0sXG4gICAgICBOOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgY29uZCA9IG9wczJbMF07XG4gICAgICAgIGlmIChjb25kICYmIGNvbmQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgICAgICByZXR1cm4gb3BzMlsxXSA/IG9wczJbMV0uTigpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG9wczJbMl0gPyBvcHMyWzJdLk4oKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBXaGljaDoge1xuICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgIGNvZG9tYWluOiAoY2UsIG9wczIpID0+IGRvbWFpbldoaWNoKGNlLCBvcHMyKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHdoaWNoRXZhbHVhdGUoY2UsIG9wczIsIFwiZXZhbHVhdGVcIiksXG4gICAgICBOOiAoY2UsIG9wczIpID0+IHdoaWNoRXZhbHVhdGUoY2UsIG9wczIsIFwiTlwiKVxuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NBbmQoY2UsIGFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBjb25zdCBvcHMyID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoYXJnLnN5bWJvbCA9PT0gXCJGYWxzZVwiKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgIGlmIChhcmcuc3ltYm9sICE9PSBcIlRydWVcIikge1xuICAgICAgbGV0IGR1cGxpY2F0ZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB4IG9mIG9wczIpIHtcbiAgICAgICAgaWYgKHguaXNTYW1lKGFyZykpIHtcbiAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZy5oZWFkID09PSBcIk5vdFwiICYmIGFyZy5vcDEuaXNTYW1lKHgpIHx8IHguaGVhZCA9PT0gXCJOb3RcIiAmJiB4Lm9wMS5pc1NhbWUoYXJnKSkge1xuICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkdXBsaWNhdGUpXG4gICAgICAgIG9wczIucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgcmV0dXJuIGNlLl9mbihcIkFuZFwiLCBvcHMyKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NPcihjZSwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGNvbnN0IG9wczIgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgIGlmIChhcmcuc3ltYm9sICE9PSBcIkZhbHNlXCIpIHtcbiAgICAgIGxldCBkdXBsaWNhdGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgeCBvZiBvcHMyKSB7XG4gICAgICAgIGlmICh4LmlzU2FtZShhcmcpKSB7XG4gICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhcmcuaGVhZCA9PT0gXCJOb3RcIiAmJiBhcmcub3AxLmlzU2FtZSh4KSB8fCB4LmhlYWQgPT09IFwiTm90XCIgJiYgeC5vcDEuaXNTYW1lKGFyZykpIHtcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkdXBsaWNhdGUpXG4gICAgICAgIG9wczIucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgcmV0dXJuIGNlLl9mbihcIk9yXCIsIG9wczIpO1xufVxuZnVuY3Rpb24gcHJvY2Vzc05vdChjZSwgYXJncykge1xuICBjb25zdCBvcDEyID0gYXJnc1swXS5zeW1ib2w7XG4gIGlmIChvcDEyID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gIGlmIChvcDEyID09PSBcIkZhbHNlXCIpXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcDEyID09PSBcIk1heWJlXCIpXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIk1heWJlXCIpO1xuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvY2Vzc0VxdWl2YWxlbnQoY2UsIGFyZ3MpIHtcbiAgY29uc3QgbGhzID0gYXJnc1swXS5zeW1ib2w7XG4gIGNvbnN0IHJocyA9IGFyZ3NbMV0uc3ltYm9sO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiVHJ1ZVwiIHx8IGxocyA9PT0gXCJGYWxzZVwiICYmIHJocyA9PT0gXCJGYWxzZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiRmFsc2VcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiVHJ1ZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgaWYgKGxocyA9PT0gXCJNYXliZVwiIHx8IHJocyA9PT0gXCJNYXliZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJNYXliZVwiKTtcbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NJbXBsaWVzKGNlLCBhcmdzKSB7XG4gIGNvbnN0IGxocyA9IGFyZ3NbMF0uc3ltYm9sO1xuICBjb25zdCByaHMgPSBhcmdzWzFdLnN5bWJvbDtcbiAgaWYgKGxocyA9PT0gXCJUcnVlXCIgJiYgcmhzID09PSBcIlRydWVcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiRmFsc2VcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiVHJ1ZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gIGlmIChsaHMgPT09IFwiTWF5YmVcIiB8fCByaHMgPT09IFwiTWF5YmVcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiTWF5YmVcIik7XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBkb21haW5XaGljaChjZSwgYXJncykge1xuICBsZXQgZG9tID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICBpZiAoIWRvbSlcbiAgICAgIGRvbSA9IGFyZ3NbaV0uZG9tYWluO1xuICAgIGVsc2VcbiAgICAgIGRvbSA9IHNoYXJlZEFuY2VzdG9yRG9tYWluKGRvbSwgYXJnc1tpXS5kb21haW4pO1xuICB9XG4gIHJldHVybiBkb20gPz8gY2UuZG9tYWluKFwiTm90aGluZ1wiKTtcbn1cbmZ1bmN0aW9uIHdoaWNoRXZhbHVhdGUoY2UsIGFyZ3MsIG1vZGUpIHtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoIC0gMSkge1xuICAgIGlmIChhcmdzW2ldLmV2YWx1YXRlKCkuc3ltYm9sID09PSBcIlRydWVcIikge1xuICAgICAgaWYgKCFhcmdzW2kgKyAxXSlcbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgIHJldHVybiBtb2RlID09PSBcIk5cIiA/IGFyZ3NbaSArIDFdLk4oKSA6IGFyZ3NbaSArIDFdLmV2YWx1YXRlKCk7XG4gICAgfVxuICAgIGkgKz0gMjtcbiAgfVxuICByZXR1cm4gY2Uuc3ltYm9sKFwiVW5kZWZpbmVkXCIpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9wb2x5bm9taWFscy50c1xudmFyIFBPTFlOT01JQUxTX0xJQlJBUlkgPSBbXG4gIHtcbiAgICBFeHBhbmQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkV4cGFuZCBvdXQgcHJvZHVjdHMgYW5kIHBvc2l0aXZlIGludGVnZXIgcG93ZXJzXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFwiVmFsdWVcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoX2NlLCBvcHMyKSA9PiBleHBhbmQyKG9wczJbMF0pID8/IG9wczJbMF1cbiAgICAgIH1cbiAgICB9LFxuICAgIERpc3RyaWJ1dGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc3RyaWJ1dGUgbXVsdGlwbGljYXRpb24gb3ZlciBhZGRpdGlvblwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJWYWx1ZVwiLCBcIlZhbHVlXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaCA9IG9wczJbMF0uaGVhZDtcbiAgICAgICAgICBpZiAoaCA9PT0gXCJNdWx0aXBseVwiKVxuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGUob3BzMlswXS5vcHMpID8/IG9wczJbMF07XG4gICAgICAgICAgaWYgKGggPT09IFwiTmVnYXRlXCIpXG4gICAgICAgICAgICByZXR1cm4gZGlzdHJpYnV0ZShbY2UuX05FR0FUSVZFX09ORSwgLi4ub3BzMlswXS5vcHNdKSA/PyBvcHMyWzBdO1xuICAgICAgICAgIGlmIChoID09PSBcIkRpdmlkZVwiICYmIG9wczJbMF0ub3BzWzBdLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgICAgICAgICAgY29uc3QgbnVtZXJhdG9yID0gZGlzdHJpYnV0ZShvcHMyWzBdLm9wcyk7XG4gICAgICAgICAgICBjb25zdCBkZW5vbWluYXRvciA9IG9wczJbMF0ub3BzWzFdO1xuICAgICAgICAgICAgaWYgKG51bWVyYXRvcikge1xuICAgICAgICAgICAgICBpZiAobnVtZXJhdG9yLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlLmFkZChcbiAgICAgICAgICAgICAgICAgIG51bWVyYXRvci5vcHMubWFwKCh4KSA9PiBjZS5kaXYoeCwgZGVub21pbmF0b3IpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBjZS5kaXYobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9yZWxhdGlvbmFsLW9wZXJhdG9yLnRzXG52YXIgUkVMT1BfTElCUkFSWSA9IHtcbiAgRXF1YWw6IHtcbiAgICBjb21tdXRhdGl2ZTogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNlLl9mbihcbiAgICAgICAgICBcIkVxdWFsXCIsXG4gICAgICAgICAgZmxhdHRlbk9wcyhjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKG9wczIpKSwgXCJFcXVhbFwiKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgbGV0IGxocyA9IHZvaWQgMDtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygb3BzMikge1xuICAgICAgICAgIGlmICghbGhzKVxuICAgICAgICAgICAgbGhzID0gYXJnO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGVzdCA9IGxocy5pc0VxdWFsKGFyZyk7XG4gICAgICAgICAgICBpZiAodGVzdCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE5vdEVxdWFsOiB7XG4gICAgd2lraWRhdGE6IFwiUTI4MTEzMzUxXCIsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgIGxocyA9IGFyZztcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBsaHMuaXNFcXVhbChhcmcpO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IHRydWUpXG4gICAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBMZXNzOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS5fZm4oXCJMZXNzXCIsIGZsYXR0ZW5PcHMoY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSksIFwiTGVzc1wiKSksXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPD0gMClcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgICAgICAgICAgbGhzID0gYXJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE5vdExlc3M6IHtcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiTGVzc1wiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBHcmVhdGVyOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJMZXNzXCIsIGFyZ3MucmV2ZXJzZSgpKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgbGV0IGxocyA9IHZvaWQgMDtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygb3BzMikge1xuICAgICAgICAgIGlmICghYXJnLmlzTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgIGxocyA9IGFyZztcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjZS5mbihcIlN1YnRyYWN0XCIsIFthcmcsIGxoc10pLk4oKS5zZ247XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCB8fCB0ZXN0ID09PSB2b2lkIDApXG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodGVzdCA+PSAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90R3JlYXRlcjoge1xuICAgIGNvbXBsZXhpdHk6IDExZTMsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4gY2UuX2ZuKFwiTm90XCIsIFtjZS5fZm4oXCJHcmVhdGVyXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIExlc3NFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExZTMsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPCAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90TGVzc05vdEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIkxlc3NFcXVhbFwiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBHcmVhdGVyRXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIkxlc3NFcXVhbFwiLCBhcmdzLnJldmVyc2UoKSksXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPiAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90R3JlYXRlck5vdEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIkdyZWF0ZXJFcXVhbFwiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBUaWxkZUZ1bGxFcXVhbDoge1xuICAgIGRlc2NyaXB0aW9uOiBcIkluZGljYXRlIGlzb21vcnBoaXNtLCBjb25ncnVlbmNlIGFuZCBob21vdG9waWMgZXF1aXZhbGVuY2VcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RUaWxkZUZ1bGxFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiVGlsZGVGdWxsRXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgVGlsZGVFcXVhbDoge1xuICAgIGRlc2NyaXB0aW9uOiBcIkFwcHJveGltYXRlbHkgb3IgYXN5bXB0b3RpY2FsbHkgZXF1YWxcIixcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIgfVxuICAgIC8vIEB0b2RvIGV2YWx1YXRlOiAoY2UsIC4uLmFyZ3M6IEJveGVkRXhwcmVzc2lvbltdKSA9PiBTZW1pQm94ZWRFeHByZXNzaW9uIHt9XG4gIH0sXG4gIE5vdFRpbGRlRXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIlRpbGRlRXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94OiB7XG4gICAgY29tcGxleGl0eTogMTExMDAsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIiB9XG4gICAgLy8gQHRvZG8gZXZhbHVhdGU6IChjZSwgLi4uYXJnczogQm94ZWRFeHByZXNzaW9uW10pID0+IFNlbWlCb3hlZEV4cHJlc3Npb24ge31cbiAgfSxcbiAgTm90QXBwcm94OiB7XG4gICAgY29tcGxleGl0eTogMTExMDAsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4gY2UuX2ZuKFwiTm90XCIsIFtjZS5fZm4oXCJBcHByb3hcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RBcHByb3hFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiQXBwcm94RXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94Tm90RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RBcHByb3hOb3RFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiQXBwcm94Tm90RXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgUHJlY2VkZXM6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RQcmVjZWRlczoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiUHJlY2VkZXNcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgU3VjY2VlZHM6IHtcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RTdWNjZWVkczoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiU3VjY2VlZHNcIiwgYXJncyldKVxuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvc2V0cy50c1xudmFyIFNFVFNfTElCUkFSWSA9IHtcbiAgLy9cbiAgLy8gQ29uc3RhbnRzXG4gIC8vXG4gIEVtcHR5U2V0OiB7XG4gICAgZG9tYWluOiBcIlNldFwiLFxuICAgIGNvbnN0YW50OiB0cnVlLFxuICAgIHdpa2lkYXRhOiBcIlEyMjYxODNcIlxuICAgIC8vIGNvbnRhaW5zOiAoKSA9PiBmYWxzZSwgLy8gQHRvZG8gbm90IHF1aXRlIHRydWUuLi5cbiAgICAvLyBpbmNsdWRlczogKCkgPT4gdHJ1ZSwgLy8gVGhlIGVtcHR5IHNldCBpcyBhIHN1YnNldCBvZiBldmVyeSBzZXRcbiAgfSxcbiAgLy9cbiAgLy8gUHJlZGljYXRlc1xuICAvL1xuICBFbGVtZW50OiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgaG9sZDogXCJhbGxcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGZsYXR0ZW5TZXF1ZW5jZShjYW5vbmljYWwoYXJncykpLCAyKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyICYmIGlzVmFsaWREb21haW4oYXJnc1sxXSkpXG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkVsZW1lbnRcIiwgW2FyZ3NbMF0sIGNlLmRvbWFpbihhcmdzWzFdKV0pO1xuICAgICAgICByZXR1cm4gY2UuX2ZuKFwiRWxlbWVudFwiLCBhcmdzKTtcbiAgICAgIH0sXG4gICAgICBldmFsdWF0ZTogKGNlLCBhcmdzKSA9PiBldmFsdWF0ZUVsZW1lbnQoY2UsIGFyZ3MpXG4gICAgfVxuICB9LFxuICBOb3RFbGVtZW50OiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgaG9sZDogXCJhbGxcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJFbGVtZW50XCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIFN1YnNldDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUHJlZGljYXRlXCIgfVxuICB9LFxuICBOb3RTdWJzZXQ6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJTdWJzZXRcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgU3VwZXJzZXQ6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlByZWRpY2F0ZVwiIH1cbiAgfSxcbiAgU3VwZXJzZXRFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUHJlZGljYXRlXCIgfVxuICB9LFxuICBOb3RTdXBlcnNldDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlByZWRpY2F0ZVwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLmZuKFwiTm90XCIsIFtjZS5mbihcIlN1cGVyc2V0XCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIE5vdFN1cGVyc2V0RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJTdXBlcnNldEVxdWFsXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIFN1YnNldEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJQcmVkaWNhdGVcIiB9XG4gICAgLy8gZXZhbHVhdGU6IHN1YnNldEVxdWFsLFxuICB9LFxuICBOb3RTdWJzZXROb3RFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlByZWRpY2F0ZVwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLmZuKFwiTm90XCIsIFtjZS5mbihcIlN1YnNldEVxdWFsXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIC8vXG4gIC8vIEZ1bmN0aW9uc1xuICAvL1xuICBDYXJ0ZXNpYW5Qcm9kdWN0OiB7XG4gICAgLy8gQWthIHRoZSBwcm9kdWN0IHNldCwgdGhlIHNldCBkaXJlY3QgcHJvZHVjdCBvciBjcm9zcyBwcm9kdWN0XG4gICAgLy8gTm90YXRpb246IFxcdGltZXNcbiAgICB3aWtpZGF0YTogXCJRMTczNzQwXCIsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJTZXRcIiwgW1wiU2VxdWVuY2VcIiwgXCJTZXRcIl0sIFwiU2V0XCJdIH1cbiAgICAvLyBldmFsdWF0ZTogY2FydGVzaWFuUHJvZHVjdCxcbiAgfSxcbiAgQ29tcGxlbWVudDoge1xuICAgIC8vIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgYXJlIG5vdCBpbiBhbnkgb2ZcbiAgICAvLyB0aGUgc3Vic2VxdWVudCBsaXN0c1xuICAgIHdpa2lkYXRhOiBcIlEyNDI3NjdcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlNldFwiLCBcIlNldFwiXSB9XG4gIH0sXG4gIEludGVyc2VjdGlvbjoge1xuICAgIC8vIG5vdGF0aW9uOiBcXGNhcFxuICAgIHdpa2lkYXRhOiBcIlExODU4MzdcIixcbiAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgIGNvbW11dGF0aXZlOiB0cnVlLFxuICAgIGludm9sdXRpb246IHRydWUsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiU2V0XCIsIFtcIlNlcXVlbmNlXCIsIFwiU2V0XCJdLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiBpbnRlcnNlY3Rpb25cbiAgICB9XG4gIH0sXG4gIFVuaW9uOiB7XG4gICAgLy8gV29ya3Mgb24gc2V0LCBidXQgY2FuIGFsc28gd29yayBvbiBsaXN0c1xuICAgIHdpa2lkYXRhOiBcIlExODUzNTlcIixcbiAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgIGNvbW11dGF0aXZlOiB0cnVlLFxuICAgIGludm9sdXRpb246IHRydWUsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiU2V0XCIsIFtcIlNlcXVlbmNlXCIsIFwiU2V0XCJdLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiB1bmlvblxuICAgIH1cbiAgfSxcbiAgLy8ge1xuICAvLyAgIG5hbWU6ICdTZXQnLFxuICAvLyAgIGRvbWFpbjogWydGdW5jdGlvbicsIFsnU2VxdWVuY2UnLCAnQW55dGhpbmcnXSwgJ1NldCddLFxuICAvLyAgIC8vIEB0b2RvISBzZXQgaGFzIG11bHRpcGxlIGZvcm1zXG4gIC8vICAgLy8gU2V0KFNlcXVlbmNlKVxuICAvLyAgIC8vIFNldChTZXF1ZW5jZSwgQ29uZGl0aW9uKVxuICAvLyAgIC8vIFNldChTZXQsIENvbmRpdGlvbilcbiAgLy8gfSwgLy8gZGlzam9pbnQgdW5pb24gUTg0MjYyMCBcdTIyOTRcbiAgU2V0TWludXM6IHtcbiAgICB3aWtpZGF0YTogXCJRMTgxOTI0NDJcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJTZXRcIiwgXCJWYWx1ZVwiLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiBzZXRNaW51c1xuICAgIH1cbiAgfSxcbiAgU3ltbWV0cmljRGlmZmVyZW5jZToge1xuICAgIC8vIHN5bW1ldHJpYyBkaWZmZXJlbmNlID0gZGlzanVuY3RpdmUgdW5pb24gIChjaXJjbGVkIG1pbnVzKVxuICAgIC8qID0gVW5pb24oQ29tcGxlbWVudChhLCBiKSwgQ29tcGxlbWVudChiLCBhKSAqL1xuICAgIC8qIENvcnJlc3BvbmRzIHRvIFhPUiBpbiBib29sZWFuIGxvZ2ljICovXG4gICAgd2lraWRhdGE6IFwiUTExNDcyNDJcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlNldFwiLCBbXCJTZXF1ZW5jZVwiLCBcIlNldFwiXSwgXCJTZXRcIl0gfVxuICB9XG59O1xuZnVuY3Rpb24gdW5pb24oY2UsIF9vcHMpIHtcbiAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGNlLCBfb3BzKSB7XG4gIHJldHVybiBjZS5zeW1ib2woXCJFbXB0eVNldFwiKTtcbn1cbmZ1bmN0aW9uIHNldE1pbnVzKGNlLCBfb3BzKSB7XG4gIHJldHVybiBjZS5zeW1ib2woXCJFbXB0eVNldFwiKTtcbn1cbmZ1bmN0aW9uIGV2YWx1YXRlRWxlbWVudChjZSwgb3BzMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQob3BzMi5sZW5ndGggPT09IDIpO1xuICBjb25zdCBbbGhzLCByaHNdID0gb3BzMjtcbiAgaWYgKHJocy5zdHJpbmcpIHtcbiAgICBpZiAobGhzLnN0cmluZyAmJiByaHMuc3RyaW5nLmluY2x1ZGVzKGxocy5zdHJpbmcpKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChyaHMua2V5cykge1xuICAgIGlmIChsaHMuc3RyaW5nKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiByaHMua2V5cylcbiAgICAgICAgaWYgKGtleSA9PT0gbGhzLnN0cmluZylcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChyaHMuaGVhZCA9PT0gXCJMaXN0XCIpIHtcbiAgICBpZiAobGhzLmhlYWQgPT09IFwiTGlzdFwiKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMSArIChyaHMubm9wcyAtIGxocy5ub3BzKTsgKytpKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaHMubm9wczsgKytqKSB7XG4gICAgICAgICAgaWYgKCFyaHMub3BzW2kgKyBqXS5pc0VxdWFsKGxocy5vcHNbal0pKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gbGhzLmhlYWQgPT09IFwiSG9sZFwiID8gbGhzLm9wMSA6IGxocztcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgcmhzLm9wcylcbiAgICAgIGlmICh2YWwuaXNFcXVhbChlbGVtKSlcbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChpc1ZhbGlkRG9tYWluKHJocykpIHtcbiAgICBpZiAobGhzLmRvbWFpbi5pc0NvbXBhdGlibGUoY2UuZG9tYWluKHJocykpKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIHJldHVybiBjZS5fZm4oXCJFbGVtZW50XCIsIFtsaHMsIHJoc10pO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9zdGF0aXN0aWNzLnRzXG52YXIgU1RBVElTVElDU19MSUJSQVJZID0gW1xuICB7XG4gICAgTWVhbjoge1xuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIlNlcXVlbmNlXCIsIFwiVmFsdWVcIl0sIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihzdW0yIC8gY291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNZWRpYW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcih2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggJSAyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigodmFsdWVzW21pZCAtIDFdICsgdmFsdWVzW21pZF0pIC8gMik7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcih2YWx1ZXNbbWlkXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFZhcmlhbmNlOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBsZXQgc3VtMiA9IDA7XG4gICAgICAgICAgbGV0IHN1bTIyID0gMDtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHN1bTIgKz0gdjtcbiAgICAgICAgICAgIHN1bTIyICs9IHYgKiB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigoc3VtMjIgLSBzdW0yICogc3VtMiAvIGNvdW50KSAvIChjb3VudCAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgU3RhbmRhcmREZXZpYXRpb246IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBzdW0yID0gMDtcbiAgICAgICAgICBsZXQgc3VtMjIgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgc3VtMjIgKz0gdiAqIHY7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY291bnQgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKFxuICAgICAgICAgICAgTWF0aC5zcXJ0KChzdW0yMiAtIHN1bTIgKiBzdW0yIC8gY291bnQpIC8gKGNvdW50IC0gMSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgS3VydG9zaXM6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBzdW0yID0gMDtcbiAgICAgICAgICBsZXQgc3VtMjIgPSAwO1xuICAgICAgICAgIGxldCBzdW00ID0gMDtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHN1bTIgKz0gdjtcbiAgICAgICAgICAgIHN1bTIyICs9IHYgKiB2O1xuICAgICAgICAgICAgc3VtNCArPSB2ICogdiAqIHYgKiB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgY29uc3QgczIgPSAoc3VtMjIgLSBzdW0yICogc3VtMiAvIGNvdW50KSAvIChjb3VudCAtIDEpO1xuICAgICAgICAgIGNvbnN0IHM0ID0gKHN1bTQgLSBzdW0yMiAqIHN1bTIyIC8gY291bnQpIC8gKGNvdW50IC0gMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigoczQgLyAoczIgKiBzMikgLSAzKSAqIChjb3VudCAqIChjb3VudCArIDEpKSAvIDYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTa2V3bmVzczoge1xuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIlNlcXVlbmNlXCIsIFwiVmFsdWVcIl0sIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICAgIGxldCBzdW0yMiA9IDA7XG4gICAgICAgICAgbGV0IHN1bTMgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgc3VtMjIgKz0gdiAqIHY7XG4gICAgICAgICAgICBzdW0zICs9IHYgKiB2ICogdjtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3VudCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIGNvbnN0IHMyID0gKHN1bTIyIC0gc3VtMiAqIHN1bTIgLyBjb3VudCkgLyAoY291bnQgLSAxKTtcbiAgICAgICAgICBjb25zdCBzMyA9IChzdW0zIC0gc3VtMjIgKiBzdW0yIC8gY291bnQpIC8gKGNvdW50IC0gMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihzMyAvIE1hdGgucG93KHMyLCAzIC8gMikgKiBNYXRoLnNxcnQoY291bnQgKiAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE1vZGU6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgY29uc3QgY291bnRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xuICAgICAgICAgICAgY291bnRzW3ZdID0gKGNvdW50c1t2XSA/PyAwKSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBtYXgyID0gMDtcbiAgICAgICAgICBsZXQgbW9kZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY291bnRzW3ZdO1xuICAgICAgICAgICAgaWYgKGMgPiBtYXgyKSB7XG4gICAgICAgICAgICAgIG1heDIgPSBjO1xuICAgICAgICAgICAgICBtb2RlID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihtb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgUXVhcnRpbGVzOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJMaXN0XCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2godik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgdmFsdWVzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKHZhbHVlcy5sZW5ndGggLyAyKTtcbiAgICAgICAgICBjb25zdCBsb3dlciA9IHZhbHVlcy5zbGljZSgwLCBtaWQpO1xuICAgICAgICAgIGNvbnN0IHVwcGVyID0gdmFsdWVzLnNsaWNlKG1pZCArIDEpO1xuICAgICAgICAgIHJldHVybiBjZS5ib3goW1xuICAgICAgICAgICAgXCJMaXN0XCIsXG4gICAgICAgICAgICBjZS5udW1iZXIodmFsdWVzW21pZF0pLFxuICAgICAgICAgICAgY2UubnVtYmVyKGxvd2VyW01hdGguZmxvb3IobG93ZXIubGVuZ3RoIC8gMildKSxcbiAgICAgICAgICAgIGNlLm51bWJlcih1cHBlcltNYXRoLmZsb29yKHVwcGVyLmxlbmd0aCAvIDIpXSlcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSW50ZXJxdWFydGlsZVJhbmdlOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wMyBvZiBlYWNoKG9wczIpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gYXNGbG9hdChvcDMpO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICB2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgIGNvbnN0IGxvd2VyID0gdmFsdWVzLnNsaWNlKDAsIG1pZCk7XG4gICAgICAgICAgY29uc3QgdXBwZXIgPSB2YWx1ZXMuc2xpY2UobWlkICsgMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihcbiAgICAgICAgICAgIHVwcGVyW01hdGguZmxvb3IodXBwZXIubGVuZ3RoIC8gMildIC0gbG93ZXJbTWF0aC5mbG9vcihsb3dlci5sZW5ndGggLyAyKV1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb3VudDoge1xuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBfb3Agb2YgZWFjaChvcHMyKSlcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihjb3VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEVyZjoge1xuICAgICAgY29tcGxleGl0eTogNzUwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoZXJmKHgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJmYzoge1xuICAgICAgY29tcGxleGl0eTogNzUwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoMSAtIGVyZih4KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbl07XG5mdW5jdGlvbiogZWFjaChvcHMyKSB7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm47XG4gIGNvbnN0IGNlID0gb3BzMlswXS5lbmdpbmU7XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBjb25zdCBoID0gb3AzLmhlYWQ7XG4gICAgaWYgKGggPT09IFwiUmFuZ2VcIikge1xuICAgICAgbGV0IGxvd2VyID0gYXNGbG9hdChvcDNbMV0pO1xuICAgICAgaWYgKGxvd2VyID09PSBudWxsKVxuICAgICAgICByZXR1cm47XG4gICAgICBsZXQgdXBwZXIgPSBhc0Zsb2F0KG9wM1syXSk7XG4gICAgICBpZiAodXBwZXIgPT09IG51bGwpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgY29uc3Qgc3RlcDIgPSBhc0Zsb2F0KG9wM1szXSA/PyAtMSkgPz8gLTE7XG4gICAgICAgIGlmIChzdGVwMiA+PSAwKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpICs9IHN0ZXAyKVxuICAgICAgICAgIHlpZWxkIGNlLm51bWJlcihpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcCA9IGFzRmxvYXQob3AzWzNdID8/IDEpID8/IDE7XG4gICAgICBpZiAoc3RlcCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkgKz0gc3RlcClcbiAgICAgICAgeWllbGQgY2UubnVtYmVyKGkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaCA9PT0gXCJMaW5zcGFjZVwiKSB7XG4gICAgICBsZXQgc3RhcnQgPSBhc0Zsb2F0KG9wM1sxXSk7XG4gICAgICBpZiAoc3RhcnQgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBzdG9wID0gYXNGbG9hdChvcDNbMl0pO1xuICAgICAgaWYgKHN0b3AgPT09IG51bGwpIHtcbiAgICAgICAgc3RvcCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBudW0gPSBhc0Zsb2F0KG9wM1szXSkgPz8gNTA7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKG51bSA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAobnVtIC0gMSk7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSArPSBzdGVwKVxuICAgICAgICB5aWVsZCBjZS5udW1iZXIoaSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiAmJiAvXihMaXN0fFNlcXVlbmNlfFR1cGxlfFNpbmdsZXxQYWlyfFRyaXBsZSkkLy50ZXN0KGgpKSB7XG4gICAgICB5aWVsZCogZWFjaChvcDMub3BzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgeWllbGQgb3AzO1xuICB9XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3RyaWdvbm9tZXRyeS50c1xudmFyIGRvbWFpbk51bWJlclRvUmVhbE51bWJlciA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJFeHRlbmRlZFJlYWxOdW1iZXJcIl07XG59O1xudmFyIHRyaWdGdW5jdGlvbiA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl07XG59O1xudmFyIGh5cGVyYm9saWNGdW5jdGlvbiA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl07XG59O1xudmFyIFRSSUdPTk9NRVRSWV9MSUJSQVJZID0gW1xuICB7XG4gICAgLy9cbiAgICAvLyBDb25zdGFudHNcbiAgICAvL1xuICAgIFBpOiB7XG4gICAgICBkb21haW46IFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIixcbiAgICAgIGZsYWdzOiB7IGFsZ2VicmFpYzogZmFsc2UgfSxcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcIk5cIixcbiAgICAgIHdpa2lkYXRhOiBcIlExNjdcIixcbiAgICAgIHZhbHVlOiAoZW5naW5lKSA9PiBiaWdudW1QcmVmZXJyZWQoZW5naW5lKSA/IGVuZ2luZS5fQklHTlVNX1BJIDogTWF0aC5QSVxuICAgIH1cbiAgfSxcbiAge1xuICAgIC8vIHNxcnQoeCp4ICsgeSp5KVxuICAgIERlZ3JlZXM6IHtcbiAgICAgIC8qID0gUGkgLyAxODAgKi9cbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIG9wczIgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgZmxhdHRlblNlcXVlbmNlKGNhbm9uaWNhbChvcHMyKSksIFtcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuZm4oXCJEZWdyZWVzXCIsIG9wczIsIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICAgICAgICBjb25zdCBhcmcgPSBvcHMyWzBdO1xuICAgICAgICAgIGlmIChhcmcubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICFhcmcuaXNWYWxpZClcbiAgICAgICAgICAgIHJldHVybiBjZS5mbihcIkRlZ3JlZXNcIiwgb3BzMiwgeyBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybiBjZS5kaXYoY2UubXVsKFthcmcsIGNlLnN5bWJvbChcIlBpXCIpXSksIGNlLm51bWJlcigxODApKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gY2UubXVsKFtvcHMyWzBdLCBjZS5kaXYoY2Uuc3ltYm9sKFwiUGlcIiksIGNlLm51bWJlcigxODApKV0pXG4gICAgICB9XG4gICAgfSxcbiAgICBIeXBvdDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOb25OZWdhdGl2ZU51bWJlclwiXSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gY2UuYm94KFtcIlNxcnRcIiwgW1wiQWRkXCIsIFtcIlNxdWFyZVwiLCBvcHMyWzBdXSwgW1wiU3F1YXJlXCIsIG9wczJbMV1dXV0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiBbXG4gICAgICAgICAgXCJMYW1iZGFcIixcbiAgICAgICAgICBbXCJTcXJ0XCIsIFtcIkFkZFwiLCBbXCJTcXVhcmVcIiwgXCJfMVwiXSwgW1wiU3F1YXJlXCIsIFwiXzJcIl1dXVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSxcbiAgICBTaW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDVlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIkludGVydmFsXCIsIC0xLCAxXV0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiU2luXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IChjb21wbGV4QWxsb3dlZChjZSkgPyBjZS5ib3goW1xuICAgICAgICAgIFwiRGl2aWRlXCIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJTdWJ0cmFjdFwiLFxuICAgICAgICAgICAgW1wiRXhwXCIsIFtcIk11bHRpcGx5XCIsIFwiSW1hZ2luYXJ5VW5pdFwiLCBvcHMyWzBdXV0sXG4gICAgICAgICAgICBbXCJFeHBcIiwgW1wiTXVsdGlwbHlcIiwgXCJJbWFnaW5hcnlVbml0XCIsIFtcIk5lZ2F0ZVwiLCBvcHMyWzBdXV1dXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXCJDb21wbGV4XCIsIDAsIDJdXG4gICAgICAgIF0pLnNpbXBsaWZ5KCkgOiB2b2lkIDApLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIlNpblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiU2luXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgLy9cbiAgICAvLyBCYXNpYyB0cmlnb25vbWV0cmljIGZ1bmN0aW9uXG4gICAgLy8gKG1heSBiZSB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mIG90aGVyIGZ1bmN0aW9ucyBiZWxvdylcbiAgICAvL1xuICAgIEFyY3Rhbjoge1xuICAgICAgd2lraWRhdGE6IFwiUTIyNTcyNDJcIixcbiAgICAgIGNvbXBsZXhpdHk6IDUyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmN0YW5cIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjdGFuXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3RhblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjdGFuXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmN0YW4yOiB7XG4gICAgICB3aWtpZGF0YTogXCJRNzc2NTk4XCIsXG4gICAgICBjb21wbGV4aXR5OiA1MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIE46IChfY2UsIG9wczIpID0+IGFwcGx5Mk4ob3BzMlswXSwgb3BzMlsxXSwgTWF0aC5hdGFuMiwgKGEsIGIpID0+IERlY2ltYWwuYXRhbjIoYSwgYikpXG4gICAgICB9XG4gICAgfSxcbiAgICBDb3M6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDUwNTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAtMSwgMV1dLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvc1wiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiU2luXCIsIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJNdWx0aXBseVwiLCBcIkhhbGZcIiwgXCJQaVwiXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNvc1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ29zXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBUYW46IHtcbiAgICAgIC8vIFJhbmdlOiAnUmVhbE51bWJlcicsXG4gICAgICBjb21wbGV4aXR5OiA1MTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiVGFuXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlRhblwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIlNpblwiLCBvcHMyWzBdXSwgW1wiQ29zXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJUYW5cIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIlRhblwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBjb252ZXJ0cyAoeCwgeSkgLT4gKHJhZGl1cywgYW5nbGUpICovXG4gICAgLy8gVG9Qb2xhckNvb3JkaW5hdGVzOiB7XG4gICAgLy8gICBkb21haW46ICdGdW5jdGlvbicsXG4gICAgLy8gICBvdXRwdXREb21haW46IFsnVHVwbGVPZicsICdSZWFsTnVtYmVyJywgJ1JlYWxOdW1iZXInXSxcbiAgICAvLyB9XG4gIH0sXG4gIC8vXG4gIC8vIEZ1bmN0aW9ucyBkZWZpbmVkIHVzaW5nIGFyaXRobWV0aWMgZnVuY3Rpb25zIG9yIGJhc2ljXG4gIC8vIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIGFib3ZlXG4gIC8vXG4gIHtcbiAgICBBcmNvc2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcmNvc2hcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjb3NoXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJMblwiLFxuICAgICAgICAgIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBvcHMyWzBdXSwgMV1dXVxuICAgICAgICBdKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY29zaFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjb3NoXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmNzaW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDU1MDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcmNzaW5cIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjc2luXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJBcmN0YW4yXCIsXG4gICAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICAgW1wiQWRkXCIsIDEsIFtcIlNxcnRcIiwgW1wiU3VidHJhY3RcIiwgMSwgW1wiU3F1YXJlXCIsIG9wczJbMF1dXV1dXG4gICAgICAgICAgXVxuICAgICAgICBdKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3NpblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjc2luXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICAvL05vdGU6IEFyc2luaCwgbm90IEFyQ3NpbmhcbiAgICBBcnNpbmg6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYxMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcnNpbmhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJzaW5oXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJMblwiLFxuICAgICAgICAgIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJTcXJ0XCIsIFtcIkFkZFwiLCBbXCJTcXVhcmVcIiwgb3BzMlswXV0sIDFdXV1cbiAgICAgICAgXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcnNpbmhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyc2luaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJ0YW5oOiB7XG4gICAgICBjb21wbGV4aXR5OiA2MzAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogaHlwZXJib2xpY0Z1bmN0aW9uKFwiQXJ0YW5oXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkFydGFuaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1xuICAgICAgICAgIFwiTXVsdGlwbHlcIixcbiAgICAgICAgICBcIkhhbGZcIixcbiAgICAgICAgICBbXCJMblwiLCBbXCJEaXZpZGVcIiwgW1wiQWRkXCIsIDEsIG9wczJbMF1dLCBbXCJTdWJ0cmFjdFwiLCAxLCBvcHMyWzBdXV1dXG4gICAgICAgIF0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJ0YW5oXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcnRhbmhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIENvc2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYwNTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJDb3NoXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvc2hcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcbiAgICAgICAgICBcIk11bHRpcGx5XCIsXG4gICAgICAgICAgXCJIYWxmXCIsXG4gICAgICAgICAgW1wiQWRkXCIsIFtcIkV4cFwiLCBvcHMyWzBdXSwgW1wiRXhwXCIsIFtcIk5lZ2F0ZVwiLCBvcHMyWzBdXV1dXG4gICAgICAgIF0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQ29zaFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ29zaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ290OiB7XG4gICAgICBjb21wbGV4aXR5OiA1NjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiQ290XCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvdFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIkNvc1wiLCBvcHMyWzBdXSwgW1wiU2luXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJDb3RcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNvdFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ3NjOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb3NlY2FudFwiLFxuICAgICAgY29tcGxleGl0eTogNTYwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IHRyaWdGdW5jdGlvbihcIkNzY1wiKSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gY29uc3RydWN0aWJsZVZhbHVlcyhjZSwgXCJDc2NcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcIkRpdmlkZVwiLCAxLCBbXCJTaW5cIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNzY1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ3NjXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICAvKiogPSBzaW4oei8yKV4yID0gKDEgLSBjb3MgeikgLyAyKi9cbiAgICBIYXZlcnNpbmU6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlEyNTI4MzgwXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAwLCAxXV0sXG4gICAgICAgIGV2YWx1YXRlOiBbXCJMYW1iZGFcIiwgW1wiRGl2aWRlXCIsIFtcIlN1YnRyYWN0XCIsIDEsIFtcIkNvc1wiLCBcIl8xXCJdXSwgMl1dXG4gICAgICB9XG4gICAgfSxcbiAgICAvKiogPSAyICogQXJjc2luKFNxcnQoeikpICovXG4gICAgSW52ZXJzZUhhdmVyc2luZToge1xuICAgICAgLy8gIFJhbmdlIFsnSW50ZXJ2YWwnLCBbWydOZWdhdGUnLCAnUGknXSwgJ1BpJ10sXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiLCBcIlJlYWxOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiBbXCJMYW1iZGFcIiwgW1wiTXVsdGlwbHlcIiwgMiwgW1wiQXJjc2luXCIsIFtcIlNxcnRcIiwgXCJfMVwiXV1dXVxuICAgICAgfVxuICAgIH0sXG4gICAgU2VjOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTZWNhbnQsIGludmVyc2Ugb2YgY29zaW5lXCIsXG4gICAgICBjb21wbGV4aXR5OiA1NTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiU2VjXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNlY1wiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIkNvc1wiLCBvcHMyWzBdXV0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiU2VjXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTZWNcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFNpbmg6IHtcbiAgICAgIC8vIFJhbmdlOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCBJbmZpbml0eV0sXG4gICAgICBjb21wbGV4aXR5OiA2ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJTaW5oXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNpbmhcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcbiAgICAgICAgICBcIk11bHRpcGx5XCIsXG4gICAgICAgICAgXCJIYWxmXCIsXG4gICAgICAgICAgW1wiU3VidHJhY3RcIiwgW1wiRXhwXCIsIG9wczJbMF1dLCBbXCJFeHBcIiwgW1wiTmVnYXRlXCIsIG9wczJbMF1dXV1cbiAgICAgICAgXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJTaW5oXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTaW5oXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgQ3NjaDoge1xuICAgICAgY29tcGxleGl0eTogNjIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkNzY2hcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQ3NjaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIlNpbmhcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNzY2hcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNzY2hcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFNlY2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAtMSwgMV1dLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNlY2hcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcIkRpdmlkZVwiLCAxLCBbXCJDb3NoXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJTZWNoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTZWNoXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBUYW5oOiB7XG4gICAgICAvLyBSYW5nZTogWydJbnRlcnZhbCcsIC1JbmZpbml0eSwgSW5maW5pdHldLFxuICAgICAgY29tcGxleGl0eTogNjIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGh5cGVyYm9saWNGdW5jdGlvbihcIlRhbmhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiVGFuaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIlNpbmhcIiwgb3BzMlswXV0sIFtcIkNvc2hcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIlRhbmhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIlRhbmhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHtcbiAgICBBcmNjb3M6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDU1NTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmNjb3NcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjY29zXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXCJTdWJ0cmFjdFwiLCBbXCJEaXZpZGVcIiwgXCJQaVwiLCAyXSwgW1wiQXJjc2luXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNjb3NcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY2Nvc1wiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJjY290OiB7XG4gICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluTnVtYmVyVG9SZWFsTnVtYmVyKFwiQXJjY290XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY2NvdFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjY290XCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmNvdGg6IHtcbiAgICAgIG51bWVyaWM6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmNvdGhcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJjb3RoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcmNvdGhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIEFyY3NjaDoge1xuICAgICAgbnVtZXJpYzogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkFyY3NjaFwiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNzY2hcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY3NjaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJjc2VjOiB7XG4gICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluTnVtYmVyVG9SZWFsTnVtYmVyKFwiQXJjc2VjXCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3NlY1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjc2VjXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcnNlY2g6IHtcbiAgICAgIG51bWVyaWM6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcnNlY2hcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJzZWNoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcnNlY2hcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIEFyY2NzYzoge1xuICAgICAgbnVtZXJpYzogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkFyY2NzY1wiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNjc2NcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY2NzY1wiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ290aDoge1xuICAgICAgY29tcGxleGl0eTogNjMwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGh5cGVyYm9saWNGdW5jdGlvbihcIkNvdGhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQ290aFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIlRhbmhcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNvdGhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNvdGhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qIGNvbnZlcnRzIChyYWRpdXMsIGFuZ2xlKSAtPiAoeCwgeSkgKi9cbiAgICAvLyBGcm9tUG9sYXJDb29yZGluYXRlczoge1xuICAgIC8vICAgZG9tYWluOiAnRnVuY3Rpb24nLFxuICAgIC8vICAgb3V0cHV0RG9tYWluOiBbJ1R1cGxlT2YnLCAnUmVhbE51bWJlcicsICdSZWFsTnVtYmVyJ10sXG4gICAgLy8gfSxcbiAgICBJbnZlcnNlRnVuY3Rpb246IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiRnVuY3Rpb25cIiwgXCJGdW5jdGlvblwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBvcHMyID0gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBmbGF0dGVuU2VxdWVuY2UoY2Fub25pY2FsKG9wczIpKSwgMSk7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NJbnZlcnNlRnVuY3Rpb24oY2UsIG9wczIpID8/IGNlLl9mbihcIkludmVyc2VGdW5jdGlvblwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gcHJvY2Vzc0ludmVyc2VGdW5jdGlvbihjZSwgb3BzMiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHByb2Nlc3NJbnZlcnNlRnVuY3Rpb24oY2UsIG9wczIpXG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xudmFyIFMyID0gW1wiU3FydFwiLCAyXTtcbnZhciBTMyA9IFtcIlNxcnRcIiwgM107XG52YXIgUzUgPSBbXCJTcXJ0XCIsIDVdO1xudmFyIFM2ID0gW1wiU3FydFwiLCA2XTtcbnZhciBDT05TVFJVQ1RJQkxFX1ZBTFVFUyA9IFtcbiAgW1xuICAgIFswLCAxXSxcbiAgICB7XG4gICAgICBTaW46IDAsXG4gICAgICBDb3M6IDEsXG4gICAgICBUYW46IDAsXG4gICAgICBDb3Q6IE5hTixcbiAgICAgIFNlYzogMSxcbiAgICAgIENzYzogTmFOXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDEyXSxcbiAgICB7XG4gICAgICBTaW46IFtcIkRpdmlkZVwiLCBbXCJTdWJ0cmFjdFwiLCBTNiwgUzJdLCA0XSxcbiAgICAgIENvczogW1wiRGl2aWRlXCIsIFtcIkFkZFwiLCBTNiwgUzJdLCA0XSxcbiAgICAgIFRhbjogW1wiU3VidHJhY3RcIiwgMiwgUzNdLFxuICAgICAgQ290OiBbXCJBZGRcIiwgMiwgUzNdLFxuICAgICAgU2VjOiBbXCJTdWJ0cmFjdFwiLCBTNiwgUzJdLFxuICAgICAgQ3NjOiBbXCJBZGRcIiwgUzYsIFMyXVxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFsxLCAxMF0sXG4gICAge1xuICAgICAgU2luOiBbXCJEaXZpZGVcIiwgW1wiU3VidHJhY3RcIiwgUzUsIDFdLCA0XSxcbiAgICAgIENvczogW1wiRGl2aWRlXCIsIFtcIlNxcnRcIiwgW1wiQWRkXCIsIDEwLCBbXCJNdWx0aXBseVwiLCAyLCBTNV1dXSwgNF0sXG4gICAgICBUYW46IFtcIkRpdmlkZVwiLCBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIDI1LCBbXCJNdWx0aXBseVwiLCAxMCwgUzVdXV0sIDRdLFxuICAgICAgQ290OiBbXCJTcXJ0XCIsIFtcIkFkZFwiLCA1LCBbXCJNdWx0aXBseVwiLCAyLCBTNV1dXSxcbiAgICAgIFNlYzogW1wiRGl2aWRlXCIsIFtcIlNxcnRcIiwgW1wiU3VidHJhY3RcIiwgNTAsIFtcIk11bHRpcGx5XCIsIDEwLCBTNV1dXSwgNV0sXG4gICAgICBDc2M6IFtcIkFkZFwiLCAxLCBTNV1cbiAgICB9XG4gIF0sXG4gIFtcbiAgICBbMSwgOF0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsyLVxcXFxzcXJ0Mn19ezJ9JFwiLFxuICAgICAgQ29zOiBcIiRcXFxcZnJhY3tcXFxcc3FydCB7Mit7XFxcXHNxcnQgezJ9fX19ezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHsyfSAtIDEkXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxzcXJ0ezJ9ICsgMSRcIixcbiAgICAgIFNlYzogXCIkXFxcXHNxcnR7IDQgLSAyXFxcXHNxcnR7Mn19JFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcc3FydHsgNCArIDJcXFxcc3FydHsyfX0kXCJcbiAgICB9XG4gIF0sXG4gIFtcbiAgICBbMSwgNl0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3sxfXsyfSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7XFxcXHNxcnR7M319ezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcZnJhY3tcXFxcc3FydHszfX17M30kXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxmcmFjezJcXFxcc3FydHszfX17M30kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezN9JFwiLFxuICAgICAgQ3NjOiAyXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDVdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MTAtIDJcXFxcc3FydHs1fX19IHs0fSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7MSsgXFxcXHNxcnR7NX19IHs0fSRcIixcbiAgICAgIFRhbjogXCIkXFxcXHNxcnR7NS0yXFxcXHNxcnQ1fSRcIixcbiAgICAgIENvdDogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MjUrMTBcXFxcc3FydDV9fSB7NX0kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezV9IC0gMSRcIixcbiAgICAgIENzYzogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NTArMTBcXFxcc3FydHs1fX19IHs1fSRcIlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFsxLCA0XSxcbiAgICB7XG4gICAgICBTaW46IFtcIkRpdmlkZVwiLCBTMiwgMl0sXG4gICAgICBDb3M6IFtcIkRpdmlkZVwiLCBTMiwgMl0sXG4gICAgICBUYW46IDEsXG4gICAgICBDb3Q6IDEsXG4gICAgICBTZWM6IFMyLFxuICAgICAgQ3NjOiBTMlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFszLCAxMF0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3sxKyBcXFxcc3FydHs1fX0gezR9JFwiLFxuICAgICAgQ29zOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsxMC0gMlxcXFxzcXJ0ezV9fX0gezR9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsyNSsxMFxcXFxzcXJ0NX19IHs1fSRcIixcbiAgICAgIENvdDogXCIkXFxcXHNxcnR7NS0yXFxcXHNxcnQ1fSRcIixcbiAgICAgIFNlYzogXCIkJFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcZnJhY3tcXFxcc3FydHs1MCsxMFxcXFxzcXJ0ezV9fX0gezV9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDNdLFxuICAgIHtcbiAgICAgIFNpbjogW1wiRGl2aWRlXCIsIFMzLCAyXSxcbiAgICAgIC8vICckXFxcXGZyYWN7XFxcXHNxcnR7M319ezJ9JCdcbiAgICAgIENvczogXCJIYWxmXCIsXG4gICAgICAvLyAnJFxcXFxmcmFjezF9ezJ9JCdcbiAgICAgIFRhbjogUzMsXG4gICAgICAvLyAnJFxcXFxzcXJ0ezN9JCdcbiAgICAgIENvdDogW1wiRGl2aWRlXCIsIFMzLCAzXSxcbiAgICAgIC8vICckXFxcXGZyYWN7XFxcXHNxcnR7M319ezN9JCdcbiAgICAgIFNlYzogMixcbiAgICAgIENzYzogW1wiRGl2aWRlXCIsIFtcIk11bHRpcGx5XCIsIDIsIFMzXSwgM11cbiAgICAgIC8vICckXFxcXGZyYWN7MlxcXFxzcXJ0ezN9fXszfSQnXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzMsIDhdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7IFxcXFxzcXJ0ezIgKyBcXFxcc3FydHsyfX0gfSB7Mn0kXCIsXG4gICAgICBDb3M6IFwiJFxcXFxmcmFjeyBcXFxcc3FydHsyIC0gXFxcXHNxcnR7Mn19IH0gezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHsyfSArIDEkXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxzcXJ0ezJ9IC0gMSRcIixcbiAgICAgIFNlYzogXCIkXFxcXHNxcnR7IDQgKyAyIFxcXFxzcXJ0ezJ9IH0kXCIsXG4gICAgICBDc2M6IFwiJFxcXFxzcXJ0eyA0IC0gMiBcXFxcc3FydHsyfSB9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzIsIDVdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MTArIDJcXFxcc3FydHs1fX19IHs0fSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NX0tMX0gezR9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHs1KzJcXFxcc3FydHs1fX0kXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxmcmFje1xcXFxzcXJ0ezI1LTEwXFxcXHNxcnR7NX19fSB7NX0kXCIsXG4gICAgICBTZWM6IFwiJDEgKyBcXFxcc3FydHs1fSRcIixcbiAgICAgIENzYzogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NTAtMTBcXFxcc3FydHs1fX19IHs1fSRcIlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFs1LCAxMl0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3tcXFxcc3FydHs2fSArIFxcXFxzcXJ0ezJ9fSB7NH0kXCIsXG4gICAgICBDb3M6IFwiJFxcXFxmcmFjeyBcXFxcc3FydHs2fSAtIFxcXFxzcXJ0ezJ9fSB7NH0kXCIsXG4gICAgICBUYW46IFwiJDIrXFxcXHNxcnR7M30kXCIsXG4gICAgICBDb3Q6IFwiJDItXFxcXHNxcnR7M30kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezZ9K1xcXFxzcXJ0ezJ9JFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcc3FydHs2fSAtIFxcXFxzcXJ0ezJ9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDJdLFxuICAgIHtcbiAgICAgIFNpbjogMSxcbiAgICAgIENvczogMCxcbiAgICAgIFRhbjogTmFOLFxuICAgICAgQ290OiAwLFxuICAgICAgU2VjOiBOYU4sXG4gICAgICBDc2M6IDFcbiAgICB9XG4gIF1cbl07XG52YXIgVFJJR19JREVOVElUSUVTID0ge1xuICBTaW46IFtcbiAgICBbMSwgXCJTaW5cIl0sXG4gICAgWzEsIFwiQ29zXCJdLFxuICAgIFstMSwgXCJTaW5cIl0sXG4gICAgWy0xLCBcIkNvc1wiXVxuICBdLFxuICBDb3M6IFtcbiAgICBbMSwgXCJDb3NcIl0sXG4gICAgWy0xLCBcIlNpblwiXSxcbiAgICBbLTEsIFwiQ29zXCJdLFxuICAgIFsxLCBcIlNpblwiXVxuICBdLFxuICBTZWM6IFtcbiAgICBbMSwgXCJTZWNcIl0sXG4gICAgWy0xLCBcIkNzY1wiXSxcbiAgICBbLTEsIFwiU2VjXCJdLFxuICAgIFsxLCBcIkNzY1wiXVxuICBdLFxuICBDc2M6IFtcbiAgICBbMSwgXCJDc2NcIl0sXG4gICAgWzEsIFwiU2VjXCJdLFxuICAgIFstMSwgXCJDc2NcIl0sXG4gICAgWy0xLCBcIlNlY1wiXVxuICBdLFxuICBUYW46IFtcbiAgICBbMSwgXCJUYW5cIl0sXG4gICAgWy0xLCBcIkNvdFwiXSxcbiAgICBbMSwgXCJUYW5cIl0sXG4gICAgWy0xLCBcIkNvdFwiXVxuICBdLFxuICBDb3Q6IFtcbiAgICBbMSwgXCJDb3RcIl0sXG4gICAgWy0xLCBcIlRhblwiXSxcbiAgICBbMSwgXCJDb3RcIl0sXG4gICAgWy0xLCBcIlRhblwiXVxuICBdXG59O1xuZnVuY3Rpb24gY29uc3RydWN0aWJsZVZhbHVlcyhjZSwgaGVhZDIsIHgpIHtcbiAgaWYgKCF4KVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGNvbnN0IHNwZWNpYWxWYWx1ZXMgPSBjZS5jYWNoZShcbiAgICBcImNvbnN0cnVjdGlibGUtdHJpZ29ub21ldHJpYy12YWx1ZXNcIixcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW3ZhbCwgcmVzdWx0c10gb2YgQ09OU1RSVUNUSUJMRV9WQUxVRVMpIHtcbiAgICAgICAgY29uc3QgYm94ZWRSZXN1bHRzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaGVhZDMgb2YgT2JqZWN0LmtleXMocmVzdWx0cykpXG4gICAgICAgICAgYm94ZWRSZXN1bHRzW2hlYWQzXSA9IGNlLnBhcnNlKGxhdGV4U3RyaW5nKHJlc3VsdHNbaGVhZDNdKSkgPz8gY2UuYm94KHJlc3VsdHNbaGVhZDNdKTtcbiAgICAgICAgdmFsdWVzLnB1c2goW3ZhbCwgYm94ZWRSZXN1bHRzXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH0sXG4gICAgKGNhY2hlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IFtfaywgdl0gb2YgY2FjaGUpIHtcbiAgICAgICAgZm9yIChjb25zdCB2MiBvZiBPYmplY3QudmFsdWVzKHYpKVxuICAgICAgICAgIHYyLnVuYmluZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgKTtcbiAgeCA9IHguTigpO1xuICBpZiAoeC5udW1lcmljVmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHRoZXRhID0gYXNGbG9hdCh4KSA/PyBudWxsO1xuICBpZiAodGhldGEgPT09IG51bGwpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgdGhldGEgPSB0aGV0YSAlICgyICogTWF0aC5QSSk7XG4gIGNvbnN0IGlkZW50aXR5U2lnbiA9IGhlYWQyICE9PSBcIkNvc1wiICYmIGhlYWQyICE9PSBcIlNlY1wiID8gTWF0aC5zaWduKHRoZXRhKSA6IDE7XG4gIHRoZXRhID0gTWF0aC5hYnModGhldGEpO1xuICBjb25zdCBxdWFkcmFudDIgPSBNYXRoLmZsb29yKHRoZXRhICogMiAvIE1hdGguUEkpO1xuICB0aGV0YSA9IHRoZXRhICUgKE1hdGguUEkgLyAyKTtcbiAgbGV0IHNpZ24yO1xuICBbc2lnbjIsIGhlYWQyXSA9IFRSSUdfSURFTlRJVElFU1toZWFkMl0/LltxdWFkcmFudDJdID8/IFsxLCBoZWFkMl07XG4gIHNpZ24yID0gc2lnbjIgKiBpZGVudGl0eVNpZ247XG4gIGZvciAoY29uc3QgW1tuLCBkXSwgcmVzdWx0XSBvZiBzcGVjaWFsVmFsdWVzKSB7XG4gICAgaWYgKHJlc3VsdFtoZWFkMl0gJiYgY2UuY2hvcCh0aGV0YSAtIE1hdGguUEkgKiBuIC8gZCkgPT09IDApIHtcbiAgICAgIHJldHVybiBzaWduMiA8IDAgPyBjYW5vbmljYWxOZWdhdGUocmVzdWx0W2hlYWQyXSkgOiByZXN1bHRbaGVhZDJdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvY2Vzc0ludmVyc2VGdW5jdGlvbihjZSwgeHMpIHtcbiAgaWYgKHhzLmxlbmd0aCAhPT0gMSlcbiAgICByZXR1cm4gdm9pZCAwO1xuICBjb25zdCBleHByID0geHNbMF07XG4gIGNvbnN0IGhlYWQyID0gZXhwci5zeW1ib2w7XG4gIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGhlYWQyID09PSBcIkludmVyc2VGdW5jdGlvblwiKVxuICAgIHJldHVybiBleHByLm9wMTtcbiAgY29uc3QgbmV3SGVhZCA9IHtcbiAgICBTaW46IFwiQXJjc2luXCIsXG4gICAgQ29zOiBcIkFyY2Nvc1wiLFxuICAgIFRhbjogXCJBcmN0YW5cIixcbiAgICBTZWM6IFwiQXJjc2VjXCIsXG4gICAgQ3NjOiBcIiBBcmNjc2NcIixcbiAgICBTaW5oOiBcIkFyc2luaFwiLFxuICAgIENvc2g6IFwiQXJjb3NoXCIsXG4gICAgVGFuaDogXCJBcnRhbmhcIixcbiAgICBTZWNoOiBcIkFyY3NlY2hcIixcbiAgICBDc2NoOiBcIkFyY3NjaFwiLFxuICAgIEFyY29zaDogXCJDb3NoXCIsXG4gICAgQXJjY29zOiBcIkNvc1wiLFxuICAgIEFyY2NzYzogXCJDc2NcIixcbiAgICBBcmNzY2g6IFwiQ3NjaFwiLFxuICAgIC8vICc/Pyc6ICdDb3QnLFxuICAgIC8vICc/Pyc6ICdDb3RoJyxcbiAgICBBcmNzZWM6IFwiU2VjXCIsXG4gICAgQXJjc2luOiBcIlNpblwiLFxuICAgIEFyc2luaDogXCJTaW5oXCIsXG4gICAgQXJjdGFuOiBcIlRhblwiLFxuICAgIEFydGFuaDogXCJUYW5oXCJcbiAgfVtoZWFkMl07XG4gIHJldHVybiBuZXdIZWFkID8gY2Uuc3ltYm9sKG5ld0hlYWQpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZXZhbFRyaWcoY2UsIG1vZGUsIGhlYWQyLCBvcDMpIHtcbiAgaWYgKCFvcDMpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKG1vZGUgPT09IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIGhlYWQyLCBvcDMpPy5ldmFsdWF0ZSgpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChvcDMuaXNFeGFjdClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgc3dpdGNoIChoZWFkMikge1xuICAgIGNhc2UgXCJBcmNjb3NcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5hY29zLFxuICAgICAgICAoeCkgPT4geC5hY29zKCksXG4gICAgICAgICh4KSA9PiB4LmFjb3MoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjY290XCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiBNYXRoLmF0YW4yKDEsIHgpLFxuICAgICAgICAoeCkgPT4gRGVjaW1hbC5hdGFuMihjZS5fQklHTlVNX09ORSwgeCksXG4gICAgICAgICh4KSA9PiB4LmludmVyc2UoKS5hdGFuKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY2NzY1wiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5hc2luKDEgLyB4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4KS5hc2luKCksXG4gICAgICAgICh4KSA9PiB4LmludmVyc2UoKS5hc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY29zaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICBNYXRoLmFjb3NoLFxuICAgICAgICAoeCkgPT4geC5hY29zaCgpLFxuICAgICAgICAoeCkgPT4geC5hY29zaCgpXG4gICAgICApO1xuICAgIGNhc2UgXCJBcmNvdGhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IHgsXG4gICAgICAgICh4KSA9PiB4LmFjb3NoKCksXG4gICAgICAgICh4KSA9PiB4LmFjb3NoKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY3NjaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5sb2coMSAvIHggKyBNYXRoLnNxcnQoMSAvICh4ICogeCkgKyAxKSksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC5tdWwoeCkpLmFkZChjZS5fQklHTlVNX09ORSkuc3FydCgpLmFkZChjZS5fQklHTlVNX09ORS5kaXYoeCkpLmxvZygpLFxuICAgICAgICAoeCkgPT4geC5tdWwoeCkuaW52ZXJzZSgpLmFkZCgxKS5zcXJ0KCkuYWRkKHguaW52ZXJzZSgpKS5sb2coKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjc2VjXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiBNYXRoLmFjb3MoMSAvIHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHgpLmFjb3MoKSxcbiAgICAgICAgKHgpID0+IHguaW52ZXJzZSgpLmFjb3MoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjc2luXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguYXNpbixcbiAgICAgICAgKHgpID0+IHguYXNpbigpLFxuICAgICAgICAoeCkgPT4geC5hc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyc2VjaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5sb2coKDEgKyBNYXRoLnNxcnQoMSAtIHggKiB4KSkgLyB4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLnN1Yih4Lm11bCh4KS5hZGQoY2UuX0JJR05VTV9PTkUpLmRpdih4KSkubG9nKCksXG4gICAgICAgICh4KSA9PiBjZS5jb21wbGV4KDEpLnN1Yih4Lm11bCh4KSkuYWRkKDEpLmRpdih4KS5sb2coKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJzaW5oXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguYXNpbmgsXG4gICAgICAgICh4KSA9PiB4LmFzaW5oKCksXG4gICAgICAgICh4KSA9PiB4LmFzaW5oKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY3RhblwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICBNYXRoLmF0YW4sXG4gICAgICAgICh4KSA9PiB4LmF0YW4oKSxcbiAgICAgICAgKHgpID0+IHguYXRhbigpXG4gICAgICApO1xuICAgIGNhc2UgXCJBcnRhbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5hdGFuaCxcbiAgICAgICAgKHgpID0+IHguYXRhbmgoKSxcbiAgICAgICAgKHgpID0+IHguYXRhbmgoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ29zXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguY29zLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLmNvcygpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHguY29zKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNvc2hcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5jb3NoLFxuICAgICAgICAoeCkgPT4geC5jb3NoKCksXG4gICAgICAgICh4KSA9PiB4LmNvc2goKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ290XCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiAxIC8gTWF0aC50YW4oeCksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC50YW4oKSksXG4gICAgICAgICh4KSA9PiB4LnRhbigpLmludmVyc2UoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ290aFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gMSAvIE1hdGgudGFuaCh4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4LnRhbmgoKSksXG4gICAgICAgICh4KSA9PiB4LnRhbmgoKS5pbnZlcnNlKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNzY1wiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gMSAvIE1hdGguc2luKHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHguc2luKCkpLFxuICAgICAgICAoeCkgPT4geC5zaW4oKS5pbnZlcnNlKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNzY2hcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IDEgLyBNYXRoLnNpbmgoeCksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC5zaW5oKCkpLFxuICAgICAgICAoeCkgPT4geC5zaW5oKCkuaW52ZXJzZSgpXG4gICAgICApO1xuICAgIGNhc2UgXCJTZWNcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IDEgLyBNYXRoLmNvcyh4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4LmNvcygpKSxcbiAgICAgICAgKHgpID0+IHguY29zKCkuaW52ZXJzZSgpXG4gICAgICApO1xuICAgIGNhc2UgXCJTZWNoXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiAxIC8gTWF0aC5jb3NoKHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHguY29zaCgpKSxcbiAgICAgICAgKHgpID0+IHguY29zaCgpLmludmVyc2UoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiU2luXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguc2luLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLnNpbigpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHguc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIlNpbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5zaW5oLFxuICAgICAgICAoeCkgPT4geC5zaW5oKCksXG4gICAgICAgICh4KSA9PiB4LnNpbmgoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiVGFuXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGgudGFuLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLnRhbigpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHgudGFuKClcbiAgICAgICk7XG4gICAgY2FzZSBcIlRhbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC50YW5oLFxuICAgICAgICAoeCkgPT4geC50YW5oKCksXG4gICAgICAgICh4KSA9PiB4LnRhbmgoKVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1zeW1ib2wtZGVmaW5pdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTcgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbnZhciBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsID0gY2xhc3Mge1xuICAvLyBAdG9kb1xuICBjb25zdHJ1Y3RvcihjZSwgbmFtZSwgZGVmKSB7XG4gICAgaWYgKCFjZS5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMud2lraWRhdGEgPSBkZWYud2lraWRhdGE7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlZi5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnVybCA9IGRlZi51cmw7XG4gICAgdGhpcy5fZW5naW5lID0gY2U7XG4gICAgdGhpcy5zY29wZSA9IGNlLmNvbnRleHQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9mbGFncyA9IGRlZi5mbGFncyA/IG5vcm1hbGl6ZUZsYWdzKGRlZi5mbGFncykgOiB2b2lkIDA7XG4gICAgdGhpcy5fZG9tYWluID0gZGVmLmRvbWFpbiA/IGNlLmRvbWFpbihkZWYuZG9tYWluKSA6IHZvaWQgMDtcbiAgICB0aGlzLmNvbnN0YW50ID0gZGVmLmNvbnN0YW50ID8/IGZhbHNlO1xuICAgIHRoaXMuaG9sZFVudGlsID0gZGVmLmhvbGRVbnRpbCA/PyBcImV2YWx1YXRlXCI7XG4gICAgaWYgKHRoaXMuY29uc3RhbnQpIHtcbiAgICAgIHRoaXMuX2RlZlZhbHVlID0gZGVmLnZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVmLnZhbHVlKSB7XG4gICAgICAgIGlmIChpc0xhdGV4U3RyaW5nKGRlZi52YWx1ZSkpXG4gICAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5wYXJzZShkZWYudmFsdWUpID8/IGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZi52YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gY2UuYm94KGRlZi52YWx1ZShjZSkgPz8gXCJVbmRlZmluZWRcIik7XG4gICAgICAgIGVsc2UgaWYgKGRlZi52YWx1ZSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gZGVmLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5ib3goZGVmLnZhbHVlKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmICghdGhpcy5fdmFsdWUgJiYgdGhpcy5fZG9tYWluICYmICFkZWYuZmxhZ3MpXG4gICAgICAgIHRoaXMuX2ZsYWdzID0gZG9tYWluVG9GbGFncyh0aGlzLl9kb21haW4pO1xuICAgIH1cbiAgfVxuICByZXNldCgpIHtcbiAgICBpZiAodGhpcy5jb25zdGFudClcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgfVxuICAvLyB1bmJpbmQoKSB7XG4gIC8vICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAvLyAgIHRoaXMuX2RvbWFpbiA9IG51bGw7XG4gIC8vIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgY2UgPSB0aGlzLl9lbmdpbmU7XG4gICAgICBpZiAoaXNMYXRleFN0cmluZyh0aGlzLl9kZWZWYWx1ZSkpXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gY2UucGFyc2UodGhpcy5fZGVmVmFsdWUpID8/IGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9kZWZWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aGlzLl92YWx1ZSA9IGNlLmJveCh0aGlzLl9kZWZWYWx1ZShjZSkgPz8gXCJVbmRlZmluZWRcIik7XG4gICAgICBlbHNlIGlmICh0aGlzLl9kZWZWYWx1ZSlcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5ib3godGhpcy5fZGVmVmFsdWUpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmICh0aGlzLl92YWx1ZT8ubnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX3ZhbHVlLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgaWYgKCFiaWdudW1QcmVmZXJyZWQoY2UpICYmIHZhbCBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICAgICAgICB0aGlzLl92YWx1ZSA9IGNlLm51bWJlcih2YWwudG9OdW1iZXIoKSk7XG4gICAgICAgIGVsc2UgaWYgKCFjb21wbGV4QWxsb3dlZChjZSkgJiYgdmFsIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNy5kZWZhdWx0KVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gY2UuX05BTjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IHZvaWQgMDtcbiAgfVxuICBzZXQgdmFsdWUodmFsKSB7XG4gICAgaWYgKHRoaXMuY29uc3RhbnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IFwiJHt0aGlzLm5hbWV9XCIgY2Fubm90IGJlIGNoYW5nZWRgXG4gICAgICApO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLl9kZWZWYWx1ZSA9PT0gdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9lbmdpbmUubnVtYmVyKHZhbCk7XG4gICAgfSBlbHNlIGlmICh2YWwpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuX2VuZ2luZS5ib3godmFsKTtcbiAgICAgIGlmICghdGhpcy5fZG9tYWluIHx8IG5ld1ZhbC5kb21haW4uaXNDb21wYXRpYmxlKHRoaXMuX2RvbWFpbikpXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdm9pZCAwKVxuICAgICAgdGhpcy5fZmxhZ3MgPSB2b2lkIDA7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fZmxhZ3MgPSBkb21haW5Ub0ZsYWdzKHRoaXMuZG9tYWluKTtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLl9kb21haW4gPz8gdGhpcy5fdmFsdWU/LmRvbWFpbiA/PyB2b2lkIDA7XG4gIH1cbiAgc2V0IGRvbWFpbihkb21haW4pIHtcbiAgICBpZiAodGhpcy5jb25zdGFudClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBkb21haW4gb2YgdGhlIGNvbnN0YW50IFwiJHt0aGlzLm5hbWV9XCIgY2Fubm90IGJlIGNoYW5nZWRgXG4gICAgICApO1xuICAgIGlmICghZG9tYWluKSB7XG4gICAgICB0aGlzLl9kZWZWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgICAgdGhpcy5fZmxhZ3MgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9kb21haW4gPSB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbWFpbiA9IHRoaXMuX2VuZ2luZS5kb21haW4oZG9tYWluKTtcbiAgICBpZiAodGhpcy5fZG9tYWluPy5pc051bWVyaWMpIHtcbiAgICAgIGlmICghZG9tYWluLmlzTnVtZXJpYylcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJDYW4ndCBjaGFuZ2UgZnJvbSBhIG51bWVyaWMgZG9tYWluIHRvIGEgbm9uLW51bWVyaWMgb25lXCIpO1xuICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xuICAgICAgaWYgKCF0aGlzLl92YWx1ZSlcbiAgICAgICAgdGhpcy5fZmxhZ3MgPSB7IC4uLnRoaXMuX2ZsYWdzID8/IHt9LCAuLi5kb21haW5Ub0ZsYWdzKGRvbWFpbikgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbWFpbilcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgY2hhbmdlIGEgbm9uLW51bWVyaWMgZG9tYWluXCIpO1xuICAgIHRoaXMuX2ZsYWdzID0gdm9pZCAwO1xuICAgIHRoaXMuX2RvbWFpbiA9IGRvbWFpbjtcbiAgICBpZiAoIXRoaXMuX3ZhbHVlICYmIGRvbWFpbi5pc051bWVyaWMpXG4gICAgICB0aGlzLl9mbGFncyA9IHsgLi4udGhpcy5fZmxhZ3MgPz8ge30sIC4uLmRvbWFpblRvRmxhZ3MoZG9tYWluKSB9O1xuICB9XG4gIC8vXG4gIC8vIEZsYWdzXG4gIC8vXG4gIGdldCBudW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTnVtYmVyID8/IHRoaXMuX2ZsYWdzPy5udW1iZXI7XG4gIH1cbiAgc2V0IG51bWJlcih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbnVtYmVyOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGludGVnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzSW50ZWdlciA/PyB0aGlzLl9mbGFncz8uaW50ZWdlcjtcbiAgfVxuICBzZXQgaW50ZWdlcih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgaW50ZWdlcjogdmFsIH0pO1xuICB9XG4gIGdldCByYXRpb25hbCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNSYXRpb25hbCA/PyB0aGlzLl9mbGFncz8ucmF0aW9uYWw7XG4gIH1cbiAgc2V0IHJhdGlvbmFsKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyByYXRpb25hbDogdmFsIH0pO1xuICB9XG4gIGdldCBhbGdlYnJhaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzQWxnZWJyYWljID8/IHRoaXMuX2ZsYWdzPy5hbGdlYnJhaWM7XG4gIH1cbiAgc2V0IGFsZ2VicmFpYyh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgYWxnZWJyYWljOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IHJlYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzUmVhbCA/PyB0aGlzLl9mbGFncz8ucmVhbDtcbiAgfVxuICBzZXQgcmVhbCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcmVhbDogdmFsIH0pO1xuICB9XG4gIGdldCBleHRlbmRlZFJlYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzRXh0ZW5kZWRSZWFsID8/IHRoaXMuX2ZsYWdzPy5leHRlbmRlZFJlYWw7XG4gIH1cbiAgc2V0IGV4dGVuZGVkUmVhbCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgZXh0ZW5kZWRSZWFsOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGNvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzQ29tcGxleCA/PyB0aGlzLl9mbGFncz8uY29tcGxleDtcbiAgfVxuICBzZXQgY29tcGxleCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgY29tcGxleDogdmFsIH0pO1xuICB9XG4gIGdldCBleHRlbmRlZENvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzRXh0ZW5kZWRDb21wbGV4ID8/IHRoaXMuX2ZsYWdzPy5leHRlbmRlZENvbXBsZXg7XG4gIH1cbiAgc2V0IGV4dGVuZGVkQ29tcGxleCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgZXh0ZW5kZWRDb21wbGV4OiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGltYWdpbmFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNJbWFnaW5hcnkgPz8gdGhpcy5fZmxhZ3M/LmltYWdpbmFyeTtcbiAgfVxuICBzZXQgaW1hZ2luYXJ5KHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBpbWFnaW5hcnk6IHZhbCB9KTtcbiAgfVxuICBnZXQgcG9zaXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzUG9zaXRpdmUgPz8gdGhpcy5fZmxhZ3M/LnBvc2l0aXZlO1xuICB9XG4gIHNldCBwb3NpdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcG9zaXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbm9uUG9zaXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm9uUG9zaXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5vblBvc2l0aXZlO1xuICB9XG4gIHNldCBub25Qb3NpdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm9uUG9zaXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbmVnYXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTmVnYXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5lZ2F0aXZlO1xuICB9XG4gIHNldCBuZWdhdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbmVnYXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbm9uTmVnYXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm9uTmVnYXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5vbk5lZ2F0aXZlO1xuICB9XG4gIHNldCBub25OZWdhdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm9uTmVnYXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgemVybygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNaZXJvID8/IHRoaXMuX2ZsYWdzPy56ZXJvO1xuICB9XG4gIHNldCB6ZXJvKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyB6ZXJvOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IG5vdFplcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm90WmVybyA/PyB0aGlzLl9mbGFncz8ubm90WmVybztcbiAgfVxuICBzZXQgbm90WmVybyh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm90WmVybzogdmFsIH0pO1xuICB9XG4gIGdldCBvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzT25lID8/IHRoaXMuX2ZsYWdzPy5vbmU7XG4gIH1cbiAgc2V0IG9uZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgb25lOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IG5lZ2F0aXZlT25lKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc05lZ2F0aXZlT25lID8/IHRoaXMuX2ZsYWdzPy5uZWdhdGl2ZU9uZTtcbiAgfVxuICBzZXQgbmVnYXRpdmVPbmUodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IG5lZ2F0aXZlT25lOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGluZmluaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc0luZmluaXR5ID8/IHRoaXMuX2ZsYWdzPy5pbmZpbml0eTtcbiAgfVxuICBzZXQgaW5maW5pdHkodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IGluZmluaXR5OiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGZpbml0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNGaW5pdGUgPz8gdGhpcy5fZmxhZ3M/LmZpbml0ZTtcbiAgfVxuICBzZXQgZmluaXRlKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBmaW5pdGU6IHZhbCB9KTtcbiAgfVxuICBnZXQgTmFOKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc05hTiA/PyB0aGlzLl9mbGFncz8uTmFOO1xuICB9XG4gIHNldCBOYU4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IE5hTjogdmFsIH0pO1xuICB9XG4gIGdldCBldmVuKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc0V2ZW4gPz8gdGhpcy5fZmxhZ3M/LmV2ZW47XG4gIH1cbiAgc2V0IGV2ZW4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IGV2ZW46IHZhbCB9KTtcbiAgfVxuICBnZXQgb2RkKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc09kZCA/PyB0aGlzLl9mbGFncz8ub2RkO1xuICB9XG4gIHNldCBvZGQodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IG9kZDogdmFsIH0pO1xuICB9XG4gIGdldCBwcmltZSgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl92YWx1ZTtcbiAgICBpZiAodmFsKSB7XG4gICAgICBpZiAoIXZhbC5pc0ludGVnZXIgfHwgdmFsLmlzTm9uUG9zaXRpdmUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBpc1ByaW1lKGFzRmxvYXQodmFsKSA/PyBOYU4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmxhZ3M/LnByaW1lO1xuICB9XG4gIHNldCBwcmltZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcHJpbWU6IHZhbCB9KTtcbiAgfVxuICBnZXQgY29tcG9zaXRlKCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuX3ZhbHVlO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICghdmFsLmlzSW50ZWdlciB8fCB2YWwuaXNOb25Qb3NpdGl2ZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuICFpc1ByaW1lKGFzRmxvYXQodmFsKSA/PyBOYU4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmxhZ3M/LmNvbXBvc2l0ZTtcbiAgfVxuICBzZXQgY29tcG9zaXRlKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBjb21wb3NpdGU6IHZhbCB9KTtcbiAgfVxuICB1cGRhdGVGbGFncyhmbGFncykge1xuICAgIGlmICh0aGlzLmNvbnN0YW50KVxuICAgICAgdGhyb3cgRXJyb3IoXCJUaGUgZmxhZ3Mgb2YgY29uc3RhbnQgY2Fubm90IGJlIGNoYW5nZWRcIik7XG4gICAgaWYgKHRoaXMuZG9tYWluPy5pc051bWVyaWMgPT09IGZhbHNlKVxuICAgICAgdGhyb3cgRXJyb3IoXCJGbGFncyBvbmx5IGFwcGx5IHRvIG51bWVyaWMgZG9tYWluc1wiKTtcbiAgICBsZXQgZmxhZ0NvdW50ID0gMDtcbiAgICBsZXQgY29uc2lzdGVudCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmbGFnIGluIE9iamVjdC5rZXlzKGZsYWdzKSkge1xuICAgICAgZmxhZ0NvdW50ICs9IDE7XG4gICAgICBpZiAodGhpcy5fdmFsdWUgJiYgZmxhZ3NbZmxhZ10gIT09IHZvaWQgMCkge1xuICAgICAgICBzd2l0Y2ggKGZsYWcpIHtcbiAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOdW1iZXIgPT09IGZsYWdzLm51bWJlcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNJbnRlZ2VyID09PSBmbGFncy5pbnRlZ2VyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInJhdGlvbmFsXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNSYXRpb25hbCA9PT0gZmxhZ3MucmF0aW9uYWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiYWxnZWJyYWljXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNBbGdlYnJhaWMgPT09IGZsYWdzLmFsZ2VicmFpYztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJyZWFsXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNSZWFsID09PSBmbGFncy5yZWFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImV4dGVuZGVkUmVhbFwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzRXh0ZW5kZWRSZWFsID09PSBmbGFncy5leHRlbmRlZFJlYWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY29tcGxleFwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzQ29tcGxleCA9PT0gZmxhZ3MuY29tcGxleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJleHRlbmRlZENvbXBsZXhcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0V4dGVuZGVkQ29tcGxleCA9PT0gZmxhZ3MuZXh0ZW5kZWRDb21wbGV4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImltYWdpbmFyeVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzSW1hZ2luYXJ5ID09PSBmbGFncy5pbWFnaW5hcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicG9zaXRpdmVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc1Bvc2l0aXZlID09PSBmbGFncy5wb3NpdGl2ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJub25Qb3NpdGl2ZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzTm9uUG9zaXRpdmUgPT09IGZsYWdzLm5vblBvc2l0aXZlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5lZ2F0aXZlXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOZWdhdGl2ZSA9PT0gZmxhZ3MubmVnYXRpdmU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibm9uTmVnYXRpdmVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc05vbk5lZ2F0aXZlID09PSBmbGFncy5ub25OZWdhdGl2ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ6ZXJvXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNaZXJvID09PSBmbGFncy56ZXJvO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vdFplcm9cIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc05vdFplcm8gPT09IGZsYWdzLm5vdFplcm87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib25lXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNPbmUgPT09IGZsYWdzLm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZWdhdGl2ZU9uZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzTmVnYXRpdmVPbmUgPT09IGZsYWdzLm5lZ2F0aXZlT25lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImluZmluaXR5XCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNJbmZpbml0eSA9PT0gZmxhZ3MuaW5maW5pdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTmFOXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOYU4gPT09IGZsYWdzLk5hTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaW5pdGVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0Zpbml0ZSA9PT0gZmxhZ3MuZmluaXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImV2ZW5cIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0V2ZW4gPT09IGZsYWdzLmV2ZW47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib2RkXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNPZGQgPT09IGZsYWdzLm9kZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJwcmltZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzUHJpbWUgPT09IGZsYWdzLnByaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImNvbXBvc2l0ZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzQ29tcG9zaXRlID09PSBmbGFncy5jb21wb3NpdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmxhZ0NvdW50ID4gMCkge1xuICAgICAgaWYgKCFjb25zaXN0ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlZlZhbHVlID0gdm9pZCAwO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RvbWFpbiA9IHRoaXMuX2VuZ2luZS5kb21haW4oXCJOdW1iZXJcIik7XG4gICAgICBpZiAoIXRoaXMuX2ZsYWdzKVxuICAgICAgICB0aGlzLl9mbGFncyA9IG5vcm1hbGl6ZUZsYWdzKGZsYWdzKTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fZmxhZ3MgPSB7IC4uLnRoaXMuX2ZsYWdzLCAuLi5ub3JtYWxpemVGbGFncyhmbGFncykgfTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBkZWZpbmVkS2V5cyh4cykge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHhzKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT09IHZvaWQgMClcbiAgKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZsYWdzKGZsYWdzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uZmxhZ3MgfTtcbiAgaWYgKGZsYWdzLnplcm8gfHwgZmxhZ3Mub25lIHx8IGZsYWdzLm5lZ2F0aXZlT25lKSB7XG4gICAgcmVzdWx0Lnplcm8gPSBmbGFncy56ZXJvICYmICFmbGFncy5vbmUgJiYgIWZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5ub3RaZXJvID0gIWZsYWdzLnplcm8gfHwgZmxhZ3Mub25lIHx8IGZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5vbmUgPSBmbGFncy5vbmUgJiYgIWZsYWdzLnplcm8gJiYgIWZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5uZWdhdGl2ZU9uZSA9IGZsYWdzLm5lZ2F0aXZlT25lICYmICFmbGFncy56ZXJvICYmICFmbGFncy5vbmU7XG4gICAgcmVzdWx0LmluZmluaXR5ID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICAgIHJlc3VsdC5maW5pdGUgPSB0cnVlO1xuICAgIHJlc3VsdC5pbnRlZ2VyID0gdHJ1ZTtcbiAgICByZXN1bHQuZmluaXRlID0gdHJ1ZTtcbiAgICByZXN1bHQuaW5maW5pdHkgPSBmYWxzZTtcbiAgICByZXN1bHQuTmFOID0gZmFsc2U7XG4gICAgcmVzdWx0LmV2ZW4gPSBmbGFncy5vbmU7XG4gICAgcmVzdWx0Lm9kZCA9ICFmbGFncy5vbmU7XG4gICAgcmVzdWx0LnByaW1lID0gZmFsc2U7XG4gICAgcmVzdWx0LmNvbXBvc2l0ZSA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuemVybykge1xuICAgIHJlc3VsdC5wb3NpdGl2ZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5uZWdhdGl2ZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5ub25Qb3NpdGl2ZSA9IHRydWU7XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAocmVzdWx0Lm5vdFplcm8gPT09IHRydWUpIHtcbiAgICBpZiAoIXJlc3VsdC5pbWFnaW5hcnkpXG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgcmVzdWx0Lnplcm8gPSBmYWxzZTtcbiAgfVxuICBpZiAocmVzdWx0Lm9uZSkge1xuICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gIH1cbiAgaWYgKHJlc3VsdC5uZWdhdGl2ZU9uZSkge1xuICAgIHJlc3VsdC5ub25Qb3NpdGl2ZSA9IHRydWU7XG4gIH1cbiAgaWYgKHJlc3VsdC5wb3NpdGl2ZSB8fCByZXN1bHQubm9uTmVnYXRpdmUpIHtcbiAgICByZXN1bHQubmVnYXRpdmVPbmUgPSBmYWxzZTtcbiAgfVxuICBpZiAocmVzdWx0LnBvc2l0aXZlKSB7XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5lZ2F0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubm9uUG9zaXRpdmUpIHtcbiAgICByZXN1bHQucG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubmVnYXRpdmUgPSByZXN1bHQubm90WmVybztcbiAgICByZXN1bHQubm9uTmVnYXRpdmUgPSAhcmVzdWx0Lnplcm87XG4gIH0gZWxzZSBpZiAocmVzdWx0Lm5lZ2F0aXZlKSB7XG4gICAgcmVzdWx0LnBvc2l0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gcmVzdWx0Lm5vdFplcm87XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAocmVzdWx0Lm5vbk5lZ2F0aXZlKSB7XG4gICAgcmVzdWx0LnBvc2l0aXZlID0gcmVzdWx0Lm5vdFplcm87XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gIXJlc3VsdC56ZXJvO1xuICAgIHJlc3VsdC5uZWdhdGl2ZSA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQucG9zaXRpdmUgfHwgcmVzdWx0Lm5lZ2F0aXZlIHx8IHJlc3VsdC5ub25Qb3NpdGl2ZSB8fCByZXN1bHQubm9uTmVnYXRpdmUpIHtcbiAgICByZXN1bHQubnVtYmVyID0gdHJ1ZTtcbiAgICBpZiAocmVzdWx0LmZpbml0ZSlcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICBlbHNlIGlmICghcmVzdWx0LmZpbml0ZSlcbiAgICAgIHJlc3VsdC5jb21wbGV4ID0gdHJ1ZTtcbiAgICByZXN1bHQuaW1hZ2luYXJ5ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHJlc3VsdC5maW5pdGUpIHtcbiAgICByZXN1bHQubnVtYmVyID0gdHJ1ZTtcbiAgICByZXN1bHQuY29tcGxleCA9IHRydWU7XG4gICAgcmVzdWx0LmluZmluaXR5ID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuaW5maW5pdHkpIHtcbiAgICByZXN1bHQuZmluaXRlID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuaW5maW5pdHkgPT09IGZhbHNlKSB7XG4gICAgcmVzdWx0LmV4dGVuZGVkQ29tcGxleCA9IGZhbHNlO1xuICAgIHJlc3VsdC5leHRlbmRlZFJlYWwgPSBmYWxzZTtcbiAgfVxuICBpZiAoZmxhZ3MuZXZlbilcbiAgICByZXN1bHQub2RkID0gZmFsc2U7XG4gIGlmIChmbGFncy5vZGQpXG4gICAgcmVzdWx0LmV2ZW4gPSBmYWxzZTtcbiAgaWYgKHJlc3VsdC5pbnRlZ2VyKVxuICAgIHJlc3VsdC5yYXRpb25hbCA9IHRydWU7XG4gIGlmIChyZXN1bHQucmF0aW9uYWwpXG4gICAgcmVzdWx0LmFsZ2VicmFpYyA9IHRydWU7XG4gIGlmIChyZXN1bHQuYWxnZWJyYWljKVxuICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5yZWFsKVxuICAgIHJlc3VsdC5jb21wbGV4ID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5pbWFnaW5hcnkpXG4gICAgcmVzdWx0LmNvbXBsZXggPSB0cnVlO1xuICBpZiAocmVzdWx0LmNvbXBsZXgpXG4gICAgcmVzdWx0Lm51bWJlciA9IHRydWU7XG4gIGlmIChyZXN1bHQucmVhbCAmJiByZXN1bHQuaW5maW5pdHkgIT09IGZhbHNlKVxuICAgIHJlc3VsdC5leHRlbmRlZFJlYWwgPSB0cnVlO1xuICBpZiAocmVzdWx0LmNvbXBsZXggJiYgcmVzdWx0LmluZmluaXR5ICE9PSBmYWxzZSlcbiAgICByZXN1bHQuZXh0ZW5kZWRDb21wbGV4ID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5ldmVuIHx8IHJlc3VsdC5pbmZpbml0eSB8fCByZXN1bHQuTmFOIHx8IHJlc3VsdC5uZWdhdGl2ZSB8fCByZXN1bHQuaW1hZ2luYXJ5IHx8IHJlc3VsdC5pbnRlZ2VyID09PSBmYWxzZSlcbiAgICByZXN1bHQucHJpbWUgPSBmYWxzZTtcbiAgaWYgKHJlc3VsdC5udW1iZXIgJiYgcmVzdWx0LnByaW1lKVxuICAgIHJlc3VsdC5jb21wb3NpdGUgPSBmYWxzZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvbWFpblRvRmxhZ3MoZG9tKSB7XG4gIGlmICghZG9tKVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGlmIChkb20uaXNOdW1lcmljKSB7XG4gICAgY29uc3QgZG9tYWluID0gZG9tLmxpdGVyYWw7XG4gICAgcmVzdWx0Lm51bWJlciA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJJbnRlZ2VyXCIpXG4gICAgICByZXN1bHQuaW50ZWdlciA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJSYXRpb25hbE51bWJlclwiKVxuICAgICAgcmVzdWx0LnJhdGlvbmFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIkFsZ2VicmFpY051bWJlclwiKVxuICAgICAgcmVzdWx0LmFsZ2VicmFpYyA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJUcmFuc2NlbmRlbnRhbE51bWJlclwiKSB7XG4gICAgICByZXN1bHQuYWxnZWJyYWljID0gZmFsc2U7XG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCIpXG4gICAgICByZXN1bHQuZXh0ZW5kZWRSZWFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIlJlYWxOdW1iZXJcIilcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIkltYWdpbmFyeU51bWJlclwiKVxuICAgICAgcmVzdWx0LmltYWdpbmFyeSA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIilcbiAgICAgIHJlc3VsdC5leHRlbmRlZENvbXBsZXggPSB0cnVlO1xuICAgIGlmIChkb21haW4gPT09IFwiQ29tcGxleE51bWJlclwiKVxuICAgICAgcmVzdWx0LmNvbXBsZXggPSB0cnVlO1xuICAgIGlmIChkb21haW4gPT09IFwiUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0Lm5vdFplcm8gPSB0cnVlO1xuICAgICAgcmVzdWx0LnJlYWwgPSB0cnVlO1xuICAgICAgcmVzdWx0LnBvc2l0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJOZWdhdGl2ZU51bWJlclwiKSB7XG4gICAgICByZXN1bHQubm90WmVybyA9IHRydWU7XG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgICByZXN1bHQubmVnYXRpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZG9tYWluID09PSBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpIHtcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiTm9uUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0LnJlYWwgPSB0cnVlO1xuICAgICAgcmVzdWx0Lm5lZ2F0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJQb3NpdGl2ZUludGVnZXJcIikge1xuICAgICAgcmVzdWx0Lm5vdFplcm8gPSB0cnVlO1xuICAgICAgcmVzdWx0LmludGVnZXIgPSB0cnVlO1xuICAgICAgcmVzdWx0LnBvc2l0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJOZWdhdGl2ZU51bWJlclwiKSB7XG4gICAgICByZXN1bHQubm90WmVybyA9IHRydWU7XG4gICAgICByZXN1bHQuaW50ZWdlciA9IHRydWU7XG4gICAgICByZXN1bHQubmVnYXRpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZG9tYWluID09PSBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpIHtcbiAgICAgIHJlc3VsdC5pbnRlZ2VyID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiTm9uUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0LmludGVnZXIgPSB0cnVlO1xuICAgICAgcmVzdWx0Lm5lZ2F0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0Lm51bWJlciA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbnRlZ2VyID0gZmFsc2U7XG4gICAgcmVzdWx0LnJhdGlvbmFsID0gZmFsc2U7XG4gICAgcmVzdWx0LmFsZ2VicmFpYyA9IGZhbHNlO1xuICAgIHJlc3VsdC5yZWFsID0gZmFsc2U7XG4gICAgcmVzdWx0LmV4dGVuZGVkUmVhbCA9IGZhbHNlO1xuICAgIHJlc3VsdC5jb21wbGV4ID0gZmFsc2U7XG4gICAgcmVzdWx0LmV4dGVuZGVkQ29tcGxleCA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbWFnaW5hcnkgPSBmYWxzZTtcbiAgICByZXN1bHQucG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubm9uUG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubmVnYXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubm9uTmVnYXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQuemVybyA9IGZhbHNlO1xuICAgIHJlc3VsdC5ub3RaZXJvID0gZmFsc2U7XG4gICAgcmVzdWx0Lm9uZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5uZWdhdGl2ZU9uZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbmZpbml0eSA9IGZhbHNlO1xuICAgIHJlc3VsdC5OYU4gPSBmYWxzZTtcbiAgICByZXN1bHQub2RkID0gZmFsc2U7XG4gICAgcmVzdWx0LmV2ZW4gPSBmYWxzZTtcbiAgICByZXN1bHQucHJpbWUgPSBmYWxzZTtcbiAgICByZXN1bHQuY29tcG9zaXRlID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGRlZmluZWRLZXlzKG5vcm1hbGl6ZUZsYWdzKHJlc3VsdCkpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1mdW5jdGlvbi1kZWZpbml0aW9uLnRzXG52YXIgQm94ZWRGdW5jdGlvbkRlZmluaXRpb25JbXBsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihjZSwgbmFtZSwgZGVmKSB7XG4gICAgaWYgKCFjZS5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLmVuZ2luZSA9IGNlO1xuICAgIHRoaXMuc2NvcGUgPSBjZS5jb250ZXh0O1xuICAgIGNvbnN0IGlkZW1wb3RlbnQgPSBkZWYuaWRlbXBvdGVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBpbnZvbHV0aW9uID0gZGVmLmludm9sdXRpb24gPz8gZmFsc2U7XG4gICAgaWYgKGlkZW1wb3RlbnQgJiYgaW52b2x1dGlvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IHRoZSAnaWRlbXBvdGVudCcgYW5kICdpbnZvbHV0aW9uJyBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlYFxuICAgICAgKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZWYuZGVzY3JpcHRpb247XG4gICAgdGhpcy53aWtpZGF0YSA9IGRlZi53aWtpZGF0YTtcbiAgICB0aGlzLnRocmVhZGFibGUgPSBkZWYudGhyZWFkYWJsZSA/PyBmYWxzZTtcbiAgICB0aGlzLmFzc29jaWF0aXZlID0gZGVmLmFzc29jaWF0aXZlID8/IGZhbHNlO1xuICAgIHRoaXMuY29tbXV0YXRpdmUgPSBkZWYuY29tbXV0YXRpdmUgPz8gZmFsc2U7XG4gICAgdGhpcy5pZGVtcG90ZW50ID0gaWRlbXBvdGVudDtcbiAgICB0aGlzLmludm9sdXRpb24gPSBpbnZvbHV0aW9uO1xuICAgIHRoaXMuaW5lcnQgPSBkZWYuaW5lcnQgPz8gZmFsc2U7XG4gICAgdGhpcy5udW1lcmljID0gZGVmLm51bWVyaWMgPz8gZmFsc2U7XG4gICAgdGhpcy5wdXJlID0gZGVmLnB1cmUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNvbXBsZXhpdHkgPSBkZWYuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgdGhpcy5ob2xkID0gZGVmLmhvbGQgPz8gXCJub25lXCI7XG4gICAgaWYgKHRoaXMuaW5lcnQpIHtcbiAgICAgIGlmIChkZWYuaG9sZClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBub3QgaGF2ZSBhIGhvbGRgXG4gICAgICAgICk7XG4gICAgICB0aGlzLmhvbGQgPSBcInJlc3RcIjtcbiAgICAgIGlmIChkZWYuc2lnbmF0dXJlKSB7XG4gICAgICAgIGNvbnN0IHNpZyA9IGRlZi5zaWduYXR1cmU7XG4gICAgICAgIGlmIChcInNpbXBsaWZ5XCIgaW4gc2lnIHx8IFwiZXZhbHVhdGVcIiBpbiBzaWcgfHwgXCJOXCIgaW4gc2lnIHx8IFwiZXZhbERpbWVuc2lvblwiIGluIHNpZyB8fCBcInNnblwiIGluIHNpZyB8fCBcImNvbXBpbGVcIiBpbiBzaWcpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgRnVuY3Rpb24gRGVmaW5pdGlvbiBcIiR7bmFtZX1cIjogYW4gaW5lcnQgZnVuY3Rpb24gc2hvdWxkIG9ubHkgaGF2ZSAnY2Fub25pY2FsJyBvciAnY29kb21haW4nIGhhbmRsZXJzYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50aHJlYWRhYmxlKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gRGVmaW5pdGlvbiBcIiR7bmFtZX1cIjogYW4gaW5lcnQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB0aHJlYWRhYmxlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuYXNzb2NpYXRpdmUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGFzc29jaWF0aXZlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuY29tbXV0YXRpdmUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNvbW11dGF0aXZlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuaWRlbXBvdGVudClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgaWRlbXBvdGVudGBcbiAgICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmludm9sdXRpb24pXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGludm9sdXRpb25gXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMucHVyZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBiZSBwdXJlYFxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVmLnNpZ25hdHVyZSkge1xuICAgICAgY29uc3Qgc2lnID0gZGVmLnNpZ25hdHVyZTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHNpZy5kb21haW4gPyBjZS5kb21haW4oc2lnLmRvbWFpbikgOiBkZWYubnVtZXJpYyA/IGNlLmRvbWFpbihcIk51bWVyaWNGdW5jdGlvblwiKSA6IGNlLmRvbWFpbihcIkZ1bmN0aW9uXCIpO1xuICAgICAgaWYgKCFkb21haW4uaXNWYWxpZClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGludmFsaWQgZG9tYWluICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBzaWcuZG9tYWluXG4gICAgICAgICAgKX1gXG4gICAgICAgICk7XG4gICAgICBjb25zdCBjb2RvbWFpbiA9IHNpZy5jb2RvbWFpbiA/PyBkb21haW4uY29kb21haW4gPz8gKGRlZi5udW1lcmljID8gY2UuZG9tYWluKFwiTnVtYmVyXCIpIDogY2UuZG9tYWluKFwiQW55dGhpbmdcIikpO1xuICAgICAgdGhpcy5zaWduYXR1cmUgPSB7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgY29kb21haW4sXG4gICAgICAgIGNhbm9uaWNhbDogc2lnLmNhbm9uaWNhbCxcbiAgICAgICAgc2ltcGxpZnk6IHNpZy5zaW1wbGlmeSxcbiAgICAgICAgZXZhbHVhdGU6ICFzaWcuZXZhbHVhdGUgPyB2b2lkIDAgOiB0eXBlb2Ygc2lnLmV2YWx1YXRlID09PSBcImZ1bmN0aW9uXCIgPyBzaWcuZXZhbHVhdGUgOiBjZS5ib3goc2lnLmV2YWx1YXRlLCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgICAgIE46IHNpZy5OLFxuICAgICAgICBldmFsRGltZW5zaW9uOiBzaWcuZXZhbERpbWVuc2lvbixcbiAgICAgICAgc2duOiBzaWcuc2duLFxuICAgICAgICBjb21waWxlOiBzaWcuY29tcGlsZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRlZi5udW1lcmljKSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZSA9IHtcbiAgICAgICAgZG9tYWluOiBjZS5kb21haW4oXCJOdW1lcmljRnVuY3Rpb25cIiksXG4gICAgICAgIGNvZG9tYWluOiBjZS5kb21haW4oXCJOdW1iZXJcIilcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmF0dXJlID0ge1xuICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIkZ1bmN0aW9uXCIpLFxuICAgICAgICBjb2RvbWFpbjogY2UuZG9tYWluKFwiQW55dGhpbmdcIilcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJlc2V0KCkge1xuICAgIHJldHVybjtcbiAgfVxufTtcbmZ1bmN0aW9uIG1ha2VGdW5jdGlvbkRlZmluaXRpb24oZW5naW5lLCBuYW1lLCBkZWYpIHtcbiAgaWYgKGRlZiBpbnN0YW5jZW9mIEJveGVkRnVuY3Rpb25EZWZpbml0aW9uSW1wbClcbiAgICByZXR1cm4gZGVmO1xuICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb25EZWZpbml0aW9uSW1wbChcbiAgICBlbmdpbmUsXG4gICAgbmFtZSxcbiAgICBkZWZcbiAgKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvbGlicmFyeS50c1xuZnVuY3Rpb24gZ2V0U3RhbmRhcmRMaWJyYXJ5KGNhdGVnb3JpZXMpIHtcbiAgaWYgKGNhdGVnb3JpZXMgPT09IFwiYWxsXCIpIHtcbiAgICByZXR1cm4gZ2V0U3RhbmRhcmRMaWJyYXJ5KFtcbiAgICAgIFwiZG9tYWluc1wiLFxuICAgICAgXCJjb3JlXCIsXG4gICAgICBcImNvbnRyb2wtc3RydWN0dXJlc1wiLFxuICAgICAgLy8gSWYsIEJsb2NrLCBMb29wXG4gICAgICBcImxvZ2ljXCIsXG4gICAgICBcImNvbGxlY3Rpb25zXCIsXG4gICAgICAvLyBEaWN0aW9uYXJ5LCBMaXN0LCBTZXRzXG4gICAgICBcInJlbG9wXCIsXG4gICAgICBcIm51bWVyaWNcIixcbiAgICAgIFwiYXJpdGhtZXRpY1wiLFxuICAgICAgXCJhbGdlYnJhXCIsXG4gICAgICBcImNhbGN1bHVzXCIsXG4gICAgICBcImNvbWJpbmF0b3JpY3NcIixcbiAgICAgIFwibGluZWFyLWFsZ2VicmFcIixcbiAgICAgIFwib3RoZXJcIixcbiAgICAgIFwicGh5c2ljc1wiLFxuICAgICAgXCJwb2x5bm9taWFsc1wiLFxuICAgICAgXCJzdGF0aXN0aWNzXCIsXG4gICAgICBcInRyaWdvbm9tZXRyeVwiLFxuICAgICAgXCJkaW1lbnNpb25zXCIsXG4gICAgICBcInVuaXRzXCJcbiAgICBdKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2F0ZWdvcmllcyA9PT0gXCJzdHJpbmdcIilcbiAgICBjYXRlZ29yaWVzID0gW2NhdGVnb3JpZXNdO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgY29uc3QgZGljdCA9IExJQlJBUklFU1tjYXRlZ29yeV07XG4gICAgaWYgKCFkaWN0KVxuICAgICAgdGhyb3cgRXJyb3IoYFVua25vd24gbGlicmFyeSBjYXRlZ29yeSAke2NhdGVnb3J5fWApO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRpY3QpKVxuICAgICAgcmVzdWx0LnB1c2goLi4uZGljdCk7XG4gICAgZWxzZVxuICAgICAgcmVzdWx0LnB1c2goZGljdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbnZhciBMSUJSQVJJRVMgPSB7XG4gIFwiYWxnZWJyYVwiOiBbXSxcbiAgLy8gJ2FsZ2VicmEnOiBbXG4gIC8vICAgLy8gcG9seW5vbWlhbChbMCwgMiwgMCwgNF06bGlzdCwgeDpzeW1ib2wpIC0+IDJ4ICsgNHheM1xuICAvLyAgIC8vIHBvbHlub21pYWwoMnggKyA0eF4zLCB4KSAtPiB7MCwgMiwgMCwgNH1cbiAgLy8gICAvLyByYXRpb25hbCgyeCArIDR4XjMsIHszLCAxfSwgeCkgLT4gKDJ4ICsgNHheMykvKDMreClcbiAgLy8gICAvLyBodHRwczovL3JlZmVyZW5jZS53b2xmcmFtLmNvbS9sYW5ndWFnZS90dXRvcmlhbC9BbGdlYnJhaWNDYWxjdWxhdGlvbnMuaHRtbFxuICAvLyAgIC8vIHNpbXBsaWZ5LXRyaWcgKG1hY3N5bWEpXG4gIC8vICAgLy8gIC0gdHJpZ1JlZHVjZSwgdHJpZ0V4cGFuZCwgdHJpZ0ZhY3RvciwgdHJpZ1RvRXhwIChtYXRoZW1hdGljYSlcbiAgLy8gICAvLyBNYXRoZW1hdGljYTpcbiAgLy8gICAvLyAtIGRpc3RyaWJ1dGUgLT4gKGErYikoYytkKSAtPiBhYysgYWQrIGJjKyBiZCAoZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGx5LFxuICAvLyAgIC8vIGYoYStiLCBjK2QpIC0+IGYoYSwgYykgKyBmKGEsIGQpICsgZihiLCBjKSArIGYoYiwgZClcbiAgLy8gICAvLyAtLSBkaXN0cmlidXRlKGV4cHIsIG92ZXI9YWRkLCB3aXRoPW11bHRpcGx5KVxuICAvLyAgIC8vIGh0dHBzOi8vcmVmZXJlbmNlLndvbGZyYW0uY29tL2xhbmd1YWdlL3JlZi9EaXN0cmlidXRlLmh0bWxcbiAgLy8gICAvLyAtIGV4cGFuZCwgZXhwYW5kLWFsbFxuICAvLyAgIC8vIC0gZmFjdG9yXG4gIC8vICAgLy8gLSBzaW1wbGlmeVxuICAvLyBdLFxuICBcImFyaXRobWV0aWNcIjogWy4uLkFSSVRITUVUSUNfTElCUkFSWSwgLi4uQ09NUExFWF9MSUJSQVJZXSxcbiAgXCJjYWxjdWx1c1wiOiBDQUxDVUxVU19MSUJSQVJZLFxuICBcImNvbWJpbmF0b3JpY3NcIjogW10sXG4gIC8vIEB0b2RvIGZpYm9uYWNjaSwgYmlub21pYWwsIGV0Yy4uLlxuICBcImNvbnRyb2wtc3RydWN0dXJlc1wiOiBbXSxcbiAgLy8gICAvLyBEXG4gIC8vICAgLy8gRGVyaXZhdGl2ZSAobWF0aGVtYXRpY2EpXG4gIC8vICAgLy8gZGlmZiAobWFjc3ltYSlcbiAgLy8gICAvLyBudGgtZGlmZlxuICAvLyAgIC8vIGludFxuICAvLyAgIC8vIC0gaW50ZWdyYXRlKGV4cHJlc3Npb24sIHN5bWJvbCkgIC0tIGluZGVmaW5pdGUgaW50ZWdyYWxcbiAgLy8gICAvLyAtIGludGVncmF0ZShleHByZXNzaW9uLCByYW5nZSkgPHJhbmdlPiA9IHtzeW1ib2wsIG1pbiwgbWF4fSAtLSBkZWZpbml0ZSBpbnRlZ3JhbFxuICAvLyAgIC8vIC0gaW50ZWdyYXRlKGV4cHJlc3Npb24sIHJhbmdlMSwgcmFuZ2UyKSAtLSBtdWx0aXBsZSBpbnRlZ3JhbFxuICAvLyAgIC8vIGRlZi1pbnRcbiAgLy8gXSxcbiAgXCJkaW1lbnNpb25zXCI6IFtdLFxuICAvLyBAdG9kbyAvLyB2b2x1bWUsIHNwZWVkLCBhcmVhXG4gIFwiZG9tYWluc1wiOiBbXSxcbiAgXCJjb3JlXCI6IENPUkVfTElCUkFSWSxcbiAgXCJjb2xsZWN0aW9uc1wiOiBbU0VUU19MSUJSQVJZLCBDT0xMRUNUSU9OU19MSUJSQVJZLCBkb21haW5TZXRzTGlicmFyeSgpXSxcbiAgLy8gJ2RvbWFpbnMnOiBnZXREb21haW5zRGljdGlvbmFyeSgpLFxuICBcImxpbmVhci1hbGdlYnJhXCI6IFtdLFxuICAvL0B0b2RvICAgLy8gJ2xpbmVhci1hbGdlYnJhJzogW1xuICAvLyAgIC8vIG1hdHJpeFxuICAvLyAgIC8vIHRyYW5zcG9zZVxuICAvLyAgIC8vIGNyb3NzLXByb2R1Y3RcbiAgLy8gICAvLyBvdXRlci1wcm9kdWN0XG4gIC8vICAgLy8gZGV0ZXJtaW5hbnRcbiAgLy8gICAvLyB2ZWN0b3JcbiAgLy8gICAvLyBtYXRyaXhcbiAgLy8gICAvLyByYW5rXG4gIC8vICAgLy8gc2NhbGFyLW1hdHJpeFxuICAvLyAgIC8vIGNvbnN0YW50LW1hdHJpeFxuICAvLyAgIC8vIGlkZW50aXR5LW1hdHJpeFxuICAvLyBdLFxuICBcImxvZ2ljXCI6IExPR0lDX0xJQlJBUlksXG4gIFwibnVtZXJpY1wiOiBbXSxcbiAgLy8gQHRvZG8gICAvLyAnbnVtZXJpYyc6IFtcbiAgLy8gICAvLyBHYW1tYSBmdW5jdGlvblxuICAvLyAgIC8vIFpldGEgZnVuY3Rpb25cbiAgLy8gICAvLyBlcmYgZnVuY3Rpb25cbiAgLy8gICAvLyBudW1lcmF0b3IoZnJhY3Rpb24pXG4gIC8vICAgLy8gZGVub21pbmF0b3IoZnJhY3Rpb24pXG4gIC8vICAgLy8gZXhhY3RGbG9hdFRvUmF0aW9uYWxcbiAgLy8gICAvLyBOIC0+IGV2YWwgYXMgYSBudW1iZXJcbiAgLy8gICAvLyByYW5kb21cbiAgLy8gICAvLyBoYXNoXG4gIC8vIF0sXG4gIFwib3RoZXJcIjogW10sXG4gIFwicmVsb3BcIjogUkVMT1BfTElCUkFSWSxcbiAgXCJwb2x5bm9taWFsc1wiOiBQT0xZTk9NSUFMU19MSUJSQVJZLFxuICBcInBoeXNpY3NcIjoge1xuICAgIE11MDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiVmFjY3VtIHBlcm1lYWJpbGl0eVwiLFxuICAgICAgY29uc3RhbnQ6IHRydWUsXG4gICAgICB3aWtpZGF0YTogXCJRMTUxNTI2MVwiLFxuICAgICAgZG9tYWluOiBcIlJlYWxOdW1iZXJcIixcbiAgICAgIHZhbHVlOiAxMjU2NjM3MDYyMTJlLTE3XG4gICAgICAvLyB1bml0OiBbJ0RpdmlkZScsICdOJywgWydTcXVhcmUnLCAnQSddXSxcbiAgICB9XG4gIH0sXG4gIFwic3RhdGlzdGljc1wiOiBTVEFUSVNUSUNTX0xJQlJBUlksXG4gIFwidHJpZ29ub21ldHJ5XCI6IFRSSUdPTk9NRVRSWV9MSUJSQVJZLFxuICBcInVuaXRzXCI6IFtdXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVEZWZpbml0aW9uTmFtZShuYW1lKSB7XG4gIG5hbWUgPSBuYW1lLm5vcm1hbGl6ZSgpO1xuICBpZiAoaXNWYWxpZElkZW50aWZpZXIobmFtZSkpXG4gICAgcmV0dXJuIG5hbWU7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgSW52YWxpZCBkZWZpbml0aW9uIG5hbWUgXCIke25hbWV9XCI6ICR7dmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpfWBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRDb250ZXh0U3ltYm9sVGFibGUoZW5naW5lLCB0YWJsZSkge1xuICB2YXIgX2E7XG4gIGlmICghZW5naW5lLmNvbnRleHQpXG4gICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgKF9hID0gZW5naW5lLmNvbnRleHQpLmlkVGFibGUgPz8gKF9hLmlkVGFibGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgY29uc3QgaWRUYWJsZSA9IGVuZ2luZS5jb250ZXh0LmlkVGFibGU7XG4gIGZvciAobGV0IG5hbWUgb2YgT2JqZWN0LmtleXModGFibGUpKSB7XG4gICAgY29uc3QgZW50cnkgPSB0YWJsZVtuYW1lXTtcbiAgICBuYW1lID0gdmFsaWRhdGVEZWZpbml0aW9uTmFtZShuYW1lKTtcbiAgICBpZiAoaXNGdW5jdGlvbkRlZmluaXRpb24oZW50cnkpKSB7XG4gICAgICBjb25zdCBkZWYgPSBtYWtlRnVuY3Rpb25EZWZpbml0aW9uKGVuZ2luZSwgbmFtZSwgZW50cnkpO1xuICAgICAgaWYgKGlkVGFibGUuaGFzKG5hbWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBmdW5jdGlvbiBkZWZpbml0aW9uICR7bmFtZX06XG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaWRUYWJsZS5nZXQobmFtZSlcbiAgICAgICAgICApfVxuJHtKU09OLnN0cmluZ2lmeShlbnRyeSl9YFxuICAgICAgICApO1xuICAgICAgaWRUYWJsZS5zZXQobmFtZSwgZGVmKTtcbiAgICB9IGVsc2UgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGRlZiA9IG5ldyBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsKGVuZ2luZSwgbmFtZSwgZW50cnkpO1xuICAgICAgaWYgKGVuZ2luZS5zdHJpY3QgJiYgZW50cnkud2lraWRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBbXywgZF0gb2YgaWRUYWJsZSkge1xuICAgICAgICAgIGlmIChkLndpa2lkYXRhID09PSBlbnRyeS53aWtpZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBlbnRyaWVzIHdpdGggd2lraWRhdGEgXCIke2VudHJ5Lndpa2lkYXRhfVwiOiBcIiR7bmFtZX1cIiBhbmQgXCIke2QubmFtZX1cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpZFRhYmxlLmhhcyhuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc3ltYm9sIGRlZmluaXRpb24gXCIke25hbWV9XCJgKTtcbiAgICAgIGlkVGFibGUuc2V0KG5hbWUsIGRlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZiA9IG5ldyBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsKGVuZ2luZSwgbmFtZSwge1xuICAgICAgICB2YWx1ZTogZW5naW5lLmJveChlbnRyeSlcbiAgICAgIH0pO1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGRlZik7XG4gICAgICBpZFRhYmxlLnNldChuYW1lLCBkZWYpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvY29zdC1mdW5jdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTkgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbmZ1bmN0aW9uIG51bWVyaWNDb3N0RnVuY3Rpb24obikge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuICE9PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGguYWJzKG4pKSAvIE1hdGgubG9nMigxMCkpICsgKG4gPiAwID8gMSA6IDIpO1xuICB9XG4gIHJldHVybiAyO1xufVxuZnVuY3Rpb24gY29zdEZ1bmN0aW9uKGV4cHIpIHtcbiAgaWYgKGV4cHIuc3ltYm9sKVxuICAgIHJldHVybiAxO1xuICBjb25zdCBudW0gPSBleHByLm51bWVyaWNWYWx1ZTtcbiAgaWYgKG51bSAhPT0gbnVsbCkge1xuICAgIGlmIChleHByLmlzWmVybylcbiAgICAgIHJldHVybiAxO1xuICAgIGlmIChleHByLmlzSW50ZWdlcilcbiAgICAgIHJldHVybiBudW1lcmljQ29zdEZ1bmN0aW9uKGFzRmxvYXQoZXhwcikpO1xuICAgIGlmIChpc1JhdGlvbmFsKG51bSkpIHtcbiAgICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0pKVxuICAgICAgICByZXR1cm4gbnVtZXJpY0Nvc3RGdW5jdGlvbihudW1bMF0pICsgbnVtZXJpY0Nvc3RGdW5jdGlvbihudW1bMV0pICsgMTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG51bWVyaWNDb3N0RnVuY3Rpb24oTnVtYmVyKG51bVswXSkpICsgbnVtZXJpY0Nvc3RGdW5jdGlvbihOdW1iZXIobnVtWzFdKSkgKyAxO1xuICAgIH1cbiAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxOS5kZWZhdWx0KVxuICAgICAgcmV0dXJuIG51bWVyaWNDb3N0RnVuY3Rpb24obnVtLnJlKSArIG51bWVyaWNDb3N0RnVuY3Rpb24obnVtLmltKSArIDE7XG4gICAgaWYgKGV4cHIuaXNOdW1iZXIpXG4gICAgICByZXR1cm4gMjtcbiAgfVxuICBjb25zdCBoZWFkMiA9IGV4cHIuaGVhZDtcbiAgbGV0IGhlYWRDb3N0ID0gMjtcbiAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChbXCJBZGRcIiwgXCJEaXZpZGVcIl0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSAzO1xuICAgIGVsc2UgaWYgKFtcIlN1YnRyYWN0XCIsIFwiTmVnYXRlXCJdLmluY2x1ZGVzKGhlYWQyKSlcbiAgICAgIGhlYWRDb3N0ID0gNDtcbiAgICBlbHNlIGlmIChbXCJTcXVhcmVcIiwgXCJTcXJ0XCIsIFwiTXVsdGlwbHlcIiwgXCJSb290XCJdLmluY2x1ZGVzKGhlYWQyKSlcbiAgICAgIGhlYWRDb3N0ID0gNTtcbiAgICBlbHNlIGlmIChbXCJQb3dlclwiXS5pbmNsdWRlcyhoZWFkMikpXG4gICAgICBoZWFkQ29zdCA9IDY7XG4gICAgZWxzZSBpZiAoW1wiTG5cIiwgXCJFeHBcIiwgXCJMb2dcIl0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSA3O1xuICAgIGVsc2UgaWYgKFtcbiAgICAgIFwiQXJjc2luXCIsXG4gICAgICBcIkFyY2Nvc1wiLFxuICAgICAgXCJBcmN0YW5cIixcbiAgICAgIFwiQXJjc2VjXCIsXG4gICAgICBcIiBBcmNjc2NcIixcbiAgICAgIFwiQXJzaW5oXCIsXG4gICAgICBcIkFyY29zaFwiLFxuICAgICAgXCJBcnRhbmhcIixcbiAgICAgIFwiQXJjc2VjaFwiLFxuICAgICAgXCJBcmNzY2hcIixcbiAgICAgIFwiQ29zaFwiLFxuICAgICAgXCJDb3NcIixcbiAgICAgIFwiQ3NjXCIsXG4gICAgICBcIkNzY2hcIixcbiAgICAgIC8vICc/Pyc6ICdDb3QnLFxuICAgICAgLy8gJz8/JzogJ0NvdGgnLFxuICAgICAgXCJTZWNcIixcbiAgICAgIFwiU2luXCIsXG4gICAgICBcIlNpbmhcIixcbiAgICAgIFwiVGFuXCIsXG4gICAgICBcIlRhbmhcIlxuICAgIF0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSA5O1xuICAgIGVsc2VcbiAgICAgIGhlYWRDb3N0ID0gMTA7XG4gIH0gZWxzZVxuICAgIGhlYWRDb3N0ID0gY29zdEZ1bmN0aW9uKGhlYWQyKTtcbiAgcmV0dXJuIGhlYWRDb3N0ICsgKGV4cHIub3BzPy5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgY29zdEZ1bmN0aW9uKHgpLCAwKSA/PyAwKTtcbn1cbnZhciBERUZBVUxUX0NPU1RfRlVOQ1RJT04gPSBjb3N0RnVuY3Rpb247XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2V4cHJlc3Npb24tbWFwLnRzXG52YXIgRXhwcmVzc2lvbk1hcCA9IGNsYXNzIF9FeHByZXNzaW9uTWFwIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIF9FeHByZXNzaW9uTWFwKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IG5ldyBNYXAoc291cmNlLl9pdGVtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgc291cmNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBoYXMoZXhwcikge1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLl9pdGVtcy5rZXlzKCkpXG4gICAgICBpZiAoeC5pc1NhbWUoZXhwcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQoZXhwcikge1xuICAgIGZvciAoY29uc3QgW3gsIHZdIG9mIHRoaXMuX2l0ZW1zKVxuICAgICAgaWYgKHguaXNTYW1lKGV4cHIpKVxuICAgICAgICByZXR1cm4gdjtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2l0ZW1zLmNsZWFyKCk7XG4gIH1cbiAgc2V0KGV4cHIsIHZhbHVlKSB7XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMuX2l0ZW1zLmtleXMoKSkge1xuICAgICAgaWYgKHguaXNTYW1lKGV4cHIpKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zLnNldCh4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXRlbXMuc2V0KGV4cHIsIHZhbHVlKTtcbiAgfVxuICBkZWxldGUoZXhwcikge1xuICAgIHRoaXMuX2l0ZW1zLmRlbGV0ZShleHByKTtcbiAgfVxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXMuZW50cmllcygpO1xuICB9XG4gIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmVudHJpZXMoKTtcbiAgfVxufTtcblxuLy8gc3JjL2NvbW1vbi91dGlscy50c1xuZnVuY3Rpb24gcGVybXV0YXRpb25zKHhzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBwZXJtdXRlID0gKGFyciwgbSA9IFtdKSA9PiB7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyID0gYXJyLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBjdXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgcGVybXV0ZShjdXJyLnNsaWNlKCksIG0uY29uY2F0KG5leHQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHBlcm11dGUoeHMpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1wYXR0ZXJucy50c1xudmFyIEJveGVkUGF0dGVybiA9IGNsYXNzIF9Cb3hlZFBhdHRlcm4gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBwYXR0ZXJuLCBtZXRhZGF0YSkge1xuICAgIHN1cGVyKGNlLCBtZXRhZGF0YSk7XG4gICAgdGhpcy5fcGF0dGVybiA9IGlzTGF0ZXhTdHJpbmcocGF0dGVybikgPyBjZS5wYXJzZShwYXR0ZXJuLCB7IGNhbm9uaWNhbDogZmFsc2UgfSkgOiBjZS5ib3gocGF0dGVybiwgeyBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIHJldHVybiBoYXNoQ29kZShcIlBhdHRlcm5cIikgXiB0aGlzLl9wYXR0ZXJuLmhhc2g7XG4gIH1cbiAgdW5iaW5kKCkge1xuICAgIHRoaXMuX3BhdHRlcm4udW5iaW5kKCk7XG4gIH1cbiAgZ2V0IGpzb24oKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgXCJQYXR0ZXJuXCIsIFt0aGlzLl9wYXR0ZXJuXSk7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiUGF0dGVyblwiO1xuICB9XG4gIGdldCBkb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihcIlBhdHRlcm5cIik7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbChfdmFsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHJocyBpbnN0YW5jZW9mIF9Cb3hlZFBhdHRlcm4gJiYgdGhpcy5fcGF0dGVybi5pc1NhbWUocmhzLl9wYXR0ZXJuKTtcbiAgfVxuICBpc0VxdWFsKHJocykge1xuICAgIHJldHVybiByaHMgaW5zdGFuY2VvZiBfQm94ZWRQYXR0ZXJuICYmIHRoaXMuX3BhdHRlcm4uaXNFcXVhbChyaHMuX3BhdHRlcm4pO1xuICB9XG4gIG1hdGNoKGV4cHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWF0Y2goZXhwciwgdGhpcy5fcGF0dGVybiwge1xuICAgICAgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UsXG4gICAgICBudW1lcmljVG9sZXJhbmNlOiBvcHRpb25zPy5udW1lcmljVG9sZXJhbmNlID8/IDAsXG4gICAgICBzdWJzdGl0dXRpb246IG9wdGlvbnM/LnN1YnN0aXR1dGlvbiA/PyB7fVxuICAgIH0pO1xuICB9XG4gIHRlc3QoZXhwciwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKGV4cHIsIG9wdGlvbnMpICE9PSBudWxsO1xuICB9XG4gIGNvdW50KGV4cHJzLCBvcHRpb25zKSB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJzKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaChleHByLCBvcHRpb25zKSAhPT0gbnVsbClcbiAgICAgICAgcmVzdWx0ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3VicyhzdWIyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdHRlcm4uc3VicyhzdWIyLCBvcHRpb25zKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGhhc1dpbGRjYXJkcyhleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZXhwci5zdGFydHNXaXRoKFwiX1wiKTtcbiAgaWYgKGV4cHIuc3ltYm9sPy5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGV4cHIub3BzKVxuICAgIHJldHVybiBoYXNXaWxkY2FyZHMoZXhwci5oZWFkKSB8fCBleHByLm9wcy5zb21lKGhhc1dpbGRjYXJkcyk7XG4gIGlmIChleHByLmtleXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBleHByLmtleXMpXG4gICAgICBpZiAoaGFzV2lsZGNhcmRzKGV4cHIuZ2V0S2V5KGtleSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjYXB0dXJlV2lsZGNhcmQod2lsZGNhcmQsIGV4cHIsIHN1YnN0aXR1dGlvbikge1xuICBjb25zdCBuYW1lID0gZ2V0V2lsZGNhcmROYW1lKHdpbGRjYXJkKTtcbiAgaWYgKG5hbWUgPT09IFwiXCIpXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgaWYgKHN1YnN0aXR1dGlvbltuYW1lXSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKCFleHByLmlzU2FtZShzdWJzdGl0dXRpb25bbmFtZV0pKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfVxuICBpZiAoaGFzV2lsZGNhcmRzKGV4cHIpKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4geyAuLi5zdWJzdGl0dXRpb24sIFtuYW1lXTogZXhwciB9O1xufVxuZnVuY3Rpb24gbWF0Y2hPbmNlKGV4cHIsIHBhdHRlcm4sIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAocGF0dGVybi5oZWFkID09PSBcIlBhdHRlcm5cIilcbiAgICByZXR1cm4gcGF0dGVybi5tYXRjaChleHByLCB7IHN1YnN0aXR1dGlvbiwgLi4ub3B0aW9ucyB9KTtcbiAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBCb3hlZE51bWJlcikge1xuICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBCb3hlZE51bWJlcikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAob3B0aW9ucy5udW1lcmljVG9sZXJhbmNlID09PSAwKVxuICAgICAgcmV0dXJuIHBhdHRlcm4uaXNTYW1lKGV4cHIpID8gc3Vic3RpdHV0aW9uIDogbnVsbDtcbiAgICByZXR1cm4gcGF0dGVybi5pc0VxdWFsV2l0aFRvbGVyYW5jZShleHByLCBvcHRpb25zLm51bWVyaWNUb2xlcmFuY2UpID8gc3Vic3RpdHV0aW9uIDogbnVsbDtcbiAgfVxuICBjb25zdCBzdHIgPSBwYXR0ZXJuLnN0cmluZztcbiAgaWYgKHN0ciAhPT0gbnVsbClcbiAgICByZXR1cm4gZXhwci5zdHJpbmcgPT09IHN0ciA/IHN1YnN0aXR1dGlvbiA6IG51bGw7XG4gIGNvbnN0IHN5bWJvbDIgPSBwYXR0ZXJuLnN5bWJvbDtcbiAgaWYgKHN5bWJvbDIgIT09IG51bGwpIHtcbiAgICBpZiAoc3ltYm9sMi5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICAgIHJldHVybiBjYXB0dXJlV2lsZGNhcmQoc3ltYm9sMiwgZXhwciwgc3Vic3RpdHV0aW9uKTtcbiAgICByZXR1cm4gc3ltYm9sMiA9PT0gZXhwci5zeW1ib2wgPyBzdWJzdGl0dXRpb24gOiBudWxsO1xuICB9XG4gIGlmIChwYXR0ZXJuLm5vcHMgIT09IGV4cHIubm9wcylcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5cyA9IHBhdHRlcm4ua2V5cztcbiAgaWYgKGtleXMgIT09IG51bGwpIHtcbiAgICBjb25zdCBleHByS2V5cyA9IGV4cHIua2V5cztcbiAgICBpZiAoZXhwcktleXMgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCByID0gbWF0Y2hPbmNlKGV4cHJLZXlzW2tleV0sIGtleXNba2V5XSwgc3Vic3RpdHV0aW9uLCBvcHRpb25zKTtcbiAgICAgIGlmIChyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHN1YnN0aXR1dGlvbiA9IHI7XG4gICAgfVxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cbiAgaWYgKHBhdHRlcm4ub3BzKSB7XG4gICAgY29uc3QgaGVhZDIgPSBwYXR0ZXJuLmhlYWQ7XG4gICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiBoZWFkMi5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICAgIHJldHVybiBjYXB0dXJlV2lsZGNhcmQoaGVhZDIsIGNlLmJveChleHByLmhlYWQpLCBzdWJzdGl0dXRpb24pO1xuICAgIGxldCBkZWYgPSB2b2lkIDA7XG4gICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXhwci5oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoaGVhZDIgIT09IGV4cHIuaGVhZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBkZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHIgPSBtYXRjaE9uY2UoXG4gICAgICAgIGNlLmJveChleHByLmhlYWQsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSxcbiAgICAgICAgY2UuYm94KGhlYWQyLCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgICAgIHN1YnN0aXR1dGlvbixcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICAgIGlmIChyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHN1YnN0aXR1dGlvbiA9IHI7XG4gICAgfVxuICAgIHJldHVybiBkZWY/LmNvbW11dGF0aXZlID8gbWF0Y2hDb21tdXRhdGl2ZUFyZ3VtZW50cyhleHByLCBwYXR0ZXJuLCBzdWJzdGl0dXRpb24sIG9wdGlvbnMpIDogbWF0Y2hOb25Db21tdXRhdGl2ZUFyZ3VtZW50cyhleHByLCBwYXR0ZXJuLCBzdWJzdGl0dXRpb24sIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gbWF0Y2hQZXJtdXRhdGlvbihjZSwgb3BzMiwgcGF0dGVybnMsIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBsZXQgcmVzdWx0ID0geyAuLi5zdWJzdGl0dXRpb24gfTtcbiAgb3BzMiA9IFsuLi5vcHMyXTtcbiAgbGV0IGhhc1Jlc3QgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBhcmcgb2YgcGF0dGVybnMpIHtcbiAgICBpZiAoYXJnLnN5bWJvbCA9PT0gXCJfX1wiKVxuICAgICAgaGFzUmVzdCA9IHRydWU7XG4gICAgZWxzZSB7XG4gICAgICBsZXQgciA9IG51bGw7XG4gICAgICBpZiAoYXJnLnN5bWJvbD8uc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gb3BzMi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICByID0gY2FwdHVyZVdpbGRjYXJkKGFyZy5zeW1ib2wsIG9wczJbaV0sIHJlc3VsdCk7XG4gICAgICAgICAgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG9wczIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBvcHMyLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIHIgPSBtYXRjaE9uY2Uob3BzMltpXSwgYXJnLCByZXN1bHQsIG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvcHMyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmVzdWx0ID0gcjtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNSZXN0ICYmIG9wczIubGVuZ3RoID4gMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiBoYXNSZXN0KVxuICAgIHJlc3VsdFtcIl9fXCJdID0gY2UuX2ZuKFwiU2VxdWVuY2VcIiwgb3BzMik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXRjaENvbW11dGF0aXZlQXJndW1lbnRzKGV4cHIsIHBhdHRlcm4sIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBwYXR0ZXJucyA9IHBlcm11dGF0aW9ucyhwYXR0ZXJuLm9wcyk7XG4gIGZvciAoY29uc3QgcGF0IG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbWF0Y2hQZXJtdXRhdGlvbihcbiAgICAgIGV4cHIuZW5naW5lLFxuICAgICAgZXhwci5vcHMsXG4gICAgICBwYXQsXG4gICAgICBzdWJzdGl0dXRpb24sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG1hdGNoTm9uQ29tbXV0YXRpdmVBcmd1bWVudHMoZXhwciwgcGF0dGVybiwgc3Vic3RpdHV0aW9uLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGNvbnN0IG9wczIgPSBbLi4uZXhwci5vcHNdO1xuICBsZXQgcmVzdWx0ID0geyAuLi5zdWJzdGl0dXRpb24gfTtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBwYXR0ZXJucyA9IHBhdHRlcm4ub3BzO1xuICB3aGlsZSAoaSA8IHBhdHRlcm4ubm9wcykge1xuICAgIGNvbnN0IHBhdCA9IHBhdHRlcm5zW2ldO1xuICAgIGNvbnN0IGFyZ05hbWUgPSBwYXQuc3ltYm9sO1xuICAgIGlmIChhcmdOYW1lICE9PSBudWxsKSB7XG4gICAgICBpZiAoYXJnTmFtZS5zdGFydHNXaXRoKFwiX19cIikpIHtcbiAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICBpZiAocGF0dGVybnNbaSArIDFdID09PSB2b2lkIDApIHtcbiAgICAgICAgICBqID0gb3BzMi5sZW5ndGggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgaiA8IG9wczIubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3VuZCA9IG1hdGNoT25jZShvcHMyW2pdLCBwYXR0ZXJuc1tpICsgMV0sIHJlc3VsdCwgb3B0aW9ucykgIT09IG51bGw7XG4gICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZ05hbWUuc3RhcnRzV2l0aChcIl9fX1wiKSAmJiBqIDw9IDEpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJlc3VsdCA9IGNhcHR1cmVXaWxkY2FyZChcbiAgICAgICAgICBhcmdOYW1lLFxuICAgICAgICAgIGNlLmZuKFwiU2VxdWVuY2VcIiwgb3BzMi5zcGxpY2UoMCwgaiAtIDEpKSxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoYXJnTmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICByZXN1bHQgPSBjYXB0dXJlV2lsZGNhcmQoYXJnTmFtZSwgb3BzMi5zaGlmdCgpLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ViMiA9IG1hdGNoT25jZShvcHMyLnNoaWZ0KCksIHBhdCwgcmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHN1YjIgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJlc3VsdCA9IHN1YjI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN1YjIgPSBtYXRjaE9uY2Uob3BzMi5zaGlmdCgpLCBwYXQsIHJlc3VsdCwgb3B0aW9ucyk7XG4gICAgICBpZiAoc3ViMiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICByZXN1bHQgPSBzdWIyO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaSArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXRjaChzdWJqZWN0LCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN1YnN0aXR1dGlvbiA9IG1hdGNoT25jZShzdWJqZWN0LCBwYXR0ZXJuLCBvcHRpb25zLnN1YnN0aXR1dGlvbiA/PyB7fSwge1xuICAgIG51bWVyaWNUb2xlcmFuY2U6IG9wdGlvbnM/Lm51bWVyaWNUb2xlcmFuY2UgPz8gTlVNRVJJQ19UT0xFUkFOQ0VcbiAgfSk7XG4gIGlmIChzdWJzdGl0dXRpb24pIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5sb2coXCJtYXRjaFwiLCBzdWJqZWN0LnRvU3RyaW5nKCksIHBhdHRlcm4udG9TdHJpbmcoKSwgc3Vic3RpdHV0aW9uKTtcbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9XG4gIGlmICghb3B0aW9ucy5yZWN1cnNpdmUpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1zeW1ib2wudHNcbmZ1bmN0aW9uIGlzU3ltYm9sRGVmaW5pdGlvbjIoZGVmKSB7XG4gIGlmIChkZWYgPT09IG51bGwgfHwgZGVmID09PSB2b2lkIDApXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoXCJjb25zdGFudFwiIGluIGRlZilcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkRlZmluaXRpb24yKGRlZikge1xuICBpZiAoZGVmID09PSBudWxsIHx8IGRlZiA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKFwic2lnbmF0dXJlXCIgaW4gZGVmKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG52YXIgQm94ZWRTeW1ib2wgPSBjbGFzcyBfQm94ZWRTeW1ib2wgZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoY2UsIG9wdGlvbnM/Lm1ldGFkYXRhKTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICBuYW1lID09PSBuYW1lLm5vcm1hbGl6ZSgpLFxuICAgICAgYFN5bWJvbCBcIiR7bmFtZX1cIiBtdXN0IGJlIGluIFVuaWNvZGUgTkZDIGNhbm9uaWNhbCBvcmRlcmBcbiAgICApO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChcbiAgICAgIGlzVmFsaWRJZGVudGlmaWVyKHRoaXMuX25hbWUpLFxuICAgICAgYEludmFsaWQgc3ltYm9sIFwiJHtuYW1lfVwiOiAke3ZhbGlkYXRlSWRlbnRpZmllcih0aGlzLl9uYW1lKX1gXG4gICAgKTtcbiAgICB0aGlzLl9zY29wZSA9IG9wdGlvbnM/LmNhbm9uaWNhbCA/IGNlLmNvbnRleHQgOiBudWxsO1xuICAgIHRoaXMuX2RlZiA9IG9wdGlvbnM/LmRlZiA/PyBudWxsO1xuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoID09PSB2b2lkIDApXG4gICAgICB0aGlzLl9oYXNoID0gaGFzaENvZGUodGhpcy5fbmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuX2hhc2g7XG4gIH1cbiAgdW5iaW5kKCkge1xuICAgIHRoaXMuX2RlZj8ucmVzZXQoKTtcbiAgICB0aGlzLl9kZWYgPSBudWxsO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbnN0YW50ICYmIHRoaXMuc3ltYm9sRGVmaW5pdGlvbi52YWx1ZT8uaXNQdXJlKSA/PyB0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbj8ucHVyZSA/PyBmYWxzZTtcbiAgfVxuICBnZXQganNvbigpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvblN5bWJvbCh0aGlzLmVuZ2luZSwgdGhpcy5fbmFtZSwge1xuICAgICAgbGF0ZXg6IHRoaXMuX2xhdGV4LFxuICAgICAgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhXG4gICAgfSk7XG4gIH1cbiAgZ2V0IHNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLl9zY29wZTtcbiAgfVxuICAvKiogQSBmcmVlIHZhcmlhYmxlIGVpdGhlciBoYXMgbm8gZGVmaW5pdGlvbiwgb3IgaXQgaGFzIGEgZGVmaW5pdGlvbiwgYnV0IG5vIHZhbHVlICovXG4gIGdldCBpc0ZyZWUoKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fZGVmID8/IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSk7XG4gICAgcmV0dXJuICFpc1N5bWJvbERlZmluaXRpb24yKGRlZikgfHwgZGVmLnZhbHVlID09PSB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzQ29uc3RhbnQoKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fZGVmID8/IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSk7XG4gICAgcmV0dXJuICFpc1N5bWJvbERlZmluaXRpb24yKGRlZikgfHwgZGVmLmNvbnN0YW50O1xuICB9XG4gIGdldCBpc0Nhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NvcGUgIT09IG51bGw7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX3Njb3BlID0gdmFsID8gdGhpcy5lbmdpbmUuY29udGV4dCA6IG51bGw7XG4gICAgdGhpcy5fZGVmID0gbnVsbDtcbiAgfVxuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIGlmICh0aGlzLl9zY29wZSlcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5ib3godGhpcy5fbmFtZSk7XG4gIH1cbiAgZ2V0IHdpa2lkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl93aWtpZGF0YSA/PyB0aGlzLmJhc2VEZWZpbml0aW9uPy53aWtpZGF0YSA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5iYXNlRGVmaW5pdGlvbilcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKCF0aGlzLmJhc2VEZWZpbml0aW9uLmRlc2NyaXB0aW9uKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAodHlwZW9mIHRoaXMuYmFzZURlZmluaXRpb24uZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gW3RoaXMuYmFzZURlZmluaXRpb24uZGVzY3JpcHRpb25dO1xuICAgIHJldHVybiB0aGlzLmJhc2VEZWZpbml0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZURlZmluaXRpb24/LnVybCA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGNvbXBsZXhpdHkoKSB7XG4gICAgcmV0dXJuIDc7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiU3ltYm9sXCI7XG4gIH1cbiAgZ2V0IHN5bWJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBnZXQgaXNOb3RoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lID09PSBcIk5vdGhpbmdcIjtcbiAgfVxuICAvLyAgQSBiYXNlIGRlZmluaXRpb24gaXMgdGhlIGJhc2UgY2xhc3Mgb2YgYm90aCBzeW1ib2wgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25cbiAgZ2V0IGJhc2VEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLl9kZWYgPT09IG51bGwpXG4gICAgICB0aGlzLmJpbmQodGhpcy5fc2NvcGUpO1xuICAgIHJldHVybiB0aGlzLl9kZWYgPz8gdm9pZCAwO1xuICB9XG4gIGdldCBzeW1ib2xEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLl9kZWYgPT09IG51bGwpXG4gICAgICB0aGlzLmJpbmQodGhpcy5fc2NvcGUpO1xuICAgIHJldHVybiBpc1N5bWJvbERlZmluaXRpb24yKHRoaXMuX2RlZikgPyB0aGlzLl9kZWYgOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGZ1bmN0aW9uRGVmaW5pdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZGVmID09PSBudWxsKVxuICAgICAgdGhpcy5iaW5kKHRoaXMuX3Njb3BlKTtcbiAgICByZXR1cm4gaXNGdW5jdGlvbkRlZmluaXRpb24yKHRoaXMuX2RlZikgPyB0aGlzLl9kZWYgOiB2b2lkIDA7XG4gIH1cbiAgYmluZChzY29wZSkge1xuICAgIGlmIChzY29wZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGVmID0gdm9pZCAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGVmO1xuICAgIGRlZiA9IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSwgc2NvcGUpO1xuICAgIGlmIChkZWY/Lndpa2lkYXRhICYmIHRoaXMuX3dpa2lkYXRhICYmIGRlZi53aWtpZGF0YSAhPT0gdGhpcy5fd2lraWRhdGEpXG4gICAgICBkZWYgPSB2b2lkIDA7XG4gICAgaWYgKGRlZikge1xuICAgICAgdGhpcy5fbmFtZSA9IGRlZi5uYW1lO1xuICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWYgPSB0aGlzLmVuZ2luZS5sb29rdXBGdW5jdGlvbih0aGlzLl9uYW1lLCBzY29wZSk7XG4gICAgaWYgKGRlZikge1xuICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmdpbmUuZGVmYXVsdERvbWFpbiAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lU3ltYm9sKHRoaXMuX25hbWUsIHtcbiAgICAgICAgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhLFxuICAgICAgICBkb21haW46IHRoaXMuZW5naW5lLmRlZmF1bHREb21haW5cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbmFtZSA9IHRoaXMuX2RlZi5uYW1lO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8udmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX25hbWVbMF0gPT09IFwiX1wiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHZhbHVlIG9mIHRoZSB3aWxkY2FyZCBcIiR7dGhpcy5fbmFtZX1cIiBjYW5ub3QgYmUgY2hhbmdlZGBcbiAgICAgICk7XG4gICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgIGxldCB2O1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBib3hlZFZhbHVlID0gdGhpcy5lbmdpbmUuYm94KHZhbHVlKTtcbiAgICAgIHYgPSBib3hlZFZhbHVlLnZhbHVlID8/IGJveGVkVmFsdWUuZXZhbHVhdGUoKTtcbiAgICB9XG4gICAgaWYgKHY/LmRvbWFpbi5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSkge1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lRnVuY3Rpb24odGhpcy5fbmFtZSwge1xuICAgICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgICBkb21haW46IHYuZG9tYWluLFxuICAgICAgICAgIGV2YWx1YXRlOiB2XG4gICAgICAgICAgLy8gRXZhbHVhdGUgYXMgYSBsYW1iZGFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9kZWYgJiYgaXNTeW1ib2xEZWZpbml0aW9uMih0aGlzLl9kZWYpKSB7XG4gICAgICB0aGlzLl9kZWYudmFsdWUgPSB2O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZG9tID0gdj8uZG9tYWluO1xuICAgICAgaWYgKGRvbT8uaXNOdW1lcmljKVxuICAgICAgICBkb20gPSB0aGlzLmVuZ2luZS5kb21haW4oXCJOdW1iZXJcIik7XG4gICAgICB0aGlzLl9kZWYgPSB0aGlzLmVuZ2luZS5kZWZpbmVTeW1ib2wodGhpcy5fbmFtZSwge1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgZG9tYWluOiBkb20gPz8gdm9pZCAwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICBpZiAodGhpcy5mdW5jdGlvbkRlZmluaXRpb24pXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKFwiRnVuY3Rpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8uZG9tYWluID8/IHRoaXMuZW5naW5lLmRlZmF1bHREb21haW4gPz8gdGhpcy5lbmdpbmUuZG9tYWluKFwiVmFsdWVcIik7XG4gIH1cbiAgc2V0IGRvbWFpbihpbkRvbWFpbikge1xuICAgIGlmICh0aGlzLl9uYW1lWzBdID09PSBcIl9cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBkb21haW4gb2YgdGhlIHdpbGRjYXJkIFwiJHt0aGlzLl9uYW1lfVwiIGNhbm5vdCBiZSBjaGFuZ2VkYFxuICAgICAgKTtcbiAgICBjb25zdCBkID0gdGhpcy5lbmdpbmUuZG9tYWluKGluRG9tYWluKTtcbiAgICBpZiAoZC5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSkge1xuICAgICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lRnVuY3Rpb24odGhpcy5fbmFtZSwge1xuICAgICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBkIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNTeW1ib2xEZWZpbml0aW9uMih0aGlzLl9kZWYpKSB7XG4gICAgICB0aGlzLl9kZWYuZG9tYWluID0gZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lU3ltYm9sKHRoaXMuX25hbWUsIHsgZG9tYWluOiBkIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgZXhwbGljaXREb21haW4oKSB7XG4gICAgaWYgKHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uKVxuICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihcIkZ1bmN0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmRvbWFpbiA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IHNnbigpIHtcbiAgICBjb25zdCB2ID0gdGhpcy52YWx1ZTtcbiAgICBpZiAodiAmJiB2ICE9PSB0aGlzKSB7XG4gICAgICBjb25zdCBzID0gdi5zZ247XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uO1xuICAgIGlmIChkZWYpIHtcbiAgICAgIGlmIChkZWYuemVybyA9PT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAoZGVmLnBvc2l0aXZlID09PSB0cnVlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChkZWYubmVnYXRpdmUgPT09IHRydWUpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaGFzKHgpIHtcbiAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdGhpcy5fbmFtZSA9PT0geDtcbiAgICByZXR1cm4geC5pbmNsdWRlcyh0aGlzLl9uYW1lKTtcbiAgfVxuICBpc1NhbWUocmhzKSB7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZFN5bWJvbCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX25hbWUgPT09IHJocy5fbmFtZTtcbiAgfVxuICBtYXRjaChyaHMsIF9vcHRpb25zKSB7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkU3ltYm9sKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLl9uYW1lID09PSByaHMuX25hbWUpXG4gICAgICByZXR1cm4ge307XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWwuaXNFcXVhbChyaHMpO1xuICAgIHJocyA9IHJocy5jYW5vbmljYWw7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWU7XG4gICAgY29uc3QgbGhzVmFsID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy52YWx1ZT8uTigpO1xuICAgIGlmIChsaHNWYWwpXG4gICAgICByZXR1cm4gbGhzVmFsLmlzRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGlmICh0aGlzLmlzWmVybylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcy5pc05vdFplcm8pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNaZXJvICYmIHJocy5pc05vdFplcm8pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZW5naW5lLmFzayhbXCJFcXVhbFwiLCB0aGlzLCByaHNdKS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZW5naW5lLmFzayhbXCJOb3RFcXVhbFwiLCB0aGlzLCByaHNdKS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0xlc3MocmhzKSB7XG4gICAgaWYgKHJocy5zeW1ib2wgIT09IG51bGwgJiYgcmhzLnN5bWJvbCA9PT0gdGhpcy5fbmFtZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNMZXNzKHJocy5OKCkpO1xuICAgIGlmIChyaHMuaXNaZXJvKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHMgIT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHMgPCAwO1xuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzTGVzc0VxdWFsKHJocykge1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsICYmIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNMZXNzRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcyA8PSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0xlc3MocmhzKSB8fCB0aGlzLmlzRXF1YWwocmhzKTtcbiAgfVxuICBpc0dyZWF0ZXIocmhzKSB7XG4gICAgaWYgKHJocy5zeW1ib2wgIT09IG51bGwgJiYgcmhzLnN5bWJvbCA9PT0gdGhpcy5fbmFtZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNHcmVhdGVyKHJocy5OKCkpO1xuICAgIGlmIChyaHMuaXNaZXJvKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHMgIT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHMgPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsICYmIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNHcmVhdGVyRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcyA+PSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0dyZWF0ZXIocmhzKSB8fCB0aGlzLmlzRXF1YWwocmhzKTtcbiAgfVxuICBnZXQgaXNGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbjtcbiAgfVxuICBnZXQgaXNaZXJvKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lnplcm87XG4gIH1cbiAgZ2V0IGlzTm90WmVybygpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5ub3RaZXJvO1xuICB9XG4gIGdldCBpc09uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5vbmU7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8ubmVnYXRpdmVPbmU7XG4gIH1cbiAgZ2V0IGlzT2RkKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm9kZDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmV2ZW47XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8ucHJpbWU7XG4gIH1cbiAgZ2V0IGlzQ29tcG9zaXRlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbXBvc2l0ZTtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5pbmZpbml0eTtcbiAgfVxuICBnZXQgaXNOYU4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8uTmFOO1xuICB9XG4gIC8vIHggPiAwXG4gIGdldCBpc1Bvc2l0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnBvc2l0aXZlO1xuICB9XG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5vblBvc2l0aXZlO1xuICB9XG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5lZ2F0aXZlO1xuICB9XG4gIGdldCBpc05vbk5lZ2F0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5vbk5lZ2F0aXZlO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5udW1iZXI7XG4gIH1cbiAgZ2V0IGlzSW50ZWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5pbnRlZ2VyO1xuICB9XG4gIGdldCBpc1JhdGlvbmFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnJhdGlvbmFsO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5yYXRpb25hbDtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnJlYWw7XG4gIH1cbiAgZ2V0IGlzRXh0ZW5kZWRSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmV4dGVuZGVkUmVhbDtcbiAgfVxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbXBsZXg7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmltYWdpbmFyeTtcbiAgfVxuICBzaW1wbGlmeShvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uO1xuICAgIGlmIChkZWY/LmhvbGRVbnRpbCA9PT0gXCJzaW1wbGlmeVwiICYmIGRlZi52YWx1ZSlcbiAgICAgIHJldHVybiBkZWYudmFsdWUuc2ltcGxpZnkob3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM/LnJ1bGVzID8gdGhpcy5yZXBsYWNlKG9wdGlvbnMucnVsZXMpID8/IHRoaXMgOiB0aGlzO1xuICB9XG4gIGV2YWx1YXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLnN5bWJvbERlZmluaXRpb247XG4gICAgaWYgKGRlZiAmJiAoZGVmLmhvbGRVbnRpbCA9PT0gXCJzaW1wbGlmeVwiIHx8IGRlZi5ob2xkVW50aWwgPT09IFwiZXZhbHVhdGVcIikpXG4gICAgICByZXR1cm4gZGVmLnZhbHVlPy5ldmFsdWF0ZShvcHRpb25zKSA/PyB0aGlzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIE4ob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuc3ltYm9sRGVmaW5pdGlvbjtcbiAgICBpZiAoZGVmICYmIGRlZi5ob2xkVW50aWwgPT09IFwibmV2ZXJcIilcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKG9wdGlvbnMpID8/IHRoaXM7XG4gIH1cbiAgcmVwbGFjZShydWxlcywgb3B0aW9ucykge1xuICAgIHJldHVybiByZXBsYWNlKHRoaXMsIHJ1bGVzLCBvcHRpb25zKTtcbiAgfVxuICBzdWJzKHN1YjIsIG9wdGlvbnMpIHtcbiAgICBpZiAoc3ViMlt0aGlzLl9uYW1lXSA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIG9wdGlvbnM/LmNhbm9uaWNhbCA/IHRoaXMuY2Fub25pY2FsIDogdGhpcztcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuYm94KHN1YjJbdGhpcy5fbmFtZV0sIG9wdGlvbnMpO1xuICB9XG59O1xuZnVuY3Rpb24gbWFrZUNhbm9uaWNhbFN5bWJvbChjZSwgbmFtZSkge1xuICBjb25zdCBkZWYgPSBjZS5sb29rdXBTeW1ib2wobmFtZSwgdm9pZCAwLCBjZS5jb250ZXh0KTtcbiAgaWYgKGRlZj8uaG9sZFVudGlsID09PSBcIm5ldmVyXCIgJiYgZGVmLnZhbHVlKVxuICAgIHJldHVybiBkZWYudmFsdWU7XG4gIHJldHVybiBuZXcgQm94ZWRTeW1ib2woY2UsIG5hbWUsIHsgY2Fub25pY2FsOiB0cnVlLCBkZWYgfSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9jb21wdXRlLWVuZ2luZS50c1xudmFyIENvbXB1dGVFbmdpbmUgPSBjbGFzcyBfQ29tcHV0ZUVuZ2luZSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgYENvbXB1dGVFbmdpbmVgIGluc3RhbmNlLlxuICAgKlxuICAgKiBJZGVudGlmaWVyIHRhYmxlcyBkZWZpbmUgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIChpbiBgb3B0aW9ucy5pZHNgKS5cbiAgICogSWYgbm8gdGFibGUgaXMgcHJvdmlkZWQgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaXMgdXNlZCAoYENvbXB1dGVFbmdpbmUuZ2V0U3RhbmRhcmRMaWJyYXJ5KClgKVxuICAgKlxuICAgKiBUaGUgTGFUZVggc3ludGF4IGRpY3Rpb25hcnkgaXMgZGVmaW5lZCBpbiBgb3B0aW9ucy5sYXRleERpY3Rpb25hcnlgLlxuICAgKlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGRpY3Rpb25hcmllcyBtYXR0ZXI6IHRoZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBsYXRlciBvbmVzXG4gICAqIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucyBmcm9tIGVhcmxpZXIgb25lcy4gVGhlIGZpcnN0IGRpY3Rpb25hcnkgc2hvdWxkXG4gICAqIGJlIHRoZSBgJ2NvcmUnYCBkaWN0aW9uYXJ5IHdoaWNoIGluY2x1ZGUgc29tZSBiYXNpYyBkZWZpbml0aW9ucyBzdWNoXG4gICAqIGFzIGRvbWFpbnMgKGBCb29sZWFuYCwgYE51bWJlcmAsIGV0Yy4uLikgdGhhdCBhcmUgdXNlZCBieSBsYXRlciBkaWN0aW9uYXJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLm51bWVyaWNNb2RlIFRoZSBkZWZhdWx0IG1vZGUgaXMgYFwiYXV0b1wiYC4gVXNlIGBcIm1hY2hpbmVcImBcbiAgICogdG8gcGVyZm9ybSBudW1lcmljIGNhbGN1bGF0aW9ucyB1c2luZyA2NC1iaXQgZmxvYXRzLiBVc2UgYFwiYmlnbnVtXCJgIHRvXG4gICAqIHBlcmZvcm0gY2FsY3VsYXRpb25zIHVzaW5nIGFyYml0cmFyeSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICogVXNlIGBcImF1dG9cImAgb3IgYFwiY29tcGxleFwiYCB0byBhbGxvdyBjYWxjdWxhdGlvbnMgb24gY29tcGxleCBudW1iZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5udW1lcmljUHJlY2lzaW9uIFNwZWNpZmljIGhvdyBtYW55IGRpZ2l0cyBvZiBwcmVjaXNpb25cbiAgICogZm9yIHRoZSBudW1lcmljIGNhbGN1bGF0aW9ucy4gRGVmYXVsdCBpcyAxMDAuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnRvbGVyYW5jZSBJZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvXG4gICAqIG51bWJlcnMgaXMgbGVzcyB0aGFuIGB0b2xlcmFuY2VgLCB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLiBVc2VkIGJ5XG4gICAqIGBjaG9wKClgIGFzIHdlbGwuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLmRlZmF1bHREb21haW4gSWYgYW4gdW5rbm93biBzeW1ib2wgaXMgZW5jb3VudGVyZWQsIGFzc3VtZVxuICAgKiB0aGlzIGlzIGl0cyBkb21haW4uICoqRGVmYXVsdCoqIGBFeHRlbmRlZFJlYWxOdW1iZXJgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NvbW1vblN5bWJvbHMgPSB7XG4gICAgICBUcnVlOiBudWxsLFxuICAgICAgRmFsc2U6IG51bGwsXG4gICAgICBNYXliZTogbnVsbCxcbiAgICAgIEFsbDogbnVsbCxcbiAgICAgIE5vdGhpbmc6IG51bGwsXG4gICAgICBOb25lOiBudWxsLFxuICAgICAgVW5kZWZpbmVkOiBudWxsLFxuICAgICAgRnVuY3Rpb246IG51bGwsXG4gICAgICBQaTogbnVsbCxcbiAgICAgIEltYWdpbmFyeVVuaXQ6IG51bGxcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9jb21tb25OdW1iZXJzID0ge1xuICAgICAgXCItNVwiOiBudWxsLFxuICAgICAgXCItNFwiOiBudWxsLFxuICAgICAgXCItM1wiOiBudWxsLFxuICAgICAgXCItMlwiOiBudWxsLFxuICAgICAgMjogbnVsbCxcbiAgICAgIDM6IG51bGwsXG4gICAgICA0OiBudWxsLFxuICAgICAgNTogbnVsbCxcbiAgICAgIDY6IG51bGwsXG4gICAgICA3OiBudWxsLFxuICAgICAgODogbnVsbCxcbiAgICAgIDk6IG51bGwsXG4gICAgICAxMDogbnVsbCxcbiAgICAgIDExOiBudWxsLFxuICAgICAgMTI6IG51bGwsXG4gICAgICAzNjogbnVsbFxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NvbW1vbkRvbWFpbnMgPSB7XG4gICAgICBBbnl0aGluZzogbnVsbCxcbiAgICAgIE5vdGhpbmc6IG51bGwsXG4gICAgICBCb29sZWFuOiBudWxsLFxuICAgICAgTWF5YmVCb29sZWFuOiBudWxsLFxuICAgICAgU3RyaW5nOiBudWxsLFxuICAgICAgRG9tYWluOiBudWxsLFxuICAgICAgU3ltYm9sOiBudWxsLFxuICAgICAgSW50ZWdlcjogbnVsbCxcbiAgICAgIFJhdGlvbmFsTnVtYmVyOiBudWxsLFxuICAgICAgQWxnZWJyYWljTnVtYmVyOiBudWxsLFxuICAgICAgUmVhbE51bWJlcjogbnVsbCxcbiAgICAgIEV4dGVuZGVkUmVhbE51bWJlcjogbnVsbCxcbiAgICAgIEltYWdpbmFyeU51bWJlcjogbnVsbCxcbiAgICAgIENvbXBsZXhOdW1iZXI6IG51bGwsXG4gICAgICBFeHRlbmRlZENvbXBsZXhOdW1iZXI6IG51bGwsXG4gICAgICBOdW1iZXI6IG51bGwsXG4gICAgICBQb3NpdGl2ZUludGVnZXI6IG51bGwsXG4gICAgICBUcmFuc2NlbmRlbnRhbE51bWJlcjogbnVsbCxcbiAgICAgIFBvc2l0aXZlTnVtYmVyOiBudWxsLFxuICAgICAgRnVuY3Rpb246IG51bGwsXG4gICAgICAvLyAoQW55dGhpbmdebikgLT4gQW55dGhpbmdcbiAgICAgIE51bWVyaWNGdW5jdGlvbjogbnVsbCxcbiAgICAgIC8vIChOdW1iZXJebikgLT4gTnVtYmVyXG4gICAgICBSZWFsRnVuY3Rpb246IG51bGwsXG4gICAgICAvLyAoRXh0ZW5kZWRSZWFsTnVtYmVyXm4pIC0+IEV4dGVuZFJlYWxOdW1iZXJcbiAgICAgIFRyaWdvbm9tZXRyaWNGdW5jdGlvbjogbnVsbCxcbiAgICAgIC8vIChDb21wbGV4TnVtYmVyKSAtPiBDb21wbGV4TnVtYmVyXG4gICAgICBMb2dpY09wZXJhdG9yOiBudWxsLFxuICAgICAgLy8gKEJvb2xlYW4sIEJvb2xlYW4pIC0+IEJvb2xlYW5cbiAgICAgIFByZWRpY2F0ZTogbnVsbCxcbiAgICAgIC8vIChBbnl0aGluZ15uKSAtPiBNYXliZUJvb2xlYW5cbiAgICAgIFJlbGF0aW9uYWxPcGVyYXRvcjogbnVsbFxuICAgICAgLy8gKEFueXRoaW5nLCBBbnl0aGluZykgLT4gTWF5YmVCb29sZWFuXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucyAhPT0gdm9pZCAwICYmIHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiKVxuICAgICAgdGhyb3cgRXJyb3IoXCJVbmV4cGVjdGVkIGFyZ3VtZW50XCIpO1xuICAgIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXRleERpY3Rpb25hcnkgPSBvcHRpb25zPy5sYXRleERpY3Rpb25hcnk7XG4gICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zID0ge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBzaG9ydGhhbmRzOiBbXCJmdW5jdGlvblwiLCBcInN5bWJvbFwiLCBcInN0cmluZ1wiLCBcImRpY3Rpb25hcnlcIiwgXCJudW1iZXJcIl0sXG4gICAgICBtZXRhZGF0YTogW10sXG4gICAgICBwcmVjaXNpb246IFwibWF4XCIsXG4gICAgICByZXBlYXRpbmdEZWNpbWFsczogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fcmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0ge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBzaG9ydGhhbmRzOiBbXCJmdW5jdGlvblwiLCBcInN5bWJvbFwiLCBcInN0cmluZ1wiLCBcImRpY3Rpb25hcnlcIiwgXCJudW1iZXJcIl0sXG4gICAgICBtZXRhZGF0YTogW10sXG4gICAgICBwcmVjaXNpb246IFwibWF4XCIsXG4gICAgICByZXBlYXRpbmdEZWNpbWFsczogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuX3N0YXRzID0ge1xuICAgICAgaGlnaHdhdGVyTWFyazogMCxcbiAgICAgIHN5bWJvbHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgICBleHByZXNzaW9uczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxuICAgIH07XG4gICAgdGhpcy5fZGVmYXVsdERvbWFpbiA9IG51bGw7XG4gICAgdGhpcy5fbnVtZXJpY01vZGUgPSBvcHRpb25zPy5udW1lcmljTW9kZSA/PyBcImF1dG9cIjtcbiAgICB0aGlzLl9wcmVjaXNpb24gPSBNYXRoLm1heChcbiAgICAgIG9wdGlvbnM/Lm51bWVyaWNQcmVjaXNpb24gPz8gMTAwLFxuICAgICAgTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTilcbiAgICApO1xuICAgIHRoaXMuX2JpZ251bSA9IERlY2ltYWwuY2xvbmUoeyBwcmVjaXNpb246IHRoaXMuX3ByZWNpc2lvbiB9KTtcbiAgICB0aGlzLnRvbGVyYW5jZSA9IG9wdGlvbnM/LnRvbGVyYW5jZSA/PyBOVU1FUklDX1RPTEVSQU5DRTtcbiAgICB0aGlzLl9aRVJPID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIDApO1xuICAgIHRoaXMuX09ORSA9IG5ldyBCb3hlZE51bWJlcih0aGlzLCAxKTtcbiAgICB0aGlzLl9IQUxGID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIFsxLCAyXSk7XG4gICAgdGhpcy5fTkVHQVRJVkVfT05FID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIC0xKTtcbiAgICB0aGlzLl9JID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleC5JKTtcbiAgICB0aGlzLl9OQU4gPSBuZXcgQm94ZWROdW1iZXIodGhpcywgTnVtYmVyLk5hTik7XG4gICAgdGhpcy5fUE9TSVRJVkVfSU5GSU5JVFkgPSBuZXcgQm94ZWROdW1iZXIodGhpcywgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB0aGlzLl9ORUdBVElWRV9JTkZJTklUWSA9IG5ldyBCb3hlZE51bWJlcih0aGlzLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgIHRoaXMuX0NPTVBMRVhfSU5GSU5JVFkgPSBuZXcgQm94ZWROdW1iZXIodGhpcywgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4LklORklOSVRZKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgYXNzdW1wdGlvbnM6IG5ldyBFeHByZXNzaW9uTWFwKCksXG4gICAgICB0aW1lTGltaXQ6IDIsXG4gICAgICAvLyBleGVjdXRpb24gdGltZSBsaW1pdDogMi4wIHNlY29uZHNcbiAgICAgIG1lbW9yeUxpbWl0OiAxLFxuICAgICAgLy8gbWVtb3J5IGxpbWl0OiAxLjAgbWVnYWJ5dGVcbiAgICAgIHJlY3Vyc2lvbkxpbWl0OiAxMDI0LFxuICAgICAgaXRlcmF0aW9uTGltaXQ6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgIH07XG4gICAgY29uc3QgdGFibGVzID0gb3B0aW9ucz8uaWRzID8/IF9Db21wdXRlRW5naW5lLmdldFN0YW5kYXJkTGlicmFyeSgpO1xuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKVxuICAgICAgc2V0Q3VycmVudENvbnRleHRTeW1ib2xUYWJsZSh0aGlzLCB0YWJsZSk7XG4gICAgZm9yIChjb25zdCBkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NvbW1vbkRvbWFpbnMpKSB7XG4gICAgICBpZiAodGhpcy5fY29tbW9uRG9tYWluc1tkXSAmJiAhdGhpcy5fY29tbW9uRG9tYWluc1tkXS5zeW1ib2xEZWZpbml0aW9uKVxuICAgICAgICB0aGlzLl9jb21tb25Eb21haW5zW2RdLmJpbmQodGhpcy5jb250ZXh0KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fY29tbW9uRG9tYWluc1tkXSA9IGJveERvbWFpbih0aGlzLCBkKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzeW0gb2YgT2JqZWN0LmtleXModGhpcy5fY29tbW9uU3ltYm9scykpIHtcbiAgICAgIHRoaXMuX2NvbW1vblN5bWJvbHNbc3ltXSA9IG5ldyBCb3hlZFN5bWJvbCh0aGlzLCBzeW0sIHtcbiAgICAgICAgY2Fub25pY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2NvbW1vblN5bWJvbHNbc3ltXS5iaW5kKHRoaXMuY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5kZWZhdWx0RG9tYWluKSB7XG4gICAgICBjb25zdCBkZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4ob3B0aW9ucy5kZWZhdWx0RG9tYWluKTtcbiAgICAgIGlmIChkZWZhdWx0RG9tYWluLmlzVmFsaWQpXG4gICAgICAgIHRoaXMuX2RlZmF1bHREb21haW4gPSBkZWZhdWx0RG9tYWluO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oXCJFeHRlbmRlZFJlYWxOdW1iZXJcIik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oXCJFeHRlbmRlZFJlYWxOdW1iZXJcIik7XG4gICAgdGhpcy5wdXNoU2NvcGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGlkZW50aWZpZXIgdGFibGVzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNhdGVnb3JpZXMsIG9yIGBcImFsbFwiYFxuICAgKiBmb3IgYWxsIGNhdGVnb3JpZXMgKGBcImFyaXRobWV0aWNcImAsIGBcImFsZ2VicmFcImAsIGV0Yy4uLikuXG4gICAqXG4gICAqIEFuIGlkZW50aWZpZXIgdGFibGUgZGVmaW5lcyBob3cgdGhlIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIG5hbWVzIGluIGFcbiAgICogTWF0aEpTT04gZXhwcmVzc2lvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQsIGkuZS4gaG93IHRvIGV2YWx1YXRlIGFuZFxuICAgKiBtYW5pcHVsYXRlIHRoZW0uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZ2V0U3RhbmRhcmRMaWJyYXJ5KGNhdGVnb3JpZXMgPSBcImFsbFwiKSB7XG4gICAgcmV0dXJuIGdldFN0YW5kYXJkTGlicmFyeShjYXRlZ29yaWVzKTtcbiAgfVxuICBnZXQgbGF0ZXhEaWN0aW9uYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGV4U3ludGF4LmRpY3Rpb25hcnk7XG4gIH1cbiAgc2V0IGxhdGV4RGljdGlvbmFyeShkaWMpIHtcbiAgICB0aGlzLmxhdGV4U3ludGF4LmRpY3Rpb25hcnkgPSBkaWM7XG4gIH1cbiAgLyoqIEFmdGVyIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBlbmdpbmUgaGFzIGNoYW5nZWQsIGNsZWFyIHRoZSBjYWNoZXNcbiAgICogc28gdGhhdCBuZXcgdmFsdWVzIGNhbiBiZSByZWNhbGN1bGF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGZvciBleGFtcGxlIHdoZW4gdGhlIG51bWVyaWMgcHJlY2lzaW9uIGNoYW5nZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2JpZ251bSk7XG4gICAgdGhpcy5fQklHTlVNX05FR0FUSVZFX09ORSA9IHRoaXMuYmlnbnVtKC0xKTtcbiAgICB0aGlzLl9CSUdOVU1fTkFOID0gdGhpcy5iaWdudW0oTmFOKTtcbiAgICB0aGlzLl9CSUdOVU1fWkVSTyA9IHRoaXMuYmlnbnVtKDApO1xuICAgIHRoaXMuX0JJR05VTV9PTkUgPSB0aGlzLmJpZ251bSgxKTtcbiAgICB0aGlzLl9CSUdOVU1fVFdPID0gdGhpcy5iaWdudW0oMik7XG4gICAgdGhpcy5fQklHTlVNX0hBTEYgPSB0aGlzLl9CSUdOVU1fT05FLmRpdih0aGlzLl9CSUdOVU1fVFdPKTtcbiAgICB0aGlzLl9CSUdOVU1fUEkgPSB0aGlzLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKTtcbiAgICBjb25zdCBzeW1ib2xzID0gdGhpcy5fc3RhdHMuc3ltYm9scy52YWx1ZXMoKTtcbiAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMuX3N0YXRzLmV4cHJlc3Npb25zLnZhbHVlcygpO1xuICAgIHRoaXMuX3N0YXRzLnN5bWJvbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRoaXMuX3N0YXRzLmV4cHJlc3Npb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3ltYm9scylcbiAgICAgIHMudW5iaW5kKCk7XG4gICAgZm9yIChjb25zdCBzIG9mIGV4cHJlc3Npb25zKVxuICAgICAgcy51bmJpbmQoKTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9jb21tb25Eb21haW5zKSlcbiAgICAgIGQ/LnVuYmluZCgpO1xuICAgIGZvciAoY29uc3QgZCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbW1vblN5bWJvbHMpKVxuICAgICAgZD8udW5iaW5kKCk7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLmlkVGFibGUpXG4gICAgICAgIGZvciAoY29uc3QgW19rLCB2XSBvZiBzY29wZS5pZFRhYmxlKVxuICAgICAgICAgIHYucmVzZXQoKTtcbiAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGUgPz8gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NhY2hlKSlcbiAgICAgIGlmICh0aGlzLl9jYWNoZVtrXS52YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlW2tdLnB1cmdlKVxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtrXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX2NhY2hlW2tdLnZhbHVlID0gdGhpcy5fY2FjaGVba10ucHVyZ2UodGhpcy5fY2FjaGVba10udmFsdWUpO1xuICAgICAgfVxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlZ2lzdGVyKF9leHByKSB7XG4gICAgdGhpcy5fc3RhdHMuaGlnaHdhdGVyTWFyayArPSAxO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VucmVnaXN0ZXIoX2V4cHIpIHtcbiAgfVxuICBnZXQgc3RhdHMoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLl9zdGF0cy5leHByZXNzaW9ucztcbiAgICB0aGlzLl9zdGF0cy5leHByZXNzaW9ucyA9IG51bGw7XG4gICAgdGhpcy5fc3RhdHMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5fc3RhdHNcbiAgICAgIC8vIF9kdXBlU3ltYm9sczogdG9wRHVwZXMsXG4gICAgICAvLyBfcG9wdWxhckV4cHJlc3Npb25zOiB0b3AxMCxcbiAgICB9O1xuICB9XG4gIC8qKiBUaGUgcHJlY2lzaW9uLCBvciBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzLCBvZiBudW1lcmljXG4gICAqIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBudW1lcmljIG1vZGUgaXMgYFwiYXV0b1wiYCBvciBgXCJiaWdudW1cImAuXG4gICAqXG4gICAqIFRvIG1ha2UgY2FsY3VsYXRpb25zIHVzaW5nIG1vcmUgZGlnaXRzLCBhdCB0aGUgY29zdCBvZiBleHBhbmRlZCBtZW1vcnlcbiAgICogdXNhZ2UgYW5kIHNsb3dlciBjb21wdXRhdGlvbnMsIHNldCB0aGUgYHByZWNpc2lvbmAgaGlnaGVyLlxuICAgKlxuICAgKiBJZiB0aGUgbnVtZXJpYyBtb2RlIGlzIG5vdCBgXCJhdXRvXCJgIG9yIGBcImJpZ251bVwiYCwgaXQgaXMgc2V0IHRvIGBcImF1dG9cImAuXG4gICAqXG4gICAqIFRyaWdvbm9tZXRyaWMgb3BlcmF0aW9ucyBhcmUgYWNjdXJhdGUgZm9yIHByZWNpc2lvbiB1cCB0byAxLDAwMC5cbiAgICpcbiAgICovXG4gIGdldCBwcmVjaXNpb24oKSB7XG4gICAgaWYgKHRoaXMuX251bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIiB8fCB0aGlzLl9udW1lcmljTW9kZSA9PT0gXCJjb21wbGV4XCIpXG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWNpc2lvbjtcbiAgfVxuICBzZXQgcHJlY2lzaW9uKHApIHtcbiAgICBpZiAocCA9PT0gXCJtYWNoaW5lXCIpXG4gICAgICBwID0gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgY29uc3QgY3VycmVudFByZWNpc2lvbiA9IHRoaXMuX3ByZWNpc2lvbjtcbiAgICBpZiAocCA9PT0gY3VycmVudFByZWNpc2lvbilcbiAgICAgIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHAgIT09IFwibnVtYmVyXCIgfHwgcCA8PSAwKVxuICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIFwibWFjaGluZVwiIG9yIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgdGhpcy5fbGF0ZXhTeW50YXg/LnVwZGF0ZU9wdGlvbnMoe1xuICAgICAgcHJlY2lzaW9uOiBwLFxuICAgICAgYXZvaWRFeHBvbmVudHNJblJhbmdlOiBbLTYsIHBdXG4gICAgfSk7XG4gICAgdGhpcy5fcHJlY2lzaW9uID0gTWF0aC5tYXgocCwgTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTikpO1xuICAgIGlmICh0aGlzLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5wcmVjaXNpb24gPiB0aGlzLl9wcmVjaXNpb24pXG4gICAgICB0aGlzLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucyA9IHsgcHJlY2lzaW9uOiB0aGlzLl9wcmVjaXNpb24gfTtcbiAgICBpZiAodGhpcy5fbnVtZXJpY01vZGUgIT09IFwiYXV0b1wiICYmIHRoaXMuX251bWVyaWNNb2RlICE9PSBcImJpZ251bVwiICYmIHRoaXMuX3ByZWNpc2lvbiA+IE1hdGguZmxvb3IoTUFDSElORV9QUkVDSVNJT04pKVxuICAgICAgdGhpcy5fbnVtZXJpY01vZGUgPSBcImF1dG9cIjtcbiAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uY29uZmlnKHsgcHJlY2lzaW9uOiB0aGlzLl9wcmVjaXNpb24gfSk7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG4gIGdldCBudW1lcmljTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtZXJpY01vZGU7XG4gIH1cbiAgc2V0IG51bWVyaWNNb2RlKGYpIHtcbiAgICBpZiAoZiA9PT0gdGhpcy5fbnVtZXJpY01vZGUpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBmICE9PSBcInN0cmluZ1wiKVxuICAgICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBhIHN0cmluZ1wiKTtcbiAgICB0aGlzLl9udW1lcmljTW9kZSA9IGY7XG4gICAgaWYgKGYgPT09IFwiY29tcGxleFwiIHx8IGYgPT09IFwibWFjaGluZVwiKVxuICAgICAgdGhpcy5fcHJlY2lzaW9uID0gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgaWYgKHRoaXMuX2xhdGV4U3ludGF4ICYmIHRoaXMubGF0ZXhTeW50YXgub3B0aW9ucy5wcmVjaXNpb24gPiB0aGlzLl9wcmVjaXNpb24pXG4gICAgICB0aGlzLmxhdGV4U3ludGF4LnVwZGF0ZU9wdGlvbnMoeyBwcmVjaXNpb246IHRoaXMuX3ByZWNpc2lvbiB9KTtcbiAgICBpZiAodGhpcy5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucHJlY2lzaW9uID4gdGhpcy5fcHJlY2lzaW9uKVxuICAgICAgdGhpcy5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMgPSB7IHByZWNpc2lvbjogdGhpcy5fcHJlY2lzaW9uIH07XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG4gIC8qKiBAZXhwZXJpbWVudGFsICovXG4gIGdldCB0aW1lTGltaXQoKSB7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLnRpbWVMaW1pdCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gc2NvcGUudGltZUxpbWl0O1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gMjtcbiAgfVxuICAvKiogQGV4cGVyaW1lbnRhbCAqL1xuICBnZXQgaXRlcmF0aW9uTGltaXQoKSB7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLml0ZXJhdGlvbkxpbWl0ICE9PSB2b2lkIDApXG4gICAgICAgIHJldHVybiBzY29wZS5pdGVyYXRpb25MaW1pdDtcbiAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIDEwMjQ7XG4gIH1cbiAgLyoqIEBleHBlcmltZW50YWwgKi9cbiAgZ2V0IHJlY3Vyc2lvbkxpbWl0KCkge1xuICAgIGxldCBzY29wZSA9IHRoaXMuY29udGV4dDtcbiAgICB3aGlsZSAoc2NvcGUpIHtcbiAgICAgIGlmIChzY29wZS5yZWN1cnNpb25MaW1pdCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gc2NvcGUucmVjdXJzaW9uTGltaXQ7XG4gICAgICBzY29wZSA9IHNjb3BlLnBhcmVudFNjb3BlID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiAxMDI0O1xuICB9XG4gIC8qKlxuICAgKiBJZiBhbiB1bmtub3duIHN5bWJvbCBpcyBlbmNvdW50ZXJlZCwgYXNzdW1lIGl0IHNob3VsZFxuICAgKiBiZSBhIHZhcmlhYmxlIGluIHRoaXMgZG9tYWluLlxuICAgKlxuICAgKiBJZiBzZXQgdG8gYG51bGxgLCB1bmtub3duIHN5bWJvbHMgd2lsbCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6KiogYFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCJgXG4gICAqL1xuICBnZXQgZGVmYXVsdERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdERvbWFpbjtcbiAgfVxuICBzZXQgZGVmYXVsdERvbWFpbihkb21haW4pIHtcbiAgICBpZiAoZG9tYWluID09PSBudWxsKVxuICAgICAgdGhpcy5fZGVmYXVsdERvbWFpbiA9IG51bGw7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICghZGVmYXVsdERvbWFpbi5pc1ZhbGlkKVxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkb21haW4gJHtkb21haW59YCk7XG4gICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gZGVmYXVsdERvbWFpbjtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFZhbHVlcyBzbWFsbGVyIHRoYW4gdGhlIHRvbGVyYW5jZSBhcmUgY29uc2lkZXJlZCB0byBiZSB6ZXJvIGZvciB0aGVcbiAgICogcHVycG9zZSBvZiBjb21wYXJpc29uLCBpLmUuIGlmIGB8YiAtIGF8IDw9IHRvbGVyYW5jZWAsIGBiYCBpcyBjb25zaWRlcmVkXG4gICAqIGVxdWFsIHRvIGBhYC5cbiAgICovXG4gIGdldCB0b2xlcmFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvbGVyYW5jZTtcbiAgfVxuICBzZXQgdG9sZXJhbmNlKHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWwpKVxuICAgICAgdGhpcy5fdG9sZXJhbmNlID0gTWF0aC5tYXgodmFsLCAwKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl90b2xlcmFuY2UgPSBOVU1FUklDX1RPTEVSQU5DRTtcbiAgICB0aGlzLl9iaWdudW1Ub2xlcmFuY2UgPSB0aGlzLmJpZ251bSh0aGlzLl90b2xlcmFuY2UpO1xuICB9XG4gIGNob3Aobikge1xuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiBNYXRoLmFicyhuKSA8PSB0aGlzLl90b2xlcmFuY2UpXG4gICAgICByZXR1cm4gMDtcbiAgICBpZiAobiBpbnN0YW5jZW9mIERlY2ltYWwgJiYgbi5hYnMoKS5sdGUodGhpcy5fYmlnbnVtVG9sZXJhbmNlKSlcbiAgICAgIHJldHVybiAwO1xuICAgIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4ICYmIE1hdGguYWJzKG4ucmUpIDw9IHRoaXMuX3RvbGVyYW5jZSAmJiBNYXRoLmFicyhuLmltKSA8PSB0aGlzLl90b2xlcmFuY2UpXG4gICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gbjtcbiAgfVxuICBiaWdudW0oYSkge1xuICAgIGlmICh0eXBlb2YgYSA9PT0gXCJiaWdpbnRcIilcbiAgICAgIHJldHVybiBuZXcgdGhpcy5fYmlnbnVtKGEudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLl9iaWdudW0oYSk7XG4gIH1cbiAgY29tcGxleChhLCBiKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgYSA9IGEudG9OdW1iZXIoKTtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICBiID0gYi50b051bWJlcigpO1xuICAgIHJldHVybiBuZXcgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4KGEsIGIpO1xuICB9XG4gIGlzQmlnbnVtKGEpIHtcbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIERlY2ltYWw7XG4gIH1cbiAgaXNDb21wbGV4KGEpIHtcbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleDtcbiAgfVxuICBnZXQgbGF0ZXhTeW50YXgoKSB7XG4gICAgaWYgKCF0aGlzLl9sYXRleFN5bnRheClcbiAgICAgIHRoaXMuX2xhdGV4U3ludGF4ID0gbmV3IExhdGV4U3ludGF4KHtcbiAgICAgICAgY29tcHV0ZUVuZ2luZTogdGhpcyxcbiAgICAgICAgZGljdGlvbmFyeTogdGhpcy5fbGF0ZXhEaWN0aW9uYXJ5LFxuICAgICAgICBwcmVjaXNpb246IHRoaXMucHJlY2lzaW9uLFxuICAgICAgICBhdm9pZEV4cG9uZW50c0luUmFuZ2U6IFstNiwgdGhpcy5wcmVjaXNpb25dLFxuICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KGVyclswXS5tZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9sYXRleFN5bnRheDtcbiAgfVxuICBzdGF0aWMgZ2V0TGF0ZXhEaWN0aW9uYXJ5KGRvbWFpbiA9IFwiYWxsXCIpIHtcbiAgICByZXR1cm4gTGF0ZXhTeW50YXguZ2V0RGljdGlvbmFyeShkb21haW4pO1xuICB9XG4gIHNldCBjb3N0RnVuY3Rpb24oZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzLl9jb3N0ID0gREVGQVVMVF9DT1NUX0ZVTkNUSU9OO1xuICAgIHRoaXMuX2Nvc3QgPSBmbjtcbiAgfVxuICBnZXQgY29zdEZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jb3N0ID8/IERFRkFVTFRfQ09TVF9GVU5DVElPTjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGEgbWF0Y2hpbmcgc3ltYm9sIGRlZmluaXRpb24sIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnRcbiAgICogc2NvcGUgYW5kIGdvaW5nIHVwIHRoZSBzY29wZSBjaGFpbi4gUHJpb3JpdGl6ZSBmaW5kaW5nIGEgbWF0Y2ggYnlcbiAgICogd2lraWRhdGEsIGlmIHByb3ZpZGVkLlxuICAgKi9cbiAgbG9va3VwU3ltYm9sKHN5bWJvbDIsIHdpa2lkYXRhLCBzY29wZSkge1xuICAgIGlmICghdGhpcy5zdHJpY3QpIHtcbiAgICAgIHNjb3BlID8/IChzY29wZSA9IHRoaXMuY29udGV4dCA/PyB2b2lkIDApO1xuICAgICAgd2hpbGUgKHNjb3BlKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IHNjb3BlLmlkVGFibGU/LmdldChzeW1ib2wyKTtcbiAgICAgICAgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICAgIHJldHVybiBkZWY7XG4gICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN5bWJvbDIgIT09IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgc3RyaW5nXCIpO1xuICAgIGlmIChzeW1ib2wyLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5jb250ZXh0KVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBjb25zdCByb290U2NvcGUgPSBzY29wZSA/PyB0aGlzLmNvbnRleHQ7XG4gICAgaWYgKHdpa2lkYXRhKSB7XG4gICAgICBzY29wZSA9IHJvb3RTY29wZTtcbiAgICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgICBpZiAoc2NvcGUuaWRUYWJsZSlcbiAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBkXSBvZiBzY29wZS5pZFRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGQpICYmIGQud2lraWRhdGEgPT09IHdpa2lkYXRhKVxuICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICB9XG4gICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNjb3BlID0gcm9vdFNjb3BlO1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgY29uc3QgZGVmID0gc2NvcGUuaWRUYWJsZT8uZ2V0KHN5bWJvbDIpO1xuICAgICAgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICByZXR1cm4gZGVmO1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uIG1hdGNoaW5nIHRoaXMgaGVhZC5cbiAgICpcbiAgICogU3RhcnQgbG9va2luZyBpbiB0aGUgY3VycmVudCBjb250ZXh0LCB0aGFuIHVwIHRoZSBzY29wZSBjaGFpbi5cbiAgICpcbiAgICogVGhpcyBpcyBhIHZlcnkgcm91Z2ggbG9va3VwLCBzaW5jZSBpdCBkb2Vzbid0IGFjY291bnQgZm9yIHRoZSBkb21haW5cbiAgICogb2YgdGhlIGFyZ3VtZW50IG9yIHRoZSBjb2RvbWFpbi4gSG93ZXZlciwgaXQgaXMgdXNlZnVsIGR1cmluZyBwYXJzaW5nXG4gICAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzeW1ib2xzIHRoYXQgbWlnaHQgcmVwcmVzZW50IGEgZnVuY3Rpb24gYXBwbGljYXRpb24sIGUuZy4gYGZgIHZzIGB4YC5cbiAgICovXG4gIGxvb2t1cEZ1bmN0aW9uKGhlYWQyLCBzY29wZSkge1xuICAgIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICghdGhpcy5jb250ZXh0KVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBzY29wZSA/PyAoc2NvcGUgPSB0aGlzLmNvbnRleHQpO1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgY29uc3QgZGVmID0gc2NvcGUuaWRUYWJsZT8uZ2V0KGhlYWQyKTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICByZXR1cm4gZGVmO1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvKipcbiAgICogQWRkIChvciByZXBsYWNlKSBhIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICAgKi9cbiAgZGVmaW5lU3ltYm9sKG5hbWUsIGRlZikge1xuICAgIGlmICghdGhpcy5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJTeW1ib2wgY2Fubm90IGJlIGRlZmluZWQ6IG5vIHNjb3BlIGF2YWlsYWJsZVwiKTtcbiAgICBpZiAobmFtZS5sZW5ndGggPT09IDAgfHwgIWlzVmFsaWRJZGVudGlmaWVyKG5hbWUpKVxuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciBcIiR7bmFtZX1cIjogJHt2YWxpZGF0ZUlkZW50aWZpZXIobmFtZSl9fWApO1xuICAgIGlmICghdGhpcy5jb250ZXh0LmlkVGFibGUpXG4gICAgICB0aGlzLmNvbnRleHQuaWRUYWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3QgYm94ZWREZWYgPSBuZXcgQm94ZWRTeW1ib2xEZWZpbml0aW9uSW1wbCh0aGlzLCBuYW1lLCBkZWYpO1xuICAgIGlmIChib3hlZERlZi5uYW1lKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUuc2V0KGJveGVkRGVmLm5hbWUsIGJveGVkRGVmKTtcbiAgICByZXR1cm4gYm94ZWREZWY7XG4gIH1cbiAgZGVmaW5lRnVuY3Rpb24obmFtZSwgZGVmKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpXG4gICAgICB0aHJvdyBFcnJvcihcIkZ1bmN0aW9uIGNhbm5vdCBiZSBkZWZpbmVkOiBubyBzY29wZSBhdmFpbGFibGVcIik7XG4gICAgaWYgKG5hbWUubGVuZ3RoID09PSAwIHx8ICFpc1ZhbGlkSWRlbnRpZmllcihuYW1lKSlcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGlkZW50aWZpZXIgXCIke25hbWV9XCI6ICR7dmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpfX1gKTtcbiAgICBpZiAoIXRoaXMuY29udGV4dC5pZFRhYmxlKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGJveGVkRGVmID0gbWFrZUZ1bmN0aW9uRGVmaW5pdGlvbih0aGlzLCBuYW1lLCBkZWYpO1xuICAgIGlmIChib3hlZERlZi5uYW1lKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUuc2V0KG5hbWUsIGJveGVkRGVmKTtcbiAgICByZXR1cm4gYm94ZWREZWY7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIENyZWF0ZSBhIG5ldyBzY29wZSBhbmQgYWRkIGl0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIHN0YWNrXG4gICAqXG4gICAqIFRoZSBgb3B0aW9ucy5zY29wZWAgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjdXN0b20gcHJlY2lzaW9uLFxuICAgKiBldGMuLi4gZm9yIHRoaXMgc2NvcGVcbiAgICpcbiAgICovXG4gIHB1c2hTY29wZShpZHMsIHNjb3BlKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dCA9PT0gbnVsbClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gcGFyZW50IHNjb3BlIGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLmNvbnRleHQgPSB7XG4gICAgICB0aW1lTGltaXQ6IHRoaXMuY29udGV4dC50aW1lTGltaXQsXG4gICAgICBtZW1vcnlMaW1pdDogdGhpcy5jb250ZXh0Lm1lbW9yeUxpbWl0LFxuICAgICAgcmVjdXJzaW9uTGltaXQ6IHRoaXMuY29udGV4dC5yZWN1cnNpb25MaW1pdCxcbiAgICAgIGl0ZXJhdGlvbkxpbWl0OiB0aGlzLmNvbnRleHQuaXRlcmF0aW9uTGltaXQsXG4gICAgICAuLi5zY29wZSA/PyB7fSxcbiAgICAgIHBhcmVudFNjb3BlOiB0aGlzLmNvbnRleHQsXG4gICAgICAvLyBXZSBhbHdheXMgY29weSB0aGUgY3VycmVudCBhc3N1bXB0aW9ucyBpbiB0aGUgbmV3IHNjb3BlLlxuICAgICAgLy8gVGhpcyBtYWtlIGlzIG11Y2ggZWFzaWVyIHRvIGRlYWwgd2l0aCAnaW5oZXJpdGVkJyBhc3N1bXB0aW9uc1xuICAgICAgLy8gKGFuZCBwb3RlbnRpYWxseSBtb2RpZnlpbmcgdGhlbSBsYXRlcikgd2l0aG91dCBoYXZpbmcgdG8gd2FsayBiYWNrXG4gICAgICAvLyBpbnRvIHBhcmVudCBjb250ZXh0cy4gSW4gb3RoZXIgd29yZHMsIGNhbGxpbmcgYGNlLmZvcmdldCgpYCB3aWxsXG4gICAgICAvLyBmb3JnZXQgZXZlcnl0aGluZyAqKmluIHRoZSBjdXJyZW50IHNjb3BlKiouIFdoZW4gZXhpdGluZyB0aGUgc2NvcGUsXG4gICAgICAvLyB0aGUgcHJldmlvdXMgYXNzdW1wdGlvbnMgYXJlIHJlc3RvcmVkLlxuICAgICAgYXNzdW1wdGlvbnM6IG5ldyBFeHByZXNzaW9uTWFwKHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucylcbiAgICB9O1xuICAgIGlmIChpZHMpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkcykpXG4gICAgICAgIGZvciAoY29uc3QgdGFibGUgb2YgaWRzKVxuICAgICAgICAgIHNldEN1cnJlbnRDb250ZXh0U3ltYm9sVGFibGUodGhpcywgdGFibGUpO1xuICAgICAgZWxzZVxuICAgICAgICBzZXRDdXJyZW50Q29udGV4dFN5bWJvbFRhYmxlKHRoaXMsIGlkcyk7XG4gICAgfVxuICB9XG4gIC8qKiBSZW1vdmUgdGhlIHRvcG1vc3Qgc2NvcGUgZnJvbSB0aGUgc2NvcGUgc3RhY2suXG4gICAqL1xuICBwb3BTY29wZSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGNvbnN0IHBhcmVudFNjb3BlID0gdGhpcy5jb250ZXh0Py5wYXJlbnRTY29wZTtcbiAgICB0aGlzLmNvbnRleHQgPSBwYXJlbnRTY29wZSA/PyBudWxsO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLmNvbnRleHQgIT09IG51bGwpO1xuICB9XG4gIHNldChpZGVudGlmaWVycykge1xuICAgIGlmICghdGhpcy5zdHJpY3QpIHtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhpZGVudGlmaWVycykpIHtcbiAgICAgICAgaWYgKGsgIT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgZGVmID0gdGhpcy5sb29rdXBTeW1ib2woayk7XG4gICAgICAgICAgY29uc3QgaWRrID0gaWRlbnRpZmllcnNba107XG4gICAgICAgICAgaWYgKGRlZilcbiAgICAgICAgICAgIGRlZi52YWx1ZSA9IGlkayA/PyB2b2lkIDA7XG4gICAgICAgICAgZWxzZSBpZiAoaWRrICE9PSB2b2lkIDAgJiYgaWRrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmJveChpZGspO1xuICAgICAgICAgICAgaWYgKHZhbC5kb21haW4uaXNOdW1lcmljKVxuICAgICAgICAgICAgICB0aGlzLmRlZmluZVN5bWJvbChrLCB7IHZhbHVlOiB2YWwsIGRvbWFpbjogXCJOdW1iZXJcIiB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgeyB2YWx1ZTogdmFsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoaWRlbnRpZmllcnMpKSB7XG4gICAgICBpZiAoayAhPT0gXCJOb3RoaW5nXCIpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5sb29rdXBTeW1ib2woayk7XG4gICAgICAgIGNvbnN0IGlkayA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICBpZiAoaWRrID09PSB2b2lkIDAgfHwgaWRrID09PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGRlZilcbiAgICAgICAgICAgIGRlZi52YWx1ZSA9IHZvaWQgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmJveChpZGspO1xuICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgIGlmIChkZWYuZG9tYWluICYmICF2YWwuZG9tYWluLmlzQ29tcGF0aWJsZShkZWYuZG9tYWluKSlcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIHZhbHVlIHdpdGggZG9tYWluICR7ZGVmLmRvbWFpbi50b1N0cmluZygpfSBmb3IgXCIke2t9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWwuZG9tYWluLmlzTnVtZXJpYylcbiAgICAgICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgeyB2YWx1ZTogdmFsLCBkb21haW46IFwiTnVtYmVyXCIgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIHRoaXMuZGVmaW5lU3ltYm9sKGssIHsgdmFsdWU6IHZhbCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0KGlkZW50aWZpZXJzKSB7XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGlkZW50aWZpZXJzKSkge1xuICAgICAgaWYgKGsgIT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGRlZikpXG4gICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgZGVmKTtcbiAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbkRlZmluaXRpb24oZGVmKSlcbiAgICAgICAgICB0aGlzLmRlZmluZUZ1bmN0aW9uKGssIGRlZik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLnNldCh7IFtrXTogaWRlbnRpZmllcnNba10gfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBhc3N1bXB0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGlmICh0aGlzLmNvbnRleHQuYXNzdW1wdGlvbnMpXG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmFzc3VtcHRpb25zO1xuICAgIHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucyA9IG5ldyBFeHByZXNzaW9uTWFwKCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucztcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBleGVjdXRpb24gc2hvdWxkIHN0b3AuXG4gICAqXG4gICAqIFRoaXMgY2FuIG9jY3VyIGlmOlxuICAgKiAtIGFuIGVycm9yIGhhcyBiZWVuIHNpZ25hbGVkXG4gICAqIC0gdGhlIHRpbWUgbGltaXQgb3IgbWVtb3J5IGxpbWl0IGhhcyBiZWVuIGV4Y2VlZGVkXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2hvdWxkQ29udGludWVFeGVjdXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVhZGxpbmUgPT09IHZvaWQgMCB8fCB0aGlzLmRlYWRsaW5lID49IERhdGUubm93KCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjaGVja0NvbnRpbnVlRXhlY3V0aW9uKCkge1xuICAgIGlmICghdGhpcy5zaG91bGRDb250aW51ZUV4ZWN1dGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aW1lb3V0XCIpO1xuICAgIH1cbiAgfVxuICAvLyBhc3NlcnQoXG4gIC8vICAgY29uZGl0aW9uOiBib29sZWFuLFxuICAvLyAgIGV4cHI6IEJveGVkRXhwcmVzc2lvbixcbiAgLy8gICBtc2c6IHN0cmluZyxcbiAgLy8gICBjb2RlPzogU2lnbmFsTWVzc2FnZVxuICAvLyApIHtcbiAgLy8gICBpZiAoIWNvbmRpdGlvbikgdGhpcy5zaWduYWwoZXhwciwgbXNnLCBjb2RlKTtcbiAgLy8gfVxuICAvKiogQGludGVybmFsICovXG4gIGNhY2hlKGNhY2hlTmFtZSwgYnVpbGQsIHB1cmdlKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlW2NhY2hlTmFtZV0gPT09IHZvaWQgMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fY2FjaGVbY2FjaGVOYW1lXSA9IHsgYnVpbGQsIHB1cmdlLCB2YWx1ZTogYnVpbGQoKSB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBGYXRhbCBlcnJvciBidWlsZGluZyBjYWNoZSBcIiR7Y2FjaGVOYW1lfVwiOlxuXHQgJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVbY2FjaGVOYW1lXT8udmFsdWU7XG4gIH1cbiAgYm94KGV4cHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYm94KHRoaXMsIGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIGNhbm9uaWNhbCh4cykge1xuICAgIGlmICgheHMuZXZlcnkoKHgpID0+IHggaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikpXG4gICAgICByZXR1cm4geHMubWFwKCh4KSA9PiB0aGlzLmJveCh4KSk7XG4gICAgY29uc3QgYnhzID0geHM7XG4gICAgcmV0dXJuIGJ4cy5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkgPyBieHMgOiBieHMubWFwKCh4KSA9PiB4LmNhbm9uaWNhbCk7XG4gIH1cbiAgZm4oaGVhZDIsIG9wczIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYm94RnVuY3Rpb24odGhpcywgaGVhZDIsIG9wczIsIG9wdGlvbnMgPz8geyBjYW5vbmljYWw6IHRydWUgfSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZm4oaGVhZDIsIG9wczIsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIGhlYWQyLCBvcHMyLCB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNhbm9uaWNhbDogdHJ1ZSxcbiAgICAgIGRlZjogdGhpcy5sb29rdXBGdW5jdGlvbihoZWFkMiwgdGhpcy5jb250ZXh0KVxuICAgIH0pO1xuICB9XG4gIGVycm9yKG1lc3NhZ2UsIHdoZXJlKSB7XG4gICAgaWYgKHdoZXJlIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pIHtcbiAgICAgIHdoZXJlID0gdGhpcy5yYXdKc29uKHdoZXJlKTtcbiAgICB9IGVsc2UgaWYgKHdoZXJlICYmIEFycmF5LmlzQXJyYXkod2hlcmUpICYmIHdoZXJlWzBdID09PSBcIkxhdGV4XCIpIHtcbiAgICAgIGlmICh3aGVyZVsxXSA9PT0gdm9pZCAwIHx8ICF3aGVyZVsxXSlcbiAgICAgICAgd2hlcmUgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVvZiB3aGVyZVsxXSA9PT0gXCJvYmplY3RcIiAmJiBcInN0clwiIGluIHdoZXJlWzFdICYmICF3aGVyZVsxXS5zdHIpXG4gICAgICAgIHdoZXJlID0gXCJcIjtcbiAgICB9XG4gICAgbGV0IG1zZyA9IHZvaWQgMDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlKSAmJiBtZXNzYWdlWzBdID09PSBcImluY29tcGF0aWJsZS1kb21haW5cIikge1xuICAgICAgbXNnID0gbmV3IEJveGVkRnVuY3Rpb24odGhpcywgXCJFcnJvckNvZGVcIiwgW1xuICAgICAgICB0aGlzLnN0cmluZyhcImluY29tcGF0aWJsZS1kb21haW5cIiksXG4gICAgICAgIGJveERvbWFpbih0aGlzLCBtZXNzYWdlWzFdKSxcbiAgICAgICAgYm94RG9tYWluKHRoaXMsIG1lc3NhZ2VbMl0pXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiKVxuICAgICAgbXNnID0gdGhpcy5zdHJpbmcobWVzc2FnZSk7XG4gICAgaWYgKCFtc2cgJiYgdHlwZW9mIG1lc3NhZ2UgIT09IFwic3RyaW5nXCIpXG4gICAgICBtc2cgPSBuZXcgQm94ZWRGdW5jdGlvbih0aGlzLCBcIkVycm9yQ29kZVwiLCBbXG4gICAgICAgIHRoaXMuc3RyaW5nKG1lc3NhZ2VbMF0pLFxuICAgICAgICAuLi5tZXNzYWdlLnNsaWNlKDEpLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodHlwZW9mIHggIT09IFwic3RyaW5nXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJveCh4LCB7IGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pXG4gICAgICBdKTtcbiAgICBpZiAoIXdoZXJlKVxuICAgICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIFwiRXJyb3JcIiwgW21zZ10sIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJFcnJvclwiLFxuICAgICAgW21zZywgdGhpcy5ib3god2hlcmUsIHsgY2Fub25pY2FsOiBmYWxzZSB9KV0sXG4gICAgICB7IGNhbm9uaWNhbDogZmFsc2UgfVxuICAgICk7XG4gIH1cbiAgaG9sZChleHByKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZuKFwiSG9sZFwiLCBbdGhpcy5ib3goZXhwciwgeyBjYW5vbmljYWw6IGZhbHNlIH0pXSk7XG4gIH1cbiAgYWRkKG9wczIsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2Fub25pY2FsQWRkKHRoaXMsIGZsYXR0ZW5PcHMoZmxhdHRlblNlcXVlbmNlKG9wczIpLCBcIkFkZFwiKSk7XG4gICAgaWYgKG1ldGFkYXRhPy5sYXRleCAhPT0gdm9pZCAwKVxuICAgICAgcmVzdWx0LmxhdGV4ID0gbWV0YWRhdGEubGF0ZXg7XG4gICAgaWYgKG1ldGFkYXRhPy53aWtpZGF0YSAhPT0gdm9pZCAwKVxuICAgICAgcmVzdWx0Lndpa2lkYXRhID0gbWV0YWRhdGEud2lraWRhdGE7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBuZWcoZXhwciwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKGV4cHIsIG1ldGFkYXRhKTtcbiAgfVxuICBtdWwob3BzMiwgbWV0YWRhdGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYW5vbmljYWxNdWx0aXBseShcbiAgICAgIHRoaXMsXG4gICAgICBmbGF0dGVuT3BzKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSwgXCIgTXVsdGlwbHlcIilcbiAgICApO1xuICAgIGlmIChtZXRhZGF0YT8ubGF0ZXggIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC5sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC53aWtpZGF0YSA9IG1ldGFkYXRhLndpa2lkYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGl2KG51bSwgZGVub20sIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2Fub25pY2FsRGl2aWRlKHRoaXMsIG51bSwgZGVub20pO1xuICAgIGlmIChtZXRhZGF0YT8ubGF0ZXggIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC5sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC53aWtpZGF0YSA9IG1ldGFkYXRhLndpa2lkYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3FydChiYXNlLCBtZXRhZGF0YSkge1xuICAgIHJldHVybiBjYW5vbmljYWxQb3dlcih0aGlzLCBiYXNlLCB0aGlzLl9IQUxGLCBtZXRhZGF0YSk7XG4gIH1cbiAgcG93KGJhc2UsIGV4cG9uZW50LCBtZXRhZGF0YSkge1xuICAgIGlmIChiYXNlLnN5bWJvbCA9PT0gXCJFeHBvbmVudGlhbEVcIiAmJiBleHBvbmVudCBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleCAmJiBleHBvbmVudC5yZSA9PT0gMCkge1xuICAgICAgY29uc3QgaW0gPSBleHBvbmVudC5pbTtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcih0aGlzLmNvbXBsZXgoTWF0aC5jb3MoaW0pLCBNYXRoLnNpbihpbSkpKTtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50IGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pIHtcbiAgICAgIGNvbnN0IG51bSA9IGV4cG9uZW50Lm51bWVyaWNWYWx1ZTtcbiAgICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgZXhwb25lbnQgPSBudW07XG4gICAgICAgIGlmIChpc1JhdGlvbmFsKG51bSkpXG4gICAgICAgICAgZXhwb25lbnQgPSBudW07XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBlID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIGV4cG9uZW50ID09PSBcIm51bWJlclwiKVxuICAgICAgZSA9IGV4cG9uZW50O1xuICAgIGVsc2UgaWYgKGlzUmF0aW9uYWwoZXhwb25lbnQpKSB7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwoZXhwb25lbnQpICYmIGV4cG9uZW50WzFdID09PSAxKVxuICAgICAgICBlID0gZXhwb25lbnRbMF07XG4gICAgICBlbHNlIGlmIChpc0JpZ1JhdGlvbmFsKGV4cG9uZW50KSAmJiBleHBvbmVudFsxXSA9PT0gQmlnSW50KDEpKVxuICAgICAgICBlID0gTnVtYmVyKGV4cG9uZW50WzBdKTtcbiAgICB9XG4gICAgaWYgKGUgPT09IDEpXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICBjb25zdCByID0gYmFzZS5udW1lcmljVmFsdWU7XG4gICAgaWYgKGUgPT09IC0xICYmIHIgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgciA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHIpKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoWzEsIHJdKTtcbiAgICAgIGVsc2UgaWYgKHIgaW5zdGFuY2VvZiBEZWNpbWFsICYmIHIuaXNJbnRlZ2VyKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbQmlnSW50KDEpLCBiaWdpbnQocildKTtcbiAgICAgIGVsc2UgaWYgKGlzUmF0aW9uYWwocikpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbclsxXSwgclswXV0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cG9uZW50ID09PSBcIm51bWJlclwiIHx8IGlzUmF0aW9uYWwoZXhwb25lbnQpKVxuICAgICAgZXhwb25lbnQgPSB0aGlzLm51bWJlcihleHBvbmVudCk7XG4gICAgcmV0dXJuIGNhbm9uaWNhbFBvd2VyKHRoaXMsIGJhc2UsIGV4cG9uZW50LCBtZXRhZGF0YSk7XG4gIH1cbiAgaW52KGV4cHIsIG1ldGFkYXRhKSB7XG4gICAgaWYgKGV4cHIuaXNPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fT05FO1xuICAgIGlmIChleHByLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fTkVHQVRJVkVfT05FO1xuICAgIGlmIChleHByLmlzSW5maW5pdHkpXG4gICAgICByZXR1cm4gdGhpcy5fWkVSTztcbiAgICBjb25zdCBuID0gZXhwci5udW1lcmljVmFsdWU7XG4gICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG4pKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoaW52ZXJzZShuKSwgeyBtZXRhZGF0YSB9KTtcbiAgICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoWzEsIG5dLCB7IG1ldGFkYXRhIH0pO1xuICAgICAgaWYgKG4gaW5zdGFuY2VvZiBEZWNpbWFsICYmIG4uaXNJbnRlZ2VyKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbQmlnSW50KDEpLCBiaWdpbnQobildLCB7IG1ldGFkYXRhIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZuKFwiRGl2aWRlXCIsIFt0aGlzLl9PTkUsIGV4cHJdLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIGlmIChleHByLmhlYWQgPT09IFwiU3FydFwiKVxuICAgICAgcmV0dXJuIHRoaXMuX2ZuKFwiU3FydFwiLCBbdGhpcy5pbnYoZXhwci5vcDEpXSwgbWV0YWRhdGEpO1xuICAgIGlmIChleHByLmhlYWQgPT09IFwiRGl2aWRlXCIpXG4gICAgICByZXR1cm4gdGhpcy5fZm4oXCJEaXZpZGVcIiwgW2V4cHJbMV0sIGV4cHJbMF1dLCBtZXRhZGF0YSk7XG4gICAgbGV0IGUgPSB0aGlzLl9ORUdBVElWRV9PTkU7XG4gICAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgICBpZiAoZXhwci5vcDIuaXNOZWdhdGl2ZU9uZSlcbiAgICAgICAgcmV0dXJuIGV4cHIub3AxO1xuICAgICAgZSA9IGNhbm9uaWNhbE5lZ2F0ZShleHByLm9wMik7XG4gICAgICBleHByID0gZXhwci5vcDE7XG4gICAgfVxuICAgIGlmIChlLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fZm4oXCJEaXZpZGVcIiwgW3RoaXMuX09ORSwgZXhwcl0sIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5fZm4oXCJQb3dlclwiLCBbZXhwciwgZV0sIG1ldGFkYXRhKTtcbiAgfVxuICBwYWlyKGZpcnN0LCBzZWNvbmQsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIFwiVHVwbGVcIiwgW2ZpcnN0LCBzZWNvbmRdLCB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNhbm9uaWNhbDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHR1cGxlKGVsZW1lbnRzLCBtZXRhZGF0YSkge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbih0aGlzLCBcIlR1cGxlXCIsIGNhbm9uaWNhbChlbGVtZW50cyksIHtcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgY2Fub25pY2FsOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgc3RyaW5nKHMsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZFN0cmluZyh0aGlzLCBzLCBtZXRhZGF0YSk7XG4gIH1cbiAgc3ltYm9sKG5hbWUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICBuYW1lID0gbmFtZS5ub3JtYWxpemUoKTtcbiAgICBpZiAobmFtZSA9PT0gXCJOYU5cIilcbiAgICAgIHJldHVybiB0aGlzLl9OQU47XG4gICAgaWYgKG5hbWUgPT09IFwiSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCIrSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCItSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCJIYWxmXCIpXG4gICAgICByZXR1cm4gdGhpcy5fSEFMRjtcbiAgICBpZiAodGhpcy5zdHJpY3QgJiYgIWlzVmFsaWRJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICBjb25zdCB3aGVyZSA9IG9wdGlvbnM/Lm1ldGFkYXRhPy5sYXRleDtcbiAgICAgIGNvbnN0IG5hbWVTdHIgPSBgJyR7bmFtZX0nYDtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFxuICAgICAgICBbXCJpbnZhbGlkLWlkZW50aWZpZXJcIiwgeyBzdHI6IHZhbGlkYXRlSWRlbnRpZmllcihuYW1lKSB9XSxcbiAgICAgICAgd2hlcmUgPyBbXCJMYXRleFwiLCBgJyR7d2hlcmV9J2BdIDogbmFtZVN0clxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/Lm1ldGFkYXRhPy5sYXRleCAhPT0gdm9pZCAwICYmICFvcHRpb25zLmNhbm9uaWNhbClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTeW1ib2wodGhpcywgbmFtZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY29tbW9uU3ltYm9sc1tuYW1lXTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoIW9wdGlvbnM/Lm1ldGFkYXRhPy53aWtpZGF0YSB8fCAhcmVzdWx0Lndpa2lkYXRhIHx8IHJlc3VsdC53aWtpZGF0YSA9PT0gb3B0aW9ucy5tZXRhZGF0YS53aWtpZGF0YSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbClcbiAgICAgICAgcmV0dXJuIG1ha2VDYW5vbmljYWxTeW1ib2wodGhpcywgbmFtZSk7XG4gICAgICByZXR1cm4gbmV3IEJveGVkU3ltYm9sKHRoaXMsIG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwpXG4gICAgICByZXR1cm4gbWFrZUNhbm9uaWNhbFN5bWJvbCh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gbmV3IEJveGVkU3ltYm9sKHRoaXMsIG5hbWUsIG9wdGlvbnMpO1xuICB9XG4gIGRvbWFpbihkb21haW4sIG1ldGFkYXRhKSB7XG4gICAgaWYgKGRvbWFpbiBpbnN0YW5jZW9mIF9Cb3hlZERvbWFpbilcbiAgICAgIHJldHVybiBkb21haW47XG4gICAgaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uICYmIGRvbWFpbi5zeW1ib2wpXG4gICAgICBkb21haW4gPSBkb21haW4uc3ltYm9sO1xuICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBleHByID0gdGhpcy5fY29tbW9uRG9tYWluc1tkb21haW5dO1xuICAgICAgaWYgKGV4cHIpXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICByZXR1cm4gYm94RG9tYWluKHRoaXMsIGRvbWFpbiwgbWV0YWRhdGEpO1xuICB9XG4gIC8qXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gYXZvaWQgY3JlYXRpbmcgYSBib3hlZCBudW1iZXIgaWYgYG51bWAgY29ycmVzcG9uZHNcbiAgICogdG8gYSBjb21tb24gdmFsdWUgZm9yIHdoaWNoIHdlIGhhdmUgYSBzaGFyZWQgaW5zdGFuY2UgKC0xLCAwLCBOYU4sIGV0Yy4uLilcbiAgICovXG4gIG51bWJlcih2YWx1ZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zID8geyAuLi5vcHRpb25zIH0gOiB7fTtcbiAgICBpZiAoIShcImNhbm9uaWNhbFwiIGluIG9wdGlvbnMpKVxuICAgICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zLm1ldGFkYXRhID09PSB2b2lkIDApIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBCaWdJbnQoMSkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX09ORTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBCaWdJbnQoMCkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX1pFUk87XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gQmlnSW50KC0xKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5fTkVHQVRJVkVfT05FO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBuID0gdmFsdWU7XG4gICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9PTkU7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9aRVJPO1xuICAgICAgICBpZiAobiA9PT0gLTEpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX05FR0FUSVZFX09ORTtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobikgJiYgdGhpcy5fY29tbW9uTnVtYmVyc1tuXSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbW1vbk51bWJlcnNbbl0gPT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLl9jb21tb25OdW1iZXJzW25dID0gYm94TnVtYmVyKHRoaXMsIHZhbHVlKSA/PyB0aGlzLl9OQU47XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbW1vbk51bWJlcnNbbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihuKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5fTkFOO1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSlcbiAgICAgICAgICByZXR1cm4gbiA8IDAgPyB0aGlzLl9ORUdBVElWRV9JTkZJTklUWSA6IHRoaXMuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKVxuICAgICAgdmFsdWUgPSB0aGlzLmJpZ251bSh2YWx1ZSk7XG4gICAgcmV0dXJuIGJveE51bWJlcih0aGlzLCB2YWx1ZSwgb3B0aW9ucykgPz8gdGhpcy5fTkFOO1xuICB9XG4gIHJ1bGVzKHJ1bGVzKSB7XG4gICAgcmV0dXJuIGJveFJ1bGVzKHRoaXMsIHJ1bGVzKTtcbiAgfVxuICBwYXR0ZXJuKGV4cHIpIHtcbiAgICByZXR1cm4gbmV3IEJveGVkUGF0dGVybih0aGlzLCBleHByKTtcbiAgfVxuICBwYXJzZShsYXRleCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgbGF0ZXggIT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxhdGV4U3ludGF4LnBhcnNlKGxhdGV4U3RyaW5nKGxhdGV4KSA/PyBsYXRleCk7XG4gICAgcmV0dXJuIHRoaXMuYm94KHJlc3VsdCwgb3B0aW9ucyk7XG4gIH1cbiAgc2VyaWFsaXplKHgsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgXCJqc29uXCIgaW4geCkge1xuICAgICAgY29uc3QgY2UgPSBcImVuZ2luZVwiIGluIHggPyB4LmVuZ2luZSA6IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5sYXRleFN5bnRheC5zZXJpYWxpemUoXG4gICAgICAgIHRoaXMucmF3SnNvbihjZS5ib3goeCwgeyBjYW5vbmljYWw6IGZhbHNlIH0pKSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGF0ZXhTeW50YXguc2VyaWFsaXplKHgsIG9wdGlvbnMpO1xuICB9XG4gIGdldCBsYXRleE9wdGlvbnMoKSB7XG4gICAgY29uc3QgbGF0ZXhTeW50YXggPSB0aGlzLmxhdGV4U3ludGF4O1xuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICB7XG4gICAgICAgIC4uLnRoaXMubGF0ZXhTeW50YXgub3B0aW9ucyxcbiAgICAgICAgLi4udGhpcy5sYXRleFN5bnRheC5zZXJpYWxpemVyLm9wdGlvbnNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNldChvcHRpb25zLCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgbGF0ZXhTeW50YXgudXBkYXRlT3B0aW9ucyh7IFtwcm9wXTogdmFsdWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHNldCBsYXRleE9wdGlvbnMob3B0cykge1xuICAgIHRoaXMubGF0ZXhTeW50YXgudXBkYXRlT3B0aW9ucyhvcHRzKTtcbiAgfVxuICBnZXQganNvblNlcmlhbGl6YXRpb25PcHRpb25zKCkge1xuICAgIGlmICh0aGlzLl91c2VSYXdKc29uU2VyaWFsaXphdGlvbk9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGhpcy5fcmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zLCB7XG4gICAgICAgIGdldChvcHRpb25zLCBwcm9wKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucywge1xuICAgICAgZ2V0KG9wdGlvbnMsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICByZXR1cm4gb3B0aW9uc1twcm9wXTtcbiAgICAgIH0sXG4gICAgICBzZXQob3B0aW9ucywgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHNlbGYuanNvblNlcmlhbGl6YXRpb25PcHRpb25zID0geyBbcHJvcF06IHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNldCBqc29uU2VyaWFsaXphdGlvbk9wdGlvbnModmFsKSB7XG4gICAgaWYgKHZhbC5leGNsdWRlKVxuICAgICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zLmV4Y2x1ZGUgPSBbLi4udmFsLmV4Y2x1ZGVdO1xuICAgIGlmICh2YWwuc2hvcnRoYW5kcykge1xuICAgICAgaWYgKHZhbC5zaG9ydGhhbmRzID09PSBcImFsbFwiIHx8IHZhbC5zaG9ydGhhbmRzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgIHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzID0gW1xuICAgICAgICAgIFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBcInN5bWJvbFwiLFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICAgXCJkaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgXCJudW1iZXJcIlxuICAgICAgICBdO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzID0gWy4uLnZhbC5zaG9ydGhhbmRzXTtcbiAgICB9XG4gICAgaWYgKHZhbC5tZXRhZGF0YSkge1xuICAgICAgaWYgKHZhbC5tZXRhZGF0YSA9PT0gXCJhbGxcIiB8fCB2YWwubWV0YWRhdGEuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhID0gW1wibGF0ZXhcIiwgXCJ3aWtpZGF0YVwiXTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEgPSBbLi4udmFsLm1ldGFkYXRhXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwucHJlY2lzaW9uID09PSBcIm51bWJlclwiICYmIHZhbC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucHJlY2lzaW9uID0gdmFsLnByZWNpc2lvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwucmVwZWF0aW5nRGVjaW1hbHMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucmVwZWF0aW5nRGVjaW1hbHMgPSB2YWwucmVwZWF0aW5nRGVjaW1hbHM7XG4gICAgfVxuICB9XG4gIHJhd0pzb24oZXhwcikge1xuICAgIGNvbnN0IHNhdmUgPSB0aGlzLl91c2VSYXdKc29uU2VyaWFsaXphdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSBleHByLmpzb247XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gc2F2ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgYXNzdW1wdGlvbnMgdGhhdCBtYXRjaCBhIHBhdHRlcm4uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqICBjZS5hc3N1bWUoeCwgJ1Bvc2l0aXZlSW50ZWdlcicpO1xuICAgKiAgY2UuYXNrKFsnR3JlYXRlcicsICd4JywgJ192YWwnXSlcbiAgICogIC8vICAtPiBbeyd2YWwnOiAwfV1cbiAgICogYGBgXG4gICAqL1xuICBhc2socGF0dGVybikge1xuICAgIGNvbnN0IHBhdCA9IHRoaXMucGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFthc3N1bXB0aW9uLCB2YWxdIG9mIHRoaXMuYXNzdW1wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG0gPSBwYXQubWF0Y2goYXNzdW1wdGlvbiwge1xuICAgICAgICBudW1lcmljVG9sZXJhbmNlOiB0aGlzLl90b2xlcmFuY2VcbiAgICAgIH0pO1xuICAgICAgaWYgKG0gIT09IG51bGwgJiYgdmFsID09PSB0cnVlKVxuICAgICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBCYXNlZCBvbiBjb250ZXh0dWFsIHVzYWdlLCBpbmZlciBkb21haW4gb2YgYSBzeW1ib2xcbiAgaW5mZXIoc3ltYm9sMiwgX2RvbWFpbikge1xuICAgIGlmICh0eXBlb2Ygc3ltYm9sMiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKCFzeW1ib2wyLnN5bWJvbClcbiAgICAgICAgcmV0dXJuIFwiaW50ZXJuYWwtZXJyb3JcIjtcbiAgICAgIHN5bWJvbDIgPSBzeW1ib2wyLnN5bWJvbDtcbiAgICB9XG4gICAgcmV0dXJuIFwib2tcIjtcbiAgfVxuICBhc3N1bWUoYXJnMSwgYXJnMikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsYXRleCA9IGxhdGV4U3RyaW5nKGFyZzEpO1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gbGF0ZXggPyB0aGlzLnBhcnNlKGxhdGV4LCB7IGNhbm9uaWNhbDogZmFsc2UgfSkgOiB0aGlzLmJveChhcmcxLCB7IGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gICAgICBpZiAoIWFyZzIpXG4gICAgICAgIHJldHVybiBhc3N1bWUocHJlZGljYXRlKTtcbiAgICAgIGlmIChpc0RvbWFpbihhcmcyKSlcbiAgICAgICAgcmV0dXJuIGFzc3VtZSh0aGlzLmJveChbXCJFbGVtZW50XCIsIHByZWRpY2F0ZSwgdGhpcy5kb21haW4oYXJnMildKSk7XG4gICAgICByZXR1cm4gYXNzdW1lKHRoaXMuYm94KFtcIkVxdWFsXCIsIHByZWRpY2F0ZSwgYXJnMl0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgcmV0dXJuIFwiaW50ZXJuYWwtZXJyb3JcIjtcbiAgICB9XG4gIH1cbiAgZm9yZ2V0KHN5bWJvbDIpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGlmIChzeW1ib2wyID09PSB2b2lkIDApIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaWRUYWJsZSlcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHRoaXMuY29udGV4dC5pZFRhYmxlLmtleXMoKSlcbiAgICAgICAgICB0aGlzLmZvcmdldChrKTtcbiAgICAgIHRoaXMuYXNzdW1wdGlvbnMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ltYm9sMikpIHtcbiAgICAgIGZvciAoY29uc3QgeCBvZiBzeW1ib2wyKVxuICAgICAgICB0aGlzLmZvcmdldCh4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzeW1ib2wyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmlkVGFibGUpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5jb250ZXh0LmlkVGFibGUuZ2V0KHN5bWJvbDIpO1xuICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGRlZikpIHtcbiAgICAgICAgICBkZWYudmFsdWUgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGRlZi5kb21haW4/LmlzTnVtZXJpYykge1xuICAgICAgICAgICAgZGVmLmRvbWFpbiA9IHRoaXMuZGVmYXVsdERvbWFpbiA/PyB0aGlzLmRvbWFpbihcIk51bWJlclwiKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGRlZi5kb21haW4gPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2Fzc3VtcHRpb24sIF92YWxdIG9mIHRoaXMuYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgaWYgKGFzc3VtcHRpb24uc3ltYm9scy5pbmNsdWRlcyhzeW1ib2wyKSlcbiAgICAgICAgICB0aGlzLmFzc3VtcHRpb25zLmRlbGV0ZShhc3N1bXB0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS50c1xudmFyIHZlcnNpb24gPSBcIjAuMTUuMFwiO1xuZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiaW8uY29ydGV4anMuY29tcHV0ZS1lbmdpbmVcIildID0ge1xuICBDb21wdXRlRW5naW5lOiBDb21wdXRlRW5naW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvcixcbiAgdmVyc2lvbjogXCIwLjE1LjBcIlxufTtcbmV4cG9ydCB7XG4gIENvbXB1dGVFbmdpbmUsXG4gIGlzRW52aXJvbm1lbnRFbnRyeSxcbiAgaXNFeHByZXNzaW9uRW50cnksXG4gIGlzRnVuY3Rpb25FbnRyeSxcbiAgaXNJbmZpeEVudHJ5LFxuICBpc01hdGNoZml4RW50cnksXG4gIGlzUG9zdGZpeEVudHJ5LFxuICBpc1ByZWZpeEVudHJ5LFxuICBpc1N5bWJvbEVudHJ5LFxuICB2ZXJzaW9uXG59O1xuLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjpcblxuY29tcGxleC5qcy9jb21wbGV4LmpzOlxuICAoKipcbiAgICogQGxpY2Vuc2UgQ29tcGxleC5qcyB2Mi4xLjEgMTIvMDUvMjAyMFxuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFJvYmVydCBFaXNlbGUgKHJvYmVydEB4YXJnLm9yZylcbiAgICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuXG4gICAqKilcblxuZGVjaW1hbC5qcy9kZWNpbWFsLm1qczpcbiAgKCohXG4gICAqICBkZWNpbWFsLmpzIHYxMC40LjNcbiAgICogIEFuIGFyYml0cmFyeS1wcmVjaXNpb24gRGVjaW1hbCB0eXBlIGZvciBKYXZhU2NyaXB0LlxuICAgKiAgaHR0cHM6Ly9naXRodWIuY29tL01pa2VNY2wvZGVjaW1hbC5qc1xuICAgKiAgQ29weXJpZ2h0IChjKSAyMDIyIE1pY2hhZWwgTWNsYXVnaGxpbiA8TThjaDg4bEBnbWFpbC5jb20+XG4gICAqICBNSVQgTGljZW5jZVxuICAgKilcbiovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBQXVCOzs7QUNDdkIsc0JBQTJCO0FBQzNCLG1CQUFnQztBQUNoQyxJQUFBQSxlQVFPOzs7QUNYUCxrQkFBdUM7QUFFaEMsSUFBTSxlQUFOLGNBQTJCLHVCQUFXO0FBQUEsRUFDM0MsWUFBbUIsTUFBeUIsT0FBc0IsTUFBYztBQUM5RSxVQUFNO0FBRFc7QUFBeUI7QUFBc0I7QUFBQSxFQUVsRTtBQUFBLEVBRUEsTUFBTSxNQUErQjtBQUNuQyxVQUFNQyxPQUFNLFNBQVMsY0FBYyxNQUFNO0FBQ3pDLElBQUFBLEtBQUksWUFBWTtBQUVoQixJQUFBQSxLQUFJLFlBQVksS0FBSztBQUNyQixJQUFBQSxLQUFJLFVBQVUsTUFBTTtBQUVsQixZQUFNLGNBQWMsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNwQyxTQUFTO0FBQUEsVUFDUCxNQUFNLEtBQUs7QUFBQSxVQUNYLElBQUksS0FBSztBQUFBLFVBQ1QsUUFBUSxLQUFLO0FBQUEsUUFDZjtBQUFBLE1BQ0YsQ0FBQztBQUNELFdBQUssU0FBUyxXQUFXO0FBQUEsSUFDM0I7QUFFQSxXQUFPQTtBQUFBLEVBQ1Q7QUFDRjs7O0FDekJBLElBQUksV0FBVyxPQUFPO0FBQ3RCLElBQUlDLGFBQVksT0FBTztBQUN2QixJQUFJQyxvQkFBbUIsT0FBTztBQUM5QixJQUFJQyxxQkFBb0IsT0FBTztBQUMv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QUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLGNBQWMsQ0FBQyxTQUFTO0FBQUEsSUFDeEIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxN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RDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsTUFBTTtBQUFBLElBQ3JCLE1BQU07QUFBQSxJQUNOLFlBQVk7QUFBQSxFQUNkO0FBQUEsRUFDQTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sY0FBYyxDQUFDLFNBQVM7QUFBQSxJQUN4QixNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxXQUFXO0FBQUEsSUFDMUIsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsV0FBVztBQUFBLElBQzFCLE1BQU07QUFBQSxJQUNOLGVBQWU7QUFBQSxJQUNmLFlBQVk7QUFBQSxFQUNkO0FBQUEsRUFDQTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sY0FBYyxDQUFDLGFBQWE7QUFBQSxJQUM1QixNQUFNO0FBQUEsSUFDTixlQUFlO0FBQUEsSUFDZixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxhQUFhO0FBQUEsSUFDNUIsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxZQUFZO0FBQUEsSUFDM0IsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxjQUFjO0FBQUEsSUFDN0IsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxZQUFZO0FBQUEs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Q0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVB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QUEsTUFDUixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUE7QUFBQSxNQUVSLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLEtBQUs7QUFBQTtBQUFBLE1BRUwsS0FBSztBQUFBLE1BQ0wsSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsVUFBVTtBQUFBLE1BQ1YsSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQTBGUixFQUFFLENBQUMsTUEzSFEs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QTtBQUFBLFFBQzFKLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFB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Q0FBQyxHQUFHLENBQUM7QUFBQSxJQUNMO0FBQUEsTUFDRSxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ0w7QUFBQSxNQUNFLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0E7QUFBQSxJQUNFLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDTDtBQUFBLE1BQ0UsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDO0FBQUEsTUFDckIsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDO0FBQUEsTUFDckIsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQTtBQUFBLElBQ0UsQ0FBQyxHQUFHLEVBQUU7QUFBQSxJQUNOO0FBQUEsTUFDRSxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ0w7QUFBQSxNQUNFLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQztBQUFBO0FBQUEsTUFFckIsS0FBSztBQUFBO0FBQUEsTUFFTCxLQUFLO0FBQUE7QUFBQSxNQUVMLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQztBQUFBO0FBQUEsTUFFckIsS0FBSztBQUFBLE1BQ0wsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFBQTtBQUFBLElBRXhDO0FBQUEs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TUFBTSxHQUFHLENBQUMseUJBQXlCLE1BQU0sRUFBRSxLQUFLO0FBQ3RGLGdCQUFJLFNBQVMsa0JBQWtCLE1BQU0sZ0JBQWdCLEVBQUUsU0FBUyxFQUFFO0FBRWxFLGdCQUFJLGVBQWUsSUFBSTtBQUN2QixnQkFBSSxPQUFPLFlBQVksRUFBRSxTQUFTLE9BQU87QUFBRyw2QkFBZTtBQUUzRCxvQkFBUTtBQUFBLGNBQ047QUFBQSxjQUNBO0FBQUEsY0FDQSx3QkFBVyxRQUFRO0FBQUEsZ0JBQ2pCLFFBQVEsSUFBSSxhQUFhLE1BQU0sYUFBYSxZQUFZO0FBQUEsY0FDMUQsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPLFFBQVEsT0FBTztBQUFBLEVBQ3hCO0FBQ0Y7QUFFQSxJQUFNLGFBQThDO0FBQUEsRUFDbEQsYUFBYSxDQUFDLFVBQStCLE1BQU07QUFDckQ7QUFFTyxJQUFNLHNCQUFzQix3QkFBVztBQUFBLEVBQzVDO0FBQUEsRUFDQTtBQUNGOzs7QUR4RkEsSUFBcUIsZ0JBQXJCLGNBQTJDLHVCQUFPO0FBQUEsRUFDakQsTUFBTSxTQUFTO0FBQ1osU0FBSyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUFBLEVBQ3JEO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFBQztBQUNiOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdmlldyIsICJkaXYiLCAiX19kZWZQcm9wIiwgIl9fZ2V0T3duUHJvcERlc2MiLCAiX19nZXRPd25Qcm9wTmFtZXMiLCAiX19oYXNPd25Qcm9wIiwgIl9fY29weVByb3BzIiwgIm1vZHVsZSIsICJfYSJdCn0K diff --git a/.obsidian/plugins/calctex/manifest.json b/.obsidian/plugins/calctex/manifest.json new file mode 100644 index 00000000..96b31991 --- /dev/null +++ b/.obsidian/plugins/calctex/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "calctex", + "name": "Calctex", + "version": "1.0.1", + "minAppVersion": "0.15.0", + "description": "Calculate LaTeX formulas inside Obsidian.", + "author": "Mike", + "authorUrl": "https://developer-mike.vercel.app/", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/calctex/styles.css b/.obsidian/plugins/calctex/styles.css new file mode 100644 index 00000000..fecbb646 --- /dev/null +++ b/.obsidian/plugins/calctex/styles.css @@ -0,0 +1,5 @@ +.result-text { + color: var(--text-faint); + font-style: oblique; + font-size: smaller; +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-excalidraw-plugin/data.json b/.obsidian/plugins/obsidian-excalidraw-plugin/data.json index 64fd0ffb..f2f3c984 100644 --- a/.obsidian/plugins/obsidian-excalidraw-plugin/data.json +++ b/.obsidian/plugins/obsidian-excalidraw-plugin/data.json @@ -10408,7 +10408,7 @@ "containerId": null, "originalText": "!", "lineHeight": 1.222222222222222, - "baseline": 18 + "baseline": 17 } ], "id": "a4aCbz4Mh-PMppX8JV9oJ", @@ -47207,7 +47207,7 @@ "containerId": null, "originalText": "5\n\n4\n\n3\n\n2\n\n1 \n\n0\n\n\n-1\n\n-2\n\n-3\n\n-4\n\n-5", "lineHeight": 1.2490706319702598, - "baseline": 442 + "baseline": 441 }, { "type": "line", @@ -48423,7 +48423,7 @@ "containerId": null, "originalText": "5\n\n4\n\n3\n\n2\n\n1 \n\n0\n\n\n-1\n\n-2\n\n-3\n\n-4\n\n-5", "lineHeight": 1.2490706319702598, - "baseline": 442 + "baseline": 441 }, { "type": "line", @@ -61505,7 +61505,7 @@ "containerId": null, "originalText": "KEY", "lineHeight": 1.2989276108437504, - "baseline": 17 + "baseline": 16 }, { "type": "text", @@ -61542,7 +61542,7 @@ "containerId": null, "originalText": "DATA", "lineHeight": 1.2989276108437484, - "baseline": 17 + "baseline": 16 } ], "id": "0fN1YgloN8QEBcG1nuLU0", @@ -68689,7 +68689,7 @@ "containerId": null, "originalText": "0", "lineHeight": 1.2305837462742493, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -68726,7 +68726,7 @@ "containerId": null, "originalText": "1", "lineHeight": 1.2305837462742486, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -68763,7 +68763,7 @@ "containerId": null, "originalText": "2", "lineHeight": 1.2305837462742486, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -68800,7 +68800,7 @@ "containerId": null, "originalText": "3", "lineHeight": 1.230583746274251, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -68837,7 +68837,7 @@ "containerId": null, "originalText": "4", "lineHeight": 1.2305837462742497, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -68874,7 +68874,7 @@ "containerId": null, "originalText": "0", "lineHeight": 1.2665105496217897, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -68911,7 +68911,7 @@ "containerId": null, "originalText": "1", "lineHeight": 1.266510549621791, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -68948,7 +68948,7 @@ "containerId": null, "originalText": "2", "lineHeight": 1.2665105496217899, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -68985,7 +68985,7 @@ "containerId": null, "originalText": "3", "lineHeight": 1.2665105496217897, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -69022,7 +69022,7 @@ "containerId": null, "originalText": "4", "lineHeight": 1.2665105496217892, - "baseline": 18 + "baseline": 17 }, { "type": "rectangle", @@ -69869,7 +69869,7 @@ "containerId": null, "originalText": "5", "lineHeight": 1.2305837462742497, - "baseline": 16 + "baseline": 15 }, { "type": "rectangle", @@ -70176,7 +70176,7 @@ "containerId": null, "originalText": "6", "lineHeight": 1.230583746274251, - "baseline": 16 + "baseline": 15 }, { "type": "rectangle", @@ -70483,7 +70483,7 @@ "containerId": null, "originalText": "7", "lineHeight": 1.2305837462742502, - "baseline": 16 + "baseline": 15 }, { "type": "rectangle", @@ -70790,7 +70790,7 @@ "containerId": null, "originalText": "8", "lineHeight": 1.23058374627425, - "baseline": 16 + "baseline": 15 }, { "type": "rectangle", @@ -71097,7 +71097,7 @@ "containerId": null, "originalText": "9", "lineHeight": 1.2305837462742488, - "baseline": 16 + "baseline": 15 }, { "type": "rectangle", @@ -71269,7 +71269,7 @@ "containerId": null, "originalText": "5", "lineHeight": 1.2665105496217908, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -71306,7 +71306,7 @@ "containerId": null, "originalText": "6", "lineHeight": 1.2665105496217908, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -71343,7 +71343,7 @@ "containerId": null, "originalText": "7", "lineHeight": 1.2665105496217899, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -71380,7 +71380,7 @@ "containerId": null, "originalText": "8", "lineHeight": 1.2665105496217905, - "baseline": 18 + "baseline": 17 }, { "type": "text", @@ -71417,7 +71417,7 @@ "containerId": null, "originalText": "9", "lineHeight": 1.2665105496217908, - "baseline": 18 + "baseline": 17 } ], "id": "v64rHLhwhoMh6YxxcvFRW", @@ -72137,7 +72137,7 @@ "containerId": null, "originalText": "0", "lineHeight": 1.2258489560818937, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72174,7 +72174,7 @@ "containerId": null, "originalText": "1", "lineHeight": 1.2258489560818937, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72211,7 +72211,7 @@ "containerId": null, "originalText": "2", "lineHeight": 1.2258489560818915, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72248,7 +72248,7 @@ "containerId": null, "originalText": "3", "lineHeight": 1.2258489560818941, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72285,7 +72285,7 @@ "containerId": null, "originalText": "4", "lineHeight": 1.2258489560818953, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72947,7 +72947,7 @@ "containerId": null, "originalText": "0", "lineHeight": 1.2227829575141542, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -72984,7 +72984,7 @@ "containerId": null, "originalText": "1", "lineHeight": 1.2227829575141567, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -73021,7 +73021,7 @@ "containerId": null, "originalText": "2", "lineHeight": 1.2227829575141556, - "baseline": 16 + "baseline": 15 }, { "type": "text", @@ -73058,7 +73058,7 @@ "containerId": null, "originalText": "3", "lineHeight": 1.222782957514155, - "baseline": 16 + "baseline": 15 }, { "type": "text", diff --git a/.obsidian/plugins/obsidian-minimal-settings/data.json b/.obsidian/plugins/obsidian-minimal-settings/data.json index 9a790da4..c8a40aef 100644 --- a/.obsidian/plugins/obsidian-minimal-settings/data.json +++ b/.obsidian/plugins/obsidian-minimal-settings/data.json @@ -9,7 +9,7 @@ "lineWidth": 40, "lineWidthWide": 5000, "maxWidth": 98, - "textNormal": 19, + "textNormal": 20, "textSmall": 13, "imgGrid": false, "imgWidth": "img-default-width", diff --git a/.obsidian/plugins/rss-reader/data.json b/.obsidian/plugins/rss-reader/data.json index 407b855f..b1eec6df 100644 --- a/.obsidian/plugins/rss-reader/data.json +++ b/.obsidian/plugins/rss-reader/data.json @@ -66,25 +66,223 @@ "description": "xkcd.com: A webcomic of romance and math humor.", "items": [ { - "title": "Expression Evaluation and Fundamental Physics", - "description": "\"\"", - "content": "\"\"\n

\"Expression

\n

An Unexpected Correspondence

\n

Enter any expression and it’ll get evaluated:

\n
\n
\n

\n

And internally—say in the Wolfram Language—what’s going on is that the expression is progressively being transformed using all available rules until no more rules apply. Here the process can be represented like this:

\n
\n
\n

\n

We can think of the yellow boxes in this picture as corresponding to “evaluation events” that transform one “state of the expression” (represented by a blue box) to another, eventually reaching the “fixed point” 12.

\n

And so far this may all seem very simple. But actually there are many surprisingly complicated and deep issues and questions. For example, to what extent can the evaluation events be applied in different orders, or in parallel? Does one always get the same answer? What about non-terminating sequences of events? And so on.

\n

I was first exposed to such issues more than 40 years ago—when I was working on the design of the evaluator for the SMP system that was the forerunner of Mathematica and the Wolfram Language. And back then I came up with pragmatic, practical solutions—many of which we still use today. But I was never satisfied with the whole conceptual framework. And I always thought that there should be a much more principled way to think about such things—that would likely lead to all sorts of important generalizations and optimizations.

\n

Well, more than 40 years later I think we can finally now see how to do this. And it’s all based on ideas from our Physics Project—and on a fundamental correspondence between what’s happening at the lowest level in all physical processes and in expression evaluation. Our Physics Project implies that ultimately the universe evolves through a series of discrete events that transform the underlying structure of the universe (say, represented as a hypergraph)—just like evaluation events transform the underlying structure of an expression.

\n

And given this correspondence, we can start applying ideas from physics—like ones about spacetime and quantum mechanics—to questions of expression evaluation. Some of what this will lead us to is deeply abstract. But some of it has immediate practical implications, notably for parallel, distributed, nondeterministic and quantum-style computing. And from seeing how things play out in the rather accessible and concrete area of expression evaluation, we’ll be able to develop more intuition about fundamental physics and about other areas (like metamathematics) where the ideas of our Physics Project can be applied.

\n

Causal Graphs and Spacetime

\n

The standard evaluator in the Wolfram Language applies evaluation events to an expression in a particular order. But typically multiple orders are possible; for the example above, there are three:

\n
\n
\n

\n

So what determines what orders are possible? There is ultimately just one constraint: the causal dependencies that exist between events. The key point is that a given event cannot happen unless all the inputs to it are available, i.e. have already been computed. So in the example here, the evaluation event cannot occur unless the one has already occurred. And we can summarize this by “drawing a causal edge” from the event to the one. Putting together all these “causal relations”, we can make a causal graph, which in the example here has the simple form (where we include a special “Big Bang” initial event to create the original expression that we’re evaluating):

\n
\n
\n

\n

What we see from this causal graph is that the events on the left must all follow each other, while the event on the right can happen “independently”. And this is where we can start making an analogy with physics. Imagine our events are laid out in spacetime. The events on the left are “timelike separated” from each other, because they are constrained to follow one after another, and so must in effect “happen at different times”. But what about the event on the right? We can think of this as being “spacelike separated” from the others, and happening at a “different place in space” asynchronously from the others.

\n

As a quintessential example of a timelike chain of events, consider making the definition

\n
\n
\n

\n

and then generating the causal graph for the events associated with evaluating f[f[f[1]]] (i.e. Nest[f, 1, 3]):

\n
\n
\n

\n

A straightforward way to get spacelike events is just to “build in space” by giving an expression like f[1] + f[1] + f[1] that has parts that can effectively be thought of as being explicitly “laid out in different places”, like the cells in a cellular automaton:

\n
\n
\n

\n

But one of the major lessons of our Physics Project is that it’s possible for space to “emerge dynamically” from the evolution of a system (in that case, by successive rewriting of hypergraphs). And it turns out very much the same kind of thing can happen in expression evaluation, notably with recursively defined functions.

\n

As a simple example, consider the standard definition of Fibonacci numbers:

\n
\n
\n

\n

With this definition, the causal graph for the evaluation of f[3] is then:

\n
\n
\n

\n

For f[5], dropping the “context” of each event, and showing only what changed, the graph is

\n
\n
\n

\n

while for f[8] the structure of the graph is:

\n
\n
\n

\n

So what is the significance of there being spacelike-separated parts in this graph? At a practical level, a consequence is that those parts correspond to subevaluations that can be done independently, for example in parallel. All the events (or subevaluations) in any timelike chain must be done in sequence. But spacelike-separated events (or subevaluations) don’t immediately have a particular relative order. The whole graph can be thought of as defining a partial ordering for all events—with the events forming a partially ordered set (poset). Our “timelike chains” then correspond to what are usually called chains in the poset. The antichains of the poset represent possible collections of events that can occur “simultaneously”.

\n

And now there’s a deep analogy to physics. Because just like in the standard relativistic approach to spacetime, we can define a sequence of “spacelike surfaces” (or hypersurfaces in 3 + 1-dimensional spacetime) that correspond to possible successive “simultaneity surfaces” where events can consistently be done simultaneously. Put another way, any “foliation” of the causal graph defines a sequence of “time steps” in which particular collections of events occur—as in for example:

\n
\n
\n

\n

And just like in relativity theory, different foliations correspond to different choices of reference frames, or what amount to different choices of “space and time coordinates”. But at least in the examples we’ve seen so far, the “final result” from the evaluation is always the same, regardless of the foliation (or reference frame) we use—just as we expect when there is relativistic invariance.

\n

As a slightly more complex—but ultimately very similar—example, consider the nestedly recursive function:

\n
\n
\n

\n

Now the causal graph for f[12] has the form

\n
\n
\n

\n

which again has both spacelike and timelike structure.

\n

Foliations and the Definition of Time

\n

Let’s go back to our first example above—the evaluation of (1 + (2 + 2)) + (3 + 4). As we saw above, the causal graph in this case is:

\n
\n
\n

\n

The standard Wolfram Language evaluator makes these events occur in the following order:

\n
\n
\n

\n

And by applying events in this order starting with the initial state, we can reconstruct the sequence of states that will be reached at each step by this particular evaluation process (where now we’ve highlighted in each state the part that’s going to be transformed at each step):

\n
\n
\n

\n

Here’s the standard evaluation order for the Fibonacci number f[3]:

\n
\n
\n

\n

And here’s the sequence of states generated from this sequence of events:

\n
\n
\n

\n

Any valid evaluation order has to eventually visit (i.e. apply) all the events in the causal graph. Here’s the path that’s traced out by the standard evaluation order on the causal graph for f[8]. As we’ll discuss later, this corresponds to a depth-first scan of the (directed) graph:

\n
\n
\n

\n

But let’s return now to our first example. We’ve seen the order of events used in the standard Wolfram Language evaluation process. But there are actually three different orders that are consistent with the causal relations defined by the causal graph (in the language of posets, each of these is a “total ordering”):

\n
\n
\n

\n

And for each of these orders we can reconstruct the sequence of states that would be generated:

\n
\n
\n

\n

Up to this point we’ve always assumed that we’re just applying one event at a time. But whenever we have spacelike-separated events, we can treat such events as “simultaneous”—and applied at the same point. And—just like in relativity theory—there are typically multiple possible choices of “simultaneity surfaces”. Each one corresponds to a certain foliation of our causal graph. And in the simple case we’re looking at here, there are only two possible (maximal) foliations:

\n
\n
\n

\n

From such foliations we can reconstruct possible total orderings of individual events just by enumerating possible permutations of events within each slice of the foliation (i.e. within each simultaneity surface). But we only really need a total ordering of events if we’re going to apply one event at a time. Yet the whole point is that we can view spacelike-separated events as being “simultaneous”. Or, in other words, we can view our system as “evolving in time”, with each “time step” corresponding to a successive slice in the foliation.

\n

And with this setup, we can reconstruct states that exist at each time step—interspersed by updates that may involve several “simultaneous” (spacelike-separated) events. In the case of the two foliations above, the resulting sequences of (“reconstructed”) states and updates are respectively:

\n
\n
\n

\n

As a more complicated example, consider recursively evaluating the Fibonacci number f[3] as above. Now the possible (maximal) foliations are:

\n
\n
\n

\n

For each of these foliations we can then reconstruct an explicit “time series” of states, interspersed by “updates” involving varying numbers of events:

\n
\n
Click to enlarge
\n

\n

So where in all these is the standard evaluation order? Well, it’s not explicitly here—because it involves doing a single event at a time, while all the foliations here are “maximal” in the sense that they aggregate as many events as they can into each spacelike slice. But if we don’t impose this maximality constraint, are there foliations that in a sense “cover” the standard evaluation order? Without the maximality constraint, there turn out in the example we’re using to be not 10 but 1249 possible foliations. And there are 4 that “cover” the standard (“depth-first”) evaluation order (indicated by a dashed red line):

\n
\n
\n

\n

(Only the last foliation here, in which every “slice” is just a single event, can strictly reproduce the standard evaluation order, but the others are all still “consistent with it”.)

\n

In the standard evaluation process, only a single event is ever done at a time. But what if instead one tries to do as many events as possible at a time? Well, that’s what our “maximal foliations” above are about. But one particularly notable case is what corresponds to a breadth-first scan of the causal graph. And this turns out to be covered by the very last maximal foliation we showed above.

\n

How this works may not be immediately obvious from the picture. With our standard layout for the causal graph, the path corresponding to the breadth-first scan is:

\n
\n
\n

\n

But if we lay out the causal graph differently, the path takes on the much-more-obviously-breadth-first form:

\n
\n
\n

\n

And now using this layout for the various configurations of foliations above we get:

\n
\n
\n

\n

We can think of different layouts for the causal graph as defining different “coordinatizations of spacetime”. If the vertical direction is taken to be time, and the horizontal direction space, then different layouts in effect place events at different positions in time and space. And with the layout here, the last foliation above is “flat”, in the sense that successive slices of the foliation can be thought of as directly corresponding to successive “steps in time”.

\n

In physics terms, different foliations correspond to different “reference frames”. And the “flat” foliation can be thought of as being like the cosmological rest frame, in which the observer is “at rest with respect to the universe”. In terms of states and events, we can also interpret this another way: we can say it’s the foliation in which in some sense the “largest possible number of events are being packed in at each step”. Or, more precisely, if at each step we scan from left to right, we’re doing every successive event that doesn’t overlap with events we’ve already done at this step:

\n
\n
\n

\n

And actually this also corresponds to what happens if, instead of using the built-in standard evaluator, we explicitly tell the Wolfram Language to repeatedly do replacements in expressions. To compare with what we’ve done above, we have to be a little careful in our definitions, using ⊕ and ⊖ as versions of + and – that have to get explicitly evaluated by other rules. But having done this, we get exactly the same sequence of “intermediate expressions” as in the flat (i.e. “breadth-first”) foliation above:

\n
\n
\n

\n

In general, different foliations can be thought of as specifying different “event-selection functions” to be applied to determine what events should occur at the next steps from any given state. At one extreme we can pick single-event-at-a-time event selection functions—and at the other extreme we can pick maximum-events-at-a-time event selection functions. In our Physics Project we have called the states obtained by applying maximal collections of events at a time “generational states”. And in effect these states represent the typical way we parse physical “spacetime”—in which we take in “all of space” at every successive moment of time. At a practical level the reason we do this is that the speed of light is somehow fast compared to the operation of our brains: if we look at our local surroundings (say the few hundred meters around us), light from these will reach us in a microsecond, while it takes our brains milliseconds to register what we’re seeing. And this makes it reasonable for us to think of there being an “instantaneous state of space” that we can perceive “all at once” at each particular “moment in time”.

\n

But what’s the analog of this when it comes to expression evaluation? We’ll discuss this a little more later. But suffice it to say here that it depends on who or what the “observer” of the process of evaluation is supposed to be. If we’ve got different elements of our states laid out explicitly in arrays, say in a GPU, then we might again “perceive all of space at once”. But if, for example, the data associated with states is connected through chains of pointers in memory or the like, and we “observe” this data only when we explicitly follow these pointers, then our perception won’t as obviously involve something we can think of as “bulk space”. But by thinking in terms of foliations (or reference frames) as we have here, we can potentially fit what’s going on into something like space, that seems familiar to us. Or, put another way, we can imagine in effect “programming in a certain reference frame” in which we can aggregate multiple elements of what’s going on into something we can consider as an analog of space—thereby making it familiar enough for us to understand and reason about.

\n

Multiway Evaluation and Multiway Graphs

\n

We can view everything we’ve done so far as dissecting and reorganizing the standard evaluation process. But let’s say we’re just given certain underlying rules for transforming expressions—and then we apply them in all possible ways. It’ll give us a “multiway” generalization of evaluation—in which instead of there being just one path of history, there are many. And in our Physics Project, this is exactly how the transition from classical to quantum physics works. And as we proceed here, we’ll see a close correspondence between multiway evaluation and quantum processes.

\n

But let’s start again with our expression (1 + (2 + 2)) + (3 + 4), and consider all possible ways that individual integer addition “events” can be applied to evaluate this expression. In this particular case, the result is pretty simple, and can be represented by a tree that branches in just two places:

\n
\n
\n

\n

But one thing to notice here is that even at the first step there’s an event that we’ve never seen before. It’s something that’s possible if we apply integer addition in all possible places. But when we start from the standard evaluation process, the basic event just never appears with the “expression context” we’re seeing it in here.

\n

Each branch in the tree above in some sense represents a different “path of history”. But there’s a certain redundancy in having all these separate pathsbecause there are multiple instances of the same expression that appear in different places. And if we treat these as equivalent and merge them we now get:

\n
\n
\n

\n

(The question of “state equivalence” is a subtle one, that ultimately depends on the operation of the observer, and how the observer constructs their perception of what’s going on. But for our purposes here, we’ll treat expressions as equivalent if they are structurally the same, i.e. every instance of or of 5 is “the same” or 5.)

\n

If we now look only at states (i.e. expressions) we’ll get a multiway graph, of the kind that’s appeared in our Physics Project and in many applications of concepts from it:

\n
\n
\n

\n

This graph in a sense gives a succinct summary of possible paths of history, which here correspond to possible evaluation paths. The standard evaluation process corresponds to a particular path in this multiway graph:

\n
\n
\n

\n

What about a more complicated case? For example, what is the multiway graph for our recursive computation of Fibonacci numbers? As we’ll discuss at more length below, in order to make sure every branch of our recursive evaluation terminates, we have to give a slightly more careful definition of our function f:

\n
\n
\n

\n

But now here’s the multiway tree for the evaluation of f[2]:

\n
\n
\n

\n

And here’s the corresponding multiway graph:

\n
\n
\n

\n

The leftmost branch in the multiway tree corresponds to the standard evaluation process; here’s the corresponding path in the multiway graph:

\n
\n
\n

\n

Here’s the structure of the multiway graph for the evaluation of f[3]:

\n
\n
\n

\n

Note that (as we’ll discuss more later) all the possible evaluation paths in this case lead to the same final expression, and in fact in this particular example all the paths are of the same length (12 steps, i.e. 12 evaluation events).

\n

In the multiway graphs we’re drawing here, every edge in effect corresponds to an evaluation event. And we can imagine setting up foliations in the multiway graph that divide these events into slices. But what is the significance of these slices? When we did the same kind of thing above for causal graphs, we could interpret the slices as representing “instantaneous states laid out in space”. And by analogy we can interpret a slice in the multiway graph as representing “instantaneous states laid out across branches of history”. In the context of our Physics Project, we can then think of these slices as being like superpositions in quantum mechanics, or states “laid out in branchial space”. And, as we’ll discuss later, just as we can think of elements laid out in “space” as corresponding in the Wolfram Language to parts in a symbolic expression (like a list, a sum, etc.), so now we’re dealing with a new kind of way of aggregating states across branchial space, that has to be represented with new language constructs.

\n

But let’s return to the very simple case of (1 + (2 + 2)) + (3 + 4). Here’s a more complete representation of the multiway evaluation process in this case, including both all the events involved, and the causal relations between them:

\n
\n
\n

\n

The “single-way” evaluation process we discussed above uses only part of this:

\n
\n
\n

\n

And from this part we can pull out the causal relations between events to reproduce the (“single-way”) causal graph we had before. But what if we pull out all the causal relations in our full graph?

\n
\n
\n

\n

What we then have is the multiway causal graph. And from foliations of this, we can construct possible histories—though now they’re multiway histories, with the states at particular time steps now being what amount to superposition states.

\n

In the particular case we’re showing here, the multiway causal graph has a very simple structure, consisting essentially just of a bunch of isomorphic pieces. And as we’ll see later, this is an inevitable consequence of the nature of the evaluation we’re doing here, and its property of causal invariance (and in this case, confluence).

\n

Branchlike Separation

\n

Although what we’ve discussed has already been somewhat complicated, there’s actually been a crucial simplifying assumption in everything we’ve done. We’ve assumed that different transformations on a given expression can never apply to the same part of the expression. Different transformations can apply to different parts of the same expression (corresponding to spacelike-separated evaluation events). But there’s never been a “conflict” between transformations, where multiple transformations can apply to the same part of the same expression.

\n

So what happens if we relax this assumption? In effect it means that we can generate different “incompatible” branches of history—and we can characterize the events that produce this as “branchlike separated”. And when such branchlike-separated events are applied to a given state, they’ll produce multiple states which we can characterize as “separated in branchial space”, but nevertheless correlated as a result of their “common ancestry”—or, in quantum mechanics terms, “entangled”.

\n

As a very simple first example, consider the rather trivial function f defined by

\n
\n
\n

\n

If we evaluate f[f[0]] (for any f) there are immediately two “conflicting” branches: one associated with evaluation of the “outer f”, and one with evaluation of the “inner f”:

\n
\n
\n

\n

We can indicate branchlike-separated pairs of events by a dashed line:

\n
\n
\n

\n

Adding in causal edges, and merging equivalent states, we get:

\n
\n
\n

\n

We see that some events are causally related. The first two events are not—but given that they involve overlapping transformations they are “branchially related” (or, in effect, entangled).

\n

Evaluating the expression f[f[0]+1] gives a more complicated graph, with two different instances of branchlike-separated events:

\n
\n
\n

\n

Extracting the multiway states graph we get

\n
\n
\n

\n

where now we have indicated “branchially connected” states by pink “branchial edges”. Pulling out only these branchial edges then gives the (rather trivial) branchial graph for this evaluation process:

\n
\n
\n

\n

There are many subtle things going on here, particularly related to the treelike structure of expressions. We’ve talked about separations between events: timelike, spacelike and branchlike. But what about separations between elements of an expression? In something like {f[0], f[0], f[0]} it’s reasonable to extend our characterization of separations between events, and say that the f[0]’s in the expression can themselves be considered spacelike separated. But what about in something like f[f[0]]? We can say that the f[_]’s here “overlap”—and “conflict” when they are transformed—making them branchlike separated. But the structure of the expression also inevitably makes them “treelike separated”. We’ll see later how to think about the relation between treelike-separated elements in more fundamental terms, ultimately using hypergraphs. But for now an obvious question is what in general the relation between branchlike-separated elements can be.

\n

And essentially the answer is that branchlike separation has to “come with” some other form of separation: spacelike, treelike, rulelike, etc. Rulelike separation involves having multiple rules for the same object (e.g. a rule as well as )—and we’ll talk about this later. With spacelike separation, we basically get branchlike separation when subexpressions “overlap”. This is fairly subtle for tree-structured expressions, but is much more straightforward for strings, and indeed we have discussed this case extensively in connection with our Physics Project.

\n

Consider the (rather trivial) string rewriting rule:

\n
\n
\n

\n

Applying this rule to AAAAAA we get:

\n
\n
\n

\n

Some of the events here are purely spacelike separated, but whenever the characters they involve overlap, they are also branchlike separated (as indicated by the dashed pink lines). Extracting the multiway states graph we get:

\n
\n
\n

\n

And now we get the following branchial graph:

\n
\n
\n

\n

So how can we see analogs in expression evaluation? It turns out that combinators provide a good example (and, yes, it’s quite remarkable that we’re using combinators here to help explain something—given that combinators almost always seem like the most obscure and difficult-to-explain things around). Define the standard S and K combinators:

\n
\n
\n

\n
\n
\n

\n

Now we have for example

\n
\n
\n

\n

where there are many spacelike-separated events, and a single pair of branchlike + treelike-separated ones. With a slightly more complicated initial expression, we get the rather messy result

\n
\n
\n

\n

now with many branchlike-separated states:

\n
\n
\n

\n

Rather than using the full standard S, K combinators, we can consider a simpler combinator definition:

\n
\n
\n

\n

Now we have for example

\n
\n
\n

\n

where the branchial graph is

\n
\n
\n

\n

and the multiway causal graph is:

\n
\n
\n

\n

The expression f[f[f][f]][f] gives a more complicated multiway graph

\n
\n
\n

\n

and branchial graph:

\n
\n
\n

\n

Interpretations, Analogies and the Concept of Multi

\n

Before we started talking about branchlike separation, the only kinds of separation we considered were timelike and spacelike. And in this case we were able to take the causal graphs we got, and set up foliations of them where each slice could be thought of as representing a sequential step in time. In effect, what we were doing was to aggregate things so that we could talk about what happens in “all of space” at a particular time.

\n

But when there’s branchlike separation we can no longer do this. Because now there isn’t a single, consistent “configuration of all of space” that can be thought of as evolving in a single thread through time. Rather, there are “multiple threads of history” that wind their way through the branchings (and mergings) that occur in the multiway graph. One can make foliations in the multiway graph—much like one does in the causal graph. (More strictly, one really needs to make the foliations in the multiway causal graph—but these can be “inherited” by the multiway graph.)

\n

In physics terms, the (single-way) causal graph can be thought of as a discrete version of ordinary spacetime—with a foliation of it specifying a “reference frame” that leads to a particular identification of what one considers space, and what time. But what about the multiway causal graph? In effect, we can imagine that it defines a new, branchial “direction”, in addition to the spatial direction. Projecting in this branchial direction, we can then think of getting a kind of branchial analog of spacetime that we can call branchtime. And when we construct the multiway graph, we can basically imagine that it’s a representation of branchtime.

\n

A particular slice of a foliation of the (single-way) causal graph can be thought of as corresponding to an “instantaneous state of (ordinary) space”. So what does a slice in a foliation of the multiway graph represent? It’s effectively a branchial or multiway combination of states—a collection of states that can somehow all exist “at the same time”. And in physics terms we can interpret it as a quantum superposition of states.

\n

But how does all this work in the context of expressions? The parts of a single expression like a + b + c + d or {a, b, c, d} can be thought of being spacelike separated, or in effect “laid out in space”. But what kind of a thing has parts that are “laid out in branchial space”? It’s a new kind of fundamentally multiway construct. We’re not going to explore it too much here, but in the Wolfram Language we might in future call it Multi. And just as {a, b, c, d} (or List[a, b, c, d]) can be thought of as representing a, b, c, d “laid out in space”, so now Multi[a, b, c, d] would represent a, b, c, d “laid out branchial space”.

\n

In ordinary evaluation, we just generate a specific sequence of individual expressions. But in multiway evaluation, we can imagine that we generate a sequence of Multi objects. In the examples we’ve seen so far, we always eventually get a Multi containing just a single expression. But we’ll soon find out that that’s not always how things work, and we can perfectly well end up with a Multi containing multiple expressions.

\n

So what might we do with a Multi? In a typical “nondeterministic computation” we probably want to ask: “Does the Multi contain some particular expression or pattern that we’re looking for?” If we imagine that we’re doing a “probabilistic computation” we might want to ask about the frequencies of different kinds of expressions in the Multi. And if we’re doing quantum computation with the normal formalism of quantum mechanics, we might want to tag the elements of the Multi with “quantum amplitudes” (that, yes, in our model presumably have magnitudes determined by path counting in the multiway graph, and phases representing the “positions of elements in branchial space”). And in a traditional quantum measurement, the concept would typically be to determine a projection of a Multi, or in effect an inner product of Multi objects. (And, yes, if one knows only that projection, it’s not going to be enough to let one unambiguously continue the “multiway computation”; the quantum state has in effect been “collapsed”.)

\n

Is There Always a Definite Result?

\n

For an expression like (1 + (2 + 2)) + (3 + 4) it doesn’t matter in what order one evaluates things; one always gets the same result—so that the corresponding multiway graph leads to just a single final state:

\n
\n
\n

\n

But it’s not always true that there’s a single final state. For example, with the definitions

\n
\n
\n

\n
\n
\n

\n

standard evaluation in the Wolfram Language gives the result 0 for f[f[0]] but the full multiway graph shows that (with a different evaluation order) it’s possible instead to get the result g[g[0]]:

\n
\n
\n

\n

And in general when a certain collection of rules (or definitions) always leads to just a single result, one says that the collection of rules is confluent; otherwise it’s not. Pure arithmetic turns out to be confluent. But there are plenty of examples (e.g. in string rewriting) that are not. Ultimately a failure of confluence must come from the presence of branchlike separation—or in effect a conflict between behavior on two different branches. And so in the example above we see that there are branchlike-separated “conflicting” events that never resolve—yielding two different final outcomes:

\n
\n
\n

\n

As an even simpler example, consider the definitions and . In the Wolfram Language these definitions immediately overwrite each other. But assume they could both be applied (say through explicit , rules). Then there’s a multiway graph with two “unresolved” branches—and two outcomes:

\n
\n
\n

\n

For string rewriting systems, it’s easy to enumerate possible rules. The rule

\n
\n
\n

\n

(that effectively sorts the elements in the string) is confluent:

\n
\n
\n

\n

But the rule

\n
\n
\n

\n

is not confluent

\n
\n
\n

\n

and “evaluates” BABABA to four distinct outcomes:

\n
\n
\n

\n

These are all cases where “internal conflicts” lead to multiple different final results. But another way to get different results is through “side effects”. Consider first setting x = 0 then evaluating {x = 1, x + 1}:

\n
\n
\n

\n

If the order of evaluation is such that x + 1 is evaluated before x = 1 it will give 1, otherwise it will give 2, leading to the two different outcomes {1, 1} and {1, 2}. In some ways this is like the example above where we had two distinct rules: and . But there’s a difference. While explicit rules are essentially applied only “instantaneously”, an assignment like x = 1 has a “permanent” effect, at least until it is “overwritten” by another assignment. In an evaluation graph like the one above we’re showing particular expressions generated during the evaluation process. But when there are assignments, there’s an additional “hidden state” that in the Wolfram Language one can think of as corresponding to the state of the global symbol table. If we included this, then we’d again see rules that apply “instantaneously”, and we’d be able to explicitly trace causal dependencies between events. But if we elide it, then we effectively hide the causal dependence that’s “carried” by the state of the symbol table, and the evaluation graphs we’ve been drawing are necessarily somewhat incomplete.

\n

Computations That Never End

\n

The basic operation of the Wolfram Language evaluator is to keep doing transformations until the result no longer changes (or, in other words, until a fixed point is reached). And that’s convenient for being able to “get a definite answer”. But it’s rather different from what one usually imagines happens in physics. Because in that case we’re typically dealing with things that just “keep progressing through time”, without ever getting to any fixed point. (“Spacetime singularities”, say in black holes, do for example involve reaching fixed points where “time has come to an end”.)

\n

But what happens in the Wolfram Language if we just type , without giving any value to ? The Wolfram Language evaluator will keep evaluating this, trying to reach a fixed point. But it’ll never get there. And in practice it’ll give a message, and (at least in Version 13.3 and above) return a TerminatedEvaluation object:

\n
\n
\n

\n

What’s going on inside here? If we look at the evaluation graph, we can see that it involves an infinite chain of evaluation events, that progressively “extrude” +1’s:

\n
\n
\n

\n

A slightly simpler case (that doesn’t raise questions about the evaluation of Plus) is to consider the definition

\n
\n
\n

\n

which has the effect of generating an infinite chain of progressively more “f-nested” expressions:

\n
\n
\n

\n

Let’s say we define two functions:

\n
\n
\n

\n
\n
\n

\n

Now we don’t just get a simple chain of results; instead we get an exponentially growing multiway graph:

\n
\n
\n

\n

In general, whenever we have a recursive definition (say of f in terms of f or x in terms of x) there’s the possibility of an infinite process of evaluation, with no “final fixed point”. There are of course specific cases of recursive definitions that always terminate—like the Fibonacci example we gave above. And indeed when we’re dealing with so-called “primitive recursion” this is how things inevitably work: we’re always “systematically counting down” to some defined base case (say f[1] = 1).

\n

When we look at string rewriting (or, for that matter, hypergraph rewriting), evolution that doesn’t terminate is quite ubiquitous. And in direct analogy with, for example, the string rewriting rule ABBB, BBA we can set up the definitions

\n
\n
\n

\n
\n
\n

\n

and then the (infinite) multiway graph begins:

\n
\n
\n

\n

One might think that the possibility of evaluation processes that don’t terminate would be a fundamental problem for a system set up like the Wolfram Language. But it turns out that in current normal usage one basically never runs into the issue except by mistake, when there’s a bug in one’s program.

\n

Still, if one explicitly wants to generate an infinite evaluation structure, it’s not hard to do so. Beyond one can define

\n
\n
\n

\n

and then one gets the multiway graph

\n
\n
\n

\n

which has CatalanNumber[t] (or asymptotically ~4t) states at layer t.

\n

Another “common bug” form of non-terminating evaluation arises when one makes a primitive-recursion-style definition without giving a “boundary condition”. Here, for example, is the Fibonacci recursion without f[0] and f[1] defined:

\n
\n
\n

\n

And in this case the multiway graph is infinite

\n
\n
\n

\n

with ~2t states at layer t.

\n

But consider now the “unterminated factorial recursion”

\n
\n
\n

\n

On its own, this just leads to a single infinite chain of evaluation

\n
\n
\n

\n

but if we add the explicit rule that multiplying anything by zero gives zero (i.e. 0 _ → 0) then we get

\n
\n
\n

\n

in which there’s a “zero sink” in addition to an infinite chain of f[–n] evaluations.

\n

Some definitions have the property that they provably always terminate, though it may take a while. An example is the combinator definition we made above:

\n
\n
\n

\n

Here’s the multiway graph starting with f[f[f][f]][f], and terminating in at most 10 steps:

\n
\n
\n

\n

Starting with f[f[f][f][f][f]][f] the multiway graph becomes

\n
\n
\n

\n

but again the evaluation always terminates (and gives a unique result). In this case we can see why this happens: at each step f[x_][y_] effectively “discards ”, thereby “fundamentally getting smaller”, even as it “puffs up” by making three copies of .

\n

But if instead one uses the definition

\n
\n
\n

\n

things get more complicated. In some cases, the multiway evaluation always terminates

\n
\n
\n

\n

while in others, it never terminates:

\n
\n
\n

\n

But then there are cases where there is sometimes termination, and sometimes not:

\n
\n
\n

\n

In this particular case, what’s happening is that evaluation of the first argument of the “top-level f” never terminates, but if the top-level f is evaluated before its arguments then there’s immediate termination. Since the standard Wolfram Language evaluator evaluates arguments first (“leftmost-innermost evaluation”), it therefore won’t terminate in this case—even though there are branches in the multiway evaluation (corresponding to “outermost evaluation”) that do terminate.

\n

Transfinite Evaluation

\n

If a computation reaches a fixed point, we can reasonably say that that’s the “result” of the computation. But what if the computation goes on forever? Might there still be some “symbolic” way to represent what happens—that for example allows one to compare results from different infinite computations?

\n

In the case of ordinary numbers, we know that we can define a “symbolic infinity” ∞ (Infinity in Wolfram Language) that represents an infinite number and has all the obvious basic arithmetic properties:

\n
\n
\n

\n

But what about infinite processes, or, more specifically, infinite multiway graphs? Is there some useful symbolic way to represent such things? Yes, they’re all “infinite”. But somehow we’d like to distinguish between infinite graphs of different forms, say:

\n
\n
\n

\n

And already for integers, it’s been known for more than a century that there’s a more detailed way to characterize infinities than just referring to them all as ∞: it’s to use the idea of transfinite numbers. And in our case we can imagine successively numbering the nodes in a multiway graph, and seeing what the largest number we reach is. For an infinite graph of the form

\n
\n
\n

\n

(obtained say from x = x + 1 or x = {x}) we can label the nodes with successive integers, and we can say that the “largest number reached” is the transfinite ordinal ω.

\n

A graph consisting of two infinite chains is then characterized by 2ω, while an infinite 2D grid is characterized by ω2, and an infinite binary tree is characterized by 2ω.

\n

What about larger numbers? To get to ωω we can use a rule like

\n
\n
\n

\n

that effectively yields a multiway graph that corresponds to a tree in which successive layers have progressively larger numbers of branches:

\n
\n
\n

\n

One can think of a definition like x = x + 1 as setting up a “self-referential data structure”, whose specification is finite (in this case essentially a loop), and where the infinite evaluation process arises only when one tries to get an explicit value out of the structure. More elaborate recursive definitions can’t, however, readily be thought of as setting up straightforward self-referential data structures. But they still seem able to be characterized by transfinite numbers.

\n

In general many multiway graphs that differ in detail will be associated with a given transfinite number. But the expectation is that transfinite numbers can potentially provide robust characterizations of infinite evaluation processes, with different constructions of the “same evaluation” able to be identified as being associated with the same canonical transfinite number.

\n

Most likely, definitions purely involving pattern matching won’t be able to generate infinite evaluations beyond ε0 = ωωω...—which is also the limit of where one can reach with proofs based on ordinary induction, Peano Arithmetic, etc. It’s perfectly possible to go further—but one needs to explicitly use functions like NestWhile etc. in the definitions that are given.

\n

And there’s another issue as well: given a particular set of definitions, there’s no limit to how difficult it can be to determine the ultimate multiway graph that’ll be produced. In the end this is a consequence of computational irreducibility, and of the undecidability of the halting problem, etc. And what one can expect in the end is that some infinite evaluation processes one will be able to prove can be characterized by particular transfinite numbers, but others one won’t be able to “tie down” in this way—and in general, as computational irreducibility might suggest, won’t ever allow one to give a “finite symbolic summary”.

\n

The Question of the Observer

\n

One of the key lessons of our Physics Project is the importance of the character of the observer in determining what one “takes away” from a given underlying system. And in setting up the evaluation process—say in the Wolfram Language—the typical objective is to align with the way human observers expect to operate. And so, for example, one normally expects that one will give an expression as input, then in the end get an expression as output. The process of transforming input to output is analogous to the doing of a calculation, the answering of a question, the making of a decision, the forming of a response in human dialog, and potentially the forming of a thought in our minds. In all of these cases, we treat there as being a certain “static” output.

\n

It’s very different from the way physics operates, because in physics “time always goes on”: there’s (essentially) always another step of computation to be done. In our usual description of evaluation, we talk about “reaching a fixed point”. But an alternative would be to say that we reach a state that just repeats unchanged forever—but we as observers equivalence all those repeats, and think of it as having reached a single, unchanging state.

\n

Any modern practical computer also fundamentally works much more like physics: there are always computational operations going on—even though those operations may end up, say, continually putting the exact same pixel in the same place on the screen, so that we can “summarize” what’s going on by saying that we’ve reached a fixed point.

\n

There’s much that can be done with computations that reach fixed points, or, equivalently with functions that return definite values. And in particular it’s straightforward to compose such computations or functions, continually taking output and then feeding it in as input. But there’s a whole world of other possibilities that open up once one can deal with infinite computations. As a practical matter, one can treat such computations “lazily”—representing them as purely symbolic objects from which one can derive particular results if one explicitly asks to do so.

\n

One kind of result might be of the type typical in logic programming or automated theorem proving: given a potentially infinite computation, is it ever possible to reach a specified state (and, if so, what is the path to do so)? Another type of result might involve extracting a particular “time slice” (with some choice of foliation), and in general representing the result as a Multi. And still another type of result (reminiscent of “probabilistic programming”) might involve not giving an explicit Multi, but rather computing certain statistics about it.

\n

And in a sense, each of these different kinds of results can be thought of as what’s extracted by a different kind of observer, who is making different kinds of equivalences.

\n

We have a certain typical experience of the physical world that’s determined by features of us as observers. For example, as we mentioned above, we tend to think of “all of space” progressing “together” through successive moments of time. And the reason we think this is that the regions of space we typically see around us are small enough that the speed of light delivers information on them to us in a time that’s short compared to our “brain processing time”. If we were bigger or faster, then we wouldn’t be able to think of what’s happening in all of space as being “simultaneous” and we’d immediately be thrust into issues of relativity, reference frames, etc.

\n

And in the case of expression evaluation, it’s very much the same kind of thing. If we have an expression laid out in computer memory (or across a network of computers), then there’ll be a certain time to “collect information spatially from across the expression”, and a certain time that can be attributed to each update event. And the essence of array programming (and much of the operation of GPUs) is that one can assume—like in the typical human experience of physical space—that “all of space” is being updated “together”.

\n

But in our analysis above, we haven’t assumed this, and instead we’ve drawn causal graphs that explicitly trace dependencies between events, and show which events can be considered to be spacelike separated, so that they can be treated as “simultaneous”.

\n

We’ve also seen branchlike separation. In the physics case, the assumption is that we as observers sample in an aggregated way across extended regions in branchial space—just as we do across extended regions in physical space. And indeed the expectation is that we encounter what we describe as “quantum effects” precisely because we are of limited extent in branchial space.

\n

In the case of expression evaluation, we’re not used to being extended in branchial space. We typically imagine that we’ll follow some particular evaluation path (say, as defined by the standard Wolfram Language evaluator), and be oblivious to other paths. But, for example, strategies like speculative execution (typically applied at the hardware level) can be thought of as representing extension in branchial space.

\n

And at a theoretical level, one certainly thinks of different kinds of “observations” in branchial space. In particular, there’s nondeterministic computation, in which one tries to identify a particular “thread of history” that reaches a given state, or a state with some property one wants.

\n

One crucial feature of observers like us is that we are computationally bounded—which puts limitations on the kinds of observations we can make. And for example computational irreducibility then limits what we can immediately know (and aggregate) about the evolution of systems through time. And similarly multicomputational irreducibility limits what we can immediately know (and aggregate) about how systems behave across branchial space. And insofar as any computational devices we build in practice must be ones that we as observers can deal with, it’s inevitable that they’ll be subject to these kinds of limitations. (And, yes, in talking about quantum computers there tends to be an implicit assumption that we can in effect overcome multicomputational irreducibility, and “knit together” all the different computational paths of history—but it seems implausible that observers like us can actually do this, or can in general derive definite results without expending computationally irreducible effort.)

\n

One further small comment about observers concerns what in physics are called closed timelike curves—essentially loops in time. Consider the definition:

\n
\n
\n

\n

This gives for example the multiway graph:

\n
\n
\n

\n

One can think of this as connecting the future to the past—something that’s sometimes interpreted as “allowing time travel”. But really this is just a more (time-)distributed version of a fixed point. In a fixed point, a single state is constantly repeated. Here a sequence of states (just two in the example given here) get visited repeatedly. The observer could treat these states as continually repeating in a cycle, or could coarse grain and conclude that “nothing perceptible is changing”.

\n

In spacetime we think of observers as making particular choices of simultaneity surfaces—or in effect picking particular ways to “parse” the causal graph of events. In branchtime the analog of this is that observers pick how to parse the multiway graph. Or, put another way, observers get to choose a path through the multiway graph, corresponding to a particular evaluation order or evaluation scheme. In general, there is a tradeoff between the choices made by the observer, and the behavior generated by applying the rules of the system.

\n

But if the observer is computationally bounded, they cannot overcome the computational irreducibility—or multicomputational irreducibility—of the behavior of the system. And as a result, if there is complexity in the detailed behavior of the system, the observer will not be able to avoid it at a detailed level by the choices they make. Though a critical idea of our Physics Project is that by appropriate aggregation, the observer will detect certain aggregate features of the system, that have robust characteristics independent of the underlying details. In physics, this represents a bulk theory suitable for the perception of the universe by observers like us. And presumably there is an analog of this in expression evaluation. But insofar as we’re only looking at the evaluation of expressions we’ve engineered for particular computational purposes, we’re not yet used to seeing “generic bulk expression evaluation”.

\n

But this is exactly what we’ll see if we just go out and run “arbitrary programs”, say found by enumerating certain classes of programs (like combinators or multiway Turing machines). And for observers like us these will inevitably “seem very much like physics”.

\n

The Tree Structure of Expressions

\n

Although we haven’t talked about this so far, any expression fundamentally has a tree structure. So, for example, (1 + (2 + 2)) + (3 + 4) is represented—say internally in the Wolfram Language—as the tree:

\n
\n
\n

\n

So how does this tree structure interact with the process of evaluation? In practice it means for example that in the standard Wolfram Language evaluator there are two different kinds of recursion going on. The first is the progressive (“timelike”) reevaluation of subexpressions that change during evaluation. And the second is the (“spacelike” or “treelike”) scanning of the tree.

\n

In what we’ve discussed above, we’ve focused on evaluation events and their relationships, and in doing so we’ve concentrated on the first kind of recursion—and indeed we’ve often elided some of the effects of the second kind by, for example, immediately showing the result of evaluating Plus[2, 2] without showing more details of how this happens.

\n

But here now is a more complete representation of what’s going on in evaluating this simple expression:

\n
\n
\n

\n

The solid gray lines in this “trace graph” indicate the subparts of the expression tree at each step. The dashed gray lines indicate how these subparts are combined to make expressions. And the red lines indicate actual evaluation events where rules (either built in or specified by definitions) are applied to expressions.

\n

It’s possible to read off things like causal dependence between events from the trace graph. But there’s a lot else going on. Much of it is at some level irrelevant—because it involves recursing into parts of the expression tree (like the head Plus) where no evaluation events occur. Removing these parts we then get an elided trace graph in which for example the causal dependence is clearer:

\n
\n
\n

\n

Here’s the trace graph for the evaluation of f[5] with the standard recursive Fibonacci definition

\n
\n
\n

\n

and here’s its elided form:

\n
\n
\n

\n

At least when we discussed single-way evaluation above, we mostly talked about timelike and spacelike relations between events. But with tree-structured expressions there are also treelike relations.

\n

Consider the rather trivial definition

\n
\n
\n

\n

and look at the multiway graph for the evaluation of f[f[0]]:

\n
\n
\n

\n

What is the relation between the event on the left branch, and the top event on the right branch? We can think of them as being treelike separated. The event on the left branch transforms the whole expression tree. But the event on the right branch just transforms a subexpression.

\n

Spacelike-separated events affect disjoint parts in an expression (i.e. ones on distinct branches of the expression tree). But treelike-separated events affect nested parts of an expression (i.e. ones that appear on a single branch in the expression tree). Inevitably, treelike-separated events also have a kind of one-way branchlike separation: if the “higher event” in the tree happens, the “lower one” cannot.

\n

In terms of Wolfram Language part numbers, spacelike-separated events affect parts with disjoint numbers, say {2, 5} and {2, 8}. But treelike-separated events affect parts with overlapping sequences of part numbers, say {2} and {2, 5} or {2, 5} and {2, 5, 1}.

\n

In our Physics Project there’s nothing quite like treelike relations built in. The “atoms of space” are related by a hypergraph—without any kind of explicit hierarchical structure. The hypergraph can take on what amounts to a hierarchical structure, but the fundamental transformation rules won’t intrinsically take account of this.

\n

The hierarchical structure of expressions is incredibly important in their practical use—where it presumably leverages the hierarchical structure of human language, and of ways we talk about the world:

\n
\n
\n

\n

We’ll see soon below that we can in principle represent expressions without having hierarchical structure explicitly built in. But in almost all uses of expressions—say in Wolfram Language—we end up needing to have hierarchical structure.

\n

If we were only doing single-way evaluation the hierarchical structure of expressions would be important in determining the order of evaluation to be used, but it wouldn’t immediately enmesh with core features of the evaluation process. But in multiway evaluation “higher” treelike-separated events can in effect cut off the evaluation histories of “lower” ones—and so it’s inevitably central to the evaluation process. For spacelike- and branchlike-separated events, we can always choose different reference frames (or different spacelike or branchlike surfaces) that arrange the events differently. But treelike-separated events—a little like timelike-separated ones—have a certain forced relationship that cannot be affected by an observer’s choices.

\n

Grinding Everything Down to Hypergraphs

\n

To draw causal graphs—and in fact to do a lot of what we’ve done here—we need to know “what depends on what”. And with our normal setup for expressions this can be quite subtle and complicated. We apply the rule to to give the result . But does the a that “comes out” depend on the a that went in, or is it somehow something that’s “independently generated”? Or, more extremely, in a transformation like , to what extent is it “the same 1” that goes in and comes out? And how do these issues of dependence work when there are the kinds of treelike relations discussed in the previous section?

\n

The Wolfram Language evaluator defines how expressions should be evaluated—but doesn’t immediately specify anything about dependencies. Often we can look “after the fact” and deduce what “was involved” and what was not—and thus what should be considered to depend on what. But it’s not uncommon for it to be hard to know what to say—forcing one to make what seem likely arbitrary decisions. So is there any way to avoid this, and to set things up so that dependency becomes somehow “obvious”?

\n

It turns out that there is—though, perhaps not surprisingly, it comes with difficulties of its own. But the basic idea is to go “below expressions”, and to “grind everything down” to hypergraphs whose nodes are ultimate direct “carriers” of identity and dependency. It’s all deeply reminiscent of our Physics Project—and its generalization in the ruliad. Though in those cases the individual elements (or “emes” as we call them) exist far below the level of human perception, while in the hypergraphs we construct for expressions, things like symbols and numbers appear directly as emes.

\n

So how can we “compile” arbitrary expressions to hypergraphs? In the Wolfram Language something like a + b + c is the “full-form” expression

\n
\n
\n

\n

which corresponds to the tree:

\n
\n
\n

\n

And the point is that we can represent this tree by a hypergraph:

\n
\n
\n

\n

Plus, a, b and c appear directly as “content nodes” in the hypergraph. But there are also “infrastructure nodes” (here labeled with integers) that specify how the different pieces of content are “related”—here with a 5-fold hyperedge representing Plus with three arguments. We can write this hypergraph out in “symbolic form” as:

\n
\n
\n

\n

Let’s say instead we have the expression or Plus[a, Plus[b, c]], which corresponds to the tree:

\n
\n
\n

\n

We can represent this expression by the hypergraph

\n
\n
\n

\n

which can be rendered visually as:

\n
\n
\n

\n

What does evaluation do to such hypergraphs? Essentially it must transform collections of hyperedges into other collections of hyperedges. So, for example, when x_ + y_ is evaluated, it transforms a set of 3 hyperedges to a single hyperedge according to the rule:

\n
\n
\n

\n

(Here the list on the left-hand side represents three hyperedges in any order—and so is effectively assumed to be orderless.) In this rule, the literal Plus acts as a kind of key to determine what should happen, while the specific patterns define how the input and output expressions should be “knitted together”.

\n

So now let’s apply this rule to the expression 10 + (20 + 30). The expression corresponds to the hypergraph

\n
\n
\n

\n

where, yes, there are integers both as content elements, and as labels or IDs for “infrastructure nodes”. The rule operates on collections of hyperedges, always consuming 3 hyperedges, and generating 1. We can think of the hyperedges as “fundamental tokens”. And now we can draw a token-event graph to represent the evaluation process:

\n
\n
\n

\n

Here’s the slightly more complicated case of (10 + (20 + 20)) + (30 + 40):

\n
\n
\n

\n

But here now is the critical point. By looking at whether there are emes in common from one event to another, we can determine whether there is dependency between those events. Emes are in a sense “atoms of existence” that maintain a definite identity, and immediately allow one to trace dependency.

\n

So now we can fill in causal edges, with each edge labeled by the emes it “carries”:

\n
\n
\n

\n

Dropping the hyperedges, and adding in an initial “Big Bang” event, we get the (multiway) causal graph:

\n
\n
\n

\n

We should note that in the token-event graph, each expression has been “shattered” into its constituent hyperedges. Assembling the tokens into recognizable expressions effectively involves setting up a particular foliation of the token-event graph. But if we do this, we get a multiway graph expressed in terms of hypergraphs

\n
\n
\n

\n

or in visual form:

\n
\n
\n

\n

As a slightly more complicated case, consider the recursive computation of the Fibonacci number f[2]. Here is the token-event graph in this case:

\n
\n
\n

\n

And here is the corresponding multiway causal graph, labeled with the emes that “carry causality”:

\n
\n
\n

\n

Every kind of expression can be “ground down” in some way to hypergraphs. For strings, for example, it’s convenient to make a separate token out of every character, so that “ABBAAA” can be represented as:

\n
\n
\n

\n

It’s interesting to note that our hypergraph setup can have a certain similarity to machine-level representations of expressions, with every eme in effect corresponding to a pointer to a certain memory location. Thus, for example, in the representation of the string, the infrastructure emes define the pointer structure for a linked list—with the content emes being the “payloads” (and pointing to globally shared locations, like ones for A and B).

\n

Transformations obtained by applying rules can then be thought of as corresponding just to rearranging pointers. Sometimes “new emes” have to be created, corresponding to new memory being allocated. We don’t have an explicit way to “free” memory. But sometimes some part of the hypergraph will become disconnected—and one can then imagine disconnected pieces to which the observer is not attached being garbage collected.

\n

The Rulial Case

\n

So far we’ve discussed what happens in the evaluation of particular expressions according to particular rules (where those rules could just be all the ones that are built into Wolfram Language). But the concept of the ruliad suggests thinking about all possible computations—or, in our terms here, all possible evaluations. Instead of particular expressions, we are led to think about evaluating all possible expressions. And we are also led to think about using all possible rules for these evaluations.

\n

As one simple approach to this, instead of looking, for example, at a single combinator definition such as

\n
\n
\n

\n

used to evaluate a single expression such as

\n
\n
\n

\n

we can start enumerating all possible combinator rules

\n
\n
\n

\n

and apply them to evaluate all possible expressions:

\n
\n
\n

\n

Various new phenomena show up here. For example, there is now immediately the possibility of not just spacelike and branchlike separation, but also what we can call rulelike separation.

\n

In a trivial case, we could have rules like

\n
\n
\n

\n

and then evaluating x will lead to two events which we can consider rulelike separated:

\n
\n
\n

\n

In the standard Wolfram Language system, the definitions and x = b would overwrite each other. But if we consider rulial multiway evaluation, we’d have branches for each of these definitions.

\n

In what we’ve discussed before, we effectively allow evaluation to take infinite time, as well as infinite space and infinite branchial space. But now we’ve got the new concept of infinite rulial space. We might say from the outset that, for example, we’re going to use all possible rules. Or we might have what amounts to a dynamical process that generates possible rules.

\n

And the key point is that as soon as that process is in effect computation universal, there is a way to translate from one instance of it to another. Different specific choices will lead to a different basis—but in the end they’ll all eventually generate the full ruliad.

\n

And actually, this is where the whole concept of expression evaluation ultimately merges with fundamental physics. Because in both cases, the limit of what we’re doing will be exactly the same: the full ruliad.

\n

The Practical Computing Story

\n

The formalism we’ve discussed here—and particularly its correspondence with fundamental physics—is in many ways a new story. But it has precursors that go back more than a century. And indeed as soon as industrial processes—and production lines—began to be formalized, it became important to understand interdependencies between different parts of a process. By the 1920s flowcharts had been invented, and when digital computers were developed in the 1940s they began to be used to represent the “flow” of programs (and in fact Babbage had used something similar even in the 1840s). At first, at least as far as programming was concerned, it was all about the “flow of control”—and the sequence in which things should be done. But by the 1970s the notion of the “flow of data” was also widespread—in some ways reflecting back to actual flow of electrical signals. In some simple cases various forms of “visual programming”—typically based on connecting virtual wires—have been popular. And even in modern times, it’s not uncommon to talk about “computation graphs” as a way to specify how data should be routed in a computation, for example in sequences of operations on tensors (say for neural net applications).

\n

A different tradition—originating in mathematics in the late 1800s—involved the routine use of “abstract functions” like f(x). Such abstract functions could be used both “symbolically” to represent things, and explicitly to “compute” things. All sorts of (often ornate) formalism was developed in mathematical logic, with combinators arriving in 1920, and lambda calculus in 1935. By the late 1950s there was LISP, and by the 1970s there was a definite tradition of “functional programming” involving the processing of things by successive application of different functions.

\n

The question of what really depended on what became more significant whenever there was the possibility of doing computations in parallel. This was already being discussed in the 1960s, but became more popular in the early 1980s, and in a sense finally “went mainstream” with GPUs in the 2010s. And indeed our discussion of causal graphs and spacelike separation isn’t far away from the kind of thing that’s often discussed in the context of designing parallel algorithms and hardware. But one difference is that in those cases one’s usually imagining having a “static” flow of data and control, whereas here we’re routinely considering causal graphs, etc. that are being created “on the fly” by the actual progress of a computation.

\n

In many situations—with both algorithms and hardware—one has precise control over when different “events” will occur. But in distributed systems it’s also common for events to be asynchronous. And in such cases, it’s possible to have “conflicts”, “race conditions”, etc. that correspond to branchlike separation. There have been various attempts—many originating in the 1970s—to develop formal “process calculi” to describe such systems. And in some ways what we’re doing here can be seen as a physics-inspired way to clarify and extend these kinds of approaches.

\n

The concept of multiway systems also has a long history—notably appearing in the early 1900s in connection with game graphs, formal group theory and various problems in combinatorics. Later, multiway systems would implicitly show up in considerations of automated theorem proving and nondeterministic computation. In practical microprocessors it’s been common for a decade or so to do “speculative execution” where multiple branches in code are preemptively followed, keeping only the one that’s relevant given actual input received.

\n

And when it comes to branchlike separation, a notable practical example arises in version control and collaborative editing systems. If a piece of text has changes at two separated places (“spacelike separation”), then these changes (“diffs”) can be applied in any order. But if these changes involve the same content (e.g. same characters) then there can be a conflict (“merge conflict”) if one tries to apply the changes—in effect reflecting the fact that these changes were made by branchlike-separated “change events” (and to trace them requires creating different “forks” or what we might call different histories).

\n

It’s perhaps worth mentioning that as soon as one has the concept of an “expression” one is led to the concept of “evaluation”—and as we’ve seen many times here, that’s even true for arithmetic expressions, like 1 + (2 + 3). We’ve been particularly concerned with questions about “what depends on what” in the process of evaluation. But in practice there’s often also the question of when evaluation happens. The Wolfram Language, for example, distinguishes between “immediate evaluation” done when a definition is made, and “delayed evaluation” done when it’s used. There’s also lazy evaluation where what’s immediately generated is a symbolic representation of the computation to be done—with steps or pieces being explicitly computed only later, when they are requested.

\n

But what really is “evaluation”? If our “input expression” is 1 + 1, we typically think of this as “defining a computation that can be done”. Then the idea of the “process of evaluation” is that it does that computation, deriving a final “value”, here 2. And one view of the Wolfram Language is that its whole goal is to set up a collection of transformations that do as many computations that we know how to do as possible. Some of those transformations effectively incorporate “factual knowledge” (like knowledge of mathematics, or chemistry, or geography). But some are more abstract, like transformations defining how to do transformations, say on patterns.

\n

These abstract transformations are in a sense the easiest to trace—and often above that’s what we’ve concentrated on. But usually we’ve allowed ourselves to do at least some transformations—like adding numbers—that are built into the “insides” of the Wolfram Language. It’s perhaps worth mentioning that in conveniently representing such a broad range of computational processes the Wolfram Language ends up having some quite elaborate evaluation mechanisms. A common example is the idea of functions that “hold their arguments”, evaluating them only as “specifically requested” by the innards of the function. Another—that in effect creates a “side chain” to causal graphs—are conditions (e.g. associated with /;) that need to be evaluated to determine whether patterns are supposed to match.

\n

Evaluation is in a sense the central operation in the Wolfram Language. And what we’ve seen here is that it has a deep correspondence with what we can view as the “central operation” of physics: the passage of time. Thinking in terms of physics helps organize our thinking about the process of evaluation—and it also suggests some important generalizations, like multiway evaluation. And one of the challenges for the future is to see how to take such generalizations and “package” them as part of our computational language in a form that we humans can readily understand and make use of.

\n

Some Personal History: Recursion Control in SMP

\n

It was in late 1979 that I first started to design my SMP (“Symbolic Manipulation Program”) system. I’d studied both practical computer systems and ideas from mathematical logic. And one of my conclusions was that any definition you made should always get used, whenever it could. If you set , then you set , you should get (not ) if you asked for . It’s what most people would expect should happen. But like almost all fundamental design decisions, in addition to its many benefits, it had some unexpected consequences. For example, it meant that if you set without having given a value for , you’d in principle get an infinite loop.

\n

Back in 1980 there were computer scientists who asserted that this meant the “infinite evaluation” I’d built into the core of SMP “could never work”. Four decades of experience tells us rather definitively that in practice they were wrong about this (essentially because people just don’t end up “falling into the pothole” when they’re doing actual computations they want to do). But questions like those around made me particularly aware of issues around recursive evaluation. And it bothered me that a recursive factorial definition like f[n_]:=n f[n–1] (the rather less elegant SMP notation was f[$n]::$n f[$1-1]) might just run infinitely if it didn’t have a base case (f[1] = 1), rather than terminating with the value 0, which it “obviously should have”, given that at some point one’s computing 0×….

\n

So in SMP I invented a rather elaborate scheme for recursion control that “solved” this problem. And here’s what happens in SMP (now running on a reconstructed virtual machine):

\n

SMP code

\n

And, yes, if one includes the usual base case for factorial, one gets the usual answer:

\n

SMP code

\n

So what is going on here? Section 3.1 of the SMP documentation in principle tells the story. In SMP I used the term “simplification” for what I’d now call “evaluation”, both because I imagined that most transformations one wanted would make things “simpler” (as in ), and because there was a nice pun between the name SMP and the function Smp that carried out the core operation of the system (yes, SMP rather foolishly used short names for built-in functions). Also, it’s useful to know that in SMP I called an ordinary expression like f[x, y, …] a “projection”: its “head” f was called its “projector”, and its arguments x, y, … were called “filters”.

\n

As the Version 1.0 documentation from July 1981 tells it, “simplification” proceeds like this:

\n

Click to enlarge

\n

By the next year, it was a bit more sophisticated, though the default behavior didn’t change:

\n

Click to enlarge

\n

With the definitions above, the value of f itself was (compare Association in Wolfram Language):

\n

SMP code

\n

But the key to evaluation without the base case actually came in the “properties” of multiplication:

\n

SMP code

\n

In SMP True was (foolishly) 1. It’s notable here that Flat corresponds to the attribute Flat in Wolfram Language, Comm to Orderless and Ldist to Listable. (Sys indicated that this was a built-in system function, while Tier dealt with weird consequences of the attempted unification of arrays and functions into an association-like construct.) But the critical property here was Smp. By default its value was Inf (for Infinity). But for Mult (Times) it was 1.

\n

And what this did was to tell the SMP evaluator that inside any multiplication, it should allow a function (like f) to be called recursively at most once before the actual multiplication was done. Telling SMP to trace the evaluation of f[5] we then see:

\n

SMP code

\n

So what’s going on here? The first time f appears inside a multiplication its definition is used. But when f appears recursively a second time, it’s effectively frozen—and the multiplication is done using its frozen form, with the result that as soon as a 0 appears, one just ends up with 0.

\n

Reset the Smp property of Mult to infinity, and the evaluation runs away, eventually producing a rather indecorous crash:

\n

SMP code

\n

In effect, the Smp property defines how many recursive evaluations of arguments should be done before a function itself is evaluated. Setting the Smp property to 0 has essentially the same effect as the HoldAll attribute in Wolfram Language: it prevents arguments from being evaluated until a function as a whole is evaluated. Setting Smp to value k basically tells SMP to do only k levels of “depth-first” evaluation before collecting everything together to do a “breadth-first evaluation”.

\n

Let’s look at this for a recursive definition of Fibonacci numbers:

\n

SMP code

\n

With the Smp property of Plus set to infinity, the sequence of evaluations of f follows a pure “depth-first” pattern

\n

SMP code

\n

where we can plot the sequence of f[n] evaluated as:

\n
\n
\n

\n

But with the default setting of 1 for the Smp property of Plus the sequence is different

\n

SMP code

\n

and now the sequence of f[n] evaluated is:

\n
\n
\n

\n

In the pure depth-first case all the exponentially many leaves of the Fibonacci tree are explicitly evaluated. But now the evaluation of f[n] is being frozen after each step and terms are being collected and combined. Starting for example from f[10] we get f[9]+f[8]. And evaluating another step we get f[8]+f[7]+f[7]+f[6]. But now the f[7]’s can be combined into f[8]+2f[7]+f[6] so that they don’t both have to separately be evaluated. And in the end only quadratically many separate evaluations are needed to get the final result.

\n

I don’t now remember quite why I put it in, but SMP also had another piece of recursion control: the Rec property of a symbol—which basically meant “it’s OK for this symbol to appear recursively; don’t count it when you’re trying to work out whether to freeze an evaluation”.

\n

And it’s worth mentioning that SMP also had a way to handle the original issue:

\n

Click to enlarge

\n

It wasn’t a terribly general mechanism, but at least it worked in this case:

\n

SMP code

\n

I always thought that SMP’s “wait and combine terms before recursing” behavior was quite clever, but beyond the factorial and Fibonacci examples here I’m not sure I ever found clear uses for it. Still, with our current physics-inspired way of looking at things, we can see that this behavior basically corresponded to picking a “more spacetime-like” foliation of the evaluation graph.

\n

And it’s a piece of personal irony that right around the time I was trying to figure out recursive evaluation in SMP, I was also working on gauge theories in physics—which in the end involve very much the same kinds of issues. But it took another four decades—and the development of our Physics Project—before I saw the fundamental connection between these things.

\n

After SMP: Further Personal History

\n

The idea of parallel computation was one that I was already thinking about at the very beginning of the 1980s—partly at a theoretical level for things like neural nets and cellular automata, and partly at a practical level for SMP (and indeed by 1982 I had described a Ser property in SMP that was supposed to ensure that the arguments of a particular function would always get evaluated in a definite order “in series”). Then in 1984 I was involved in trying to design a general language for parallel computation on the Connection Machine “massively parallel” computer. The “obvious” approach was just to assume that programs would be set up to operate in steps, even if at each step many different operations might happen in parallel. But I somehow thought that there must be a better approach, somehow based on graphs, and graph rewriting. But back then I didn’t, for example, think of formulating things in terms of causal graphs. And while I knew about phenomena like race conditions, I hadn’t yet internalized the idea of constructing multiway graphs to “represent all possibilities”.

\n

When I started designing Mathematica—and what’s now the Wolfram Language—in 1986, I used the same core idea of transformation rules for symbolic expressions that was the basis for SMP. But I was able to greatly streamline the way expressions and their evaluation worked. And not knowing compelling use cases, I decided not to set up the kind of elaborate recursion control that was in SMP, and instead just to concentrate on basically two cases: functions with ordinary (essentially leftmost-innermost) evaluation and functions with held-argument (essentially outermost) evaluation. And I have to say that in three decades of usages and practical applications I haven’t really missed having more elaborate recursion controls.

\n

In working on A New Kind of Science in the 1990s, issues of evaluation order first came up in connection with “symbolic systems” (essentially, generalized combinators). They then came up more poignantly when I explored the possible computational “infrastructure” for spacetime—and indeed that was where I first started explicitly discussing and constructing causal graphs.

\n

But it was not until 2019 and early 2020, with the development of our Physics Project, that clear concepts of spacelike and branchlike separation for events emerged. The correspondence with expression evaluation got clearer in December 2020 when—in connection with the centenary of their invention—I did an extensive investigation of combinators (leading to my book Combinators). And as I started to explore the general concept of multicomputation, and its many potential applications, I soon saw the need for systematic ways to think about multicomputational evaluation in the context of symbolic language and symbolic expressions.

\n

In both SMP and Wolfram Language the main idea is to “get results”. But particularly for debugging it’s always been of interest to see some kind of trace of how the results are obtained. In SMP—as we saw above—there was a Trace property that would cause any evaluation associated with a particular symbol to be printed. But what about an actual computable representation of the “trace”? In 1990 we introduced the function Trace in the Wolfram Language—which produces what amounts to a symbolic representation of an evaluation process.

\n

I had high hopes for Trace—and for its ability to turn things like control flows into structures amenable to direct manipulation. But somehow what Trace produces is almost always too difficult to understand in real cases. And for many years I kept the problem of “making a better Trace” on my to-do list, though without much progress.

\n

The problem of “exposing a process of computation” is quite like the problem of presenting a proof. And in 2000 I had occasion to use automated theorem proving to produce a long proof of my minimal axiom system for Boolean algebra. We wanted to introduce such methods into Mathematica (or what’s now the Wolfram Language). But we were stuck on the question of how to represent proofs—and in 2007 we ended up integrating just the “answer” part of the methods into the function FullSimplify.

\n

By the 2010s we’d had the experience of producing step-by-step explanations in Wolfram|Alpha, as well as exploring proofs in the context of representing pure-mathematical knowledge. And finally in 2018 we introduced FindEquationalProof, which provided a symbolic representation of proofs—at least ones based on successive pattern matching and substitution—as well as a graphical representation of the relationships between lemmas.

\n

After the arrival of our Physics Project—as well as my exploration of combinators—I returned to questions about the foundations of mathematics and developed a whole “physicalization of metamathematics” based on tracing what amount to multiway networks of proofs. But the steps in these proofs were still in a sense purely structural, involving only pattern matching and substitution.

\n

I explored other applications of “multicomputation”, generating multiway systems based on numbers, multiway systems representing games, and so on. And I kept on wondering—and sometimes doing livestreamed discussions about—how best to create a language design around multicomputation. And as a first step towards that, we developed the TraceGraph function in the Wolfram Function Repository, which finally provided a somewhat readable graphical rendering of the output of Traceand began to show the causal dependencies in at least single-way computation. But what about the multiway case? For the Physics Project we’d already developed MultiwaySystem and related functions in the Wolfram Function Repository. So now the question was: how could one streamline this and have it provide essentially a multiway generalization of TraceGraph? We began to think about—and implement—concepts like Multi, and imagine ways in which general multicomputation could encompass things like logic programming and probabilistic programming, as well as nondeterministic and quantum computation.

\n

But meanwhile, the “ question” that had launched my whole adventure in recursion control in SMP was still showing up—43 years later—in the Wolfram Language. It had been there since Version 1.0, though it never seemed to matter much, and we’d always handled it just by having a global “recursion limit”—and then “holding” all further subevaluations:

\n

\n

But over the years there’d been increasing evidence that this wasn’t quite adequate, and that for example further processing of the held form (even, for example, formatting it) could in extreme cases end up triggering even infinite cascades of evaluations. So finally—in Version 13.2 at the end of last year—we introduced the beginnings of a new mechanism to cut off “runaway” computations, based on a construct called TerminatedEvaluation:

\n
\n
\n

\n

And from the beginning we wanted to see how to encode within TerminatedEvaluation information about just what evaluation had been terminated. But to do this once again seemed to require having a way to represent the “ongoing process of evaluation”—leading us back to Trace, and making us think about evaluation graphs, causal graphs, etc.

\n

At the beginning x = x + 1 might just have seemed like an irrelevant corner case—and for practical purposes it basically is. But already four decades ago it led me to start thinking not just about the results of computations, but also how their internal processes can be systematically organized. For years, I didn’t really connect this to my work on explicit computational processes like those in systems such as cellular automata. Hints of such connections did start to emerge as I began to try to build computational models of fundamental physics. But looking back I realize that in x = x + 1 there was already in a sense a shadow of what was to come in our Physics Project and in the whole construction of the ruliad.

\n

Because x = x + 1 is something which—like physics and like the ruliad—necessarily generates an ongoing process of computation. One might have thought that the fact that it doesn’t just “give an answer” was in a sense a sign of uselessness. But what we’ve now realized is that our whole existence and experience is based precisely on “living inside a computational process” (which, fortunately for us, hasn’t just “ended with an answer”). Expression evaluation is in its origins intended as a “human-accessible” form of computation. But what we’re now seeing is that its essence also inevitably encompasses computations that are at the core of fundamental physics. And by seeing the correspondence between what might at first appear to be utterly unrelated intellectual directions, we can expect to inform both of them. Which is what I have started to try to do here.

\n

Notes & Thanks

\n

What I’ve described here builds quite directly on some of my recent work, particularly as covered in my books Combinators: A Centennial View and Metamathematics: Physicalization & Foundations. But as I mentioned above, I started thinking about related issues at the beginning of the 1980s in connection with the design of SMP, and I’d like to thank members of the SMP development team for discussions at that time, particularly Chris Cole, Jeff Greif and Tim Shaw. Thanks also to Bruce Smith for his 1990 work on Trace in Wolfram Language, and for encouraging me to think about symbolic representations of computational processes. In much more recent times, I’d particularly like to thank Jonathan Gorard for his extensive conceptual and practical work on multiway systems and their formalism, both in our Physics Project and beyond. Some of the directions described here have (at least indirectly) been discussed in a number of recent Wolfram Language design review livestreams, with particular participation by Ian Ford, Nik Murzin, and Christopher Wolfram, as well as Dan Lichtblau and Itai Seggev. Thanks also to Wolfram Institute fellows Richard Assar and especially Nik Murzin for their help with this piece.

\n", - "category": "Computational Science", - "link": "https://writings.stephenwolfram.com/2023/09/expression-evaluation-and-fundamental-physics/", - "creator": "Stephen Wolfram", - "pubDate": "Fri, 29 Sep 2023 21:48:31 +0000", + "title": "Comment automatiser un tweet intelligent à partir d’un flux RSS grâce à ChatGPT ?", + "description": "Vous êtes-vous déjà demandé comment rendre votre compte Twitter qui poste vos news de blog, un peu plus « intelligent », ou du moins, un peu moins monotone ? Et bien, aujourd’hui, je vais vous montrer comment faire exactement cela. Dans cette vidéo, on va décortiquer ensemble un script Python qui permet … Suite", + "content": "

\"\"

\n

Vous êtes-vous déjà demandé comment rendre votre compte Twitter qui poste vos news de blog, un peu plus « intelligent », ou du moins, un peu moins monotone ?

\n\n\n\n
\r\n

Et bien, aujourd’hui, je vais vous montrer comment faire exactement cela.

\n\n\n\n

Dans cette vidéo, on va décortiquer ensemble un script Python qui permet de récupérer la dernière news d’un flux RSS, d’en faire un tweet unique grâce à ChatGPT et de poster tout ça sur Twitter. Oui, oui, vous avez bien lu : on va mixer l’automatisation de récupération de news et la magie de l’IA pour pondre des tweets qui ont du sens et de la saveur.

\n\n\n\n

Un grand merci à mes Patreons

\n\n\n\n

Je tenais à remercier du fond du cœur tous mes Patreons qui soutiennent ce genre de projets et permettent de continuer à explorer, à tester et à partager ces connaissances avec vous. Vous êtes les meilleurs ! ❤️

\n\n\n\n

Pour ceux qui sont abonnés Patreon, vous pouvez d’ores et déjà récupérer le code source. Pour les autres, n’hésitez pas à jeter un œil à ma vidéo pour une démo en direct !

\n\n\n\n
\n\n
\n\n\n\n
\r\n

Et en bonus « Rien à voir », un petit morceau de musique :

\n\n\n\n\n", + "category": "Développement", + "link": "https://korben.info/comment-automatiser-un-tweet-intelligent-a-partir-dun-flux-rss-grace-a-chatgpt.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 09:15:25 +0000", "enclosure": "", "enclosureType": "", "image": "", "id": "", - "language": "en", + "language": "fr", "folder": "", - "feed": "wolfram", + "feed": "korben.info", "read": false, "favorite": false, "created": false, "tags": [], - "hash": "7936f5db0afca7e042169bdf56dcba3d", + "hash": "c475bea07c7caa78ed769f438d14c49b", + "highlights": [] + }, + { + "title": "Explorez et optimisez vos images Docker avec Dive", + "description": "Dive est un outil permettant d'analyser et d'optimiser la taille des images Docker. Il facilite la gestion des images pour les développeurs et administrateurs système. Dive prend en charge plusieurs sources d'image, moteurs de conteneurs et est compatible avec diverses plateformes. L'outil peut être intégré au processus d'intégration continue et personnalisé grâce à des raccourcis clavier et fichiers de configuration.", + "content": "

\"\"

\n

Quand on commence à s’intéresser un peu à Docker, tout semble simple et léger, du moins en apparence. D’ailleurs, si vous débutez avec Docker, j’ai fait une vidéo d’initiation pour débutants pour mes Patreons que je vous offre à la fin de cet article.

\n\n\n\n
\r\n

Mais pour qu’une image Docker soit OK, il faut qu’elle ait été un minimum optimisé. Et ce n’est pas forcement instinctif, surtout quand on débute.

\n\n\n\n

C’est pourquoi , je vous présente un outil aussi magique qu’un Fabien Olicard sous Caprisun, qui va non seulement vous permettre de comprendre la structure de vos images Docker de fond en comble, mais également d’optimiser leur taille et de libérer cet espace disque précieux dont on manque tous sur nos ordis. Cet outil c’est Dive.

\n\n\n\n

Imaginez que vous êtes développeur ou administrateur système, et que vous devez régulièrement manipuler et gérer des images Docker. Vous savez qu’il est crucial d’optimiser ces images pour réduire leur taille et ainsi améliorer leur efficacité, mais vous ne savez pas par où commencer. Dive est là pour vous aider ! Avec cet outil, vous pourrez analyser facilement vos images Docker, découvrir les modifications effectuées à l’intérieur chaque couche et optimiser leur taille de manière efficace.

\n\n\n
\n
\"\"
\n\n\n

Tout d’abord, il suffit de remplacer la commande « docker build » par « dive build » pour analyser l’efficacité et l’espace gaspillé de votre image Docker.

\n\n\n\n
dive <tag/id/digest de votre image>
\n\n\n\n
\r\n

Dive prend en charge plusieurs sources d’image et moteurs de conteneurs (à l’heure actuelle, Docker et Podman). Pour l’installation, Dive est disponible pour Ubuntu/Debian, RHEL/Centos, Arch Linux, Mac et Windows.

\n\n\n\n

Pour l’installer sous macOS :

\n\n\n\n
brew install dive
\n\n\n\n

Pour l’installer sous Linux (Ubuntu / Debian) :

\n\n\n\n
export DIVE_VERSION=$(curl -sL \"https://api.github.com/repos/wagoodman/dive/releases/latest\" | grep '\"tag_name\":' | sed -E 's/.*\"v([^\"]+)\".*/\\1/')\n\ncurl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb\n\nsudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb
\n\n\n\n

Intégrer Dive dans votre processus de CI (intégration continue) est également possible en utilisant la variable d’environnement CI=true. Vous pouvez même configurer des règles dans un fichier .dive-ci pour automatiser certaines vérifications et optimisations de vos images Docker.

\n\n\n\n

Naviguer dans Dive est un jeu d’enfant grâce aux raccourcis clavier. Vous pourrez explorer les couches de vos images Docker, filtrer les fichiers, gérer les paramètres spécifiques à chaque couche et personnaliser l’interface utilisateur en créant un fichier de configuration.

\n\n\n\n

Pour en savoir plus sur Dive et ses fonctionnalités, je vous invite à consulter le dépôt GitHub officiel ici. Vous y trouverez toutes les informations nécessaires pour maîtriser cet outil fantastique, ainsi que des exemples et des astuces pour optimiser vos images Docker comme un pro.

\n\n\n\n
\r\n

Bonne optimisation à tous !

\n\n\n\n
\n\n
\n", + "category": "Administration Systeme Réseau", + "link": "https://korben.info/explorer-optimiser-images-docker-avec-dive.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "2e0c95cdf661612fcfbf0777a3f90df8", + "highlights": [] + }, + { + "title": "Blocks – La puzzle addictif à essayer de toute urgence !", + "description": "Si vous êtes comme moi, vous appréciez peut-être les jeux qui stimulent l’esprit sans trop se compliquer la tâche. Le genre de petits casse-têtes qui font travailler les méninges tout en offrant un moment de détente par exemple le fameux jeu « Gagne Ton Papa » , avec lequel je m’amuse beaucoup, … Suite", + "content": "

\"\"

\n

Si vous êtes comme moi, vous appréciez peut-être les jeux qui stimulent l’esprit sans trop se compliquer la tâche. Le genre de petits casse-têtes qui font travailler les méninges tout en offrant un moment de détente par exemple le fameux jeu « Gagne Ton Papa » , avec lequel je m’amuse beaucoup, surtout quand je joue avec des enfants.

\n\n\n\n
\r\n

C’est donc avec bonheur que je suis tombé sur Blocks, un nouveau jeu en ligne qui a su me rendra accro pendant un petit moment. Sa conception épurée rend l’expérience de jeu encore plus sympa.

\n\n\n
\n
\"\"
\n\n\n

Le principe du jeu est fondamentalement simple : on vous présente diverses figures géométriques, et votre défi est de les agencer correctement pour former un carré parfait. Cela peut sembler facile au début, mais ne vous y trompez pas ! Les 60 niveaux proposés augmentent progressivement en difficulté, ajoutant des couches de complexité à mesure que vous progressez.

\n\n\n\n

L’interface minimaliste permet aux joueurs de se concentrer entièrement sur le puzzle, éliminant toute distraction inutile et vous avez même de la musique sympa pour vous accompagner.

\n\n\n
\n
\"\"
\n\n\n

Bref, la beauté de Blocks réside dans sa capacité à offrir un équilibre parfait entre la détente et le défi cérébral. Que vous ayez quelques minutes à perdre en attendant un rendez-vous, ou que vous cherchiez un moyen d’échapper à la monotonie du travail, Blocks est l’outil idéal pour vous vider l’esprit tout en vous amusant.

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/blocks-la-puzzle-addictif-a-essayer-de-toute-urgence.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 06:13:50 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "ff679bfa2b58ad400d1d5e432828fd27", + "highlights": [] + }, + { + "title": "Légende de Super Mario – Un hack Zelda pour sauver le Royaume Champignon", + "description": "Ah, mes amis, découvrez un hack de The Legend of Zelda dans l'univers de Super Mario, nommé \"Légende de Super Mario - Sauvez le Royaume Champignon\". Incarnez Mario pour trouver les Starmen et sauver le Royaume Champignon de la tyrannie de Bowser. Mêlant exploration de Zelda et fun de Super Mario, redécouvrez ces deux franchises légendaires dans une expérience de jeu unique.", + "content": "

\"\"

\n

J’ai déniché pour vous une pépite qui ravira les fans de retrogaming et les nostalgiques de la grande époque des consoles 8-bits : un hack de The Legend of Zelda qui vous replonge dans l’univers de… Super Mario !

\n\n\n\n
\r\n

Vous vous souvenez de ces soirées passées à essayer de sauver la princesse Peach des griffes de ce stupide Bowser ?

\n\n\n\n

Et bien, préparez-vous à revivre de palpitants moments avec cette ROM NES custom intitulée « The Legend of Super Mario – Save Mushroom Kingdom (La Légende de Super Mario – Sauvez le Royaume Champignon) » !

\n\n\n
\n
\"\"
\n\n\n

Dans ce hack audacieux, Bowser a encore une fois capturé la Princesse Peach et plongé le Royaume Champignon dans la tyrannie. Évidemment, vous incarnez notre cher Mario, le plombier héroïque, qui doit trouver les Super Stars pour sauver le Royaume. Mais attention, ce ne sera pas une promenade de santé : des affrontements contre des Goombas, des Koopas et d’autres créatures que vous connaissez bien, vous attendront dans votre quête des huit Super Stars.

\n\n\n
\n
\"\"
\n\n\n

Comme vous pouvez l’imaginer, cela donne un mélange explosif entre l’aventure épique de Zelda et le fun déjanté de Super Mario. Vous devrez vous frayer un chemin à travers des donjons remplis d’ennemis et résoudre des énigmes pour avancer dans votre mission de sauvetage. Chaque Super Star trouvée vous rapprochera de la victoire finale et de la libération du Royaume Champignon.

\n\n\n\n
\r\n

Trop coooool, non ?

\n\n\n
\n
\"\"
\n\n
\n
\"\"
\n\n\n

Imaginez toutes les possibilités de gameplay avec cette rom : vous balader dans les niveaux de Super Mario comme on explore une map Zelda, résoudre des énigmes à la manière d’un héros légendaire qui porterait une bonne grosse moustache, et enfin vaincre Bowser pour sauver la princesse et le Royaume Champignon.

\n\n\n\n

Pour ceux qui voudraient essayer ce hack, rendez-vous sur le site : Légende de Super Mario – Sauvez le Royaume Champignon. Vous y trouverez toutes les infos pour vous lancer dans cette aventure épique. Attention cependant, vous aurez besoin d’une copie ROM originale (ah ah !) du jeu NES The Legend of Zelda pour appliquer le hack et ainsi profiter de cette expérience unique.

\n\n\n\n

Pour appliquer le patch, vous pouvez le faire en mode soft-patching directement via l’un de ces émulateurs : RetroArch, Snes9x, VBA où vous devrez ouvrir le jeu + le patch, ou en appliquant directement le patch sur la ROM avec Multipatch pour macOS ou LunarIPS pour Windows.

\n\n\n\n

Enfilez vos bottes de plombier et préparez-vous à explorer le Royaume Champignon comme jamais auparavant !

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/legend-super-mario-sauvez-royaume-champignon-hack-zelda-retrogaming.html", + "creator": "Korben", + "pubDate": "Tue, 24 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6cad7a904cdd7ca06872f96d6cc0fb83", + "highlights": [] + }, + { + "title": "Revivez l’âge d’or LucasArts avec l’émulateur DREAMM !", + "description": "DREAMM est un émulateur de jeux LucasArts des années 90 pour Windows, MacOS et Linux 64 bits, conçu par Aaron Giles. Il prend en charge plusieurs éditions, langues et versions des jeux SCUMM, GrimE, Star Wars, Indiana Jones et autres. Il nécessite l'installation de libsdl2 et des fichiers ROM MT-32. Pour l'utiliser, ajoutez des jeux via Game Manager, puis configurez et exécutez-les. L'émulateur gère également les contrôles de joystick et permet la mise à niveau de certains jeux.", + "content": "

\"\"

\n

Les amis, laissez-moi vous présenter un logiciel fantastique qui va vous replonger dans les années 90 et raviver vos vieux souvenirs de jeux vidéo.

\n\n\n\n
\r\n

Vous souvenez-vous des aventures de Guybrush Threepwood dans Monkey Island ou des courses folles avec les TIE Fighters de Star Wars ?

\n\n\n\n

Et bien, préparez-vous à revivre ces moments avec DREAMM, un émulateur exclusif aux jeux LucasArts qui vous permettra de rejouer à de nombreux jeux DOS, Windows et FM-Towns identiques aux originaux.

\n\n\n\n

Alors, enfilez votre chapeau d’Indiana Jones et allons voir tout ça !

\n\n\n\n

Créé par Aaron Giles, DREAMM fonctionne sous Windows, macOS et Linux 64 bits avec un support natif pour les processeurs Intel et ARM. Il prend en charge diverses éditions, langues et versions des jeux SCUMM, GrimE, Star Wars, Indiana Jones et autres jeux LucasArts.

\n\n\n\n
\r\n

Vous pouvez télécharger la dernière version de DREAMM en allant sur ce site.

\n\n\n\n

Lorsque vous lancez DREAMM, vous accédez au Game Manager pour ajouter, configurer et exécuter les jeux. L’interface principale montre les icônes des jeux installés, et vous pouvez ajouter de nouveaux jeux à tout moment, sauf pendant une opération d’ajout en cours. Pour configurer et exécuter un jeu, cliquez simplement sur son icône ou naviguez avec les touches fléchées.

\n\n\n
\n
\"\"
\n\n\n

Sélectionnez un jeu et accédez à l’écran de configuration et de lancement, où des informations sur la compatibilité sont disponibles dans la zone d’état. Vous pouvez gérer l’installation en cliquant sur l’onglet MANAGE, où vous pourrez vérifier les fichiers, désinstaller le jeu et accéder aux données pertinentes du jeu.

\n\n\n\n

Avec DREAMM, vous pouvez facilement explorer et configurer les dossiers de jeux, ainsi que les options audio et vidéo. Vous pouvez également contrôler la taille de l’écran du gestionnaire de jeux, basculer entre le mode fenêtré et plein écran et ajuster la taille avec des raccourcis clavier.

\n\n\n\n

DREAMM nécessite les fichiers d’origine pour exécuter un jeu. Il prend en charge les images disque de disquettes (IMG, IMA, VFD) et de CD-ROM (ISO, CUE/BIN, MDS/MDF, CCD/IMG). Pour installer à partir d’images disque, sélectionnez toutes les images et faites-les glisser sur la fenêtre de DREAMM. Si vous possédez les disquettes ou CD-ROM d’origine, vous pouvez également les installer à partir de ces supports. Et si vous n’avez pas les jeux d’origine, sachez qu’il y a des démos sur Archive.org au moins pour tester.

\n\n\n
\n
\"\"
\n\n\n

Lors de l’installation d’un jeu via DREAMM, choisissez le lecteur C: comme cible et laissez l’installateur faire son travail. DREAMM détecte et transfère les jeux installés.

\n\n\n\n
\r\n

DREAMM émule vraiment les jeux au niveau du CPU et nécessite les fichiers exécutables originaux. Son concurrent ScummVM n’émule pas mais est une réécriture complète issu d’un reverse engineering. Donc le rendu n’est pas fidèle aux jeux d’origine, alors qu’avec DREAMM c’est 100% identique à l’expérience que vous avez pu avoir étant jeune. Mais les 2 outils fonctionnent très bien, on est sur du chipotage à ce niveau, il faut bien le reconnaitre.

\n\n\n\n

DREAMM gère également les contrôles de joystick. Utilisez Alt+U⌘U ou F12 pour récupérer le contrôle de la souris si nécessaire.

\n\n\n\n

Voilà, j’espère que ça vous aura donné envie de vous refaire un Indiana Jones ou de replonger dans un bon vieux Sam & Max.

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/dreamm-emulateur-lucasarts-jeux-retro-windows-macos-linux.html", + "creator": "Korben", + "pubDate": "Mon, 23 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "320887c72777b270125ceef849243c2a", + "highlights": [] + }, + { + "title": "Sauvez votre PC avec ESET SysRescue Live, l’anti-malware ultime", + "description": "ESET SysRescue Live est un outil anti-malware sur support amovible, indépendant du système d'exploitation. Il permet d'éliminer les menaces persistantes en accédant directement au disque dur et fichiers système. Utilisé en complément de l'antivirus habituel, il est idéal pour éradiquer les malwares tenaces qui résistent aux méthodes traditionnelles.", + "content": "

\"\"

\n

Ah, la guerre éternelle contre les malwares… Parfois, l’ordinateur fait tellement n’importe quoi, qu’on se demande si on n’a pas chopé un bon vieux virus. Oui, oui, vous vous reconnaissez, ceux qui ne font jamais leurs mises à jour Windows et qui disent en frimant : « Oh moi, j’ai pas besoin d’antivirus, car je sais ce que je fais.« 

\n\n\n\n
\r\n

LOL !

\n\n\n\n

Et bien, aujourd’hui, je vais vous parler d’un super-héros qui pourrait bien vous sauver la vie, enfin, celle de votre ordinateur : ESET SysRescue Live.

\n\n\n\n

Imaginez que vous êtes en train de travailler sur un projet important et, soudain, votre ordinateur commence à agir bizarrement. Les performances ralentissent et vos fichiers deviennent inaccessibles. Vous réalisez que votre ordinateur a été infecté par le dernier malware. Vous essayez tous les logiciels antivirus possibles, mais rien ne semble fonctionner.

\n\n\n\n

Alors, que faire à part m’envoyer un message sur Facebook si vous êtes ma mère ? C’est là qu’ESET SysRescue Live entre en jeu.

\n\n\n\n
\r\n

ESET SysRescue Live est un outil anti-malware qui fonctionne via un support amovible (CD, DVD ou clé USB) et qui peut être utilisé indépendamment du système d’exploitation installé sur votre ordinateur. Ce petit génie peut ainsi éliminer les menaces persistantes en accédant directement au disque dur et aux fichiers système. Compatible avec plusieurs versions de Windows, il est conçu pour analyser et éliminer les menaces à la demande.

\n\n\n
\n
\"\"
\n\n\n

Pour utiliser ESET SysRescue Live, vous devez d’abord télécharger l’image ISO / IMG et la graver sur un CD/DVD ou créer une clé USB bootable. Une fois cela fait, insérez le support amovible et redémarrez votre ordinateur. Assurez-vous que votre ordinateur est configuré pour démarrer depuis le support amovible (vous devrez peut-être accéder aux paramètres du BIOS pour cela).

\n\n\n\n

Une fois ESET SysRescue Live lancé, vous serez accueilli par une interface utilisateur simple et conviviale. L’outil vous proposera de mettre à jour sa base de données de signatures de virus. Il est fortement recommandé de le faire pour assurer une détection optimale des menaces.

\n\n\n
\n
\"\"
\n\n\n

Après la mise à jour, vous pouvez lancer une analyse de votre ordinateur. ESET SysRescue Live offre plusieurs options d’analyse, notamment une analyse rapide, une analyse intelligente et une analyse personnalisée. Les deux premières options analysent les zones les plus couramment infectées, tandis que l’option personnalisée vous permet de choisir les disques et dossiers spécifiques à analyser. Une fois l’analyse terminée, les menaces détectées seront affichées et vous pourrez les supprimer en toute sécurité.

\n\n\n\n

Il est important de noter qu’ESET SysRescue Live n’est pas conçu pour remplacer votre logiciel antivirus habituel. Il est plutôt destiné à être utilisé en complément, en particulier dans les situations où un malware persistant empêche le bon fonctionnement de votre système. Cet outil est idéal pour les situations où vous devez éradiquer un malware tenace qui résiste aux méthodes de suppression traditionnelles.

\n\n\n\n

Vous y trouverez également des utilitaires pratiques comme memtest, Midnight Commander ou Gparted pour ceux qui veulent partitionner leur disque ou augmenter la taille de leurs partitions existantes.

\n\n\n
\n
\"\"
\n\n\n
\r\n

En résumé, ESET SysRescue Live est un outil pratique et puissant pour nettoyer votre ordinateur des menaces persistantes qui refusent de partir ou pour effectuer des petites opérations de maintenance sur l’ordi.

\n", + "category": "Sécurité", + "link": "https://korben.info/eradiquer-malwares-persistants-eset-sysrescue-live.html", + "creator": "Korben", + "pubDate": "Sun, 22 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "c41b775ca689ab0b3ace8cb81157e2b5", + "highlights": [] + }, + { + "title": "Découvrez Godspeed et révolutionnez votre gestion du temps et tâches", + "description": "\"Salut les amis! Aujourd'hui, je vais vous parler de Godspeed, une application géniale pour gérer votre temps et vos tâches. Elle combine simplicité, efficacité et personnalisation avec des fonctionnalités avancées pour organiser et suivre les projets. Vous pouvez personnaliser l'interface avec différents thèmes et couleurs. Inscrivez-vous sur leur site et prenez votre vie en main!\"", + "content": "

\"\"

\n

Salut les gens pressés et très occupés !

\n\n\n\n
\r\n

Aujourd’hui, je vais vous parler d’une application qui va vous soulager mentalement si vous galérer à faire tout ce que vous avez à faire dans la journée voire dans l’année.

\n\n\n\n

Il s’agit de Godspeed ! Pas de panique, je ne vous parle pas de l’expression anglaise qui veut dire « Bon vent » ou « Bonne chance ». Non, ici, je vous parle d’une application géniale qui porte le même nom et qui va révolutionner la façon dont vous gérez votre temps et vos tâches !

\n\n\n\n

Vous pouvez la trouver tout de suite sur le site, Godspeedapp.com.

\n\n\n\n

Qui n’a jamais été submergé par des tâches à réaliser, des rendez-vous à ne pas rater, des projets à gérer et des objectifs à atteindre ? Alors si vous êtes comme moi, vous avez déjà surement essayé plusieurs méthodes de gestion du temps (coucou Pomodoro) et différentes applications, mais aucune n’a vraiment répondu à vos attentes sans vous entrainer dans le burnout.

\n\n\n\n
\r\n

Eh bien, mes amis, je vous annonce que votre quête est enfin terminée ! J’ai testé Godspeed et je peux vous dire qu’elle tient toutes ses promesses.

\n\n\n\n

Alors, pourquoi cette application est-elle si géniale, me direz-vous ?

\n\n\n
\n
\"\"
Ma todo list très occupée du jour
\n\n\n

Tout simplement parce qu’elle allie simplicité, efficacité et personnalisation. Oui, vous avez bien lu. Godspeed vous permet de gérer vos tâches et votre emploi du temps de manière ultra-simple et intuitive. Pas de fonctionnalités inutiles ou compliquées, tout est pensé pour vous faciliter la vie et tout peut se faire au clavier avec des raccourcis bien pensés. Rassurez-vous, y’a un bon petit didacticiel qui vous permettra d’apprendre les raccourcis de base pour vous lancer.

\n\n\n\n

Mais ce n’est pas tout ! Godspeed va encore plus loin en vous proposant des fonctionnalités avancées pour ceux qui souhaitent aller au-delà de la simple gestion de tâches. Par exemple, vous pouvez créer des tâches principales et leur attribuer des sous-tâches pour une organisation encore plus poussée. Vous pouvez également définir des priorités et des échéances pour chaque tâche, histoire de ne plus jamais rater un deadline. Et vous pouvez aussi paramétrer vos tâches pour qu’elles vous soit proposées de manière récurrentes (toutes les semaines par exemple).

\n\n\n\n

Il est également possible d’associer des notes pour chaque tâche et d’y joindre des URLs (de la documentation par exemple) pour ouvrir ensuite ça d’un petit coup de raccourci clavier.

\n\n\n\n

Godspeed est utilisable via son API si vous souhaitez intégrer tout ça dans vos outils comme IFTTT / Zapier, vous pouvez exporter les data au format JSON et vous avez la possibilité de l’utiliser en mode clair ou sombre pour ne pas vous flinguer les yeux.

\n\n\n\n
\r\n

Et pour les puristes, il existe même au sein de Godspeed, un mode « hardcore » pour désactiver la souris et tout faire au clavier tel un pianiste sous amphétamine.

\n\n\n
\n
\"\"
\n\n\n

En conclusion, je ne peux que vous recommander de tester Godspeed si vous êtes à la recherche d’une solution simple et efficace pour gérer votre temps et vos tâches. Que vous soyez un simple utilisateur ou un véritable « power user », vous trouverez forcément votre bonheur avec cette application. Alors, qu’attendez-vous ? Allez, prenez votre vie en main et foncez sur godspeedapp.com ! Vous ne le regretterez pas. Et n’oubliez pas, comme disent nos amis anglophones : « Godspeed » !

\n", + "category": "MacOS", + "link": "https://korben.info/godspeed-application-gestion-temps-taches-revolutionnaire.html", + "creator": "Korben", + "pubDate": "Sat, 21 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "922899c9608a057c1732c0e3519c420a", + "highlights": [] + }, + { + "title": "BitLocker réduirait jusqu’à 45% vitesse SSD ? – Que faire ?", + "description": "Chers lecteurs, BitLocker, intégré à Windows 11 Pro, pourrait ralentir les SSD jusqu'à 45%. Des alternatives comme VeraCrypt sont disponibles, mais peuvent également impacter les performances. Il est important de vérifier le chiffrement utilisé et d'expérimenter pour trouver la meilleure solution pour vos besoins et performances.", + "content": "

\"\"

\n

Voici une mauvaise surprise : L’utilisation de BitLocker, le fameux outil de chiffrement intégré à Windows 11 Pro, pourrait ralentir nos disques SSD jusqu’à 45% (selon la marque et le modèle de SSD que vous utilisez) ?

\n\n\n\n
\r\n

Oui, vous avez bi-en lu, c’est pas des blagues. Tom’s Hardware a publié un rapport édifiant à ce sujet et il semblerait que nos chers SSD en pâtissent.

\n\n\n\n

Commençons par le début : BitLocker, disponible uniquement sur les appareils équipés de Windows 11 Pro, est activé automatiquement pour protéger nos données chéries en les chiffrant. Mais en y regardant de plus près, les tests effectués ont montré une diminution significative des performances des disques chiffrés par ce logiciel. C’est pas ouf.

\n\n\n\n

Alors que faire ?

\n\n\n\n

Et bien si vous êtes un utilisateur de Windows 11 Pro, la première chose à faire est de vérifier si BitLocker est activé, et s’il utilise un chiffrement logiciel (XTS-AES). Pour ce faire, ouvrez le menu Démarrer et entrez « cmd« .

\n\n\n\n
\r\n

Ensuite, choisissez l’option « Exécuter en tant qu’administrateur » pour ouvrir une fenêtre d’invite de commandes avec les droits admin qui vont bien. Une fois dans l’invite de commandes, copiez et collez la commande suivante :

\n\n\n\n
manage-bde -status
\n\n\n\n

Puis faites « Entrée ». Cette commande affichera alors le statut de tous vos volumes connectés. Enfin, pour savoir si le chiffrement BitLocker est activé ou non, recherchez la mention « Protection Status« .

\n\n\n\n

Si le chiffrement est activé, vérifiez alors la méthode de chiffrement utilisée. Si vous trouvez la mention « XTS-AES« , cela signifie que le chiffrement logiciel est utilisé et que par conséquent, Bitlocker a un impact négatif sur votre SSD.

\n\n\n
\n
\"\"
\n\n\n

Maintenant, plusieurs choix s’offrent à vous. Vous pouvez vous amuser à reformater votre PC et réinstaller Windows 11 Pro en tenant compte de bien activer le chiffrement hardware si votre ordinateur et votre SSD le supportent. C’est vraiment la meilleure des options même si cela implique d’effacer tout et de tout refaire au propre.

\n\n\n\n

Vous pouvez également désactiver BitLocker et ne plus rien chiffrer. C’est pas ouf niveau sécurité mais c’est un choix qui ne regarde que vous. Pour désactiver Bitlocker, ouvrez une nouvelle fois un terminal en mode admin et entrez la commande suivante en indiquant l’emplacement de votre disque (ici c’est « c: »)

\n\n\n\n
manage-bde off C:
\n\n\n
\n
\"\"
\n\n\n

Et si vous voulez quand même chiffrer sérieusement un disque dur, sans pour autant passer par Bitlocker, il y a toujours Veracrypt qui peut vous aider notamment grâce à sa fonctionnalité de chiffrement du système Windows. Attention quand même, ce genre d’outils peut également impacter les performances de certains SSD, donc renseignez-vous bien avant de le mettre en place, car pas sûr que ça arrange la situation. Même chose pour les bons disques durs (HDD), qui peuvent aussi être impactés dans une moindre mesure.

\n\n\n\n
\r\n

Bon courage 🙂

\n\n\n\n

Source

\n", + "category": "Windows", + "link": "https://korben.info/bitlocker-ralentit-ssd-windows-11-pro-veracrypt-alternative.html", + "creator": "Korben", + "pubDate": "Fri, 20 Oct 2023 09:24:07 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6f857b29e12635f662184af45b14f73e", + "highlights": [] + }, + { + "title": "Gardez un œil sur vos sites favoris avec web.Monitor", + "description": "Ah, Internet ! Un océan de connaissances et de ressources, mais comment suivre les mises à jour des sites préférés ? La solution : web.Monitor, un outil pour suivre les modifications des sites Web en temps réel. Rapide, convivial et avec notifications sur Telegram, Slack et Discord. Facile à utiliser, à installer et à configurer, web.Monitor permet de rester informé sans effort.", + "content": "

\"\"

\n

Il est facile de se perdre dans les profondeurs de cet océan qu’est Internet, et peut-être que vous vous demandez comment garder un œil sur tous ces sites qui vous intéressent tant, sans avoir à les visiter frénétiquement chaque jour pour vérifier si quelque chose a changé. Alors bien sûr il y a les flux RSS mais quand on parle d’un site vitrine ou institutionnel, à part y passer de temps en temps, y’a pas grand chose à faire.

\n\n\n\n
\r\n

Mais que vous soyez passionné de tech, développeur web, ou simplement quelqu’un qui veut se tenir à jour avec les mises à jour de vos sites préférés, j’ai une solution pour vous : web.Monitor.

\n\n\n\n

web.Monitor est un outil génial qui vous permet de suivre les modifications apportées aux sites Web en temps réel. Plus besoin de vérifier manuellement les sites pour les mises à jour ! Imaginez être averti dès que votre site préféré publie un nouvel article, ou dès qu’une nouvelle version de votre logiciel favori est disponible. Grâce à web.Monitor, vous pouvez désormais le faire facilement.

\n\n\n\n

Ce petit logiciel libre et en ligne de commande est rapide et facile à utiliser, offrant une surveillance continue, une configuration flexible, un stockage persistant, une journalisation détaillée, des notifications, la visualisation des modifications, le filtrage des domaines, l’automatisation et la personnalisation. Cerise sur le gâteau, il prend en charge les notifications ce qui vous permettra ensuite d’envoyer des updates vers vos Telegram, Slack et Discord pour ne jamais manquer une alerte !

\n\n\n\n

Pour configurer web.Monitor, commencez par définir le chemin des binaires dans le fichier web-monitor.ini.

\n\n\n\n
\r\n

Pour ajouter une URL à la base de données, vous pouvez utiliser les commandes suivantes pour suivre une liste de sites ou un site seulement :

\n\n\n\n
python3 web.monitor.py --add-urls urls.txt\npython3 web.monitor.py --add korben.info
\n\n\n\n

Les notifications seront alors envoyées après le premier scan.

\n\n\n\n

Pour scanner toutes les URL d’un domaine racine, vous pouvez également utiliser :

\n\n\n\n
python3 web.monitor.py -df roots.txt --check -H 1\npython3 web.monitor.py -D korben.info --check -H 1
\n\n\n
\n
\"\"
\n\n\n

Le paramètre -df est utilisé pour analyser toutes les URL d’un domaine racine. Par exemple, si les URL admin.site.com et admin.site2.com se trouvent dans la base de données et que le fichier roots.txt contient uniquement *.site.com, l’analyse portera sur *.site.com.

\n\n\n\n

L’indicateur -D , quand à lui, analyse uniquement les URL du site indiqué dans la commande. Le paramètre -H est utilisé pour spécifier que le domaine sera scanné toutes les 1 heures, et bien sûr, vous pouvez personnaliser cela. La recommandation c’est de scanner toutes les 12 ou 24 heures afin de ne pas vous faire blacklister ou Ddos les sites.

\n\n\n\n

Et si vous voulez afficher les changements d’un domaine spécifique, voici la commande qu’il vous faut :

\n\n\n\n
\r\n

python3 web.monitor.py -D korben.info --show-changes

\n\n\n\n

Voilà ! Grâce à web.Monitor, vous pouvez maintenant suivre les modifications de vos sites préférés sans effort. Fini les vérifications manuelles et les actualisations frénétiques. Il est temps de vous détendre et de laisser ce script python faire le travail pour vous !

\n", + "category": "Script", + "link": "https://korben.info/suivre-mises-a-jour-sites-web-automatiquement-avec-web-monitor.html", + "creator": "Korben", + "pubDate": "Fri, 20 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "25176e0f5b8b3cdb9412159034af69fc", + "highlights": [] + }, + { + "title": "Seal – L’outil ultime pour télécharger vidéos et audios sur Android", + "description": "Salut à tous ! Aujourd'hui, je vous présente Seal, un téléchargeur vidéo/audio tout-en-un pour Android. Il permet de télécharger du contenu de différentes plateformes, d'organiser vos fichiers avec des métadonnées, et d'ajouter des sous-titres. Il est également possible de télécharger des listes de lecture entières. Seal est gratuit, open-source et disponible sur GitHub et F-Droid.", + "content": "

\"\"

\n

En cette belle matinée ensoleillée (en vrai l’article est programmé et je n’ai aucune idée de la météo du jour, mais bon, on va partir du principe qu’il fait beau), j’aimerai vous présente un trésor pour les amateurs de vidéos et de musique (tout le monde donc…). Cela s’appelle Seal.

\n\n\n\n
\r\n

Que ce soit pour emporter votre playlist préférée en vacances loin de tout accès à Internet ou pour savourer un podcast lors de vos trajets quotidiens, Seal vous facilite la vie sous Android en vous offrant une solution tout-en-un.

\n\n\n\n

Laissez-moi vous donner quelques détails sur les fonctionnalités de ce merveilleux logiciel libre et gratuit.

\n\n\n\n

Tout d’abord, il permet de télécharger des vidéos et de l’audio à partir de toutes les plateformes les plus connues. Que vous vouliez enregistrer cette vidéo virale de chatons sur votre téléphone pour la montrer à vos amis plus tard, ou que vous ayez besoin de cette conférence masterclass pour votre prochain projet, Seal vous aidera à récupérer tout ça.

\n\n\n
\n
\"\"
\n\n\n

Ensuite, Seal organise vos fichiers téléchargés, en intégrant des métadonnées pour vous aider à garder tout en ordre. Fini les fichiers audio avec des titres étranges et imprononçables, ou les vidéos sans vignette qui rendent la navigation dans votre galerie si pénible.

\n\n\n\n
\r\n

Et s’il y a une playlist complète que vous souhaitez télécharger pour votre prochain road trip, pani problème ! Seal vous permet de la télécharger d’un seul coup, vous faisant gagner un temps précieux.

\n\n\n
\n
\"\"
\n\n
\n
\"\"
\n\n\n

Et pour tous ceux qui aiment regarder des films ou des vidéos en langues étrangères, Seal vous permet d’ajouter des sous-titres à vos vidéos téléchargées, pour que vous puissiez profiter de votre contenu sans souci de compréhension.

\n\n\n\n

L’outil dispose également d’une interface utilisateur conviviale qui rendra votre expérience de téléchargement fluide et agréable.

\n\n\n\n

Vous pouvez télécharger Seal sur GitHub et F-Droid.

\n", + "category": "Android", + "link": "https://korben.info/seal-telechargeur-video-audio-android-fonctionnalites-solution-hors-ligne.html", + "creator": "Korben", + "pubDate": "Thu, 19 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "f2769171bd6df1d0ddeb5a8fd2f89b58", "highlights": [] }, { @@ -109,28 +307,6 @@ "hash": "320dd32e82e253f0b7c0b7b8282d0a27", "highlights": [] }, - { - "title": "Remembering the Improbable Life of Ed Fredkin (1934–2023) and His World of Ideas and Stories", - "description": "\"\"Programmer of the Universe “OK, so let me tell you…” And so it would begin. A long and colorful story. An elaborate description of a wild idea. In the forty years I knew Ed Fredkin I heard countless wild ideas and colorful stories from him. He always radiated a certain adventurous joy—together with supreme, almost-childlike […]", - "content": "\"\"\n

Programmer of the Universe

\n

Click to enlarge

\n

“OK, so let me tell you…” And so it would begin. A long and colorful story. An elaborate description of a wild idea. In the forty years I knew Ed Fredkin I heard countless wild ideas and colorful stories from him. He always radiated a certain adventurous joy—together with supreme, almost-childlike confidence. Ed was someone who wanted to independently figure things out for himself, and delighted in presenting his often somewhat-outlandish conclusions—whether about technology, science, business or the world—with dramatic showman-like panache.

\n

In all the years I knew Ed, I’m not sure he ever really listened to anything I said (though he did use tools I built). He used to like to tell people I’d learned a lot from him. And indeed we had intellectual interests that should have overlapped. But in actuality our ways of thinking about them mostly didn’t connect much at all. But at a personal and social level it was still always a lot of fun being around Ed and being exposed to his unique intense opportunistic energy—with its repeating themes but ever-changing directions.

\n

And there was one way in which Ed and I were very much aligned: both of our lives were deeply influenced by computers and computing. Ed had started with computers in 1956—as part of one of the very first cohorts of programmers. And perhaps on the basis of that experience, he would still, even at the end of his life, matter-of-factly refer to himself as “the world’s best programmer”. Indeed, so confident was he of his programming prowess that he became convinced that he should in effect be able to write a program for the universe—and make all of physics into a programming problem. It didn’t help that his knowledge of physics was at best spotty (and, for example, I don’t think he ever really learned calculus). But his almost lifelong desire to “program physics” did successfully lead him to the concept of reversible logic, and to what’s now called the “Fredkin gate”. But it also led him to the idea that the universe must be a giant cellular automaton—whose program he could invent.

\n

I first met Ed in 1982—on an island in the Caribbean he had bought with money from taking public a tech company he’d founded. The year before, I had started studying cellular automata, but, unlike Ed, I wasn’t trying to “program” them—to be the universe or anything else. Instead, I was mostly doing what amounted to empirical science, running computer experiments to see what they did, and treating them as part of a computational universe of possible programs “out there to explore”. It wasn’t a methodology I think Ed ever really understood—or cared about. He was a programmer (and inventor), not an empirical scientist. And he was convinced—like a modern analog of an ancient Greek philosopher—that by pure thought he could come up with the whole “clockwork” of the universe.

\n

Central to his picture was the idea that at the bottom of everything was a cellular automaton, with its grid of cells somehow laid out in space. I told Ed countless times that what was known from twentieth-century physics implied this really couldn’t be how things worked at a fundamental level. I tried to interest Ed in my way of using cellular automata. But Ed wasn’t interested. He was going for what he saw as the big prize: using them to “construct the universe”.

\n

Every few years Ed would tell me he’d made progress—and rather dramatically say things like that he’d “found the electron”. I’d politely ask for details. Then start pointing out that it couldn’t work that way. But soon Ed would be telling a story or talking about some completely different idea—about technology, business or something else.

\n

By the mid-1980s I’d discovered a lot about cellular automata. And I always felt a bit embarrassed by Ed’s attempt to use them in what seemed to me like a very naive way for fundamental physics—and I worried (as did happen a few times) that people would dismiss my efforts by identifying them with his.

\n

My own career had begun in the 1970s with traditional fundamental physics. And while I didn’t think cellular automata as such could be directly applied to fundamental physics, I did think that the core computational phenomena I’d discovered through studying cellular automata might be very relevant. And then in the early 1990s I had an idea. In a cellular automaton, space has a fixed grid-like structure. But what if the structure of space is in fact dynamic, and everything in the universe emerges just from the dynamics of that structure? Finally I felt as if there might be a plausible computational foundation for fundamental physics.

\n

I wrote about this in one chapter of my 2002 book A New Kind of Science. I don’t know if Ed ever read what I wrote, but in any case it didn’t seem to affect his idea that the universe was a cellular automaton—and to confuse things further, he told quite a few people that was what I was saying too. At first I found this frustrating—and upsetting—but eventually I realized it was just “Ed being Ed”, and there were still plenty of things to like about Ed.

\n

Nearly twenty years passed. I would see Ed with some regularity. And sometimes I would mention physics. But Ed would just keep talking about his idea that the universe is a cellular automaton. And when we finally made the breakthrough that led in 2020 to our Physics Project it made me a little sad that I didn’t even try to explain it to Ed. The universe isn’t a cellular automaton. But it is computational. And I think that knowing this would have brought a certain intellectual closure to Ed’s long journey and aspirations around physics.

\n

Ed might have considered physics his single most important quest. But Ed’s life as a whole was filled with a remarkably rich assortment of activities and interests. Computers. Inventions. Companies. Airplanes. MIT. His island. The Soviet Union. Not to mention people, like Marvin Minsky, John McCarthy and Richard Feynman (as well as Tom Watson, Richard Branson, and many more). And he would tell stories about all these people and things, and more. Sometimes (particularly later in his life) the stories would repeat. But with remarkable regularity Ed would surprise me with yet another—often at first hard-to-believe—story about a situation or topic that I had no idea he’d ever been involved in.

\n

But what was the “whole Ed story”? I knew a lot of fragments, often quite colorful. But they didn’t seem to fit together into the narrative of a life. And now that Ed is sadly no longer with us, I decided I should really try to “understand Ed” and his story. A few times over the years I had made efforts to ask Ed for systematic historical accounts—and in 2014 I even recorded many hours of oral history with him. But there was clearly much more. And in writing this piece I found myself going through lots of documents and archives—and having quite a few conversations— and unearthing even yet more stories than I already knew. And in the end there’s a lot to say—and indeed this has turned into the most difficult and complicated biographical piece I’ve ever written. But I hope that everything I’ve assembled will help tell the often so-wild-you-can’t-make-this-stuff-up story of that most singular individual who I knew all those years.

\n

The Beginning of the Story

\n

Ed never said much to me about his early life. And in fact I think it was only in writing this piece that I even learned he’d grown up in Los Angeles (specifically, East Hollywood). His parents were both (Jewish) Russian immigrants (his father was born in St. Petersburg; his mother in Odessa; they met in LA). His father’s university engineering studies had been cut short by the Russian Revolution, and he now had a one-man wholesale electronic parts business. His mother had in her youth been trained as a concert pianist, and died when Ed was 11, leaving a somewhat fragmented family situation. Ed had a half-sister, 14 years older than him, a brother 6 years older, and a sister a year older. As he told it in later oral histories, he got interested in both machines and money very early, repairing appliances for a fee even as a tween, and soon learning about the idea of owning stock in companies.

\n

But Ed Fredkin’s first piece of public visibility seems to have come in 1948, when he was 13 years old—and it reminds me so much of many of Ed’s later “self-imposed” adventures. There was at that time an exhibition of historic US documents traveling around the country on a train named the Freedom Train. And when the train came to Los Angeles, the young Ed Fredkin decided he had to be the first person to see it:

\n

Click to enlarge

\n

The Los Angeles Times published his account of his adventure—a younger but “quintessentially Ed” story:

\n

Click to enlarge

\n

Ed’s record in high school was at best spotty. But as he tells it, he figured out very early a system for improving the odds in multiple-choice tests, and for example in 9th grade got a top score on a newly instituted (multiple-choice) California-wide IQ test. At the end of high school, Ed applied to Caltech (which was only 13 miles away from where he lived), and largely on the basis of his test scores, was admitted. He ended up spending time working various jobs to support himself, didn’t do much homework, and by his sophomore year—before having to pick a major—dropped out. In 2015 Ed told me a nice story about his time at Caltech:

\n
\n

In 1952–53, I was a student in Linus Pauling’s class where he lectured Freshman Chemistry at Caltech. After class, one day, I asked Pauling “What is a superconductor at the highest known temperature?” Pauling immediately replied “Niobium Nitride, 18 Kelvin”. I was puzzled because I had never heard of Niobium, so I looked it up and, with some difficulty found a reference that defined it as a European name for the metal Columbium.

\n
\n
\n

Later that same day, reading a Pasadena newspaper, I saw an article about Pauling: It announced that Pauling had just returned from Europe (London is what I recall) where Pauling, as Chairman of the International Committee on the naming of the elements, had decided that henceforth the metal Columbium would be renamed Niobium.

\n
\n
\n

I recently looked into that matter and discovered that evidently that renaming was part of a USA–Europe Compromise… In Europe it had been Wolfram and Niobium, in the USA it had been Tungsten and Columbium.

\n
\n
\n

Europe got its way re Niobium and the USA got its way re Tungsten… Perhaps it was a flip of a coin? Someone might know.

\n
\n
\n

As a Wolfram, I thought you might be interested (and, of course, perhaps all this is old hat to you…).

\n
\n

(For what it’s worth, I actually didn’t know this “Wolfram story”, though the details weren’t quite as dramatic as Ed said: the “niobium” decision was actually made in 1949, without Pauling specifically involved, though Pauling did indeed travel to London just before the beginning of the 1952 school year.)

\n

With his interest in machinery, Ed had always been keen on cars, and in his freshman year at Caltech, he also decided to learn to fly a plane. Ed’s older brother, Norman, had joined the Air Force five years earlier. And when he left Caltech—in 1954 at age 19—Ed joined the Air Force too. (If he hadn’t done that, he would have been drafted into the Army.) Ed’s brother Norman (who would spend his whole career in aviation) had been involved in the Korean War, particularly doing aerial reconnaissance—here pictured with his plane (and, no, there don’t seem to be any Air Force pictures of Ed himself):

\n

Click to enlarge

\n

By the time Ed joined the Air Force, the Korean War was over. Ed was assigned to an airbase in Arizona, and by the summer of 1955 he had qualified as a fighter pilot. Ed was never officially a “test pilot”, but he told me stories about figuring out how to take his plane higher than anyone else—and achieving weightlessness by flying his plane in a perfect free-fall trajectory by maintaining an eraser floating in midair in front of him.

\n

By 1956 Ed had been grounded from flying as a result of asthma, and was now at an airbase in Florida as an “intercept controller”—essentially an air traffic controller responsible for guiding fighters to intercept bombers. It was a time when the Air Force was developing the SAGE (Semi-Automatic Ground Environment) air defense system—a huge project whose concept was to use computers to coordinate data from many radars so as to be able to intercept Soviet bombers that might attack the US (cf. Dr. Strangelove, etc.). The center of SAGE development was Lincoln Lab (then part of MIT) in Lexington, MA—with IBM providing computers, Bell (AT&T) providing telecommunications, RAND providing algorithms, etc. And in mid-1956 the Air Force sent a group—including Ed—to test the next phase of SAGE. But as Ed tells it, they were soon informed that actually there would be a one-year delay.

\n

At the time, the SAGE project was busily trying to train people about computers, and some people from the Air Force stayed in the Boston area to participate in this. As Ed tells it, however, he was the only one who didn’t drop out of the training—and over the course of a year it taught him “much of what was then known about computer programming and computer hardware design”. There were at the time only a few hundred people in the world who could call themselves programmers. And Ed was now one of them. (Perhaps he was even “the world’s best”.)

\n

Computers!

\n

Having learned to program, Ed remained at Lincoln Lab, paid by the Air Force, doing what amounted to computational “odd jobs”. Often this had to do with connecting systems together, or coming up with “clever hacks” to overcome particular system limitations. Occasionally it was a little more algorithmic—like when Sputnik was launched in 1957, and Ed got pulled into a piece of “emergency programming” for orbit calculations.

\n

Ed told many stories about “hacking” the bureaucracy at the Air Force (being given a “Secret” stamp so he could read his own documents; avoiding being sent for a year to the Canadian Arctic by finding a loophole associated with his wife being pregnant, etc.)—and in 1958 he left the Air Force (though he would remain a captain in the reserves for many years), but stayed on at Lincoln Lab. Officially he was there as an “administrative assistant”, because—without a degree—that was all they could offer him. But by then he was becoming known as a “computer person”—with lots of ideas. He wanted to start his own company. And (as he tells it) the very first potential customer he visited was an MIT-spinoff acoustics firm called Bolt Beranek & Newman (BBN). And the person he saw there was their “vice president of engineering psychology”—a certain J. C. R. “Lick” Licklider—who persuaded Ed to join BBN to “teach them about computers”.

\n

It didn’t really come to light until he was at BBN, but while at Lincoln Lab Ed had made what would eventually become his first lasting contribution to computer science. He thought of it as a new way of storing textual information in a computer, and he called it “TRIE memory” (after “reTRIEval”). Nowadays we’d call it the trie (or prefix tree) data structure. Here it is for some common words in English made from the letters of “wolf”:

\n
\n
\n

\n

Licklider persuaded Ed to write a paper about tries—which appeared in 1960, and for a couple of decades was essentially Ed’s only academic-style publication:

\n

Click to enlarge

\n

The paper has a pretty clear description of tries, even with some nice diagrams:

\n

Click to enlarge

\n

Even in analyzing the performance of tries, there was only the faintest hint of math in the paper—though Ed realized (probably with input from Licklider) that the efficiency of tries would depend on the Shannon-style redundancy of what they were storing, and he ran Monte Carlo simulations to investigate this:

\n

Click to enlarge

\n

(He explains: “The test program was written in FORTRAN for the IBM 709. The program is composed of 42 subroutines, of which 19 were coded specially for this program and 23 were taken from the library.”)

\n

Tries didn’t make a splash when Ed first introduced them—not least because computers didn’t really have the memory then to make use of them. I think I first heard about them in the late 1970s in connection with spellchecking, and nowadays they’re widely used in lots of text search, bioinformatics and other applications.

\n

Ed had apparently first started talking about tries when he was still in the Air Force. As he explained it to me in 2014:

\n
\n

The Air Force [people] had no idea [what I was talking about]. But I kept on [saying] “I need to find someone who knows something about this that can critique it for me.” And someone says to me, “There’s a guy at MIT who deals in something similar, he calls it lists”. And that was John McCarthy. So, I call up, I get a secretary and, you know, I make a date, and I go to MIT and in building 56 with the computation center, I go to his office and the secretary says he’s somewhere out in the hall. I see some guy wandering back and forth. I go up and say, “You John McCarthy?” He says, “Yes.” So, I say, “I’ve had this idea—” I can’t remember if I was in uniform or not; I might’ve been. I said, “I had this idea, and I’ve written a program and tested it. And might you take a look?” Then he takes this thing, and he starts to read it.

\n
\n
\n

Then he did something that struck me as very weird. He turned around slowly and started walking away, he’s reading and walk, walk, walk, walk, stop. Turns around, walk, walk, walk, walk, back slowly, you know. Finally, he comes back and he stops and he reads and reads. And he’s obviously angry. And I thought, “This is weird.” I said “Does it make sense or anything?” He says, “Yes, it makes sense.” And I said, “Well, what’s up?” He says, “Well, I’ve had the same idea.” And I said, “Oh.” He says, “But I’ve never written it down.” And I said, “Oh, okay. So, do you think I ought to work on it or do something?” He says, “Yeah”. So, that’s how I met John McCarthy.

\n
\n

Ed remained friends with McCarthy for the rest of McCarthy’s life, and involved him in many of his endeavors. In 1956 McCarthy had been one of the organizers of the conference that coined the term “artificial intelligence”, and in 1958 McCarthy began the development of LISP (which was based on linked lists). I have to say I wish I’d known Ed’s story with McCarthy much earlier; I would have handled my own interactions with McCarthy differently—because, as it was, over the course of various encounters from 1981 to 2003 I never persisted very far beyond the curmudgeon stage.

\n

Back around 1958, the circle of “serious computer people” in the Boston area wasn’t very large—and another was Marvin Minsky (who I knew for many years). Between Ed and Licklider, both McCarthy and Minsky became consultants at BBN, and all of them would have many interactions in the years to come.

\n

But in late 1959 there was another entrant in the Boston computer scene: the PDP-1 computer, designed by a certain Ben Gurley for a new company named Digital Equipment Corporation (DEC) that had essentially spun off from Lincoln Lab and MIT. BBN was the first customer for the PDP-1, and Ed was its anchor user:

\n

Click to enlarge

\n

John McCarthy had had the “theoretical” idea of timesharing, whereby multiple users could work on a single computer. Ed figured out how to make it practical on the PDP-1, in the process inventing what would now be called asynchronous interrupts (then the “sequence break system”). And so began a process which led BBN to become a significant force in computing, the creation of the internet, etc.

\n

But in 1961, Ed and a certain Roland Silver, who also worked at BBN, decided to quit BBN—and, strangely enough, to move to Brazil, where they were enamored of the recently elected new president. But when that new president unexpectedly resigned, they abandoned their plan. And when BBN didn’t want them back, Ed decided to start a company, initially doing consulting for DEC. As Ed tells it, he and Roland Silver were such good friends and had so much they talked about that together they couldn’t get anything done, so they decided they’d better split up.

\n

As I was writing this piece, I decided to look up more about Roland Silver—who I found out had been a college roommate of Marvin Minsky’s at Harvard, and had had a long career in math, etc. at MITRE (the holding company for Lincoln Lab). But I also remembered that many years ago I’d received letters and a rather new-age newsletter from a certain “Rollo Silver”:

\n

Click to enlarge

\n

Could it be the same person? Yes! And in my archives I also found an ad:

\n

Click to enlarge

\n

Some time after my work on cellular automata in the 1980s, Roland Silver—together with my longtime friend Rudy Rucker—started a newsletter about cellular automata, notably not mentioning Ed, but including a colorful bio for Silver:

\n

Click to enlarge

\n

“Triple-I” (III)

\n

But back to Ed and his story. It was 1961, and Ed had quit his job at BBN. In 1957, he’d met on a Cape Cod beach a woman from Western Massachusetts named Dorothy Abair (who was at the time working at a beauty salon)—and six weeks later they’d married, and now had a 3-year-old daughter. Ed had already lined up some consulting with DEC, and as Ed tells it, with a little “hacking” of bank loans, etc. he was able to officially start Information International Incorporated (III)—with a tiny office in Maynard, MA (home of DEC). But then, one day he gets a call from the Woods Hole Oceanographic Institute. He drives down to Woods Hole with a certain Henry Stommel—an oceanography professor at Harvard—who tells him about a “vortex ocean model”, and asks Ed if he can program it on a PDP-1 so that it displays ocean currents on a screen. And the result is that III soon has a contract for $10k (about $100k today) to do this.

\n

I might add a small footnote here. Years later I was talking to Ed about the origins of cellular automata, and he tells me that a certain Henry Stommel had told him that there were cellular automaton models of sand dunes from the 1930s. At the time—before the web—I couldn’t easily track down who Henry Stommel was (and I had no idea how Ed knew him), and to this day I don’t know what those sand dune models might have been.

\n

But in any case, Ed’s interaction with Woods Hole led to what became III’s first major business: digital reading of film. As Ed tells it:

\n
\n

At Woods Hole … they had these meters which would measure how fast the ocean current was going and which way—and recorded it on 16 mm film with little tiny lights and a little fiber optic thing. And they had built a machine to read that film. I looked at the machine and said “That’ll never work”. And they said “Who are you? Of course it’ll work”, and so on, so forth. OK, so some months later they call me up and say it didn’t work.

\n
\n
\n

I have to tell you this but this is insanely funny. So I decide I’m going to make a film reader and here’s how I’m going to do it. I knew there was a 16 mm projector you could rent from a company and you could stop it and then say “Advance one frame” by clicking and it would just advance one frame at a time. So I thought: say I take the lightbulb out and put a photomultiplier in and point it at the screen of the computer. Then light will come from the screen, go through the lens and be focused on the film, and some would go through the film to the photomultiplier and I would be able to tell how much light got through. And we could write a program to do the rest.

\n
\n
\n

That was my idea, OK.

\n
\n
\n

So not having any money, we rented that projector and I got Digital (DEC) to let me use their milling machine and I bought the photomultiplier tube, and I got Ben Gurley to design the circuitry and connect it to the computer. But there was one more thing. The photomultiplier tube was like a vacuum tube but it had like 16 pins and a very odd connector that no one had. But I thought “Lincoln Labs has parts for everything in their electronics warehouse”. So I called someone I used to work with there, and said “Look, do me a favor and sneak into the parts area, take that part and just give it to me. I’ve ordered one but I’m not going to get it for a while and when I get it I’ll give it to you and you can put it back so it’s not actually a theft.” And he said “OK, I’ll do it” but he asked me why I wanted it and I told him “Well, I’m doing this stuff for Woods Hole to read some film with a computer”.

\n
\n
\n

OK, so he gave me the part and we get it going right away and we’re reading the film, and that solved the problem. But meanwhile this very funny thing happened. Someone from Lincoln Labs found out about all this and said “Hey, you’re reading some kind of film. Is that what you used that thing for?” And I said “Yeah”. And they said “Well, we tried to read some films so we built a gadget and did the same thing you did: we pointed it at the screen of the computer, but we can’t make the software work”. And I said “OK, well, come down and tell me about it”. So they come down and what happens is this. There’s some army people and they have a radar that’s looking at a missile coming in and records on film from an oscilloscope. And they asked could we read this. And to make a long story short they signed another contract….

\n
\n

The whole setup was eventually captured in a patent entitled simply “High-Speed Film Reading”:

\n

Click to enlarge

\n

And actually this wasn’t Ed’s first patent. That had been filed in 1960, while Ed was at BBN—and it was for a mechanical punched card sorter, with arrays of metal pins and the like, and no computer in evidence:

\n

Click to enlarge

\n

III ended up discovering that there were many applications—military and otherwise—for film readers. But their Woods Hole relationship led in another direction as well: computer graphics and data visualization. By 1963 there were perhaps 300,000 oceanographic stations recording their data on punched cards, and the idea was to take this data and produce from it a “computer-compiled oceanographic atlas”. The result was a paper:

\n

Click to enlarge

\n

And with statements like “Only a high-speed computer has the capacity and speed to follow the quickly shifting demands and questions of a human mind exploring a large field of numbers” the paper presented visualizations like:

\n

Click to enlarge

\n

These various developments put III in the center of the emerging field of film-meets-computers systems. The company grew, moving its center of operations to Los Angeles, not least to be near the Systems Development Corporation (SDC) which RAND had spun off as its software arm in response to the SAGE project.

\n

But Ed was always having new ideas for III, and defining new directions. Ed had brought Minsky and McCarthy into III as board members and consultants, and for example in 1964 III was proposing to SDC a project to make a new version of LISP (and, yes, with no obvious film-meets-computers applications). The proposal gives some insight into the state of III at the time. It says that “From a one-man operation [in 1962], I.I.I. has grown to the point where our gross volume of business for 1964 is in the neighborhood of $1 million [about $10 million today]”. It explains that III has four divisions: Mathematical and Programming Services, Behavioral Science, Operations, and “New York”. It goes on to list various things III is doing: (1) LISP; (2) Inductive Inference on Sequences; (3) Computer Time-Sharing; (4) Programmable Film Readers; (5) The World Oceanographic Data Display System; and (6) Computer Display Systems.

\n

It’s certainly an eclectic collection, reflecting, as such things often do, the character of the company’s founder. From a modern perspective, one item that catches one’s attention is:

\n

Click to enlarge

\n

One can think of it as an early attempt at AI/machine learning—which 60 years later still hasn’t been solved. (GPT-4 says the next letter should be Q, not O.)

\n

But distractions or not, it was a talented team that assembled at III—with lots of cross-fertilization with MIT. III’s business progressively grew, and perhaps it outgrew Ed—and in 1965 Ed stepped down as CEO. In 1968 he left entirely and (as we’ll discuss below) went to MIT, leaving III in the hands of Al Fenaughty, who, years later (and after nearly 30 years at III), would become the chairman of Yandex.

\n

As someone who’s curious about the ways of company founders, I asked Ed many times about his departure from III. He usually just said: “I had a partner who died”. But it’s only now that I’ve pieced together, partly from my 2014 oral history with Ed, what happened. Ed described it to me as the greatest tragedy of his life.

\n

Shortly after he set up III, Ed persuaded Ben Gurley (designer of the PDP-1) to leave DEC and join him at III. I think Ed had hoped to build computers at III, with Gurley as their designer. But on November 7, 1963, in Concord, MA, just a few miles from where I am as I write this, Ben Gurley was murdered—by a single revolver shot through his dining room window as he was about to sit down for dinner with his wife and 7 children. An engineer from DEC (and Lincoln Labs)—about whom Gurley had recently complained to the police—was arrested, and eventually convicted of the crime (after Ed hired a private detective to help). It later turned out that a few years earlier the same engineer was likely also responsible for shooting (though not killing) another engineer from DEC.

\n

I had always assumed that Ed’s decision to leave III happened just after his “partner had died”. But I now realize that Gurley’s death early in the history of III caused III to go on its path of making things like film readers, rather than the DEC- or IBM-challenging computers I think Ed had hoped for.

\n

Even after Ed left active management of III, he was still its chairman. And in late 1968 something would happen that would change his life forever. Taking tech companies public on the “over-the-counter” market had become a thing, and a broker offered to take III public. And on November 26, 1968, III filed its SEC paperwork:

\n

Click to enlarge

\n

III’s “principal product to date” is described as a “programmable film reader”, but the paperwork notes that as of October 31, 1968, the company has no film readers on order—though there are orders for its new microfilm reader, which it hasn’t delivered yet. It also says that proceeds from the offering will be used to fund its “proposed optical character recognition project”. But for our purposes what’s perhaps more significant is that the paperwork records that Ed owns 57.7% of the company, with the Edward Fredkin Charitable Foundation owning 0.4%.

\n

On January 8, 1969, III went public, and Ed was suddenly, at least on paper, worth more than $10M (or more than $80M today). Two years later (perhaps as soon as a lockup period expired), Ed cashed out, with the SEC notice indicating that Ed would be “repaying personal indebtedness to a bank incurred by him for reasons unrelated to the company or its business” (presumably a loan he’d taken out before he could achieve liquidity):

\n

Click to enlarge

\n

So now Ed—at age 37—was wealthy. And in fact the money he made from III would basically last the rest of his life, even through a long sequence of subsequent business failures.

\n

III’s OCR project was never a great success, but III became a key company in digital-to-film systems (relevant to both movies and printing), and in the early 1970s created some of the very first computer-generated special effects, that eventually made it into movies like Star Wars. III’s stock price hovered around $10 per share for years, and in 1996—after PostScript had pretty much taken the market for prepress printing systems—III was sold to Autologic for $35M in stock, then in 2001 Autologic was sold to Agfa for $42M.

\n

The Island

\n

When III went public in 1969 it was the height of the Cold War (which probably didn’t hurt III’s military sales). And many people—including Ed—thought World War III might be imminent. And so it was that in 1970 Ed decided to buy an island in the Caribbean, close enough to the tropics, he told me subsequently, that, he assumed (incorrectly according to current models), radioactive fallout from a nuclear war wouldn’t reach it.

\n

Apparently Ed was sitting in a dentist’s office when he saw an “Island for Sale” ad in a newspaper. The seller was a shipwreck-scavenging treasure hunter named Bert Kilbride—sometimes called “the last pirate of the Caribbean”—who had started to develop the island (and for several years would manage it for Ed). It’s a fairly small island (about 125 acres, or 0.2 square miles)—in the British Virgin Islands. And its name is Mosquito Island (or sometimes, with some historical justification, Moskito Island). And when Ed bought it, it probably cost something under $1M. (Richard Branson bought the nearby but smaller Necker Island in 1978.)

\n

I visited Ed’s island in January 1982—the first time I met Ed. And, yes, there was a certain “lair of a Bond villain” (think: Dr. No) vibe to the whole thing. Here are pictures I took from a boat leaving the island (notice the just-visible seaplane parked at the island):

\n

Click to enlarge

\n

There was a small resort (and restaurant) on the island, named Drake’s Anchorage (built by the previous owner):

\n

Click to enlarge

\n

And, yes, there were beaches on the island (though I myself have never been much of a beach-goer):

\n

Click to enlarge

\n

And, in keeping with the Bond vibe, there was a seaplane too:

\n

Click to enlarge

\n

There was one house on the island, here pictured from the plane (it so happened that when I visited the island, I was learning to fly small planes myself—so I was interested in the plane):

\n

Click to enlarge

\n

Visiting a nearby island—with its very rundown airport sign—gives some sense of the overall area:

\n

Click to enlarge

\n

Ed claimed it was difficult to run the resort on his island, not least because, he said, “the British Virgin Islands have the lowest average worker productivity in the world”. But he nevertheless, for example, had a functioning restaurant, and here I am there in 1982, along with Charles Bennett, about whom we’ll hear more later:

\n

Click to enlarge

\n

When people talked about Ed, his island was often mentioned, and it projected a general image of overall mystique and extreme wealth. In 1983 a movie called WarGames came out, featuring a reclusive military-oriented computer expert named “Professor Falken”—who had an island. Many people assumed Falken was based on Fredkin (and it now says so all over the internet). However, in writing this piece, I decided to find out what was actually true—so I asked one of the writers of the movie, Walter Parkes. He responded, and, yes, fact is often even stranger than fiction:

\n
\n

Unfortunately I can confirm that Ed was not the inspiration for Stephen Falken. The character was inspired by Steven [sic] Hawking. (Falken = Falcon = Hawking) The movie was first conceived to be about two characters, a young super-genius born into a family incapable of acknowledging his gifts, and a dying scientist in need of a protégé. In the first several drafts Falken was confined to a wheel-chair and was working on understanding the big bang, for which he had created a computer simulation. Little known fact—while writing the character, we had one person in mind to play the role: John Lennon, who was murdered shortly before we finished the script.

\n
\n

(By the way, in a moment of “fact follows fiction”, WarGames featured a computer with lots of flashing lights. I happened to see the movie with Danny Hillis, and as we were walking out of the movie, I said to Danny “Perhaps your computer should have flashing lights too”. And indeed flashing lights became a signature feature of Danny’s Connection Machine computer, as later seen in movies like Jurassic Park.)

\n

Project MAC

\n

After he left III in 1968, Ed’s next stop would be MIT, and specifically Project MAC (the “Multiple Access Computer” Project). But actually Ed had already been involved much earlier with Project MAC. In many ways the project was a follow-on to what Ed had been doing at BBN on timesharing.

\n

In 1963 Ed wrote a long survey article on timesharing:

\n

Click to enlarge

\n

The introduction contains a rather charming window onto the view of computers at the time:

\n

Click to enlarge

\n

And the ads interspersed through the article give a further sense of the time:

\n

Click to enlarge

\n

As illustrations of what can be done with an interactive timeshared computer, there’s a picture from Ed’s vortex ocean simulation—as well as an example of an online “book” about LISP:

\n

Click to enlarge

\n

And, yes, already a kind of “cloud computing” story:

\n

Click to enlarge

\n

There’s also a description of Project MAC—that had just been funded by the Advanced Research Projects Agency (now DARPA). The article said that the “MAC” stood either for “Multiple Access Computer” or “Machine-Aided Cognition”. It included various sections on what might be possible with timesharing:

\n

Click to enlarge

\n

The main text of the article ends with a rousing (?) vision of AI taking over from humans (and, yes, even though this is from 60 years ago it’s not so different from what at least some people might say about the “AI future” today):

\n

Click to enlarge

\n

But there’s a curious piece of backstory to Project MAC—from 1961—that appears as a footnote to Ed’s article:

\n

Click to enlarge

\n

Ed told me versions of this story many times. McCarthy had failed to get tenure at MIT, and was looking for another job. (Yes, in retrospect this seems remarkable given all the things he’d already done by then. But those things were computer science—and MIT didn’t yet have a CS department; McCarthy was in the EE department.) Ed, Minsky and McCarthy were going to an SDC meeting in Los Angeles, and while he was out there McCarthy was going to interview at Caltech (his undergraduate alma mater). They had a free evening, and Ed suggested they meet “someone interesting”. Ed remembered Linus Pauling from his time at Caltech. But Pauling wasn’t in. So Minsky suggested they call Richard Feynman. And he was in, and invited them over to his house.

\n

Feynman apparently showed them things like his nanotech-inspiring tiny motor, etc., but somehow the discussion shifted to AI. And Minsky mentioned work a student of his was doing on the “AI problem” of symbolic integration. Then McCarthy started to explain ways a computer could do algebra. Then, as Ed told it to me in 2014:

\n
\n

Feynman produces this sheaf of papers to show us. It was all algebra. And he says “There’s a problem. I’ve done this calculation, and it’s close to 50 pages. A graduate student has done it too, and Murray Gell-Mann has done it. And the only thing we know for sure is that our three results are mutually inconsistent. And the only conclusion we can arrive at is that a person can’t do this much algebra with the hope of getting it right.” And so the question was could there be some system that could help do a problem like that? So what happened is Marvin [Minsky] and I basically fleshed out the idea of a mathematical thing. And it was agreed that we would do it. Marvin and I decided to divide this task up, that I would do one part, and he would do another. Now, we had one bad idea in there, OK. It’s partly Feynman’s fault, but it’s also Marvin and my fault. He was convinced you could not do [math] by typing it. It had to have some kind of handwriting recognition. So, it was decided I would do the handwriting recognition…

\n
\n

And although I didn’t know this until I was writing this piece, it turns out the original proposal for Project MAC was actually based on the idea of building a system for mathematics, and “Project MAC” was originally the “Project on Mathematics and Computation”. Pretty soon, though, the emphasis of Project MAC would shift to the “infrastructure” of timeshared computing. But there was still a math effort, which in time became the MACSYMA system for computer algebra (written in LISP by students and grandstudents of Minsky).

\n

And here this intersects with my personal story. Because many years later (starting in 1976) I would use that system—along with other early computer algebra systems—to do all sorts of physics calculations. My archives still contain an example of what it was like in 1980 to log in to “Project MAC” over the ARPANET (my username was “swolf” in those days; note the system message, the presence of 15 MITishly-named “lusers” altogether, and yes, mail):

\n

Click to enlarge

\n

But, actually, in late 1979 I had already decided to “do my own thing” and build my own system for doing mathematical computation, and eventually much more. And indeed when I first met Ed in 1982 I had recently finished the first version of SMP, and to commercialize it I had started my first company. In 1986 I started to build Mathematica (and what’s now Wolfram Language)—which was released in 1988. Ed started using Mathematica very soon after it was released, and basically continued to do so for the rest of his life.

\n

But picking up the original Project MAC narrative from 1963: the old group from BBN had dispersed but were still writing together about timesharing (and when they said a “debugging system” they meant essentially what we would now call an operating system):

\n

Click to enlarge

\n

And when Project MAC launched in 1963, its “steering committee” included Minsky, Gurley—and Ed. (John McCarthy had landed at Stanford, where he would remain for the rest of his life. I first met him in 1981, at a time when Stanford was trying to recruit me. There was a lunch with the CS department; people went around the room and introduced themselves. McCarthy unhelpfully—and confusingly—said he was “John Smith”.)

\n

Ed at MIT

\n

In 1968, Ed left III—and Minsky, together with Licklider (who had by then become director of Project MAC), persuaded the MIT EE department to hire Ed as a visiting professor for the year. Ed had been spending most of his time at III in Los Angeles, but III also had a pied-à-terre in the Boston area, and indeed its IPO documents listed its address as 545 Technology Square, Cambridge—the very building in which Project MAC was located.

\n

At MIT, Ed invented and taught a freshman course on “Problem Solving”. He told me many times one of his favorite “problem exercises”. Imagine there’s a person who can cure anyone who’s sick just by touching them. How could one set things up to make the best use of this? I must say I never find such implausible hypotheticals terribly interesting. But Ed was proud of a solution that he’d come up with (I think in discussion with Minsky and McCarthy) that involved systematically shuttling millions of people past the healer.

\n

This probably didn’t come from that particular course, but here are some notes I found in an archive of Ed’s papers at MIT that perhaps suggest some of the flavor of the course (we’ll talk about Ed’s interest in the Soviet Union later):

\n

Click to enlarge

\n

In 1968 MIT—and Project MAC in particular—was at the very center of emerging ideas about computer science and AI. A picture from that time captures Ed (third from left) with a few of the people involved: Claude Shannon, John McCarthy and Joe Weizenbaum (creator of ELIZA, the original chatbot):

\n

Click to enlarge

\n

At the end of the 1968 academic year student reviews from Ed’s course were unexpectedly good, and MIT needed faculty members who could be principal investigators on the government grants that were becoming plentiful for computing—and one of those typical-for-Ed “surprising things” happened: MIT agreed to hire him as a full professor with tenure, despite his lack of academic qualifications. It was a watershed moment for Ed, and I think a piece of validation that he carried with pride for the rest of his life. (For what it’s worth, while Ed was an extreme case, MIT was at that time also hiring at least some other people without the usual PhD qualifications into CS professor positions.)

\n

In 1971 Licklider stepped down from his position as director of Project MAC—and Ed assumed the position. His archives from the time contain lots of administrative material—studies, reports, proposals, budgets, etc.—including many pieces reflecting things like the birth of the ARPANET, the maturing of operating systems and the general enthusiasm about the promise of AI.

\n

One item (conceivably from an earlier time) is Ed’s summary of “Information Processing Terminology” for PDP-1 users, complete with definitions like: “A bit is a binary digit or any thing or state that represents a binary digit. Equivalently, a bit is a set with exactly two members. Note that a bit is not one of the members of such a set”:

\n

Click to enlarge

\n

Ed does not seem to have been very central to the intellectual activities around Project MAC, and the emerging Lab for Computer Science and AI Lab. But his name shows up from time to time. And, for example, in the classic “HAKMEM” collection of 191 math and CS “hacks” from the AI Lab, there are two—both very number oriented—attributed to Ed:

\n

Click to enlarge

\n

Rollo Silver gets mentioned too—notably in connection with “random number generators” involving XORs (and, yes, the code is assembly code—for a PDP-10):

\n

Click to enlarge

\n

Also in HAKMEM is the “munching squares” algorithm—that I was later shown by Bill Gosper:

\n

Click to enlarge

\n

And talking of Gosper (whom I’ve known since 1979, and who almost every week seems to send me mail with a surprising new piece of math he’s found with Mathematica): in 1970 the Game of Life cellular automaton had come on the scene, and Gosper and others at MIT were intensely studying it, with Gosper triumphantly discovering the glider gun in November 1970. Curiously—in view of all his emphasis on cellular automata—Ed doesn’t seem to have been involved.

\n

But he did do other things. In 1972, for example, as a kind of spinoff from his Problem Solving course, he formed a group called “The Army to End the War” (i.e. the Vietnam War), whose idea was that it was time to stop the government fighting an unwinnable war, and this could be achieved by having an organization that would coordinate citizens to threaten a run on banks unless the war was ended. Needless to say, though, this didn’t really fit well with the project Ed ran being funded by the Department of Defense.

\n

Between MIT being what it is, and Ed being who he was, there were often strange things that happened. As Ed tells it, one day he was in Marvin Minsky’s office talking about unrecognized geniuses, and a certain Patrick Gunkel walks in, and identifies himself as such. Ed ended up having a long association with Gunkel, who produced such documents as:

\n

Click to enlarge

\n

(Gunkel’s major goal was to create what he called “ideonomy”, or the “science of ideas”, with divisions like isology, chorology, morology and crinology. I met Gunkel once, in Woods Hole, where he had become something of a local fixture, riding around town with his cat in his bicycle basket.)

\n

But after a few years as director of Project MAC, in 1974 Ed was onto something new: being a visiting scholar at Caltech. After his 1961 encounter, he had gotten to know Richard Feynman—who always enjoyed spending time with “out of the box” people like Ed. And so in 1974 Ed went for a year to Caltech, to be with Feynman.

\n

The Universe as a Cellular Automaton

\n

My own efforts (and successes) with cellular automata may perhaps have had something to do with it. But I think at least in the later part of his life, Ed felt his greatest achievements related to cellular automata and in particular his idea that the universe is a giant cellular automaton. I’m not sure when Ed really first hatched this idea, or indeed started to think about cellular automata. Ed had told me many times that when he’d told John McCarthy “the idea”, McCarthy suggested testing it by looking for “roundoff error” in physics, analogous to roundoff error from finite precision in computers. Ed scoffed at this, accusing McCarthy of imagining that there was literally “an IBM 709 computer in the sky”. And Ed’s implication was that he had gotten further than that, imagining the universe to be made more abstractly from a cellular automaton.

\n

I didn’t know quite when this exchange with McCarthy was supposed to have taken place (and, by the way, some of the emerging experimental implications of our Physics Project are precisely about finding evidence of discrete space through something quite analogous to “roundoff errors” in the equations for spacetime). But Ed’s implication to me was always that he’d started exploring cellular automata sometime before 1960.

\n

In the mid-1990s, researching history for my book A New Kind of Science, (as I’ll discuss below) I had a detailed email exchange and long phone conversation with Ed about this. The result was a statement in my notes about the history of cellular automata:

\n

Click to enlarge

\n

At the time, Ed made it sound very convincing. But in writing this piece, I’ve come to the conclusion it’s almost certainly not correct. And of course that’s disappointing given all the effort I put into the history notes in my book, and the almost complete lack of other errors that have surfaced even after two decades of scrutiny. But in any case, it’s interesting to trace the actual development of Ed’s ideas.

\n

One useful piece of evidence is a 25-page document from 1969 in his archives, entitled “Thinking about New Things”—that seems to outline Ed’s thinking at the time. Ed explains “I am not a Physicist, in fact I know very little about modern physics”—but says he wants to suggest a new way of thinking about physics:

\n

Click to enlarge

\n

Soon he starts talking about the possibility that the universe is “merely a simulation on a giant computer”, and relates a version of what he told me about his interaction with John McCarthy:

\n

Click to enlarge

\n

He talks (in a rather programmer kind of way) about the beginning of the universe:

\n

Click to enlarge

\n

He goes on—again in a charmingly “programmer” way:

\n

Click to enlarge

\n

A bit later, Ed is beginning to get to the concept of cellular automata:

\n

Click to enlarge

\n

And there we have it: Ed gets to (3D) cellular automata, though he calls them “spatial automata”:

\n

Click to enlarge

\n

And now he claims that spatial automata can exhibit “very complex behavior”—although his meaning of that will turn out to be a pale shadow of what I discovered in the early 1980s with things like rule 30:

\n

Click to enlarge

\n

But at this point Ed already seems to think he’s almost there—that he’s almost reproduced physics:

\n

Click to enlarge

\n

A little later he’s discussing doing something very much in my style: enumerating possible rules:

\n

Click to enlarge

\n

And still further on he actually talks about 1D rules. And in some sense it might seem like he’s getting very close to what I did in the early 1980s. But his approach is very different. He’s not doing “science” and “empirically seeing what cellular automata do”. Or even being very interested in cellular automata for their own sake. Instead, he’s trying to engineer cellular automata that can “be the universe”. And so for example he wants to consider only left-right symmetric cellular automata “because the universe is isotropic”. And having also decided he wants cellular automata that are symmetric under interchange of black and white (a property he calls “syntactic symmetry”), he ends up with just 8 rules. He could just have simulated these by running them on a computer. But instead he tries to “prove” by pure thought what the rules will do—and comes up with this table:

\n

Click to enlarge

\n

Had he done simulations he might have made pictures like these (labeled using my rule-numbering scheme):

\n
\n
\n

\n

But as it was he didn’t really come to any particular conclusion, other than what amount to a few simple “theorems” about what “data processing” these cellular automata can do:

\n

Click to enlarge

\n

I must say I find it very odd that—particularly given all the stories about his activities and achievements he told me—Ed never in the four decades I knew him mentioned anything about having thought about 1D cellular automata. Perhaps he didn’t remember, or perhaps—even after everything I wrote about them—he never really knew that I was studying 1D cellular automata.

\n

But in any case, what comes next in the 1969 document is Ed getting back to “pure thought” arguments about how cellular automata might “make physics”:

\n

Click to enlarge

\n

It’s a bit muddled (though, to be fair, this was a document Ed never published), but at the end it’s basically saying that if the universe really is just a cellular automaton then one should be able to replace physical experiments (that would, for example, need particle accelerators) with “digital hardware” that just runs the cellular automaton. The next section is entitled “The Design of a Simulator”, and discusses how such hardware could be constructed, concluding that a 1000×1000×1000 3D grid of cells could be built for $50M (or nearly half a billion dollars today).

\n

After that, there’s one final (perhaps unfinished) section that reads a bit like a caricature of “I’ve-got-a-theory-of-physics-too” mechanical models of physics:

\n

Click to enlarge

\n

But, OK, so what does this all mean? Well, first, I think it makes it rather clear that (despite what he told me) by 1969—let alone 1961—Ed hadn’t actually implemented or run cellular automata in any serious way. It’s also notable that in this 1969 piece Ed isn’t using the term “cellular automaton”. The concept of cellular automata had been invented many times, under many different names. But by 1969 the term “cellular automaton” was pretty firmly established, and in fact 1969 might have represented the very peak up to that point of interest in cellular automata in the world at large. But somehow Ed didn’t know about this—or at least wasn’t choosing to connect with it.

\n

Even at MIT Frederick Hennie in the EE department had actually been studying cellular automata—albeit under the name “iterative arrays”—since the very beginning of the 1960s. In 1968 E. F. Codd from IBM (who laid the foundations for SQL—and who worked with Ed’s friend John Cocke) had published a book entitled Cellular Automata. Alvy Ray Smith—in the same department as John McCarthy at Stanford—was writing his PhD thesis on “cellular automata”. In 1969 Marvin Minsky and Seymour Papert published their Perceptrons book, and were apparently talking a lot about cellular automata. And for example by the fall of 1969 Papert’s student Terry Beyer had written a thesis about the “recognition and transformation of figures by iterative arrays of finite state automata”—under the auspices of Project MAC, presumably right under Ed’s nose. (And, no, the thesis doesn’t mention Ed, though it mentions Minsky.)

\n

Right around that time, though, something happens. Ed had been convinced—probably by Minsky and McCarthy—that any cellular automaton capable of “being the universe” better be computation universal. And now there’s a student named Roger Banks who’s working on seeing what kind of (2D) cellular automaton would be needed to get computation universality. Banks had found examples requiring much fewer than the 29 states von Neumann and Burks had used in the 1950s. But—as he related to me many times—Ed challenged Banks to find a 2-state example (“implementable purely with logic gates”), and Banks soon found it, first describing it in June 1970:

\n

Click to enlarge

\n

Banks had apparently been interacting with the “Life hackers” at MIT, and in November 1970 some of the thunder of his result was stolen when Bill Gosper at MIT discovered the glider gun, which suggested that even the rules of the Game of Life (albeit involving 9 rather than 5 2D neighbors) were likely to be sufficient for computation universality.

\n

But for our efforts to trace history, Banks’s June 1970 report has a number of interesting elements. It relates the history of cellular automata, without any mention of Ed. But then—in its one mention of Ed—it says:

\n

Click to enlarge

\n

The “mod-2 rule” that Ed told me he’d simulated in 1961 has finally made an appearance. In an oral history years later Terry Winograd reported that in 1970 he “went to a lecture of Papert’s in which he described a conjecture about cellular automata [which Winograd] came back with a proof of”.

\n

By January 1971, Banks is finishing his thesis, which is now officially supervised by Ed (even though it’s nominally in the mechanical engineering department):

\n

Click to enlarge

\n

Most of Banks’s work is presented as what amount to “engineering drawings”, but he mentions that he has done some simulations. I don’t know if these included simulations of the mod-2 rule but it seems likely.

\n

So was 1969 or 1970 the first time the mod-2 rule had been heard from? I’m not sure, but I suspect so. But to confuse things there’s a “display hack” known as “munching squares” (described in HAKMEM) that looks in some ways similar, and that was probably already seen in 1962 on the PDP-1. Here are the frames in a small example of munching squares:

\n
\n
\n

\n

Here’s a video of a bigger example:

\n
\n
\n

\n

I expect Ed saw munching squares, perhaps even in 1962. But it’s not the mod-2 rule—or actually a cellular automaton at all. And even though Ed certainly had the capability to simulate cellular automata back at the beginning of the 1960s (and could even have recorded videos of 2D ones with III’s film technology) the evidence we have so far is that he didn’t. And in fact my suspicion is that it was probably only around the time I met Ed in 1982 when it finally happened.

\n

My First Encounter with Ed

\n

In May 1981 there’d been a conference at MIT on the Physics of Computation. I’d been invited, but in the end I couldn’t go—because (in a pattern that has repeated many times in my life) it coincided with the initial release of my SMP software system. Still, in December 1981 I got the following invitation:

\n

Click to enlarge

\n

In January 1982 I was planning to go to England to do a few weeks of intensive SMP development on a computer that a friend’s startup had—and I figured I would go to the Caribbean “on the way”.

\n

It was an interesting group that assembled on January 18, 1982, on Mosquito Island. It was the first time I met my now-longtime friend Greg Chaitin. There were physicists there, like Ken Wilson and David Finkelstein. (Despite the promise of the invitation, Feynman’s health prevented him from coming.) And then there were people who’d worked on reversible computation, like Rolf Landauer and Charles Bennett. There were Tom Toffoli and Norm Margolus, who had their cellular automaton machine with them. And finally there was Ed. At first he seemed a little Gatsby-like, watching and listening, but not saying much. I think it was the next morning that Ed pulled me aside rather conspiratorially and said I should come and see something.

\n

Click to enlarge

\n

There was just one real house (as opposed to cabin) on the island (with enough marble to clinch the Bond-villain-lair vibe). Ed led me to a narrow room in the house—where there was a rather-out-of-place-for-a-tropical-island modern workstation computer. I’d seen workstation computers before; in fact, the company I’d started was at the time (foolishly) thinking of building one. But the computer Ed had was from a company he was CEOing. It was a PERQ 1, made by Three Rivers Computer Corporation, which had been founded by a group from CMU including McCarthy’s former student Raj Reddy. I learned that Three Rivers was a company in trouble, and that Ed had recently jumped in to save it. I also learned that in addition to any other challenges the engineers there might have had, he’d added the requirement that the PERQ be able to successfully operate on a tropical island with almost 100% humidity.

\n

But in any case, Ed wanted to show me something on the screen. And here’s basically what it was:

\n
\n
\n
\n

Ed pressed a button and now this is what happened:

\n
\n
\n

\n

I’d seen plenty of “display hacks” before. Bill Gosper had shown me ones at Xerox PARC back in 1979, and my archives even contain some of the early color laser printer outputs he gave me:

\n

Click to enlarge

\n

I don’t remember the details of what Ed said. And what I saw looked like “display hacks flashing on the screen”. But Ed also mentioned the more science-oriented idea of reversibility. And I’m pretty sure he mentioned the term “cellular automaton”. It wasn’t a long conversation. And I remember that at the end I said I’d like to understand better what he was showing me.

\n

And so it was that Ed handed me a PERQ 8” floppy disk. And now, 41 years later, here it is, sitting— still unread—in my archives:

\n

Click to enlarge

\n

It’s not so easy these days to read something like this—and I’m not even sure it will have “magnetically survived”. But fortunately—along with the floppy—there’s something else Ed gave me that day. Two copies of a 9-page printout, presumably of what’s on the floppy:

\n

Click to enlarge

\n

And what’s there is basically a Pascal program (and the PERQ was a very Pascal-oriented machine; “PERQ” is said to have stood for “Pascal Engine that Runs Quicker”). But what does the program do? The main program is called “CA1”, suggesting that, yes, it was supposed to do something with cellular automata.

\n

There are a few comments:

\n

Click to enlarge

\n

And there’s code for making help text:

\n

Click to enlarge

\n

Apparently you press “b” to “clear the Celluar [sic] Automata boundary”, “n” for “Fredkin’s Pattern” and “p” for “EF1”. And at the end there’s a reference to munching squares. The first pattern above is what you get by pressing “n”; the second by pressing “p”.

\n

Both patterns look pretty messy. But if instead you press “a”, you get something with a lot more structure:

\n
\n
\n

\n

I think Ed showed this to me in passing. But he was more interested in the more complicated patterns, and in the fact that you could get them to reverse what they were doing. And in this animated form, I suspect this just looked to me like another munching squares kind of thing.

\n

But, OK, given that we have the program, can we tell what it actually does? The core of it is a bunch of calls to the function rasterop(). Functions like rasterop() were common in computers with bitmapped displays. Their purpose was to apply a certain Boolean operation to the array of black and white pixels in a region of the screen. Here it’s always rasterop(6, …) which means that the function being applied is Boolean function 6, or Xor (or “sum mod 2”).

\n

And what’s happening is that chunks of the screen are getting Xor’ed together: specifically, chunks that are offset by one pixel in each of the four directions. And this is all happening in two phases, swapping between different halves of the framebuffer. Here are the central parts of the sequence of frames that get generated starting from a single cell:

\n
\n
\n

\n

It helps a lot to see the separate frames explicitly. And, yes, it’s a cellular automaton. In fact, it’s exactly the “reversible mod-2 rule”. Here it is for a few more steps, with its simple “self-reproduction” increasingly evident:

\n
\n
\n

\n

Back in 1982 I think I only saw the PERQ that one time. But in one of the resort cabins on the other side of the island—there was this (as captured in a slightly blurry photograph that I took):

\n

Click to enlarge

\n

It was a “cellular automaton machine” built out of “raw electronics” by Tom Toffoli and Norm Margolus—who were the core of Ed’s “Information Mechanics” group at MIT. It didn’t feel much like science, but more like a video DJ performance. Patterns flashing and dancing on the screen. Constant rewiring to produce new effects. I wanted to slow it all down and “sciencify” it. But Tom and Norm always wanted to show yet another strange thing they’d found.

\n

Looking in my archives today, I find just one other photograph I took of the machine. I think I considered this the most striking pattern I saw the machine produce. And, yes, presumably it’s a 2D cellular automaton—though despite my decades of experience with cellular automata I don’t today immediately recognize it:

\n

Click to enlarge

\n

What did I make of Ed back in 1982? Remember, those were days long before the web, and before one could readily look up people’s backgrounds. So pretty much all I knew was that Ed was connected to MIT, and that he owned the island. And I had the impression that he was some kind of technology magnate (and, yes, the island and the plane helped). But it was all quite mysterious. Ed didn’t engage much in technical conversations. He would make statements that were more like pronouncements—that sounded interesting, but were too vague and general for me to do much more than make up my own interpretations for them. Sometimes I would try to ask for clarification, but the response was usually not an explanation, but instead a tangentially related—though often rather engaging—story.

\n

All these years later, though, one particular exchange stands out in my memory. It was at the end of the conference. We were standing around in the little restaurant on the island, waiting for a boat to arrive. And Ed said out of the blue: “I’ll make a deal with you. You teach me how to write a paper and I’ll teach you how to build a company.” At the time, this struck me as quite odd. After all, writing papers seemed easy to me, and I assumed Ed was doing it if he wanted to. And I’d already successfully started a company the previous year, and didn’t think I particularly needed help with it. (Though, yes, I made plenty of mistakes with that company.) But that one comment from Ed somehow for years cemented my view of him as a business tycoon who didn’t quite “get” science, though had ideas about it and wanted to dabble in it.

\n

Ed and Feynman

\n

Ed would later describe Richard Feynman as his best friend. As we discussed above, they’d first met in 1961, and in 1974 Ed had spent the year at Caltech visiting Feynman, having, as Ed tells it, made a deal (analogous to the one he later proposed to me) that he would teach Feynman about computers, and Feynman would teach him about physics. I myself first got to know Feynman in 1978, and interacted extensively with him not only about physics, but also about symbolic computing—and cellular automata. And in retrospect I have to say I’m quite surprised that he mentioned Ed to me only a few times in passing, and never in detail.

\n

But I think the point was that Feynman and Ed were—more than anything else—personal friends. Feynman tended to find “traditional academics” quite dull, and much preferred to hang out with more “unusual” people—like Ed. Quite often the people Feynman hung out with had quite kooky ideas about things, and I think he was always a little embarrassed by this, even though he often seemed to find it fun to indulge and explore those ideas.

\n

Feynman always liked solving problems, and applying himself to different kinds of areas. But I have to say that even I was a little surprised when in writing this piece I was going through the archives of Ed’s papers at MIT, and found the following letter from Feynman to Ed:

\n

Click to enlarge

\n

Clearly he—like me—viewed Ed as an authority on business. But what on earth was this “cutting machine”, and why was Feynman trying to sell it?

\n

For what it’s worth, the next couple of pages tell the story:

\n

Click to enlarge

\n

Feynman’s next-door neighbor had a company that made swimwear, and this was a machine for cutting the necessary fabric—and Feynman had helped develop it. And much as Feynman had been prepared to help his neighbor with this, he was also prepared to help Ed with some of his ideas about physics. And in the archive of Ed’s papers, there’s a letter from Feynman:

\n

Click to enlarge

\n

I don’t know whether this is the first place the term “Fredkin gate” was ever used. But what’s here is a quintessential example of Feynman diving into some new subject, doing detailed calculations (by hand) and getting a useful answer—in this case about what would become Ed’s best-known invention: reversible logic, and the Fredkin gate.

\n

Feynman had always been interested in “computing”. And indeed when he was recruited to the Manhattan Project it was to run a team of human computers (equipped with mechanical desk calculators). I think Feynman always hoped that physics would “become computational” at least in some sense—and he would for example lament to me that Feynman diagrams were such a bad way to compute things. Feynman always liked the methodology of traditional continuous mathematics, but (as I just noticed) even in 1964 he was saying that “I believe that the theory that space is continuous is wrong, because we get these infinities and other difficulties…”. And elsewhere in his 1964 lectures that became The Character of Physical Law Feynman says:

\n

Click to enlarge

\n

Did Feynman say these things because of his conversations with Ed? I rather doubt it. But as I was writing this piece I learned that Ed thought differently. As he told it:

\n
\n

I never pressed any issue that would sort of give me credit, okay? It’s just my nature. A very weird thing happened toward the end of my time at Caltech. Richard Feynman and I would get into very fierce arguments. . . . I’m trying to convince him of my ideas, that at the bottom is something finite and so on. He suddenly says to me, “You know, I’m sure I had this same idea sometime quite a while ago, but I don’t remember where or how or whether I ever wrote it down.” I said, “I know what you’re talking about. It’s a set of lectures you gave someplace. In those lectures you said perhaps the world is finite.” He just has this little statement in this book. I saw the book on his shelf. I got it out, and he was so happy to see that there. What I didn’t tell him was he gave that lecture years after I’d been haranguing him on this subject. I knew he thought it was his idea, and I left it that way. That was just my nature.

\n
\n

Notwithstanding what he said, I rather suspect he did push the point. And for example when Feynman gave a talk on “Simulating Physics with Computers” at the 1981 MIT Physics of Computation conference that Ed co-organized, he was careful to write that:

\n

Click to enlarge

\n

Ed, by the way, arranged for Feynman to get his first personal computer: a Commodore PET. I don’t think Feynman ended up using it terribly much, though in 1984 he took it with him on a trip to Hawaii where he and his son Carl used it to work out probabilities to try to “crack” the randomness of my rule 30 cellular automaton (needless to say, without success).

\n

Digital Physics & Reversible Logic

\n

Back at MIT in 1975 after his year at Caltech, Ed was no longer the director of Project MAC, but was still on the books as a professor, albeit something of an outcast one. Soon, though, he was teaching a class about his ideas—under the title of “Digital Physics”:

\n

Click to enlarge

\n

Cellular automata weren’t specifically mentioned in the course description—though in the syllabus they were there, with the Game of Life as a key example:

\n

Click to enlarge

\n

Back in the 1960s, cellular automata had been a popular topic in theoretical computer science. But by the mid-1970s the emphasis of the field had switched to things like computational complexity theory—and, as Ed told me many times, his efforts to interest people at MIT in cellular automata failed, with influential CS professor Albert Meyer (whose advisor Patrick Fischer had worked quite extensively on cellular automata) apparently telling Ed that “one can tell someone is out of it if they don’t think cellular automata are dead”. (It’s an amusing irony that around this time, Meyer’s future wife Irene Greif would point John Moussouris—who we’ll meet later—to Ed and his work on cellular automata.)

\n

Ed’s ideas about physics were not well received by the physicists at MIT. And for example when students from Ed’s class asked the well-known MIT physics professor Philip Morrison what he thought of Ed’s approach, he apparently responded that “Of course Fredkin thinks the universe is a computer—he’s a computer person; if instead he were a cheese merchant he’d think it was a big cheese!”

\n

When Ed was at Caltech in 1974 a big focus there—led by Carver Mead—was VLSI design. And this led to increasing interest in the ultimate limits on computation imposed by physics. Ever since von Neumann in the 1950s it had been assumed that every step in a computation would necessarily require dissipation of energy—and this was something Carver Mead took as a given. But if this was true, how could Ed’s cellular automaton for the universe work? Somehow, Ed reasoned, it—and any computation, for that matter—had to be able to run reversibly, without dissipating any energy. And this is what led Ed to his most notable scientific contribution: the idea of reversible logic.

\n

Ordinary logic operations—like And and Or—take two bits of input and give one bit of output. And this means they can’t be reversible: with only one bit in the output there isn’t information to uniquely determine the two bits of input from the output. But if—like Ed—you consider a generalized logic operation that for example has both two inputs and two outputs, then this can be invertible, i.e. reversible.

\n

The concept of an invertible mapping had long existed in mathematics, and under the name “automorphisms of the shift” had even been studied back in the 1950s for the case of what amounted to 1D cellular automata (for applications in cryptography). And in 1973 Charles Bennett had shown that one could make a reversible analog of a Turing machine. But what Ed realized is that it’s possible to make something like a typical computer design—and have it be reversible, by building it out of reversible logic elements.

\n

Looking through the archive of Ed’s papers at MIT, I found what seem to be notes on the beginning of this idea:

\n

Click to enlarge

\n

And I also found this—which I immediately recognized as a sorting network, in which values get sorted through a sequence of binary comparisons:

\n

Click to enlarge

\n

Sorting networks are inevitably reversible. And this particular sorting network I recognized as the largest guaranteed-optimal sorting network that’s known—discovered by Milton Green at SRI (then “Stanford Research Institute”) in 1969. It’s implausible that Ed independently discovered this exact same network, but it’s interesting that he was drawing it (by hand) on a piece of paper.

\n

Ed’s archives also contain a 3-page draft entitled “Conservative Logic”:

\n

Click to enlarge

\n

Ed explains that he is limiting himself to gates that implement permutations

\n

Click to enlarge

\n

and then goes on to construct a “symmetric-majority-parity” gate—which he claims is “computation universal”:

\n

Click to enlarge

\n

It’s not quite a Fredkin gate, but it’s close. And, by the way, it’s worth pointing out that these gates alone aren’t “computation universal” in something like the Turing sense. Rather, the point is that—like with Nand for ordinary logic—any reversible logic operation (i.e. permutation) with any number of inputs can be constructed using just these gates, connected by wires.

\n

Ed didn’t at first publish anything about his reversible logic idea, though he talked about it in his class, and in 1978 there were already students writing term papers about it. But then in 1978, as Ed told it later:

\n
\n

I found this guy Tommaso Toffoli. He had written a paper that showed how you could build a reversible computer by storing everything that an ordinary computer would have to forget. I had figured out how to have a reversible computer that didn’t store anything because all the fundamental activity was reversible. Okay? So I decided to hire him because he was the only person who tried to do it and he didn’t succeed, really, and I had—and I hired him to help me.

\n
\n

Toffoli had done a first PhD in Italy building electronics for cosmic ray detectors, and in 1978 he’d just finished a second PhD, working on 2D cellular automata with Art Burks (who had coined the name “cellular automaton”). Ed brought Toffoli to MIT under a grant to build a cellular automaton machine—leading to the machine I saw on Ed’s island in 1982. But Ed also worked with Toffoli to write a paper about conservative logic—which finally appeared in 1982, and contained both the Fredkin gate, and the Toffoli gate. (Ed later griped to me that Toffoli “really hadn’t done much” for the paper—and that after all the Toffoli gate was just a special case of the Fredkin gate.)

\n

Back in 1980—on the way to this paper—Ed, with Feynman’s encouragement, had had another idea: to imagine implementing reversible logic not just abstractly, but through an explicit physical process, namely collisions between elastic billiard balls. And as we saw above, Feynman quickly got into analyzing this, for example seeing how a Fredkin gate could be implemented just with billiard balls.

\n

But ultimately Ed wanted to implement reversibility not just for things like circuits, but also—imitating the reversibility that he believed was fundamental to physics—for cellular automata. Now the fact is that reversibility for cellular automata had actually been quite well studied since the 1950s. But I don’t think Ed knew that—and so he invented his own way to “get reversibility” in cellular automata.

\n

It came from something Ed had seen on the PDP-1 back in 1961. As Ed tells it, in playing around with the PDP-1 he had come up with a piece of code that surprised him by drawing something close to a circle in pixels on the screen. Minsky had apparently “gone into the debugger” to see how it worked—and in 1972 HAKMEM attributed the algorithm to Minsky (though in the Pascal program I got from Ed in 1982, it appears as a function called efpattern()). Here’s a version of the algorithm:

\n
\n
\n

\n
\n
\n

\n

And, yes, with different divisors d it can give rather different (and sometimes wild) results:

\n
\n
\n

\n

But for our purposes here what’s important is that Ed found out that this algorithm is reversible—and he realized that in some sense the reason is that it’s based on a second-order recurrence. And, once again, the basic ideas here are well known in math (cf. reversibility of the wave equation, which is second order). But Ed had a more computational version: a second-order cellular automaton in which one adds mod 2 the value of a cell two steps back. And I think in 1982 Ed was already talking about this “mod-2 trick”—and perhaps the PERQ program was intended to implement it (though it didn’t).

\n

Ed’s work on reversible logic and “digital physics” in a sense came to a climax with the 1981 Physics of Computation conference at MIT—that brought in quite a Who’s Who of people who’d been interested in related topics (as I mentioned above, I wasn’t there because of a clash with the release of SMP Version 1.0, though I did meet or at least correspond with most of the attendees at one time or another):

\n

Click to enlarge

\n

Originally Ed wanted to call the conference “Physics and Computation”. But Feynman objected, and the conference was renamed. In the end, though, Feynman gave a talk entitled “Simulating Physics with Computers”—which most notably talked about the relation between quantum mechanics and computation, and is often seen as a key impetus for the development of quantum computing. (As a small footnote to history, I worked with Feynman quite a bit on the possibility of both quantum computing and quantum randomness generation, and I think we were both convinced that the process of measurement was ultimately going to get in the way—something that with our Physics Project we are finally now beginning to be able to analyze in much more detail.)

\n

But despite his interactions with Feynman, Ed was never too much into the usual ideas of quantum mechanics, hoping (as he said in the flyer for his course on digital physics) that perhaps quantum mechanics would somehow fall out of a classical cellular-automaton-based universe. But when quantum computing finally became popular in the 1990s, reversible logic was a necessary feature, and the Fredkin gate (also known as CSWAP or “controlled-swap”) became famous. (The Toffoli gate—or CCNOT—is a bit more famous, though.)

\n

In tracing the development of Ed’s ideas, particularly about “digital physics”, there’s another event worthy of mention. In late 1969 Ed learned about an older German tech entrepreneur named Konrad Zuse who’d published an article in 1967 (and a book in 1969) on Rechnender Raum (Calculating Space)—mentioning the term “cellular automata”:

\n

Click to enlarge

\n

Although Zuse was 24 years older than Ed, there were definitely similarities between them. Zuse had been very early to computers, apparently building one during World War II that suffered an air raid (and may yet still lie buried in Berlin). After the war, Zuse started a series of computer companies—and had ideas about many things. He’d been trained as an engineer, and perhaps it was having worked on solving his share of PDEs using finite differences that led him to the idea—a bit like Ed’s—that space might fundamentally be a discrete grid. But unlike Ed, Zuse for the most part seemed to think that—as with finite differences—the values on the grid should be continuous, or at least integers. Ed arranged for Zuse’s book to be translated into English, and for Zuse to visit MIT. I don’t know how much influence Zuse had on Ed, and when Ed talked to me about Zuse it was mostly just to say that people had treated his ideas—like Ed’s—as rather kooky. (I exchanged letters with Zuse in the 1980s and 1990s; he seemed to find my work on cellular automata interesting.)

\n

Ideas & Inventions Galore

\n

It wasn’t just physics that Ed had ideas about. It was lots of other things too. Sometimes the ideas would turn into businesses; more often they’d just stay as ideas. Ed’s archive, for example, contains a document on the “Intermon Idea” that Ed hoped would “provide a permanent solution to the world’s problem of not having a stable medium of exchange”:

\n

Click to enlarge

\n

And, no, Ed wasn’t Satoshi Nakamoto—though he did tell me several times that (although, to his displeasure, it was never acknowledged) he had suggested to Ron Rivest (the “R” of RSA cryptography) the idea of “using factoring as a trapdoor”. And—not content with solving the financial problems of the world, or, for that matter, fundamental physics—Ed also had his “algorithmic plan” to prevent the possibility of World War III.

\n

And then there was the Muse. Marvin Minsky had long been involved with music, and had assembled out of electronic modules a system that generated sequences of musical notes. But in 1970 Ed and Minsky developed what they called the Muse—whose idea was to be a streamlined system that would use integrated circuits to “automatically compose music”:

\n

Click to enlarge

\n

In actuality, the Muse produced sequences of notes determined by a linear feedback shift register—in essence a 1D additive cellular automaton—in which the details of the rule were set on its front panel as “themes”. The results were interesting—if rather R2-D2-like—but weren’t what people usually thought of as “music”. Ed and Minsky started a company named Triadex (note the triangular shape of the Muse), and manufactured a few hundred Muses. But the venture was not a commercial success.

\n

Particularly through interacting with Minsky, Ed was quite involved in “things that should be possible with AI”. The Muse had been about music. But Ed also for example thought about chess—where he wanted to build an array of circuits that could tree out possible moves. Working with Richard Greenblatt (who had developed an earlier chess machine) my longtime friend John Moussouris ended up designing CHEOPS (a “Chess-Oriented Processing System”) while Ed was away at Caltech. (Soon thereafter, curiously enough, Moussouris would go to Oxford and work with Roger Penrose on discrete spacetime—in the form of spin networks. Then in later years he would found two important Silicon Valley microprocessor companies.)

\n

Keeping on the chess theme, Ed would in 1980 (through his Fredkin Foundation) put up the Fredkin Prize for the first computer to beat a world champion at chess. The first “pre-prize” of $5k was awarded in 1981; the second pre-prize of $10k in 1988—and the grand prize of $100k was awarded in 1997 with some fanfare to the IBM Deep Blue team.

\n

Ed also put up a prize for “math AI”, or, more specifically, automated theorem proving. It was administered through the American Math Society and a few “milestone prizes” were given out. But the grand Leibniz Prize “for the proof of a ‘substantial’ theorem in which the computer played a major role” was never claimed, the assets of the Fredkin Foundation withered, and the prize was withdrawn. (I wonder if some of the things done in the 1980s and 1990s by users of Mathematica should have qualified—but Ed and I never made this connection, and it’s too late now.)

\n

Ed the Consultant

\n

Particularly during his time at MIT, Ed did a fair amount of strategy consulting for tech companies—and Ed would tell me many stories about this, particularly related to IBM and DEC (which were in the 1980s the world’s two largest computer companies).

\n

One story (whose accuracy I’ve never been able to determine) related to DEC’s ultimately disastrous decision not to enter the personal computer business. As Ed tells it, a team at DEC did a focus group about PCs—with Ken Olsen (CEO of DEC) watching. There was a young teacher in the group who was particularly enthusiastic. And Olsen seemed to be getting convinced that, yes, PCs were a good idea. As the focus group was concluding, the teacher listed off all sorts of ways PCs could change the world. But then, fatefully, he added right at the end: “And I don’t just mean here on Earth”. Ed claims this was the moment when Olsen decided to kill the PC project at DEC.

\n

Ed told a story from the early 1970s about a giant IBM project called FS (for “Future Systems”):

\n
\n

IBM has this project. They’re going to completely revolutionize everything. The project is to design everything from the smallest computer to the new largest. They’re all to be multiprocessors. The specs were just fantastic. They promised to guarantee their customers 100% uptime. Their plans were, for instance, when you have a new OS, it’s updated. They guarantee 24-hour operation at all times. They plan to be able to update the OS without stopping this process. Things like that, a lot of goals that are very lofty, and so on.

\n
\n
\n

Someone at IBM whom I knew very well, a very senior guy, came to me one day and said, “Look, these guys are in trouble, and maybe MIT could help them.” I organized something. Just under 30 professors of computer science came down to IBM. We got there on Sunday night and starting Monday morning, we got one lecture an hour, eight on Monday, Tuesday, Wednesday, Thursday, and four on Friday, describing the system. It was just spectacular, everything they were trying to do, but it was full of all kinds of idiocy. They were designing things that they’d never used. This whole thing was to be oriented about people looking at displays.

\n
\n
\n

No one at IBM had done anything like that. They think, “Okay, you should have a computer display,” and they came up with certain problems that hadn’t occurred to the rest of us. If you’re looking at the display, how can you tell the difference between what you had put into the computer and what the computer had put in? This worried them. They came up with a hardware fix. When you typed, it always went on the right half of the screen; when the computer did something, it always went on the left half, or I may have it backwards, but that was the hardware.

\n
\n
\n

\n
\n
\n

What happened is I came to realize that they were so over their head in their goal that they were going to annihilate themselves with this thing. It was just going to be the world’s greatest fiasco for it. I started cornering people and saying, “Look, do you realize that you’re never going to make this work?” and so on, so forth. This came to the attention of people at IBM, and it annoyed them. I got a call from someone saying, “Look, you’re driving us nuts. We want to hear you out, so we’re going to conduct a debate.” There’s a guy named Bob [Evans], who was the head of the project. What happened was we’re in the boardroom with IBM, lots of officials there, and he and I have a debate.

\n
\n
\n

I’m debating that they have to kill the project and do something else. He’s debating that they shouldn’t kill the project. I made all my points. He made all his points. Then a guy named Mannie Piore, who was the one who thought of the idea of having a research laboratory, a very senior guy said to me, he said, “Hey, Ed,” he said, “We’ve heard you out.” He says, “This is our company. We can do this product even if you think we shouldn’t.” I said, “Yes, I admit that’s true.” He said, “You presented your case. We’ve heard you out, and we want to do it.” I said, “Okay.” He said, “Can you do us a favor?” I said, “What’s that?’ He said, “Can you stop going around talking to people about why it has to be killed?” I said, “Look, I’ve said my piece. I’ve been heard out.” “Yes. Okay.” “I quit.”

\n
\n
\n

I had only one ally in that room; that was John Cocke. As we were walking out of the room, he came over to me and said, “Don’t worry, Ed.” He said, “It’s going to fall over of its own weight.” I’ll never forget that. Ten days later, it was canceled. A lot of people were very mad at me.

\n
\n

I’m not sure what Ed was like as an operational manager of businesses. But he certainly had no shortage of opinions about how businesses should be run, or at least what their strategies should be. He was always keen on “do-the-big-thing” ideas. I remember him telling me multiple times about a company that did airplane navigation. It had put a certain number of radio navigation beacons into its software. Ed told me he’d asked about others, and the company had said “Well, we only put in the beacons lots of people care about”. Ed said “Just put all of them in”. They didn’t. And eventually they were overtaken by a company that did.

\n

Ed the Businessman

\n

Ed’s great business success—and windfall—was III. But Ed was also involved with a couple dozen other companies—almost all of which failed. There’s a certain charm in the diversity of Ed’s companies. There was Three Rivers Computer Corporation, that made the PERQ computer. There was Triadex, that made the Muse. There was a Boston television station. There was an air taxi service. There was Fredkin Enterprises, importing PCs into the Soviet Union. There was Drake’s Anchorage, the resort on his island. There was Gensym, a maker of AI-oriented process control systems, which was a rare success. And then there was Reliable Water.

\n

Ed’s island—like many tropical islands—had trouble getting fresh water. So Ed decided to invent a solution, coming up with a new, more energy-optimized way to do reverse osmosis—with a dash of AI control. Reliable Water announced its product in May 1987, desalinating water taken from Boston Harbor and serving it to journalists to drink. (Ed told me he was a little surprised how willingly they did so.)

\n

Click to enlarge

\n

Looking at my archives I see I was sufficiently charmed by the picture of Ed posing with his elaborate “intelligent” glass tubing that I kept the article from New Scientist:

\n

Click to enlarge

\n

As Ed told it to me, Reliable Water was just about to sell a major system to an Arab country when his well-pedigreed CEO somehow cheated him, and the deal fell through.

\n

But what about the television station? How did Ed get involved with that? Apparently in 1969 Jerry Wiesner, then president of MIT, encouraged Ed to support a group of Black investors (led by a certain Bertram Lee) who were challenging the broadcasting license of Boston’s channel 7. Years went by, other suitors showed up, and litigation about the license went all the way to the Supreme Court (which described the previous licensee as having shown an “egregious lack of candor” with the FCC). For a while it seemed like channel 7 might just “go dark”. But in early January 1982 (just a couple of weeks before I first met him) Ed took over as president of New England Television Corporation (NETV)—and in May 1982 NETV took over channel 7, leaving Ed with a foot of acquisition documents in his home library, and a television channel to run:

\n

Click to enlarge

\n

There’d been hopes of injecting new ideas, and adding innovative educational and other content. But things didn’t go well and it wasn’t long before Ed stepped down from his role.

\n

A major influence on Ed’s business activities came out of something that happened in his personal life. In 1977 Ed had been married for 20 years and had three almost-grown children. But then he met Joyce. On a flight back from the Caribbean he sat next to a certain Joyce Wheatley who came from a prominent family in the British Virgin Islands and had just graduated with a BS in economics and finance from Bentley College (now Bentley University) in Waltham, MA. As both Ed and Joyce tell it, Ed immediately gave advice like that the best way to overcome a fear of flying was to learn to fly (which much later, Joyce in fact did).

\n

Joyce was starting work at a bank in Boston, but matters with Ed intervened, and in 1980 the two of them were married in the Virgin Islands, with Feynman serving as Ed’s best man (and at the last minute lending Ed a tie for the occasion). In 1981, Ed and Joyce had a son, who they named Richard after Richard Feynman (though now themed as “Rick”)—of whom Ed was very proud.

\n

When Ed died, Joyce and he had been married for 43 years—and Joyce had been Ed’s key business partner all that time. They made many investments together. Sometimes it’d start with a friend or vendor. Sometimes Ed (or Joyce) would meet students or others—who’d be invited over to the house some evening, and leave with a check. Sometimes the investments would be fairly hands-off. Sometimes Ed would get deeply involved, even at times playing CEO (as he did with Three Rivers and NETV).

\n

When the web started to take off, Ed and Joyce created a company called Capital Technologies which did angel investing—and ended up investing in many companies with names like Sourcecraft, SqueePlay, EchoMail, Individual Inc. and Radnet. And—like so many startups of this kind—most failed.

\n

Ed also continued to have all sorts of ideas of his own, some of which turned into patents. And—like so much to do with Ed—they were eclectic. In 1995 (with a couple of other people) there was one based on using evanescent waves (essentially photon tunneling) to more accurately find the distance between the read/write head and the disk in a disk drive or CD-ROM drive. Then in 1999 there was the “Automatic Refueling Station”—using machine vision plus a car database to automate pumping gas into cars:

\n

Click to enlarge

\n

That was followed in 2003 by a patent about securely controlling telephone switching from web clients. In 2006, there was a patent application named simply “Contract System” about an “algorithmic contract system” in which the requirements of buyers and sellers of basically anything would be matched up in a kind of tiling-oriented geometrical way:

\n

Click to enlarge

\n

In 2011 there was “Traffic Negotiation System”, in which cars would have rather-airplane-like displays installed that would get them in effect to “drive in formation” to avoid traffic jams:

\n

Click to enlarge

\n

Ed’s last patent was filed in 2015, and was essentially for a scheme to cache large chunks of the web locally on a user’s computer—a kind of local CDN.

\n

But all these patents represented only a small part of Ed’s “idea output”. And for example Ed told me many other tech ideas he had—a few of which I’ll mention later.

\n

And Ed’s business activities weren’t limited to tech. He did his share of real-estate transactions too. And then there was his island. For years Joyce and Ed continued to operate Drake’s Anchorage, and tried to improve the infrastructure of the island—with Ed, as Joyce tells it, more often to be found helping to fix the generator on the island than partaking of its beaches.

\n

Back in 1978 Ed had acquired a “neighbor” when Richard Branson bought Necker Island, which was a couple of miles further out towards the Atlantic than Moskito Island. Ed told me quite a few stories about Branson, and for years had told me that Branson wanted to buy his island. Ed hadn’t been interested in selling, but eventually agreed to give Branson right of first refusal. Then in 2007 a Czech (or were they a Russian?) showed up and offered to buy the island for cash “to be delivered in a suitcase”. It was all rather sketchy, but Ed and Joyce decided it was finally time to sell, and let Branson exercise his right of first refusal, and buy the island for about $10M.

\n

Ed and His Toys

\n

Ed liked to buy things. Computers. Cars. Planes. Boats. Oh, and extra houses too (Vermont, Martha’s Vineyard, Portola Valley, …)—as well as his island. Ed would typically make decisions quickly. A house he drove by. New tech when it first came out. He was always proud of being an early adopter, and he’d often talk almost conspiratorially about the “secret” features he’d figured out in new tech he’d bought.

\n

But I think Ed’s all-time favorite “toys” were planes—and over the course of his life he owned a long sequence of them. Ed was a serious (and, by all reports, exceptionally good) pilot—with an airplane transport pilot license (plus seaplane and glider licenses). And I always suspected that his cut-and-dried approach to many things reflected his experience in making decisions as a pilot.

\n

Ed at different times had a variety of kinds of planes, usually registered with the vanity tail number N1EF. There were twin-propellor planes. There were high-performance single-propellor planes. There was the seaplane that I’d “met” in the Caribbean. At one time there was a jet—and in typical fashion Ed got himself certified to fly the jet singlehandedly, without a copilot. Ed had all sorts of stories about flying. About running into Tom Watson (CEO of IBM) who was also a pilot. About getting a new type of plane where he thought he was getting #5 off the production line, but it was actually #1—and one day its engine basically melted down, but Ed was still able to land it.

\n

Ed also had gliders, and competed in gliding competitions. Several times he told me a story—as a kind of allegory—about another pilot in a gliding competition. Gliders are usually transported with their wings removed, with the wings attached in order to fly. Apparently there was an extra locking pin used, which the other pilot decided to remove to save weight, because it didn’t seem necessary. But when the glider was flying in the competition its wings fell off. (The pilot had a parachute, but landed embarrassed.) The very pilot-oriented moral as far as Ed was concerned: just because you don’t understand why something is there, don’t assume it’s not necessary.

\n

Ed and the Soviet Union

\n

One of the topics about which Ed often told “you-can’t-make-this-stuff-up” stories was the Soviet Union. Ed’s friend John McCarthy had parents who were active communists, had learned Russian, and regularly took trips to the Soviet Union. And as Ed tells it McCarthy came to Ed one day and said (perhaps as a result of having gotten involved with a Russian woman) “I’m moving to the Soviet Union”, and talked about how he was planning to dramatically renounce his US citizenship. McCarthy began to make arrangements. Ed tried to talk him out of it. And then it was 1968 and the Soviets send their tanks into Czechoslovakia—and McCarthy is incensed, and according to Ed, sends a telegram to a very senior person in the Soviet Union saying “If you invade Czechoslovakia then I’m not coming”. Needless to say, the Soviets ignored him. Ed told me he’d said at the time: “If the Russians were really smart and really understood things, and they had to choose between John McCarthy and Czechoslovakia, they should have chosen John McCarthy.” (McCarthy would later “flip” and become a staunch conservative.)

\n

Perhaps through McCarthy, Ed started visiting the Soviet Union. He didn’t like the tourist arrangements (required to be through the government’s Intourist organization)—and decided to try to do something about it, sending a survey to Americans who’d visited the Soviet Union:

\n

Click to enlarge

\n

A year later, Ed was back in the Soviet Union, attending a somewhat all-star conference (along with McCarthy) on AI—with a rather modern-sounding collection of topics:

\n

Click to enlarge

\n

Here’s a photograph of a bearded Ed in action there—with a very Soviet simultaneous translation booth behind him:

\n

Click to enlarge

\n

Ed used to tell a story about Soviet computers that probably came from that visit. The Soviet Union had made a copy of an IBM mainframe computer—labeling it as a “RYAD” computer. There was a big demo—and the computer didn’t work. The generals in charge asked “Well, did you copy everything?” As it turned out, there was active circuitry in the “IBM” logo—and that needed to be copied too. Or at least that’s what Ed told me.

\n

But Ed’s most significant interaction with the Soviet Union came in the early 1980s. The US had in place its CoCom list that embargoed export of things like personal computers to the Soviet Union. Meanwhile, within the Soviet Union, photocopiers were strictly controlled—to prevent non-state-sanctioned flow of information. But as Ed tells it, he hatched a plan and sold it to the Reagan administration, telling them: “You’re on the wrong track. If we can get personal computers into the Soviet Union, it breaks their lock on the flow of information.” But the problem was he had to convince the Soviets they wanted personal computers.

\n

In 1984 Ed was in Moscow—supposedly tagging along to a physics conference with an MIT physicist named Roman Jackiw. He “dropped in” at the Computation Center of the Academy of Sciences (which, secretly, was a supplier to the KGB of things like speech recognition tech). And there he was told to talk to a certain Evgeny Velikhov, a nuclear physicist who’d just been elected vice president of the Academy of Sciences. Velikhov arranged for Ed to give a talk at the Kremlin to pitch the importance of computers, which apparently he successfully did, after convincing the audience that his motivation was to make the world a safer place by balancing the technical capabilities of East and West.

\n

And as if to back up this point, while he was in the Soviet Union, Ed wrote a 5-page piece from “A Concerned Citizen, Planet Earth” addressed “To whom it may concern” in Moscow and Washington—ending with the suggestion that its plan might be discussed at an upcoming meeting between Andrei Gromyko and Ronald Reagan at the UN:

\n

Click to enlarge

\n

The piece mentions another issue: the fate of prominent, but by then dissident, Soviet physicist Andrei Sakharov, who was in internal exile and reportedly on hunger strike. Ed hatched a kind of PCs-for-Sakharov plan in which the Soviets would get PCs if they freed Sakharov.

\n

Meanwhile, in true arms-dealer-like fashion, he’d established Fredkin Enterprises, S.A. which planned to export PCs to the Soviet Union. He had his student Norm Margolus spend a summer analyzing the CoCom regulations to see what characteristics PCs needed to have to avoid embargo.

\n

In the Reagan Presidential Library there’s now a fairly extensive file entitled “Fredkin Computer Exports to USSR”—which for example contains a memo reporting a call made on August 25, 1984, by then-vice-president George H. W. Bush to Sakharov’s stepdaughter, who was by that time living in Massachusetts (and, yes, Ed was described as a “PhD in computer science” with a “flourishing computer business”):

\n

Click to enlarge

\n

Soon the White House is communicating with the US embassy in Moscow to get a message to Ed:

\n

Click to enlarge

\n

And things are quickly starting to sound as if they were from a Cold War spy drama (there’s no evidence Ed was ever officially involved with the US intelligence services, though):

\n

Click to enlarge

\n

I don’t think Ed ever ended up talking to Sakharov, but on November 6, 1984, Fredkin Enterprises was sent a letter by Velikhov ordering 100 PCs for the Academy of Sciences, and saying they hoped to order 10,000 more. But the US was not as speedy, and in 1985 there was still back and forth about CoCom issues. Ed of course had a plan:

\n

\n

And indeed in the end Ed did succeed in shipping at least some computers to the Soviet Union, adding a hack to support Cyrillic characters. Ed often took his family with him to Moscow, and he told me that his son Rick created quite a stir when at age 6 he was seen there playing a game on a computer. Up to then, computers had always been viewed as expensive tools for adults. But after Rick’s example there were suddenly all sorts of academicians’ kids using computers.

\n

(In the small world that it is, one person Ed got to know in the Academy of Sciences was a certain Arkady Borkovsky—who in 1989 would leave Russia to come work at our company, and who would later co-found Yandex.)

\n

By the way, to fill in a little color of the time, I might relate a story of my own. In 1987 I went to a (rather Soviet) conference in Moscow on “Logic, Methodology and Philosophy of Science.” Like everyone, I was assigned a “guide”. Mine continually tried to pump me for information about the American computer industry. Eventually I just said: “So what do you actually want to know?” He said: “We’ve cloned the Intel 8086 microprocessor, and we want to know if it’s worth cloning the Motorola 68000. Motorola has put a layer of epoxy that makes it hard to reverse engineer.” He assumed that the epoxy was at the request of the US government, to defeat Soviet efforts—and he didn’t believe me when I said I thought it was much more likely there to defeat Intel.

\n

Ed told me another story about his interactions with Soviet computer efforts after Gorbachev came to power:

\n
\n

Before the days of integrated circuits the way IBM and Digital built computers was they put the whole computer together, and then it would sit for six weeks in “system integration” while they made the pieces work together and slowly got the bugs out.

\n
\n
\n

The Russians built computers differently because that seemed logical to them. They’d send all the components down there and then some guy was supposed to plug them together, and they were supposed to work. But they didn’t. With these big computers, they never made any of them work.

\n
\n
\n

The Academy of Sciences had one. And one time I went to see their big computer, so they unlock the doors to this dusty room where the computer is, where it’s not being used because it doesn’t work, and all this information is being kept secret, not from the United States, but from the leadership. When I discovered all this I documented it … and I wrote a 40-page document that explained it.

\n
\n
\n

I was making trips with Rick often and Mike [his older son] very often. On one trip when I arrived, they tell me, “Oh, you have to come to this meeting.”

\n
\n
\n

I don’t speak Russian. I never knew it. I’m seated at this meeting, and there’s a Russian friend of mine [head of the Soviet Space Research Institute] next to me. We’re just sitting there, and things are going on. I still don’t know what that meeting was, but I had this 40-page document. I gave it to my friend. He starts reading. He says, “Oh, this is so interesting.” It got to be about ten o’clock at night and they said, “Everyone come back in the morning. Nine o’clock.”

\n
\n
\n

My friend said, “Can I borrow this [document]? I’ll bring it back in the morning”. I said, “Sure, go ahead.” He comes back next morning. He says to me, “I have good news, and I have bad news.” I said, “What’s the good news?” He says, “Your document has been translated into Russian.” I said, “You left here with a 40-page typewritten document. I don’t believe you.” He said, “Well, my institute recently took on the task of translating scientific American into Russian.

\n
\n
\n

“When I left here, I went to my institute, called in the translators, and they all came in. We divided the document up between them, and it’s all been translated into Russian.”

\n
\n
\n

The document was the analysis of the RYAD situation with the recommendation that the only thing they could do was to cancel it all.

\n
\n
\n

I said, “Okay, what’s the bad news?” He says, “The bad news is it’s classified secret.” When you made a copy or did something, you had to have a government person look at it. They classified it. I said to him, “You can’t classify my documents.” He said, “Of course not. We haven’t. It’s just the Russian one that’s secret.”

\n
\n
\n

Then maybe a week later, he said, “Gorbachev’s read your document.” He canceled it. RYAD. Some people I know were looking to kill me.

\n
\n
\n

In Moscow, there’s a building that’s so unusual. It’s on a highway leading into the city. It’s about five stories high. It’s about a kilometer long, okay? It’s a giant building. I was in it a few years ago, and it’s just a beehive of startups, almost all software startups. That was the RYAD Software Center, okay? 100,000 people got put out of work.

\n
\n

Ed Becomes a Physics Professor

\n

When I first met Ed in 1982, he was in principle a professor at MIT. But he was also CEOing a computer company (Three Rivers), and, though I didn’t know it at the time, had just become president of a television channel. Not to mention a host of other assorted business activities. MIT had a policy that professors could do other things “one day a week”. But Ed was doing other things a lot more than that. Ed used to say he was “tricked” out of his tenured professorship. Because in 1986 he was convinced that with all the other things he had going on, he should become an adjunct professor. But apparently he didn’t realize that tenure doesn’t apply to adjunct professors. And, as Ed told it, the people in the department considered him something of a kook, and without tenure forcing them to keep him, were keen to eject him.

\n

Minsky’s neighbor in Brookline, MA, was a certain Larry Sulak—the very energetic chairman of the physics department at Boston University (and someone I have known since the 1970s). Ed knew Sulak and when Ed was ejected from MIT, Sulak seized the opportunity to bring Ed in as a physics professor at Boston University. Sulak asked me to write a letter about Ed (and, yes, particularly after the research for this piece, there are some things I would change today):

\n

\n
\n
\n
Subject: Re: Ed Fredkin
\n
Date: Aug 24, 1988
\n
From: Stephen Wolfram
\n
To: Larry Sulak
\n
\n

\n
\nDear Larry:

\n

In this century, people like Ed Fredkin have been very rare. Ed Fredkin
\nis a gentleman scientist. He has made several fortunes in business, yet
\nhe chooses to spend much of his time thinking about science.

\n

The main thing he thinks about is what ideas from computing can tell us
\nabout physics. This is an area that I believe has fundamental importance
\nfor physics. There are many issues about the behaviour of complex
\nphysical systems where the best hope for analysis and understanding comes
\nfrom computational ideas. There are also many traditional problems
\nin quantum physics and other fundamental areas that I suspect are most
\nlikely to be solved by thinking about things from a computational point
\nof view.

\n

Ed Fredkin has had some very good ideas about physics and its relation
\nto computation. Probably the single most important was his independent discovery
\nof the possibility of thermodynamically reversible computation.
\nvon Neumann got this wrong — by thinking about things from a computational
\npoint of view, Fredkin got it right.

\n

Fredkin has been convinced for many years that cellular automata —
\nbasically computational models — could describe fundamental physical
\nprocesses. As you know, I have worked on using cellular automata to
\nmodel various specific physical processes. Fredkin is trying to do something
\ngrander — he wants to show that all of physics can be reproduced by
\na cellular automaton. If he is right the discovery would be one whose
\nimportance could be compared to the discovery of quantization.
\nOf course, what he is trying to show may not be true, but that is a risk
\nthat any new fundamental idea in physics faces.

\n

Ed Fredkin’s style is not typical of scientists. He is more used to
\naddressing boards of directors than lecture audiences. He learned
\nthe kind of physics that is in the Feynman lectures by spending time
\nwith Dick Feynman rather than reading his books. To some standard
\nscientists, Fredkin at first seems like a nut. To be sure, some of his
\nideas are pretty nutty. But if you listen and think about it, there
\nis much substance to what Fredkin has to say.

\n

I gather that Fredkin has decided to spend some time around “ordinary
\nphysicists”, to try and work out how his ideas fit in with current
\nphysical thinking. I believe you are very lucky that Fredkin wants
\nto do this in your department.

\n

Best wishes,
\nStephen

\n
\n
\n

\n

And so it was that Ed became a research professor of physics at Boston University (BU). At MIT he’d gotten a DARPA grant that supported Tom Toffoli and Ed’s only “physics PhD student” Norm Margolus in building ever-larger “cellular automaton machines”. And when Ed moved to BU, this effort moved with him, leaving in effect “no trace of Ed” at MIT.

\n

When Ed arrived at BU he found he was assigned to an office with a certain Gerard ‘t Hooft—who happens to be one of the more creative and productive theoretical physicists of the past half-century (and would win a Nobel Prize in 1999 for his efforts). Ed became friends with ‘t Hooft, inviting him and his family to spend time on his island, and later on the boat that Ed bought in the south of France. Feynman died in 1988, and Ed would tell me that he thought he’d “traded” one great physicist for another. (Feynman had suggested Ed try Sidney Coleman, but Coleman wasn’t into it.)

\n

Like Feynman, I think ‘t Hooft felt a little uneasy with Ed’s statements about physics. But in 2016 ‘t Hooft ended up publishing a book entitled The Cellular Automaton Interpretation of Quantum Mechanics. I thought it was a nice recognition of ‘t Hooft’s friendship with Ed. But Ed told me in no uncertain terms that he thought ‘t Hooft hadn’t given him the credit he was due—though in reality I don’t think what ‘t Hooft did was much related to Ed’s actual work and ideas. (And, by the way, it’s not directly related to my efforts either, though conceivably looking at “generational states” in our Physics Project may give something at least somewhat analogous.)

\n

In 1994 Ed’s direct affiliation with BU ended—though he remained on good terms with the department, and after I moved to the Boston area in 2002 I would often see him at an annual dinner the BU physics department put on for “Boston-area physics people”.

\n

In 1998 Ed would summarize himself like this:

\n
\n

Ed Fredkin has worked with a number of companies in the computer field and has held academic positions at a number of universities. He is a computer programmer, a pilot, advisor to businesses and an amatuer [sic] physicist. His main interests concern digital computer like models of basic processes in physics.

\n
\n

For a while, Ed didn’t have a “university affiliation” (except, through Minsky, as a visitor at the MIT Media Lab), but in 2003—through his friend Raj Reddy—he became a professor (now of computer science) at Carnegie Mellon University, for a while spending time at their West Coast outpost, but mostly just making occasional trips in his plane to Pittsburgh.

\n

Forty Years of Interactions with Ed

\n

For a few years after I first met Ed in 1982, I’d see him fairly regularly. In 1983 I invited him to the first “modern” conference on cellular automata, that I co-organized at Los Alamos. I visited his house in Brookline, MA, a few times. I saw him at the Aspen Center for Physics, and at other places around the world. He was always fun and lively—and told great stories about all sorts of things. He gave the impression that he was mostly spending his time doing big things in business, and that science was an avocation for him. Sometimes he would talk about cellular automata—though I now realize that what he said was either very general and philosophical (leaving me to interpret things in my own way), or very specific to particular rules he’d engineered.

\n

It was always a bit uncomfortable when it came to physics. Because the things Ed was saying always seemed to me pretty naive. Quite often I would challenge them—and frustratedly tell Ed that he should learn twentieth-century physics. But Ed would glide over it—and be off telling some other (engaging) story, or some such.

\n

In 1986 I co-organized (with Tom Toffoli and Charles Bennett) a conference called Cellular Automata ’86—at MIT. Ed didn’t come—and I think I had the impression that he’d rather lost interest in cellular automata by that time. I myself went off to start my Center for Complex Systems Research, and then to found Wolfram Research and start the development of Mathematica. Mathematica was released on June 23, 1988—and our records (yes, we’ve kept them!) show that Ed registered his first copy on December 14, 1988. In March 1991 I did a lecture tour about Mathematica 2.0, and saw Ed one last time before diving into work on my book A New Kind of Science—which led me for more than a decade to became an almost complete scientific hermit.

\n

I saw Ed (now 62 years old) when I briefly “came up for air” in connection with the release of Mathematica 3.0 in 1996, and we continued occasionally to exchange pleasant emails:

\n

\n
\n
\n
Date: Sun, 29 Jun 1997 15:49:41 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\n…

\n

[Reporting the birth of my second child]

\n

\n

For many children its worst when they are teenagers. Some glide through
\nthat period of life without hassle. Rick is doing great (at 15) despite
\nhis unorthodox education. He relishes calling his parents dopes, but
\naside from arguments about subjects like how late he should be able to
\nhang out with his buddies, its clear that he doesn’t think we’re dopes.

\n

\n

I promise to read your book as soon as I get it!

\n

\n

Its nice to hear from you. News here is that I am no longer needed at
\nRadnet as they now have a great CEO. I got a new airplane in December.
\nIt’s called a Cessna CitationJet. It can carry 7 people at about 440
\nmph. So far its been a lot of fun. We’ll have to think of an excuse to
\ngo for a ride. We are planning to spend some time at Drake’s Anchorage
\nin July. Its great for kids so if that interests you, let me or Joyce
\nknow.

\n

I have taken as a challenge to architect a computer (that weighs a few
\nkilos) that assumes another 100 years of Moore’s Law (10^15 in cost
\nperformance). There are a lot of unsuspected problems lurking in the
\ndetails, but everyone of them seems to have easy solutions. I have
\ngiven a number of talks (IBM Almaden and Watson labs, Intel, NYU,
\netc.). Interest in reversible computing has picked up since heat
\ndissipation has gotten to be a really hot topic (no pun intended). The
\nnext high end Alpha may dissipate as much as 150 watts. Think of a
\nlight bulb!

\n

I use Mathematica for something almost every week… keep it up!

\n

Best regards,

\n

Ed\n

\n
\n

\n

Although I didn’t see Ed myself for quite a few years, Ed would always write to ask for betas of new versions of Mathematica, and he would sometimes chat with staff from my company at trade shows. I thought it a bit odd in 1999 when I heard that in such an encounter he said that he was the one who had “introduced me to cellular automata”. And, moreover, that he, Feynman and Murray [Gell-Mann] were the people who’d suggested I write SMP—which was particularly bizarre since, among other things, I hadn’t met (or even heard of) Ed until about 3 years later.

\n

Then, out of the blue on September 13, 2000, Ed calls my assistant, and follows up with an email:

\n

\n
\n
\n
Subject: Invitation
\n
Date: Wed, 13 Sep 2000 23:53:09 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nHi,

\n

The primary reason I’m contacting you has to do with a program I’m
\norganizing at Carnegie Mellon (CMU). I wrote a proposal to the NSF, called
\n“The Digital Perspective” and got funded. The idea is to invite a number (8
\nto 10) of guests to come to CMU for a few days, to meet with students and to
\ngive a Distinguished Lecture. The NSF would also like to arrange for the
\nguests to come to Washington D.C. and give the same lecture there.

\n

By “Digital Perspective” I mean looking at aspects of the world as Digital
\nProcesses. As you know, I am most interested in looking at physics this
\nway. I have just started getting commitments from potential participants.
\nGerard ‘t Hooft has agreed to come and a number of other good physicists are
\nthinking about it.

\n

\n

Please consider this to be a formal invitation. Of course, CMU will pay
\nexpenses and an honorarium. If the timing works out, it can probably be
\narranged for many of the students to have read your book before you come.
\nYou might get some good feedback from bright students who have also gained
\nfamiliarity with the thoughts of others who are thinking about the “Digital
\nPerspective”. The seminar will run throughout the 2000-2001 academic year.

\n

If you can make it to CMU, I expect that it will be fun and interesting;
\nboth for you, for me and for many others.

\n

…\n

\n
\n

\n

I responded:

\n

\n
\n
\n
Subject: RE: Invitation
\n
Date: Thu, 14 Sep 2000 06:49:19 -0500
\n
From: Stephen Wolfram
\n
To: Ed Fredkin
\n
\n

\n
Thanks for the invitation, etc.

\n

It sounds like a thing I’d like to do, but I can only consider
\n*anything* after my book is finished.

\n

\n

If my book is done in time for your program, then, yes, I’d like to
\nparticipate (though of course I’d want more details about the actual
\nplans etc. etc.). But if the book isn’t done, then sadly I just can’t.
\nIf the cutoff time is June 2001, I am not extremely hopeful that the
\nbook will be done … but if it’s fall 2001 the probabilities go up
\nsubstantially (though, sadly, they are still not 100%).

\n

\n

And what are you up to these days? Business? Science? Other?

\n

On another topic:
\nIn my book, I’m trying very hard to write accurate history notes about
\nthe things I discuss. And for the notes on the history of cellular
\nautomata I’ve been meaning for ages to ask you some questions…

\n

I’m not sure this is a complete list, but here are a few I’ve been
\ncurious about for a long time that I’d really like to know the answers
\nto…

\n

I know that history is hard … even if it’s about oneself. I consider
\nthat I have a good memory, but it’s often hard for me to keep straight
\nwhat happened when, and why, etc. But anything you can tell me about
\nthese questions … or about other aspects of CA history … I’d be very
\ngrateful for.

\n

1. As far as you know, did you invent the 2D XOR CA rule? (I’m assuming
\nthe answer is “yes”…)

\n

2. In what year did you first simulate this CA? On what computer?
\nWhere?

\n

3. What other CA rules did you study at that time?

\n

4. Do you still have any material from the simulations you did
\n(printouts, tapes, programs, etc.)?

\n

5. When you learn about the “munching squares” display hack? How did it
\nrelate to your work on the XOR CA?

\n

6. What did you know about the work done by Unger etc. on cellular image
\nprocessors? How did this relate to your work?

\n

7. What did you know about von Neumann’s work on cellular automata? How
\ndid it relate to your work?

\n

8. What did you know about Ulam and others’ work at Los Alamos on
\nsimulating cellular automata? How did it relate to your work?

\n

9. Were you aware of work on cryptographic applications of CA-like
\nsystems?

\n

…\n

\n
\n

\n

Ed responded:

\n

\n
\n
\n
Subject: RE: Invitation
\n
Date: Fri, 15 Sep 2000 01:25:23 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nHi,

\n

Here are some answers and some free association type ramblings.

\n

\n

> And what are you up to these days? Business? Science? Other?

\n

I’m winding down on business (I’m into one last e-business project) and like
\nyou, working on a book. My guess is that mine is nowhere as ambitious as
\nyours… It’s just to document my ideas about Digital Mechanics (Physics).
\nIn any case, these ideas have made more progress in the last 2 years than in
\nthe previous 40.

\n

I bought a sailboat which is moored in Antibes, France. I spent most of the
\nsummer there and got more science done than in the prior several years.
\nIt’s absolutely the perfect place and circumstance for me to work on my
\nstuff. Gerard ‘t Hooft (plus wife and daughter) came down and joined us for
\na while. You know (I hope) about his interest in CA’s? I’m going back
\nthere for a few weeks on Tuesday.

\n

Here’s a formal proof that you can, at any time, escape all your normal
\nresponsibilities and concentrate exclusively on one really important thing
\n(hint, hint). The proof is that, at any time, YOU CAN DIE. I don’t mean to
\nbe morbid, but sometimes it makes good sense to consider that proof and
\ntemporarily abandon all but some very important task (or some very exciting
\nor fun thing).\n

\n
\n

\n

Ed continued with a long response to my “history questionnaire”:

\n

\n
\n
\n
> 1. As far as you know, did you invent the 2D XOR CA rule? (I’m assuming
\n> the answer is “yes”…)

\n

Yes, as far as I know I did invent it. Here is what I did. I decided to
\nlook for the simplest possible rule that met certain criteria. I wanted
\nspatial symmetry and a symmetric rule vis-à-vis the states of the cells.
\nThe thought was to find something so simple that its behavior could be
\nunderstood while not so simple as to be totally dull. The first such rule I
\ntried was the XOR rule. I programmed it first on the PDP-1 (1961, at BBN
\nand III) where I could see it on the display, and later I wrote a program
\nfor CTSS using a model 33 teletype as a terminal. My motivation was then,
\nas it is now, to be able to capture more and more properties of physics
\nwithin a Digital model. I found an easy proof as to why patterns reappeared
\nin any number of dimensions. I also found, at the beginning, a formula for
\nthe number of ones as a function of time from a single one as the initial
\nstate. My recollection was that it was something like 2D 2^b(t) where D is
\nthe number of dimensions, t is the time step, and b(t) is the number of bits
\nthat are one in the binary representation of t (the tally function). After
\nI showed all this to Seymour Papert, he generalized the proof re self
\nreplication from XOR (sum mod 2) to sum mod any prime. (Some time around
\n1967)

\n

> 2. In what year did you first simulate this CA? On what computer?

\n

Where?

\n

See above.

\n

> 3. What other CA rules did you study at that time?

\n

I found a simple proof that a von Neumann neighborhood CA could exactly
\nemulate any other (such as the 3×3 neighborhood) and used this as a reason
\nto look at nothing else. I explored so many different rules that I probably
\nwould have found the game of Life had I not put blinders on. After I came
\nto MIT (1968), I had 2 things in mind, to find a really simple Universal CA
\n(I call them UCA’s )and to find Reversible, Universal CA’s (RUCA’s)
\nAs you may know, the search for UCA’s went slowly until I had the idea to
\nabandon the Turing Machine model and look at modeling digital logic and
\nwires. Within 15 minutes after this idea occurred to me, I had a 4 state
\nUCA on my blackboard. At that time the best known was in Codd’s thesis; an
\n8 state UCA. I showed this to a student of mine, Roger Banks, who had been
\nstruggling for a few years trying to complete an AI PhD thesis. The next
\nmorning both he and I showed up with 3 state UCA’s. He switched his PhD topic
\nand found a 2 state, von Neumann neighborhood UCA, a thing that Codd
\npurported to have proved impossible.

\n

While at BBN, after seeing all my 2-D CA’s expanding with simple
\nkaleidoscope like symmetries, (like the diamond shapes in the XOR rule),
\nMarvin Minsky challenged me to find a rule (any rule) that showed spherical
\npropagation. I took the challenge and shortly came up with such a rule.

\n

With respect to reversibility, the first satisfactory RUCA was done by
\nNorman Margolus. I shortly thereafter found a simple RUCA that didn’t need
\nthe use of the Margolus Neighborhood trick.

\n

> 4. Do you still have any material from the simulations you did
\n> (printouts, tapes, programs, etc.)?

\n

Yes, Probably, quite a bit

\n

> 5. When you learn about the “munching squares” display hack? How did it
\n> relate to your work on the XOR CA?

\n

I don’t recall it having any effect. It’s very unlikely that I knew of it
\nprior to the XOR CA.

\n

> 6. What did you know about the work done by Unger etc. on cellular image
\n> processors? How did this relate to your work?

\n

I knew of it second hand, but I don’t think it had any effect. Do you know
\nabout Farley and Clark (Wes Clark) and their publication while at MIT’s
\nLincoln Labs in the late 50’s?

\n

> 7. What did you know about von Neumann’s work on cellular automata? How
\n> did it relate to your work?

\n

At the time I did the XOR work I had not read anything about the von Neumann
\nCA, but I was told about it and I understood the concept very well. Many
\nyears later I read something (by Burkes, I think). I remember knowing that
\nit was a 29 state system and that it knew left from right in order to extend
\nand turn its construction arm.

\n

> 8. What did you know about Ulam and others’ work at Los Alamos on
\n> simulating cellular automata? How did it relate to your work?

\n

All I knew about Ulam and CA is that, like the Hydrogen Bomb, he had key
\nideas but probably didn’t get as much credit as he deserved. All my
\nknowledge re Ulam was anecdotal. As to what he did vs. what von Neumann did
\nI didn’t really know anything.
\nI didn’t know anything about anyone else actually simulating CA’s however
\nI’m pretty sure I assumed that others must have done so. It was so easy and
\nso obvious. While the use of a computer with a display (such as the Lincoln
\nLab TX-0 and TX-2, the Digital PDP-1 and the IBM 709 and 7090 all had or
\ncould have CRT displays, it was easy enough to display simple CA’s with a
\nprinter, even a 10 CPS teletype.

\n

> 9. Were you aware of work on cryptographic applications of CA-like
\n> systems?

\n

I thought I invented that idea! As soon as I found ways to make RUCA’s it
\noccurred to me that they could be used for cryptography. As an aside, when
\nWitt Diffey [Whit Diffie] came up with the idea of public key cryptography,
\nwhich needed a trapdoor function, I thought of using the product of 2 large primes.
\nI had just written the first program, in LISP, to implement Michael Rabin’s first
\nversion of a probabilistic prime test. As soon as I implemented it I
\nstarted a search at 10^100 and discovered that 10^100 +35,737 and 10^100
\n+35,739 were prime. A week later I met Rich Schroeppel in LA (he was
\nworking for my company, III) and knowing a larger prime pair than anyone
\nelse on Earth I told Rich and he was blown away. He was seated at a PDP-10
\nterminal and all he said was an emphatic “Really!” He then went type, type,
\ntype for a few seconds and turned around and said “You’re right!” which blew
\nme away! I asked what he did and he said (while knowing nothing of Rabin’s
\nmethod) “all I did was look at 3^(n-1) mod n, you know, Fermat’s little
\ntheorem, it usually gives 1 for primes.”

\n

I’m rambling, probably about stuff of no interest to you. Anyway, I stopped
\nRon Rivest in the hallway at Tech Square and asked if he had heard of
\nDiffey’s [Diffie’s] stuff. I don’t remember exactly what he said but I know that when
\nI told him that Rabin’s new method to find large primes meant that the
\nproduct of 2 primes was a good trapdoor function he was surprised and
\nthought it was a good idea! I never thought any more about it and hadn’t
\ncome up with the idea of using the phi function… Years later, long after
\nRSA was a big thing Ron reminded me of the event… Don Knuth told me that
\nhe also thought of using the product of 2 primes before RSA, but he couldn’t
\nhave known about Rabin’s method when I did (as Rabin told it to me right
\nwhen he thought it up!)

\n

By the way, I have an interesting algorithm for factoring smaller numbers,
\nsuch as can be done in less than an hour with Mathematica (normal
\nFactorInteger or ECM). I’ve written a few terribly unoptimized Mathematica
\nfunctions that implement the method. For what its good for, my Mathematica
\nfunctions (not compiled or anything) make Mathematica factor in a lot less
\nreal time than Mathematica does with FactorInteger or ECM.

\n

The big news re me and my work is what’s happening right now. Whatever one
\nthinks about my stuff (Digital Mechanics), it’s vastly improved. However
\nit’s still very far from a complete theory. Of course, Digital Mechanics is
\nabout CA’s.

\n

If you have any interest in reversibility, I’ve done lots in that area,
\nranging from RUCAs, conservative logic, and my transforms. The transforms
\nare general methods of converting algorithms that calculate the approximate
\ntime evolution of a system (approximate because of round off, truncation and
\nthe finite delta t) which is approximately reversible (by changing delta t
\nto minus delta t) into an equivalent algorithm that calculates approximately
\nthe same thing going forwards, but which is exactly reversible (being
\ncalculated on a computer with round off and truncation error). I also have
\na lot of methods for making RUCA’s with particular properties.

\n

You’ve criticized me in the past for not publishing stuff, but I’m so
\nambitious as to what I’m trying to do that I haven’t had the motivation to
\npublish all the little things I’ve uncovered along the way.

\n

I’m sure I discovered more and better ways to make all kinds of RUCAs before
\nanyone else with the exception of the rule found by my student, Margolus.

\n

Finally, one last anecdote. You and I were at some meeting long ago (maybe
\nSanta Fe?) and you brought along an early Sun to demonstrate your collection
\nof different kinds of 1-D CA’s. After your talk, I asked you why none of
\nthe CA’s you showed were reversible. Your response was “Because all
\nreversible CA’s are trivial.” That really was a very common belief,
\ncoincident with most people’s intuition. On the spot, I made up a rule,
\nusing your convention for specifying it, of an “interesting” reversible CA.
\nYou typed it in and ran it. Being surprised is one of the best kinds of
\nexperiences we ever have.

\n

As Emerson once quipped, “My apologies for such a long email, I didn’t have
\nthe time to write you a short one.”

\n

I’m having fun; it’s a good thing to do!

\n

Best regards

\n

Ed F

\n

PS If you have any interest in having parts of your book read so that you
\ncan get comments prior to publication, I have an idea that might be useful.

\n
\n

\n

A little later he added:

\n

\n
\n
\n
Subject: error
\n
Date: Fri, 15 Sep 2000 10:12:15 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nHi,

\n

Looking at my long email I noticed a boo boo.

\n

Where I wrote, quoting Schroeppel talking about 3^(n-1) mod n, “…it
\nusually give a 1 for primes…” very true but a bit of an understatement.
\nOf course, it ALWAYS gives a 1 for primes! What Schroeppel said was that it
\nusually doesn’t give a 1 for non-primes. It’s incorrect for 91 and 121 and
\nlots of other small numbers, but seems to work better for large numbers…
\nbut then you probably know much more about such things than I do. Also
\nlooking at your questions, I had the feeling that some might have been
\nprompted by my circa 1990 Digital Mechanics paper. If so, I guess I
\nrepeated stuff already in the paper and I apologise.

\n

Regards,

\n

Ed F\n

\n
\n

\n

I responded, asking for various pieces of clarification (and now that I’m writing this piece I would have asked even more, because some key parts of what Ed said I now realize don’t add up):

\n

\n
\n
\n
Subject: Re: your mail
\n
Date: Wed, 20 Sep 2000 21:04:54 -0500
\n
From: Stephen Wolfram
\n
To: Ed Fredkin
\n
\n

\n
\n…

\n

>> 1. As far as you know, did you invent the 2D XOR CA rule?
\n>>

\n> Yes, as far as I know I did invent it. Here is what I did. ….
\n>

\n

Very interesting.

\n

1a. Did you ever look at 1D CAs? If not, why not?

\n

1b. Did you think about analogies between XOR rules and linear feedback
\nshift registers?

\n

1c. Did you think about analogies between XOR rules and Pascal’s
\ntriangle?

\n

By the way, the result about the number of binomial coefficients mod a
\nprime has been independently discovered a remarkable number of times
\n(including by me). The earliest references I know are Edouard Lucas
\n(1877) and James Glaisher (1899).

\n

….

\n

>> 3. What other CA rules did you study at that time?

\n

> … I explored so many different rules that I probably
\nwould have found the game of Life had I not put blinders on.

\n

By the way, I happened to have a long phone conversation recently with
\nJohn Conway about the history of the Game of Life. I still haven’t
\nquite got to the bottom of exactly what Conway was doing and why (I
\nthink he wants some of the history lost, which is a pity, because it is
\ninteresting and reflects much better on him than he seems to
\nbelieve…) But what is clear is that Conway (and his various helpers)
\nhad much more serious motivations from recursive function theory etc.
\nthan is ever usually mentioned. It was just not a “find an amusing
\ngame” etc. piece of work.

\n

> Marvin Minsky challenged me to find a rule (any rule) that showed spherical
\npropagation. I took the challenge and shortly came up with such a rule.

\n

I don’t believe I’ve ever seen your rule of this kind. I showed such a
\nrule to Marvin in 1984 and he said “that’s very interesting; we were
\nlooking for these but hadn’t found any”. So I’m confused about
\nthis….

\n

\n

>> 6. What did you know about the work done by Unger etc. on cellular image
\nprocessors? How did this relate to your work?

\n

> I knew of it second hand, but I don’t think it had any effect.

\n

Wasn’t BBN quite involved with cellular image processing? And I believe
\nyou worked on aerial photography analysis. Did you use cellular
\nautomata for image processing?

\n

\n

>> 9. Were you aware of work on cryptographic applications of CA-like
\nsystems?

\n

> I thought I invented that idea!

\n

There was a lot of work done on 1D CAs by some distinguished
\nmathematicians consulting for the NSA in the late 1950s. I think much
\nof it is still classified. But over the years I’ve talked to many of
\nthe people involved (Gustav Hedlund, Andrew Gleason, John Milnor, some
\nNSA folk, etc. etc.), and read their unclassified papers. They figured
\nout some interesting stuff. They thought of it as related to nonlinear
\nfeedback shift registers.

\n

> As soon as I found ways to make RUCA’s it
\noccurred to me that they could be used for cryptography.

\n

How?

\n

There’s a 1D CA (rule 30) that I studied in 1984 that has been
\nextensively used as a randomness generator (e.g. Random[Integer] in
\nMathematica uses it), and that has been used a bit as a cryptosystem.

\n

I tried to make a good public key system out of CAs in the mid-1980s
\n(mostly in collaboration with John Milnor), but did not come up with
\nanything satisfactory. …

\n

\n

> I also have a lot of methods for making RUCA’s with particular properties.

\n

I am definitely somewhat interested in these things. They don’t happen
\nto be central to my grand scheme. But they are obviously worthwhile …
\nAND WORTH (you) WRITING DOWN!!

\n

I’m sure I discovered more and better ways to make all kinds of RUCAs before
\nanyone else with the exception of the rule found by my student, Margolus.

\n

Interesting. You probably know that the general problem of telling
\nwhether an arbitrary 2D CA is reversible is undecidable (the question
\ncan be mapped to the tiling problem).

\n

So I’m taking it that you have some good methods for generating 2D
\nreversible CAs. That’s obviously interesting.

\n

> Finally, one last anecdote. … I asked you why none of
\nthe CA’s you showed were reversible. Your response was “Because all
\nreversible CA’s are trivial.” …

\n

This anecdote can’t be quite right. I have known since 1982 that there
\nare nontrivial things that can happen in CAs that are made reversible by
\nyour mod 2 trick. What is true (and may have been what I was saying)
\nis that none of the 2-color nearest neighbor CAs that are reversible are
\nnon-trivial. With more colors or more neighbors, that changes. I’m
\nguessing that what you showed me was a 4-color nearest neighbor CA that
\nis reversible … and that is of course quite easy to get by recoding a
\n2-color one that has your mod 2 trick.

\n

By the way, I heard third hand a while back that you had “introduced me
\nto CAs”. For what it’s worth, that isn’t correct. My first “CA
\nexperience” was actually in 1973 (when I was 13) when I tried to program
\nmolecular dynamics on a very small computer, and ended up with something
\nequivalent to the square CA fluid model. My next CA experience was in
\nsummer 1981. I was trying to make models of “self organizing” systems
\n(now I hate that term), particularly self-gravitating gases. I ended up
\nsimplifying the models until I got 1D CAs. That fall I spent a month at
\nthe Institute for Advanced Study, and spent a lot of time studying von
\nNeumann’s work, etc., and analysing all sorts of features of 1D CAs. I
\ncame for a day to give a talk at MIT, and was having dinner with some
\nLCS people (Rich Zippel was one of them), and they told me about your
\nwork. Later that fall I talked with Feynman a certain amount about what
\nI was doing with CAs, and he again mentioned you. (I think he had been
\nto your Physics of Computation meeting, which was perhaps in June 1981,
\nbut I didn’t discuss the CA aspects of the meeting with him.) Then in
\n[January 1982] I came to the meeting you had on your island, and Tom Toffoli
\nshowed me his 2D CA machine (at the time he gave me the impression of
\n95% hackery, 5% science), and you showed me the 2D XOR CA on a PERQ
\ncomputer.\n

\n
\n

\n

Ed didn’t respond to this, but three days later we talked on the phone. I sent some (unvarnished) notes from the call to a research assistant of mine:

\n

\n
\n
\n
Subject: Fredkin conversation
\n
Date: Sat, 23 Sep 2000 03:05:43 -0500
\n
From: Stephen Wolfram
\n
\n

\n
\nI had a long conversation with Ed this evening.

\n

About his work in science, my work in science, etc.

\n

A few things mentioned:

\n

– He feels bitter that his paper on reversible logic, coauthored with
\nTom Toffoli, was actually all his (Ed’s) work

\n

– He is pleased that I will discuss history even when people haven’t
\npublished things (of course he has published little)

\n

– He says he has written about 150 pages about his views of physics; he
\nis planning to prepare something, perhaps for publication, in about a
\nyear

\n

– He says he missed not being able to bounce ideas off Dick Feynman …
\neven though Feynman often ended up screaming at him (Ed) about how dumb
\nhis ideas were

\n

– He said that his main problem was that he has been trying to get
\npeople to steal his ideas for years, but nobody was interested

\n

– He said that now “for some reason” he is becoming more concerned about
\nmatters of credit

\n

– He is a serious fan of Mathematica, the Mathematica Book, etc.

\n

– He made an effort again (he’s been trying for 20 years) to get me to
\ncoauthor a paper with him. He recognizes that he can’t write a credible
\nscientific paper, but he’s “sure he has some ideas I haven’t thought
\nof”. I told him that unfortunately I haven’t written a paper for 15
\nyears.

\n

– I told him that particularly when I’m in the Boston area, I’ll look
\nforward to chatting with him about physics etc.

\n

– He said he’s tried to interact some with Gerhardt ‘t Hooft, but that
\n‘t Hooft keeps on rushing off in traditional physics directions that Ed
\n(and I, by the way) think are stupid

\n

– He wanted to know if I really believed that all of physics etc. was
\nultimately discrete; he expressed the opinion that he and I may be the
\nonly people in the world who actually believe that right now

\n

– He told a bizarre story about how Don Knuth gave a talk at MIT
\nrecently on computers and religion, and how 1/4 of it was stuff that Don
\nhad heard about from Ed. Apparently Guy Steele asked a question about
\nhow Don’s stuff related to Ed’s, and Don said something meaningless.

\n

I talked to him a little more about the CA history stuff. He mentioned
\nthat around 1961 a certain Henry Stommel (sp?) told him that CA-like
\nmodels had been used in studying sand dunes in the 1930s. I have a
\nfeeling this may be another cat gut search, but perhaps we can follow
\nup. (You could email Ed at the appropriate time.)

\n

I asked Ed if he had ever looked at cryptography (as in NSA style stuff)
\nwith CAs. He said no. But that in the late 1960’s he had had a student
\nwho had studied ways to make counters out of JK flip flops … and that
\nthat person’s work had made something that Ed thought could be used for
\ncryptography. This was followed up by a certain Vera Pless
\nsubsequently.

\n
\n
\n

\n

I didn’t hear anything more from Ed for a while, though a public records search indicates that, yes, he had successfully “worked the system” to get $100k from the NSF for “The Digital Perspective Project”. And on May 1, 2001, I received a rather formal email from Ed (for some reason Americans born before about 1955 seem to reflexively call me “Steve”):

\n

\n
\n
\n
Subject: Workshop on the Digital Perspective 24-26 July, Washington DC
\n
Date: Tue, 1 May 2001 21:20:45 -0400
\n
From: Ed Fredkin
\n
To: Steve Wolfram
\n
\n

\n
\nWe are sending this email to invite you to an NSF-sponsored workshop on the
\nDigital Perspective in Physics planned for July 24th through the 26th,
\nTuesday, Wednesday and Thursday. It will be held in the NSF building,
\nArlington Virginia. Gerard ‘t Hooft has already agreed to present a paper
\nand we hope that you will also be willing to contribute. We intend to
\ncombine the papers presented at the workshop into a monograph that will be
\npublished later this year. Two earlier workshops on related subjects were
\nheld at Moskito Island and this was a central theme at a meeting held at
\nMIT’s Endicott house in 1982. Participants at previous meetings included
\nCharles Bennett, Richard Feynman, Ed Fredkin, Leo Kadanoff, Rolf Landauer,
\nNorman Margolus, Tomasso Toffoli, John Wheeler, Ken Wilson, Stephen Wolfram
\nand others.

\n

…\n

\n
\n

\n

When I didn’t immediately respond, Ed called my assistant, saying that he was “calling regarding a meeting he spoke with [me] about on the phone”. I responded by email later the same day:

\n

\n
\n
\n
Subject: I gather you called…
\n
Date: Tue, 15 May 2001 15:18:57 -0500
\n
From: Stephen Wolfram
\n
To: Ed Fredkin
\n
\n

\n
\nSorry for not getting back to you sooner….

\n

I myself am right now trying to work at absolutely full capacity to finish my
\nbook/project. I haven’t done any travelling at all for a long time, and won’t
\nuntil my book is done.

\n

And I also don’t yet have anything public to say about my work on physics.

\n

Hopefully by the end of the year my book will be done and I will have quite a
\nbit to say.

\n

However, it occurs to me that one or two of my assistants might be very good
\npeople to come to your workshop.

\n

Who all is coming?

\n

One person you should definitely invite is someone who has been an assistant of
\nmine, and now works part time for me, and part time on his own projects. His
\nname is David Hillman, and he’s been interested in discrete models of spacetime
\nfor a long time. (He got his PhD working on some kind of generalization of
\ncellular automata intended as a spacetime model.)

\n

I have two physics assistants, and one math one, who might be relevant for your
\nworkshop.

\n

Just let me know in more detail who might be coming, and I’ll try to figure out
\nthe correct person/people to suggest.

\n

Of course I’d love to come myself if I were a free man. But not until the book
\nis done.

\n

In haste,

\n

— Stephen\n

\n
\n

\n

Ed responded pleasantly enough:

\n

\n
\n
\n
Subject: RE: I gather you called…
\n
Date: Tue, 15 May 2001 17:08:39 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nHi,

\n

Sorry you can’t make it.

\n

About half of those coming are veterans of some Moskito Island workshop.
\nNewcomers include Gerry Sussman, Tom Knight, Gerard ‘t Hooft, John Negele,
\nJohn Conway, Raj Reddy, Jack Wisdom, Seth Lloyd, David di Vincenzo, plus a
\nnumber of students, etc. A couple of those mentioned are still struggling
\nwith scheduling issues.

\n

But, in any case, I would be pleased to have David Hillman come to the
\nworkshop. Send me his email address and I will send him an invitation.

\n

Best regards and good luck on the book!

\n

Ed\n

\n
\n

\n

I responded and suggested an additional person from our team for his workshop. Nearly a month passed with no word from Ed, so I pinged him asking what was going on. No response. It was a very busy time for me, and this wasn’t something I wanted to be chasing (I saw myself as doing Ed a favor by suggesting sending people to his workshop) … so I sent a slightly exasperated email:

\n

\n
\n
\n
Subject: your conference, again
\n
Date: Fri, 15 Jun 2001 06:08:39 -0500
\n
From: Stephen Wolfram
\n
To: Ed Fredkin
\n
\n

\n
\nLook … I’m now in a bit of an embarrassing situation: following your
\ninitial response, I told David Hillman and David Reiss about your conference
\n… assuming you’d want to invite them … and they both became quite
\ninterested in it. But they never heard from anyone about it. So now of
\ncourse they’re wondering what’s going on. And so am I. What should I tell
\nthem? I’m now embarrassed about having suggested this…

\n

This seems peculiarly un-you-like. I was thinking you must have been away
\nor something. But isn’t the conference coming up very soon?

\n

I hope everything’s OK…\n

\n
\n

\n

Still no response from Ed. A week later I called him, and we talked for two hours. It wasn’t clear why he hadn’t already reached out to the people I’d suggested, but he quickly said he would. And then Ed launched into telling me about the “astounding” cellular automaton models he said he’d just created that “had charge, energy, momentum, angular momentum, etc.”. He talked about things like the idea of what he called an “infoton” that would be an “information particle” that would “make Feynman diagrams reversible”. I explained why that didn’t make any real sense given how Feynman diagrams actually work. It was the same kind of conversation I had many times with Ed. I kept trying to explain what was known in physics, and he kept on coming back with things that, yes, I think I understood, but that seemed close to typical crackpot fare to me. But Ed seemed convinced he had discovered something great (though exactly what I couldn’t divine). And eventually—having obviously not convinced me of what he was doing “on its merits”—he just came out and said “It must be related to stuff you’re doing, one way or another”.

\n

I explained that I really didn’t think that was very likely, not least because I emphatically wasn’t trying to use cellular automata as models of fundamental physics. And with that, Ed launched into a long speech about giving credit, particularly to him. I explained that I was trying hard to write correct history, and reiterated some of the questions I’d asked him before. He didn’t really tell me more, but instead regaled me with stories (that I’d mostly heard many times before from him) about how he’d been the first to figure out this and that—apparently oblivious to historical research I tried to tell him. But eventually we both had to go—and the conversation ended pleasantly enough, with him confirming the email addresses for the two people for his workshop.

\n

As the workshop approached, the people from my team had made arrangements to go to Washington, DC—but still didn’t know where exactly the workshop was. With days to go, one of them simply called Ed to ask. But Ed told them that actually they couldn’t come, because “Raj Reddy says there is no room for you”. Really? No extra chair to be found? Ed was the organizer, wasn’t he? Why was he laying this on someone else? It seemed to me that Ed was playing some kind of game. But at that moment I was too busy trying to finish my book to think about it. (Now that I’m writing this piece, however, I realize that Ed was perhaps following an “algorithm” he’d established years earlier when he was proud to have organized a meeting to push forward his ideas about timesharing—by inviting just people who supported his ideas, and not inviting ones who didn’t. I don’t know if the meeting actually happened, or what went on there. I don’t think the writeup promised in the invitation and in the NSF contract ever materialized.)

\n

In January 2002 A New Kind of Science was off to the printer, and review copies were starting to be sent out. In late March a seasoned journalist named Steven Levy (who had written about my work on cellular automata in the mid-1980s) was talking to someone from my team and reported that Ed had told him that “Minsky had told [Ed] to publish his stuff on the web to stake out priority” before my book came out. (And it’s a pity Ed didn’t do that, because it might have made it clear to him and everyone else how different what he was saying was from what I was saying.) But in any case Levy said that Ed seemed to be saying the same things as he’d said 15 years ago—and Levy knew that regardless of anything else I’d done incredibly much more since then.

\n

After his conversation with Levy, Ed sent me mail:

\n

\n
\n
\n
Subject: The Book
\n
Date: Fri, 22 Mar 2002 16:38:29 -0800 (PST)
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nCongratulations on finishing!!!

\n

I ordered the book from someplace, so long ago I can’t
\nremember from who. I’m wondering if, when its
\npossible, I could get a copy in advance of whenever my
\nordered copy is going to appear. I just don’t want to
\nbe the last on the block to see it. Of course I’d be
\nhappy to pay if you can tell me how to do it.

\n

Thanks,

\n

Ed Fredkin\n

\n
\n

\n

The book was going to be published on May 14; on May 4 I signed a copy for Ed:

\n

Click to enlarge

\n

The book mentioned Ed a total of 7 times. (The person with the most mentions overall was Alan Turing, at 19; Minsky had 13; Feynman 10.)

\n

Ed never told me he’d received the book. And I’m not sure he ever seriously looked at it. But somehow he was convinced that since he knew it talked a lot about cellular automata, and had a section about physics, it must be about his big idea—that the universe is a cellular automaton. As one witty friend pointed out to me in connection with writing this piece, my book says only one thing about the universe being a cellular automaton: that it isn’t! But in any case, Ed apparently seemed to feel that I was stealing credit from him for his big idea—and, as I now realize, started an urgent campaign to right the perceived wrong, basically by telling people that somehow (despite all my efforts to describe the history) I wasn’t giving anyone enough credit and that “he was there first”. The New York Times rather diplomatically quoted Ed as saying “For me this is a great event. Wolfram is the first significant person to believe in this stuff. I’ve been very lonely”. It followed up by saying that “Mr. Fredkin, who said he was a longtime friend, said Dr. Wolfram had ‘an egregious lack of humility’”. (In some contexts, I suppose that might be a compliment.)

\n

In writing this piece I asked Steven Levy what Ed had actually said in the interview he did. His first summary in reviewing his notes was “He says he considers you a friend and then goes on endlessly about what an egomaniac you are”. But then he sent me his actual notes, and they’re somewhat revealing. Ed doesn’t claim he introduced me to cellular automata, perhaps because he realizes that Levy knows from the 1980s that that isn’t true. But then Ed tells the story about showing me reversible cellular automata, which I’d explained to Ed wasn’t true. Ed goes on to say that “Everyone who’s in science wants credit, driven probably by wanting to become famous. [Wolfram] has a larger than normal dose”. Ed says that when he had said that cellular automata underlie physics, I’d said that was crazy. (Yup, that’s true.) But then Ed said “Now he denies this”. Huh? Ed went on: “He’s a prisoner of some kind of overactive ego. I believe he might not know. Wolfram deserves loads & loads of credit, but he has this personality flaw”. And so on.

\n

A month later Ed writes to me:

\n

\n
\n
\n
From: Ed Fredkin
\n
To: Steve Wolfram
\n
Sent: Friday, June 14, 2002 2:48 PM
\n
Subject: ANKOS critics
\n
\n

\n
\nSteve,

\n

Sometime soon I’d like to get together and talk.

\n

I’ve read a lot of your book.

\n

Take a look at the draft of a little paper of mine (attached). I’d
\nappreciate comments.

\n

Ed F

\n

The following is my response someone else’s response [Gerry Sussman] to a review of ANKOS.

\n

My comments are only with regard to Wolfram’s ideas on modeling physics.
\nI don’t happen to like his network model but we are in agreement that
\nsome kind of discrete process might underlie QM.

\n

Not everything Wolfram says is wrong.

\n

\n

The ideas that some kinds of discrete space-time processes (such as
\nCA’s) might underlie physics or other processes in nature is the BABY.
\nEverything else in ANKOS (or missing from ANKOS) is the BATH WATER.\n

\n
\n

\n

Ed’s attached paper was basically yet another restatement of cellular automata as models of fundamental physics.

\n

A few weeks later there was a strange (if in some ways charming) incident when a reporter for the San Francisco Chronicle decided to investigate what seemed to be a science feud between Ed and me. After a nod to medieval metaphysicians, the article (under the title “Cosmic Computer”) opens with “Nowadays, with a daring that might have dazzled St. Augustine and St. Thomas Aquinas, two titans of the computer world argue that everything in the universe is a kind of computer.” After analogizing me to Britney Spears, the article goes on to say “The excitement has also brought tension to the long-standing friendship between Wolfram and Fredkin, who are now wrestling with one of the bigger bummers of any scientist’s life: a dispute over originality.” The article reports: “Last week, the two men had a long, heartfelt phone conversation with each other, in which they tried to resolve their strong disagreement over priority. The conversation was amicable, but they failed to reach agreement.”

\n

And so things remained until March 2003 when Ed sent the following:

\n

\n
\n
\n
Subject: Re: NKS 2003 Conference & Minicourse
\n
Date: Thu, 20 Mar 2003 17:24:59 -0500
\n
From: Edward Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nDear Stephen,

\n

I guess I’m on a Wolfram mailing list for potential attendees for your
\nBoston conference. I hope you don’t mind a little plain speaking. I
\nconsider that I am a friend of yours and therefor I take the risk of
\ntelling the emperor about his new clothes. Of course, few others
\nwould do so as a friend. Please don’t be offended as the plain talking
\nthat follows is my attempt at trying to be constructive.

\n

Your work is acquiring a reputation amongst the scientific community
\nthat is much less than it deserves. I find myself often in the
\nposition of defending you, your work and your accomplishments against
\nthe negative views that many hold, even though they have little
\nunderstanding of the significance of what you have done. They are
\nturned off by your egregious behavior; it distracts much of the
\nscientific community rendering it barely possible for them to take you
\nseriously . You have invented and discovered quite a few things, but
\nso have others. You told me you would try to give credit in ANKOS
\nwhere credit was due; I believed you and I believe that you tried your
\nbest but nevertheless you failed miserably. I guess you simply didn’t
\nknow how. Consider this conference: Must this conference be a one man
\nshow or might it actually be better for the ideas in ANKOS and better
\nfor SW and his overall scientific reputation if it were a real
\nconference where others might address the same questions? Please don’t
\nkid yourself into thinking that no one else has anything original,
\nnovel, important or interesting to say.

\n

Of course, this so-called “…first ever conference” devoted to the “…
\nideas and implications…” of concepts found in ANKOS might be nothing
\nmore than a marketing tool for Mathematica and for sales of the ANKOS
\nbook. If so, you ought to call a spade “spade”.

\n

You’ve done enough things (and hopefully will continue to do so) to
\nensure your reputation as a pioneer in various areas. This flood of
\nself puffery simply detracts, in the minds of many whose opinions you
\nought to value, from the positive reputation you deserve.

\n

I’m not one of those whose opinion of your work is in any way affected
\nby your unfortunate behavior. I see and understand exactly what you’ve
\ndone and I know and understand what your work is based on. I am human,
\nso I find it interesting when you now and then claim to have discovered
\nan idea or fact that I personally explained to you when it was
\nperfectly clear at the time that to you, the idea was absolutely novel.
\nMy model of you is that your overpowering motivation results in your
\nmind playing tricks on you. I really believe that you actually forget;
\nthat you actually re-remember the past differently than it happened.

\n

But I am the eternal optimist. I believe that even Stephen Wolfram
\nmight someday come around and join the collegial scientific community
\nwhere you receive credit and give credit; both nearly effortlessly.
\nThe world actually might voluntarily heap honors on you as opposed to
\nSW having to orchestrate “conferences” for the glorification of SW and
\nall the ideas claimed by SW. No one knows better than me how slow and
\ntorturous this process can be for new and novel big concepts, but
\npatience and modestly [sic] still seems like the better path.

\n

Please try to not be offended. I actually mean well. If you ever have
\nan actual, real conference, invite me to be a speaker; I’ll come. If I
\norganize another conference you can rest assured that you will be
\ninvited again (as you were for the NSF Workshop) and I hope you will
\ncome to talk about your ideas and maybe — maybe even stay to hear what
\nothers have to say on the subject. It’s not too healthy to the
\nscientific mind to be the only real speaker at conferences you organize
\nand hype for yourself.

\n

Among the very few who really are able to appreciate what you’ve done,
\nI am one of your greatest supporters. But I am not your average person
\nwith more or less normal reactions. When you reach for extra glory
\nand credit by stealing one of my ideas, my reaction is: “I admire your
\ngood taste”.

\n

Best regards

\n

Ed F

\n

On Thursday, March 20, 2003, at 02:19 PM, Stephen Wolfram wrote:
\n
\n> In June of this year we’re going to be holding the first-ever
\n> conference devoted to the ideas and implications of A NEW KIND OF
\n> SCIENCE. I think it’ll be an exciting and unique event. And if you’re
\n> interested in any facet of NKS or its implications, you should plan
\n> to come!
\n>
\n> I’ll be giving a series of in-depth lectures to explain the core
\n> ideas of NKS. There’ll be more specialized sessions exploring
\n> implications and applications in areas such as computer science,
\n> biology, social science, physics, mathematics, philosophy, and future
\n> of technology. And there’ll also be workshops and case studies about
\n> such issues as modelling, computer experimentation, defining NKS
\n> problems, NKS-based education–as well as a gallery of NKS-based
\n> art pieces.
\n>
\n> I’d expected that it’d be a few years before it would make sense to
\n> start having NKS conferences. But things have gone faster than I
\n> expected, and the enthusiasm and energy we’ve seen in the ten months
\n> since the book was published has made it clear that it’s time to have
\n> the first NKS conference.
\n>
\n> In planning NKS 2003, we want to cater to as broad a range of
\n> attendees as possible. There’ll be many professional scientists
\n> coming, as well as technologists and other researchers from a very
\n> wide range of fields. There’ll also be a large number of educators
\n> and students, as well as all sorts of individuals with general
\n> interests in the ideas and implications of NKS.
\n>
\n> We’ll be holding NKS 2003 near Boston over the weekend of June 27-29,
\n> 2003. There’s more information and registration details at
\n> http://www.wolframscience.com/nks2003
\n>
\n> It’s going to be an extremely stimulating weekend–and a unique
\n> opportunity to meet a broad cross-section of people interested in new
\n> ideas.
\n>
\n> I hope you’ll be able to be part of this pioneering event!
\n>
\n>
\n> — Stephen Wolfram
\n

\n
\n

\n

I responded:

\n

\n
\n
\n
Subject: Re: NKS 2003 Conference & Minicourse
\n
Date: Sat, 22 Mar 2003 22:19:33 -0500
\n
From: Stephen Wolfram
\n
To: Edward Fredkin
\n
\n

\n
\nEd —

\n

I must say that I am reluctant to respond to a note like the one below, but
\nit seems a pity to let things end this way.

\n

I can tell you’re very angry … but beyond that I really can’t tell too
\nmuch.

\n

I’d always thought we had a fine, largely social, relationship. We talked
\nabout many kinds of things. It was fun. Occasionally we talked about
\nscience. In the early 1980s I learned a few things about cellular automata
\nfrom you. None were extremely influential to me, but they were fine things
\nthat you should be proud of having figured out—and in fact I took some
\ntrouble to mention them in the notes to NKS.

\n

You also told me some of your thinking about fundamental physics. I was (I
\nhope) polite, and tried to be helpful. But I always found what you were
\nsaying quite vague and slippery—and when it became definite it usually
\nseemed very naive. I think it’s a great pity that you’ve never taken the
\ntime to learn the technical details of physics as it’s currently practiced.
\nThere’s a lot known. And if you understood it, I think you’d be able to
\ntell quite quickly which of your ideas are totally naive, and which might
\nactually be interesting.

\n

I think it’s also a pity that—so far as I can tell—you’ve never really
\ntaken the time to understand what I’ve done. It’s in the end pretty
\nnontrivial stuff. It’s not just saying something like “the universe is a
\ncellular automaton” or “I have a philosophy that the universe is like a
\ncomputer”. It’s a big and rich intellectual structure, built on a lot of
\nsolid results and detailed, careful, analysis. That among other things
\nhappens to give a bunch of ideas about how physics might actually
\nwork—that have (so far as I know) almost nothing to do with things you’ve
\nbeen talking about.

\n

I do agree with your belief that the universe is ultimately discrete. But
\nof course many people have for a long time said that they thought the
\nuniverse might at some level be discrete. Some of those people (like
\nWheeler, Penrose, Finkelstein, etc.) are sophisticated physicists, and what
\nthey’ve said has lots of real content—it’s not just vague essay-type
\nstuff. Now, I don’t happen to think what they’ve specifically proposed is
\ncorrect. But you would be completely wrong to think (as you seem to) that
\nsomehow the idea that the universe might be discrete originated with you.

\n

I really encourage you to read NKS in detail, including the notes at the
\nback. I think there’s a lot more there than you imagine. And I think if
\nyou really understood it, you would be completely embarrassed to write a
\nnote like the one below.

\n

You’ve never struck me as being someone who is terribly interested in other
\npeoples’ ideas. And that’s of course fine. But you shouldn’t assume you
\nknow their ideas just on the basis of a few buzzphrases or some such. In
\nsome areas of business, that approach often works. Because, as we both
\nknow, the ideas typically aren’t that deep. But it won’t work with a
\ncharacter like me doing science. There’s too much nontrivial content. You
\nhave to actually dig in to understand it. And from the things you say you
\nobviously haven’t.

\n

For twenty years I thought we had a fine personal relationship. I thought
\nit was a little odd that you seemed to go around telling people that you had
\nintroduced me to cellular automata. We talked about this a few times, and
\nyou admitted this wasn’t a true story. But while I thought it was a little
\nunreasonable for you to keep on saying something you knew wasn’t true, I
\ndidn’t pay much attention. It never really got in the way of our
\nrelationship.

\n

And then there was the incident of your NSF-funded conference. You invited
\nme. I said I couldn’t come. And suggested two alternates. You said fine.
\nBut then you never contacted these people. Which was rather embarrassing
\nfor me. And then, when David Reiss contacted you, you told him the
\nconference “was full”.

\n

Later, when we talked about it, you admitted that that was a lie—and then
\nblamed the lie on Raj Reddy.

\n

Frankly, I was flabbergasted by all this. That’s not the kind of
\ninteraction someone like me expects to have with a seasoned high-level
\noperative like yourself. Yes, that’s the kind of thing some sleazy young
\nbusinessperson might do. But not a mature businessperson who has run
\ncompanies and things.

\n

I still have no idea what you were thinking of. But it thoroughly shook my
\nconfidence in you as someone I could interact straightforwardly with.

\n

And then, of course, there’s the question of what you’ve said to journalists
\netc. about NKS. In detail, I don’t have much idea. But something fishy
\nwas surely going on. I haven’t gone and studied all the quotes from you.
\nBut certainly my impression was that you were trying to claim that really
\nlots of key things in NKS were things you had done or said first.

\n

You know that I tried to research the history carefully. And unless I
\nmissed something quite huge, your contributions to NKS were extremely minor,
\nand are certainly accurately represented in the history notes. Now of
\ncourse if you don’t actually understand what I’ve done in NKS, that may be
\nhard to see. But I can’t really help you with that.

\n

OK, where do we go from here?

\n

We talked at some length when that reporter from a San Francisco paper was
\ntrying to write a story about you and NKS. I thought we had a decent
\nconversation. But then, so far as I could tell, you went right ahead and
\ntold the reporter—again—exactly a bunch of things we’d agreed in our
\nconversation weren’t true.

\n

It was the same pattern as with telling people that you’d introduced me to
\ncellular automata. And it resonated in a bad way with the lie you told
\nabout your conference.

\n

I would have expected vastly better from you. I must say that I was
\npersonally most disappointed. And I concluded with much regret that I must
\nhave seriously misjudged you all these years.

\n

I would like nothing more than to be able to mend our relationship, and go
\nback to the kind of pleasant social interactions we have always had.

\n

How can that be achieved? Perhaps it’s impossible. But one step is that
\nyou might actually try to understand what I’ve done in NKS. That would
\nsurely help.

\n

— Stephen\n

\n
\n

\n

\n
\n
\n
Subject: Delayed reply
\n
Date: Thu, 3 Apr 2003 23:34:17 -0500
\n
From: Edward Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nStephen,

\n

I have been traveling and more recently have had my time gobbled up by
\na most urgent matter.

\n

I appreciate your quick reply to my email and I will get back to you
\nsometime soon. Rather than trying to respond to everything you brought up,
\nI will be limited to dealing with a couple of issues at a time.

\n

What I can tell you is that I am not angry, and was not angry or upset.
\nI have always been a non-emotional observer with regard to whatever it is
\nthat comes my way. That’s just my nature. It has come in handy at times,
\nsuch as when someone’s stupid mistake caused the single engine jet fighter
\nI was flying have an engine fire on take off. This required shutting down the
\nengine and taking other drastic actions very quickly; no time to get mad.

\n

The gist of my comments to you was not related to the work you
\ndocumented in NKS, but rather to the style and methodology you are using
\nwhile trying to get people to understand and appreciate what it is you
\nhave done. I certainly agree with the fact that it is extraordinarily
\ndifficult to get the scientific establishment to pay attention, listen,
\nunderstand and appreciate what you’ve done. Nevertheless, I think there
\nmight be a better approach to that problem than the one you are following.

\n

So, as soon as I can get a little breathing room, I’ll respond to some
\nof your comments. I do value our friendship and whatever I do in this regard
\nwill be an attempt at honest and unemotional communication with the goal of
\nsome better mutual understanding.

\n

By the way, I have taken the time to read and understand what you’ve
\ndone in NKS. I’m pretty sure that I am better able than most to appreciate
\nthe effort, persistence and creativity that went into that work.

\n

You have made some comments about me and my own work, and I wonder what
\nyou actually know about it beyond our conversations and the things you
\nreferenced in NKS.

\n

As soon as I can get some time I’ll continue with some further thoughts.

\n

Best regards,

\n

Ed

\n
\n
\n

\n

Ed didn’t send the promised followup. But a couple of months later New Scientist sent our media email address a note titled: “cover feature on Fredkin, Wolfram right to reply”, which asked for “comment on the suggestion that you first became familiar with cellular automata first at Fredkin’s lab in the 1970s and that examples in A New Kind of Science came out of work done in the lab”. I told Ed he should correct that—and he responded to me:

\n

\n
\n
\n
Subject: Re: cover feature on Fredkin, Wolfram right to reply.
\n
Date: Thu, 29 May 2003 13:55:02 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nStephen,

\n

I carefully and clearly told the author of the NS article that to my
\nknowledge it is not true “… that Wolfram first became familiar with
\ncellular automata at Fredkin’s lab in the ’70’s…” and further that
\nyou already knew about CA’s.

\n

My guess is that magazines see value in controversy and they would like
\nto attribute statements to each of us that helps them titillate their
\nreaders. I tried in every way I could to correct any wrong impressions
\nthe author had. But what they end up doing is beyond my control.

\n

As to cracking the fundamental theory of physics, I did read and did
\nunderstand what you wrote about in NKS, however my interests lie in
\nmodels that are regular and based on a simple underlying Cartesian
\nlattice. The models I have been working on for the past few years are
\ncalled “Salt” as they are CA’s similar to an NaCl crystal. You can
\nread about it at www.digitalphilosophy.org.

\n

My approach to being consistent with QM, SR and GR is related to the
\nfact that CA models of physics can exactly conserve such quantities as
\nmomentum, energy, charge etc. By means of a variant of Noether’s
\nTheorem, the physics of such CA’s can exhibited the all the symmetries
\nwe currently attribute to physics, but doing so asymptotically at
\nscales above the lattice.

\n

Thus, in my concept of a theory of physics, translation symmetry,
\nrotation symmetry etc. would all be violated as we currently understand
\nis true for time symmetry, parity symmetry and charge symmetry .

\n

No one suggests that you should agree with all my ideas, however your
\ncomment in your prior email to me is unnecessarily condescending:

\n

> “I think it’s a great pity that you’ve never taken
\n> the time to learn the technical details of physics as it’s
\n> currently practiced. There’s a lot known. And if you understood
\n> it, I think you’d be able to tell quite quickly which of
\n> your ideas are totally naive, and which might actually be interesting.”

\n

What is certain is that there’s no “great pity” necessary. I actually
\ndo know a lot about the technical details of physics. In any case,
\nthirty years ago Feynman thought that I needed to learn more about
\ncertain aspects of QM. He was specific in what he felt was everything
\nmore that I needed to know (in order to make progress with my CA
\nideas). He offered to work with me, which was accomplished during the
\ncourse of the year I spent at Caltech (1974-1975). I studied, learned
\nmore about QM and passed the final exam that Feynman gave me. While
\nwe argued a lot, Feynman never accused me of having naive ideas.

\n

As to NKS 2003, it doesn’t make a lot of sense for me to come to be a
\nmember of the audience. If you would like me to participate in some
\nmeaningful way, let me know.

\n

Best regards,

\n

Ed F

\n
\n

\n

And after that exchange, Ed and I basically went back to being as we had been before—having pleasant interactions, without any particular scientific engagement. And in a sense for many years I kept out of Ed’s scientific way—not seriously working on physics again until 2019.

\n

Since 2002 I’d been living in the Boston area, so Ed and I ran into each other more often. And although Ed’s behavior over A New Kind of Science had disappointed and upset me, it gave me a better understanding of Ed as a human being, and a vulnerable one at that.

\n

The Later Ed

\n

It was always a little hard to tell just what was going on with Ed. In July 2003, for example, he wrote to me:

\n

\n
\n
\n
Subject: Gunkel
\n
Date: Thu, 24 Jul 2003 19:07:56 -0400
\n
From: Ed Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nStephen,

\n

First I must apologize for this long letter. Pat Gunkel sent me an
\nemail telling of your visit. It prompted me (who hardly ever writes
\nanything) to type up my thoughts for whatever they’re worth.

\n

\n

You might be surprised at the number of wise and intelligent people who
\nreally appreciate Pat and his works. Yet after more than 30 years of
\nfitful, diverse yet nearly continuous support, Pat has come to a
\nsituation that, to him, looks like the end of the line.

\n

\n

I, unfortunately, am no longer in a position to personally provide the
\nkind of modest support that Pat needs to continue his church-mouse kind
\nof existence.

\n

\n

There is no doubt that Pat can be a difficult person to help, but I
\nnotice that he has mellowed with age. Of course, Wolfram Research is
\nnot a charitable institution. But I believe that Pat’s ideas on
\nideonomy are really important and that those ideas may form the basis
\nof interesting future applications. The point of all this is that if
\nwhat Pat is doing seems interesting to you, some arrangement with
\nWolfram Research might make sense.

\n
\n
\n

\n

(True to form, Gunkel followed up with a very forthright note, including a scathing critique he’d written of A New Kind of Science—as well as of Ed’s theories. That wouldn’t have deterred me, but I couldn’t see anything Gunkel could actually do for us, so I never pursued this.)

\n

But did Ed’s note imply that Ed was running out of money? I’d always assumed some kind of vast business empire lurking in the background, but now I wasn’t sure.

\n

I saw Ed only a few times in the next couple of years—at events like a Festschrift for Sulak and a bat mitzvah for one of Feynman’s granddaughters. But as usual, he was eager to tell stories, some of which I hadn’t heard before—mostly about things far in the past. He said that in the early 1960s John Cocke had stolen the idea of RISC architecture from his murdered friend Ben Gurley, though it had taken him two decades to get it taken seriously. He said that around the same time he’d been pulled in by the Air Force to help with analysis of blast waves from nuclear tests (and that story came with descriptions of B-52s doing loop-the-loop maneuvers when they dropped atomic bombs). He said that he’d once demoed the Muse music system (which, he emphasized, he, not Minsky, had invented) to an astonished audience in the Soviet Union. He said that he’d advised Richard Branson on his transatlantic balloon trip, telling him his butane burners weren’t correctly mounted—and in fact they fell off. And so on.

\n

In 2005 Ed told me he’d been working with a programmer in California named Dan Miller (who’d developed audio compression software [and been at the NKS 2003 conference that Ed had been so upset about]) on the new 3D cellular automaton he’d invented that he called the “SALT architecture” because its pattern of updates were like the Na and Cl in a salt crystal.

\n

But then in 2008 Ed told me he’d sold his island—presumably relieving whatever financial issues he’d had before—and suddenly Ed started to show up much more. He told me (as he did quite a few times) that he was working on a book (which never materialized). He told me he was teaching a course at Carnegie Mellon on the “Physics of Theoretical Computation”—which was apparently actually a very-much-as-before “engineering-style” effort to explore building features of physics from a cellular automaton, now with his SALT architecture. He invited me to a dinner at his house in honor of ‘t Hooft, photographed here with Ed, me and Sulak:

\n

Click to enlarge

\n

That fall, Ed came to the Midwest NKS Conference in Indiana, here photographed in a discussion with Greg Chaitin, me and others:

\n

Click to enlarge

\n

I would interact with Ed quite regularly after that—most often with him telling me about his use of Mathematica and soon Wolfram|Alpha. In 2012 Ed—now aged 78—sent me a nice “I have an idea” email (I made the requested introduction, though I’m not sure if this ever went anywhere):

\n

\n
\n
\n
Subject: Alpha and Problem Solving
\n
Date: Fri, 19 Oct 2012 20:12:01 +0000
\n
From: Edward Fredkin
\n
To: Steve Wolfram
\n
\n

\n
\nSteve,

\n

The first thing I taught at MIT was a course in general problem solving (in 1968).
\nI’m now developing a new course on General Problem Solving which I expect to
\noffer first at Harvard’s HILR program. Part of the motivation came from watching
\nJoyce struggle with a Harvard course on Chemistry, where a lot of the homework
\ninvolved units conversions. I noticed that Alpha promptly solved many of Joyce’s
\nhomework problems including some involving chemical reactions. (The course
\nwas really for students planning to take the MCAT Exam in order to get into Medical
\nSchool). One clue that you might give to the Alpha developers, is to work toward
\ngetting Alpha to have more of the capabilities necessary to pass different standard
\ntests that involve various kinds of quantitative analysis. (Of course, you might
\nhave already done so.)

\n

You might recall that I discussed the issue of units conversion with you long ago
\n(before Mathematica), and you described the idea you then had that turned into
\nConvert in Mathematica.

\n

In any case, Alpha is fantastic, and getting better all the time. My plan is that every
\none of my students must use Alpha for every problem that involves numbers, along
\nwith some that don’t involve numbers. My motto is John McCarthy’s dictum:
\n“Those who refuse to do arithmetic are doomed to talk nonsense!” However, with
\nAlpha, the problem solver doesn’t have to do the arithmetic or the units
\nconversions; Alpha can do it!

\n

It would be helpful if I could get a little bit of cooperation from someone in the Alpha
\ngroup. Basically, I will want to talk to an Alpha expert from time to time to make sure
\nI’m taking advantage of the best that Alpha can do along with resources already
\ndeveloped for introducing Alpha to new users. My initial students will be drawn from
\na group of retirees who, while clearly above average in intelligence, may have few
\nrecently used skills in mathematics. I also expect that almost all of my initial
\nstudents will be first time Alpha users. Again, I might profit from discussion
\nwith someone who has thought about how to introduce Alpha to beginners.

\n

Let me know what you think or, if you like, we could get together to talk about it.

\n

Best regards and Congratulations!

\n

Ed\n

\n
\n

\n

In 2014, when I recorded some oral history with Ed—now age 80—he was again brimming with ideas. The one he was most excited about had to do with weather prediction. It started from the observation that most smartphones have pressure sensors in them. Ed’s idea was to use these—and more—to create a sensor net that would continuously collect billions of pressure measurements, to be fed as input to weather forecast codes. Channeling his lifelong interest in reversible computing he imagined that the codes could be made reversible, and that running backwards from an incorrect prediction could tell one where more data had to be collected. Then Ed imagined doing this by having tiny balloons all over the place—with nothing that would cause trouble if a plane ran into it. He had a whole plan for partners he wanted to get (and, yes, he wanted us to be part of it too). And in typical Ed fashion, it was all laced with stories:

\n
\n

You know, I had this personal experience with weather. I was flying a glider along at 16,000 feet, and I encountered sink. You know, sink is wind blowing down. And the speed of the sink was 10,000 feet a minute. I was at 16,000 feet. And two minutes later, I was on the ground landing. Not on purpose. You know my attitude was—if I don’t see a big grading on the ground—[the wind] can’t keep going this way all the way down, so I won’t be killed. Actually, in that same storm, one of the pilots was killed.

\n
\n
\n

\n
\n
\n

The weather people just aren’t into the vertical movement of air. They do everything in layers. But this went through a lot of layers all at once in an organized fashion. So the point is that to talk about thousands or even millions of sensors makes no sense. You’re not going to do good weather until you get billions of sensors. That’s my opinion.

\n
\n

We talked about whether sensitive dependence on initial conditions destroys all predictability in fluid dynamics. I have theoretical and computational reasons to think it doesn’t. But Ed had a story:

\n
\n

There’s a mountain in California I happen to know, and I have a picture of a cloud street that starts on that mountain because it has a very peculiar geometry, and then runs for 2,000 miles.

\n
\n
\n

So this particular mountain has an area of its rock that faces towards the east and it’s big. And what happens is when the Sun is shining on that and the wet wind is coming from the Pacific and so on, you get this big cumulus cloud that flows back this way, and then you get another one and it pulses. You get one after another. And these are very stable things and they travel a very long way. So my point is that amidst all the randomness there’s a lot of order that can be found and understood. There are regions that have funny properties. They’re much more temperature stable. There’s like islands of stability. And things like that get ignored by everything people are doing today, you know what I mean?

\n
\n

I would send things I’d written to Ed. I didn’t really think he’d read them. But I thought he might at least enjoy their concepts. And often he would respond with ideas of his own. I sent him an announcement about our Tweet-a-Program project (now reconfigured because of Twitter changes) with the one-line comment (reflecting his “best programmer” self-characterization): “A new frontier of programming prowess?” He responded, in typical Ed fashion, with an idea—that’s actually a little reminiscent of modern AI image generation:

\n

\n
\n
\n
Subject: Re: Tweet-a-Program
\n
Date: Fri, 19 Sep 2014 21:25:47 +0000
\n
From: Edward Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nHi,

\n

I like it! As usual, it gave me ideas that might be outside of your
\ncurrent concept.

\n

We should talk sometime, so that I can explain something closely related
\nto [Tweet-a-Program] but decidedly different and perhaps even more fun.
\nStrangely, it has to do with Haiku.

\n

What I have figured out is that there could be a new kind of Haiku, where
\nthe text is interpreted by Mathematica to generate an image.
\n …
\nThe trick will be having the image reflect something of the Haiku meaning,
\neven if only abstractly. I don’t know how to do this so that it does the perfect
\nthing every time, but I have thought of something that could be fun, and a
\nperson could become skilled at creating Mathematica Haikus that seem to reflect
\nsome aspects of the feeling of the words in an image with some increasing
\nprobability of doing it well, as a result of practice.

\n

\n

Ed\n

\n
\n

\n

Late in 2014 Ed sent me another piece of mail saying he was starting a project to produce a “new cellular automaton system”—and he wanted to use our technology to do it. He also sent me a paper he’d written about his SALT cellular automaton:

\n

Click to enlarge

\n

Finally—and without my help—Ed seemed to have mastered the art of academic papers. This one was on the arXiv preprint server. Others—with titles like “An Introduction to Digital Philosophy”—had appeared in academic journals. (Ones with titles like “A New Cosmogony” and “Finite Nature ” were more privately circulated.) But what most struck me about this particular paper was that—for the first time—it seemed to have actual images of cellular automaton behavior. Ever since those few minutes with the PERQ computer on Ed’s island in 1982 I hadn’t seen Ed ever show anything like that. And now Ed was again chasing that old question Minsky had asked, of making a circle with a cellular automaton.

\n

At the time, I didn’t have a chance to see what Ed had actually done, and whether he’d finally solved it. But in writing this piece, I decided I’d better try to find out. The actual rule—that Ed and Dan Miller called “BusyBoxes”—is quite complicated, involving knight’s-move neighborhoods, etc. Their claim was that starting with a string of cells in a particular configuration, the average of their positions would trace out what in the limit of a long string would be a circle:

\n
\n
\n

\n

At first it looks like a kind of magic trick (and no, nothing is bouncing off any “walls”; the direction changes are just a consequence of the initial pattern of cells). But if you keep all the locations that get visited, things start to seem less mysterious—because what you realize is that the “basket” that gets “woven” is actually just a cube, viewed from a corner:

\n
\n
\n

\n

Where does the apparent circle come from? The details are a bit complicated—and I’ve put them in an appendix below. But suffice it say to that Ed’s old nemesis—calculus—comes in very handy. And in fact it lets one show that although one gets almost a circle, it’s not quite a circle; even with an infinite string, its radius is still wiggling by about 0.5% as one goes around the “circle”:

\n
\n
\n

\n

And—as we’ll see below—remarkably enough one can get a closed-form result for the amount of wiggliness (here computed as the ratio of maximum to minimum radius):

\n
\n
\n

\n

In earlier years, Ed might have tried to say that generating a circle (which this doesn’t) was tantamount to showing that a cellular automaton could reproduce physics. But by now I think he realized that it was really much more complicated than that. And he wasn’t mentioning physics much to me anymore. But—perhaps not least because many of his longtime interlocutors had by then died—he was interacting with me more than before. And perhaps he was even beginning to think that I might have a bit more to contribute than he’d assumed.

\n

In December 2015 I sent Ed a piece I’d written to celebrate the bicentenary of Ada Lovelace, and he responded:

\n

\n
\n
\n
Date: Fri, 11 Dec 2015 15:58:14 +0000
\n
From: Edward Fredkin
\n
To: Stephen Wolfram
\n
\n

\n
\nStephen,

\n

I was truly blown away by your essay re Ada Lovelace! You’ve got a lot
\nmore to give the world than I had imagined, and I, more than anyone else,
\nappreciate what you might still be capable of accomplishing.

\n

It’s too bad that some persons at MIT, for far too long, hung onto one
\ndimensional views focussed on what Macsyma might have been. My own
\nimpressions have always been different, I recognized your potential long
\nago and consequently invited you to one of my Mosqito Island conferences
\nsome 3.5 decades ago.

\n

In any case, much of what Mathematica makes possible is very important and
\nvaluable to me. As you know I was an early user and continue to be a
\nuser.

\n

Many of my interests have run along many paths opened up by activities you
\nhave instigated at Wolfram. Wolfram Alpha and its connections to Siri,
\nare examples.

\n

Your new book “An Elementary Introduction to the Wolfram Language” (I
\ndon’t yet have a hard copy) fits in with a project I had in mind for my
\ngrandchild Robert, who at age 6 already seems to be extraordinarily
\ntalented mathematically.

\n

To cut to the chase, I want to make a proposal: Although I’m too old to
\nbe a regular employee, I’d nevertheless like to have an association with
\nWolfram, where I might be able to contribute ideas, and solve problems
\n(I’m still quite good at that).

\n

I won’t need much from you other than your opening the door to my
\ninvolvement at Wolfram. What I have in mind would be an arrangement
\nwhere I could work for Wolfram, with some kind of arrangement other than
\nfull time employment.

\n

I’ve attached something I wrote recently.

\n

Ed\n

\n
\n

\n

Gosh! That was an unexpected development. Flattering, I suppose. But my main reaction was a kind of sadness. Yes, after all these years, Ed had finally read something I’d written. But somehow his response sounded like he was surrendering. This wasn’t the “I-want-to-do-everything-for-myself” Ed I had known all this time. This was an Ed who somehow felt he needed us to support him. And while our company has been able to absorb a great many “unusual” people—with terrific success—Ed seemed like he was pretty far outside our envelope.

\n

At the time, I didn’t look at the attachment Ed sent with his email. But opening it now adds to my sense of sadness. It was a 13-page document about a system Ed imagined that would help people with “various forms of cognitive disabilities”, including a section on “Dementia and Alzheimer’s”:

\n

Click to enlarge

\n

It wasn’t until 2017 that Ed explicitly mentioned to me that his short-term memory was failing—though in talking to him it had been increasingly obvious for several years. He said he’d joined a group of people who were writing their memoirs. I told him I’d look forward to seeing his, though I’m not sure he ever made much progress on them.

\n

Ed continued to send me ideas and proposals. There was a very Ed-like “global idea” about creating a system “GM” (presumably for “General Mathematician”) that would effectively “learn all of mathematics” by automatically reading math books, etc. (yes, definite overtones of what’s happening with LLM-meets-Wolfram-Language):

\n

Click to enlarge

\n

Later there were several pieces of mail about a new idea for factoring integers. In the first of them (from 2016), Ed told me that when the NeXT computer first came out (in 1989) he’d used Mathematica on it to simulate a reversible hardware multiplier. And being reminded of this by a historical piece I’d written, he said it had “started me thinking, again, about that problem and I had a new insight that appears to so greatly reduce the complexity of a reversible multiplier so as to possibly make it better at factoring large integers than current algorithms.” He wrote me about this several more times, suggesting various kinds of collaborations. Finally, in 2018 he told me how the method worked, saying it involved doing reversible arithmetic using balanced ternary. (Strangely enough, years earlier Ed had told me about Soviet computers that also used balanced ternary.)

\n

I think that was the last technical conversation I had with Ed. A couple of years later I sent him the book about our Physics Project with the inscription:

\n

Click to enlarge

\n

And I would see him at least once a year at the Boston-area physics get-together organized by Boston University. He would always tell me stories. Often the same stories, and sometimes stories about me. And indeed as I was writing this piece I actually found a video Ed made in November 2020 that has such a story, albeit by this point seriously muddled (and, no, I’ve basically never “run” a cellular automaton by hand in my life!):

\n
\n

I used to organize meetings in the Caribbean and I did this because I had an island in the Caribbean … I invited Wolfram to come down. Wolfram had done pioneering work in cellular automata. … He was a great guy, you know, and I wanted him to get on the bandwagon … He shows up at the meeting and he had done all his work by hand as had everyone else in cellular automata. He didn’t think of using a computer. [!] I had a display processor that I modified to be able to run a cellular automaton with the stuff that it used to put text up on the screen. And so I’m showing him a cellular automata running at 60 frames a second continuously like a movie. This was 10,000 times faster than doing it by hand which is what he’d always done. He never thought of using a computer to do cellular automata and he turns around and walks out and and he left the island and went back to someplace else. So [later] I went to his meeting at Los Alamos and I ran into him again and he was now doing computer work. And I said to him “How come in all your work you don’t have a reversible [rule]”, and he says to me “Oh, reversible ones are all trivial”. And I went up and this is the most telling thing about his intellect: he’s a very smart guy [and when I] showed him how he could change his rule slightly and make it reversible his eyes just about popped out of his head and he knew I was correct.

\n
\n
\n

I may have introduced him to this field but what he has done is he is far better than I at getting other people involved. I’ve never bothered and I don’t have the talent that he has for that. What he did was he came up with similar ideas and initially he didn’t give me the credit I thought I deserved. But it became apparent to me that he did this independently and he’s better at writing things and better at hiring bright people who can do things than I ever was.

\n
\n

And right after that, Ed ends the video with:

\n
\n

As I look back on my career I’ve had a fantastic life and I’m not unhappy about any aspect of it because, you know, I’ve accomplished everything I might have done and in spite of various handicaps—like not being a writer—I still have done a lot and the world, uh, understands me, I think, and appreciates what I’ve done.

\n
\n

When I saw Ed in 2022 he wasn’t able to say much. But, though it was a struggle, he was keen to make one point to me, that seemed to matter a lot to him: “You’ve managed to get people to follow you”, he said “I was never able to do that”. I saw Ed one last time this May. Joyce explained that Ed had “bumped his head”, and, in a very Ed-like way, she was avoiding a repeat by getting him to wear a bike helmet. She wanted someone to snap a picture of me and her with Ed:

\n

Click to enlarge

\n

Six weeks later, Ed died, at the age of 88.

\n

I went to see Joyce and Rick a few weeks later, among other things to check facts for this piece. I’d heard from Ed that his ancestors had provided wood for the imperial palace in St. Petersburg. But I’d also heard from someone else that Ed had said he was descended from Mongolian royalty. And as I was about to leave, I thought I might as well ask. “Oh yes”, they said. “And Ed’s father even wrote a historical novel about it”. And they showed me two books (both from the mid-1980s):

\n

Click to enlarge

\n

I’m not sure who Sarah, Queen of Mongolia was, but the book blurb claims that Ed’s father was her great-great-great-grandson—and goes on to speak of the “strong family inheritance of a mind that analyzes not only the injustice of human oppression but offers realistic and beneficial solutions”.

\n

Summing Up Ed

\n

“Can that really be true?” I often asked myself when hearing yet another of Ed’s implausible stories. And of course it didn’t help that stories he told—even to me—about me weren’t true. But the remarkable thing in writing this piece is that I’ve been able to verify that a lot of Ed’s stories—implausible though they may have sounded—were in fact true. Yes, they were often embellished, and parts that didn’t reflect so well on Ed were omitted. But together they defined a remarkable tapestry of a life.

\n

It was in many ways a very independent life. Ed had friends and family members to whom he stayed close throughout his life. But mostly it was “Ed for himself, against the world”. He didn’t want to learn anything from anyone else; he wanted to figure out everything for himself. He wanted to invent his own ideas; he wasn’t too interested in other people’s. In a rather Air-Force-pilot kind of way (“eject or not?”) he liked to be decisive—and he liked to be incisive too, always figuring out a clear, simple thing to say. Sometimes that came across as naive. And sometimes it was in fact naive. But mostly Ed didn’t seem to mind much; he would just go on to another idea.

\n

Ed was a great storyteller, and an engaging speaker. For some reason he developed the theory that he couldn’t write—but there’s ample evidence, going back even to his teenage years, that this wasn’t true. If there was a problem, it was with content, not writing. And the issue with the content was that it tended to just be too Ed-specific—too insular—and not connected enough for other people to be able to understand or appreciate it.

\n

I don’t know what Ed was like as a manager; I rather suspect he may have suffered from trying to be a bit too clever, with too many ideas and too much gamification. In the end, he felt he’d failed as a leader, and perhaps that was inevitable given how independent he always wanted to be. Despite his stints as an academic administrator and as a CEO, Ed was in the end fundamentally a lone warrior (and problem solver), not a general.

\n

And what about all those ideas? Most never developed very far. Some were pretty wild. But many had at least a kernel of visionary insight. The details of the universe as a cellular automaton didn’t make sense. But the idea that the universe is somehow computational is surely correct. And spread over the course of more than six decades, Ed spun out nuggets of ideas that would later appear—usually much more developed—in a remarkable range of areas.

\n

Ed projected a kind of personal serenity—yet he was in many ways deeply competitive. Most of the time, though, he was able to define the arena of his competitiveness so idiosyncratically that there really weren’t other contenders. And I think in the end Ed felt pretty good about all the things he’d managed to do in his life. It was fitting that he owned an actual island. Because somehow an island was a metaphor for Ed’s life: separate, independent and unique.

\n

Thanks

\n

I’ve had help with information for this piece from many people, including Joyce Fredkin, Rick Fredkin, Simson Garfinkel, Andrea Gerlach, Bill Gosper, Howard Gutowitz, Steven Levy, Norm Margolus, Margaret Minsky, Dave Moon, John Moussouris, Mark Nahabedian, Walter Parkes, David Reiss, Brian Silverman, George Sulak, Larry Sulak and Matthew Szudzik. (Tom Toffoli agreed to talk, but didn’t show up.) I thank the Department of Distinctive Collections at the MIT Library for access to the Fredkin papers archive there. Thanks also to Brad Klee and Nik Murzin for technical help.

\n

Appendix: Analyzing the Not-Quite-Circle

\n

Here’s what the SALT cellular automaton does for two sizes of initial “string”:

\n
\n
\n

\n

For an initial string of length n (with n > 2), the overall period is 54n – 43, and the envelope “woven” going through all configurations is:

\n
\n
\n

\n

The “circle” is obtained by averaging the positions of all cells present at a given time step. The “circle” is always planar, but its effective radius varies with direction (i.e. as the system steps through each cycle):

\n
\n
\n

\n

Ed and Dan Miller looked at the standard deviation of the effective radius as a function of n, computing it up to n = 20, and getting the following results:

\n

Click to enlarge

\n

It looked as if the standard deviation was just going to go smoothly to zero—so that for an infinite string one would get a perfect circle. But that turns out not to be true, as one can see by extending the computation to slightly larger values of n:

\n
\n
\n

\n

And actually there’s a minimum at n = 43, with standard deviation 0.0012 (and fractional size discrepancy 0.0048)—and it doesn’t look like even for n ∞ one will get a perfect circle.

\n

But how can one work out the n ∞ case? It’s actually a nice application for calculus.

\n

First, notice that the “basket” consists of a series of layers of a cube viewed from one of its corners, or in other words a sequence of shapes like this:

\n
\n
\n

\n

Here’s how these are formed as one sweeps through the cube:

\n
\n
\n

\n

One can think of the string in the cellular automaton as spanning these “layers”, and successively moving around all of them as the cellular automaton evolves. In the continuum limit, there’s effectively a parameter t that defines where on each “layer curve” one is at a particular time. Conveniently enough, the length of all the layer curves is the same (for a unit cube it is 3 ≈ 4.2). With successive layers parametrized by a variable s (running from 0 to 1) the corners of the layer curves (all normalized to have length 1) are given by:

\n
\n
\n

\n

Now we need to find the actual x, y positions of string elements (AKA infinitesimal cells) as a function of s and t. Since the edges of the layer polygons are always straight, in each of a series of “piecewise regions” in s and t (with breakpoints defined by the corners of the polygons), we get expressions for x and y that are linear in s and t:

\n
\n
\n

\n

One subtlety is that the string in essence turns as time progresses, so that it effectively samples a different t value for different layers s. To correct for this, we have to find for which t we get x = 0 for a given s. It’s convenient to put the center of all our layer curves at {0, 0}, and we can do this now by subtracting . Then the (first) value of t at which x = 0 is given simply by:

\n
\n
\n

\n

The parametric surface we now get as a function of t is (with discrete lines indicating particular values of s):

\n
\n
\n

\n

Now we can slice the parametric surface not in discrete s values but instead in discrete t values—thus getting what’s basically a sequence of effective strings at discrete times:

\n
\n
\n

\n

The centroids of the strings are indicated in green, and these are then points on our potential circle. Using what we did above, the radius of this “circle” as a function of t can then be found by integrating over s. The result is algebraically complicated, but has a closed form:

\n
\n
\n

\n

Integrating this over t we get the “average radius”, normalized to “circumference 1” from the fact that t varies from 0 to 1 going “around the circle”:

\n
\n
\n

\n

(This means that the “effective π” for this circle is about 3.437.)

\n

Now we can plot the “wiggle” of the radius as a function of “angle” (i.e. t):

\n
\n
\n

\n

It looks a bit like a sine curve, but it’s not one. And, for example, it isn’t even symmetrical. Its maxima (which occur at odd multiples of 30°) are

\n
\n
\n

\n

while its minima (at even multiples of 30°) are

\n
\n
\n

\n

and dividing by the average radius these are about 1.00734 and 0.992175.

\n

The ratio of maximum to minimum (effectively “wiggle amplitude”) is:

\n
\n
\n

\n

Meanwhile, the standard deviation can be obtained as an integral over t, and the final result is

\n
\n
\n

\n

which is about 2.4 times larger than what we get at n = 100. We can see the approach to the asymptotic value by computing integrals over t for progressively larger numbers of discrete values of s (which, we should emphasize, is similar to values of n, but not quite the same, particularly for small n):

\n
\n
\n

\n", - "category": "Historical Perspectives", - "link": "https://writings.stephenwolfram.com/2023/08/remembering-the-improbable-life-of-ed-fredkin-1934-2023-and-his-world-of-ideas-and-stories/", - "creator": "Mark Long", - "pubDate": "Tue, 22 Aug 2023 20:03:54 +0000", - "enclosure": "https://content.wolfram.com/sites/43/2023/08/PERQ-1.mov", - "enclosureType": "video/quicktime", - "image": "https://content.wolfram.com/sites/43/2023/08/PERQ-1.mov", - "id": "", - "language": "en", - "folder": "", - "feed": "wolfram", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "427cfd5d97716dee9a34369b72a7b686", - "highlights": [] - }, { "title": "Generative AI Space and the Mental Imagery of Alien Minds", "description": "\"\"Click on any image in this post to copy the code that produced it and generate the output on your own computer in a Wolfram notebook. AIs and Alien Minds How do alien minds perceive the world? It’s an old and oft-debated question in philosophy. And it now turns out to also be a question […]", @@ -153,28 +329,6 @@ "hash": "f51ac7a3875bd5279a95ee7f047858c0", "highlights": [] }, - { - "title": "LLM Tech and a Lot More: Version 13.3 of Wolfram Language and Mathematica", - "description": "\"\"The Leading Edge of 2023 Technology … and Beyond Today we’re launching Version 13.3 of Wolfram Language and Mathematica—both available immediately on desktop and cloud. It’s only been 196 days since we released Version 13.2, but there’s a lot that’s new, not least a whole subsystem around LLMs. Last Friday (June 23) we celebrated 35 […]", - "content": "\"\"

\"LLM

\n

The Leading Edge of 2023 Technology … and Beyond

\n

Today we’re launching Version 13.3 of Wolfram Language and Mathematica—both available immediately on desktop and cloud. It’s only been 196 days since we released Version 13.2, but there’s a lot that’s new, not least a whole subsystem around LLMs.

\n

Last Friday (June 23) we celebrated 35 years since Version 1.0 of Mathematica (and what’s now Wolfram Language). And to me it’s incredible how far we’ve come in these 35 years—yet how consistent we’ve been in our mission and goals, and how well we’ve been able to just keep building on the foundations we created all those years ago.

\n

And when it comes to what’s now Wolfram Language, there’s a wonderful timelessness to it. We’ve worked very hard to make its design as clean and coherent as possible—and to make it a timeless way to elegantly represent computation and everything that can be described through it.

\n

Last Friday I fired up Version 1 on an old Mac SE/30 computer (with 2.5 megabytes of memory), and it was a thrill see functions like Plot and NestList work just as they would today—albeit a lot slower. And it was wonderful to be able to take (on a floppy disk) the notebook I created with Version 1 and have it immediately come to life on a modern computer.

\n

But even as we’ve maintained compatibility over all these years, the scope of our system has grown out of all recognition—with everything in Version 1 now occupying but a small sliver of the whole range of functionality of the modern Wolfram Language:

\n

Versions 1.0 and 13.3 of Wolfram Language compared

\n

So much about Mathematica was ahead of its time in 1988, and perhaps even more about Mathematica and the Wolfram Language is ahead of its time today, 35 years later. From the whole idea of symbolic programming, to the concept of notebooks, the universal applicability of symbolic expressions, the notion of computational knowledge, and concepts like instant APIs and so much more, we’ve been energetically continuing to push the frontier over all these years.

\n

Our long-term objective has been to build a full-scale computational language that can represent everything computationally, in a way that’s effective for both computers and humans. And now—in 2023—there’s a new significance to this. Because with the advent of LLMs our language has become a unique bridge between humans, AIs and computation.

\n

The attributes that make Wolfram Language easy for humans to write, yet rich in expressive power, also make it ideal for LLMs to write. And—unlike traditional programming languages— Wolfram Language is intended not only for humans to write, but also to read and think in. So it becomes the medium through which humans can confirm or correct what LLMs do, to deliver computational language code that can be confidently assembled into a larger system.

\n

The Wolfram Language wasn’t originally designed with the recent success of LLMs in mind. But I think it’s a tribute to the strength of its design that it now fits so well with LLMs—with so much synergy. The Wolfram Language is important to LLMs—in providing a way to access computation and computational knowledge from within the LLM. But LLMs are also important to Wolfram Language—in providing a rich linguistic interface to the language.

\n

We’ve always built—and deployed—Wolfram Language so it can be accessible to as many people as possible. But the advent of LLMs—and our new Chat Notebooks—opens up Wolfram Language to vastly more people. Wolfram|Alpha lets anyone use natural language—without prior knowledge—to get questions answered. Now with LLMs it’s possible to use natural language to start defining potential elaborate computations.

\n

As soon as you’ve formulated your thoughts in computational terms, you can immediately “explain them to an LLM”, and have it produce precise Wolfram Language code. Often when you look at that code you’ll realize you didn’t explain yourself quite right, and either the LLM or you can tighten up your code. But anyone—without any prior knowledge—can now get started producing serious Wolfram Language code. And that’s very important in seeing Wolfram Language realize its potential to drive “computational X” for the widest possible range of fields X.

\n

But while LLMs are “the biggest single story” in Version 13.3, there’s a lot else in Version 13.3 too—delivering the latest from our long-term research and development pipeline. So, yes, in Version 13.3 there’s new functionality not only in LLMs but also in many “classic” areas—as well as in new areas having nothing to do with LLMs.

\n

Across the 35 years since Version 1 we’ve been able to continue accelerating our research and development process, year by year building on the functionality and automation we’ve created. And we’ve also continually honed our actual process of research and development—for the past 5 years sharing our design meetings on open livestreams.

\n

Version 13.3 is—from its name—an “incremental release”. But—particularly with its new LLM functionality—it continues our tradition of delivering a long list of important advances and updates, even in incremental releases.

\n

LLM Tech Comes to Wolfram Language

\n

LLMs make possible many important new things in the Wolfram Language. And since I’ve been discussing these in a series of recent posts, I’ll just give only a fairly short summary here. More details are in the other posts, both ones that have appeared, and ones that will appear soon.

\n
\n

To ensure you have the latest Chat Notebook functionality installed and available, use:

\n
PacletInstall[\"Wolfram/Chatbook\" \"\" \"1.0.0\", UpdatePacletSites \"\" True].
\n

\n

\n

The most immediately visible LLM tech in Version 13.3 is Chat Notebooks. Go to File > New > Chat-Enabled Notebook and you’ll get a Chat Notebook that supports “chat cells” that let you “talk to” an LLM. Press ' (quote) to get a new chat cell:

\n

Plot two sine curves

\n

You might not like some details of what got done (do you really want those boldface labels?) but I consider this pretty impressive. And it’s a great example of using an LLM as a “linguistic interface” with common sense, that can generate precise computational language, which can then be run to get a result.

\n

This is all very new technology, so we don’t yet know what patterns of usage will work best. But I think it’s going to go like this. First, you have to think computationally about whatever you’re trying to do. Then you tell it to the LLM, and it’ll produce Wolfram Language code that represents what it thinks you want to do. You might just run that code (or the Chat Notebook will do it for you), and see if it produces what you want. Or you might read the code, and see if it’s what you want. But either way, you’ll be using computational language—Wolfram Language—as the medium to formalize and express what you’re trying to do.

\n

When you’re doing something you’re familiar with, it’ll almost always be faster and better to think directly in Wolfram Language, and just enter the computational language code you want. But if you’re exploring something new, or just getting started on something, the LLM is likely to be a really valuable way to “get you to first code”, and to start the process of crispening up what you want in computational terms.

\n

If the LLM doesn’t do exactly what you want, then you can tell it what it did wrong, and it’ll try to correct it—though sometimes you can end up doing a lot of explaining and having quite a long dialog (and, yes, it’s often vastly easier just to type Wolfram Language code yourself):

\n

Draw red and green semicircles

\n

Redraw red and green semicircles

\n

Sometimes the LLM will notice for itself that something went wrong, and try changing its code, and rerunning it:

\n

Make table of primes

\n

And even if it didn’t write a piece of code itself, it’s pretty good at piping up to explain what’s going on when an error is generated:

\n

Error report

\n

And actually it’s got a big advantage here, because “under the hood” it can look at lots of details (like stack trace, error documentation, etc.) that humans usually don’t bother with.

\n

To support all this interaction with LLMs, there’s all kinds of new structure in the Wolfram Language. In Chat Notebooks there are chat cells, and there are chatblocks (indicated by gray bars, and generating with ~) that delimit the range of chat cells that will be fed to the LLM when you press shiftenter on a new chat cell. And, by the way, the whole mechanism of cells, cell groups, etc. that we invented 36 years ago now turns out to be extremely powerful as a foundation for Chat Notebooks.

\n

One can think of the LLM as a kind of “alternate evaluator” in the notebook. And there are various ways to set up and control it. The most immediate is in the menu associated with every chat cell and every chatblock (and also available in the notebook toolbar):

\n

Chat cell and chatblock menu

\n

The first items here let you define the “persona” for the LLM. Is it going to act as a Code Assistant that writes code and comments on it? Or is it just going to be a Code Writer, that writes code without being wordy about it? Then there are some “fun” personas—like Wolfie and Birdnardo—that respond “with an attitude”. The Advanced Settings let you do things like set the underlying LLM model you want to use—and also what tools (like Wolfram Language code evaluation) you want to connect to it.

\n

Ultimately personas are mostly just special prompts for the LLM (together, sometimes with tools, etc.) And one of the new things we’ve recently launched to support LLMs is the Wolfram Prompt Repository:

\n

Wolfram Prompt Repository

\n

The Prompt Repository contains several kinds of prompts. The first are personas, which are used to “style” and otherwise inform chat interactions. But then there are two other types of prompts: function prompts, and modifier prompts.

\n

Function prompts are for getting the LLM to do something specific, like summarize a piece of text, or suggest a joke (it’s not terribly good at that). Modifier prompts are for determining how the LLM should modify its output, for example translating into a different human language, or keeping it to a certain length.

\n

You can pull in function prompts from the repository into a Chat Notebook by using !, and modifier prompts using #. There’s also a ^ notation for saying that you want the “input” to the function prompt to be the cell above:

\n

ScientificJargonize

\n

This is how you can access LLM functionality from within a Chat Notebook. But there’s also a whole symbolic programmatic way to access LLMs that we’ve added to the Wolfram Language. Central to this is LLMFunction, which acts very much like a Wolfram Language pure function, except that it gets “evaluated” not by the Wolfram Language kernel, but by an LLM:

\n
\n
\n

\n

You can access a function prompt from the Prompt Repository using LLMResourceFunction:

\n
\n
\n

\n

There’s also a symbolic representation for chats. Here’s an empty chat:

\n
\n
\n

\n

And here now we “say something”, and the LLM responds:

\n
\n
\n

\n

There’s lots of depth to both Chat Notebooks and LLM functionsas I’ve described elsewhere. There’s LLMExampleFunction for getting an LLM to follow examples you give. There’s LLMTool for giving an LLM a way to call functions in the Wolfram Language as “tools”. And there’s LLMSynthesize which provides raw access to the LLM as its text completion and other capabilities. (And controlling all of this is $LLMEvaluator which defines the default LLM configuration to use, as specified by an LLMConfiguration object.)

\n

I consider it rather impressive that we’ve been able to get to the level of support for LLMs that we have in Version 13.3 in less than six months (along with building things like the Wolfram Plugin for ChatGPT, and the Wolfram ChatGPT Plugin Kit). But there’s going to be more to come, with LLM functionality increasingly integrated into Wolfram Language and Notebooks, and, yes, Wolfram Language functionality increasingly integrated as a tool into LLMs.

\n

Line, Surface and Contour Integration

\n

“Find the integral of the function ___” is a typical core thing one wants to do in calculus. And in Mathematica and the Wolfram Language that’s achieved with Integrate. But particularly in applications of calculus, it’s common to want to ask slightly more elaborate questions, like “What’s the integral of ___ over the region ___?”, or “What’s the integral of ___ along the line ___?”

\n

Almost a decade ago (in Version 10) we introduced a way to specify integration over regions—just by giving the region “geometrically” as the domain of the integral:

\n
\n
\n

\n

It had always been possible to write out such an integral in “standard Integrate” form

\n
\n
\n

\n

but the region specification is much more convenient—as well as being much more efficient to process.

\n

Finding an integral along a line is also something that can ultimately be done in “standard Integrate” form. And if you have an explicit (parametric) formula for the line this is typically fairly straightforward. But if the line is specified in a geometrical way then there’s real work to do to even set up the problem in “standard Integrate” form. So in Version 13.3 we’re introducing the function LineIntegrate to automate this.

\n

LineIntegrate can deal with integrating both scalar and vector functions over lines. Here’s an example where the line is just a straight line:

\n
\n
\n

\n

But LineIntegrate also works for lines that aren’t straight, like this parametrically specified one:

\n
\n
\n

\n

To compute the integral also requires finding the tangent vector at every point on the curve—but LineIntegrate automatically does that:

\n
\n
\n

\n

Line integrals are common in applications of calculus to physics. But perhaps even more common are surface integrals, representing for example total flux through a surface. And in Version 13.3 we’re introducing SurfaceIntegrate. Here’s a fairly straightforward integral of flux that goes radially outward through a sphere:

\n
\n
\n

\n

Here’s a more complicated case:

\n
\n
\n

\n
\n
\n

\n

And here’s what the actual vector field looks like on the surface of the dodecahedron:

\n
\n
\n

\n

LineIntegrate and SurfaceIntegrate deal with integrating scalar and vector functions in Euclidean space. But in Version 13.3 we’re also handling another kind of integration: contour integration in the complex plane.

\n

We can start with a classic contour integral—illustrating Cauchy’s theorem:

\n
\n
\n

\n

Here’s a slightly more elaborate complex function

\n
\n
\n

\n

and here’s its integral around a circular contour:

\n
\n
\n

\n

Needless to say, this still gives the same result, since the new contour still encloses the same poles:

\n
\n
\n

\n

More impressively, here’s the result for an arbitrary radius of contour:

\n
\n
\n

\n

And here’s a plot of the (imaginary part of the) result:

\n
\n
\n

\n

Contours can be of any shape:

\n
\n
\n

\n

The result for the contour integral depends on whether the pole is inside the “Pac-Man”:

\n
\n
\n

\n

Another Milestone for Special Functions

\n

One can think of special functions as a way of “modularizing” mathematical results. It’s often a challenge to know that something can be expressed in terms of special functions. But once one’s done this, one can immediately apply the independent knowledge that exists about the special functions.

\n

Even in Version 1.0 we already supported many special functions. And over the years we’ve added support for many more—to the point where we now cover everything that might reasonably be considered a “classical” special function. But in recent years we’ve also been tackling more general special functions. They’re mathematically more complex, but each one we successfully cover makes a new collection of problems accessible to exact solution and reliable numerical and symbolic computation.

\n

Most of the “classic” special functions—like Bessel functions, Legendre functions, elliptic integrals, etc.—are in the end univariate hypergeometric functions. But one important frontier in “general special functions” are those corresponding to bivariate hypergeometric functions. And already in Version 4.0 (1999) we introduced one example of such as a function: AppellF1. And, yes, it’s taken a while, but now in Version 13.3 we’ve finally finished doing the math and creating the algorithms to introduce AppellF2, AppellF3 and AppellF4.

\n

On the face of it, it’s just another function—with lots of arguments—whose value we can find to any precision:

\n
\n
\n

\n

Occasionally it has a closed form:

\n
\n
\n

\n

But despite its mathematical sophistication, plots of it tend to look fairly uninspiring:

\n
\n
\n

\n

Series expansions begin to show a little more:

\n
\n
\n

\n

And ultimately this is a function that solves a pair of PDEs that can be seen as a generalization to two variables of the univariate hypergeometric ODE. So what other generalizations are possible? Paul Appell spent many years around the turn of the twentieth century looking—and came up with just four, which as of Version 13.3 now all appear in the Wolfram Language, as AppellF1, AppellF2, AppellF3 and AppellF4.

\n

To make special functions useful in the Wolfram Language they need to be “knitted” into other capabilities of the language—from numerical evaluation to series expansion, calculus, equation solving, and integral transforms. And in Version 13.3 we’ve passed another special function milestone, around integral transforms.

\n

When I started using special functions in the 1970s the main source of information about them tended to be a small number of handbooks that had been assembled through decades of work. When we began to build Mathematica and what’s now the Wolfram Language, one of our goals was to subsume the information in such handbooks. And over the years that’s exactly what we’ve achieved—for integrals, sums, differential equations, etc. But one of the holdouts has been integral transforms for special functions. And, yes, we’ve covered a great many of these. But there are exotic examples that can often only “coincidentally” be done in closed form—and that in the past have only been found in books of tables.

\n

But now in Version 13.3 we can do cases like:

\n
\n
\n

\n

And in fact we believe that in Version 13.3 we’ve reached the edge of what’s ever been figured out about Laplace transforms for special functions. The most extensive handbook—finally published in 1973—runs to about 400 pages. A few years ago we could do about 55% of the forward Laplace transforms in the book, and 31% of the inverse ones. But now in Version 13.3 we can do 100% of the ones that we can verify as correct (and, yes, there are definitely some mistakes in the book). It’s the end of a long journey, and a satisfying achievement in the quest to make as much mathematical knowledge as possible automatically computable.

\n

Finite Fields!

\n

Ever since Version 1.0 we’ve been able to do things like factoring polynomials modulo primes. And many packages have been developed that handle specific aspects of finite fields. But in Version 13.3 we now have complete, consistent coverage of all finite fields—and operations with them.

\n

Here’s our symbolic representation of the field of integers modulo 5 (AKA ℤ5 or GF(5)):

\n
\n
\n

\n

And here are symbolic representations of the elements of this field—which in this particular case can be rather trivially identified with ordinary integers mod 5:

\n
\n
\n

\n

Arithmetic immediately works on these symbolic elements:

\n
\n
\n

\n

But where things get a bit trickier is when we’re dealing with prime-power fields. We represent the field GF(23) symbolically as:

\n
\n
\n

\n

But now the elements of this field no longer have a direct correspondence with ordinary integers. We can still assign “indices” to them, though (with elements 0 and 1 being the additive and multiplicative identities). So here’s an example of an operation in this field:

\n
\n
\n

\n

But what actually is this result? Well, it’s an element of the finite field—with index 4—represented internally in the form:

\n
\n
\n

\n

The little box opens out to show the symbolic FiniteField construct:

\n

FormField construct

\n

And we can extract properties of the element, like its index:

\n
\n
\n

\n

So here, for example, are the complete addition and multiplication tables for this field:

\n
\n
\n

\n

For the field GF(72) these look a little more complicated:

\n
\n
\n

\n

There are various number-theoretic-like functions that one can compute for elements of finite fields. Here’s an element of GF(510):

\n
\n
\n

\n

The multiplicative order of this (i.e. power of it that gives 1) is quite large:

\n
\n
\n

\n

Here’s its minimal polynomial:

\n
\n
\n

\n

But where finite fields really begin to come into their own is when one looks at polynomials over them. Here, for example, is factoring over GF(32):

\n
\n
\n

\n

Expanding this gives a finite-field-style representation of the original polynomial:

\n
\n
\n

\n

Here’s the result of expanding a power of a polynomial over GF(32):

\n
\n
\n

\n

More, Stronger Computational Geometry

\n

We originally introduced computational geometry in a serious way into the Wolfram Language a decade ago. And ever since then we’ve been building more and more capabilities in computational geometry.

\n

We’ve had RegionDistance for computing the distance from a point to a region for a decade. In Version 13.3 we’ve now extended RegionDistance so it can also compute the shortest distance between two regions:

\n
\n
\n

\n

We’ve also introduced RegionFarthestDistance which computes the furthest distance between any two points in two given regions:

\n
\n
\n

\n

Another new function in Version 13.3 is RegionHausdorffDistance which computes the largest of all shortest distances between points in two regions; in this case it gives a closed form:

\n
\n
\n

\n
\n
\n

\n

Another pair of new functions in Version 13.3 are InscribedBall and CircumscribedBall—which give (n-dimensional) spheres that, respectively, just fit inside and outside regions you give:

\n
\n
\n

\n

In the past several versions, we’ve added functionality that combines geo computation with computational geometry. Version 13.3 has the beginning of another initiative—introducing abstract spherical geometry:

\n
\n
\n

\n

This works for spheres in any number of dimensions:

\n
\n
\n

\n

In addition to adding functionality, Version 13.3 also brings significant speed enhancements (often 10x or more) to some core operations in 2D computational geometry—making things like computing this fast even though it involves complicated regions:

\n
\n
\n

\n
\n
\n

\n

Visualizations Begin to Come Alive

\n

A great long-term strength of the Wolfram Language has been its ability to produce insightful visualizations in a highly automated way. In Version 13.3 we’re taking this further, by adding automatic “live highlighting”. Here’s a simple example, just using the function Plot. Instead of just producing static curves, Plot now automatically generates a visualization with interactive highlighting:

\n
\n
\n

\n

The same thing works for ListPlot:

\n
\n
\n

\n

The highlighting can, for example, show dates too:

\n
\n
\n

\n

There are many choices for how the highlighting should be done. The simplest thing is just to specify a style in which to highlight whole curves:

\n
\n
\n

\n

But there are many other built-in highlighting specifications. Here, for example, is \"XSlice\":

\n
\n
\n

\n

In the end, though, highlighting is built up from a whole collection of components—like \"NearestPoint\", \"Crosshairs\", \"XDropline\", etc.—that you can assemble and style for yourself:

\n
\n
\n

\n

The option PlotHighlighting defines global highlighting in a plot. But by using the Highlighted “wrapper” you can specify that only a particular element in the plot should be highlighted:

\n
\n
\n

\n

For interactive and exploratory purposes, the kind of automatic highlighting we’ve just been showing is very convenient. But if you’re making a static presentation, you’ll need to “burn in” particular pieces of highlighting—which you can do with Placed:

\n
\n
\n

\n

\n

In indicating elements in a graphic there are different effects one can use. In Version 13.1 we introduced DropShadowing[]. In Version 13.3 we’re introducing Haloing:

\n
\n
\n

\n

Haloing can also be combined with interactive highlighting:

\n
\n
\n

\n

By the way, there are lots of nice effects you can get with Haloing in graphics. Here’s a geo example—including some parameters for the “orientation” and “thickness” of the haloing:

\n
\n
\n

\n

Publishing to Augmented + Virtual Reality

\n

Throughout the history of the Wolfram Language 3D visualization has been an important capability. And we’re always looking for ways to share and communicate 3D geometry. Already back in the early 1990s we had experimental implementations of VR. But at the time there wasn’t anything like the kind of infrastructure for VR that would be needed to make this broadly useful. In the mid-2010s we then introduced VR functionality based on Unity—that provides powerful capabilities within the Unity ecosystem, but is not accessible outside.

\n

Today, however, it seems there are finally broad standards emerging for AR and VR. And so in Version 13.3 we’re able to begin delivering what we hope will provide widely accessible AR and VR deployment from the Wolfram Language.

\n

At a underlying level what we’re doing is to support the USD and GLTF geometry representation formats. But we’re also building a higher-level interface that allows anyone to “publish” 3D geometry for AR and VR.

\n

Given a piece of geometry (which for now can’t involve too many polygons), all you do is apply ARPublish:

\n
\n
\n

\n

The result is a cloud object that has a certain underlying UUID, but is displayed in a notebook as a QR code. Now all you do is look at this QR code with your phone (or tablet, etc.) camera, and press the URL it extracts.

\n

The result will be that the geometry you published with ARPublish now appears in AR on your phone:

\n

Augmented reality triptych

\n

Move your phone and you’ll see that your geometry has been realistically placed into the scene. You can also go to a VR “object” mode in which you can manipulate the geometry on your phone.

\n

“Under the hood” there are some slightly elaborate things going on—particularly in providing the appropriate data to different kinds of phones. But the result is a first step in the process of easily being able to get AR and VR output from the Wolfram Language—deployed in whatever devices support AR and VR.

\n

Getting the Details Right: The Continuing Story

\n

In every version of Wolfram Language we add all sorts of fundamentally new capabilities. But we also work to fill in details of existing capabilities, continually pushing to make them as general, consistent and accurate as possible. In Version 13.3 there are many details that have been “made right”, in many different areas.

\n

Here’s one example: the comparison (and sorting) of Around objects. Here are 10 random “numbers with uncertainty”:

\n
\n
\n

\n

These sort by their central value:

\n
\n
\n

\n

But if we look at these, many of their uncertainty regions overlap:

\n
\n
\n

\n

So when should we consider a particular number-with-uncertainty “greater than” another? In Version 13.3 we carefully take into account uncertainty when making comparisons. So, for example, this gives True:

\n
\n
\n

\n

But when there’s too big an uncertainty in the values, we no longer consider the ordering “certain enough”:

\n
\n
\n

\n

Here’s another example of consistency: the applicability of Duration. We introduced Duration to apply to explicit time constructs, things like Audio objects, etc. But in Version 13.3 it also applies to entities for which there’s a reasonable way to define a “duration”:

\n
\n
\n

\n
\n
\n

\n

Dates (and times) are complicated things—and we’ve put a lot of effort into handling them correctly and consistently in the Wolfram Language. One concept that we introduced a few years ago is date granularity: the (subtle) analog of numerical precision for dates. But at first only some date functions supported granularity; now in Version 13.3 all date functions include a DateGranularity option—so that granularity can consistently be tracked through all date-related operations:

\n
\n
\n

\n

Also in dates, something that’s been added, particularly for astronomy, is the ability to deal with “years” specified by real numbers:

\n
\n
\n

\n

And one consequence of this is that it becomes easier to make a plot of something like astronomical distance as a function of time:

\n
\n
\n

\n

Also in astronomy, we’ve been steadily extending our capabilities to consistently fill in computations for more situations. In Version 13.3, for example, we can now compute sunrise, etc. not just from points on Earth, but from points anywhere in the solar system:

\n
\n
\n

\n

By the way, we’ve also made the computation of sunrise more precise. So now if you ask for the position of the Sun right at sunrise you’ll get a result like this:

\n
\n
\n

\n

How come the altitude of the Sun is not zero at sunrise? That’s because the disk of the Sun is of nonzero size, and “sunrise” is defined to be when any part of the Sun pokes over the horizon.

\n

Even Easier to Type: Affordances for Wolfram Language Input

\n

Back in 1988 when what’s now Wolfram Language first existed, the only way to type it was like ordinary text. But gradually we’ve introduced more and more “affordances” to make it easier and faster to type correct Wolfram Language input. In 1996, with Version 3, we introduced automatic spacing (and spanning) for operators, as well as brackets that flashed when they matched—and things like -> being automatically replaced by . Then in 2007, with Version 6, we introduced—with some trepidation at first—syntax coloring. We’d had a way to request autocompletion of a symbol name all the way back to the beginning, but it’d never been good or efficient enough for us to make it happen all the time as you type. But in 2012, for Version 9, we created a much more elaborate autocomplete system—that was useful and efficient enough that we turned it on for all notebook input. A key feature of this autocomplete system was its context-sensitive knowledge of the Wolfram Language, and how and where different symbols and strings typically appear. Over the past decade, we’ve gradually refined this system to the point where I, for one, deeply rely on it.

\n

In recent versions, we’ve made other “typability” improvements. For example, in Version 12.3, we generalized the -> to transformation to a whole collection of “auto operator renderings”. Then in Version 13.0 we introduced “automatching” of brackets, in which, for example, if you enter [ at the end of what you’re typing, you’ll automatically get a matching ].

\n

Making “typing affordances” work smoothly is a painstaking and tricky business. But in every recent version we’ve steadily been adding more features that—in very “natural” ways—make it easier and faster to type Wolfram Language input.

\n

In Version 13.3 one major change is an enhancement to autocompletion. Instead of just showing pure completions in which characters are appended to what’s already been typed, the autocompletion menu now includes “fuzzy completions” that fill in intermediate characters, change capitalization, etc.

\n

So, for example, if you type “lp” you now get ListPlot as a completion (the little underlines indicate where the letters you actually type appear):

\n

ListPlot autocompletion menu

\n

From a design point of view one thing that’s important about this is that it further removes the “short name” premium—and weights things even further on the side of wanting names that explain themselves when they’re read, rather than that are easy to type in an unassisted way. With the Wolfram Function Repository it’s become increasingly common to want to type ResourceFunction. And we’d been thinking that perhaps we should have a special, short notation for that. But with the new autocompletion, one can operationally just press three keys—rfenterto get to ResourceFunction:

\n

ResourceFunction autocompletion menu

\n

When one designs something and gets the design right, people usually don’t notice; things just “work as they expect”. But when there’s a design error, that’s when people notice—and are frustrated by—the design. But then there’s another case: a situation where, for example, there are two things that could happen, and sometimes one wants one, and sometimes the other. In doing the design, one has to pick a particular branch. And when this happens to be the branch people want, they don’t notice, and they’re happy. But if they want the other branch, it can be confusing and frustrating.

\n

In the design of the Wolfram Language one of the things that has to be chosen is the precedence for every operator: a + b × c means a + (b × c) because × has higher precedence than +. Often the correct order of precedences is fairly obvious. But sometimes it’s simply impossible to make everyone happy all the time. And so it is with and &. It’s very convenient to be able to add & at the end of something you type, and make it into a pure function. But that means if you type a b & it’ll turn the whole thing into a function: a b &. When functions have options, however, one often wants things like name function. The natural tendency is to type this as name body &. But this will mean (name body) & rather than name (body &). And, yes, when you try to run the function, it’ll notice it doesn’t have correct arguments and options specified. But you’d like to know that what you’re typing isn’t right as soon as you type it. And now in Version 13.3 we have a mechanism for that. As soon as you enter & to “end a function”, you’ll see the extent of the function flash:

\n
\n
\n

\n

And, yup, you can see that’s wrong. Which gives you the chance to fix it as:

\n
\n
\n

\n

There’s another notebook-related update in Version 13.3 that isn’t directly related to typing, but will help in the construction of easy-to-navigate user interfaces. We’ve had ActionMenu since 2007—but it’s only been able to create one-level menus. In Version 13.3 it’s been extended to arbitrary hierarchical menus:

\n
\n
\n

\n

Again not directly related to typing, but now relevant to managing and editing code, there’s an update in Version 13.3 to package editing in the notebook interface. Bring up a .wl file and it’ll appear as a notebook. But its default toolbar is different from the usual notebook toolbar (and is newly designed in Version 13.3):

\n

New default toolbar

\n

Go To now gives you a way to immediately go to the definition of any function whose name matches what you type, as well as any section, etc.:

\n

Go To results

\n

The numbers on the right here are code line numbers; you can also go directly to a specific line number by typing :nnn.

\n

The Elegant Code Project

\n

One of the central goals—and achievements—of the Wolfram Language is to create a computational language that can be used not only as a way to tell computers what to do, but also as a way to communicate computational ideas for human consumption. In other words, Wolfram Language is intended not only to be written by humans (for consumption by computers), but also to be read by humans.

\n

Crucial to this is the broad consistency of the Wolfram Language, as well as its use of carefully chosen natural-language-based names for functions, etc. But what can we do to make Wolfram Language as easy and pleasant as possible to read? In the past we’ve balanced our optimization of the appearance of Wolfram Language between reading and writing. But in Version 13.3 we’ve got the beginnings of our Elegant Code project—to find ways to render Wolfram Language to be specifically optimized for reading.

\n

As an example, here’s a small piece of code (from my An Elementary Introduction to the Wolfram Language), shown in the default way it’s rendered in notebooks:

\n
\n
\n

\n

But in Version 13.3 you can use Format > Screen Environment > Elegant to set a notebook to use the current version of “elegant code”:

\n
\n
\n

\n

(And, yes, this is what we’re actually using for code in this post, as well as some other recent ones.) So what’s the difference? First of all, we’re using a proportionally spaced font that makes the names (here of symbols) easy to “read like words”. And second, we’re adding space between these “words”, and graying back “structural elements” like and . When you write a piece of code, things like these structural elements need to stand out enough for you to “see they’re right”. But when you’re reading code, you don’t need to pay as much attention to them. Because the Wolfram Language is so based on “word-like” names, you can typically “understand what it’s saying” just by “reading these words”.

\n

Of course, making code “elegant” is not just a question of formatting; it’s also a question of what’s actually in the code. And, yes, as with writing text, it takes effort to craft code that “expresses itself elegantly”. But the good news is that the Wolfram Language—through its uniquely broad and high-level character—makes it surprisingly straightforward to create code that expresses itself extremely elegantly.

\n

But the point now is to make that code not only elegant in content, but also elegant in formatting. In technical documents it’s common to see math that’s at least formatted elegantly. But when one sees code, more often than not, it looks like something only a machine could appreciate. Of course, if the code is in a traditional programming language, it’ll usually be long and not really intended for human consumption. But what if it’s elegantly crafted Wolfram Language code? Well then we’d like it to look as attractive as text and math. And that’s the point of our Elegant Code project.

\n

There are many tradeoffs, and many issues to be navigated. But in Version 13.3 we’re definitely making progress. Here’s an example that doesn’t have so many “words”, but where the elegant code formatting still makes the “blocking” of the code more obvious:

\n
\n
\n

\n

Here’s a slightly longer piece of code, where again the elegant code formatting helps pull out “readable” words, as well as making the overall structure of the code more obvious:

\n
\n
\n

\n

Particularly in recent years, we’ve added many mechanisms to let one write Wolfram Language that’s easier to read. There are the auto operator renderings, like m[[i]] turning into . And then there are things like the notation for pure functions. One particularly important element is Iconize, which lets you show any piece of Wolfram Language input in a visually “iconized” form—which nevertheless evaluates just like the corresponding underlying expression:

\n
\n
\n

\n

Iconize lets you effectively hide details (like large amounts of data, option settings, etc.) But sometimes you want to highlight things. You can do it with Style, Framed, Highlighted—and in Version 13.3, Squiggled:

\n
\n
\n

\n

By default, all these constructs persist through evaluation. But in Version 13.3 all of them now have the option StripOnInput, and with this set, you have something that shows up highlighted in an input cell, but where the highlighting is stripped when the expression is actually fed to the Wolfram Language kernel.

\n

These show their highlighting in the notebook:

\n
\n
\n

\n

But when used in input, the highlighting is stripped:

\n
\n
\n

\n

See More Also…

\n

A great strength of the Wolfram Language (yes, perhaps initiated by my original 1988 Mathematica Book) is its detailed documentation—which has now proved valuable not only for human users but also for AIs. Plotting the number of words that appear in the documentation in successive versions, we see a strong progressive increase:

\n

Words graph

\n

But with all that documentation, and all those new things to be documented, the problem of appropriately crosslinking everything has increased. Even back in Version 1.0, when the documentation was a physical book, there were “See Also’s” between functions:

\n

Versioni 1.0 documentation

\n

And by now there’s a complicated network of such See Also’s:

\n
\n
\n

\n

But that’s just the network of how functions point to functions. What about other kinds of constructs? Like formats, characters or entity types—or, for that matter, entries in the Wolfram Function Repository, Wolfram Data Repository, etc. Well, in Version 13.3 we’ve done a first iteration of crosslinking all these kinds of things.

\n

So here now are the “See Also” areas for Graph and Molecule:

\n

Graph see also options

\n

Molecule see also options

\n

Not only are there functions here; there are also other kinds of things that a person (or AI) looking at these pages might find relevant.

\n

It’s great to be able to follow links, but sometimes it’s better just to have material immediately accessible, without following a link. Back in Version 1.0 we made the decision that when a function inherits some of its options from a “base function” (say Plot from Graphics), we only need to explicitly list the non-inherited option values. At the time, this was a good way to save a little paper in the printed book. But now the optimization is different, and finally in Version 13.3 we have a way to show “All Options”—tucked away so it doesn’t distract from the typically-more-important non-inherited options.

\n

Here’s the setup for Plot. First, the list of non-inherited option values:

\n

Plot non-inherited option values

\n

Then, at the end of the Details section

\n

Details and options

\n

which opens to:

\n

Expanded list of all options

\n

Pictures from Words: Generative AI for Images

\n

One of the remarkable things that’s emerged as a possibility from recent advances in AI and neural nets is the generation of images from textual descriptions. It’s not yet realistic to do this at all well on anything but a high-end (and typically server) GPU-enabled machine. But in Version 13.3 there’s now a built-in function ImageSynthesize that can get images synthesized, for now through an external API.

\n

You give text, and ImageSynthesize will try to generate images for which that text is a description:

\n
\n
\n

\n

Sometimes these images will be directly useful in their own right, perhaps as “theming images” for documents or user interfaces. Sometimes they will provide raw material that can be developed into icons or other art. And sometimes they are most useful as inputs to tests or other algorithms.

\n

And one of the important things about ImageSynthesize is that it can immediately be used as part of any Wolfram Language workflow. Pick a random sentence from Alice in Wonderland:

\n
\n
\n

\n

Now ImageSynthesize can “illustrate” it:

\n
\n
\n

\n

Or we can get AI to feed AI:

\n
\n
\n

\n
\n
\n

\n

ImageSynthesize is set up to automatically be able to synthesize images of different sizes:

\n
\n
\n

\n

You can take the output of ImageSynthesize and immediately process it:

\n
\n
\n

\n

ImageSynthesize can not only produce complete images, but can also fill in transparent parts of “incomplete” images:

\n
\n
\n

\n

In addition to ImageSynthesize and all its new LLM functionality, Version 13.3 also includes a number of advances in the core machine learning system for Wolfram Language. Probably the most notable are speedups of up to 10x and beyond for neural net training and evaluation on x86-compatible systems, as well as better models for ImageIdentify. There are also a variety of new networks in the Wolfram Neural Net Repository, particularly ones based on transformers.

\n

Digital Twins: Fitting System Models to Data

\n

It’s been five years since we first began to introduce industrial-scale systems engineering capabilities in the Wolfram Language. The goal is to be able to compute with models of engineering and other systems that can be described by (potentially very large) collections of ordinary differential equations and their discrete analogs. Our separate Wolfram System Modeler product provides an IDE and GUI for graphically creating such models.

\n

For the past five years we’ve been able to do high-efficiency simulation of these models from within the Wolfram Language. And over the past few years we’ve been adding all sorts of higher-level functionality for programmatically creating models, and for systematically analyzing their behavior. A major focus in recent versions has been the synthesis of control systems, and various forms of controllers.

\n

Version 13.3 now tackles a different issue, which is the alignment of models with real-world systems. The idea is to have a model which contains certain parameters, and then to determine these parameters by essentially fitting the model’s behavior to observed behavior of a real-world system.

\n

Let’s start by talking about a simple case where our model is just defined by a single ODE:

\n
\n
\n

\n

This ODE is simple enough that we can find its analytical solution:

\n
\n
\n

\n

So now let’s make some “simulated real-world data” assuming a = 2, and with some noise:

\n
\n
\n

\n

Here’s what the data looks like:

\n
\n
\n

\n

Now let’s try to “calibrate” our original model using this data. It’s a process similar to machine learning training. In this case we make an “initial guess” that the parameter a is 1; then when SystemModelCalibrate runs it shows the “loss” decreasing as the correct value of a is found:

\n
\n
\n

\n

The “calibrated” model does indeed have a ≈ 2:

\n
\n
\n

\n

Now we can compare the calibrated model with the data:

\n
\n
\n

\n

As a slightly more realistic engineering-style example let’s look at a model of an electric motor (with both electrical and mechanical parts):

\n
\n
\n

\n

Let’s say we’ve got some data on the behavior of the motor; here we’ve assumed that we’ve measured the angular velocity of a component in the motor as a function of time. Now we can use this data to calibrate parameters of the model (here the resistance of a resistor and the damping constant of a damper):

\n
\n
\n

\n

Here are the fitted parameter values:

\n
\n
\n

\n

And here’s a full plot of the angular velocity data, together with the fitted model and its 95% confidence bands:

\n
\n
\n

\n

SystemModelCalibrate can be used not only in fitting a model to real-world data, but also for example in fitting simpler models to more complicated ones, making possible various forms of “model simplification”.

\n

Symbolic Testing Framework

\n

The Wolfram Language is by many measures one of the world’s most complex pieces of software engineering. And over the decades we’ve developed a large and powerful system for testing and validating it. A decade ago—in Version 10—we began to make some of our internal tools available for anyone writing Wolfram Language code. Now in Version 13.3 we’re introducing a more streamlined—and “symbolic”—version of our testing framework.

\n

The basic idea is that each test is represented by a symbolic TestObject, created using TestCreate:

\n
\n
\n

\n

On its own, TestObject is an inert object. You can run the test it represents using TestEvaluate:

\n
\n
\n

\n

Each test object has a whole collection of properties, some of which only get filled in when the test is run:

\n
\n
\n

\n

It’s very convenient to have symbolic test objects that one can manipulate using standard Wolfram Language functions, say selecting tests with particular features, or generating new tests from old. And when one builds a test suite, one does it just by making a list of test objects.

\n

This makes a list of test objects (and, yes, there’s some trickiness because TestCreate needs to keep unevaluated the expression that’s going to be tested):

\n
\n
\n

\n

But given these tests, we can now generate a report from running them:

\n
\n
\n

\n

TestReport has various options that allow you to monitor and control the running of a test suite. For example, here we’re saying to echo every \"TestEvaluated\" event that occurs:

\n
\n
\n

\n

Did You Get That Math Right?

\n

Most of what the Wolfram Language is about is taking inputs from humans (as well as programs, and now AIs) and computing outputs from them. But a few years ago we started introducing capabilities for having the Wolfram Language ask questions of humans, and then assessing their answers.

\n

In recent versions we’ve been building up sophisticated ways to construct and deploy “quizzes” and other collections of questions. But one of the core issues is always how to determine whether a person has answered a particular question correctly. Sometimes that’s easy to determine. If we ask “What is 2 + 2?”, the answer better be “4” (or conceivably “four”). But what if we ask a question where the answer is some algebraic expression? The issue is that there may be many mathematically equal forms of that expression. And it depends on what exactly one’s asking whether one considers a particular form to be the “right answer” or not.

\n

For example, here we’re computing a derivative:

\n
\n
\n

\n

And here we’re doing a factoring problem:

\n
\n
\n

\n

These two answers are mathematically equal. And they’d both be “reasonable answers” for the derivative if it appeared as a question in a calculus course. But in an algebra course, one wouldn’t want to consider the unfactored form a “correct answer” to the factoring problem, even though it’s “mathematically equal”.

\n

And to deal with these kinds of issues, we’re introducing in Version 13.3 more detailed mathematical assessment functions. With a \"CalculusResult\" assessment function, it’s OK to give the unfactored form:

\n
\n
\n

\n

But with a \"PolynomialResult\" assessment function, the algebraic form of the expression has to be the same for it to be considered “correct”:

\n
\n
\n

\n

There’s also another type of assessment function—\"ArithmeticResult\"—which only allows trivial arithmetic rearrangements, so that it considers 2 + 3 equivalent to 3 + 2, but doesn’t consider 2/3 equivalent to 4/6:

\n
\n
\n

\n

Here’s how you’d build a question with this:

\n
\n
\n

\n

And now if you type “2/3” it’ll say you’ve got it right, but if you type “4/6” it won’t. However, if you use, say, \"CalculusResult\" in the assessment function, it’ll say you got it right even if you type “4/6”.

\n

Streamlining Parallel Computation

\n

Ever since the mid-1990s there’s been the capability to do parallel computation in the Wolfram Language. And certainly for me it’s been critical in a whole range of research projects I’ve done. I currently have 156 cores routinely available in my “home” setup, distributed across 6 machines. It’s sometimes challenging from a system administration point of view to keep all those machines and their networking running as one wants. And one of the things we’ve been doing in recent versions—and now completed in Version 13.3—is to make it easier from within the Wolfram Language to see and manage what’s going on.

\n

It all comes down to specifying the configuration of kernels. And in Version 13.3 that’s now done using symbolic KernelConfiguration objects. Here’s an example of one:

\n
\n
\n

\n

There’s all sorts of information in the kernel configuration object:

\n
\n
\n

\n

It describes “where” a kernel with that configuration will be, how to get to it, and how it should be launched. The kernel might just be local to your machine. Or it might be on a remote machine, accessible through ssh, or https, or our own wstp (Wolfram Symbolic Transport Protocol) or lwg (Lightweight Grid) protocols.

\n

In Version 13.3 there’s now a GUI for setting up kernel configurations:

\n

Kernel configuration editor

\n

The Kernel Configuration Editor lets you enter all the details that are needed, about network connections, authentication, locations of executables, etc.

\n

But once you’ve set up a KernelConfiguration object, that’s all you ever need—for example to say “where” to do a remote evaluation:

\n
\n
\n

\n

ParallelMap and other parallel functions then just work by doing their computations on kernels specified by a list of KernelConfiguration objects. You can set up the list in the Kernels Settings GUI:

\n

Parallel kernels settings

\n

Here’s my personal default collection of parallel kernels:

\n
\n
\n

\n

This now counts the number of individual kernels running on each machine specified by these configurations:

\n
\n
\n

\n

In Version 13.3 a convenient new feature is named collections of kernels. For example, this runs a single “representative” kernel on each distinct machine:

\n
\n
\n

\n

Just Call That C Function! Direct Access to External Libraries

\n

Let’s say you’ve got an external library written in C—or in some other language that can compile to a C-compatible library. In Version 13.3 there’s now foreign function interface (FFI) capability that allows you to directly call any function in the external library just using Wolfram Language code.

\n

Here’s a very trivial C function:

\n

Trivial C function

\n

This function happens to be included in compiled form in the compilerDemoBase library that’s part of Wolfram Language documentation. Given this library, you can use ForeignFunctionLoad to load the library and create a Wolfram Language function that directly calls the C addone function. All you need do is specify the library and C function, and then give the type signature for the function:

\n
\n
\n

\n

Now ff is a Wolfram Language function that calls the C addone function:

\n
\n
\n

\n

The C function addone happens to have a particularly simple type signature, that can immediately be represented in terms of compiler types that have direct analogs as Wolfram Language expressions. But in working with low-level languages, it’s very common to have to deal directly with raw memory, which is something that never happens when you’re purely working at the Wolfram Language level.

\n

So, for example, in the OpenSSL library there’s a function called RAND_bytes, whose C type signature is:

\n

RAND_bytes

\n

And the important thing to notice is that this contains a pointer to a buffer buf that gets filled by RAND_bytes. If you were calling RAND_bytes from C, you’d first allocate memory for this buffer, then—after calling RAND_bytes—read back whatever was written to the buffer. So how can you do something analogous when you’re calling RAND_bytes using ForeignFunction in Wolfram Language? In Version 13.3 we’re introducing a family of constructs for working with pointers and raw memory.

\n

So, for example, here’s how we can create a Wolfram Language foreign function corresponding to RAND_bytes:

\n
\n
\n

\n

But to actually use this, we need to be able to allocate the buffer, which in Version 13.3 we can do with RawMemoryAllocate:

\n
\n
\n

\n

This creates a buffer that can store 10 unsigned chars. Now we can call rb, giving it this buffer:

\n
\n
\n

\n

rb will fill the buffer—and then we can import the results back into Wolfram Language:

\n
\n
\n

\n

There’s some complicated stuff going on here. RawMemoryAllocate does ultimately allocate raw memory—and you can see its hex address in the symbolic object that’s returned. But RawMemoryAllocate creates a ManagedObject, which keeps track of whether it’s being referenced, and automatically frees the memory that’s been allocated when nothing references it anymore.

\n

Long ago languages like BASIC provided PEEK and POKE functions for reading and writing raw memory. It was always a dangerous thing to do—and it’s still dangerous. But it’s somewhat higher level in Wolfram Language, where in Version 13.3 there are now functions like RawMemoryRead and RawMemoryWrite. (For writing data into a buffer, RawMemoryExport is also relevant.)

\n

Most of the time it’s very convenient to deal with memory-managed ManagedObject constructs. But for the full low-level experience, Version 13.3 provides UnmanageObject, which disconnects automatic memory management for a managed object, and requires you to explicitly use RawMemoryFree to free it.

\n

One feature of C-like languages is the concept of a function pointer. And normally the function that the pointer is pointing to is just something like a C function. But in Version 13.3 there’s another possibility: it can be a function defined in Wolfram Language. Or, in other words, from within an external C function it’s possible to call back into the Wolfram Language.

\n

Let’s use this C program:

\n

C program

\n

You can actually compile it right from Wolfram Language using:

\n
\n
\n

\n

Now we load frun as a foreign function—with a type signature that uses \"OpaqueRawPointer\" to represent the function pointer:

\n
\n
\n

\n

What we need next is to create a function pointer that points to a callback to Wolfram Language:

\n
\n
\n

\n

The Wolfram Language function here is just Echo. But when we call frun with the cbfun function pointer we can see our C code calling back into Wolfram Language to evaluate Echo:

\n
\n
\n

\n

ForeignFunctionLoad provides an extremely convenient way to call external C-like functions directly from top-level Wolfram Language. But if you’re calling C-like functions a great many times, you’ll sometimes want to do it using compiled Wolfram Language code. And you can do this using the LibraryFunctionDeclaration mechanism that was introduced in Version 13.1. It’ll be more complicated to set up, and it’ll require an explicit compilation step, but there’ll be slightly less “overhead” in calling the external functions.

\n

The Advance of the Compiler Continues

\n

For several years we’ve had an ambitious project to develop a large-scale compiler for the Wolfram Language. And in each successive version we’re further extending and enhancing the compiler. In Version 13.3 we’ve managed to compile more of the compiler itself (which, needless to say, is written in Wolfram Language)—thereby making the compiler more efficient in compiling code. We’ve also enhanced the performance of the code generated by the compiler—particularly by optimizing memory management done in the compiled code.

\n

Over the past several versions we’ve been steadily making it possible to compile more and more of the Wolfram Language. But it’ll never make sense to compile everything—and in Version 13.3 we’re adding KernelEvaluate to make it more convenient to call back from compiled code to the Wolfram Language kernel.

\n

Here’s an example:

\n
\n
\n

\n

We’ve got an argument n that’s declared as being of type MachineInteger. Then we’re doing a computation on n in the kernel, and using TypeHint to specify that its result will be of type MachineInteger. There’s at least arithmetic going on outside the KernelEvaluate that can be compiled, even though the KernelEvaluate is just calling uncompiled code:

\n
\n
\n

\n

There are other enhancements to the compiler in Version 13.3 as well. For example, Cast now allows data types to be cast in a way that directly emulates what the C language does. There’s also now SequenceType, which is a type analogous to the Wolfram Language Sequence construct—and able to represent an arbitrary-length sequence of arguments to a function.

\n

And Much More…

\n

In addition to everything we’ve already discussed here, there are lots of other updates and enhancements in Version 13.3—as well as thousands of bug fixes.

\n

Some of the additions fill out corners of functionality, adding completeness or consistency. Statistical fitting functions like LinearModelFit now accept input in all various association etc. forms that machine learning functions like Classify accept. TourVideo now lets you “tour” GeoGraphics, with waypoints specified by geo positions. ByteArray now supports the “corner case” of zero-length byte arrays. The compiler can now handle byte array functions, and additional string functions. Nearly 40 additional special functions can now handle numeric interval computations. BarcodeImage adds support for UPCE and Code93 barcodes. SolidMechanicsPDEComponent adds support for the Yeoh hyperelastic model. And—twenty years after we first introduced export of SVG, there’s now built-in support for import of SVG not only to raster graphics, but also to vector graphics.

\n

There are new “utility” functions like RealValuedNumberQ and RealValuedNumericQ. There’s a new function FindImageShapes that begins the process of systematically finding geometrical forms in images. There are a number of new data structures—like \"SortedKeyStore\" and \"CuckooFilter\".

\n

There are also functions whose algorithms—and output—have been improved. ImageSaliencyFilter now uses new machine-learning-based methods. RSolveValue gives cleaner and smaller results for the important case of linear difference equations with constant coefficients.

\n

\n

\n\n

\n", - "category": "Mathematica", - "link": "https://writings.stephenwolfram.com/2023/06/llm-tech-and-a-lot-more-version-13-3-of-wolfram-language-and-mathematica/", - "creator": "Stephen Wolfram", - "pubDate": "Wed, 28 Jun 2023 18:02:59 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "en", - "folder": "", - "feed": "wolfram", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "01c17fc689829b984c851232821521e3", - "highlights": [] - }, { "title": "Introducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm", "description": "\"\"This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm A New […]", @@ -197,28 +351,6 @@ "hash": "a976f2a02784da5470b3d8edb1a5ebaa", "highlights": [] }, - { - "title": "Prompts for Work & Play: Launching the Wolfram Prompt Repository", - "description": "\"\"This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm Building Blocks […]", - "content": "\"\"\n

This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm

\n

\"Prompts

\n

Building Blocks of “LLM Programming”

\n

Prompts are how one channels an LLM to do something. LLMs in a sense always have lots of “latent capability” (e.g. from their training on billions of webpages). But prompts—in a way that’s still scientifically mysterious—are what let one “engineer” what part of that capability to bring out.

\n
\n

The functionality described here will be built into the upcoming version of Wolfram Language (Version 13.3). To install it in the now-current version (Version 13.2), use

\n
PacletInstall[\"Wolfram/Chatbook\"]
\n

and

\n
PacletInstall[\"Wolfram/LLMFunctions\"].
\n

You will also need an API key for the OpenAI LLM or another LLM.

\n
\n

There are many different ways to use prompts. One can use them, for example, to tell an LLM to “adopt a particular persona”. One can use them to effectively get the LLM to “apply a certain function” to its input. And one can use them to get the LLM to frame its output in a particular way, or to call out to tools in a certain way.

\n

And much as functions are the building blocks for computational programming—say in the Wolfram Language—so prompts are the building blocks for “LLM programming”. And—much like functions—there are prompts that correspond to “lumps of functionality” that one can expect will be repeatedly used.

\n

Today we’re launching the Wolfram Prompt Repository to provide a curated collection of useful community-contributed prompts—set up to be seamlessly accessible both interactively in Chat Notebooks and programmatically in things like LLMFunction:

\n

Wolfram Prompt Repository home page

\n

As a first example, let’s talk about the "Yoda" prompt, that’s listed as a “persona prompt”. Here’s its page:

\n

Wolfram Prompt Repository Yoda persona

\n

So how do we use this prompt? If we’re using a Chat Notebook (say obtained from File > New > Chat-Driven Notebook) then just typing @Yoda will “invoke” the Yoda persona:

\n

Should I eat a piece of chocolate now?

\n

At a programmatic level, one can “invoke the persona” through LLMPrompt (the result is different because there’s by default randomness involved):

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t

\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

There are several initial categories of prompts in the Prompt Repository:

\n

\n

There’s a certain amount of crossover between these categories (and there’ll be more categories in the future—particularly related to generating computable results, and calling computational tools). But there are different ways to use prompts in different categories.

\n

Function prompts are all about taking existing text, and transforming it in some way. We can do this programmatically using LLMResourceFunction:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

We can also do it in a Chat Notebook using !ActiveVoiceRephrase, with the shorthand ^ to refer to text in the cell above, and > to refer to text in the current chat cell:

\n

The AI was switched off by him.

\n

Modifier prompts have to do with specifying how to modify output coming from the LLM. In this case, the LLM typically produces a whole mini-essay:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t

\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

But with the YesNo modifier prompt, it simply says “Yes”:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

In a Chat Notebook, you can introduce a modifier prompt using #:

\n

Is a watermelon bigger than a human head?

\n

Quite often you’ll want several modifier prompts:

\n

Is a watermelon bigger than a human head?

\n

What Does Having a Prompt Repository Do for One?

\n

LLMs are powerful things. And one might wonder why, if one has a description for a prompt, one can’t just use that description directly, rather than having to store a prewritten prompt. Well, sometimes just using the description will indeed work fine. But often it won’t. Sometimes that’s because one needs to clarify further what one wants. Sometimes it’s because there are not-immediately-obvious corner cases to cover. And sometimes there’s just a certain amount of “LLM wrangling” to be done. And this all adds up to the need to do at least some “prompt engineering” on almost any prompt.

\n

The YesNo modifier prompt from above is currently fairly simple:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

But it’s still already complicated enough one that doesn’t want to have to repeat it every time one’s trying to force a yes/no answer. And no doubt there’ll be subsequent versions of this prompt (that, yes, will have versioning handled seamlessly by the Prompt Repository) that will get increasingly elaborate, as more cases show up, and more prompt engineering gets done to address them.

\n

Many of the prompts in the Prompt Repository even now are considerably more complicated. Some contain typical “general prompt engineering”, but others contain for example special information that the LLM doesn’t intrinsically know, or detailed examples that home in on what one wants to have happen.

\n

In the simplest cases, prompts (like the YesNo one above) are just plain pieces of text. But often they contain parameters, or have additional computational or other content. And a key feature of the Wolfram Prompt Repository is that it can handle this ancillary material, ultimately by representing everything using Wolfram Language symbolic expressions.

\n

As we discussed in connection with LLMFunction, etc. in another post, the core “textual” part of a prompt is represented by a symbolic StringTemplate that immediately allows positional or named parameters. Then there can be an interpreter that applies a Wolfram Language Interpreter function to the raw textual output of the LLM—transforming it from plain text to a computable symbolic expression. More sophisticatedly, there can also be specifications of tools that the LLM can call (represented symbolically as LLMTool constructs), as well as other information about the required LLM configuration (represented by an LLMConfiguration object). But the key point is that all of this is automatically “packaged up” in the Prompt Repository.

\n

But what actually is the Wolfram Prompt Repository? Well, ultimately it’s just part of the general Wolfram Resource System—the same one that’s used for the Wolfram Function Repository, Wolfram Data Repository, Wolfram Neural Net Repository, Wolfram Notebook Archive, and many other things.

\n

And so, for example, the "Yoda" prompt is in the end represented by a symbolic ResourceObject that’s part of the Resource System:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

Open up the display of this resource object, and we’ll immediately see various pieces of metadata (and a link to documentation), as well as the ultimate canonical UUID of the object:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

Everything that needs to use the prompt—Chat Notebooks, LLMPrompt, LLMResourceFunction, etc.—just works by accessing appropriate parts of the ResourceObject, so that for example the “hero image” (used for the persona icon) is retrieved like this:

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

There’s a lot of important infrastructure that “comes for free” from the general Wolfram Resource System—like efficient caching, automatic updating, documentation access, etc. And things like LLMPrompt follow the exact same approach as things like NetModel in being able to immediately reference entries in a repository.

\n

What’s in the Prompt Repository So Far

\n

We haven’t been working on the Wolfram Prompt Repository for very long, and we’re just opening it up for outside contributions now. But already the Repository contains (as of today) about two hundred prompts. So what are they so far? Well, it’s a range. From “just for fun”, to very practical, useful and sometimes quite technical.

\n

In the “just for fun” category, there are all sorts of personas, including:

\n

In a sentence or two, what are you good for?

\n

In a sentence or two, what are you good for?

\n

In a sentence or two, what are you good for?

\n

In a sentence or two, what are you good for?

\n

In a sentence or two, what are you good for?

\n

There are also slightly more “practical” personas—like SupportiveFriend and SportsCoach too—which can be more helpful sometimes than others:

\n

I'm a bit tired of writing all these posts.

\n

Then there are “functional” ones like NutritionistBot, etc.—though most of these are still very much under development, and will advance considerably when they are hooked up to tools, so they’re able to access accurate computable knowledge, external data, etc.

\n

But the largest category of prompts so far in the Prompt Repository are function prompts: prompts which take text you supply, and do operations on it. Some are based on straightforward (at least for an LLM) text transformations:

\n

There are many prompts available.

\n

AIs are cool.

\n

!ShorterRephrase

\n

I hope you can come to my party.

\n

There are all sorts of text transformations that can be useful:

\n

Stephen Wolfram lives in Concord, MA

\n

A curated collection of prompts, personas, functions, & more for LLMs

\n

Some function prompts—like Summarize, TLDR, NarrativeToResume, etc.—can be very useful in making text easier to assimilate. And the same is true of things like LegalDejargonize, MedicalDejargonize, ScientificDejargonize, BizDejargonize—or, depending on your background, the *Jargonize versions of these:

\n

The rat ignored the maze and decided to eat the cheese

\n

Some text transformation prompts seem to perhaps make use of a little more “cultural awareness” on the part of the LLM:

\n

WOLFRAM PROMPT REPOSITORY (UNDER CONSTRUCTION)

\n

WOLFRAM PROMPT REPOSITORY (UNDER CONSTRUCTION)

\n

AIs provide excellent programming advice.

\n

An app to let cats interact with chatbots

\n

A dinosaur that can roll itself up in a ball

\n

Some function prompts are for analyzing text (or, for example, for doing educational assessments):

\n

I woz going to them place when I want stop

\n

I believe plants should be the only organisms on the planet

\n

Sometimes prompts are most useful when they’re applied programmatically. Here are two synthesized sentences:

\n

\n\n\n\n\n\n\n
\n
\n\n\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

Now we can use the DocumentCompare prompt to compare them (something that might, for example, be useful in regression testing):

\n

\n\n\n\n\n\n\n
\n
\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n
\n\t\t\t\t\t&#10005

\n
\n

\n
\n

\n

There are other kinds of “text analysis” prompts, like GlossaryGenerate, CharacterList (characters mentioned in a piece of fiction) and LOCTopicSuggest (Library of Congress book topics):

\n

What is ChatGPT Doing and Why Does It Work?

\n

There are lots of other function prompts already in the Prompt Repository. Some—like FilenameSuggest and CodeImport—are aimed at doing computational tasks. Others make use of common-sense knowledge. And some are just fun. But, yes, writing good prompts is hard—and what’s in the Prompt Repository will gradually improve. And when there are bugs, they can be pretty weird. Like PunAbout is supposed to generate a pun about some topic, but here it decides to protest and say it must generate three:

\n

Parrot

\n

The final category of prompts currently in the Prompt Repository are modifier prompts, intended as a way to modify the output generated by the LLM. Sometimes modifier prompts can be essentially textual:

\n

How many legs does a spider have?

\n

How many legs does a spider have?

\n

How many legs does a spider have?

\n

But often modifier prompts are intended to create output in a particular form, suitable, for example, for interpretation by an interpreter in LLMFunction, etc.:

\n

How many legs does a spider have?

\n

Number of legs for the 5 common invertebrates

\n

Are AIs good?

\n

So far the modifier prompts in the Prompt Repository are fairly simple. But once there are prompts that make use of tools (i.e. call back into Wolfram Language during the generation process) we can expect modifier prompts that are much more sophisticated, useful and robust.

\n

Adding Your Own Prompts

\n

The Wolfram Prompt Repository is set up to be a curated public collection of prompts where it’s easy for anyone to submit a new prompt. But—as we’ll explain—you can also use the framework of the Prompt Repository to store “private” prompts, or share them with specific groups.

\n

So how do you define a new prompt in the Prompt Repository framework? The easiest way is to fill out a Prompt Resource Definition Notebook:

\n

Prompt Resource Definition Notebook

\n

You can get this notebook here, or from the Submit a Prompt button at the top of the Prompt Repository website, or by evaluating CreateNotebook[\"PromptResource\"].

\n

The setup is directly analogous to the ones for the Wolfram Function Repository, Wolfram Data Repository, Wolfram Neural Net Repository, etc. And once you’ve filled out the Definition Notebook, you’ve got various choices:

\n

Definition Notebook deployment options

\n

Submit to Repository sends the prompt to our curation team for our official Wolfram Prompt Repository; Deploy deploys it for your own use, and for people (or AIs) you choose to share it with. If you’re using the prompt “privately”, you can refer to it using its URI or other identifier (if you use ResourceRegister you can also just refer to it by the name you give it).

\n

OK, so what do you need to specify in the Definition Notebook? The most important part is the actual prompt itself. And quite often the prompt may just be a (carefully crafted) piece of plain text. But ultimately—as discussed elsewhere—a prompt is a symbolic template, that can include parameters. And you can insert parameters into a prompt using “template slots”:

\n

Template slots

\n

(Template Expression lets you insert Wolfram Language code that will be evaluated when the prompt is applied—so you can for example include the current time with Now.)

\n

In simple cases, all you’ll need to specify is the “pure prompt”. But in more sophisticated cases you’ll also want to specify some “outside the prompt” information—and there are some sections for this in the Definition Notebook:

\n

Definition Notebook sections

\n

Chat-Related Features is most relevant for personas:

\n

Chat features

\n

You can give an icon that will appear in Chat Notebooks for that persona. And then you can give Wolfram Language functions which are to be applied to the contents of each chat cell before it is fed to the LLM (“Cell Processing Function”), and to the output generated by the LLM (“Cell Post Evaluation Function”). These functions are useful in transforming material to and from the plain text consumed by the LLM, and supporting richer display and computational structures.

\n

Programmatic Features is particularly relevant for function prompts, and for the way prompts are used in LLMResourceFunction etc.:

\n

Programmatic Features

\n

There’s “function-oriented documentation” (analogous to what’s used for built-in Wolfram Language functions, or for functions in the Wolfram Function Repository). And then there’s the Output Interpreter: a function to be applied to the textual output of the LLM, to generate the actual expression that will be returned by LLMResourceFunction, or for formatting in a Chat Notebook.

\n

What about the LLM Configuration section?

\n

LLM configuration options

\n

The first thing it does is to define tools that can be requested by the LLM when this prompt is used. We’ll discuss tools in another post. But as we’ve mentioned several times, they’re a way of having the LLM call Wolfram Language to get particular computational results that are then returned to the LLM. The other part of the LLM Configuration section is a more general LLMConfiguration specification, which can include “temperature” settings, the requirement of using a particular underlying model (e.g. GPT-4), etc.

\n

What else is in the Definition Notebook? There are two main documentation sections: one for Chat Examples, and one for Programmatic Examples. Then there are various kinds of metadata.

\n

Of course, at the very top of the Definition Notebook there’s another very important thing: the name you specify for the prompt. And here—with the initial prompts we’ve put into the Prompt Repository—we’ve started to develop some conventions. Following typical Wolfram Language usage we’re “camel-casing” names (so it’s "TitleSuggest" not "title suggest"). Then we try to use different grammatical forms for different kinds of prompts. For personas we try to use noun phrases (like "Cheerleader" or "SommelierBot"). For functions we usually try to use verb phrases (like "Summarize" or "HypeUp"). And for modifiers we try to use past-tense verb forms (like "Translated" or "HaikuStyled").

\n

The overall goal with prompt names—like with ordinary Wolfram Language function names—is to provide a summary of what the prompt does, in a form that’s short enough that it appears a bit like a word in computational language input, chats, etc.

\n

OK, so let’s say you’ve filled out a Definition Notebook, and you Deploy it. You’ll get a webpage that includes the documentation you’ve given—and looks pretty much like any of the pages in the Wolfram Prompt Repository. And now if you want to use the prompt, you can just click the appropriate place on the webpage, and you’ll get a copyable version that you can immediately paste into an input cell, a chat cell, etc. (Within a Chat Notebook there’s an even more direct mechanism: in the chat icon menu, go to Add & Manage Personas, and when you browse the Prompt Repository, there’ll be an Install button that will automatically install a persona.)

\n

A Language of Prompts

\n

LLMs fundamentally deal with natural language of the kind we humans normally use. But when we set up a named prompt we’re in a sense defining a “higher-level word” that can be used to “communicate” with the LLM—at the least with the kind of “harness” that LLMFunction, Chat Notebooks, etc. provide. And we can then imagine in effect “talking in prompts” and for example building up more and more levels of prompts.

\n

Of course, we already have a major example of something that at least in outline is similar: the way in which over the past few decades we’ve been able to progressively construct a whole tower of functionality from the built-in functions in the Wolfram Language. There’s an important difference, however: in defining built-in functions we’re always working on “solid ground”, with precise (carefully designed) computational specifications for what we’re doing. In setting up prompts for an LLM, try as we might to “write the prompts well” we’re in a sense ultimately “at the mercy of the LLM” and how it chooses to handle things.

\n

It feels in some ways like the difference between dealing with engineering systems and with human organizations. In both cases one can set up plans and procedures for what should happen. In the engineering case, however, one can expect that (at least at the level of individual operations) the system will do exactly as one says. In the human case—well, all kinds of things can happen. That is not to say that amazing results can’t be achieved by human organizations; history clearly shows they can.

\n

But—as someone who’s managed (human) organizations now for more than four decades—I think I can say the “rhythm” and practices of dealing with human organizations differ in significant ways from those for technological ones. There’s still a definite pattern of what to do, but it’s different, with a different way of going back and forth to get results, different approaches to “debugging”, etc.

\n

How will it work with prompts? It’s something we still need to get used to. But for me there’s immediately another useful “comparable”. Back in the early 2000s we’d had a decade or two of experience in developing what’s now Wolfram Language, with its precise formal specifications, carefully designed with consistency in mind. But then we started working on Wolfram|Alpha—where now we wanted a system that would just deal with whatever input someone might provide. At first it was jarring. How could we develop any kind of manageable system based on boatloads of potentially incompatible heuristics? It took a little while, but eventually we realized that when everything is a heuristic there’s a certain pattern and structure to that. And over time the development we do has become progressively more systematic.

\n

And so, I expect, it will be with prompts. In the Wolfram Prompt Repository today, we have a collection of prompts that cover a variety of areas, but are almost all “first level”, in the sense that they depend only on the base LLM, and not on other prompts. But over time I expect there’ll be whole hierarchies of prompts that develop (including metaprompts for building prompts, etc. ) And indeed I won’t be surprised if in this way all sorts of “repeatable lumps of functionality” are found, that actually can be implemented in a direct computational way, without depending on LLMs. (And, yes, this may well go through the kind of “semantic grammar” structure that I’ve discussed elsewhere.)

\n

But as of now, we’re still just at the point of first launching the Wolfram Prompt Repository, and beginning the process of understanding the range of things—both useful and fun—that can be achieved with prompts. But it’s already clear that there’s going to be a very interesting world of prompts—and a progressive development of “prompt language” that in some ways will probably parallel (though at a considerably faster rate) the historical development of ordinary human languages.

\n

It’s going to be a community effort—just as it is with ordinary human languages—to explore and build out “prompt language”. And now that it’s launched, I’m excited to see how people will use our Prompt Repository, and just what remarkable things end up being possible through it.

\n", - "category": "Artificial Intelligence", - "link": "https://writings.stephenwolfram.com/2023/06/prompts-for-work-play-launching-the-wolfram-prompt-repository/", - "creator": "Stephen Wolfram", - "pubDate": "Thu, 08 Jun 2023 01:54:36 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "en", - "folder": "", - "feed": "wolfram", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "97c48c180c49516491bb916a04be7cd1", - "highlights": [] - }, { "title": "The New World of LLM Functions: Integrating LLM Technology into the Wolfram Language", "description": "\"\"This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm Turning LLM […]", @@ -241,28 +373,6 @@ "hash": "07eec75c985bfd334361e158a14dfe08", "highlights": [] }, - { - "title": "Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit", - "description": "\"\"This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm", - "content": "\"\"\n

This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram Prompt RepositoryIntroducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm

\n

\"Instant

\n

Build a New Plugin in under a Minute…

\n

A few weeks ago, in collaboration with OpenAI, we released the Wolfram plugin for ChatGPT, which lets ChatGPT use Wolfram Language and Wolfram|Alpha as tools, automatically called from within ChatGPT. One can think of this as adding broad “computational superpowers” to ChatGPT, giving access to all the general computational capabilities and computational knowledge in Wolfram Language and Wolfram|Alpha.

\n

But what if you want to make your own special plugin, that does specific computations, or has access to data or services that are for example available only on your own computer or computer system? Well, today we’re releasing a first version of a kit for doing that. And building on our whole Wolfram Language tech stack, we’ve managed to make the whole process extremely easy—to the point where it’s now realistic to deploy at least a basic custom ChatGPT plugin in under a minute.

\n

There’s some (very straightforward) one-time setup you need—authenticating with OpenAI, and installing the Plugin Kit. But then you’re off and running, and ready to create your first plugin.

\n
\n

To run the examples here for yourself you’ll need:

\n\n
\n

Here’s a very simple example. Let’s say you make up the idea of a “strength” for a word, defining it to be the sum of the “letter numbers” (“a” is 1, “b” is 2, etc.). In Wolfram Language you can compute this as:

\n
\n
\n

\n

And for over a decade it’s been standard that you can instantly deploy such a computation as a web API in the Wolfram Cloud—immediately accessible through a web browser, external program, etc.:

\n
\n
\n

\n

But today there’s a new form of deployment: as a plugin for ChatGPT. First, you say you need the Plugin Kit:

\n
\n
\n

\n

Then you can immediately deploy your plugin. All it takes is:

\n
\n
\n

\n

The final step is that you have to tell ChatGPT about your plugin. Within the web interface (as it’s currently configured), select Plugins > Plugin store > Develop your own plugin and insert the URL from the ChatGPTPluginDeployment (which you get by pressing the click-to-copy button ) into the dialog you get:

\n

ChatGPT plugin dialog

\n

Now everything’s ready. And you can start talking to ChatGPT about “word strengths”, and it’ll call your plugin (which by default is called “WolframCustom”) to compute them:

\n
\n
\n

\n

Looking “inside the box” shows the communication ChatGPT had with the plugin:

\n
\n
\n

\n

Without the plugin it won’t know what “letter strength” is. But with the plugin, it’ll be able to do all kinds of (rather remarkable) things with it—like this:

\n
\n
\n

\n

The embellishment about properties of gnus is charming, but if one opens the boxes one can see how it got its answer—it just started trying different animals (“lion”, “zebra”, “gnu”):

\n
\n
\n

\n

Software engineers will immediately notice that the plugin we’ve set up is running against localhost, i.e. it’s executing on your own computer. As we’ll discuss, this is often an incredibly useful thing to be able to do. But you can also use the Plugin Kit to create plugins that execute purely in the Wolfram Cloud (so that, for example, you don’t have to have a Wolfram Engine available on your computer).

\n

All you do is use ChatGPTPluginCloudDeploy—then you get a URL in the Wolfram Cloud that you can tell ChatGPT as the location of your plugin:

\n
\n
\n

\n

And in fact you can do the whole setup directly in your web browser, without any local Wolfram installation. You just open a notebook in the Wolfram Cloud, and deploy your plugin from there:

\n

Wolfram Cloud notebook

\n

Let’s do some other examples. For our next example, let’s invent the concept of a “geo influence disk” and then deploy a plugin that renders such a thing (we’ll talk later about some details of what’s being done here):

\n
\n
\n

\n

Now we can install this new plugin—and then start asking ChatGPT about “geo influence disks”:

\n
\n
\n

\n

ChatGPT successfully calls the plugin, and brings back an image. Somewhat amusingly, it guesses (correctly, as it happens) what a “geo influence disk” is supposed to be. And remember, it can’t see the picture or read the code, so its guess has to be based only on the name of the API function and the question one asks. Of course, it has to effectively understand at least a bit in order to work out how to call the API function—and that x is supposed to be a location, and radius a distance.

\n

As another example, let’s make a plugin that sends the user (i.e. the person who deploys the plugin) a text message:

\n
\n
\n

\n

Now just say “send me a message”

\n
\n
\n

\n

and a text message will arrive—in this case with a little embellishment from ChatGPT:

\n

Rhinoceros alert

\n

Here’s a plugin that also sends an “alert picture” of an animal that’s mentioned:

\n
\n
\n

\n

And, yes, there’s a lot of technology that needs to work to get this to happen:

\n
\n
\n

\n

Gnu alert

\n

As another example, let’s make a plugin that retrieves personal data of mine—here heart rate data that I’ve been accumulating for several years in a Wolfram databin:

\n
\n
\n

\n

Now we can use ChatGPT to ask questions about this data:

\n
\n
\n

\n

And with the main Wolfram plugin also installed, we can immediately do actual computations on this data, all through ChatGPT’s “linguistic user interface”:

\n
\n
\n

\n

This example uses the Wolfram Data Drop system. But one can do very much the same kind of thing with something like an SQL database. And if one has a plugin set up to access a private database there are truly remarkable things that can be done through ChatGPT with the Wolfram plugin.

\n

Plugins That Control Your Own Computer

\n

When you use ChatGPT through its standard web interface, ChatGPT is running “in the cloud”—on OpenAI’s servers. But with plugins you can “reach back”—through your web browser—to make things happen on your own, local computer. We’ll talk later about how this works “under the hood”, but suffice it to say now that when you deploy a plugin using ChatGPTPluginDeploy (as opposed to ChatGPTPluginCloudDeploy) the actual Wolfram Language code in the plugin will be run on your local computer. So that means it can get access to local resources on your computer, like your camera, speakers, files, etc.

\n

For example, here I’m setting up a plugin to take a picture with my computer’s camera (using the Wolfram Language CurrentImage[ ])—and then blend the picture with whatever color I specify (we’ll talk about the use of CloudExport later):

\n
\n
\n

\n

Installing the plugin, I then say to ChatGPT “Just picture me in green!”, and, right then and there, ChatGPT will call the plugin, which gets my computer to take a picture of me—and then blends it with green (complete with my “I wonder if this is going to work” look):

\n
\n
\n

\n

OK let’s try a slightly more sophisticated example. Here we’re going to make a plugin to get ChatGPT to put up a notebook on my computer, and start writing content into it. To achieve this, we’re going to define several API endpoints (and we’ll name the whole plugin \"NotebookOperations\"):

\n
\n
\n

\n

First, let’s tell ChatGPT to create a new notebook

\n
\n
\n

\n

and up pops a new notebook on my screen:

\n

My cat notebook

\n

If we look at the symbol nb in the Wolfram Language session from which we deployed the plugin, we’ll find out that it was set by the API:

\n
\n
\n

\n

Now let’s use some of our other API endpoints to add content to the notebook:

\n
\n
\n

\n

Here’s what we get:

\n

Cat pictures

\n

The text was made up by ChatGPT; the pictures came from doing a web image search. (We could also have used the new ImageSynthesize[ ] function in the Wolfram Language to make de novo cats.)

\n

And as a final “bow”, let’s ask ChatGPT to show us an image of the notebook captured from our computer screen with CurrentNotebookImage:

\n
\n
\n

\n

We could also add another endpoint to publish the notebook to the cloud using CloudPublish, and maybe to send the URL in an email.

\n

We could think of the previous example as accumulating results in a notebook. But we can also just accumulate results in the value of a Wolfram Language symbol. Here we initialize the symbol result to be an empty list. Then we define an API that appends to this list, but we give a prompt that says to only do this appending when we have a single-word result:

\n
\n
\n

\n

Let’s set up an “exercise” for ChatGPT:

\n
\n
\n

\n

At this point, result is still empty:

\n
\n
\n

\n

Now let’s ask our first question:

\n
\n
\n

\n

ChatGPT doesn’t happen to directly show us the answer. But it calls our API and appends it to result:

\n
\n
\n

\n

Let’s ask another question:

\n
\n
\n

\n

Now result contains both answers:

\n
\n
\n

\n

And if we put Dynamic[result] in our notebook, we’d see this dynamically change whenever ChatGPT calls the API.

\n

In the last example, we modified the value of a symbol from within ChatGPT. And if we felt brave, we could just let ChatGPT evaluate arbitrary code on our computer, for example using an API that calls ToExpression. But, yes, giving ChatGPT the ability to execute arbitrary code of its own making does seem to open us up to a certain “Skynet risk” (and makes us wonder all the more about “AI constitutions” and the like).

\n

But much more safely than executing arbitrary code, we can imagine letting ChatGPT effectively “root around” in our filesystem. Let’s set up the following plugin:

\n
\n
\n

\n

First we set a directory that we want to operate in:

\n
\n
\n

\n

Now let’s ask ChatGPT about the files there:

\n
\n
\n

\n

With the Wolfram plugin we can get it to make a pie chart of those file types:

\n
\n
\n

\n

Now we ask it to do something very “LLM-ey”, and to summarize the contents of each file (in the API we used Import to import plaintext versions of files):

\n
\n
\n

\n

There are all sorts of things one can do. Here’s a plugin to compute ping times from your computer:

\n
\n
\n

\n
\n
\n

\n

Or, as another example, you can set up a plugin that will create scheduled tasks to provide email (or text, etc.) reminders at specified times:

\n
\n
\n

\n

ChatGPT dutifully queues up the tasks:

\n
\n
\n

\n

Then every 10 seconds or so, into my mailbox pops a (perhaps questionable) animal joke:

\n

Animal jokes

\n

As a final example, let’s consider the local-to-my-computer task of audibly playing a tune. First we’ll need a plugin that can decode notes and play them (the \"ChatGPTPluginDeploy\" is there to tell ChatGPT the plugin did its job—because ChatGPT has no way to know that by itself):

\n
\n
\n

\n

Here we give ChatGPT the notes we want—and, yes, this immediately plays the tune on my computer:

\n

\n
\n \n

\n

And now—as homage to a famous fictional AI—let’s try to play another tune:

\n

\n
\n \n

\n

And, yes, ChatGPT has come up with some notes, and packaged them up for the plugin; then the plugin played them:

\n

\n
\n \n

\n

And this works too:

\n

\n
\n \n

\n

But… wait a minute! What’s that tune? It seems ChatGPT can’t yet quite make the same (dubious) claim HAL does:

\n

“No [HAL] 9000 computer has ever made a mistake or distorted information. We are all, by any practical definition of the words, foolproof and incapable of error.”

\n

How It All Works

\n

We’ve now seen lots of examples of using the ChatGPT Plugin Kit. But how do they work? What’s under the hood? When you run ChatGPTPluginDeploy you’re basically setting up a Wolfram Language function that can be called from inside ChatGPT when ChatGPT decides it’s needed. And to make this work smoothly turns out to be something that uses a remarkable spectrum of unique capabilities of Wolfram Language—dovetailed with certain “cleverness” in ChatGPT.

\n

From a software engineering point of view, a ChatGPT plugin is fundamentally one or more web APIs—together with a “manifest” that tells ChatGPT how to call these APIs. So how does one set up a web API in Wolfram Language? Well, a decade ago we invented a way to make it extremely easy.

\n

Like everything in Wolfram Language, a web API is represented by a symbolic expression, in this case of the form APIFunction[…]. What’s inside the APIFunction? There are two pieces. A piece of Wolfram Language code that implements the function one wants, together with a specification for how the strings that will actually be passed to the APIFunction (say from a web API) should be interpreted before feeding them to the Wolfram Language code.

\n

Here’s a little piece of Wolfram Language code, in this case for negating a color, then making it lighter:

\n
\n
\n

\n

If we wanted to, we could refactor this as a “pure function” applied to two arguments:

\n
\n
\n

\n

On its own the pure function is just a symbolic expression that evaluates to itself:

\n
\n
\n

\n

If we want to, we can name the arguments of the pure function, then supply them in an association () with their names as keys:

\n
\n
\n

\n

But let’s say we want to call our function from a web API. The parameters in the web API are always strings. So how can we convert from a string (like \"lime green\") to a symbolic expression that Wolfram Language can understand? Well, we have to use the natural language understanding capabilities of Wolfram Language.

\n

Here’s an example, where we’re saying we want to interpret a string as a color:

\n
\n
\n

\n

What really is that color swatch? Like everything else in Wolfram Language, it’s just a symbolic expression:

\n
\n
\n

\n

OK, now we’re ready to package this all up into an APIFunction. The first argument says the API we’re representing has two parameters, and describes how we want to interpret these. The second argument gives the actual Wolfram Language function that the API computes. On its own, the APIFunction is just a symbolic expression that evaluates to itself:

\n
\n
\n

\n

But if we supply values for the parameters (here using an association) it’ll evaluate:

\n
\n
\n

\n

So far all this is just happening inside our Wolfram Language session. But to get an actual web API we just have to “cloud deploy” our APIFunction:

\n
\n
\n

\n

Now we can call this web API, say from a web browser:

\n

Web API

\n

And, yes, that’s the symbolic expression result. If we’d wanted something visual, we could tell the APIFunction to give its results, say as a PNG:

\n
\n
\n

\n

And now it’ll show up as an image in a web browser:

\n

Purple box in web browser

\n

(Note that CloudDeploy deploys a web API that by default has permissions set so that only I can run it. If you use CloudPublish instead, anyone will be able to run it.)

\n

OK, so how do we set up our web API so it can be called as a ChatGPT plugin? One immediate issue is that at the simplest level ChatGPT just deals with text, so we’ve somehow got to convert our result to text. So let’s do a little Wolfram Language programming to achieve that. Here’s a list of values and names of common colors from the Wolfram Knowledgebase:

\n
\n
\n

\n

Of course, we know about many other collections of named colors too, but let’s not worry about that here:

\n
\n
\n

\n

Now we can use Nearest to find which common color is nearest to the color we’ve got:

\n
\n
\n

\n

Now let’s put this into an APIFunction (we’ve “iconized” the list of colors here; we could also have defined a separate function for finding nearest colors, which would automatically be brought along by CloudDeploy):

\n
\n
\n

\n

Now we’re ready to use ChatGPTPluginDeploy. The way ChatGPT plugins work, we’ve got to give a name to the “endpoint” corresponding to our API. And this name—along with the names we used for the parameters in our API—will be used by ChatGPT to figure out when and how to call our plugin. But in this example, we just want to use some kind of unique name for the endpoint, so we’ll be able to refer to it in our chat without ChatGPT confusing it with something else. So let’s call it ColorMangle. So now let’s do the deployment:

\n
\n
\n

\n

Everything we’ve said so far about APIFunction and how it’s called works the same in ChatGPTPluginDeploy and ChatGPTPluginCloudDeploy. But what we’ll say next is different. Because ChatGPTPluginDeploy sets up the API function to execute on your local computer, while ChatGPTPluginCloudDeploy sets it up to run in the Wolfram Cloud (or it could be a Wolfram Enterprise Private Cloud, etc.).

\n

There are advantages and disadvantages to both local and cloud deployment. Running locally allows you to get access to local features of your computer, like camera, filesystem, etc. Running in the cloud allows you to let other people also run your plugin (though, currently, unless you register your plugin with OpenAI, only a limited number of people will be able to install your plugin at any one time).

\n

But, OK, let’s talk about local plugin deployment. ChatGPTPluginDeploy effectively sets up a minimal web server on your computer (implemented with 10 lines of Wolfram Language code), running on a port that ChatGPTPluginDeploy chooses, and calling the Wolfram Engine with your API function whenever it receives a request to the API’s URL.

\n

Here’s the operating system socket that ChatGPTPluginDeploy is using (and, yes, the Wolfram Language represents sockets—like everything else—as symbolic expressions):

\n
\n
\n

\n

OK, but how does ChatGPT know about your API? First, you have to tell it the port you’re using, which you do through the ChatGPT UI (Plugins > Plugin store > Develop your own plugin). You can find the port by clicking the icon in the ChatGPTPluginDeployment object, or programmatically with:

\n
\n
\n

\n

You enter this URL, then tell ChatGPT to “Find manifest file”:

\n

Find manifest file

\n

Let’s look at what it found:

\n

\n

It’s a “manifest” that tells it about the plugin you’re installing. We didn’t specify much, so most things here are just defaults. But an important piece of the manifest is the part that gives the URL for API spec: http://localhost:59353/.well-known/openapi.json

\n

And going there we find this “OpenAPI spec”:

\n

Validated OpenAPI spec

\n

Finally, click Install localhost plugin, and the plugin will show up in the list of installed plugins in your ChatGPT session:

\n
\n
\n

\n

And when ChatGPT starts with the plugin installed, it includes an extra piece in its “system prompt”, that lets it “learn” how to call the plugin:

\n

System prompt

\n

So now we’re ready to use the plugin:

\n
\n
\n

\n

And, yes, it works. But there’s a bit of magic here. Somehow ChatGPT had to “take apart” what we’d asked, realize that the API endpoint called ColorMangle was relevant, then figure out that its color parameter should be “lime green”, and its level should be “0.5”. Opening the box, we can see what it did:

\n
\n
\n

\n

And now we can start using “color mangling” in other places—though ChatGPT hastens to tell us that “color mangling” is a “fictional operation”, perhaps lest it’s accused of disrespecting a country’s flag colors:

\n
\n
\n

\n

In the case we’re dealing with here, ChatGPT manages to correctly “wire up” fragments of text to appropriate parameters in our API. And it does that (rather remarkably) just from the scrap of information it gleans from the names we used for the parameters (and the name we gave the endpoint).

\n

But sometimes we have to tell it a bit more, and we can do that by specifying a prompt for the plugin inside ChatGPTPluginDeploy:

\n
\n
\n

\n

Now we don’t have to just talk about colors:

\n
\n
\n

\n

At first, it didn’t successfully “untangle” the “colors of Iceland”, but then it corrected itself, and got the answers. (And, yes, we might have been able to avoid this by writing a better prompt.)

\n

And actually, there are multiple levels of prompts you can give. You can include a fairly long prompt for the whole plugin. Then you can give shorter prompts for each individual API endpoint. And finally, you can give prompts to help ChatGPT interpret individual parameters in the API, for example by replacing \"color\" \"Color\" with something like:

\n
\n
\n

\n

When you set up a plugin, it can contain many endpoints, that do different things. And—in addition to sharing prompts—one reason this is particularly convenient is that (at least right now, for security reasons) any given subdomain can have only one associated plugin. So if one wants to have a range of functionality, this has to be implemented by having different endpoints.

\n

For ChatGPTPluginCloudDeploy the one-plugin-per-subdomain limit currently means that any given user can only deploy one cloud plugin at a time. But for local plugins the rules are a bit different, and ChatGPTPluginDeploy can deploy multiple plugins by just having them run on different ports—and indeed by default ChatGPTPluginDeploy just picks a random unused port every time you call it.

\n

But how does a local plugin really work? And how does it “reach back” to your computer? The magic is basically happening in the ChatGPT web front end. The way all plugins work is that when the plugin is going to be called, the token-at-a-time generation process of the LLM stops, and the next action of the “outer loop” is to call the plugin—then add whatever result it gives to the string that will be fed to the LLM at the next step. Well, in the case of a local plugin, the outer loop uses JavaScript in the ChatGPT front end to send a request locally on your computer to the localhost port you specified. (By the way, once ChatGPTPluginDeploy opens a port, it’ll stay open until you explicitly call Close on its socket object.)

\n

When one’s using local plugins, they’re running their Wolfram Language code right in the Wolfram Language session from which the plugin was deployed. And this means, for example, that (as we saw in some cases above) values that get set in one plugin call are still there when another call is made.

\n

In the cloud it doesn’t immediately work this way, because each API call is effectively independent. But it’s straightforward to save state in cloud objects (say using CloudPut, or with CloudExpression, etc.) so that one can have “persistent memory” across many API calls.

\n

The LLM inside ChatGPT is (currently) set up to deal only with text. So what happens with images? Well, plugins can put them into the Wolfram Cloud, then pass their URLs to ChatGPT. And ChatGPT is set up to be able to render directly certain special kinds of things—like images.

\n

So—as we saw above—to “output” an image (or several) from a plugin, we can use CloudExport to put each image in a cloud object, say in PNG format. And then ChatGPT, perhaps with some prompting, can show the image inline in its output.

\n

There’s some slightly tricky “plumbing” in deploying Wolfram Language plugins in ChatGPT, most of which is handled automatically in ChatGPTPluginDeploy and ChatGPTPluginCloudDeploy. But by building on the fundamental symbolic structure of the Wolfram Language (and its integrated deployment capabilities) it’s remarkably straightforward to create elaborate custom Wolfram Language plugins for ChatGPT, and to contribute to the emerging ecosystem around LLMs and Wolfram Language.

\n", - "category": "Artificial Intelligence", - "link": "https://writings.stephenwolfram.com/2023/04/instant-plugins-for-chatgpt-introducing-the-wolfram-chatgpt-plugin-kit/", - "creator": "Stephen Wolfram", - "pubDate": "Thu, 27 Apr 2023 20:40:34 +0000", - "enclosure": "https://content.wolfram.com/sites/43/2023/04/hal9000.wav", - "enclosureType": "audio/wav", - "image": "https://content.wolfram.com/sites/43/2023/04/hal9000.wav", - "id": "", - "language": "en", - "folder": "", - "feed": "wolfram", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "89dc200fa2e975a5bf556c649003dd88", - "highlights": [] - }, { "title": "ChatGPT Gets Its “Wolfram Superpowers”!", "description": "\"\"See also: “What Is ChatGPT Doing … and Why Does It Work?” » This is part of an ongoing series about our LLM-related technology:ChatGPT Gets Its “Wolfram Superpowers”!Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin KitThe New World of LLM Functions: Integrating LLM Technology into the Wolfram LanguagePrompts for Work & Play: Launching the Wolfram […]", @@ -285,28 +395,6 @@ "hash": "01523c3af3d938dcb71bbb9c163d8af6", "highlights": [] }, - { - "title": "Will AIs Take All Our Jobs and End Human History—or Not? Well, It’s Complicated…", - "description": "\"\"The Shock of ChatGPT Just a few months ago writing an original essay seemed like something only a human could do. But then ChatGPT burst onto the scene. And suddenly we realized that an AI could write a passable human-like essay. So now it’s natural to wonder: How far will this go? What will AIs […]", - "content": "\"\"

\n

The Shock of ChatGPT

\n

Just a few months ago writing an original essay seemed like something only a human could do. But then ChatGPT burst onto the scene. And suddenly we realized that an AI could write a passable human-like essay. So now it’s natural to wonder: How far will this go? What will AIs be able to do? And how will we humans fit in?

\n

My goal here is to explore some of the science, technology—and philosophy—of what we can expect from AIs. I should say at the outset that this is a subject fraught with both intellectual and practical difficulty. And all I’ll be able to do here is give a snapshot of my current thinking—which will inevitably be incomplete—not least because, as I’ll discuss, trying to predict how history in an area like this will unfold is something that runs straight into an issue of basic science: the phenomenon of computational irreducibility.

\n

But let’s start off by talking about that particularly dramatic example of AI that’s just arrived on the scene: ChatGPT. So what is ChatGPT? Ultimately, it’s a computational system for generating text that’s been set up to follow the patterns defined by human-written text from billions of webpages, millions of books, etc. Give it a textual prompt and it’ll continue in a way that’s somehow typical of what it’s seen us humans write.

\n

The results (which ultimately rely on all sorts of specific engineering) are remarkably “human like”. And what makes this work is that whenever ChatGPT has to “extrapolate” beyond anything it’s explicitly seen from us humans it does so in ways that seem similar to what we as humans might do.

\n

Inside ChatGPT is something that’s actually computationally probably quite similar to a brain—with millions of simple elements (“neurons”) forming a “neural net” with billions of connections that have been “tweaked” through a progressive process of training until they successfully reproduce the patterns of human-written text seen on all those webpages, etc. Even without training the neural net would still produce some kind of text. But the key point is that it won’t be text that we humans consider meaningful. To get such text we need to build on all that “human context” defined by the webpages and other materials we humans have written. The “raw computational system” will just do “raw computation”; to get something aligned with us humans requires leveraging the detailed human history captured by all those pages on the web, etc.

\n

But so what do we get in the end? Well, it’s text that basically reads like it was written by a human. In the past we might have thought that human language was somehow a uniquely human thing to produce. But now we’ve got an AI doing it. So what’s left for us humans? Well, somewhere things have got to get started: in the case of text, there’s got to be a prompt specified that tells the AI “what direction to go in”. And this is the kind of thing we’ll see over and over again. Given a defined “goal”, an AI can automatically work towards achieving it. But it ultimately takes something beyond the raw computational system of the AI to define what us humans would consider a meaningful goal. And that’s where we humans come in.

\n

What does this mean at a practical, everyday level? Typically we use ChatGPT by telling it—using text—what we basically want. And then it’ll fill in a whole essay’s worth of text talking about it. We can think of this interaction as corresponding to a kind of “linguistic user interface” (that we might dub a “LUI”). In a graphical user interface (GUI) there’s core content that’s being rendered (and input) through some potentially elaborate graphical presentation. In the LUI provided by ChatGPT there’s instead core content that’s being rendered (and input) through a textual (“linguistic”) presentation.

\n

You might jot down a few “bullet points”. And in their raw form someone else would probably have a hard time understanding them. But through the LUI provided by ChatGPT those bullet points can be turned into an “essay” that can be generally understood—because it’s based on the “shared context” defined by everything from the billions of webpages, etc. on which ChatGPT has been trained.

\n

There’s something about this that might seem rather unnerving. In the past, if you saw a custom-written essay you’d reasonably be able to conclude that a certain irreducible human effort was spent in producing it. But with ChatGPT this is no longer true. Turning things into essays is now “free” and automated. “Essayification” is no longer evidence of human effort.

\n

Of course, it’s hardly the first time there’s been a development like this. Back when I was a kid, for example, seeing that a document had been typeset was basically evidence that someone had gone to the considerable effort of printing it on printing press. But then came desktop publishing, and it became basically free to make any document be elaborately typeset.

\n

And in a longer view, this kind of thing is basically a constant trend in history: what once took human effort eventually becomes automated and “free to do” through technology. There’s a direct analog of this in the realm of ideas: that with time higher and higher levels of abstraction are developed, that subsume what were formerly laborious details and specifics.

\n

Will this end? Will we eventually have automated everything? Discovered everything? Invented everything? At some level, we now know that the answer is a resounding no. Because one of the consequences of the phenomenon of computational irreducibility is that there’ll always be more computations to do—that can’t in the end be reduced by any finite amount of automation, discovery or invention.

\n

Ultimately, though, this will be a more subtle story. Because while there may always be more computations to do, it could still be that we as humans don’t care about them. And that somehow everything we care about can successfully be automated—say by AIs—leaving “nothing more for us to do”.

\n

Untangling this issue will be at the heart of questions about how we fit into the AI future. And in what follows we’ll see over and over again that what might at first essentially seem like practical matters of technology quickly get enmeshed with deep questions of science and philosophy.

\n

Intuition from the Computational Universe

\n

I’ve already mentioned computational irreducibility a couple of times. And it turns out that this is part of a circle of rather deep—and at first surprising—ideas that I believe are crucial to thinking about the AI future.

\n

Most of our existing intuition about “machinery” and “automation” comes from a kind of “clockwork” view of engineering—in which we specifically build systems component by component to achieve objectives we want. And it’s the same with most software: we write it line by line to specifically do—step by step—whatever it is we want. And we expect that if we want our machinery—or software—to do complex things then the underlying structure of the machinery or software must somehow be correspondingly complex.

\n

So when I started exploring the whole computational universe of possible programs in the early 1980s it was a big surprise to discover that things work quite differently there. And indeed even tiny programs—that effectively just apply very simple rules repeatedly—can generate great complexity. In our usual practice of engineering we haven’t seen this, because we’ve always specifically picked programs (or other structures) where we can readily foresee how they’ll behave, so that we can explicitly set them up to do what we want. But out in the computational universe it’s very common to see programs that just “intrinsically generate” great complexity, without us ever having to explicitly “put it in”.

\n
\n
\n
\n

\n

And having discovered this, we realize that there’s actually a big example that’s been around forever: the natural world. And indeed it increasingly seems as if the “secret” that nature uses to make the complexity it so often shows is exactly to operate according to the rules of simple programs. (For about three centuries it seemed as if mathematical equations were the ultimate way to describe the natural world—but in the past few decades, and particularly poignantly with our recent Physics Project, it’s become clear that simple programs are in general a more powerful approach.)

\n

How does all this relate to technology? Well, technology is about taking what’s out there in the world, and harnessing it for human purposes. And there’s a fundamental tradeoff here. There may be some system out in nature that does amazingly complex things. But the question is whether we can “slice off” certain particular things that we humans happen to find useful. A donkey has all sorts of complex things going on inside. But at some point it was discovered that we can use it “technologically” to do the rather simple thing of pulling a cart.

\n

And when it comes to programs out in the computational universe it’s extremely common to see ones that do amazingly complex things. But the question is whether we can find some aspect of those things that’s useful to us. Maybe the program is good at making pseudorandomness. Or distributedly determining consensus. Or maybe it’s just doing its complex thing, and we don’t yet know any “human purpose” that this achieves.

\n

One of the notable features of a system like ChatGPT is that it isn’t constructed in an “understand-every-step” traditional engineering way. Instead one basically just starts from a “raw computational system” (in the case of ChatGPT, a neural net), then progressively tweaks it until its behavior aligns with the “human-relevant” examples one has. And this alignment is what makes the system “technologically useful”—to us humans.

\n

Underneath, though, it’s still a computational system, with all the potential “wildness” that implies. And free from the “technological objective” of “human-relevant alignment” the system might do all sorts of sophisticated things. But they might not be things that (at least at this time in history) we care about. Even though some putative alien (or our future selves) might.

\n

OK, but let’s come back to the “raw computation” side of things. There’s something very different about computation from all other kinds of “mechanisms” we’ve seen before. We might have a cart that can move forward. And we might have a stapler that can put staples in things. But carts and staplers do very different things; there’s no equivalence between them. But for computational systems (at least ones that don’t just always behave in obviously simple ways) there’s my Principle of Computational Equivalence—which implies that all these systems are in a sense equivalent in the kinds of computations they can do.

\n

This equivalence has many consequences. One of them is that one can expect to make something equally computationally sophisticated out of all sorts of different kinds of things—whether brain tissue or electronics, or some system in nature. And this is effectively where computational irreducibility comes from.

\n

One might think that given, say, some computational system based on a simple program it would always be possible for us—with our sophisticated brains, mathematics, computers, etc.—to “jump ahead” and figure out what the system will do before it’s gone through all the steps to do it. But the Principle of Computational Equivalence implies that this won’t in general be possible—because the system itself can be as computationally sophisticated as our brains, mathematics, computers, etc. are. So this means that the system will be computationally irreducible: the only way to find out what it does is effectively just to go through the same whole computational process that it does.

\n

There’s a prevailing impression that science will always eventually be able do better than this: that it’ll be able to make “predictions” that allow us to work out what will happen without having to trace through each step. And indeed over the past three centuries there’s been lots of success in doing this, mainly by using mathematical equations. But ultimately it turns out that this has only been possible because science has ended up concentrating on particular systems where these methods work (and then these systems have been used for engineering). But the reality is that many systems show computational irreducibility. And in the phenomenon of computational irreducibility science is in effect “deriving its own limitedness”.

\n

Contrary to traditional intuition, try as we might, in many systems we’ll never be able find “formulas” (or other “shortcuts”) that describe what’s going to happen in the systems—because the systems are simply computationally irreducible. And, yes, this represents a limitation on science, and on knowledge in general. But while at first this might seem like a bad thing, there’s also something fundamentally satisfying about it. Because if everything were computationally reducible, we could always “jump ahead” and find out what will happen in the end, say in our lives. But computational irreducibility implies that in general we can’t do that—so that in some sense “something irreducible is being achieved” by the passage of time.

\n

There are a great many consequences of computational irreducibility. Some—that I have particularly explored recently—are in the domain of basic science (for example, establishing core laws of physics as we perceive them from the interplay of computational irreducibility and our computational limitations as observers). But computational irreducibility is also central in thinking about the AI future—and in fact I increasingly feel that it adds the single most important intellectual element needed to make sense of many of the most important questions about the potential roles of AIs and humans in the future.

\n

For example, from our traditional experience with engineering we’re used to the idea that to find out why something happened in a particular way we can just “look inside” a machine or program and “see what it did”. But when there’s computational irreducibility, that won’t work. Yes, we could “look inside” and see, say, a few steps. But computational irreducibility implies that to find out what happened, we’d have to trace through all the steps. We can’t expect to find a “simple human narrative” that “says why something happened”.

\n

But having said this, one feature of computational irreducibility is that within any computationally irreducible systems there must always be (ultimately, infinitely many) “pockets of computational reducibility” to be found. So for example, even though we can’t say in general what will happen, we’ll always be able to identify specific features that we can predict. (“The leftmost cell will always be black”, etc.) And as we’ll discuss later we can potentially think of technological (as well as scientific) progress as being intimately tied to the discovery of these “pockets of reducibility”. And in effect the existence of infinitely many such pockets is the reason that “there’ll always be inventions and discoveries to be made”.

\n

Another consequence of computational irreducibility has to do with trying to ensure things about the behavior of a system. Let’s say one wants to set up an AI so it’ll “never do anything bad”. One might imagine that one could just come up with particular rules that ensure this. But as soon as the behavior of the system (or its environment) is computationally irreducible one will never be able to guarantee what will happen in the system. Yes, there may be particular computationally reducible features one can be sure about. But in general computational irreducibility implies that there’ll always be a “possibility of surprise” or the potential for “unintended consequences”. And the only way to systematically avoid this is to make the system not computationally irreducible—which means it can’t make use of the full power of computation.

\n

“AIs Will Never Be Able to Do That”

\n

We humans like to feel special, and feel as if there’s something “fundamentally unique” about us. Five centuries ago we thought we lived at the center of the universe. Now we just tend to think that there’s something about our intellectual capabilities that’s fundamentally unique and beyond anything else. But the progress of AI—and things like ChatGPT—keep on giving us more and more evidence that that’s not the case. And indeed my Principle of Computational Equivalence says something even more extreme: that at a fundamental computational level there’s just nothing fundamentally special about us at all—and that in fact we’re computationally just equivalent to lots of systems in nature, and even to simple programs.

\n

This broad equivalence is important in being able to make very general scientific statements (like the existence of computational irreducibility). But it also highlights how significant our specifics—our particular history, biology, etc.—are. It’s very much like with ChatGPT. We can have a generic (untrained) neural net with the same structure as ChatGPT, that can do certain “raw computation”. But what makes ChatGPT interesting—at least to us—is that it’s been trained with the “human specifics” described on billions of webpages, etc. In other words, for both us and ChatGPT there’s nothing computationally “generally special”. But there is something “specifically special”—and it’s the particular history we’ve had, particular knowledge our civilization has accumulated, etc.

\n

There’s a curious analogy here to our physical place in the universe. There’s a certain uniformity to the universe, which means there’s nothing “generally special” about our physical location. But at least to us there’s still something “specifically special” about it, because it’s only here that we have our particular planet, etc. At a deeper level, ideas based on our Physics Project have led to the concept of the ruliad: the unique object that is the entangled limit of all possible computational processes. And we can then view our whole experience as “observers of the universe” as consisting of sampling the ruliad at a particular place.

\n

It’s a bit abstract (and a long story, which I won’t go into in any detail here), but we can think of different possible observers as being both at different places in physical space, and at different places in rulial space—giving them different “points of view” about what happens in the universe. Human minds are in effect concentrated in a particular region of physical space (mostly on this planet) and a particular region of rulial space. And in rulial space different human minds—with their different experiences and thus different ways of thinking about the universe—are in slightly different places. Animal minds might be fairly close in rulial space. But other computational systems (like, say, the weather, which is sometimes said to “have a mind of its own”) are further away—as putative aliens might also be.

\n

So what about AIs? It depends what we mean by “AIs”. If we’re talking about computational systems that are set up to do “human-like things” then that means they’ll be close to us in rulial space. But insofar as “an AI” is an arbitrary computational system it can be anywhere in rulial space, and it can do anything that’s computationally possible—which is far broader than what we humans can do, or even think about. (As we’ll talk about later, as our intellectual paradigms—and ways of observing things—expand, the region of rulial space in which we humans operate will correspondingly expand.)

\n

But, OK, just how “general” are the computations that we humans (and the AIs that follow us) are doing? We don’t know enough about the brain to be sure. But if we look at artificial neural net systems—like ChatGPT—we can potentially get some sense. And in fact the computations really don’t seem to be that “general”. In most neural net systems data that’s given as input just “ripples once through the system” to produce output. It’s not like in a computational system like a Turing machine where there can be arbitrary “recirculation of data”. And indeed without such “arbitrary recirculation” the computation is necessarily quite “shallow” and can’t ultimately show computational irreducibility.

\n

It’s a bit of a technical point, but one can ask whether ChatGPT, with its “re-feeding of text produced so far” can in fact achieve arbitrary (“universal”) computation. And I suspect that in some formal sense it can (or at least a sufficiently expanded analog of it can)—though by producing an extremely verbose piece of text that for example in effect lists successive (self-delimiting) states of a Turing machine tape, and in which finding “the answer” to a computation will take a bit of effort. But—as I’ve discussed elsewhere—in practice ChatGPT is presumably almost exclusively doing “quite shallow” computation.

\n

It’s an interesting feature of the history of practical computing that what one might consider “deep pure computations” (say in mathematics or science) were done for decades before “shallow human-like computations” became feasible. And the basic reason for this is that for “human-like computations” (like recognizing images or generating text) one needs to capture lots of “human context”, which requires having lots of “human-generated data” and the computational resources to store and process it.

\n

And, by the way, brains also seem to specialize in fundamentally shallow computations. And to do the kind of deeper computations that allow one to take advantage of more of what’s out there in the computational universe, one has to turn to computers. As we’ve discussed, there’s plenty out in the computational universe that we humans don’t (yet) care about: we just consider it “raw computation”, that doesn’t seem to be “achieving human purposes”. But as a practical matter it’s important to make a bridge between the things we humans do care about and think about, and what’s possible in the computational universe. And in a sense that’s at the core of the project I’ve put so much effort into in the Wolfram Language of creating a full-scale computational language that describes in computational terms the things we think about, and experience in the world.

\n

OK, people have been saying for years: “It’s nice that computers can do A and B, but only humans can do X”. What X is supposed to be has changed—and narrowed—over the years. And ChatGPT provides us with a major unexpected new example of something more that computers can do.

\n

So what’s left? People might say: “Computers can never show creativity or originality”. But—perhaps disappointingly—that’s surprisingly easy to get, and indeed just a bit of randomness “seeding” a computation can often do a pretty good job, as we saw years ago with our WolframTones music-generation system, and as we see today with ChatGPT’s writing. People might also say: “Computers can never show emotions”. But before we had a good way to generate human language we wouldn’t really have been able to tell. And now it already works pretty well to ask ChatGPT to write “happily”, “sadly”, etc. (In their raw form emotions in both humans and other animals are presumably associated with rather simple “global variables” like neurotransmitter concentrations.)

\n

In the past people might have said: “Computers can never show judgement”. But by now there are endless examples of machine learning systems that do well at reproducing human judgement in lots of domains. People might also say: “Computers don’t show common sense”. And by this they typically mean that in a particular situation a computer might locally give an answer, but there’s a global reason why that answer doesn’t make sense, that the computer “doesn’t notice”, but a person would.

\n

So how does ChatGPT do on this? Not too badly. In plenty of cases it correctly recognizes that “that’s not what I’ve typically read”. But, yes, it makes mistakes. Some of them have to do with it not being able to do—purely with its neural net—even slightly “deeper”computations. (And, yes, that’s something that can often be fixed by it calling Wolfram|Alpha as a tool.) But in other cases the problem seems to be that it can’t quite connect different domains well enough.

\n

It’s perfectly capable of doing simple (“SAT-style”) analogies. But when it comes to larger-scale ones it doesn’t manage them. My guess, though, is that it won’t take much scaling up before it starts to be able to make what seem like very impressive analogies (that most of us humans would never even be able to make)—at which point it’ll probably successfully show broader “common sense”.

\n

But so what’s left that humans can do, and AIs can’t? There’s—almost by definition—one fundamental thing: define what we would consider goals for what to do. We’ll talk more about this later. But for now we can note that any computational system, once “set in motion”, will just follow its rules and do what it does. But what “direction should it be pointed in”? That’s something that has to come from “outside the system”.

\n

So how does it work for us humans? Well, our goals are in effect defined by the whole web of history—both from biological evolution and from our cultural development—in which we are embedded. But ultimately the only way to truly participate in that web of history is to be part of it.

\n

Of course, we can imagine technologically emulating every “relevant” aspect of a brain—and indeed things like the success of ChatGPT may suggest that that’s easier to do than we might have thought. But that won’t be enough. To participate in the “human web of history” (as we’ll discuss later) we’ll have to emulate other aspects of “being human”—like moving around, being mortal, etc. And, yes, if we make an “artificial human” we can expect it (by definition) to show all the features of us humans.

\n

But while we’re still talking about AIs as—for example—“running on computers” or “being purely digital” then, at least as far as we’re concerned, they’ll have to “get their goals from outside”. One day (as we’ll discuss) there will no doubt be some kind of “civilization of AIs”—which will form its own web of history. But at this point there’s no reason to think that we’ll still be able to describe what’s going on in terms of goals that we recognize. In effect the AIs will at that point have left our domain of rulial space. And—as we’ll discuss—they’ll be operating more like the kind of systems we see in nature, where we can tell there’s computation going on, but we can’t describe it, except rather anthropomorphically, in terms of human goals and purposes.

\n

Will There Be Anything Left for the Humans to Do?

\n

It’s been an issue that’s been raised—with varying degrees of urgency—for centuries: with the advance of automation (and now AI), will there eventually be nothing left for humans to do? Back in the early days of our species, there was lots of hard work of hunting and gathering to do, just to survive. But at least in the developed parts of the world, that kind of work is now at best a distant historical memory.

\n

And yet at each stage in history—at least so far—there always seem to be other kinds of work that keep people busy. But there’s a pattern that increasingly seems to repeat. Technology in some way or another enables some new occupation. And eventually that occupation becomes widespread, and lots of people do it. But then there’s a technological advance, and the occupation gets automated—and people aren’t needed to do it anymore. But now there’s a new level of technology, that enables new occupations. And the cycle continues.

\n

A century ago the increasingly widespread use of telephones meant that more and more people worked as switchboard operators. But then telephone switching was automated—and those switchboard operators weren’t needed anymore. But with automated switching there could be huge development of telecommunications infrastructure, opening up all sorts of new types of jobs, that in aggregate employ vastly more people than were ever switchboard operators.

\n

Something somewhat similar happened with accounting clerks. Before there were computers, one needed to have people laboriously tallying up numbers. But with computers, that was all automated away. But with that automation came the ability to do more complex financial computations—which allowed for more complex financial transactions, more complex regulations, etc., which in turn led to all sorts of new types of jobs.

\n

And across a whole range of industries, it’s been the same kind of story. Automation obsoletes some jobs, but enables others. There’s quite often a gap in time, and a change in the skills that are needed. But at least so far there always seems to have been a broad frontier of jobs that have been made possible—but haven’t yet been automated.

\n

Will this at some point end? Will there come a time when everything we humans want (or at least need) is delivered automatically? Well, of course, that depends on what we want, and whether, for example, that evolves with what technology has made possible. But could we just decide that “enough is enough”; let’s stop here, and just let everything be automated?

\n

I don’t think so. And the reason is ultimately because of computational irreducibility. We try to get the world to be “just so”, say set up so we’re “predictably comfortable”. Well, the problem is that there’s inevitably computational irreducibility in the way things develop—not just in nature, but in things like societal dynamics too. And that means that things won’t stay “just so”. There’ll always be something unpredictable that happens; something that the automation doesn’t cover.

\n

At first we humans might just say “we don’t care about that”. But in time computational irreducibility will affect everything. So if there’s anything at all we care about (including, for example, not going extinct), we’ll eventually have to do something—and go beyond whatever automation was already set up.

\n

It’s easy to find practical examples. We might think that when computers and people are all connected in a seamless automated network, there’d be nothing more to do. But what about the “unintended consequence” of computer security issues? What might have seemed like a case where “technology finished things” quickly creates a new kind of job for people to do. And at some level, computational irreducibility implies that things like this must always happen. There must always be a “frontier”. At least if there’s anything at all we want to preserve (like not going extinct).

\n

But let’s come back to the situation here and now with AI. ChatGPT just automated all sorts of text-related tasks. It used to take lots of effort—and people—to write customized reports, letters, etc. But (at least so long as one’s dealing with situations where one doesn’t need 100% “correctness”) ChatGPT just automated a lot of that, so people aren’t needed for it anymore. But what will this mean? Well, it means that there’ll be a lot more customized reports, letters, etc. that can be produced. And that will lead to new kinds of jobs—managing, analyzing, validating etc. all that mass-customized text. Not to mention the need for prompt engineers (a job category that just didn’t exist until a few months ago), and what amount to AI wranglers, AI psychologists, etc.

\n

But let’s talk about today’s “frontier” of jobs that haven’t been “automated away”. There’s one category that in many ways seems surprising to still be “with us”: jobs that involve lots of mechanical manipulation, like construction, fulfillment, food preparation, etc. But there’s a missing piece of technology here: there isn’t yet good general-purpose robotics (as there is general-purpose computing), and we humans still have the edge in dexterity, mechanical adaptability, etc. But I’m quite sure that in time—and perhaps quite suddenly—the necessary technology will be developed (and, yes, I have ideas about how to do it). And this will mean that most of today’s “mechanical manipulation” jobs will be “automated away”—and won’t need people to do them.

\n

But then, just as in our other examples, this will mean that mechanical manipulation will become much easier and cheaper to do, and more of it will be done. Houses might routinely be built and dismantled. Products might routinely be picked up from wherever they’ve ended up, and redistributed. Vastly more ornate “food constructions” might become the norm. And each of these things—and many more—will open up new jobs.

\n

But will every job that exists in the world today “on the frontier” eventually be automated? What about jobs where it seems like a large part of the value is just “having a human be there”? Jobs like flying a plane where one wants the “commitment” of the pilot being there in the plane. Caregiver jobs where one wants the “connection” of a human being there. Sales or education jobs where one wants “human persuasion” or “human encouragement”. Today one might think “only a human can make one feel that way”. But that’s typically based on the way the job is done now. And maybe there’ll be different ways found that allow the essence of the task to be automated, almost inevitably opening up new tasks to be done.

\n

For example, something that in the past needed “human persuasion” might be “automated” by something like gamification—but then more of it can be done, with new needs for design, analytics, management, etc.

\n

We’ve been talking about “jobs”. And that term immediately brings to mind wages, economics, etc. And, yes, plenty of what people do (at least in the world as it is today) is driven by issues of economics. But plenty is also not. There are things we “just want to do”—as a “social matter”, for “entertainment”, for “personal satisfaction”, etc.

\n

Why do we want to do these things? Some of it seems intrinsic to our biological nature. Some of it seems determined by the “cultural environment” in which we find ourselves. Why might one walk on a treadmill? In today’s world one might explain that it’s good for health, lifespan, etc. But a few centuries ago, without modern scientific understanding, and with a different view of the significance of life and death, that explanation really wouldn’t work.

\n

What drives such changes in our view of what we “want to do”, or “should do”? Some seems to be driven by the pure “dynamics of society”, presumably with its own computational irreducibility. But some has to do with our ways of interacting with the world—both the increasing automation delivered by the advance of technology, and the increasing abstraction delivered by the advance of knowledge.

\n

And there seem to be similar “cycles” seen here as in the kinds of things we consider to be “occupations” or “jobs”. For a while something is hard to do, and serves as a good “pastime”. But then it gets “too easy” (“everybody now knows how to win at game X”, etc.), and something at a “higher level” takes its place.

\n

About our “base” biologically driven motivations it doesn’t seem like anything has really changed in the course of human history. But there are certainly technological developments that could have an effect in the future. Effective human immortality, for example, would change many aspects of our motivation structure. As would things like the ability to implant memories or, for that matter, implant motivations.

\n

For now, there’s a certain element of what we want to do that’s “anchored” by our biological nature. But at some point we’ll surely be able to emulate with a computer at least the essence of what our brains are doing (and indeed the success of things like ChatGPT makes it seems like the moment when that will happen is closer at hand than we might have thought). And at that point we’ll have the possibility of what amount to “disembodied human souls”.

\n

To us today it’s very hard to imagine what the “motivations” of such a “disembodied soul” might be. Looked at “from the outside” we might “see the soul” doing things that “don’t make much sense” to us. But it’s like asking what someone from a thousand years ago would think about many of our activities today. These activities make sense to us today because we’re embedded in our whole “current framework”. But without that framework they don’t make sense. And so it will be for the “disembodied soul”. To us, what it does may not make sense. But to it, with its “current framework”, it will.

\n

Could we “learn how to make sense of it”? There’s likely to be a certain barrier of computational irreducibility: in effect the only way to “understand the soul of the future” is to retrace its steps to get to where it is. So from our vantage point today, we’re separated by a certain “irreducible distance”, in effect in rulial space.

\n

But could there be some science of the future that will at least tell us general things about how such “souls” behave? Even when there’s computational irreducibility we know that there will always be pockets of computational reducibility—and thus features of behavior that are predictable. But will those features be “interesting”, say from our vantage point today? Maybe some of them will be. Maybe they’ll show us some kind of metapsychology of souls. But inevitably they can only go so far. Because in order for those souls to even experience the passage of time there has to be computational irreducibility. If too much of what happens is too predictable, it’s as if “nothing is happening”—or at least nothing “meaningful”.

\n

And, yes, this is all tied up with questions about “free will”. Even when there’s a disembodied soul that’s operating according to some completely deterministic underlying program, computational irreducibility means its behavior can still “seem free”—because nothing can “outrun it” and say what it’s going to be. And the “inner experience” of the disembodied soul can be significant: it’s “intrinsically defining its future”, not just “having its future defined for it”.

\n

One might have assumed that once everything is just “visibly operating” as “mere computation” it would necessarily be “soulless” and “meaningless”. But computational irreducibility is what breaks out of this, and what allows there to be something irreducible and “meaningful” achieved. And it’s the same phenomenon whether one’s talking about our life now in the physical universe, or a future “disembodied” computational existence. Or in other words, even if absolutely everything—even our very existence—has been “automated by computation”, that doesn’t mean we can’t have a perfectly good “inner experience” of meaningful existence.

\n

Generalized Economics and the Concept of Progress

\n

If we look at human history—or, for that matter, the history of life on Earth—there’s a certain pervasive sense that there’s some kind of “progress” happening. But what fundamentally is this “progress”? One can view it as the process of things being done at a progressively “higher level”, so that in effect “more of what’s important” can happen with a given effort. This idea of “going to a higher level” takes many forms—but they’re all fundamentally about eliding details below, and being able to operate purely in terms of the “things one cares about”.

\n

In technology, this shows up as automation, in which what used to take lots of detailed steps gets packaged into something that can be done “with the push of a button”. In science—and the intellectual realm in general—it shows up as abstraction, where what used to involve lots of specific details gets packaged into something that can be talked about “purely collectively”. And in biology it shows up as some structure (ribosome, cell, wing, etc.) that can be treated as a “modular unit”.

\n

That it’s possible to “do things at a higher level” is a reflection of being able to find “pockets of computational reducibility”. And—as we mentioned above—the fact that (given underlying computational irreducibility) there are necessarily an infinite number of such pockets means that “progress can always go on forever”.

\n

When it comes to human affairs we tend to value such progress highly, because (at least for now) we live finite lives, and insofar as we “want more to happen”, “progress” makes that possible. It’s certainly not self-evident that having more happen is “good”; one might just “want a quiet life”. But there is one constraint that in a sense originates from the deep foundations of biology.

\n

If something doesn’t exist, then nothing can ever “happen to it”. So in biology, if one’s going to have anything “happen” with organisms, they’d better not be extinct. But the physical environment in which biological organisms exist is finite, with many resources that are finite. And given organisms with finite lives, there’s an inevitability to the process of biological evolution, and to the “competition” for resources between organisms.

\n

Will there eventually be an “ultimate winning organism”? Well, no, there can’t be—because of computational irreducibility. There’ll in a sense always be more to explore in the computational universe—more “raw computational material for possible organisms”. And given any “fitness criterion” (like—in a Turing machine analog—“living longer before halting”) there’ll always be a way to “do better” with it.

\n

One might still wonder, however, whether perhaps biological evolution—with its underlying process of random genetic mutation—could “get stuck” and never be able to discover some “way to do better”. And indeed simple models of evolution might give one the intuition that this would happen. But actual evolution seems more like deep learning with a large neural net—where one’s effectively operating in an extremely high-dimensional space where there’s typically always a “way to get there from here”, at least given enough time.

\n

But, OK, so from our history of biological evolution there’s a certain built-in sense of “competition for scarce resources”. And this sense of competition has (so far) also carried over to human affairs. And indeed it’s the basic driver for most of the processes of economics.

\n

But what if resources aren’t “scarce” anymore? What if progress—in the form of automation, or AI—makes it easy to “get anything one wants”? We might imagine robots building everything, AIs figuring everything out, etc. But there are still things that are inevitably scarce. There’s only so much real estate. Only one thing can be “the first ___”. And, in the end, if we have finite lives, we only have so much time.

\n

Still, the more efficient—or high level—the things we do (or have) are, the more we’ll be able to get done in the time we have. And it seems as if what we perceive as “economic value” is intimately connected with “making things higher level”. A finished phone is “worth more” than its raw materials. An organization is “worth more” than its separate parts. But what if we could have “infinite automation”? Then in a sense there’d be “infinite economic value everywhere”, and one might imagine there’d be “no competition left”.

\n

But once again computational irreducibility stands in the way. Because it tells us there’ll never be “infinite automation”, just as there’ll never be an ultimate winning biological organism. There’ll always be “more to explore” in the computational universe, and different paths to follow.

\n

What will this look like in practice? Presumably it’ll lead to all sorts of diversity. So that, for example, a chart of “what the components of an economy are” will become more and more fragmented; it won’t just be “the single winning economic activity is ___”.

\n

There is one potential wrinkle in this picture of unending progress. What if nobody cares? What if the innovations and discoveries just don’t matter, say to us humans? And, yes, there is of course plenty in the world that at any given time in history we don’t care about. That piece of silicon we’ve been able to pick out? It’s just part of a rock. Well, until we start making microprocessors out of it.

\n

But as we’ve discussed, as soon as we’re “operating at some level of abstraction” computational irreducibility makes it inevitable that we’ll eventually be exposed to things that “require going beyond that level”.

\n

But then—critically—there will be choices. There will be different paths to explore (or “mine”) in the computational universe—in the end infinitely many of them. And whatever the computational resources of AIs etc. might be, they’ll never be able to explore all of them. So something—or someone—will have to make a choice of which ones to take.

\n

Given a particular set of things one cares about at a particular point, one might successfully be able to automate all of them. But computational irreducibility implies there will always be a “frontier”, where choices have to be made. And there’s no “right answer”; no “theoretically derivable” conclusion. Instead, if we humans are involved, this is where we get to define what’s going to happen.

\n

How will we do that? Well, ultimately it’ll be based on our history—biological, cultural, etc. We’ll get to use all that irreducible computation that went into getting us to where we are to define what to do next. In a sense it’ll be something that goes “through us”, and that uses what we are. It’s the place where—even when there’s automation all around—there’s still always something us humans can “meaningfully” do.

\n

How Can We Tell the AIs What to Do?

\n

Let’s say we want an AI (or any computational system) to do a particular thing. We might think we could just set up its rules (or “program it”) to do that thing. And indeed for certain kinds of tasks that works just fine. But the deeper the use we make of computation, the more we’re going to run into computational irreducibility, and the less we’ll be able to know how to set up particular rules to achieve what we want.

\n

And then, of course, there’s the question of defining what “we want” in the first place. Yes, we could have specific rules that say what particular pattern of bits should occur at a particular point in a computation. But that probably won’t have much to do with the kind of overall “human-level” objective that we typically care about. And indeed for any objective we can even reasonably define, we’d better be able to coherently “form a thought” about it. Or, in effect, we’d better have some “human-level narrative” to describe it.

\n

But how can we represent such a narrative? Well, we have natural language—probably the single most important innovation in the history of our species. And what natural language fundamentally does is to allow us to talk about things at a “human level”. It’s made of words that we can think of as representing “human-level packets of meaning”. And so, for example, the word “chair” represents the human-level concept of a chair. It’s not referring to some particular arrangement of atoms. Instead, it’s referring to any arrangement of atoms that we can usefully conflate into the single human-level concept of a chair, and from which we can deduce things like the fact that we can expect to sit on it, etc.

\n

So, OK, when we’re “talking to an AI” can we expect to just say what we want using natural language? We can definitely get a certain distance—and indeed ChatGPT helps us get further than ever before. But as we try to make things more precise we run into trouble, and the language we need rapidly becomes increasingly ornate, as in the “legalese” of complex legal documents. So what can we do? If we’re going to keep things at the level of “human thoughts” we can’t “reach down” into all the computational details. But yet we want a precise definition of how what we might say can be implemented in terms of those computational details.

\n

Well, there’s a way to deal with this, and it’s one that I’ve personally devoted many decades to: it’s the idea of computational language. When we think about programming languages, they’re things that operate solely at the level of computational details, defining in more or less the native terms of a computer what the computer should do. But the point of a true computational language (and, yes, in the world today the Wolfram Language is the sole example) is to do something different: to define a precise way of talking in computational terms about things in the world (whether concretely countries or minerals, or abstractly computational or mathematical structures).

\n

Out in the computational universe, there’s immense diversity in the “raw computation” that can happen. But there’s only a thin sliver of it that we humans (at least currently) care about and think about. And we can view computational language as defining a bridge between the things we think about and what’s computationally possible. The functions in our computational language (7000 or so of them in the Wolfram Language) are in effect like words in a human language—but now they have a precise grounding in the “bedrock” of explicit computation. And the point is to design the computational language so it’s convenient for us humans to think and express ourselves in (like a vastly expanded analog of mathematical notation), but so it can also be precisely implemented in practice on a computer.

\n

Given a piece of natural language it’s often possible to give a precise, computational interpretation of it—in computational language. And indeed this is exactly what happens in Wolfram|Alpha. Give a piece of natural language and the Wolfram|Alpha NLU system will try to find an interpretation of it as computational language. And from this interpretation, it’s then up to the Wolfram Language to do the computation that’s specified, and give back the results—and potentially synthesize natural language to express them.

\n

As a practical matter, this setup is useful not only for humans, but also for AIs—like ChatGPT. Given a system that produces natural language, the Wolfram|Alpha NLU system can “catch” natural language it is “thrown”, and interpret it as computational language that precisely specifies a potentially irreducible computation to do.

\n

With both natural language and computational language one’s basically “directly saying what one wants”. But an alternative approach—more aligned with machine learning—is just to give examples, and (implicitly or explicitly) say “follow these”. Inevitably there has to be some underlying model for how to do that following—typically in practice just defined by “what a neural net with a certain architecture will do”. But will the result be “right”? Well, the result will be whatever the neural net gives. But typically we’ll tend to consider it “right” if it’s somehow consistent with what we humans would have concluded. And in practice this often seems to happen, presumably because the actual architecture of our brains is somehow similar enough to the architecture of the neural nets we’re using.

\n

But what if we want to “know for sure” what’s going to happen—or, for example, that some particular “mistake” can never be made? Well then we’re presumably thrust back into computational irreducibility, with the result that there’s no way to know, for example, whether a particular set of training examples can lead to a system that’s capable of doing (or not doing) some particular thing.

\n

OK, but let’s say we’re setting up some AI system, and we want to make sure it “doesn’t do anything bad”. There are several levels of issues here. The first is to decide what we mean by “anything bad”. And, as we’ll discuss below, that in itself is very hard. But even if we could abstractly figure this out, how should we actually express it? We could give examples—but then the AI will inevitably have to “extrapolate” from them, in ways we can’t predict. Or we could describe what we want in computational language. It might be difficult to cover “every case” (as it is in present-day human laws, or complex contracts). But at least we as humans can read what we’re specifying. Though even in this case, there’s an issue of computational irreducibility: that given the specification it won’t be possible to work out all its consequences.

\n

What does all this mean? In essence it’s just a reflection of the fact that as soon as there’s “serious computation” (i.e. irreducible computation) involved, one isn’t going to be immediately able to say what will happen. (And in a sense that’s inevitable, because if one could say, it would mean the computation wasn’t in fact irreducible.) So, yes, we can try to “tell AIs what to do”. But it’ll be like many systems in nature (or, for that matter, people): you can set them on a path, but you can’t know for sure what will happen; you just have to wait and see.

\n

A World Run by AIs

\n

In the world today, there are already plenty of things that are being done by AIs. And, as we’ve discussed, there’ll surely be more in the future. But who’s “in charge”? Are we telling the AIs what to do, or are they telling us? Today it’s at best a mixture: AIs suggest content for us (for example from the web), and in general make all sorts of recommendations about what we should do. And no doubt in the future those recommendations will be even more extensive and tightly coupled to us: we’ll be recording everything we do, processing it with AI, and continually annotating with recommendations—say through augmented reality—everything we see. And in some sense things might even go beyond “recommendations”. If we have direct neural interfaces, then we might be making our brains just “decide” they want to do things, so that in some sense we become pure “puppets of the AI”.

\n

And beyond “personal recommendations” there’s also the question of AIs running the systems we use, or in fact running the whole infrastructure of our civilization. Today we ultimately expect people to make large-scale decisions for our world—often operating in systems of rules defined by laws, and perhaps aided by computation, and even what one might call AI. But there may well come a time when it seems as if AIs could just “do a better job than humans”, say at running a central bank or waging a war.

\n

One might ask how one would ever know if the AI would “do a better job”. Well, one could try tests, and run examples. But once again one’s faced with computational irreducibility. Yes, the particular tests one tries might work fine. But one can’t ultimately predict everything that could happen. What will the AI do if there’s suddenly a never-before-seen seismic event? We basically won’t know until it happens.

\n

But can we be sure the AI won’t do anything “crazy”? Could we—with some definition of “crazy”—effectively “prove a theorem” that the AI can never do that? For any realistically nontrivial definition of crazy we’ll again run into computational irreducibility—and this won’t be possible.

\n

Of course, if we’ve put a person (or even a group of people) “in charge” there’s also no way to “prove” that they won’t do anything “crazy”—and history shows that people in charge quite often have done things that, at least in retrospect, we consider “crazy”. But even though at some level there’s no more certainty about what people will do than about what AIs might do, we still get a certain comfort when people are in charge if we think that “we’re in it together”, and that if something goes wrong those people will also “feel the effects”.

\n

But still, it seems inevitable that lots of decisions and actions in the world will be taken directly by AIs. Perhaps it’ll be because this will be cheaper. Perhaps the results (based on tests) will be better. Or perhaps, for example, things will just have to be done too quickly and in numbers too large for us humans to be in the loop.

\n

But, OK, if a lot of what happens in our world is happening through AIs, and the AIs are effectively doing irreducible computations, what will this be like? We’ll be in a situation where things are “just happening” and we don’t quite know why. But in a sense we’ve very much been in this situation before. Because it’s what happens all the time in our interaction with nature.

\n

Processes in nature—like, for example, the weather—can be thought of as corresponding to computations. And much of the time there’ll be irreducibility in those computations. So we won’t be able to readily predict them. Yes, we can do natural science to figure out some aspects of what’s going to happen. But it’ll inevitably be limited.

\n

And so we can expect it to be with the “AI infrastructure” of the world. Things are happening in it—as they are in the weather—that we can’t readily predict. We’ll be able to say some things—though perhaps in ways that are closer to psychology or social science than to traditional exact science. But there’ll be surprises—like maybe some strange AI analog of a hurricane or an ice age. And in the end all we’ll really be able to do is to try to build up our human civilization so that such things “don’t fundamentally matter” to it.

\n

In a sense the picture we have is that in time there’ll be a whole “civilization of AIs” operating—like nature—in ways that we can’t readily understand. And like with nature, we’ll coexist with it.

\n

But at least at first we might think there’s an important difference between nature and AIs. Because we imagine that we don’t “pick our natural laws”—yet insofar as we’re the ones building the AIs we imagine we can “pick their laws”. But both parts of this aren’t quite right. Because in fact one of the implications of our Physics Project is precisely that the laws of nature that we perceive are the way they are because we are observers who are the way we are. And on the AI side, computational irreducibility implies that we can’t expect to be able to determine the final behavior of the AIs just from knowing the underlying laws we gave them.

\n

But what will the “emergent laws” of the AIs be? Well, just like in physics, it’ll depend on how we “sample” the behavior of the AIs. If we look down at the level of individual bits, it’ll be like looking at molecular dynamics (or the behavior of atoms of space). But typically we won’t do this. And just like in physics, we’ll operate as computationally bounded observers—measuring only certain aggregated features of an underlying computationally irreducible process. But what will the “overall laws of AIs” be like? Maybe they’ll show close analogies to physics. Or maybe they’ll seem more like psychological theories (superegos for AIs?). But we can expect them in many ways to be like large-scale laws of nature of the kind we know.

\n

Still, there’s one more difference between at least our interaction with nature and with AIs. Because we have in effect been “co-evolving” with nature for billions of years—yet AIs are “new on the scene”. And through our co-evolution with nature we’ve developed all sorts of structural, sensory and cognitive features that allow us to “interact successfully” with nature. But with AIs we don’t have these. So what does this mean?

\n

Well, our ways of interacting with nature can be thought of as leveraging pockets of computational reducibility that exist in natural processes—to make things seem at least somewhat predictable to us. But without having found such pockets for AIs, we’re likely to be faced with much more “raw computational irreducibility”—and thus much more unpredictability. It’s been a conceit of modern times that—particularly with the help of science—we’ve been able to make more and more of our world predictable to us, though in practice a large part of what’s led to this is the way we’ve built and controlled the environment in which we live, and the things we choose to do.

\n

But for the new “AI world”, we’re effectively starting from scratch. And to make things predictable in that world may be partly a matter of some new science, but perhaps more importantly a matter of choosing how we set up our “way of life” around the AIs there. (And, yes, if there’s lots of unpredictability we may be back to more ancient points of view about the importance of fate—or we may view AIs as a bit like the Olympians of Greek mythology, duking it out among themselves and sometimes having an effect on mortals.)

\n

Governance in an AI World

\n

Let’s say the world is effectively being run by AIs, but let’s assume that we humans have at least some control over what they do. Then what principles should we have them follow? And what, for example, should their “ethics” be?

\n

Well, the first thing to say is that there’s no ultimate, theoretical “right answer” to this. There are many ethical and other principles that AIs could follow. And it’s basically just a choice which ones should be followed.

\n

When we talk about “principles” and “ethics” we tend to think more in terms of constraints on behavior than in terms of rules for generating behavior. And that means we’re dealing with something more like mathematical axioms, where we ask things like what theorems are true according to those axioms, and what are not. And that means there can be issues like whether the axioms are consistent—and whether they’re complete, in the sense that they can “determine the ethics of anything”. But now, once again, we’re face to face with computational irreducibility, here in the form of Gödel’s theorem and its generalizations.

\n

And what this means is that it’s in general undecidable whether any given set of principles is inconsistent, or incomplete. One might “ask an ethical question”, and find that there’s a “proof chain” of unbounded length to determine what the answer to that question is within one’s specified ethical system, or whether there is even a consistent answer.

\n

One might imagine that somehow one could add axioms to “patch up” whatever issues there are. But Gödel’s theorem basically says that it’ll never work. It’s the same story as so often with computational irreducibility: there’ll always be “new situations” that can arise, that in this case can’t be captured by a finite set of axioms.

\n

OK, but let’s imagine we’re picking a collection of principles for AIs. What criteria could we use to do it? One might be that these principles won’t inexorably lead to a simple state—like one where the AIs are extinct, or have to keep looping doing the same thing forever. And there may be cases where one can readily see that some set of principles will lead to such outcomes. But most of the time, computational irreducibility (here in the form of things like the halting problem) will once again get in the way, and one won’t be able to tell what will happen, or successfully pick “viable principles” this way.

\n

So this means that there are going to be a wide range of principles that we could in theory pick. But presumably what we’ll want is to pick ones that make AIs give us humans some sort of “good time”, whatever that might mean.

\n

And a minimal idea might be to get AIs just to observe what we humans do, and then somehow imitate this. But most people wouldn’t consider this the right thing. They’d point out all the “bad” things people do. And they’d perhaps say “let’s have the AIs follow not what we actually do, but what we aspire to do”.

\n

But where should we get these aspirations from? Different people, and different cultures, can have very different aspirations—with very different resulting principles. So whose should we pick? And, yes, there are pitifully few—if any—principles that we truly find in common everywhere. (Though, for example, the major religions all tend to share things like respect for human life, the Golden Rule, etc.)

\n

But do we in fact have to pick one set of principles? Maybe some AIs can have some principles, and some can have others. Maybe it should be like different countries, or different online communities: different principles for different groups or in different places.

\n

Right now that doesn’t seem plausible, because technological and commercial forces have tended to make it seem as if powerful AIs always have to be centralized. But I expect that this is just a feature of the present time, and not something intrinsic to any “human-like” AI.

\n

So could everyone (and maybe every organization) have “their own AI” with its own principles? For some purposes this might work OK. But there are many situations where AIs (or people) can’t really act independently, and where there have to be “collective decisions” made.

\n

Why is this? In some cases it’s because everyone is in the same physical environment. In other cases it’s because if there’s to be social cohesion—of the kind needed to support even something like a language that’s useful for communication—then there has to be certain conceptual alignment.

\n

It’s worth pointing out, though, that at some level having a “collective conclusion” is effectively just a way of introducing certain computational reducibility to make it “easier to see what to do”. And potentially it can be avoided if one has enough computation capability. For example, one might assume that there has to be a collective conclusion about which side of the road cars should drive on. But that wouldn’t be true if every car had the computation capability to just compute a trajectory that would for example optimally weave around other cars using both sides of the road.

\n

But if we humans are going to be in the loop, we presumably need a certain amount of computational reducibility to make our world sufficiently comprehensible to us that we can operate in it. So that means there’ll be collective—“societal”—decisions to make. We might want to just tell the AIs to “make everything as good as it can be for us”. But inevitably there will be tradeoffs. Making a collective decision one way might be really good for 99% of people, but really bad for 1%; making it the other way might be pretty good for 60%, but pretty bad for 40%. So what should the AI do?

\n

And, of course, this is a classic problem of political philosophy, and there’s no “right answer”. And in reality the setup won’t be as clean as this. It may be fairly easy to work out some immediate effects of different courses of action. But inevitably one will eventually run into computational irreducibility—and “unintended consequences”—and so one won’t be able to say with certainty what the ultimate effects (good or bad) will be.

\n

But, OK, so how should one actually make collective decisions? There’s no perfect answer, but in the world today, democracy in one form or another is usually viewed as the best option. So how might AI affect democracy—and perhaps improve on it? Let’s assume first that “humans are still in charge”, so that it’s ultimately their preferences that matter. (And let’s also assume that humans are more or less in their “current form”: unique and unreplicable discrete entities that believe they have independent minds.)

\n

The basic setup for current democracy is computationally quite simple: discrete votes (or perhaps rankings) are given (sometimes with weights of various kinds), and then numerical totals are used to determine the winner (or winners). And with past technology this was pretty much all that could be done. But now there are some new elements. Imagine not casting discrete votes, but instead using computational language to write a computational essay to describe one’s preferences. Or imagine having a conversation with a linguistically enabled AI that can draw out and debate one’s preferences, and eventually summarize them in some kind of feature vector. Then imagine feeding computational essays or feature vectors from all “voters” to some AI that “works out the best thing to do”.

\n

Well, there are still the same political philosophy issues. It’s not like 60% of people voted for A and 40% for B, so one chose A. It’s much more nuanced. But one still won’t be able to make everyone happy all the time, and one has to have some base principles to know what to do about that.

\n

And there’s a higher-order problem in having an AI “rebalance” collective decisions all the time based on everything it knows about people’s detailed preferences (and perhaps their actions too): for many purposes—like us being able to “keep track of what’s going on”—it’s important to maintain consistency over time. But, yes, one could deal with this by having the AI somehow also weigh consistency in figuring out what to do.

\n

But while there are no doubt ways in which AI can “tune up” democracy, AI doesn’t seem—in and of itself—to deliver any fundamentally new solution for making collective decisions, and for governance in general.

\n

And indeed, in the end things always seem to come down to needing some fundamental set of principles about how one wants things to be. Yes, AIs can be the ones to implement these principles. But there are many possibilities for what the principles could be. And—at least if we humans are “in charge”—we’re the ones who are going to have to come up with them.

\n

Or, in other words, we need to come up with some kind of “AI constitution”. Presumably this constitution should basically be written in precise computational language (and, yes, we’re trying to make it possible for the Wolfram Language to be used), but inevitably (as yet another consequence of computational irreducibility) there’ll be “fuzzy” definitions and distinctions, that will rely on things like examples, “interpolated” by systems like neural nets. Maybe when such a constitution is created, there’ll be multiple “renderings” of it, which can all be applied whenever the constitution is used, with some mechanism for picking the “overall conclusion”. (And, yes, there’s potentially a certain “observer-dependent” multicomputational character to this.)

\n

But whatever its detailed mechanisms, what should the AI constitution say? Different people and groups of people will definitely come to different conclusions about it. And presumably—just as there are different countries, etc. today with different systems of laws—there’ll be different groups that want to adopt different AI constitutions. (And, yes, the same issues about collective decision making apply again when those AI constitutions have to interact.)

\n

But given an AI constitution, one has a base on which AIs can make decisions. And on top of this one imagines a huge network of computational contracts that are autonomously executed, essentially to “run the world”.

\n

And this is perhaps one of those classic “what could possibly go wrong?” moments. An AI constitution has been agreed on, and now everything is being run efficiently and autonomously by AIs that are following it. Well, once again, computational irreducibility rears its head. Because however carefully the AI constitution is drafted, computational irreducibility implies that one won’t be able to foresee all its consequences: “unexpected” things will always happen—and some of them will undoubtedly be things “one doesn’t like”.

\n

In human legal systems there’s always a mechanism for adding “patches”—filling in laws or precedents that cover new situations that have come up. But if everything is being autonomously run by AIs there’s no room for that. Yes, we as humans might characterize “bad things that happen” as “bugs” that could be fixed by adding a patch. But the AI is just supposed to be operating—essentially axiomatically—according to its constitution, so it has no way to “see that it’s a bug”.

\n

Similar to what we discussed above, there’s an interesting analogy here with human law versus natural law. Human law is something we define and can modify. Natural law is something the universe just provides us (notwithstanding the issues about observers discussed above). And by “setting an AI constitution and letting it run” we’re basically forcing ourselves into a situation where the “civilization of the AIs” is some “independent stratum” in the world, that we essentially have to take as it is, and adapt to.

\n

Of course, one might wonder if the AI constitution could “automatically evolve”, say based on what’s actually seen to happen in the world. But one quickly returns to the exact same issues of computational irreducibility, where one can’t predict whether the evolution will be “right”, etc.

\n

So far, we’ve assumed that in some sense “humans are in charge”. But at some level that’s an issue for the AI constitution to define. It’ll have to define whether AIs have “independent rights”—just like humans (and, in many legal systems, some other entities too). Closely related to the question of independent rights for AIs is whether an AI can be considered autonomously “responsible for its actions”—or whether such responsibility must always ultimately rest with the (presumably human) creator or “programmer” of the AI.

\n

Once again, computational irreducibility has something to say. Because it implies that the behavior of the AI can go “irreducibly beyond” what its programmer defined. And in the end (as we discussed above) this is the same basic mechanism that allows us humans to effectively have “free will” even when we’re ultimately operating according to deterministic underlying natural laws. So if we’re going to claim that we humans have free will, and can be “responsible for our actions” (as opposed to having our actions always “dictated by underlying laws”) then we’d better claim the same for AIs.

\n

So just as a human builds up something irreducible and irreplaceable in the course of their life, so can an AI. As a practical matter, though, AIs can presumably be backed up, copied, etc.—which isn’t (yet) possible for humans. So somehow their individual instances don’t seem as valuable, even if the “last copy” might still be valuable. As humans, we might want to say “those AIs are something inferior; they shouldn’t have rights”. But things are going to get more entangled. Imagine a bot that no longer has an identifiable owner but that’s successfully befriending people (say on social media), and paying for its underlying operation from donations, ads, etc. Can we reasonably delete that bot? We might argue that “the bot can feel no pain”—but that’s not true of its human friends. But what if the bot starts doing “bad” things? Well, then we’ll need some form of “bot justice”—and pretty soon we’ll find ourselves building a whole human-like legal structure for the AIs.

\n

So Will It End Badly?

\n

OK, so AIs will learn what they can from us humans, then they’ll fundamentally just be running as autonomous computational systems—much like nature runs as an autonomous computational system—sometimes “interacting with us”. What will they “do to us”? Well, what does nature “do to us”? In a kind of animistic way, we might attribute intentions to nature, but ultimately it’s just “following its rules” and doing what it does. And so it will be with AIs. Yes, we might think we can set things up to determine what the AIs will do. But in the end—insofar as the AIs are really making use of what’s possible in the computational universe—there’ll inevitably be computational irreducibility, and we won’t be able to foresee what will happen, or what consequences it will have.

\n

So will the dynamics of AIs in fact have “bad” effects—like, for example, wiping us out? Well, it’s perfectly possible nature could wipe us out too. But one has the feeling that—extraterrestrial “accidents” aside—the natural world around us is at some level enough in some kind of “equilibrium” that nothing too dramatic will happen. But AIs are something new. So maybe they’ll be different.

\n

And one possibility might be that AIs could “improve themselves” to produce a single “apex intelligence” that would in a sense dominate everything else. But here we can see computational irreducibility as coming to the rescue. Because it implies that there can never be a “best at everything” computational system. It’s a core result of the emerging field of metabiology: that whatever “achievement” you specify, there’ll always be a computational system somewhere out there in the computational universe that will exceed it. (A simple example is that there’s always a Turing machine that can be found that will exceed any upper bound you specify on the time it takes to halt.)

\n

So what this means is that there’ll inevitably be a whole “ecosystem” of AIs—with no single winner. Of course, while that might be an inevitable final outcome, it might not be what happens in the shorter term. And indeed the current tendency to centralize AI systems has a certain danger of AI behavior becoming “unstabilized” relative to what it would be with a whole ecosystem of “AIs in equilibrium”.

\n

And in this situation there’s another potential concern as well. We humans are the product of a long struggle for life played out over the course of the history of biological evolution. And insofar as AIs inherit our attributes we might expect them to inherit a certain “drive to win”—perhaps also against us. And perhaps this is where the AI constitution becomes important: to define a “contract” that supersedes what AIs might “naturally” inherit from effectively observing our behavior. Eventually we can expect the AIs to “independently reach equilibrium”. But in the meantime, the AI constitution can help break their connection with our “competitive” history of biological evolution.

\n

Preparing for an AI World

\n

We’ve talked quite a bit about the ultimate future course of AIs, and their relation to us humans. But what about the short term? How today can we prepare for the growing capabilities and uses of AIs?

\n

As has been true throughout history, people who use tools tend to do better than those who don’t. Yes, you can go on doing by direct human effort what has now been successfully automated, but except in rare cases you’ll increasingly be left behind. And what’s now emerging is an extremely powerful combination of tools: neural-net-style AI for “immediate human-like tasks”, along with computational language for deeper access to the computational universe and computational knowledge.

\n

So what should people do with this? The highest leverage will come from figuring out new possibilities—things that weren’t possible before but have now “come into range” as a result of new capabilities. And as we discussed above, this is a place where we humans are inevitably central contributors—because we’re the ones who must define what we consider has value for us.

\n

So what does this mean for education? What’s worth learning now that so much has been automated? I think the fundamental answer is how to think as broadly and deeply as possible—calling on as much knowledge and as many paradigms as possible, and particularly making use of the computational paradigm, and ways of thinking about things that directly connect with what computation can help with.

\n

In the course of human history a lot of knowledge has been accumulated. But as ways of thinking have advanced, it’s become unnecessary to learn directly that knowledge in all its detail: instead one can learn things at a higher level, abstracting out many of the specific details. But in the past few decades something fundamentally new has come on the scene: computers and the things they enable.

\n

For the first time in history, it’s become realistic to truly automate intellectual tasks. The leverage this provides is completely unprecedented. And we’re only just starting to come to terms with what it means for what and how we should learn. But with all this new power there’s a tendency to think something must be lost. Surely it must still be worth learning all those intricate details—that people in the past worked so hard to figure out—of how to do some mathematical calculation, even though Mathematica has been able to do it automatically for more than a third of a century?

\n

And, yes, at the right time it can be interesting to learn those details. But in the effort to understand and best make use of the intellectual achievements of our civilization, it makes much more sense to leverage the automation we have, and treat those calculations just as “building blocks” that can be put together in “finished form” to do whatever it is we want to do.

\n

One might think this kind of leveraging of automation would just be important for “practical purposes”, and for applying knowledge in the real world. But actually—as I have personally found repeatedly to great benefit over the decades—it’s also crucial at a conceptual level. Because it’s only through automation that one can get enough examples and experience that one’s able to develop the intuition needed to reach a higher level of understanding.

\n

Confronted with the rapidly growing amount of knowledge in the world there’s been a tremendous tendency to assume that people must inevitably become more and more specialized. But with increasing success in the automation of intellectual tasks—and what we might broadly call AI—it becomes clear there’s an alternative: to make more and more use of this automation, so people can operate at a higher level, “integrating” rather than specializing.

\n

And in a sense this is the way to make the best use of our human capabilities: to let us concentrate on setting the “strategy” of what we want to do—delegating the details of how to do it to automated systems that can do it better than us. But, by the way, the very fact that there’s an AI that knows how to do something will no doubt make it easier for humans to learn how to do it too. Because—although we don’t yet have the complete story—it seems inevitable that with modern techniques AIs will be able to successfully “learn how people learn”, and effectively present things an AI “knows” in just the right way for any given person to absorb.

\n

So what should people actually learn? Learn how to use tools to do things. But also learn what things are out there to do—and learn facts to anchor how you think about those things. A lot of education today is about answering questions. But for the future—with AI in the picture—what’s likely to be more important is to learn how to ask questions, and how to figure out what questions are worth asking. Or, in effect, how to lay out an “intellectual strategy” for what to do.

\n

And to be successful at this, what’s going to be important is breadth of knowledge—and clarity of thinking. And when it comes to clarity of thinking, there’s again something new in modern times: the concept of computational thinking. In the past we’ve had things like logic, and mathematics, as ways to structure thinking. But now we have something new: computation.

\n

Does that mean everyone should “learn to program” in some traditional programming language? No. Traditional programming languages are about telling computers what to do in their terms. And, yes, lots of humans do this today. But it’s something that’s fundamentally ripe for direct automation (as examples with ChatGPT already show). And what’s important for the long term is something different. It’s to use the computational paradigm as a structured way to think not about the operation of computers, but about both things in the world and abstract things.

\n

And crucial to this is having a computational language: a language for expressing things using the computational paradigm. It’s perfectly possible to express simple “everyday things” in plain, unstructured natural language. But to build any kind of serious “conceptual tower” one needs something more structured. And that’s what computational language is about.

\n

One can see a rough historical analog in the development of mathematics and mathematical thinking. Up until about half a millennium ago, mathematics basically had to be expressed in natural language. But then came mathematical notation—and from it a more streamlined approach to mathematical thinking, that eventually made possible all the various mathematical sciences. And it’s now the same kind of thing with computational language and the computational paradigm. Except that it’s a much broader story, in which for basically every field or occupation “X” there’s a “computational X” that’s emerging.

\n

In a sense the point of computational language (and all my efforts in the development of the Wolfram Language) is to be able to let people get “as automatically as possible” to computational X—and to let people express themselves using the full power of the computational paradigm.

\n

Something like ChatGPT provides “human-like AI” in effect by piecing together existing human material (like billions of words of human-written text). But computational language lets one tap directly into computation—and gives the ability to do fundamentally new things, that immediately leverage our human capabilities for defining intellectual strategy.

\n

And, yes, while traditional programming is likely to be largely obsoleted by AI, computational language is something that provides a permanent bridge between human thinking and the computational universe: a channel in which the automation is already done in the very design (and implementation) of the language—leaving in a sense an interface directly suitable for humans to learn, and to use as a basis to extend their thinking.

\n

But, OK, what about the future of discovery? Will AIs take over from us humans in, for example, “doing science”? I, for one, have used computation (and many things one might think of as AI) as a tool for scientific discovery for nearly half a century. And, yes, many of my discoveries have in effect been “made by computer”. But science is ultimately about connecting things to human understanding. And so far it’s taken a human to knit what the computer finds into the whole web of human intellectual history.

\n

One can certainly imagine, though, that an AI—even one rather like ChatGPT—could be quite successful in taking a “raw computational discovery” and “explaining” how it might relate to existing human knowledge. One could also imagine that the AI would be successful at identifying what aspects of some system in the world could be picked out to describe in some formal way. But—as is typical for the process of modeling in general—a key step is to decide “what one cares about”, and in effect in what direction to go in extending one’s science. And this—like so much else—is inevitably tied into the specifics of the goals we humans set ourselves.

\n

In the emerging AI world there are plenty of specific skills that won’t make sense for (most) humans to learn—just as today the advance of automation has obsoleted many skills from the past. But—as we’ve discussed—we can expect there to “be a place” for humans. And what’s most important for us humans to learn is in effect how to pick “where next to go”—and where, out of all the infinite possibilities in the computational universe, we should take human civilization.

\n

Afterword: Looking at Some Actual Data

\n

OK, so we’ve talked quite a bit about what might happen in the future. But what about actual data from the past? For example, what’s been the actual history of the evolution of jobs? Conveniently, in the US, the Census Bureau has records of people’s occupations going back to 1850. Of course, many job titles have changed since then. Switchmen (on railroads), chainmen (in surveying) and sextons (in churches) aren’t really things anymore. And telemarketers, aircraft pilots and web developers weren’t things in 1850. But with a bit of effort, it’s possible to more or less match things up—at least if one aggregates into large enough categories.

\n

So here are pie charts of different job categories at 50-year intervals:

\n
\n
\n
\n

\n

And, yes, in 1850 the US was firmly an agricultural economy, with just over half of all jobs being in agriculture. But as agriculture got more efficient—with the introduction of machinery, irrigation, better seeds, fertilizers, etc.—the fraction dropped dramatically, to just a few percent today.

\n

After agriculture, the next biggest category back in 1850 was construction (along with other real-estate-related jobs, mainly maintenance). And this is a category that for a century and a half hasn’t changed much in size (at least so far), presumably because, even though there’s been greater automation, this has just allowed buildings to be more complex.

\n

Looking at the pie charts above, we can see a clear trend towards greater diversification in jobs (and indeed the same thing is seen in the development of other economies around the world). It’s an old theory in economics that increasing specialization is related to economic growth, but from our point of view here, we might say that the very possibility of a more complex economy, with more niches and jobs, is a reflection of the inevitable presence of computational irreducibility, and the complex web of pockets of computational reducibility that it implies.

\n

Beyond the overall distribution of job categories, we can also look at trends in individual categories over time—with each one in a sense providing a certain window onto history:

\n
\n
\n

\n

One can definitely see cases where the number of jobs decreases as a result of automation. And this happens not only in areas like agriculture and mining, but also for example in finance (fewer clerks and bank tellers), as well as in sales and retail (online shopping). Sometimes—as in the case of manufacturing—there’s a decrease of jobs partly because of automation, and partly because the jobs move out of the US (mainly to countries with lower labor costs).

\n

There are cases—like military jobs—where there are clear “exogenous” effects. And then there are cases like transportation+logistics where there’s a steady increase for more than half a century as technology spreads and infrastructure gets built up—but then things “saturate”, presumably at least partly as a result of increased automation. It’s a somewhat similar story with what I’ve called “technical operations”—with more “tending to technology” needed as technology becomes more widespread.

\n

Another clear trend is an increase in job categories associated with the world becoming an “organizationally more complicated place”. Thus we see increases in management, as well as administration, government, finance and sales (which all have recent decreases as a result of computerization). And there’s also a (somewhat recent) increase in legal.

\n

Other areas with increases include healthcare, engineering, science and education—where “more is known and there’s more to do” (as well as there being increased organizational complexity). And then there’s entertainment, and food+hospitality, with increases that one might attribute to people leading (and wanting) “more complex lives”. And, of course, there’s information technology which takes off from nothing in the mid-1950s (and which had to be rather awkwardly grafted into the data we’re using here).

\n

So what can we conclude? The data seems quite well aligned with what we discussed in more general terms above. Well-developed areas get automated and need to employ fewer people. But technology also opens up new areas, which employ additional people. And—as we might expect from computational irreducibility—things generally get progressively more complicated, with additional knowledge and organizational structure opening up more “frontiers” where people are needed. But even though there are sometimes “sudden inventions”, it still always seems to take decades (or effectively a generation) for there to be any dramatic change in the number of jobs. (The few sharp changes visible in the plots seem mostly to be associated with specific economic events, and—often related—changes in government policies.)

\n

But in addition to the different jobs that get done, there’s also the question of how individual people spend their time each day. And—while it certainly doesn’t live up to my own (rather extreme) level of personal analytics—there’s a certain amount of data on this that’s been collected over the years (by getting time diaries from randomly sampled people) in the American Heritage Time Use Study. So here, for example, are plots based on this survey for how the amount of time spent on different broad activities has varied over the decades (the main line shows the mean—in hours—for each activity; the shaded areas indicate successive deciles):

\n
\n
\n

\n

And, yes, people are spending more time on “media & computing”, some mixture of watching TV, playing videogames, etc. Housework, at least for women, takes less time, presumably mostly as a result of automation (appliances, etc.). (“Leisure” is basically “hanging out” as well as hobbies and social, cultural, sporting events, etc.; “Civic” includes volunteer, religious, etc. activities.)

\n

If one looks specifically at people who are doing paid work

\n
\n
\n

\n

one notices several things. First, the average number of hours worked hasn’t changed much in half a century, though the distribution has broadened somewhat. For people doing paid work, media & computing hasn’t increased significantly, at least since the 1980s. One category in which there is systematic increase (though the total time still isn’t very large) is exercise.

\n

What about people who—for one reason or another—aren’t doing paid work? Here are corresponding results in this case:

\n
\n
\n

\n

Not so much increase in exercise (though the total times are larger to begin with), but now a significant increase in media & computing, with the average recently reaching nearly 6 hours per day for men—perhaps as a reflection of “more of life going online”.

\n

But looking at all these results on time use, I think the main conclusion that over the past half century, the ways people (at least in the US) spend their time have remained rather stable—even as we’ve gone from a world with almost no computers to a world in which there are more computers than people.

\n", - "category": "Artificial Intelligence", - "link": "https://writings.stephenwolfram.com/2023/03/will-ais-take-all-our-jobs-and-end-human-history-or-not-well-its-complicated/", - "creator": "Stephen Wolfram", - "pubDate": "Thu, 16 Mar 2023 01:41:02 +0000", - "enclosure": "", - "enclosureType": "", - "image": "", - "id": "", - "language": "en", - "folder": "", - "feed": "wolfram", - "read": false, - "favorite": false, - "created": false, - "tags": [], - "hash": "01ae62a7a2d11bc234877631f5f25b58", - "highlights": [] - }, { "title": "What Is ChatGPT Doing … and Why Does It Work?", "description": "\"\"See also: “Wolfram|Alpha as the Way to Bring Computational Knowledge Superpowers to ChatGPT” »A discussion about the history of neural nets » It’s Just Adding One Word at a Time That ChatGPT can automatically generate something that reads even superficially like human-written text is remarkable, and unexpected. But how does it do it? And why does it […]", @@ -518,6 +606,72 @@ "image": null, "description": "xkcd.com: A webcomic of romance and math humor.", "items": [ + { + "title": "Daylight Saving Choice", + "description": "\"I", + "content": "\"I", + "category": "", + "link": "https://xkcd.com/2846/", + "creator": "", + "pubDate": "Wed, 25 Oct 2023 04:00:00 -0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "en", + "folder": "", + "feed": "xkcd", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "5ee8ca3fa4e78bba8f92715ce091f4c2", + "highlights": [] + }, + { + "title": "Extinction Mechanisms", + "description": "\"The", + "content": "\"The", + "category": "", + "link": "https://xkcd.com/2845/", + "creator": "", + "pubDate": "Mon, 23 Oct 2023 04:00:00 -0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "en", + "folder": "", + "feed": "xkcd", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "23ea0b91063a5228344c10b8dbab2734", + "highlights": [] + }, + { + "title": "Black Holes vs Regular Holes", + "description": "\"Created", + "content": "\"Created", + "category": "", + "link": "https://xkcd.com/2844/", + "creator": "", + "pubDate": "Fri, 20 Oct 2023 04:00:00 -0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "en", + "folder": "", + "feed": "xkcd", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6a25ed57967941544f31d59fe9c9f924", + "highlights": [] + }, { "title": "Professional Oaths", "description": "\"Interpretations", @@ -2951,6 +3105,160 @@ "image": "\n\t", "description": "Upgrade your mind", "items": [ + { + "title": "Comment automatiser un tweet intelligent à partir d’un flux RSS grâce à ChatGPT ?", + "description": "Vous êtes-vous déjà demandé comment rendre votre compte Twitter qui poste vos news de blog, un peu plus « intelligent », ou du moins, un peu moins monotone ? Et bien, aujourd’hui, je vais vous montrer comment faire exactement cela. Dans cette vidéo, on va décortiquer ensemble un script Python qui permet … Suite", + "content": "

\"\"

\n

Vous êtes-vous déjà demandé comment rendre votre compte Twitter qui poste vos news de blog, un peu plus « intelligent », ou du moins, un peu moins monotone ?

\n\n\n\n
\r\n

Et bien, aujourd’hui, je vais vous montrer comment faire exactement cela.

\n\n\n\n

Dans cette vidéo, on va décortiquer ensemble un script Python qui permet de récupérer la dernière news d’un flux RSS, d’en faire un tweet unique grâce à ChatGPT et de poster tout ça sur Twitter. Oui, oui, vous avez bien lu : on va mixer l’automatisation de récupération de news et la magie de l’IA pour pondre des tweets qui ont du sens et de la saveur.

\n\n\n\n

Un grand merci à mes Patreons

\n\n\n\n

Je tenais à remercier du fond du cœur tous mes Patreons qui soutiennent ce genre de projets et permettent de continuer à explorer, à tester et à partager ces connaissances avec vous. Vous êtes les meilleurs ! ❤️

\n\n\n\n

Pour ceux qui sont abonnés Patreon, vous pouvez d’ores et déjà récupérer le code source. Pour les autres, n’hésitez pas à jeter un œil à ma vidéo pour une démo en direct !

\n\n\n\n
\n\n
\n\n\n\n
\r\n

Et en bonus « Rien à voir », un petit morceau de musique :

\n\n\n\n\n", + "category": "Développement", + "link": "https://korben.info/comment-automatiser-un-tweet-intelligent-a-partir-dun-flux-rss-grace-a-chatgpt.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 09:15:25 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "c475bea07c7caa78ed769f438d14c49b", + "highlights": [] + }, + { + "title": "Explorez et optimisez vos images Docker avec Dive", + "description": "Dive est un outil permettant d'analyser et d'optimiser la taille des images Docker. Il facilite la gestion des images pour les développeurs et administrateurs système. Dive prend en charge plusieurs sources d'image, moteurs de conteneurs et est compatible avec diverses plateformes. L'outil peut être intégré au processus d'intégration continue et personnalisé grâce à des raccourcis clavier et fichiers de configuration.", + "content": "

\"\"

\n

Quand on commence à s’intéresser un peu à Docker, tout semble simple et léger, du moins en apparence. D’ailleurs, si vous débutez avec Docker, j’ai fait une vidéo d’initiation pour débutants pour mes Patreons que je vous offre à la fin de cet article.

\n\n\n\n
\r\n

Mais pour qu’une image Docker soit OK, il faut qu’elle ait été un minimum optimisé. Et ce n’est pas forcement instinctif, surtout quand on débute.

\n\n\n\n

C’est pourquoi , je vous présente un outil aussi magique qu’un Fabien Olicard sous Caprisun, qui va non seulement vous permettre de comprendre la structure de vos images Docker de fond en comble, mais également d’optimiser leur taille et de libérer cet espace disque précieux dont on manque tous sur nos ordis. Cet outil c’est Dive.

\n\n\n\n

Imaginez que vous êtes développeur ou administrateur système, et que vous devez régulièrement manipuler et gérer des images Docker. Vous savez qu’il est crucial d’optimiser ces images pour réduire leur taille et ainsi améliorer leur efficacité, mais vous ne savez pas par où commencer. Dive est là pour vous aider ! Avec cet outil, vous pourrez analyser facilement vos images Docker, découvrir les modifications effectuées à l’intérieur chaque couche et optimiser leur taille de manière efficace.

\n\n\n
\n
\"\"
\n\n\n

Tout d’abord, il suffit de remplacer la commande « docker build » par « dive build » pour analyser l’efficacité et l’espace gaspillé de votre image Docker.

\n\n\n\n
dive <tag/id/digest de votre image>
\n\n\n\n
\r\n

Dive prend en charge plusieurs sources d’image et moteurs de conteneurs (à l’heure actuelle, Docker et Podman). Pour l’installation, Dive est disponible pour Ubuntu/Debian, RHEL/Centos, Arch Linux, Mac et Windows.

\n\n\n\n

Pour l’installer sous macOS :

\n\n\n\n
brew install dive
\n\n\n\n

Pour l’installer sous Linux (Ubuntu / Debian) :

\n\n\n\n
export DIVE_VERSION=$(curl -sL \"https://api.github.com/repos/wagoodman/dive/releases/latest\" | grep '\"tag_name\":' | sed -E 's/.*\"v([^\"]+)\".*/\\1/')\n\ncurl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb\n\nsudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb
\n\n\n\n

Intégrer Dive dans votre processus de CI (intégration continue) est également possible en utilisant la variable d’environnement CI=true. Vous pouvez même configurer des règles dans un fichier .dive-ci pour automatiser certaines vérifications et optimisations de vos images Docker.

\n\n\n\n

Naviguer dans Dive est un jeu d’enfant grâce aux raccourcis clavier. Vous pourrez explorer les couches de vos images Docker, filtrer les fichiers, gérer les paramètres spécifiques à chaque couche et personnaliser l’interface utilisateur en créant un fichier de configuration.

\n\n\n\n

Pour en savoir plus sur Dive et ses fonctionnalités, je vous invite à consulter le dépôt GitHub officiel ici. Vous y trouverez toutes les informations nécessaires pour maîtriser cet outil fantastique, ainsi que des exemples et des astuces pour optimiser vos images Docker comme un pro.

\n\n\n\n
\r\n

Bonne optimisation à tous !

\n\n\n\n
\n\n
\n", + "category": "Administration Systeme Réseau", + "link": "https://korben.info/explorer-optimiser-images-docker-avec-dive.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "2e0c95cdf661612fcfbf0777a3f90df8", + "highlights": [] + }, + { + "title": "Blocks – La puzzle addictif à essayer de toute urgence !", + "description": "Si vous êtes comme moi, vous appréciez peut-être les jeux qui stimulent l’esprit sans trop se compliquer la tâche. Le genre de petits casse-têtes qui font travailler les méninges tout en offrant un moment de détente par exemple le fameux jeu « Gagne Ton Papa » , avec lequel je m’amuse beaucoup, … Suite", + "content": "

\"\"

\n

Si vous êtes comme moi, vous appréciez peut-être les jeux qui stimulent l’esprit sans trop se compliquer la tâche. Le genre de petits casse-têtes qui font travailler les méninges tout en offrant un moment de détente par exemple le fameux jeu « Gagne Ton Papa » , avec lequel je m’amuse beaucoup, surtout quand je joue avec des enfants.

\n\n\n\n
\r\n

C’est donc avec bonheur que je suis tombé sur Blocks, un nouveau jeu en ligne qui a su me rendra accro pendant un petit moment. Sa conception épurée rend l’expérience de jeu encore plus sympa.

\n\n\n
\n
\"\"
\n\n\n

Le principe du jeu est fondamentalement simple : on vous présente diverses figures géométriques, et votre défi est de les agencer correctement pour former un carré parfait. Cela peut sembler facile au début, mais ne vous y trompez pas ! Les 60 niveaux proposés augmentent progressivement en difficulté, ajoutant des couches de complexité à mesure que vous progressez.

\n\n\n\n

L’interface minimaliste permet aux joueurs de se concentrer entièrement sur le puzzle, éliminant toute distraction inutile et vous avez même de la musique sympa pour vous accompagner.

\n\n\n
\n
\"\"
\n\n\n

Bref, la beauté de Blocks réside dans sa capacité à offrir un équilibre parfait entre la détente et le défi cérébral. Que vous ayez quelques minutes à perdre en attendant un rendez-vous, ou que vous cherchiez un moyen d’échapper à la monotonie du travail, Blocks est l’outil idéal pour vous vider l’esprit tout en vous amusant.

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/blocks-la-puzzle-addictif-a-essayer-de-toute-urgence.html", + "creator": "Korben", + "pubDate": "Wed, 25 Oct 2023 06:13:50 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "ff679bfa2b58ad400d1d5e432828fd27", + "highlights": [] + }, + { + "title": "Légende de Super Mario – Un hack Zelda pour sauver le Royaume Champignon", + "description": "Ah, mes amis, découvrez un hack de The Legend of Zelda dans l'univers de Super Mario, nommé \"Légende de Super Mario - Sauvez le Royaume Champignon\". Incarnez Mario pour trouver les Starmen et sauver le Royaume Champignon de la tyrannie de Bowser. Mêlant exploration de Zelda et fun de Super Mario, redécouvrez ces deux franchises légendaires dans une expérience de jeu unique.", + "content": "

\"\"

\n

J’ai déniché pour vous une pépite qui ravira les fans de retrogaming et les nostalgiques de la grande époque des consoles 8-bits : un hack de The Legend of Zelda qui vous replonge dans l’univers de… Super Mario !

\n\n\n\n
\r\n

Vous vous souvenez de ces soirées passées à essayer de sauver la princesse Peach des griffes de ce stupide Bowser ?

\n\n\n\n

Et bien, préparez-vous à revivre de palpitants moments avec cette ROM NES custom intitulée « The Legend of Super Mario – Save Mushroom Kingdom (La Légende de Super Mario – Sauvez le Royaume Champignon) » !

\n\n\n
\n
\"\"
\n\n\n

Dans ce hack audacieux, Bowser a encore une fois capturé la Princesse Peach et plongé le Royaume Champignon dans la tyrannie. Évidemment, vous incarnez notre cher Mario, le plombier héroïque, qui doit trouver les Super Stars pour sauver le Royaume. Mais attention, ce ne sera pas une promenade de santé : des affrontements contre des Goombas, des Koopas et d’autres créatures que vous connaissez bien, vous attendront dans votre quête des huit Super Stars.

\n\n\n
\n
\"\"
\n\n\n

Comme vous pouvez l’imaginer, cela donne un mélange explosif entre l’aventure épique de Zelda et le fun déjanté de Super Mario. Vous devrez vous frayer un chemin à travers des donjons remplis d’ennemis et résoudre des énigmes pour avancer dans votre mission de sauvetage. Chaque Super Star trouvée vous rapprochera de la victoire finale et de la libération du Royaume Champignon.

\n\n\n\n
\r\n

Trop coooool, non ?

\n\n\n
\n
\"\"
\n\n
\n
\"\"
\n\n\n

Imaginez toutes les possibilités de gameplay avec cette rom : vous balader dans les niveaux de Super Mario comme on explore une map Zelda, résoudre des énigmes à la manière d’un héros légendaire qui porterait une bonne grosse moustache, et enfin vaincre Bowser pour sauver la princesse et le Royaume Champignon.

\n\n\n\n

Pour ceux qui voudraient essayer ce hack, rendez-vous sur le site : Légende de Super Mario – Sauvez le Royaume Champignon. Vous y trouverez toutes les infos pour vous lancer dans cette aventure épique. Attention cependant, vous aurez besoin d’une copie ROM originale (ah ah !) du jeu NES The Legend of Zelda pour appliquer le hack et ainsi profiter de cette expérience unique.

\n\n\n\n

Pour appliquer le patch, vous pouvez le faire en mode soft-patching directement via l’un de ces émulateurs : RetroArch, Snes9x, VBA où vous devrez ouvrir le jeu + le patch, ou en appliquant directement le patch sur la ROM avec Multipatch pour macOS ou LunarIPS pour Windows.

\n\n\n\n

Enfilez vos bottes de plombier et préparez-vous à explorer le Royaume Champignon comme jamais auparavant !

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/legend-super-mario-sauvez-royaume-champignon-hack-zelda-retrogaming.html", + "creator": "Korben", + "pubDate": "Tue, 24 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "6cad7a904cdd7ca06872f96d6cc0fb83", + "highlights": [] + }, + { + "title": "Revivez l’âge d’or LucasArts avec l’émulateur DREAMM !", + "description": "DREAMM est un émulateur de jeux LucasArts des années 90 pour Windows, MacOS et Linux 64 bits, conçu par Aaron Giles. Il prend en charge plusieurs éditions, langues et versions des jeux SCUMM, GrimE, Star Wars, Indiana Jones et autres. Il nécessite l'installation de libsdl2 et des fichiers ROM MT-32. Pour l'utiliser, ajoutez des jeux via Game Manager, puis configurez et exécutez-les. L'émulateur gère également les contrôles de joystick et permet la mise à niveau de certains jeux.", + "content": "

\"\"

\n

Les amis, laissez-moi vous présenter un logiciel fantastique qui va vous replonger dans les années 90 et raviver vos vieux souvenirs de jeux vidéo.

\n\n\n\n
\r\n

Vous souvenez-vous des aventures de Guybrush Threepwood dans Monkey Island ou des courses folles avec les TIE Fighters de Star Wars ?

\n\n\n\n

Et bien, préparez-vous à revivre ces moments avec DREAMM, un émulateur exclusif aux jeux LucasArts qui vous permettra de rejouer à de nombreux jeux DOS, Windows et FM-Towns identiques aux originaux.

\n\n\n\n

Alors, enfilez votre chapeau d’Indiana Jones et allons voir tout ça !

\n\n\n\n

Créé par Aaron Giles, DREAMM fonctionne sous Windows, macOS et Linux 64 bits avec un support natif pour les processeurs Intel et ARM. Il prend en charge diverses éditions, langues et versions des jeux SCUMM, GrimE, Star Wars, Indiana Jones et autres jeux LucasArts.

\n\n\n\n
\r\n

Vous pouvez télécharger la dernière version de DREAMM en allant sur ce site.

\n\n\n\n

Lorsque vous lancez DREAMM, vous accédez au Game Manager pour ajouter, configurer et exécuter les jeux. L’interface principale montre les icônes des jeux installés, et vous pouvez ajouter de nouveaux jeux à tout moment, sauf pendant une opération d’ajout en cours. Pour configurer et exécuter un jeu, cliquez simplement sur son icône ou naviguez avec les touches fléchées.

\n\n\n
\n
\"\"
\n\n\n

Sélectionnez un jeu et accédez à l’écran de configuration et de lancement, où des informations sur la compatibilité sont disponibles dans la zone d’état. Vous pouvez gérer l’installation en cliquant sur l’onglet MANAGE, où vous pourrez vérifier les fichiers, désinstaller le jeu et accéder aux données pertinentes du jeu.

\n\n\n\n

Avec DREAMM, vous pouvez facilement explorer et configurer les dossiers de jeux, ainsi que les options audio et vidéo. Vous pouvez également contrôler la taille de l’écran du gestionnaire de jeux, basculer entre le mode fenêtré et plein écran et ajuster la taille avec des raccourcis clavier.

\n\n\n\n

DREAMM nécessite les fichiers d’origine pour exécuter un jeu. Il prend en charge les images disque de disquettes (IMG, IMA, VFD) et de CD-ROM (ISO, CUE/BIN, MDS/MDF, CCD/IMG). Pour installer à partir d’images disque, sélectionnez toutes les images et faites-les glisser sur la fenêtre de DREAMM. Si vous possédez les disquettes ou CD-ROM d’origine, vous pouvez également les installer à partir de ces supports. Et si vous n’avez pas les jeux d’origine, sachez qu’il y a des démos sur Archive.org au moins pour tester.

\n\n\n
\n
\"\"
\n\n\n

Lors de l’installation d’un jeu via DREAMM, choisissez le lecteur C: comme cible et laissez l’installateur faire son travail. DREAMM détecte et transfère les jeux installés.

\n\n\n\n
\r\n

DREAMM émule vraiment les jeux au niveau du CPU et nécessite les fichiers exécutables originaux. Son concurrent ScummVM n’émule pas mais est une réécriture complète issu d’un reverse engineering. Donc le rendu n’est pas fidèle aux jeux d’origine, alors qu’avec DREAMM c’est 100% identique à l’expérience que vous avez pu avoir étant jeune. Mais les 2 outils fonctionnent très bien, on est sur du chipotage à ce niveau, il faut bien le reconnaitre.

\n\n\n\n

DREAMM gère également les contrôles de joystick. Utilisez Alt+U⌘U ou F12 pour récupérer le contrôle de la souris si nécessaire.

\n\n\n\n

Voilà, j’espère que ça vous aura donné envie de vous refaire un Indiana Jones ou de replonger dans un bon vieux Sam & Max.

\n", + "category": "Jeu vidéo", + "link": "https://korben.info/dreamm-emulateur-lucasarts-jeux-retro-windows-macos-linux.html", + "creator": "Korben", + "pubDate": "Mon, 23 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "320887c72777b270125ceef849243c2a", + "highlights": [] + }, + { + "title": "Sauvez votre PC avec ESET SysRescue Live, l’anti-malware ultime", + "description": "ESET SysRescue Live est un outil anti-malware sur support amovible, indépendant du système d'exploitation. Il permet d'éliminer les menaces persistantes en accédant directement au disque dur et fichiers système. Utilisé en complément de l'antivirus habituel, il est idéal pour éradiquer les malwares tenaces qui résistent aux méthodes traditionnelles.", + "content": "

\"\"

\n

Ah, la guerre éternelle contre les malwares… Parfois, l’ordinateur fait tellement n’importe quoi, qu’on se demande si on n’a pas chopé un bon vieux virus. Oui, oui, vous vous reconnaissez, ceux qui ne font jamais leurs mises à jour Windows et qui disent en frimant : « Oh moi, j’ai pas besoin d’antivirus, car je sais ce que je fais.« 

\n\n\n\n
\r\n

LOL !

\n\n\n\n

Et bien, aujourd’hui, je vais vous parler d’un super-héros qui pourrait bien vous sauver la vie, enfin, celle de votre ordinateur : ESET SysRescue Live.

\n\n\n\n

Imaginez que vous êtes en train de travailler sur un projet important et, soudain, votre ordinateur commence à agir bizarrement. Les performances ralentissent et vos fichiers deviennent inaccessibles. Vous réalisez que votre ordinateur a été infecté par le dernier malware. Vous essayez tous les logiciels antivirus possibles, mais rien ne semble fonctionner.

\n\n\n\n

Alors, que faire à part m’envoyer un message sur Facebook si vous êtes ma mère ? C’est là qu’ESET SysRescue Live entre en jeu.

\n\n\n\n
\r\n

ESET SysRescue Live est un outil anti-malware qui fonctionne via un support amovible (CD, DVD ou clé USB) et qui peut être utilisé indépendamment du système d’exploitation installé sur votre ordinateur. Ce petit génie peut ainsi éliminer les menaces persistantes en accédant directement au disque dur et aux fichiers système. Compatible avec plusieurs versions de Windows, il est conçu pour analyser et éliminer les menaces à la demande.

\n\n\n
\n
\"\"
\n\n\n

Pour utiliser ESET SysRescue Live, vous devez d’abord télécharger l’image ISO / IMG et la graver sur un CD/DVD ou créer une clé USB bootable. Une fois cela fait, insérez le support amovible et redémarrez votre ordinateur. Assurez-vous que votre ordinateur est configuré pour démarrer depuis le support amovible (vous devrez peut-être accéder aux paramètres du BIOS pour cela).

\n\n\n\n

Une fois ESET SysRescue Live lancé, vous serez accueilli par une interface utilisateur simple et conviviale. L’outil vous proposera de mettre à jour sa base de données de signatures de virus. Il est fortement recommandé de le faire pour assurer une détection optimale des menaces.

\n\n\n
\n
\"\"
\n\n\n

Après la mise à jour, vous pouvez lancer une analyse de votre ordinateur. ESET SysRescue Live offre plusieurs options d’analyse, notamment une analyse rapide, une analyse intelligente et une analyse personnalisée. Les deux premières options analysent les zones les plus couramment infectées, tandis que l’option personnalisée vous permet de choisir les disques et dossiers spécifiques à analyser. Une fois l’analyse terminée, les menaces détectées seront affichées et vous pourrez les supprimer en toute sécurité.

\n\n\n\n

Il est important de noter qu’ESET SysRescue Live n’est pas conçu pour remplacer votre logiciel antivirus habituel. Il est plutôt destiné à être utilisé en complément, en particulier dans les situations où un malware persistant empêche le bon fonctionnement de votre système. Cet outil est idéal pour les situations où vous devez éradiquer un malware tenace qui résiste aux méthodes de suppression traditionnelles.

\n\n\n\n

Vous y trouverez également des utilitaires pratiques comme memtest, Midnight Commander ou Gparted pour ceux qui veulent partitionner leur disque ou augmenter la taille de leurs partitions existantes.

\n\n\n
\n
\"\"
\n\n\n
\r\n

En résumé, ESET SysRescue Live est un outil pratique et puissant pour nettoyer votre ordinateur des menaces persistantes qui refusent de partir ou pour effectuer des petites opérations de maintenance sur l’ordi.

\n", + "category": "Sécurité", + "link": "https://korben.info/eradiquer-malwares-persistants-eset-sysrescue-live.html", + "creator": "Korben", + "pubDate": "Sun, 22 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "c41b775ca689ab0b3ace8cb81157e2b5", + "highlights": [] + }, + { + "title": "Découvrez Godspeed et révolutionnez votre gestion du temps et tâches", + "description": "\"Salut les amis! Aujourd'hui, je vais vous parler de Godspeed, une application géniale pour gérer votre temps et vos tâches. Elle combine simplicité, efficacité et personnalisation avec des fonctionnalités avancées pour organiser et suivre les projets. Vous pouvez personnaliser l'interface avec différents thèmes et couleurs. Inscrivez-vous sur leur site et prenez votre vie en main!\"", + "content": "

\"\"

\n

Salut les gens pressés et très occupés !

\n\n\n\n
\r\n

Aujourd’hui, je vais vous parler d’une application qui va vous soulager mentalement si vous galérer à faire tout ce que vous avez à faire dans la journée voire dans l’année.

\n\n\n\n

Il s’agit de Godspeed ! Pas de panique, je ne vous parle pas de l’expression anglaise qui veut dire « Bon vent » ou « Bonne chance ». Non, ici, je vous parle d’une application géniale qui porte le même nom et qui va révolutionner la façon dont vous gérez votre temps et vos tâches !

\n\n\n\n

Vous pouvez la trouver tout de suite sur le site, Godspeedapp.com.

\n\n\n\n

Qui n’a jamais été submergé par des tâches à réaliser, des rendez-vous à ne pas rater, des projets à gérer et des objectifs à atteindre ? Alors si vous êtes comme moi, vous avez déjà surement essayé plusieurs méthodes de gestion du temps (coucou Pomodoro) et différentes applications, mais aucune n’a vraiment répondu à vos attentes sans vous entrainer dans le burnout.

\n\n\n\n
\r\n

Eh bien, mes amis, je vous annonce que votre quête est enfin terminée ! J’ai testé Godspeed et je peux vous dire qu’elle tient toutes ses promesses.

\n\n\n\n

Alors, pourquoi cette application est-elle si géniale, me direz-vous ?

\n\n\n
\n
\"\"
Ma todo list très occupée du jour
\n\n\n

Tout simplement parce qu’elle allie simplicité, efficacité et personnalisation. Oui, vous avez bien lu. Godspeed vous permet de gérer vos tâches et votre emploi du temps de manière ultra-simple et intuitive. Pas de fonctionnalités inutiles ou compliquées, tout est pensé pour vous faciliter la vie et tout peut se faire au clavier avec des raccourcis bien pensés. Rassurez-vous, y’a un bon petit didacticiel qui vous permettra d’apprendre les raccourcis de base pour vous lancer.

\n\n\n\n

Mais ce n’est pas tout ! Godspeed va encore plus loin en vous proposant des fonctionnalités avancées pour ceux qui souhaitent aller au-delà de la simple gestion de tâches. Par exemple, vous pouvez créer des tâches principales et leur attribuer des sous-tâches pour une organisation encore plus poussée. Vous pouvez également définir des priorités et des échéances pour chaque tâche, histoire de ne plus jamais rater un deadline. Et vous pouvez aussi paramétrer vos tâches pour qu’elles vous soit proposées de manière récurrentes (toutes les semaines par exemple).

\n\n\n\n

Il est également possible d’associer des notes pour chaque tâche et d’y joindre des URLs (de la documentation par exemple) pour ouvrir ensuite ça d’un petit coup de raccourci clavier.

\n\n\n\n

Godspeed est utilisable via son API si vous souhaitez intégrer tout ça dans vos outils comme IFTTT / Zapier, vous pouvez exporter les data au format JSON et vous avez la possibilité de l’utiliser en mode clair ou sombre pour ne pas vous flinguer les yeux.

\n\n\n\n
\r\n

Et pour les puristes, il existe même au sein de Godspeed, un mode « hardcore » pour désactiver la souris et tout faire au clavier tel un pianiste sous amphétamine.

\n\n\n
\n
\"\"
\n\n\n

En conclusion, je ne peux que vous recommander de tester Godspeed si vous êtes à la recherche d’une solution simple et efficace pour gérer votre temps et vos tâches. Que vous soyez un simple utilisateur ou un véritable « power user », vous trouverez forcément votre bonheur avec cette application. Alors, qu’attendez-vous ? Allez, prenez votre vie en main et foncez sur godspeedapp.com ! Vous ne le regretterez pas. Et n’oubliez pas, comme disent nos amis anglophones : « Godspeed » !

\n", + "category": "MacOS", + "link": "https://korben.info/godspeed-application-gestion-temps-taches-revolutionnaire.html", + "creator": "Korben", + "pubDate": "Sat, 21 Oct 2023 07:00:00 +0000", + "enclosure": "", + "enclosureType": "", + "image": "", + "id": "", + "language": "fr", + "folder": "", + "feed": "korben.info", + "read": false, + "favorite": false, + "created": false, + "tags": [], + "hash": "922899c9608a057c1732c0e3519c420a", + "highlights": [] + }, { "title": "BitLocker réduirait jusqu’à 45% vitesse SSD ? – Que faire ?", "description": "Chers lecteurs, BitLocker, intégré à Windows 11 Pro, pourrait ralentir les SSD jusqu'à 45%. Des alternatives comme VeraCrypt sont disponibles, mais peuvent également impacter les performances. Il est important de vérifier le chiffrement utilisé et d'expérimenter pour trouver la meilleure solution pour vos besoins et performances.", diff --git a/.obsidian/plugins/workspaces-plus/data.json b/.obsidian/plugins/workspaces-plus/data.json index fbd6a942..aac6b49d 100644 --- a/.obsidian/plugins/workspaces-plus/data.json +++ b/.obsidian/plugins/workspaces-plus/data.json @@ -6,7 +6,7 @@ "workspaceSettings": false, "systemDarkMode": false, "globalSettings": {}, - "activeWorkspaceDesktop": "blog", + "activeWorkspaceDesktop": "fac", "activeWorkspaceMobile": "", "reloadLivePreview": false, "workspaceSwitcherRibbon": false, diff --git a/.obsidian/snippets/darkmode.css b/.obsidian/snippets/darkmode.css index 28f994b5..8f13ed58 100644 --- a/.obsidian/snippets/darkmode.css +++ b/.obsidian/snippets/darkmode.css @@ -9,11 +9,11 @@ .pdf-viewer>.page, .mm-pdf-container { filter: invert(0.7) - brightness(0.9) + brightness(0.85) contrast(1.6) hue-rotate(180deg) - saturate(200%) - blur(0.5px) /* blur makes the white text less agressive */ + saturate(150%) + /* blur(0.5px) /1* blur makes the white text less agressive *1/ */ ; } /* .mm-highlight { */ diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 1796401b..73a23dd8 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,183 +4,31 @@ "type": "split", "children": [ { - "id": "6420607d187f986d", + "id": "92b1a80c7ae5a2b8", "type": "tabs", "children": [ { - "id": "7e6e0c2ec2f17812", + "id": "9cb392bf4b341a29", "type": "leaf", "pane-relief:history-v1": { - "pos": 0, + "pos": 1, "stack": [ { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "blog/posts/autres/texte étirable.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "8723fbe840ab4431", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "obsidian sequence shortcuts.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "6873dcc4af37d699", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "docstring challenge du 2023-08-13", + "title": "gestion de projet", "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"docstring challenge du 2023-08-13.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":5,\"ch\":16},\"to\":{\"line\":5,\"ch\":16}},\"scroll\":0.2332761578044597}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "blog/posts/informatique/docstring challenges/docstring challenges - 13 août 2023.qmd", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "9347e420dc5b3a95", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "sources/The Advantages of Text-Based Information Versus Videos, Audio or Images.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "51fb259068890339", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "Conseil étudiant.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "2e20d18b95db21ab", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "TDA.couper la parole", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.couper la parole.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":4,\"ch\":0},\"to\":{\"line\":4,\"ch\":0}},\"scroll\":0}" - }, - { - "title": "TDA.parler trop", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.parler trop.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":2,\"ch\":0},\"to\":{\"line\":2,\"ch\":0}}}" - }, - { - "title": "TDA", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"gestion de projet.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", "eState": "{\"cursor\":{\"from\":{\"line\":0,\"ch\":0},\"to\":{\"line\":0,\"ch\":0}}}" }, { - "title": "TDA.parler trop", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.parler trop.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":3,\"ch\":0},\"to\":{\"line\":3,\"ch\":0}},\"scroll\":0}" - }, - { - "title": "TDA.couper la parole", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.couper la parole.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":23,\"ch\":0},\"to\":{\"line\":23,\"ch\":0}},\"scroll\":11.771816157116826}" - }, - { - "title": "TDA.bougeotte", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.bougeotte.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":11,\"ch\":0},\"to\":{\"line\":11,\"ch\":0}},\"scroll\":0}" - }, - { - "title": "TDA", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"TDA.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":8,\"ch\":0},\"to\":{\"line\":8,\"ch\":0}}}" + "state": "{}", + "eState": "{}" } ] }, "state": { "type": "markdown", "state": { - "file": "TDA.parler trop.md", + "file": "note de cadrage du projet.md", "mode": "source", "backlinks": false, "source": false @@ -188,7 +36,7 @@ } }, { - "id": "8af40cbf2184044c", + "id": "a65907065a9d31f7", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -198,17 +46,17 @@ "eState": "{}" }, { - "title": "salaire", + "title": "programmation web serveur", "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"salaire.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":8,\"ch\":4},\"to\":{\"line\":8,\"ch\":4}}}" + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"programmation web serveur.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "eState": "{\"cursor\":{\"from\":{\"line\":13,\"ch\":0},\"to\":{\"line\":13,\"ch\":0}}}" } ] }, "state": { "type": "markdown", "state": { - "file": "le salaire est un rapport de force.md", + "file": "travail de délégué.md", "mode": "source", "backlinks": false, "source": false @@ -216,41 +64,7 @@ } }, { - "id": "7063570c30fc4ba2", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "travail libre - Recherche Google", - "icon": "lucide-file", - "state": "{\"type\":\"surfing-view\",\"state\":{\"url\":\"https://www.google.com/search?q=travail%20libre\"}}", - "eState": "{}" - }, - { - "state": "{\"type\":\"surfing-view\",\"state\":{\"url\":\"https://www.google.com/search?q=travail libre\"}}", - "title": "travail libre - Recherche Google", - "icon": "search", - "eState": "null" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "travail libre contre travail subordonné.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "883eebcbb68557d3", + "id": "f78a03dad612c422", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -264,7 +78,7 @@ "state": { "type": "markdown", "state": { - "file": "l'épargne ne peut pas remplacer les retraites.md", + "file": "stage de licence 3 informatique.md", "mode": "source", "backlinks": false, "source": false @@ -272,29 +86,7 @@ } }, { - "id": "b385d9668d5c96ba", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "anarchie.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "30819a60a3a70174", + "id": "abc28a3f1d6db09b", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -304,121 +96,15 @@ "eState": "{}" }, { - "title": "apprentissage", + "title": "programmation web serveur", "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"blog/posts/autres/apprentissage.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":9,\"ch\":0},\"to\":{\"line\":9,\"ch\":0}},\"scroll\":0.13622291021671826}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "blog/posts/autres/qualification contre compétence.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "805d3bcf1c7abe47", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"programmation web serveur.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "eState": "{\"cursor\":{\"from\":{\"line\":2,\"ch\":0},\"to\":{\"line\":2,\"ch\":0}},\"scroll\":0}" }, { - "title": "quarto blog", + "title": "2023-10-12", "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"quarto blog.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":2,\"ch\":0},\"to\":{\"line\":2,\"ch\":0}}}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "quarto extension collapse-callout.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "10188fb365068f3a", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "post queues", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"post queues.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":0,\"ch\":0},\"to\":{\"line\":0,\"ch\":0}}}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "post queue challenges docstring.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "e8989c205167f9f3", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "films à voir.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "83d8fad282b7d043", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "2023-10-05", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"daily/2023-10-05.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":9,\"ch\":55},\"to\":{\"line\":9,\"ch\":55}}}" - }, - { - "title": "2023-10-23", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"daily/2023-10-23.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"daily/2023-10-12.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", "eState": "{\"cursor\":{\"from\":{\"line\":4,\"ch\":0},\"to\":{\"line\":4,\"ch\":0}}}" } ] @@ -426,15 +112,197 @@ "state": { "type": "markdown", "state": { - "file": "daily/2023-10-23.md", + "file": "Projet web serveur.md", "mode": "source", "backlinks": false, "source": false } } + }, + { + "id": "7c810d97b04a1d9b", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_ch0.pdf" + } + } + }, + { + "id": "5a06cb7b58dc8acd", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2.pdf\"}}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2-annotate", + "icon": "blocks", + "state": "{\"type\":\"mindmapview\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2-annotate.md\"}}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2.pdf\"}}", + "eState": "{}" + }, + { + "title": "L3_info_statistiques_TD0", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S5/L3_info_statistiques_TD0.pdf\"}}", + "eState": "{}" + }, + { + "title": "projet gestion et simulation d'entreprise", + "icon": "lucide-file", + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"projet gestion et simulation d'entreprise.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "eState": "{\"cursor\":{\"from\":{\"line\":6,\"ch\":23},\"to\":{\"line\":6,\"ch\":23}},\"scroll\":0}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" + } + } + }, + { + "id": "9c1ba20a2fc32231", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "excalidraw", + "state": { + "file": "Excalidraw/révisions statistiques notes.excalidraw.md" + } + } } ], - "currentTab": 14 + "currentTab": 5 + }, + { + "id": "7178ce0a6b8bca49", + "type": "tabs", + "children": [ + { + "id": "04a1613aa6b43843", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "markdown", + "state": { + "file": "projet gestion et simulation d'entreprise.md", + "mode": "source", + "backlinks": false, + "source": false + } + } + }, + { + "id": "36c6524ff4a86d95", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf" + } + } + }, + { + "id": "2e023f0f2d7db437", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "markdown", + "state": { + "file": "Statistiques révisions.md", + "mode": "source", + "backlinks": false, + "source": false + } + } + }, + { + "id": "d76933b614efca24", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + }, + { + "title": "révisions statistiques notes.excalidraw", + "icon": "excalidraw-icon", + "state": "{\"type\":\"excalidraw\",\"state\":{\"file\":\"Excalidraw/révisions statistiques notes.excalidraw.md\"}}", + "eState": "{}" + } + ] + }, + "state": { + "type": "mindmapview", + "state": { + "file": "r.md" + } + } + } + ], + "currentTab": 2 } ], "direction": "vertical" @@ -446,7 +314,6 @@ { "id": "a3e04033addcedcd", "type": "tabs", - "dimension": 65.11111111111111, "children": [ { "id": "407c81c708328992", @@ -482,7 +349,7 @@ "state": { "type": "search", "state": { - "query": "tag:#science", + "query": "tag:#citation", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -511,6 +378,25 @@ } } }, + { + "id": "57113fd1edfc5008", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "all-properties", + "state": { + "sortOrder": "frequency" + } + } + }, { "id": "34a73362daed0f65", "type": "leaf", @@ -546,7 +432,7 @@ } }, { - "id": "2fce7b9c83102582", + "id": "ea9ae28999c66714", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -558,7 +444,7 @@ ] }, "state": { - "type": "surfing-tab-tree", + "type": "RSS_FEED", "state": {} } }, @@ -578,85 +464,13 @@ "type": "QUICKSHARE_SIDE_VIEW", "state": {} } - }, - { - "id": "8711edc0eb841f5f", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "RSS_FEED", - "state": {} - } } - ], - "currentTab": 1 - }, - { - "id": "d392c3e654e7953f", - "type": "tabs", - "dimension": 34.88888888888889, - "children": [ - { - "id": "c7afda8b81d643de", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "outgoing-link", - "state": { - "file": "daily/2023-10-23.md", - "linksCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "e855affa02bb755e", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "backlink", - "state": { - "file": "daily/2023-10-23.md", - "collapseAll": true, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": false - } - } - } - ], - "currentTab": 1 + ] } ], "direction": "horizontal", - "width": 438.5 + "width": 421.5, + "collapsed": true }, "right": { "id": "1102f19b896c7a16", @@ -665,7 +479,7 @@ { "id": "980f845ab893296e", "type": "tabs", - "dimension": 62.55555555555555, + "dimension": 50.222222222222214, "children": [ { "id": "9ae2ad8ad7426276", @@ -682,11 +496,11 @@ "state": { "type": "localgraph", "state": { - "file": "daily/2023-10-23.md", + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", "options": { - "collapse-filter": false, + "collapse-filter": true, "search": "", - "localJumps": 2, + "localJumps": 1, "localBacklinks": true, "localForelinks": true, "localInterlinks": false, @@ -700,17 +514,144 @@ "textFadeMultiplier": 0, "nodeSizeMultiplier": 1, "lineSizeMultiplier": 1, - "collapse-forces": true, - "centerStrength": 0.518713248970312, - "repelStrength": 10, + "collapse-forces": false, + "centerStrength": 0.907958984375, + "repelStrength": 3.17789713541667, "linkStrength": 1, - "linkDistance": 250, - "scale": 0.9346552651840669, + "linkDistance": 30, + "scale": 1.7404359846795439, "close": true } } } }, + { + "id": "b1de0ab08674d879", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "calendar", + "state": {} + } + }, + { + "id": "8d8d223c8b48a4c7", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "markdown", + "state": { + "file": "devoirs à faire.md", + "mode": "source", + "backlinks": false, + "source": false + } + } + }, + { + "id": "d45511af0bde9bcf", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "advanced-tables-toolbar", + "state": {} + } + }, + { + "id": "309f8009b1cc52b3", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "custom-frames-detexify", + "state": {} + } + }, + { + "id": "6546c4a93179e5a5", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "file-properties", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" + } + } + }, + { + "id": "f4f2463736d8bce0", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "outline", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" + } + } + }, + { + "id": "6c1bad9f0a9e1fe6", + "type": "leaf", + "state": { + "type": "tasks_timeline_view", + "state": {} + } + } + ], + "currentTab": 7 + }, + { + "id": "a739497ed8e21a5c", + "type": "tabs", + "dimension": 49.777777777777786, + "children": [ { "id": "a05eecb7dce21915", "type": "leaf", @@ -746,7 +687,7 @@ } }, { - "id": "b1de0ab08674d879", + "id": "c7afda8b81d643de", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -758,31 +699,16 @@ ] }, "state": { - "type": "calendar", - "state": {} - } - }, - { - "id": "e8e83f68ba3e5595", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "outline", + "type": "outgoing-link", "state": { - "file": "daily/2023-10-23.md" + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", + "linksCollapsed": false, + "unlinkedCollapsed": true } } }, { - "id": "dc0ef97f79a5ce93", + "id": "e855affa02bb755e", "type": "leaf", "pane-relief:history-v1": { "pos": 0, @@ -794,117 +720,25 @@ ] }, "state": { - "type": "all-properties", + "type": "backlink", "state": { - "sortOrder": "frequency" + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", + "collapseAll": true, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": false } } - }, - { - "id": "f67bb62d9dfb7d90", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "file-properties", - "state": { - "file": "daily/2023-10-23.md" - } - } - }, - { - "id": "e0374b2f0057269f", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "tasks_timeline_view", - "state": {} - } - } - ], - "currentTab": 7 - }, - { - "id": "3b58d11fec2fca87", - "type": "tabs", - "dimension": 37.44444444444445, - "children": [ - { - "id": "8d8d223c8b48a4c7", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "devoirs à faire.md", - "mode": "preview", - "backlinks": false, - "source": false - } - } - }, - { - "id": "309f8009b1cc52b3", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "custom-frames-detexify", - "state": {} - } - }, - { - "id": "d45511af0bde9bcf", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "advanced-tables-toolbar", - "state": {} - } } ] } ], "direction": "horizontal", - "width": 424.5 + "width": 385.5, + "collapsed": true }, "left-ribbon": { "hiddenItems": { @@ -929,47 +763,46 @@ "breadcrumbs:Breadcrumbs Visualisation": false } }, - "active": "83d8fad282b7d043", + "active": "5a06cb7b58dc8acd", "ophidian:layout-settings": { "pane-relief:focus-lock": true }, "lastOpenFiles": [ - "daily/2023-10-05.md", - "daily/2023-10-23.md", - "films à voir.md", - "prolétariat.md", + "sources/cours/S3/L2_maths_algebre_lineaire_TD2.pdf", + "sources/cours/S3/L2_maths_algebre_lineaire_TD2-annotate.md", + "sources/cours/S5/L3_info_statistiques_TD0.pdf", + "sources/cours/S5/L3_info_statistiques_TD1.pdf", + "Statistiques révisions.md", + "sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf", + "Excalidraw/révisions statistiques notes.excalidraw.md", + "note de cadrage du projet.md", + "sources/cours/S5/L3_info_statistiques_ch0.pdf", + "r.md", + "projet gestion et simulation d'entreprise.md", + "car.md", + "Projet web serveur.md", + "stage de licence 3 informatique.md", + "quarto extension collapse-callout.md", "post queue challenges docstring.md", + "films à voir.md", + "daily/2023-10-24.md", + "daily/2023-10-23.md", + "informatique/python/challenges_docstring/mentorat/dark/contacts.py", + "informatique/python/challenges_docstring/mentorat/dark", + "daily/2023-10-05.md", + "prolétariat.md", "baptême.md", "informatique/python/challenges_docstring/mentorat/krystof2601/contacts.db", "informatique/python/challenges_docstring/mentorat/krystof2601/contacts.py", "informatique/python/challenges_docstring/enonces/objets_poids.py", "post queues.md", - "quarto extension collapse-callout.md", "informatique/python/challenges_docstring/recap/recap_2023-10-21/enoncés.md", "informatique/python/challenges_docstring/recap/recap_2023-10-21/notes.md", - "informatique/python/challenges_docstring/recap/recap_2023-10-21", "quarto blog.md", "blog/posts/autres/qualification contre compétence.md", - "Projet web serveur.md", - "projet gestion et simulation d'entreprise.md", "javascript.md", "ergonomie IHM projet 1 - promenade cognitive - sans images.md", "ergonomie IHM projet 1 - promenade cognitive.md", - "informatique/programmation_web_serveur/TP3.zip", - "informatique/programmation_web_serveur/TP3/users_directory/foo.py", - "informatique/programmation_web_serveur/TP3/routes/file.js", - "informatique/programmation_web_serveur/TP3/users_directory/9375c7e800f9b900bfc2b0026045632b", - "informatique/programmation_web_serveur/TP3/node_modules/busboy/package.json", - "informatique/programmation_web_serveur/TP3/node_modules/busboy/test/test.js", - "informatique/programmation_web_serveur/TP3/node_modules/busboy/README.md", - "informatique/programmation_web_serveur/TP3/node_modules/streamsearch/README.md", - "informatique/programmation_web_serveur/TP3/node_modules/object-assign/readme.md", - "informatique/programmation_web_serveur/TP3/node_modules/multer/README.md", - "informatique/programmation_web_serveur/TP3/node_modules/append-field/README.md", - "informatique/programmation_web_serveur/TP3/node_modules/minimist/README.md", - "informatique/programmation_web_serveur/TP3/node_modules/minimist/CHANGELOG.md", - "informatique/programmation_web_serveur/TP3/node_modules/concat-stream/readme.md", - "informatique/programmation_web_serveur/TP3/node_modules/util-deprecate/README.md", "attachments/Capture d’écran 2023-10-18 à 00.05.25.png", "attachments/Capture d’écran 2023-10-17 à 23.56.01.png", "attachments/Capture d’écran 2023-10-17 à 23.55.50.png", diff --git a/.obsidian/workspaces.json b/.obsidian/workspaces.json index 7ef4f701..6651a54e 100644 --- a/.obsidian/workspaces.json +++ b/.obsidian/workspaces.json @@ -87,28 +87,6 @@ } } }, - { - "id": "63bf83af383c9206", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "projet gestion et simulation d'entreprise.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, { "id": "abc28a3f1d6db09b", "type": "leaf", @@ -142,9 +120,191 @@ "source": false } } + }, + { + "id": "7c810d97b04a1d9b", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_ch0.pdf" + } + } + }, + { + "id": "5a06cb7b58dc8acd", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2.pdf\"}}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2-annotate", + "icon": "blocks", + "state": "{\"type\":\"mindmapview\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2-annotate.md\"}}", + "eState": "{}" + }, + { + "title": "L2_maths_algebre_lineaire_TD2", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S3/L2_maths_algebre_lineaire_TD2.pdf\"}}", + "eState": "{}" + }, + { + "title": "L3_info_statistiques_TD0", + "icon": "lucide-file-text", + "state": "{\"type\":\"pdf\",\"state\":{\"file\":\"sources/cours/S5/L3_info_statistiques_TD0.pdf\"}}", + "eState": "{}" + }, + { + "title": "projet gestion et simulation d'entreprise", + "icon": "lucide-file", + "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"projet gestion et simulation d'entreprise.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", + "eState": "{\"cursor\":{\"from\":{\"line\":6,\"ch\":23},\"to\":{\"line\":6,\"ch\":23}},\"scroll\":0}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" + } + } + }, + { + "id": "9c1ba20a2fc32231", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "excalidraw", + "state": { + "file": "Excalidraw/révisions statistiques notes.excalidraw.md" + } + } } ], - "currentTab": 4 + "currentTab": 5 + }, + { + "id": "7178ce0a6b8bca49", + "type": "tabs", + "children": [ + { + "id": "04a1613aa6b43843", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "markdown", + "state": { + "file": "projet gestion et simulation d'entreprise.md", + "mode": "source", + "backlinks": false, + "source": false + } + } + }, + { + "id": "36c6524ff4a86d95", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "pdf", + "state": { + "file": "sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf" + } + } + }, + { + "id": "2e023f0f2d7db437", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + } + ] + }, + "state": { + "type": "markdown", + "state": { + "file": "Statistiques révisions.md", + "mode": "source", + "backlinks": false, + "source": false + } + } + }, + { + "id": "d76933b614efca24", + "type": "leaf", + "pane-relief:history-v1": { + "pos": 0, + "stack": [ + { + "state": "{}", + "eState": "{}" + }, + { + "title": "révisions statistiques notes.excalidraw", + "icon": "excalidraw-icon", + "state": "{\"type\":\"excalidraw\",\"state\":{\"file\":\"Excalidraw/révisions statistiques notes.excalidraw.md\"}}", + "eState": "{}" + } + ] + }, + "state": { + "type": "mindmapview", + "state": { + "file": "r.md" + } + } + } + ], + "currentTab": 2 } ], "direction": "vertical" @@ -311,7 +471,7 @@ } ], "direction": "horizontal", - "width": 390.5, + "width": 421.5, "collapsed": true }, "right": { @@ -338,7 +498,7 @@ "state": { "type": "localgraph", "state": { - "file": "Projet web serveur.md", + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", "options": { "collapse-filter": true, "search": "", @@ -455,7 +615,7 @@ "state": { "type": "file-properties", "state": { - "file": "Projet web serveur.md" + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" } } }, @@ -474,12 +634,12 @@ "state": { "type": "outline", "state": { - "file": "Projet web serveur.md" + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf" } } }, { - "id": "ff51a1271aa96930", + "id": "6c1bad9f0a9e1fe6", "type": "leaf", "state": { "type": "tasks_timeline_view", @@ -543,7 +703,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Projet web serveur.md", + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -564,7 +724,7 @@ "state": { "type": "backlink", "state": { - "file": "Projet web serveur.md", + "file": "sources/cours/S5/L3_info_statistiques_TD1.pdf", "collapseAll": true, "extraContext": false, "sortOrder": "alphabetical", @@ -579,7 +739,8 @@ } ], "direction": "horizontal", - "width": 385.5 + "width": 385.5, + "collapsed": true }, "left-ribbon": { "hiddenItems": { @@ -604,7 +765,7 @@ "breadcrumbs:Breadcrumbs Visualisation": false } }, - "active": "abc28a3f1d6db09b", + "active": "5a06cb7b58dc8acd", "ophidian:layout-settings": { "pane-relief:focus-lock": true }, @@ -614,7 +775,6 @@ "blog/posts/autres", "blog/posts/autres/_images", "blog/posts/welcome/_images", - "sources", "sources/cours", "sources/cours/S5" ] @@ -970,93 +1130,9 @@ "source": false } } - }, - { - "id": "10188fb365068f3a", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "post queues", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"post queues.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":0,\"ch\":0},\"to\":{\"line\":0,\"ch\":0}}}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "post queue challenges docstring.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "e8989c205167f9f3", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "films à voir.md", - "mode": "source", - "backlinks": false, - "source": false - } - } - }, - { - "id": "83d8fad282b7d043", - "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - }, - { - "title": "2023-10-05", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"daily/2023-10-05.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":9,\"ch\":55},\"to\":{\"line\":9,\"ch\":55}}}" - }, - { - "title": "2023-10-23", - "icon": "lucide-file", - "state": "{\"type\":\"markdown\",\"state\":{\"file\":\"daily/2023-10-23.md\",\"mode\":\"source\",\"backlinks\":false,\"source\":false}}", - "eState": "{\"cursor\":{\"from\":{\"line\":4,\"ch\":0},\"to\":{\"line\":4,\"ch\":0}}}" - } - ] - }, - "state": { - "type": "markdown", - "state": { - "file": "daily/2023-10-23.md", - "mode": "source", - "backlinks": false, - "source": false - } - } } ], - "currentTab": 14 + "currentTab": 11 } ], "direction": "vertical" @@ -1241,7 +1317,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "daily/2023-10-23.md", + "file": "quarto extension collapse-callout.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -1262,7 +1338,7 @@ "state": { "type": "backlink", "state": { - "file": "daily/2023-10-23.md", + "file": "quarto extension collapse-callout.md", "collapseAll": true, "extraContext": false, "sortOrder": "alphabetical", @@ -1278,7 +1354,8 @@ } ], "direction": "horizontal", - "width": 438.5 + "width": 438.5, + "collapsed": true }, "right": { "id": "1102f19b896c7a16", @@ -1304,7 +1381,7 @@ "state": { "type": "localgraph", "state": { - "file": "daily/2023-10-23.md", + "file": "quarto extension collapse-callout.md", "options": { "collapse-filter": false, "search": "", @@ -1399,7 +1476,7 @@ "state": { "type": "outline", "state": { - "file": "daily/2023-10-23.md" + "file": "quarto extension collapse-callout.md" } } }, @@ -1437,22 +1514,13 @@ "state": { "type": "file-properties", "state": { - "file": "daily/2023-10-23.md" + "file": "quarto extension collapse-callout.md" } } }, { - "id": "e0374b2f0057269f", + "id": "b55bb0810dc66844", "type": "leaf", - "pane-relief:history-v1": { - "pos": 0, - "stack": [ - { - "state": "{}", - "eState": "{}" - } - ] - }, "state": { "type": "tasks_timeline_view", "state": {} @@ -1551,7 +1619,7 @@ "breadcrumbs:Breadcrumbs Visualisation": false } }, - "active": "83d8fad282b7d043", + "active": "805d3bcf1c7abe47", "ophidian:layout-settings": { "pane-relief:focus-lock": true }, @@ -1566,5 +1634,5 @@ } } }, - "active": "blog" + "active": "fac" } \ No newline at end of file diff --git a/Excalidraw/révisions statistiques notes.excalidraw.md b/Excalidraw/révisions statistiques notes.excalidraw.md new file mode 100644 index 00000000..7a3e3be4 --- /dev/null +++ b/Excalidraw/révisions statistiques notes.excalidraw.md @@ -0,0 +1,7576 @@ +--- + +excalidraw-plugin: parsed +tags: [excalidraw] + +--- +==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== + + +# Text Elements +-5 -4 -3 -2 -1 0 1 2 3 4 5 ^NmWdNCRO + +5 + +4 + +3 + +2 + +1 + +0 + + +-1 + +-2 + +-3 + +-4 + +-5 ^vkzpRVcm + +x ^sLpyNlMt + +y ^oUHfvoar + + -1/2 ^OSV61uOC + +%% +# Drawing +```json +{ + "type": "excalidraw", + "version": 2, + "source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/1.9.19", + "elements": [ + { + "type": "arrow", + "version": 805, + "versionNonce": 1556013823, + "isDeleted": false, + "id": "SGtqCXxAISVdOX9n8Cxei", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -210.44007863603613, + "y": -44.5116845729699, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 549.1666666666665, + "height": 0, + "seed": 492422737, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "sLpyNlMt", + "focus": -0.17636363636387611, + "gap": 9.52272727272657 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 549.1666666666665, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 855, + "versionNonce": 2102661233, + "isDeleted": false, + "id": "ZjQi5pnnteUhOMQmms-qR", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -209.35674530270208, + "y": -44.92835123963715, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 546.6666666666666, + "height": 5.190112152794294e-13, + "seed": 198104113, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oUHfvoar", + "focus": 0.46212121212106544, + "gap": 13.287878787881482 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 546.6666666666666, + 5.190112152794294e-13 + ] + ] + }, + { + "type": "text", + "version": 477, + "versionNonce": 1040722719, + "isDeleted": false, + "id": "NmWdNCRO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -163.77341196936962, + "y": -42.67835123963664, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 449.391845703125, + "height": 20, + "seed": 1747396113, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "-5 -4 -3 -2 -1 0 1 2 3 4 5", + "rawText": "-5 -4 -3 -2 -1 0 1 2 3 4 5", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "-5 -4 -3 -2 -1 0 1 2 3 4 5", + "lineHeight": 1.25, + "baseline": 14 + }, + { + "type": "text", + "version": 772, + "versionNonce": 641391185, + "isDeleted": false, + "id": "vkzpRVcm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": 70.3932546972969, + "y": -270.3450179063033, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 28.867279052734375, + "height": 448, + "seed": 492452849, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "fontSize": 16.303030303030308, + "fontFamily": 1, + "text": "5\n\n4\n\n3\n\n2\n\n1 \n\n0\n\n\n-1\n\n-2\n\n-3\n\n-4\n\n-5", + "rawText": "5\n\n4\n\n3\n\n2\n\n1 \n\n0\n\n\n-1\n\n-2\n\n-3\n\n-4\n\n-5", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "5\n\n4\n\n3\n\n2\n\n1 \n\n0\n\n\n-1\n\n-2\n\n-3\n\n-4\n\n-5", + "lineHeight": 1.2490706319702598, + "baseline": 441 + }, + { + "type": "line", + "version": 452, + "versionNonce": 322137919, + "isDeleted": false, + "id": "1SlLhNKL1uvlrEHGHrsXR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": -262.21623002751835, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1265604049, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 487, + "versionNonce": 2137876529, + "isDeleted": false, + "id": "TkpYgIBzvfj2CHnxttRp1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": -3.125320936609228, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 629060529, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 510, + "versionNonce": 111226719, + "isDeleted": false, + "id": "9eCmTPK9jjoL7MjGenbLs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": -219.0344118457002, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 263132561, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 544, + "versionNonce": 315832849, + "isDeleted": false, + "id": "CcIZICuVuKYp0Urs1Zz4H", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": 40.0564972452089, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 2100837233, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 525, + "versionNonce": 581036927, + "isDeleted": false, + "id": "Svg-5f1qcAZ1CRt6znrdK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": -175.852593663882, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 241280337, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 559, + "versionNonce": 1097060337, + "isDeleted": false, + "id": "O5Hrv1KEnQtDsSMlHGluO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": 83.23831542702709, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1854067505, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 549, + "versionNonce": 1400251295, + "isDeleted": false, + "id": "KPWefcD8Mj02O6cAHcQ_q", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.29613924209733, + "y": -132.67077548206382, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1912816913, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 583, + "versionNonce": 1629923793, + "isDeleted": false, + "id": "a-MBm0QoylxZ7ZindRE0o", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.29613924209733, + "y": 126.42013360884522, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1952086769, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 569, + "versionNonce": 693000127, + "isDeleted": false, + "id": "WDxhFyldOtDh7iQ-BRX26", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": -89.4889573002456, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1980757201, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 603, + "versionNonce": 456345521, + "isDeleted": false, + "id": "PxnVlVfrLD_3fXt9lFbhE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": -200.2961392420971, + "y": 169.6019517906633, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 2059088561, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 704, + "versionNonce": 1514866655, + "isDeleted": false, + "id": "KfZzf4-FoCznga7RI6qid", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": 15.612951666993212, + "y": -46.30713911843338, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 654554257, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 739, + "versionNonce": 162605457, + "isDeleted": false, + "id": "1sJ4hJ0KKIlqChwLkBL3J", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -243.4779574239149, + "y": -46.30713911842622, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 513866353, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 762, + "versionNonce": 75281407, + "isDeleted": false, + "id": "zbsYd4jvwSfTE4AuwqyZF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -27.568866514823895, + "y": -46.30713911843225, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 576357457, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 796, + "versionNonce": 366464881, + "isDeleted": false, + "id": "W6AwN72ED3ZO0BSO9kOjB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -286.6597756057329, + "y": -46.307139118425084, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1846006321, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 777, + "versionNonce": 803462175, + "isDeleted": false, + "id": "P4yzEsj5-yaZ2uuZGzC-K", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -70.75068469664237, + "y": -46.30713911843088, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1452303377, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 811, + "versionNonce": 367966545, + "isDeleted": false, + "id": "VE1ByzxethW0EN0cJVhlR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -329.84159378755044, + "y": -46.30713911842406, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 669759985, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 801, + "versionNonce": 275841087, + "isDeleted": false, + "id": "TiVvCdMB9HqmHYlmyYdRz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -113.93250287846129, + "y": -46.30713911843009, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1126257617, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 835, + "versionNonce": 726492977, + "isDeleted": false, + "id": "LJMiMGcQYAyGxK3it6xbP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -373.0234119693698, + "y": -46.30713911842281, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 2085138865, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 821, + "versionNonce": 134520927, + "isDeleted": false, + "id": "G8CjDuWVNnp5PYet1PiFZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -157.11432106027885, + "y": -46.30713911842872, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 948523921, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "line", + "version": 855, + "versionNonce": 1616599313, + "isDeleted": false, + "id": "8oDBLOfBxUIm_PyiZXK8O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 1.5707963267948957, + "x": -416.2052301511874, + "y": -46.30713911842156, + "strokeColor": "#808080", + "backgroundColor": "transparent", + "width": 526, + "height": 0, + "seed": 1276819825, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274426459, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 526, + 0 + ] + ] + }, + { + "type": "text", + "version": 706, + "versionNonce": 1752120447, + "isDeleted": false, + "id": "sLpyNlMt", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": 348.249315303357, + "y": -59.21623002751835, + "strokeColor": "#000", + "backgroundColor": "transparent", + "width": 11.239990234375, + "height": 25, + "seed": 407135057, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "SGtqCXxAISVdOX9n8Cxei", + "type": "arrow" + } + ], + "updated": 1698274426459, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "x", + "rawText": "x", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "x", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "type": "text", + "version": 364, + "versionNonce": 110104305, + "isDeleted": false, + "id": "oUHfvoar", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 30, + "angle": 0, + "x": 60.74931530335763, + "y": -356.5495633608517, + "strokeColor": "#000", + "backgroundColor": "transparent", + "width": 9.379989624023438, + "height": 25, + "seed": 1767756081, + "groupIds": [ + "L7LOQ2gOQ9n-olwB_NbMi" + ], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "ZjQi5pnnteUhOMQmms-qR", + "type": "arrow" + } + ], + "updated": 1698274426459, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "y", + "rawText": "y", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "y", + "lineHeight": 1.25, + "baseline": 18 + }, + { + "id": "Jx9YID16E0KGXvguiqtWw", + "type": "line", + "x": -244.50390625, + "y": -56.81250000000003, + "width": 583.703125, + "height": 110.36328125, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1033783615, + "version": 316, + "versionNonce": 2074436017, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 95.8125, + -2.875 + ], + [ + 184.23828125, + -33.921875 + ], + [ + 231.046875, + -63.96484375 + ], + [ + 269.765625, + -94.171875 + ], + [ + 317.81640625, + -107.27734375 + ], + [ + 358.234375, + -86.1328125 + ], + [ + 410.28515625, + -43.41015625 + ], + [ + 498.171875, + -6.25 + ], + [ + 583.703125, + 3.0859375 + ] + ], + "lastCommittedPoint": [ + 583.703125, + 3.0859375 + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Tnk-WmGyeNT35imCnYRn0", + "type": "line", + "x": -14.450503276363293, + "y": -119.7057234482051, + "width": 226.31399451522094, + "height": 72.86152765133015, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1595652351, + "version": 299, + "versionNonce": 85954015, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.6213908356504589, + 72.39893669590145 + ], + [ + -225.69260367957048, + 72.86152765133015 + ], + [ + -125.00657527633463, + 60.99296269040562 + ], + [ + -20.64743660014244, + 17.861534353642696 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": [ + 2.823876130900601, + -3.5971625041545394 + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "_YgV100zeqmKNrvZBRAUf", + "type": "line", + "x": -11.923560577169098, + "y": -121.88688957098697, + "width": 339.7592480771471, + "height": 114.991826308434, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1487076977, + "version": 429, + "versionNonce": 147850129, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -3.407293082150261, + 71.76028500370518 + ], + [ + 336.35195499499685, + 73.18603175439212 + ], + [ + 255.89910263480306, + 58.569538431368755 + ], + [ + 193.61502787476797, + 26.567910395368045 + ], + [ + 138.52527812304209, + -7.998680923345603 + ], + [ + 103.39598288093384, + -35.84389470310628 + ], + [ + 74.14918754965038, + -41.80579455404188 + ], + [ + 39.72758742592191, + -32.03269757778321 + ], + [ + 0, + 0 + ] + ], + "lastCommittedPoint": [ + 1.2531381852284647, + -3.465979994406098 + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "pWOkNXfa_iPU9UtgfA1U6", + "type": "line", + "x": -14.38999426992203, + "y": -207.67367974234904, + "width": 0, + "height": 293.14803106074135, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#b2f2bb", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1515243761, + "version": 177, + "versionNonce": 785414655, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 293.14803106074135 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "whJ-m1UVEv50XaYEvp-_W", + "type": "ellipse", + "x": 588.1181573500605, + "y": -279.05212823275883, + "width": 305.9401939655172, + "height": 290.9671336206896, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#228be6", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2032483327, + "version": 295, + "versionNonce": 1499866719, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false + }, + { + "id": "l9D4YlUYUxIlVT9g4uvu4", + "type": "ellipse", + "x": 695.3110452810951, + "y": -231.21807650862084, + "width": 349.9084051724137, + "height": 171.16379310344826, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 170017119, + "version": 734, + "versionNonce": 1950167825, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false + }, + { + "id": "75fnvEZ3PLFr9v_gXwi6x", + "type": "freedraw", + "x": 662.6063039017848, + "y": -243.5375808189657, + "width": 16.885775862068954, + "height": 28.011853448275843, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1772758271, + "version": 38, + "versionNonce": 1828892351, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.9886853448275588, + 0.7354525862068897 + ], + [ + -1.48168103448279, + 1.2257543103448256 + ], + [ + -2.3356681034482563, + 2.796336206896541 + ], + [ + -2.828663793103374, + 3.286637931034477 + ], + [ + -3.0765086206896513, + 3.776939655172413 + ], + [ + -3.6503232758620925, + 6.066810344827587 + ], + [ + -4.14331896551721, + 6.802262931034477 + ], + [ + -4.8653017241379075, + 7.882543103448285 + ], + [ + -9.577047413793139, + 16.40625 + ], + [ + -11.295797413793139, + 18.12230603448276 + ], + [ + -13.014547413793139, + 19.838362068965523 + ], + [ + -13.262392241379303, + 20.32866379310343 + ], + [ + -13.510237068965466, + 20.573814655172413 + ], + [ + -13.758081896551744, + 20.818965517241367 + ], + [ + -14.005926724137908, + 21.309267241379303 + ], + [ + -14.746767241379303, + 22.289870689655174 + ], + [ + -14.994612068965466, + 22.78017241379311 + ], + [ + -16.390086206896513, + 25.31519396551724 + ], + [ + -16.63793103448279, + 25.805495689655174 + ], + [ + -16.885775862068954, + 26.786099137931018 + ], + [ + -16.885775862068954, + 27.03125 + ], + [ + -16.885775862068954, + 27.76670258620689 + ], + [ + -16.885775862068954, + 28.011853448275843 + ], + [ + -16.885775862068954, + 28.011853448275843 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -16.885775862068954, + 28.011853448275843 + ] + }, + { + "id": "dGH4AA9L6ajKNx5pWxxWx", + "type": "freedraw", + "x": 666.9301185569573, + "y": -241.2719558189657, + "width": 7.03394396551721, + "height": 23.768857758620697, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1059447871, + "version": 37, + "versionNonce": 1557389489, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 2.2898706896551744 + ], + [ + 0, + 4.579741379310349 + ], + [ + 0.4903017241379075, + 5.560344827586192 + ], + [ + 0.8485991379310462, + 6.640625 + ], + [ + 1.09375, + 7.130926724137936 + ], + [ + 4.1648706896551175, + 12.917564655172413 + ], + [ + 4.655172413793025, + 13.653017241379303 + ], + [ + 4.655172413793025, + 13.898168103448285 + ], + [ + 4.655172413793025, + 14.388469827586192 + ], + [ + 4.655172413793025, + 15.12392241379311 + ], + [ + 4.9003232758620925, + 15.614224137931018 + ], + [ + 4.9003232758620925, + 16.349676724137936 + ], + [ + 6.298491379310349, + 19.84644396551724 + ], + [ + 6.298491379310349, + 20.336745689655174 + ], + [ + 6.298491379310349, + 20.581896551724128 + ], + [ + 6.5436422413793025, + 21.072198275862064 + ], + [ + 6.788793103448256, + 21.317349137931018 + ], + [ + 7.03394396551721, + 21.5625 + ], + [ + 7.03394396551721, + 22.543103448275843 + ], + [ + 7.03394396551721, + 23.03340517241378 + ], + [ + 7.03394396551721, + 23.523706896551715 + ], + [ + 7.03394396551721, + 23.768857758620697 + ], + [ + 7.03394396551721, + 23.768857758620697 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 7.03394396551721, + 23.768857758620697 + ] + }, + { + "id": "k6TzUUWpA4HHbXv870-PF", + "type": "freedraw", + "x": 655.0658944190262, + "y": -226.26387392241398, + "width": 16.856142241379303, + "height": 1.4709051724138078, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 842356575, + "version": 33, + "versionNonce": 1935441631, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.980603448275815, + -0.4956896551724128 + ], + [ + 5.557650862068954, + -0.8566810344827616 + ], + [ + 7.847521551724071, + -0.8566810344827616 + ], + [ + 8.337823275862092, + -0.3663793103448256 + ], + [ + 8.828125, + -0.12122844827587187 + ], + [ + 9.318426724137908, + 0.12392241379311031 + ], + [ + 9.563577586206861, + 0.12392241379311031 + ], + [ + 9.808728448275815, + 0.36907327586206407 + ], + [ + 10.053879310344769, + 0.6142241379310462 + ], + [ + 10.299030172413836, + 0.6142241379310462 + ], + [ + 10.789331896551744, + 0.6142241379310462 + ], + [ + 11.279633620689651, + 0.6142241379310462 + ], + [ + 12.605064655172441, + 0.6142241379310462 + ], + [ + 13.095366379310349, + 0.6142241379310462 + ], + [ + 13.83081896551721, + 0.6142241379310462 + ], + [ + 14.321120689655118, + 0.6142241379310462 + ], + [ + 16.856142241379303, + 0.04040948275863343 + ], + [ + 16.856142241379303, + -0.2074353448275872 + ], + [ + 16.856142241379303, + -0.2074353448275872 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 16.856142241379303, + -0.2074353448275872 + ] + }, + { + "id": "QemgLJekTbmKwEr6FVSUM", + "type": "freedraw", + "x": 979.5109375224745, + "y": -186.81613685344846, + "width": 3.631465517241395, + "height": 42.45150862068965, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1623227903, + "version": 26, + "versionNonce": 1574347409, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 2.2898706896551744 + ], + [ + 0, + 4.579741379310349 + ], + [ + -0.36099137931046243, + 6.740301724137936 + ], + [ + -0.36099137931046243, + 9.030172413793082 + ], + [ + -1.061422413793025, + 18.442887931034477 + ], + [ + -1.953125, + 25.56573275862067 + ], + [ + -2.73976293103442, + 31.352370689655174 + ], + [ + -2.73976293103442, + 32.432650862068954 + ], + [ + -3.631465517241395, + 40.635775862068954 + ], + [ + -3.631465517241395, + 41.71605603448273 + ], + [ + -3.631465517241395, + 42.45150862068965 + ], + [ + -3.631465517241395, + 42.45150862068965 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -3.631465517241395, + 42.45150862068965 + ] + }, + { + "id": "ddWN_smEUYghYFeR9Dszw", + "type": "freedraw", + "x": 981.9031789017847, + "y": -185.97292564655191, + "width": 32.34644396551744, + "height": 35.90247844827584, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1984021439, + "version": 74, + "versionNonce": 172444415, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -0.2478448275861922 + ], + [ + 1.08028017241395, + -0.6088362068965409 + ], + [ + 4.577047413793252, + -0.6088362068965409 + ], + [ + 5.06734913793116, + -0.6088362068965409 + ], + [ + 14.480064655172555, + -0.6088362068965409 + ], + [ + 16.769935344827672, + -0.6088362068965409 + ], + [ + 23.766163793103487, + -0.6088362068965409 + ], + [ + 24.84644396551721, + -0.6088362068965409 + ], + [ + 26.171875, + -0.3636853448275872 + ], + [ + 26.171875, + -0.11853448275860501 + ], + [ + 26.171875, + 2.661637931034477 + ], + [ + 26.171875, + 3.151939655172413 + ], + [ + 26.171875, + 3.6422413793103487 + ], + [ + 26.171875, + 6.422413793103459 + ], + [ + 25.92403017241395, + 6.912715517241395 + ], + [ + 20.320581896551857, + 11.81034482758622 + ], + [ + 16.821120689655345, + 13.908943965517238 + ], + [ + 15.245150862069067, + 14.512392241379303 + ], + [ + 10.53609913793116, + 15.296336206896541 + ], + [ + 9.550107758620697, + 15.541487068965523 + ], + [ + 6.050646551724185, + 15.541487068965523 + ], + [ + 2.303340517241395, + 16.484375 + ], + [ + 0.010775862069067443, + 17.055495689655174 + ], + [ + -0.4849137931032601, + 17.055495689655174 + ], + [ + -0.977909482758605, + 17.055495689655174 + ], + [ + -1.4709051724137225, + 17.055495689655174 + ], + [ + -2.2117456896551175, + 17.055495689655174 + ], + [ + -2.459590517241395, + 17.055495689655174 + ], + [ + -2.2144396551723275, + 16.807650862068954 + ], + [ + 0.5657327586206975, + 16.807650862068954 + ], + [ + 6.48168103448279, + 16.807650862068954 + ], + [ + 9.978448275862092, + 16.807650862068954 + ], + [ + 16.974676724137908, + 17.378771551724128 + ], + [ + 27.596982758620697, + 19.447737068965523 + ], + [ + 29.886853448276042, + 20.018857758620697 + ], + [ + 29.886853448276042, + 20.26400862068965 + ], + [ + 29.886853448276042, + 21.34428879310346 + ], + [ + 29.886853448276042, + 22.324892241379303 + ], + [ + 29.886853448276042, + 22.570043103448285 + ], + [ + 29.639008620689765, + 23.305495689655174 + ], + [ + 27.34644396551721, + 24.45043103448276 + ], + [ + 26.015625, + 25.414870689655174 + ], + [ + 22.090517241379303, + 28.553340517241367 + ], + [ + 20.759698275862092, + 29.51778017241378 + ], + [ + 20.511853448276042, + 29.76293103448276 + ], + [ + 19.771012931034647, + 30.253232758620697 + ], + [ + 19.771012931034647, + 30.49838362068965 + ], + [ + 16.985452586206975, + 31.069504310344826 + ], + [ + 15.902478448276042, + 31.427801724137936 + ], + [ + 12.155172413793252, + 32.12553879310346 + ], + [ + 11.907327586206975, + 32.12553879310346 + ], + [ + 11.659482758620697, + 32.37068965517241 + ], + [ + 9.493534482758605, + 33.08728448275863 + ], + [ + 7.2009698275862775, + 33.65840517241378 + ], + [ + 6.953125, + 33.90355603448276 + ], + [ + 6.70528017241395, + 34.148706896551715 + ], + [ + 4.164870689655345, + 35.2936422413793 + ], + [ + 3.9170258620690674, + 35.2936422413793 + ], + [ + 3.66918103448279, + 35.2936422413793 + ], + [ + 3.66918103448279, + 35.2936422413793 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 3.66918103448279, + 35.2936422413793 + ] + }, + { + "id": "Oyqem96d2IyY0UMSPM9Um", + "type": "freedraw", + "x": 755.890247867302, + "y": -183.99824892241398, + "width": 19.124461206896513, + "height": 17.284482758620697, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 682549119, + "version": 60, + "versionNonce": 417736817, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.24784482758616377, + 0 + ], + [ + -0.7408405172412813, + 0.49030172413793593 + ], + [ + -2.8421336206896513, + 3.9870689655172384 + ], + [ + -5.196659482758605, + 8.693426724137936 + ], + [ + -5.9186422413793025, + 10.853987068965523 + ], + [ + -5.9186422413793025, + 11.934267241379303 + ], + [ + -5.9186422413793025, + 12.179418103448285 + ], + [ + -6.166487068965466, + 12.179418103448285 + ], + [ + -6.166487068965466, + 10.603448275862064 + ], + [ + -6.166487068965466, + 7.227909482758605 + ], + [ + -6.166487068965466, + 6.144935344827587 + ], + [ + -6.166487068965466, + 5.651939655172413 + ], + [ + -5.808189655172441, + 4.075969827586192 + ], + [ + -5.808189655172441, + 1.7834051724137794 + ], + [ + -5.808189655172441, + 1.0425646551724128 + ], + [ + -5.563038793103374, + 0.7947198275861922 + ], + [ + -5.563038793103374, + 0.053879310344825626 + ], + [ + -5.563038793103374, + -0.19396551724136657 + ], + [ + -5.072737068965466, + -0.6896551724138078 + ], + [ + -4.582435344827559, + -0.9375 + ], + [ + 0.3690732758620925, + -3.5398706896551744 + ], + [ + 0.6142241379310462, + -3.5398706896551744 + ], + [ + 0.859375, + -4.035560344827587 + ], + [ + 1.3496767241380212, + -4.283405172413808 + ], + [ + 1.5948275862068613, + -4.283405172413808 + ], + [ + 1.5948275862068613, + -4.53125 + ], + [ + 1.8399784482759287, + -4.53125 + ], + [ + 2.3302801724138362, + -4.53125 + ], + [ + 4.865301724138021, + -5.105064655172413 + ], + [ + 5.355603448275929, + -4.614762931034477 + ], + [ + 6.5005387931034875, + -2.3248922413793025 + ], + [ + 7.103987068965466, + -0.9994612068965409 + ], + [ + 7.462284482758719, + 0.08081896551723844 + ], + [ + 8.065732758620697, + 1.6514008620689538 + ], + [ + 8.785021551724185, + 2.7316810344827616 + ], + [ + 11.241918103448256, + 6.610991379310349 + ], + [ + 11.487068965517324, + 6.8561422413793025 + ], + [ + 12.222521551724185, + 7.836745689655174 + ], + [ + 12.222521551724185, + 8.081896551724128 + ], + [ + 12.467672413793139, + 8.572198275862064 + ], + [ + 12.712823275862092, + 8.817349137931046 + ], + [ + 12.957974137931046, + 9.307650862068954 + ], + [ + 12.957974137931046, + 9.552801724137936 + ], + [ + 12.957974137931046, + 10.043103448275872 + ], + [ + 12.957974137931046, + 11.123383620689651 + ], + [ + 12.957974137931046, + 11.123383620689651 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 12.957974137931046, + 11.123383620689651 + ] + }, + { + "id": "GFZk9yNizVDojFubANpDQ", + "type": "freedraw", + "x": 755.9522090741987, + "y": -177.0909213362071, + "width": 10.727370689655118, + "height": 0.2478448275861922, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 894944639, + "version": 21, + "versionNonce": 1849922335, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -0.2478448275861922 + ], + [ + 1.32543103448279, + -0.2478448275861922 + ], + [ + 3.6153017241379075, + -0.2478448275861922 + ], + [ + 9.401939655172328, + -0.2478448275861922 + ], + [ + 10.482219827586164, + -0.2478448275861922 + ], + [ + 10.727370689655118, + -0.2478448275861922 + ], + [ + 10.727370689655118, + -0.2478448275861922 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 10.727370689655118, + -0.2478448275861922 + ] + }, + { + "id": "SMY97Tkib8AuMy-tLxfht", + "type": "freedraw", + "x": 785.0174030397159, + "y": -173.60762392241398, + "width": 12.931034482758605, + "height": 24.315732758620697, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 10612383, + "version": 59, + "versionNonce": 935981649, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -0.24784482758622062 + ], + [ + -0.49568965517244123, + -0.7435344827586334 + ], + [ + -0.743534482758605, + -0.9913793103448256 + ], + [ + -1.2392241379310462, + -1.4870689655172384 + ], + [ + -1.2392241379310462, + -7.405711206896541 + ], + [ + -1.2392241379310462, + -8.488685344827587 + ], + [ + -0.4552801724138362, + -14.280711206896541 + ], + [ + -0.4552801724138362, + -15.363685344827587 + ], + [ + -0.4552801724138362, + -17.90409482758622 + ], + [ + -0.21012931034488247, + -18.399784482758633 + ], + [ + -0.21012931034488247, + -19.140625 + ], + [ + 0.28017241379302504, + -19.881465517241367 + ], + [ + 0.9994612068965125, + -20.964439655172413 + ], + [ + 1.9800646551723275, + -21.70528017241378 + ], + [ + 3.0603448275861638, + -22.427262931034477 + ], + [ + 5.595366379310349, + -23.574892241379303 + ], + [ + 6.085668103448256, + -23.822737068965523 + ], + [ + 6.33081896551721, + -24.315732758620697 + ], + [ + 6.575969827586164, + -24.315732758620697 + ], + [ + 7.066271551724185, + -24.070581896551715 + ], + [ + 8.046875, + -23.82543103448276 + ], + [ + 9.127155172413723, + -23.46713362068965 + ], + [ + 11.287715517241395, + -22.38954741379311 + ], + [ + 11.287715517241395, + -22.144396551724128 + ], + [ + 11.287715517241395, + -21.40894396551724 + ], + [ + 11.287715517241395, + -20.67349137931035 + ], + [ + 11.287715517241395, + -20.428340517241367 + ], + [ + 11.532866379310349, + -19.93803879310346 + ], + [ + 11.532866379310349, + -18.957435344827587 + ], + [ + 11.532866379310349, + -16.667564655172413 + ], + [ + 11.532866379310349, + -13.887392241379303 + ], + [ + 11.532866379310349, + -13.642241379310349 + ], + [ + 10.959051724137908, + -10.272090517241367 + ], + [ + 10.959051724137908, + -10.026939655172413 + ], + [ + 10.71120689655163, + -9.046336206896541 + ], + [ + 10.71120689655163, + -8.801185344827587 + ], + [ + 10.71120689655163, + -8.310883620689651 + ], + [ + 10.71120689655163, + -7.820581896551715 + ], + [ + 10.71120689655163, + -7.330280172413808 + ], + [ + 10.71120689655163, + -7.085129310344826 + ], + [ + 10.956357758620697, + -6.349676724137936 + ], + [ + 10.956357758620697, + -6.104525862068954 + ], + [ + 11.446659482758605, + -5.859375 + ], + [ + 11.691810344827559, + -5.614224137931046 + ], + [ + 11.691810344827559, + -5.614224137931046 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 11.691810344827559, + -5.614224137931046 + ] + }, + { + "id": "bneRhYhj3QH2LSuQ0_mbB", + "type": "freedraw", + "x": 813.010398729371, + "y": -198.75309806034502, + "width": 1.3550646551724412, + "height": 24.628232758620697, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 879361151, + "version": 27, + "versionNonce": 2009192255, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.8157327586206975 + ], + [ + 0, + 4.105603448275872 + ], + [ + 0, + 5.18588362068968 + ], + [ + 0, + 9.765625 + ], + [ + 0, + 12.055495689655174 + ], + [ + 0.78394396551721, + 19.051724137931046 + ], + [ + 0.78394396551721, + 20.132004310344826 + ], + [ + 1.3550646551724412, + 22.912176724137936 + ], + [ + 1.3550646551724412, + 23.157327586206918 + ], + [ + 1.3550646551724412, + 23.402478448275872 + ], + [ + 1.3550646551724412, + 24.13793103448276 + ], + [ + 1.3550646551724412, + 24.628232758620697 + ], + [ + 1.3550646551724412, + 24.628232758620697 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 1.3550646551724412, + 24.628232758620697 + ] + }, + { + "id": "hxsftjfXMbzVNKmB0ZKlV", + "type": "freedraw", + "x": 812.3880926948882, + "y": -196.65180495689674, + "width": 13.768857758620697, + "height": 26.16918103448276, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1692090975, + "version": 80, + "versionNonce": 1062830129, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3.5344827586206975, + -2.5969827586206975 + ], + [ + 4.614762931034534, + -2.957974137931018 + ], + [ + 9.321120689655231, + -4.528556034482762 + ], + [ + 9.566271551724185, + -4.776400862068954 + ], + [ + 10.056573275862092, + -4.776400862068954 + ], + [ + 10.546875, + -4.53125 + ], + [ + 11.627155172413836, + -4.53125 + ], + [ + 11.87230603448279, + -4.53125 + ], + [ + 12.362607758620697, + -4.286099137931018 + ], + [ + 12.362607758620697, + -4.040948275862064 + ], + [ + 12.362607758620697, + -3.7957974137931103 + ], + [ + 12.362607758620697, + -3.550646551724128 + ], + [ + 12.362607758620697, + -2.4703663793103487 + ], + [ + 12.362607758620697, + -1.1449353448275872 + ], + [ + 12.362607758620697, + 1.1449353448275872 + ], + [ + 12.362607758620697, + 2.125538793103459 + ], + [ + 12.362607758620697, + 2.615840517241395 + ], + [ + 11.031788793103487, + 3.580280172413808 + ], + [ + 10.783943965517324, + 3.8254310344827616 + ], + [ + 9.797952586206975, + 4.3157327586206975 + ], + [ + 9.550107758620697, + 4.560883620689651 + ], + [ + 9.05441810344837, + 4.806034482758633 + ], + [ + 8.558728448275929, + 5.296336206896541 + ], + [ + 8.310883620689765, + 5.296336206896541 + ], + [ + 7.57004310344837, + 5.786637931034477 + ], + [ + 7.3221982758620925, + 6.031788793103459 + ], + [ + 6.826508620689765, + 6.522090517241395 + ], + [ + 6.5786637931034875, + 6.522090517241395 + ], + [ + 6.330818965517324, + 6.767241379310349 + ], + [ + 7.066271551724185, + 6.271551724137936 + ], + [ + 9.356142241379303, + 5.12392241379311 + ], + [ + 9.60129310344837, + 4.87607758620689 + ], + [ + 10.091594827586277, + 4.87607758620689 + ], + [ + 10.336745689655231, + 4.87607758620689 + ], + [ + 11.31734913793116, + 5.121228448275872 + ], + [ + 11.807650862069067, + 5.366379310344826 + ], + [ + 12.297952586206975, + 5.611530172413808 + ], + [ + 12.543103448275929, + 5.856681034482762 + ], + [ + 13.27855603448279, + 6.3469827586206975 + ], + [ + 13.768857758620697, + 6.592133620689651 + ], + [ + 13.768857758620697, + 7.327586206896541 + ], + [ + 13.768857758620697, + 8.407866379310349 + ], + [ + 13.768857758620697, + 8.653017241379303 + ], + [ + 13.768857758620697, + 9.978448275862064 + ], + [ + 13.768857758620697, + 10.713900862068954 + ], + [ + 13.768857758620697, + 10.959051724137936 + ], + [ + 13.768857758620697, + 11.20420258620689 + ], + [ + 13.768857758620697, + 11.694504310344826 + ], + [ + 13.768857758620697, + 11.939655172413808 + ], + [ + 13.407866379310462, + 14.100215517241395 + ], + [ + 13.407866379310462, + 14.590517241379303 + ], + [ + 13.407866379310462, + 16.161099137931046 + ], + [ + 13.407866379310462, + 16.40625 + ], + [ + 12.586206896551857, + 18.941271551724128 + ], + [ + 12.33836206896558, + 18.941271551724128 + ], + [ + 11.842672413793139, + 19.431573275862064 + ], + [ + 11.594827586206975, + 19.431573275862064 + ], + [ + 10.85398706896558, + 19.921875 + ], + [ + 10.606142241379303, + 20.167025862068954 + ], + [ + 9.865301724137908, + 20.412176724137936 + ], + [ + 9.617456896551857, + 20.65732758620689 + ], + [ + 9.124461206896626, + 20.902478448275872 + ], + [ + 7.548491379310462, + 21.147629310344826 + ], + [ + 7.055495689655231, + 21.392780172413808 + ], + [ + 6.807650862069067, + 21.392780172413808 + ], + [ + 6.807650862069067, + 21.392780172413808 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 6.807650862069067, + 21.392780172413808 + ] + }, + { + "id": "Wb3bfhB8AfNCKxbXl2ori", + "type": "freedraw", + "x": 664.4408944190262, + "y": 45.188173491379075, + "width": 6.592133620689765, + "height": 58.51293103448279, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1539625137, + "version": 26, + "versionNonce": 1063829439, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.2451508620690106 + ], + [ + 0, + 2.4057112068965694 + ], + [ + 0, + 3.4859913793103487 + ], + [ + 0.5711206896552312, + 12.898706896551744 + ], + [ + 0.5711206896552312, + 21.231142241379303 + ], + [ + 0.5711206896552312, + 27.017780172413836 + ], + [ + 0.5711206896552312, + 35.350215517241395 + ], + [ + -1.6998922413793025, + 43.553340517241395 + ], + [ + -2.0608836206896513, + 44.633620689655174 + ], + [ + -4.959590517241395, + 51.629849137931046 + ], + [ + -4.959590517241395, + 52.710129310344826 + ], + [ + -5.660021551724185, + 56.69719827586209 + ], + [ + -5.660021551724185, + 57.1875 + ], + [ + -6.021012931034534, + 58.51293103448279 + ], + [ + -6.021012931034534, + 58.019935344827616 + ], + [ + -6.021012931034534, + 56.93696120689657 + ], + [ + -6.021012931034534, + 55.85398706896552 + ], + [ + -6.021012931034534, + 55.85398706896552 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -6.021012931034534, + 55.85398706896552 + ] + }, + { + "id": "XoHiS8FDkIRtqDCLbTVbD", + "type": "freedraw", + "x": 660.6585668328194, + "y": 52.841729525861865, + "width": 50.75700431034477, + "height": 23.42403017241378, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 533950001, + "version": 48, + "versionNonce": 1481858993, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.980603448275815, + -0.743534482758605 + ], + [ + 1.2257543103447688, + -0.9913793103448256 + ], + [ + 1.96120689655163, + -1.4870689655172669 + ], + [ + 2.4515086206895376, + -1.7349137931034875 + ], + [ + 7.028556034482676, + -2.7963362068965694 + ], + [ + 7.27370689655163, + -3.04418103448279 + ], + [ + 20.3125, + -6.610991379310349 + ], + [ + 28.64493534482756, + -7.537715517241395 + ], + [ + 33.841594827586164, + -8.572198275862092 + ], + [ + 34.33189655172407, + -8.572198275862092 + ], + [ + 34.577047413793025, + -8.572198275862092 + ], + [ + 34.82219827586209, + -8.572198275862092 + ], + [ + 35.3125, + -8.327047413793139 + ], + [ + 44.725215517241395, + -5.401400862068954 + ], + [ + 45.80549568965512, + -5.043103448275872 + ], + [ + 50.75700431034477, + -3.2300646551724412 + ], + [ + 50.75700431034477, + -2.9849137931034875 + ], + [ + 50.75700431034477, + -2.494612068965523 + ], + [ + 50.75700431034477, + -1.5140086206896513 + ], + [ + 50.75700431034477, + -1.2688577586206975 + ], + [ + 50.75700431034477, + 2.4730603448275588 + ], + [ + 50.509159482758605, + 2.963362068965523 + ], + [ + 47.70743534482756, + 5.037715517241395 + ], + [ + 47.21443965517233, + 5.5280172413793025 + ], + [ + 42.62931034482756, + 7.817887931034477 + ], + [ + 37.92025862068954, + 9.385775862068954 + ], + [ + 36.58943965517233, + 10.105064655172384 + ], + [ + 30.670797413793025, + 12.640086206896513 + ], + [ + 26.678340517241395, + 13.582974137931046 + ], + [ + 24.38577586206884, + 14.15409482758622 + ], + [ + 19.803340517241395, + 14.851831896551687 + ], + [ + 19.555495689655118, + 14.851831896551687 + ], + [ + 18.814655172413723, + 14.851831896551687 + ], + [ + 18.321659482758605, + 14.851831896551687 + ], + [ + 16.745689655172328, + 14.851831896551687 + ], + [ + 16.25269396551721, + 14.851831896551687 + ], + [ + 15.757004310344769, + 14.603987068965523 + ], + [ + 15.509159482758605, + 14.603987068965523 + ], + [ + 15.261314655172328, + 14.603987068965523 + ], + [ + 15.261314655172328, + 14.603987068965523 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 15.261314655172328, + 14.603987068965523 + ] + }, + { + "id": "JcJAceTBDINZJQrS2WLAR", + "type": "freedraw", + "x": 696.089601315578, + "y": 99.49582435344803, + "width": 6.901939655172441, + "height": 29.95150862068965, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2064224497, + "version": 15, + "versionNonce": 282619871, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -5.3125, + 21.729525862068954 + ], + [ + -6.40625, + 28.135775862068954 + ], + [ + -6.40625, + 28.380926724137908 + ], + [ + -6.40625, + 29.461206896551744 + ], + [ + -6.6540948275862775, + 29.95150862068965 + ], + [ + -6.901939655172441, + 29.95150862068965 + ], + [ + -6.901939655172441, + 29.95150862068965 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -6.901939655172441, + 29.95150862068965 + ] + }, + { + "id": "uPhQNrB645CxK11fITx-g", + "type": "freedraw", + "x": 694.2038254535089, + "y": 105.12621228448256, + "width": 10.969827586206975, + "height": 19.183728448275815, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1296542161, + "version": 24, + "versionNonce": 1527660945, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.24515086206906744, + 0 + ], + [ + 0.4903017241380212, + 0.4903017241379075 + ], + [ + 0.8485991379311599, + 1.570581896551687 + ], + [ + 5.1293103448276725, + 8.884698275862036 + ], + [ + 5.70043103448279, + 11.17456896551721 + ], + [ + 8.289331896551857, + 15.16163793103442 + ], + [ + 9.008620689655231, + 16.241918103448256 + ], + [ + 9.98922413793116, + 16.977370689655118 + ], + [ + 10.479525862069067, + 17.467672413793025 + ], + [ + 10.724676724138021, + 17.957974137931046 + ], + [ + 10.969827586206975, + 17.957974137931046 + ], + [ + 10.969827586206975, + 18.203125 + ], + [ + 10.969827586206975, + 18.693426724137908 + ], + [ + 10.969827586206975, + 18.93857758620686 + ], + [ + 10.969827586206975, + 19.183728448275815 + ], + [ + 10.969827586206975, + 19.183728448275815 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 10.969827586206975, + 19.183728448275815 + ] + }, + { + "id": "8_FYm5iA6Pelmacn9d-zb", + "type": "freedraw", + "x": 696.4236530397159, + "y": 121.47050107758594, + "width": 9.563577586206861, + "height": 4.84913793103442, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 398747537, + "version": 16, + "versionNonce": 1427971071, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4903017241379075, + -0.24784482758616377 + ], + [ + 0.7354525862068613, + -0.49568965517232755 + ], + [ + 5.3125, + -2.9579741379309326 + ], + [ + 5.8028017241379075, + -3.20581896551721 + ], + [ + 8.582974137931046, + -4.601293103448256 + ], + [ + 9.073275862068954, + -4.84913793103442 + ], + [ + 9.563577586206861, + -4.84913793103442 + ], + [ + 9.563577586206861, + -4.84913793103442 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 9.563577586206861, + -4.84913793103442 + ] + }, + { + "id": "7foVW2MtumoHktOz2_gJS", + "type": "freedraw", + "x": 735.0685883845434, + "y": 46.36813038793082, + "width": 9.762931034482676, + "height": 47.411099137931046, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 726750801, + "version": 43, + "versionNonce": 1808918385, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.0802801724137794 + ], + [ + 0, + 2.0608836206896513 + ], + [ + 0, + 3.1411637931034306 + ], + [ + -0.8459051724138362, + 10.137392241379303 + ], + [ + -0.8459051724138362, + 11.217672413793082 + ], + [ + -2.0393318965517437, + 14.959590517241395 + ], + [ + -3.1223060344826763, + 15.678879310344826 + ], + [ + -8.556034482758605, + 20.137392241379303 + ], + [ + -9.401939655172441, + 26.053340517241395 + ], + [ + -9.401939655172441, + 27.623922413793082 + ], + [ + -9.762931034482676, + 28.704202586206918 + ], + [ + -9.762931034482676, + 30.02963362068965 + ], + [ + -9.762931034482676, + 30.51993534482756 + ], + [ + -9.762931034482676, + 31.84536637931035 + ], + [ + -9.762931034482676, + 32.335668103448256 + ], + [ + -9.762931034482676, + 35.115840517241395 + ], + [ + -9.517780172413836, + 35.6061422413793 + ], + [ + -8.12769396551721, + 38.386314655172384 + ], + [ + -8.12769396551721, + 38.87661637931035 + ], + [ + -7.769396551724071, + 40.44719827586209 + ], + [ + -7.769396551724071, + 41.52747844827587 + ], + [ + -7.769396551724071, + 42.01778017241378 + ], + [ + -7.769396551724071, + 42.26293103448273 + ], + [ + -7.769396551724071, + 42.7532327586207 + ], + [ + -7.524245689655231, + 42.99838362068965 + ], + [ + -7.279094827586164, + 43.243534482758605 + ], + [ + -5.072737068965466, + 45.20474137931035 + ], + [ + -4.582435344827559, + 45.695043103448256 + ], + [ + -4.092133620689651, + 45.94019396551721 + ], + [ + -3.8469827586206975, + 45.94019396551721 + ], + [ + -3.8469827586206975, + 46.18534482758622 + ], + [ + -3.6018318965517437, + 46.67564655172413 + ], + [ + -3.1115301724138362, + 47.16594827586209 + ], + [ + -2.866379310344769, + 47.411099137931046 + ], + [ + -2.866379310344769, + 47.411099137931046 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -2.866379310344769, + 47.411099137931046 + ] + }, + { + "id": "4as34ynrYGKXUF_OraIpl", + "type": "freedraw", + "x": 751.3724676948882, + "y": 51.88806573275838, + "width": 9.752155172413836, + "height": 30.85668103448279, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1733574577, + "version": 26, + "versionNonce": 1614234655, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.24784482758616377, + 0.7354525862069181 + ], + [ + -0.24784482758616377, + 1.4709051724138362 + ], + [ + -0.24784482758616377, + 1.9612068965517437 + ], + [ + -0.24784482758616377, + 7.747844827586221 + ], + [ + -0.24784482758616377, + 8.238146551724185 + ], + [ + 4.334590517241395, + 14.38846982758622 + ], + [ + 6.433189655172555, + 17.1875 + ], + [ + 9.504310344827672, + 22.974137931034534 + ], + [ + 9.504310344827672, + 23.46443965517244 + ], + [ + 9.504310344827672, + 25.99946120689657 + ], + [ + 9.504310344827672, + 26.489762931034534 + ], + [ + 9.504310344827672, + 27.225215517241395 + ], + [ + 9.504310344827672, + 28.305495689655174 + ], + [ + 9.504310344827672, + 28.79579741379314 + ], + [ + 9.504310344827672, + 29.876077586206918 + ], + [ + 9.256465517241395, + 30.611530172413836 + ], + [ + 9.256465517241395, + 30.85668103448279 + ], + [ + 9.256465517241395, + 30.85668103448279 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 9.256465517241395, + 30.85668103448279 + ] + }, + { + "id": "pqxSAu-NnRlKmX-HPkFA9", + "type": "freedraw", + "x": 753.6003771776468, + "y": 56.19032866379291, + "width": 38.73653017241395, + "height": 30.037715517241395, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 662002993, + "version": 58, + "versionNonce": 1424347473, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 4.722521551724185, + -2.844827586206918 + ], + [ + 6.047952586206975, + -3.4536637931034875 + ], + [ + 7.1282327586206975, + -3.8146551724138362 + ], + [ + 12.914870689655231, + -4.962284482758662 + ], + [ + 17.62122844827593, + -4.962284482758662 + ], + [ + 18.601831896551857, + -4.962284482758662 + ], + [ + 20.891702586206975, + -4.962284482758662 + ], + [ + 22.217133620689765, + -5.323275862069011 + ], + [ + 22.707435344827672, + -5.323275862069011 + ], + [ + 23.442887931034647, + -5.078125 + ], + [ + 23.688038793103487, + -4.832974137931046 + ], + [ + 27.058189655172555, + -3.3297413793103487 + ], + [ + 27.548491379310462, + -2.8394396551724412 + ], + [ + 28.26778017241395, + -1.5140086206896513 + ], + [ + 28.26778017241395, + 0.7758620689654663 + ], + [ + 28.26778017241395, + 1.7564655172413381 + ], + [ + 28.26778017241395, + 4.0463362068965125 + ], + [ + 26.936961206896626, + 5.2559267241379075 + ], + [ + 25.85398706896558, + 5.614224137930989 + ], + [ + 18.85237068965523, + 7.661637931034477 + ], + [ + 14.267241379310462, + 8.803879310344826 + ], + [ + 13.771551724138021, + 8.803879310344826 + ], + [ + 11.47898706896558, + 8.803879310344826 + ], + [ + 10.738146551724185, + 8.803879310344826 + ], + [ + 10.490301724138021, + 8.803879310344826 + ], + [ + 10.980603448275929, + 8.556034482758605 + ], + [ + 11.47090517241395, + 8.556034482758605 + ], + [ + 14.84105603448279, + 8.556034482758605 + ], + [ + 17.13092672413802, + 8.556034482758605 + ], + [ + 22.917564655172555, + 9.253771551724128 + ], + [ + 31.25, + 10.177801724137908 + ], + [ + 38.24622844827593, + 13.100754310344826 + ], + [ + 38.49137931034488, + 13.100754310344826 + ], + [ + 38.73653017241395, + 13.836206896551687 + ], + [ + 38.73653017241395, + 14.326508620689651 + ], + [ + 38.73653017241395, + 18.068426724137908 + ], + [ + 38.48868534482767, + 18.558728448275815 + ], + [ + 37.502693965517324, + 19.539331896551687 + ], + [ + 33.577586206896626, + 22.677801724137908 + ], + [ + 32.59159482758628, + 23.413254310344826 + ], + [ + 31.50862068965523, + 23.771551724137908 + ], + [ + 30.17780172413802, + 24.01670258620686 + ], + [ + 29.68480603448279, + 24.01670258620686 + ], + [ + 25.10237068965523, + 24.714439655172384 + ], + [ + 24.854525862069067, + 24.714439655172384 + ], + [ + 24.60668103448279, + 24.714439655172384 + ], + [ + 24.358836206896626, + 24.714439655172384 + ], + [ + 23.863146551724185, + 24.714439655172384 + ], + [ + 23.370150862069067, + 24.466594827586164 + ], + [ + 23.370150862069067, + 24.466594827586164 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 23.370150862069067, + 24.466594827586164 + ] + }, + { + "id": "MOjkVMAnpWCmEMLozhkrg", + "type": "freedraw", + "x": 808.2205280397159, + "y": 45.07233297413774, + "width": 26.25269396551721, + "height": 36.352370689655174, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "#849e00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 741127857, + "version": 43, + "versionNonce": 840394815, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.7354525862068613, + 0.24515086206895376 + ], + [ + 1.2257543103448825, + 0.4903017241379075 + ], + [ + 2.306034482758605, + 0.8485991379309894 + ], + [ + 9.30226293103442, + 3.7419181034482563 + ], + [ + 9.792564655172328, + 3.98706896551721 + ], + [ + 16.788793103448256, + 7.241379310344826 + ], + [ + 21.495150862068954, + 9.593211206896513 + ], + [ + 23.21120689655163, + 11.309267241379303 + ], + [ + 25.55495689655163, + 15.051185344827559 + ], + [ + 25.55495689655163, + 15.541487068965523 + ], + [ + 26.25269396551721, + 19.528556034482733 + ], + [ + 26.25269396551721, + 20.608836206896513 + ], + [ + 26.25269396551721, + 22.179418103448256 + ], + [ + 26.25269396551721, + 23.259698275862036 + ], + [ + 26.25269396551721, + 23.995150862068954 + ], + [ + 26.25269396551721, + 25.075431034482733 + ], + [ + 25.511853448275815, + 25.81088362068965 + ], + [ + 25.26400862068965, + 26.30118534482756 + ], + [ + 23.54525862068965, + 28.507543103448256 + ], + [ + 23.297413793103487, + 28.997844827586164 + ], + [ + 22.311422413793025, + 29.733297413793082 + ], + [ + 21.818426724137908, + 30.22359913793099 + ], + [ + 19.85183189655163, + 32.18480603448273 + ], + [ + 19.358836206896513, + 32.67510775862064 + ], + [ + 18.863146551724185, + 33.165409482758605 + ], + [ + 18.615301724137908, + 33.41056034482756 + ], + [ + 18.119612068965466, + 34.14601293103448 + ], + [ + 17.871767241379303, + 34.636314655172384 + ], + [ + 17.130926724137908, + 35.12661637931029 + ], + [ + 17.130926724137908, + 35.3717672413793 + ], + [ + 16.635237068965466, + 35.616918103448256 + ], + [ + 15.891702586206861, + 36.107219827586164 + ], + [ + 15.643857758620697, + 36.107219827586164 + ], + [ + 15.39601293103442, + 36.352370689655174 + ], + [ + 15.39601293103442, + 36.352370689655174 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 15.39601293103442, + 36.352370689655174 + ] + }, + { + "id": "-7-JfIo4Wt4fd0VwpOreX", + "type": "rectangle", + "x": 579.0987607983366, + "y": -321.20460668103465, + "width": 474.1487068965517, + "height": 338.6422413793103, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "seed": 84162271, + "version": 99, + "versionNonce": 1852600593, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false + }, + { + "id": "3q41h-n6Lqa4GDBZ7sVCe", + "type": "freedraw", + "x": 860.1925107983363, + "y": 55.277074353448086, + "width": 28.34859913793116, + "height": 1.1476293103448256, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 697670495, + "version": 19, + "versionNonce": 1369154687, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4903017241379075, + -0.24784482758622062 + ], + [ + 2.060883620689765, + -0.24784482758622062 + ], + [ + 11.47359913793116, + -0.24784482758622062 + ], + [ + 11.963900862069067, + -0.002693965517266861 + ], + [ + 13.04418103448279, + -0.002693965517266861 + ], + [ + 16.78609913793116, + -0.002693965517266861 + ], + [ + 17.03125, + -0.002693965517266861 + ], + [ + 17.03125, + 0.24245689655174374 + ], + [ + 18.111530172413836, + 0.24245689655174374 + ], + [ + 21.48168103448279, + -0.3313577586206975 + ], + [ + 22.561961206896626, + -0.3313577586206975 + ], + [ + 28.34859913793116, + -0.9051724137930819 + ], + [ + 28.34859913793116, + -0.9051724137930819 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 28.34859913793116, + -0.9051724137930819 + ] + }, + { + "id": "TN8e5XHfV_VJhHm5b3xV5", + "type": "freedraw", + "x": 862.1941271776468, + "y": 70.700026939655, + "width": 33.119612068965466, + "height": 2.8690732758620925, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 117931327, + "version": 24, + "versionNonce": 1656628977, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4903017241379075, + 0 + ], + [ + 5.441810344827445, + 0 + ], + [ + 8.938577586206748, + 0 + ], + [ + 14.725215517241395, + -0.5738146551724412 + ], + [ + 14.970366379310235, + -0.5738146551724412 + ], + [ + 15.460668103448143, + -0.5738146551724412 + ], + [ + 15.70581896551721, + -0.5738146551724412 + ], + [ + 18.485991379310235, + -1.1476293103448256 + ], + [ + 18.976293103448143, + -1.1476293103448256 + ], + [ + 20.301724137930933, + -1.1476293103448256 + ], + [ + 21.282327586206748, + -1.1476293103448256 + ], + [ + 22.852909482758605, + -1.5086206896551744 + ], + [ + 27.559267241379303, + -2.2952586206896513 + ], + [ + 29.84913793103442, + -2.8690732758620925 + ], + [ + 30.339439655172328, + -2.8690732758620925 + ], + [ + 30.58459051724128, + -2.8690732758620925 + ], + [ + 33.119612068965466, + -2.8690732758620925 + ], + [ + 33.119612068965466, + -2.8690732758620925 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 33.119612068965466, + -2.8690732758620925 + ] + }, + { + "id": "iWvkEBuEyxXSSeKLzoMEe", + "type": "freedraw", + "x": 938.726993556957, + "y": 26.99043642241361, + "width": 1.4197198275861638, + "height": 38.415948275862036, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 550012863, + "version": 23, + "versionNonce": 1288748191, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.8157327586206975 + ], + [ + 0, + 2.306034482758605 + ], + [ + -0.5738146551723275, + 4.595905172413779 + ], + [ + -1.4197198275861638, + 11.592133620689651 + ], + [ + -1.4197198275861638, + 12.082435344827559 + ], + [ + -1.4197198275861638, + 17.869073275862036 + ], + [ + -1.4197198275861638, + 18.949353448275872 + ], + [ + -0.5765086206895376, + 25.355603448275872 + ], + [ + -0.5765086206895376, + 32.478448275862036 + ], + [ + -0.3313577586206975, + 34.04903017241378 + ], + [ + -0.3313577586206975, + 34.539331896551744 + ], + [ + -0.3313577586206975, + 35.02963362068965 + ], + [ + -0.3313577586206975, + 35.51993534482756 + ], + [ + -0.3313577586206975, + 36.25538793103448 + ], + [ + -0.3313577586206975, + 37.335668103448256 + ], + [ + -0.3313577586206975, + 38.415948275862036 + ], + [ + -0.3313577586206975, + 38.415948275862036 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -0.3313577586206975, + 38.415948275862036 + ] + }, + { + "id": "JrPxnvG3eFf_rqI1RSbHJ", + "type": "freedraw", + "x": 946.9004849362675, + "y": 21.5001346982757, + "width": 7.257543103448256, + "height": 14.194504310344826, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1092644383, + "version": 32, + "versionNonce": 857612497, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.4903017241379075, + 0.24515086206895376 + ], + [ + 1.2257543103447688, + 0.7354525862068613 + ], + [ + 1.7160560344826763, + 1.2257543103448256 + ], + [ + 2.206357758620584, + 1.2257543103448256 + ], + [ + 2.206357758620584, + 1.4709051724137794 + ], + [ + 2.206357758620584, + 2.7963362068965125 + ], + [ + 2.206357758620584, + 3.0414870689654663 + ], + [ + 2.206357758620584, + 5.576508620689651 + ], + [ + 2.206357758620584, + 6.656788793103431 + ], + [ + 2.206357758620584, + 7.982219827586164 + ], + [ + 1.7133620689653526, + 8.227370689655118 + ], + [ + 1.4655172413793025, + 8.472521551724128 + ], + [ + 0.9725215517240713, + 8.962823275862036 + ], + [ + 0.7246767241379075, + 10.288254310344826 + ], + [ + 0.47683189655163005, + 10.778556034482733 + ], + [ + -0.5091594827587187, + 11.514008620689651 + ], + [ + -1.00215517241395, + 11.759159482758605 + ], + [ + -1.25, + 12.004310344827559 + ], + [ + -1.990840517241395, + 12.494612068965466 + ], + [ + -2.483836206896626, + 12.739762931034477 + ], + [ + -2.73168103448279, + 12.98491379310343 + ], + [ + -2.9795258620690674, + 12.98491379310343 + ], + [ + -3.7203663793104624, + 13.475215517241338 + ], + [ + -4.803340517241395, + 14.194504310344826 + ], + [ + -5.0511853448276725, + 14.194504310344826 + ], + [ + -5.0511853448276725, + 14.194504310344826 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -5.0511853448276725, + 14.194504310344826 + ] + }, + { + "id": "dbNGIbMEpS2gnO3J_pkCD", + "type": "freedraw", + "x": 964.696821143164, + "y": 28.33203124999983, + "width": 3.8011853448276725, + "height": 31.150323275862036, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 841644447, + "version": 31, + "versionNonce": 770560191, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.24784482758627746, + 0.24515086206895376 + ], + [ + -0.6088362068966262, + 1.3254310344827331 + ], + [ + -1.5436422413793025, + 4.695581896551687 + ], + [ + -1.5436422413793025, + 5.775862068965523 + ], + [ + -2.2440732758620925, + 10.352909482758605 + ], + [ + -2.2440732758620925, + 11.433189655172384 + ], + [ + -2.49191810344837, + 14.213362068965523 + ], + [ + -2.49191810344837, + 14.70366379310343 + ], + [ + -2.49191810344837, + 18.200431034482733 + ], + [ + -2.7397629310345337, + 19.525862068965523 + ], + [ + -2.7397629310345337, + 20.606142241379303 + ], + [ + -3.4401939655173237, + 25.183189655172384 + ], + [ + -3.4401939655173237, + 25.67349137931035 + ], + [ + -3.8011853448276725, + 27.244073275862036 + ], + [ + -3.8011853448276725, + 27.734375 + ], + [ + -3.8011853448276725, + 28.224676724137908 + ], + [ + -3.8011853448276725, + 28.46982758620686 + ], + [ + -3.5560344827587187, + 28.960129310344826 + ], + [ + -3.5560344827587187, + 29.20528017241378 + ], + [ + -3.0657327586206975, + 29.450431034482733 + ], + [ + -1.985452586206975, + 30.169719827586164 + ], + [ + -1.7403017241380212, + 30.414870689655174 + ], + [ + -1.7403017241380212, + 30.660021551724128 + ], + [ + -1.7403017241380212, + 31.150323275862036 + ], + [ + -1.7403017241380212, + 31.150323275862036 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -1.7403017241380212, + 31.150323275862036 + ] + }, + { + "id": "t29WQd6UbNukP4p1DbxJB", + "type": "freedraw", + "x": 986.8412176948881, + "y": 25.514143318965353, + "width": 10.870150862068954, + "height": 43.450969827586164, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 249183487, + "version": 23, + "versionNonce": 1294196401, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405783, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.24515086206895376 + ], + [ + -0.24784482758616377, + 0.980603448275815 + ], + [ + -0.24784482758616377, + 2.0608836206896513 + ], + [ + -1.1826508620689538, + 5.431034482758605 + ], + [ + -1.756465517241395, + 7.720905172413779 + ], + [ + -2.0043103448275588, + 8.211206896551687 + ], + [ + -2.0043103448275588, + 12.917564655172384 + ], + [ + -2.9391163793103487, + 16.287715517241338 + ], + [ + -3.3001077586206975, + 17.367995689655174 + ], + [ + -5.8378232758620925, + 23.529094827586164 + ], + [ + -7.238685344827559, + 27.025862068965466 + ], + [ + -8.59913793103442, + 34.02209051724134 + ], + [ + -8.59913793103442, + 34.5123922413793 + ], + [ + -10.169719827586164, + 39.70905172413791 + ], + [ + -10.870150862068954, + 43.20581896551721 + ], + [ + -10.870150862068954, + 43.450969827586164 + ], + [ + -10.870150862068954, + 43.450969827586164 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -10.870150862068954, + 43.450969827586164 + ] + }, + { + "id": "T48kS50zMUTHZiZRRFbho", + "type": "freedraw", + "x": 988.2501616604053, + "y": 30.893992456896342, + "width": 11.470905172413836, + "height": 26.678340517241395, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 647277407, + "version": 24, + "versionNonce": 1855152351, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.49030172413796436 + ], + [ + 0.7192887931034875, + 1.5705818965517437 + ], + [ + 0.7192887931034875, + 1.8157327586206975 + ], + [ + 5.242456896551744, + 9.175646551724185 + ], + [ + 9.692887931034534, + 15.409482758620697 + ], + [ + 10.051185344827672, + 16.98006465517244 + ], + [ + 10.62230603448279, + 19.269935344827616 + ], + [ + 11.225754310344882, + 20.840517241379303 + ], + [ + 11.225754310344882, + 21.085668103448313 + ], + [ + 11.225754310344882, + 21.57596982758622 + ], + [ + 11.470905172413836, + 22.90140086206901 + ], + [ + 11.470905172413836, + 23.391702586206918 + ], + [ + 11.470905172413836, + 23.882004310344826 + ], + [ + 11.470905172413836, + 24.37230603448279 + ], + [ + 11.470905172413836, + 24.862607758620697 + ], + [ + 11.470905172413836, + 25.10775862068965 + ], + [ + 11.470905172413836, + 26.678340517241395 + ], + [ + 11.470905172413836, + 26.678340517241395 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 11.470905172413836, + 26.678340517241395 + ] + }, + { + "id": "cYbuKqi2L4myMjL7c5Shj", + "type": "freedraw", + "x": 983.1855064879916, + "y": 48.34819504310326, + "width": 17.83943965517244, + "height": 2.8313577586206975, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1185768927, + "version": 15, + "versionNonce": 2138497169, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -0.24784482758622062 + ], + [ + 1.0802801724137225, + -0.9698275862069181 + ], + [ + 2.6508620689654663, + -1.9396551724137794 + ], + [ + 3.7311422413793025, + -1.9396551724137794 + ], + [ + 7.101293103448256, + -1.9396551724137794 + ], + [ + 9.391163793103374, + -1.9396551724137794 + ], + [ + 17.594288793103374, + -2.8313577586206975 + ], + [ + 17.83943965517244, + -2.8313577586206975 + ], + [ + 17.83943965517244, + -2.8313577586206975 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 17.83943965517244, + -2.8313577586206975 + ] + }, + { + "id": "0PPG9aJeJQUI4ynzKyLpP", + "type": "freedraw", + "x": 1015.020097005233, + "y": 57.20595366379291, + "width": 12.747844827586391, + "height": 37.421875, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1487318847, + "version": 51, + "versionNonce": 5369087, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.4929956896552312, + -0.24784482758622062 + ], + [ + -0.9886853448276725, + -0.9886853448275588 + ], + [ + -1.3496767241380212, + -2.071659482758605 + ], + [ + -3.04148706896558, + -8.483297413793082 + ], + [ + -3.04148706896558, + -8.976293103448256 + ], + [ + -3.04148706896558, + -12.723599137931046 + ], + [ + -3.04148706896558, + -13.806573275862092 + ], + [ + -3.04148706896558, + -14.54741379310343 + ], + [ + -2.25754310344837, + -19.256465517241395 + ], + [ + -1.55980603448279, + -23.003771551724128 + ], + [ + -1.55980603448279, + -23.25161637931035 + ], + [ + -0.41756465517244123, + -29.043642241379303 + ], + [ + 0.1535560344826763, + -31.336206896551744 + ], + [ + 1.796875, + -35.08351293103448 + ], + [ + 2.0420258620689538, + -35.57650862068965 + ], + [ + 2.5323275862068613, + -36.069504310344826 + ], + [ + 3.022629310344769, + -36.317349137931046 + ], + [ + 3.5129310344826763, + -36.81303879310343 + ], + [ + 4.5932112068965125, + -37.17403017241378 + ], + [ + 5.08351293103442, + -37.421875 + ], + [ + 5.818965517241281, + -37.176724137931046 + ], + [ + 6.3092672413793025, + -37.176724137931046 + ], + [ + 7.044719827586164, + -36.68642241379308 + ], + [ + 7.764008620689651, + -35.6061422413793 + ], + [ + 8.612607758620697, + -34.03556034482756 + ], + [ + 8.857758620689651, + -33.54525862068965 + ], + [ + 8.857758620689651, + -33.3001077586207 + ], + [ + 8.857758620689651, + -31.974676724137908 + ], + [ + 8.857758620689651, + -31.729525862068954 + ], + [ + 9.102909482758491, + -30.40409482758622 + ], + [ + 9.102909482758491, + -26.907327586206918 + ], + [ + 9.102909482758491, + -25.581896551724128 + ], + [ + 9.102909482758491, + -24.50161637931035 + ], + [ + 9.102909482758491, + -23.76616379310343 + ], + [ + 9.102909482758491, + -23.275862068965523 + ], + [ + 9.102909482758491, + -22.78556034482756 + ], + [ + 9.102909482758491, + -22.540409482758605 + ], + [ + 9.102909482758491, + -19.760237068965523 + ], + [ + 9.102909482758491, + -17.47036637931035 + ], + [ + 9.102909482758491, + -13.483297413793082 + ], + [ + 9.102909482758491, + -7.567349137931046 + ], + [ + 9.461206896551516, + -5.9967672413793025 + ], + [ + 9.461206896551516, + -5.751616379310349 + ], + [ + 9.706357758620811, + -5.751616379310349 + ], + [ + 9.706357758620811, + -5.751616379310349 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 9.706357758620811, + -5.751616379310349 + ] + }, + { + "id": "Rz1yMz9J1S3qn224NJoLf", + "type": "freedraw", + "x": 1036.415571143164, + "y": 24.687095905172214, + "width": 0.6088362068967399, + "height": 31.74838362068965, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2012909855, + "version": 21, + "versionNonce": 1473160817, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.24784482758627746, + 0.24515086206895376 + ], + [ + -0.24784482758627746, + 1.32543103448279 + ], + [ + -0.24784482758627746, + 1.5705818965517437 + ], + [ + -0.24784482758627746, + 2.5511853448276156 + ], + [ + -0.6088362068967399, + 3.631465517241395 + ], + [ + -0.6088362068967399, + 7.001616379310349 + ], + [ + -0.6088362068967399, + 9.291487068965523 + ], + [ + -0.6088362068967399, + 21.12068965517244 + ], + [ + -0.6088362068967399, + 21.61099137931035 + ], + [ + -0.6088362068967399, + 27.397629310344826 + ], + [ + -0.6088362068967399, + 29.6875 + ], + [ + -0.6088362068967399, + 31.258081896551744 + ], + [ + -0.6088362068967399, + 31.503232758620697 + ], + [ + -0.6088362068967399, + 31.74838362068965 + ], + [ + -0.6088362068967399, + 31.74838362068965 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -0.6088362068967399, + 31.74838362068965 + ] + }, + { + "id": "jCPk3rczWIwuQVfUFkm8Z", + "type": "freedraw", + "x": 1037.743696143164, + "y": 24.013604525861865, + "width": 16.505926724137908, + "height": 29.380387931034477, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 569849663, + "version": 85, + "versionNonce": 1319761183, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.060883620689765, + -0.6088362068965125 + ], + [ + 6.767241379310235, + -1.3954741379309894 + ], + [ + 7.847521551724185, + -1.3954741379309894 + ], + [ + 8.337823275861865, + -1.3954741379309894 + ], + [ + 8.828125, + -1.64331896551721 + ], + [ + 9.563577586206975, + -1.64331896551721 + ], + [ + 10.54418103448279, + -1.1530172413793025 + ], + [ + 11.03448275862047, + -0.9078663793103487 + ], + [ + 11.769935344827445, + -0.4175646551723844 + ], + [ + 12.015086206896513, + -0.17241379310343063 + ], + [ + 12.995689655172328, + 0.5630387931034875 + ], + [ + 12.995689655172328, + 1.053340517241395 + ], + [ + 12.995689655172328, + 2.033943965517267 + ], + [ + 12.995689655172328, + 2.2790948275862206 + ], + [ + 12.995689655172328, + 3.0145474137931387 + ], + [ + 12.995689655172328, + 4.094827586206918 + ], + [ + 12.74784482758605, + 4.339978448275872 + ], + [ + 12.74784482758605, + 4.585129310344826 + ], + [ + 12.74784482758605, + 5.07543103448279 + ], + [ + 12.74784482758605, + 5.320581896551744 + ], + [ + 12.74784482758605, + 5.5657327586206975 + ], + [ + 12.5, + 6.056034482758662 + ], + [ + 12.252155172413723, + 6.301185344827616 + ], + [ + 10.676185344827445, + 7.265625 + ], + [ + 10.183189655172328, + 7.510775862068954 + ], + [ + 9.93534482758605, + 8.001077586206918 + ], + [ + 9.6875, + 8.001077586206918 + ], + [ + 9.191810344827445, + 8.246228448275872 + ], + [ + 8.943965517241395, + 8.491379310344826 + ], + [ + 8.44827586206884, + 8.736530172413836 + ], + [ + 7.9552801724137225, + 8.736530172413836 + ], + [ + 6.379310344827445, + 9.455818965517267 + ], + [ + 6.131465517241395, + 9.455818965517267 + ], + [ + 3.59105603448279, + 10.026939655172441 + ], + [ + 3.59105603448279, + 10.272090517241395 + ], + [ + 3.098060344827445, + 10.517241379310349 + ], + [ + 2.6050646551723275, + 10.517241379310349 + ], + [ + 2.35721982758605, + 10.762392241379303 + ], + [ + 2.109375, + 10.762392241379303 + ], + [ + 2.35452586206884, + 10.762392241379303 + ], + [ + 3.335129310344655, + 10.266702586206918 + ], + [ + 8.04148706896558, + 10.266702586206918 + ], + [ + 10.821659482758605, + 10.511853448275872 + ], + [ + 13.111530172413723, + 11.082974137931046 + ], + [ + 13.84698275862047, + 11.328125 + ], + [ + 14.092133620689765, + 11.573275862068954 + ], + [ + 14.582435344827445, + 11.818426724137964 + ], + [ + 14.827586206896513, + 12.063577586206918 + ], + [ + 15.31788793103442, + 12.799030172413836 + ], + [ + 15.31788793103442, + 13.289331896551744 + ], + [ + 16.015625, + 17.276400862068954 + ], + [ + 16.015625, + 17.521551724137964 + ], + [ + 16.505926724137908, + 18.011853448275872 + ], + [ + 16.505926724137908, + 18.257004310344826 + ], + [ + 16.505926724137908, + 18.50215517241378 + ], + [ + 16.505926724137908, + 19.48275862068965 + ], + [ + 16.505926724137908, + 19.727909482758662 + ], + [ + 16.505926724137908, + 22.508081896551744 + ], + [ + 16.505926724137908, + 22.753232758620697 + ], + [ + 15.765086206896513, + 23.488685344827616 + ], + [ + 15.272090517241395, + 23.73383620689657 + ], + [ + 13.941271551724185, + 24.453125 + ], + [ + 13.44827586206884, + 24.943426724137964 + ], + [ + 12.707435344827445, + 25.188577586206918 + ], + [ + 11.624461206896513, + 25.90786637931035 + ], + [ + 11.376616379310235, + 26.153017241379303 + ], + [ + 10.63577586206884, + 26.398168103448313 + ], + [ + 10.38793103448279, + 26.643318965517267 + ], + [ + 9.647090517241395, + 27.133620689655174 + ], + [ + 9.399245689655118, + 27.133620689655174 + ], + [ + 7.82327586206884, + 27.737068965517267 + ], + [ + 4.3238146551723275, + 27.737068965517267 + ], + [ + 1.538254310344655, + 27.737068965517267 + ], + [ + 1.290409482758605, + 27.489224137931046 + ], + [ + 1.0425646551723275, + 27.489224137931046 + ], + [ + 0.7947198275860501, + 27.489224137931046 + ], + [ + 0.546875, + 27.489224137931046 + ], + [ + 0.05118534482744508, + 27.489224137931046 + ], + [ + 0.05118534482744508, + 27.489224137931046 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 0.05118534482744508, + 27.489224137931046 + ] + }, + { + "id": "P5QUa-enPEZdhsvsZPJLs", + "type": "freedraw", + "x": 1063.0265625224743, + "y": 24.16446659482739, + "width": 9.06519396551721, + "height": 27.43534482758622, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 609313119, + "version": 35, + "versionNonce": 1089646673, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.24515086206906744, + 0.24515086206895376 + ], + [ + 0.980603448275815, + 0.7354525862069181 + ], + [ + 2.060883620689765, + 1.4547413793103487 + ], + [ + 3.776939655172555, + 3.1707974137931387 + ], + [ + 7.64547413793116, + 8.731142241379303 + ], + [ + 7.64547413793116, + 9.221443965517267 + ], + [ + 8.461745689655345, + 11.756465517241395 + ], + [ + 8.461745689655345, + 12.246767241379303 + ], + [ + 8.461745689655345, + 12.737068965517267 + ], + [ + 8.82004310344837, + 13.817349137931046 + ], + [ + 8.82004310344837, + 14.552801724137964 + ], + [ + 8.82004310344837, + 14.797952586206918 + ], + [ + 9.06519396551721, + 16.12338362068965 + ], + [ + 9.06519396551721, + 16.613685344827616 + ], + [ + 9.06519396551721, + 17.693965517241395 + ], + [ + 9.06519396551721, + 18.184267241379303 + ], + [ + 9.06519396551721, + 18.91971982758622 + ], + [ + 9.06519396551721, + 21.209590517241395 + ], + [ + 8.81734913793116, + 21.699892241379303 + ], + [ + 6.8507543103448825, + 23.90625 + ], + [ + 6.8507543103448825, + 24.151400862068954 + ], + [ + 5.86476293103442, + 24.641702586206918 + ], + [ + 5.37176724137953, + 24.886853448275872 + ], + [ + 4.876077586206975, + 25.132004310344826 + ], + [ + 3.793103448275815, + 25.851293103448256 + ], + [ + 1.72413793103442, + 27.190193965517267 + ], + [ + 1.47629310344837, + 27.190193965517267 + ], + [ + 1.2284482758620925, + 27.43534482758622 + ], + [ + 1.2284482758620925, + 27.43534482758622 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 1.2284482758620925, + 27.43534482758622 + ] + }, + { + "id": "_bdy-p7oXRWBWqkasRruk", + "type": "freedraw", + "x": 926.1623383845433, + "y": 72.03084590517221, + "width": 144.42887931034488, + "height": 7.300646551724128, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1676289343, + "version": 81, + "versionNonce": 17561919, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.980603448275815, + -0.4956896551723844 + ], + [ + 3.2704741379309326, + -1.0695043103448256 + ], + [ + 9.057112068965466, + -1.0695043103448256 + ], + [ + 10.137392241379303, + -1.0695043103448256 + ], + [ + 17.750538793103487, + -1.0695043103448256 + ], + [ + 18.240840517241395, + -1.0695043103448256 + ], + [ + 20.775862068965466, + -0.49838362068965125 + ], + [ + 21.02101293103442, + -0.49838362068965125 + ], + [ + 21.511314655172328, + -0.49838362068965125 + ], + [ + 23.80118534482756, + -0.49838362068965125 + ], + [ + 24.291487068965466, + -0.49838362068965125 + ], + [ + 24.781788793103487, + -0.49838362068965125 + ], + [ + 25.026939655172328, + -0.49838362068965125 + ], + [ + 25.517241379310235, + -0.49838362068965125 + ], + [ + 27.807112068965466, + -0.49838362068965125 + ], + [ + 28.887392241379303, + -0.49838362068965125 + ], + [ + 33.46713362068965, + -0.49838362068965125 + ], + [ + 36.963900862068954, + 0.19935344827587187 + ], + [ + 40.950969827586164, + 0.19935344827587187 + ], + [ + 42.03125, + -0.16163793103447688 + ], + [ + 43.60183189655163, + -0.5226293103448256 + ], + [ + 43.8469827586207, + -0.5226293103448256 + ], + [ + 44.09213362068965, + -0.5226293103448256 + ], + [ + 46.62715517241372, + -0.5226293103448256 + ], + [ + 48.917025862068954, + -1.09644396551721 + ], + [ + 50.4876077586207, + -1.3442887931034306 + ], + [ + 53.984375, + -1.3442887931034306 + ], + [ + 57.726293103448256, + -1.3442887931034306 + ], + [ + 58.216594827586164, + -1.3442887931034306 + ], + [ + 58.952047413793025, + -1.3442887931034306 + ], + [ + 60.03232758620686, + -1.3442887931034306 + ], + [ + 63.529094827586164, + -2.0447198275862206 + ], + [ + 66.3092672413793, + -2.0447198275862206 + ], + [ + 72.22521551724128, + -2.890625 + ], + [ + 78.38631465517233, + -3.7365301724137794 + ], + [ + 78.63146551724128, + -3.7365301724137794 + ], + [ + 81.41163793103442, + -4.310344827586221 + ], + [ + 82.49191810344826, + -4.310344827586221 + ], + [ + 83.81734913793093, + -4.671336206896569 + ], + [ + 84.0625, + -4.919181034482733 + ], + [ + 84.79795258620686, + -5.167025862068954 + ], + [ + 85.28825431034477, + -5.167025862068954 + ], + [ + 91.0748922413793, + -5.5280172413793025 + ], + [ + 95.78125, + -6.314655172413779 + ], + [ + 97.35183189655163, + -6.314655172413779 + ], + [ + 97.5969827586207, + -6.314655172413779 + ], + [ + 99.16756465517233, + -6.314655172413779 + ], + [ + 101.45743534482767, + -6.314655172413779 + ], + [ + 106.65409482758628, + -6.314655172413779 + ], + [ + 106.89924568965512, + -6.314655172413779 + ], + [ + 111.85075431034488, + -7.101293103448256 + ], + [ + 112.34105603448256, + -7.101293103448256 + ], + [ + 117.40840517241372, + -7.101293103448256 + ], + [ + 118.97898706896535, + -7.101293103448256 + ], + [ + 122.47575431034488, + -7.101293103448256 + ], + [ + 122.96605603448256, + -7.101293103448256 + ], + [ + 125.50107758620675, + -6.530172413793082 + ], + [ + 128.28125, + -6.530172413793082 + ], + [ + 128.7715517241379, + -6.530172413793082 + ], + [ + 136.3846982758621, + -6.285021551724128 + ], + [ + 136.875, + -6.285021551724128 + ], + [ + 137.12015086206907, + -6.285021551724128 + ], + [ + 137.85560344827582, + -6.285021551724128 + ], + [ + 138.34590517241372, + -6.285021551724128 + ], + [ + 139.91648706896535, + -6.285021551724128 + ], + [ + 140.4067887931035, + -6.285021551724128 + ], + [ + 141.3873922413793, + -6.285021551724128 + ], + [ + 141.63254310344814, + -6.285021551724128 + ], + [ + 141.8776939655172, + -6.285021551724128 + ], + [ + 142.12284482758628, + -6.532866379310349 + ], + [ + 142.36799568965512, + -6.532866379310349 + ], + [ + 142.61314655172396, + -6.780711206896569 + ], + [ + 143.6934267241379, + -6.780711206896569 + ], + [ + 144.42887931034488, + -6.780711206896569 + ], + [ + 144.42887931034488, + -6.780711206896569 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 144.42887931034488, + -6.780711206896569 + ] + }, + { + "id": "zYDqQyR4hBKL0zYLX2kwi", + "type": "freedraw", + "x": 939.5567349362675, + "y": 92.14399245689634, + "width": 2.89870689655163, + "height": 29.698275862068954, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1176532703, + "version": 28, + "versionNonce": 1622834737, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0.49030172413796436 + ], + [ + 0, + 2.650862068965523 + ], + [ + 0, + 3.7311422413793025 + ], + [ + 1.9692887931033738, + 9.51778017241378 + ], + [ + 2.3275862068965125, + 10.598060344827616 + ], + [ + 2.89870689655163, + 13.133081896551744 + ], + [ + 2.89870689655163, + 13.623383620689651 + ], + [ + 2.89870689655163, + 19.410021551724128 + ], + [ + 2.89870689655163, + 20.490301724137964 + ], + [ + 2.89870689655163, + 22.65086206896558 + ], + [ + 2.5377155172412813, + 23.731142241379303 + ], + [ + 2.5377155172412813, + 24.22144396551721 + ], + [ + 2.5377155172412813, + 24.466594827586164 + ], + [ + 2.5377155172412813, + 24.71174568965523 + ], + [ + 2.5377155172412813, + 25.447198275862092 + ], + [ + 2.5377155172412813, + 25.692349137931046 + ], + [ + 2.5377155172412813, + 25.9375 + ], + [ + 2.5377155172412813, + 26.427801724137908 + ], + [ + 2.5377155172412813, + 28.71767241379314 + ], + [ + 2.2898706896551175, + 29.207974137931046 + ], + [ + 2.2898706896551175, + 29.698275862068954 + ], + [ + 2.2898706896551175, + 29.698275862068954 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 2.2898706896551175, + 29.698275862068954 + ] + }, + { + "id": "98dU5SnyKX9D6uTgdHhjc", + "type": "freedraw", + "x": 940.1601832121295, + "y": 87.72858297413774, + "width": 29.100215517241395, + "height": 23.59375, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1609124319, + "version": 46, + "versionNonce": 2094561631, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.24515086206895376, + 0 + ], + [ + 3.615301724138021, + 0 + ], + [ + 7.112068965517324, + 0 + ], + [ + 14.108297413793139, + 0 + ], + [ + 14.353448275862092, + 0 + ], + [ + 17.723599137931046, + -0.5738146551724412 + ], + [ + 17.96875, + -0.821659482758605 + ], + [ + 18.213900862068954, + -0.821659482758605 + ], + [ + 19.784482758620697, + -0.821659482758605 + ], + [ + 22.074353448275815, + -0.821659482758605 + ], + [ + 27.271012931034534, + -0.03771551724139499 + ], + [ + 27.76131465517244, + 0.45258620689656937 + ], + [ + 28.496767241379303, + 1.1880387931034306 + ], + [ + 28.741918103448256, + 1.678340517241395 + ], + [ + 29.100215517241395, + 3.248922413793082 + ], + [ + 29.100215517241395, + 3.4940732758620925 + ], + [ + 29.100215517241395, + 7.235991379310349 + ], + [ + 29.100215517241395, + 9.525862068965523 + ], + [ + 28.85237068965523, + 10.261314655172384 + ], + [ + 28.491379310344882, + 11.34159482758622 + ], + [ + 27.276400862068954, + 12.667025862068954 + ], + [ + 27.02855603448279, + 12.667025862068954 + ], + [ + 24.73599137931035, + 13.81196120689657 + ], + [ + 23.160021551724185, + 14.776400862068954 + ], + [ + 20.35829741379314, + 16.875 + ], + [ + 19.617456896551744, + 17.120150862068954 + ], + [ + 18.534482758620697, + 17.839439655172384 + ], + [ + 18.534482758620697, + 18.084590517241395 + ], + [ + 18.041487068965466, + 18.32974137931035 + ], + [ + 17.30064655172407, + 18.820043103448256 + ], + [ + 16.21767241379314, + 19.178340517241395 + ], + [ + 5.589978448275929, + 22.526939655172384 + ], + [ + 5.0969827586206975, + 22.772090517241395 + ], + [ + 4.014008620689651, + 22.772090517241395 + ], + [ + 3.2731681034482563, + 22.524245689655174 + ], + [ + 2.7801724137931387, + 22.276400862068954 + ], + [ + 2.5323275862068613, + 22.028556034482733 + ], + [ + 3.6126077586206975, + 21.667564655172384 + ], + [ + 4.102909482758605, + 21.17456896551721 + ], + [ + 4.102909482758605, + 21.17456896551721 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 4.102909482758605, + 21.17456896551721 + ] + }, + { + "id": "q50CGAoQBtSj_80AFwLhF", + "type": "freedraw", + "x": 994.597144419026, + "y": 82.78785021551704, + "width": 11.610991379310349, + "height": 34.97306034482756, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1948979999, + "version": 36, + "versionNonce": 906858513, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.740840517241395, + 0.49030172413796436 + ], + [ + -0.9886853448275588, + 0.49030172413796436 + ], + [ + -1.7295258620689538, + 1.2257543103448256 + ], + [ + -1.9773706896551175, + 1.2257543103448256 + ], + [ + -3.3081896551723275, + 2.190193965517267 + ], + [ + -4.391163793103374, + 2.9094827586206975 + ], + [ + -7.6400862068965125, + 8.696120689655174 + ], + [ + -9.040948275861979, + 12.192887931034477 + ], + [ + -10.010775862068954, + 13.76346982758622 + ], + [ + -10.371767241379303, + 14.84375 + ], + [ + -10.86745689655163, + 15.824353448275872 + ], + [ + -11.115301724137908, + 16.069504310344826 + ], + [ + -11.115301724137908, + 16.31465517241378 + ], + [ + -11.363146551724071, + 17.29525862068965 + ], + [ + -11.363146551724071, + 17.785560344827616 + ], + [ + -11.363146551724071, + 18.275862068965523 + ], + [ + -11.363146551724071, + 18.76616379310343 + ], + [ + -11.363146551724071, + 19.846443965517267 + ], + [ + -11.610991379310349, + 20.09159482758622 + ], + [ + -11.610991379310349, + 22.871767241379303 + ], + [ + -11.610991379310349, + 23.362068965517267 + ], + [ + -11.610991379310349, + 25.897090517241395 + ], + [ + -11.610991379310349, + 28.18696120689657 + ], + [ + -11.365840517241395, + 28.92241379310343 + ], + [ + -10.794719827586164, + 31.212284482758605 + ], + [ + -9.404633620689651, + 33.74730603448279 + ], + [ + -9.404633620689651, + 33.992456896551744 + ], + [ + -9.159482758620697, + 34.48275862068965 + ], + [ + -9.159482758620697, + 34.97306034482756 + ], + [ + -9.159482758620697, + 34.97306034482756 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + -9.159482758620697, + 34.97306034482756 + ] + }, + { + "id": "oqKK06mxIgxCpj-idFXqs", + "type": "freedraw", + "x": 1000.790571143164, + "y": 114.25606142241355, + "width": 21.80495689655163, + "height": 35.75161637931029, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1827919647, + "version": 41, + "versionNonce": 660600191, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -0.7408405172413381 + ], + [ + 0, + -1.2338362068965125 + ], + [ + 1.290409482758605, + -4.609374999999943 + ], + [ + 1.7807112068965125, + -5.1023706896551175 + ], + [ + 3.415948275861979, + -7.887931034482733 + ], + [ + 3.415948275861979, + -8.380926724137908 + ], + [ + 3.6610991379309326, + -8.876616379310292 + ], + [ + 4.806034482758605, + -11.169181034482733 + ], + [ + 5.051185344827559, + -11.664870689655118 + ], + [ + 5.2963362068965125, + -12.157866379310292 + ], + [ + 5.78663793103442, + -13.14385775862064 + ], + [ + 6.031788793103374, + -13.636853448275815 + ], + [ + 6.2769396551723275, + -14.132543103448256 + ], + [ + 6.522090517241281, + -14.38038793103442 + ], + [ + 6.767241379310235, + -15.121228448275815 + ], + [ + 7.125538793103374, + -16.20420258620686 + ], + [ + 8.267780172413723, + -20.789331896551687 + ], + [ + 9.835668103448256, + -25.498383620689594 + ], + [ + 10.08081896551721, + -25.498383620689594 + ], + [ + 11.470905172413723, + -22.963362068965466 + ], + [ + 13.186961206896513, + -18.383620689655118 + ], + [ + 13.90625, + -17.303340517241338 + ], + [ + 14.477370689655118, + -15.013469827586164 + ], + [ + 17.52963362068965, + -3.1842672413792457 + ], + [ + 18.94396551724128, + 5.021551724138021 + ], + [ + 19.189116379310235, + 5.511853448275929 + ], + [ + 19.189116379310235, + 5.7570043103448825 + ], + [ + 20.334051724137908, + 8.046875 + ], + [ + 20.57920258620686, + 8.292025862068954 + ], + [ + 20.824353448275815, + 8.782327586206975 + ], + [ + 21.06950431034477, + 9.027478448275929 + ], + [ + 21.559806034482676, + 9.517780172413836 + ], + [ + 21.80495689655163, + 10.008081896551744 + ], + [ + 21.80495689655163, + 10.253232758620697 + ], + [ + 21.80495689655163, + 10.253232758620697 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 21.80495689655163, + 10.253232758620697 + ] + }, + { + "id": "qFoiR981kmUij_uhmc6LW", + "type": "freedraw", + "x": 1006.3320582121295, + "y": 108.56910021551704, + "width": 13.43480603448279, + "height": 2.028556034482733, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1143785407, + "version": 15, + "versionNonce": 1994614257, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.24515086206895376, + -0.24784482758622062 + ], + [ + 0.4903017241379075, + -0.24784482758622062 + ], + [ + 0.980603448275815, + -0.740840517241395 + ], + [ + 2.5511853448275588, + -1.1018318965517437 + ], + [ + 3.631465517241395, + -1.1018318965517437 + ], + [ + 12.454202586206861, + -2.028556034482733 + ], + [ + 12.944504310344769, + -2.028556034482733 + ], + [ + 13.43480603448279, + -2.028556034482733 + ], + [ + 13.43480603448279, + -2.028556034482733 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 13.43480603448279, + -2.028556034482733 + ] + }, + { + "id": "-HaPD-y2fi-4hYytiThNN", + "type": "freedraw", + "x": 1040.354148729371, + "y": 74.92147090517221, + "width": 13.009159482758605, + "height": 38.78502155172413, + "angle": 0, + "strokeColor": "#785a11", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1191378207, + "version": 42, + "versionNonce": 1742925215, + "isDeleted": false, + "boundElements": null, + "updated": 1698274405784, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.24515086206884007, + 0 + ], + [ + 0.49030172413768014, + 0.24515086206895376 + ], + [ + 0.7354525862067476, + 0.49030172413796436 + ], + [ + 1.4709051724134952, + 1.2257543103448256 + ], + [ + 1.96120689655163, + 1.4709051724137794 + ], + [ + 4.757543103448143, + 3.5452586206896513 + ], + [ + 5.24784482758605, + 3.790409482758605 + ], + [ + 8.29202586206884, + 6.834590517241395 + ], + [ + 8.53717672413768, + 7.3248922413793025 + ], + [ + 10.498383620689538, + 9.286099137931046 + ], + [ + 10.498383620689538, + 9.53125 + ], + [ + 10.743534482758605, + 9.776400862068954 + ], + [ + 10.743534482758605, + 10.021551724137964 + ], + [ + 11.707974137930933, + 11.592133620689651 + ], + [ + 12.066271551723958, + 12.67241379310343 + ], + [ + 12.764008620689538, + 16.659482758620697 + ], + [ + 13.009159482758605, + 17.149784482758605 + ], + [ + 13.009159482758605, + 18.475215517241395 + ], + [ + 13.009159482758605, + 18.72036637931035 + ], + [ + 13.009159482758605, + 19.455818965517267 + ], + [ + 13.009159482758605, + 19.946120689655174 + ], + [ + 13.009159482758605, + 20.191271551724128 + ], + [ + 13.009159482758605, + 27.1875 + ], + [ + 12.648168103448143, + 28.26778017241378 + ], + [ + 9.507004310344655, + 33.270474137931046 + ], + [ + 9.014008620689538, + 33.515625 + ], + [ + 7.6831896551723275, + 34.48006465517244 + ], + [ + 7.19019396551721, + 34.725215517241395 + ], + [ + 6.449353448275815, + 35.2155172413793 + ], + [ + 5.95635775862047, + 35.460668103448256 + ], + [ + 5.215517241379075, + 35.95096982758622 + ], + [ + 4.967672413793025, + 36.196120689655174 + ], + [ + 1.918103448275815, + 38.29471982758622 + ], + [ + 1.4251077586204701, + 38.539870689655174 + ], + [ + 0.9294181034481426, + 38.78502155172413 + ], + [ + 0.9294181034481426, + 38.78502155172413 + ] + ], + "pressures": [], + "simulatePressure": true, + "lastCommittedPoint": [ + 0.9294181034481426, + 38.78502155172413 + ] + }, + { + "type": "line", + "version": 191, + "versionNonce": 96565137, + "isDeleted": false, + "id": "wJpp-i8nWyDza9wry9SUp", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 65.261951446503, + "y": -215.00497909096455, + "strokeColor": "#e03131", + "backgroundColor": "#b2f2bb", + "width": 0, + "height": 293.14803106074135, + "seed": 615686641, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274413964, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 293.14803106074135 + ] + ] + }, + { + "id": "OSV61uOC", + "type": "text", + "x": -46.09067582236236, + "y": -238.33573656621556, + "width": 47.879974365234375, + "height": 25, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1707885151, + "version": 40, + "versionNonce": 1595161919, + "isDeleted": false, + "boundElements": null, + "updated": 1698274409679, + "link": null, + "locked": false, + "text": " -1/2", + "rawText": " -1/2", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18, + "containerId": null, + "originalText": " -1/2", + "lineHeight": 1.25 + }, + { + "type": "line", + "version": 256, + "versionNonce": 1473536735, + "isDeleted": false, + "id": "Ym5GWJeM0w-2S4XfuOnY5", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 150.22763793884738, + "y": -213.05527549353246, + "strokeColor": "#e03131", + "backgroundColor": "#b2f2bb", + "width": 0, + "height": 293.14803106074135, + "seed": 783403153, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1698274468960, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 293.14803106074135 + ] + ] + } + ], + "appState": { + "theme": "dark", + "viewBackgroundColor": "#ffffff", + "currentItemStrokeColor": "#e03131", + "currentItemBackgroundColor": "transparent", + "currentItemFillStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemStrokeStyle": "solid", + "currentItemRoughness": 1, + "currentItemOpacity": 30, + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemTextAlign": "left", + "currentItemStartArrowhead": null, + "currentItemEndArrowhead": "arrow", + "scrollX": 307.8171439898424, + "scrollY": 346.9859009973041, + "zoom": { + "value": 1.7931411495595646 + }, + "currentItemRoundness": "round", + "gridSize": null, + "gridColor": { + "Bold": "#C9C9C9FF", + "Regular": "#EDEDEDFF" + }, + "currentStrokeOptions": null, + "previousGridSize": null, + "frameRendering": { + "enabled": true, + "clip": true, + "name": true, + "outline": true + } + }, + "files": {} +} +``` +%% \ No newline at end of file diff --git a/Statistiques révisions.md b/Statistiques révisions.md new file mode 100644 index 00000000..22f2dc53 --- /dev/null +++ b/Statistiques révisions.md @@ -0,0 +1,108 @@ + +# TD 0 + +## Exercice 1 + +$X \leadsto \mathcal{N}(0, 1)$ + +1. $P(-1.96 < X)$ + +Comme $X \leadsto \mathcal{N}(0, 1)$, on sait que $P(-1.96 < X) = P(X < 1.96) = \Pi(1.96) \approx 0.9750$ + +2. $P(-1.96 < X < 1.96)$ + +$$ +\begin{align} +P(-1.96 < X < 1.96) &= P(X < 1.96) - P(X < -1.96) \\ +&= P(X < 1.96) - 1 + P(X < 1.96) \\ +&= \Pi(1.96) + P(1.96) - 1 \\ +&\approx 2\times 0.9750 - 1 \\ +&\approx 0.95 +\end{align} +$$ + + +## Exercice 2 + +$X \leadsto \mathcal{N}(3, 2)$ + +1. $P(1 \leq X \leq 2)$ +$$ +\begin{align} +P(1 \leq X \leq 2) &= P(-2 \leq X - 3 \leq -1) \\ +&= P\left( -1 \leq \frac{X-3}{2} \leq -\frac{1}{2} \right) \\ +&= P\left( -1 \leq Y \leq -\frac{1}{2} \right) & \text{où } Y \leadsto \mathcal{N}(0, 1) \\ +&= P\left( \frac{1}{2} \leq Y \leq 1 \right) \\ +&= P(Y \leq 1) - P\left( \frac{1}{2} \leq Y \right) \\ +&= P(Y \leq 1) - 1 + P\left( Y \leq \frac{1}{2} \right) \\ +&= \Pi(1) + \Pi\left( \frac{1}{2} \right) - 1 \\ +&\approx 0.8413 + 0.6915 - 1 \\ +&\approx 0.5328 +\end{align} +$$ +1. $P_{X<3} (1 \leq X \leq 4)$ + +$$ +\begin{align} +P_{X<3} (1 \leq X \leq 4) &= P_{X < 3} (1 \leq X \leq 3) \\[1em] +&= \frac{P(1 \leq X \leq 3)}{P(X < 3)} \\[1em] +&= \frac{P\left( -\frac{1}{2} \leq \frac{X - 3}{2} \leq 0 \right) }{P\left( \frac{X-3}{2} \leq 0 \right)} \\[1em] +&= \frac{P\left( -\frac{1}{2} \leq Y \leq 0 \right)}{P(Y \leq 0)} & \text{où } Y \leadsto \mathcal{N}(0, 1) \\[1em] +&= \frac{P(Y \leq 0) - P\left( Y \leq -\frac{1}{2} \right)}{P(Y \leq 0)} \\[1em] +&= \frac{P(Y \leq 0) - P\left( Y \geq \frac{1}{2} \right)}{P(Y \leq 0)} \\[1em] +&= \frac{P(Y \leq 0) - 1 + P\left( Y \leq \frac{1}{2} \right)}{P(Y \leq 0)} \\[1em] +&= \frac{P(Y \leq 0) + P\left( Y \leq \frac{1}{2} \right) - 1}{P(Y \leq 0)} \\[1em] +&= \frac{\Pi(0) + \Pi\left( \frac{1}{2} \right) - 1}{\Pi(0)} \\[1em] +&\approx \frac{0.5 + 0.6915 - 1}{0.5} \\ +&\approx 0.383 +\end{align} +$$ + +## Exercice 3 + +1. calculer $\mu$ et $\sigma$ + +$P(X \leq 165) = 0.58$ +$P(165 \leq X \leq 180) = 0.38$ +$P(180 \leq X) = 0.04$ + +$P\left( \frac{X-\sigma}{\mu} \leq \frac{165 - \sigma}{\mu} \right) = 0.58 \iff \Pi\left( \frac{165-\sigma}{\mu} \right) = 0.58$ + +$P\left( \frac{165 - \sigma}{\mu} \leq \frac{X-\sigma}{\mu} \leq \frac{180-\sigma}{\mu} \right) = 0.38 \iff \Pi\left( \frac{180-\sigma}{\mu} \right) + \Pi\left( \frac{165-\sigma}{\mu} \right) - 1 = 0.38$ + +$P\left( \frac{180-\sigma}{\mu} \leq \frac{X-\sigma}{\mu} \right) = 0.04 \iff \Pi\left( \frac{180-\sigma}{\mu} \right) = 0.96$ + +Donc, on a les égalités suivantes : + +$$ +\begin{align} +\begin{cases} +\frac{165-\sigma}{\mu} = 0.21\\ +\frac{180-\sigma}{\mu} = 1.75 +\end{cases} +&\iff +\begin{cases} +0.21\mu + \sigma = 165 \\ +1.75\mu + \sigma = 180 +\end{cases} \\ +&\iff +\begin{cases} +1.54\mu = 15 \\ +1.75\mu + \sigma = 180 +\end{cases} \\ +&\iff +\begin{cases} +\mu = 9.74 \\ +17.05 + \sigma = 180 +\end{cases} \\ +& \iff +\begin{cases} +\mu = 9.74 \\ +\sigma = 162.95 +\end{cases} +\end{align} +$$ + + + + diff --git a/daily/2023-10-23.md b/daily/2023-10-23.md index b1d2a21e..25cabbda 100644 --- a/daily/2023-10-23.md +++ b/daily/2023-10-23.md @@ -14,6 +14,7 @@ kung_fu: 0 > where file.mtime > date(this.file.name) and file.mtime < (date(this.file.name) + dur(1 day)) sort file.mtime asc > ``` + ## Devoirs > [!smalltodo]+ Devoirs > ```dataview diff --git a/daily/2023-10-24.md b/daily/2023-10-24.md new file mode 100644 index 00000000..ee506cf1 --- /dev/null +++ b/daily/2023-10-24.md @@ -0,0 +1,33 @@ +--- +spaced_repetition: 0 +kung_fu: 0 +--- + +## Todo +- spaced repetition : `INPUT[toggle(onValue(1), offValue(0)):spaced_repetition]` +- kung-fu : `INPUT[number:kung_fu]` minutes + + +## I did +> [!smallquery]- Modified files +> ```dataview +> LIST file.mtime +> where file.mtime > date(this.file.name) and file.mtime < (date(this.file.name) + dur(1 day)) sort file.mtime asc +> ``` + +## Devoirs +> [!smalltodo]+ Devoirs +> ```dataview +> TABLE difficulty as "", due as "date", title as "description", file.etags as "tags" +> FROM #devoir +> WHERE contains(due, date(this.file.name)) +> ``` +> > [!done]- Devoirs faits +> > ```dataview +> > TABLE difficulty as "", due as "date", title as "description" +> > FROM #devoir-fait +> > WHERE contains(due, date(this.file.name)) +> > ``` + +## I am gratefull to + diff --git a/projet gestion et simulation d'entreprise.md b/projet gestion et simulation d'entreprise.md index 9a35562e..50ca4ca7 100644 --- a/projet gestion et simulation d'entreprise.md +++ b/projet gestion et simulation d'entreprise.md @@ -1,3 +1,81 @@ #fac #PM versa-tile + +# Le business model : Elaboration du projet de création d’entreprise : Etapes à suivre + +## 1. Définir le projet +### Description de l'activité + +- particularités +- caractéristiques techniques, présentation, caractère innovant du produit +- caractéristiques de l'offre sur le marché + - marque + - éléments recherchés par les clients + - positionnement sur le marché +- distinguer l'offre principale et les services associés + +- caractéristiques techniques, présentation, particularités + - ordinateurs portables + - adaptables + - s'adapter au besoin de chaque utilisateur + - s'adapter à différents contextes d'utilisation pour un même utilisateur + - entièrement remplacable + - réparable façilement + - durable (à vie) + - l'utilisateur peut changer d'utilisation sans racheter un ordinateur +- caractère innovant + - remplace le modèle des ordinateurs portables qui ne sont pas réparables + - permet une plus grande versatilité + - l'ordinateur versa-tile peut s'adapter à chaque situation + - plus durable que de racheter un ordinateur complet +- caractéristiques de l'offre sur le marché + - marque + - + + +## 2. L’étude de marché + + + +Vous devez réaliser une étude de marché. Les sujets à étudier concernent :  + +- **La demande (clientèle potentielle)**  + - nombre de clients + - distribution géographique des clients + - fréquence de consommation des produits + - budget consacré +- **L’offre (la concurrence)**  + - concurrents directs + - concurrents indirects + - nombre de concurrents +- **Les fournisseurs**  + - quels sont les fournisseurs potentiels +- **La réglementation** + - lois / normes qui régissent l'activité +- **L’environnement (exploiter outil PESTEL)**  + - L’évolution des habitudes de consommations est-elle favorable au projet ? Pourquoi ? + + + +## 3. Définir le mode de distribution / méthode de prospection + +- Où les clients pourront-ils acheter votre produit ou faire appel à votre service ?  +- Quel canal de distribution avez-vous retenu (détaillant, grossistes, GMS commerces de proximité, réseau de franchisés, etc…)  +- Quels sont les différents moyens de communication que vous allez utiliser pour faire connaître votre entreprise (relations publiques, relations presse,, support de communication)  + + + +## 4. L’identification de votre entreprise + +- Identifiez l'entreprise (et justifier cette identification) + - un nom + - une marque + - un logo + +Expliquez votre démarche pour la protection juridique de ce nom et de ce logo + +## 5. La forme juridique de votre entreprise + +- Quelle forme juridique choisie +- Présentez-la et expliquez votre choix diff --git a/r.md b/r.md new file mode 100644 index 00000000..85661339 --- /dev/null +++ b/r.md @@ -0,0 +1,10 @@ +--- + +mindmap-plugin: rich + +--- + +# statistiques +``` json +{"theme":"","mindData":[[{"id":"dac65e9c-d82f-61ad","text":"statistiques","isRoot":true,"main":true,"x":4000,"y":4000,"isExpand":true,"layout":{"layoutName":"multipleTree","direct":"right"},"stroke":""},{"id":"082b6c3f-738b-d8e3","text":"Loi normale","stroke":"darkorange","x":4104,"y":4084,"layout":null,"isExpand":true,"pid":"dac65e9c-d82f-61ad"},{"id":"6ba52f6b-6d5d-4e2d","text":"propriétés","stroke":"darkorange","x":4184,"y":4147,"layout":null,"isExpand":true,"pid":"082b6c3f-738b-d8e3"},{"id":"13e702d2-5e6d-46ad","text":"Pour une loi centrée normalisée, on peut utiliser $\\Pi$","stroke":"darkorange","x":4184,"y":4377,"layout":null,"isExpand":true,"pid":"082b6c3f-738b-d8e3"},{"id":"35ca61fd-e965-c461","text":"$P(X < - \\alpha) = P(X > \\alpha)$","stroke":"darkorange","x":4243.5,"y":4193,"layout":null,"isExpand":true,"pid":"6ba52f6b-6d5d-4e2d"},{"id":"d06929d7-1fb9-d945","text":"$P(X \\leq \\alpha ) = 1-P(X \\geq a)$","stroke":"darkorange","x":4243.5,"y":4285,"layout":null,"isExpand":true,"pid":"6ba52f6b-6d5d-4e2d"},{"id":"c0937930-10a7-8d57","text":"inverser le signe $\\iff$ inverser le sens du $>$","stroke":"darkorange","x":4354,"y":4239,"layout":null,"isExpand":true,"pid":"35ca61fd-e965-c461"},{"id":"7d17bad0-7ec9-b73f","text":"inverser le sens du $>$ $\\iff$ faire $1-P$","stroke":"darkorange","x":4360.5,"y":4331,"layout":null,"isExpand":true,"pid":"d06929d7-1fb9-d945"}]],"induceData":[],"wireFrameData":[],"relateLinkData":[],"calloutData":[]} +``` diff --git a/sources/cours/S5/L3_info_statistiques_TD0.pdf b/sources/cours/S5/L3_info_statistiques_TD0.pdf new file mode 100644 index 00000000..03e79566 Binary files /dev/null and b/sources/cours/S5/L3_info_statistiques_TD0.pdf differ diff --git a/sources/cours/S5/L3_info_statistiques_TD1.pdf b/sources/cours/S5/L3_info_statistiques_TD1.pdf new file mode 100644 index 00000000..6f2b59b5 Binary files /dev/null and b/sources/cours/S5/L3_info_statistiques_TD1.pdf differ diff --git a/sources/cours/S5/L3_info_statistiques_ch0.pdf b/sources/cours/S5/L3_info_statistiques_ch0.pdf new file mode 100644 index 00000000..ccff887a Binary files /dev/null and b/sources/cours/S5/L3_info_statistiques_ch0.pdf differ diff --git a/sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf b/sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf new file mode 100644 index 00000000..5cec7006 Binary files /dev/null and b/sources/cours/S5/L3_info_statistiques_tableau_loi_normale.pdf differ