silika-website/wwwroot/assets/vendor/libs/quill/katex.js

120 lines
1.6 MiB
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(self, function() {
return /******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./libs/quill/katex.js":
/*!*****************************!*\
!*** ./libs/quill/katex.js ***!
\*****************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"katex\": function() { return /* reexport default from dynamic */ katex_dist_katex__WEBPACK_IMPORTED_MODULE_0___default.a; }\n/* harmony export */ });\n/* harmony import */ var katex_dist_katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! katex/dist/katex */ \"./node_modules/katex/dist/katex.js\");\n/* harmony import */ var katex_dist_katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex_dist_katex__WEBPACK_IMPORTED_MODULE_0__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9saWJzL3F1aWxsL2thdGV4LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Z1ZXh5Ly4vbGlicy9xdWlsbC9rYXRleC5qcz83ZDQzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBrYXRleCBmcm9tICdrYXRleC9kaXN0L2thdGV4JztcclxuXHJcbmV4cG9ydCB7IGthdGV4IH07XHJcbiJdLCJuYW1lcyI6WyJrYXRleCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./libs/quill/katex.js\n");
/***/ }),
/***/ "./node_modules/katex/dist/katex.js":
/*!******************************************!*\
!*** ./node_modules/katex/dist/katex.js ***!
\******************************************/
/***/ (function(module) {
eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \t// The require scope\n/******/ \tvar __nested_webpack_require_514__ = {};\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__nested_webpack_require_514__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__nested_webpack_require_514__.o(definition, key) && !__nested_webpack_require_514__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__nested_webpack_require_514__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n\n// EXPORTS\n__nested_webpack_require_514__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ katex_webpack; }\n});\n\n;// CONCATENATED MODULE: ./src/ParseError.js\n\n\n/**\n * This is the ParseError class, which is the main error thrown by KaTeX\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nvar ParseError = // Error position based on passed-in Token or ParseNode.\nfunction ParseError(message, // The error message\ntoken // An object providing position information\n) {\n this.position = void 0;\n var error = \"KaTeX parse error: \" + message;\n var start;\n var loc = token && token.loc;\n\n if (loc && loc.start <= loc.end) {\n // If we have the input and a position, make the error a bit fancier\n // Get the input\n var input = loc.lexer.input; // Prepend some information\n\n start = loc.start;\n var end = loc.end;\n\n if (start === input.length) {\n error += \" at end of input: \";\n } else {\n error += \" at position \" + (start + 1) + \": \";\n } // Underline token in question using combining underscores\n\n\n var underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\"); // Extract some context from the input and add it to the error\n\n var left;\n\n if (start > 15) {\n left = \"…\" + input.slice(start - 15, start);\n } else {\n left = input.slice(0, start);\n }\n\n var right;\n\n if (end + 15 < input.length) {\n right = input.slice(end, end + 15) + \"…\";\n } else {\n right = input.slice(end);\n }\n\n error += left + underlined + right;\n } // Some hackery to make ParseError a prototype of Error\n // See http://stackoverflow.com/a/8460753\n\n\n var self = new Error(error);\n self.name = \"ParseError\"; // $FlowFixMe\n\n self.__proto__ = ParseError.prototype; // $FlowFixMe\n\n self.position = start;\n return self;\n}; // $FlowFixMe More hackery\n\n\nParseError.prototype.__proto__ = Error.prototype;\n/* harmony default export */ var src_ParseError = (ParseError);\n;// CONCATENATED MODULE: ./src/utils.js\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Return whether an element is contained in a list\n */\nvar contains = function contains(list, elem) {\n return list.indexOf(elem) !== -1;\n};\n/**\n * Provide a default value if a setting is undefined\n * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022.\n */\n\n\nvar deflt = function deflt(setting, defaultIfUndefined) {\n return setting === undefined ? defaultIfUndefined : setting;\n}; // hyphenate and escape adapted from Facebook's React under Apache 2 license\n\n\nvar uppercase = /([A-Z])/g;\n\nvar hyphenate = function hyphenate(str) {\n return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nvar ESCAPE_LOOKUP = {\n \"&\": \"&amp;\",\n \">\": \"&gt;\",\n \"<\": \"&lt;\",\n \"\\\"\": \"&quot;\",\n \"'\": \"&#x27;\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\n\nfunction utils_escape(text) {\n return String(text).replace(ESCAPE_REGEX, function (match) {\n return ESCAPE_LOOKUP[match];\n });\n}\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\n\n\nvar getBaseElem = function getBaseElem(group) {\n if (group.type === \"ordgroup\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"color\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"font\") {\n return getBaseElem(group.body);\n } else {\n return group;\n }\n};\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\n\n\nvar isCharacterBox = function isCharacterBox(group) {\n var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters\n\n return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\";\n};\n\nvar assert = function assert(value) {\n if (!value) {\n throw new Error('Expected non-null, but got ' + String(value));\n }\n\n return value;\n};\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative).\n */\n\nvar protocolFromUrl = function protocolFromUrl(url) {\n var protocol = /^\\s*([^\\\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);\n return protocol != null ? protocol[1] : \"_relative\";\n};\n/* harmony default export */ var utils = ({\n contains: contains,\n deflt: deflt,\n escape: utils_escape,\n hyphenate: hyphenate,\n getBaseElem: getBaseElem,\n isCharacterBox: isCharacterBox,\n protocolFromUrl: protocolFromUrl\n});\n;// CONCATENATED MODULE: ./src/Settings.js\n/* eslint no-console:0 */\n\n/**\n * This is a module for storing settings passed into KaTeX. It correctly handles\n * default settings.\n */\n\n\n\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n displayMode: {\n type: \"boolean\",\n description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n cli: \"-d, --display-mode\"\n },\n output: {\n type: {\n enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n },\n description: \"Determines the markup language of the output.\",\n cli: \"-F, --format <type>\"\n },\n leqno: {\n type: \"boolean\",\n description: \"Render display math in leqno style (left-justified tags).\"\n },\n fleqn: {\n type: \"boolean\",\n description: \"Render display math flush left.\"\n },\n throwOnError: {\n type: \"boolean\",\n default: true,\n cli: \"-t, --no-throw-on-error\",\n cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n },\n errorColor: {\n type: \"string\",\n default: \"#cc0000\",\n cli: \"-c, --error-color <color>\",\n cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n cliProcessor: function cliProcessor(color) {\n return \"#\" + color;\n }\n },\n macros: {\n type: \"object\",\n cli: \"-m, --macro <def>\",\n cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n cliDefault: [],\n cliProcessor: function cliProcessor(def, defs) {\n defs.push(def);\n return defs;\n }\n },\n minRuleThickness: {\n type: \"number\",\n description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n processor: function processor(t) {\n return Math.max(0, t);\n },\n cli: \"--min-rule-thickness <size>\",\n cliProcessor: parseFloat\n },\n colorIsTextColor: {\n type: \"boolean\",\n description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n cli: \"-b, --color-is-text-color\"\n },\n strict: {\n type: [{\n enum: [\"warn\", \"ignore\", \"error\"]\n }, \"boolean\", \"function\"],\n description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n cli: \"-S, --strict\",\n cliDefault: false\n },\n trust: {\n type: [\"boolean\", \"function\"],\n description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n cli: \"-T, --trust\"\n },\n maxSize: {\n type: \"number\",\n default: Infinity,\n description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n processor: function processor(s) {\n return Math.max(0, s);\n },\n cli: \"-s, --max-size <n>\",\n cliProcessor: parseInt\n },\n maxExpand: {\n type: \"number\",\n default: 1000,\n description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n processor: function processor(n) {\n return Math.max(0, n);\n },\n cli: \"-e, --max-expand <n>\",\n cliProcessor: function cliProcessor(n) {\n return n === \"Infinity\" ? Infinity : parseInt(n);\n }\n },\n globalGroup: {\n type: \"boolean\",\n cli: false\n }\n};\n\nfunction getDefaultValue(schema) {\n if (schema.default) {\n return schema.default;\n }\n\n var type = schema.type;\n var defaultType = Array.isArray(type) ? type[0] : type;\n\n if (typeof defaultType !== 'string') {\n return defaultType.enum[0];\n }\n\n switch (defaultType) {\n case 'boolean':\n return false;\n\n case 'string':\n return '';\n\n case 'number':\n return 0;\n\n case 'object':\n return {};\n }\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n * - displayMode: Whether the expression should be typeset as inline math\n * (false, the default), meaning that the math starts in\n * \\textstyle and is placed in an inline-block); or as display\n * math (true), meaning that the math starts in \\displaystyle\n * and is placed in a block with vertical margin.\n */\n\n\nvar Settings = /*#__PURE__*/function () {\n function Settings(options) {\n this.displayMode = void 0;\n this.output = void 0;\n this.leqno = void 0;\n this.fleqn = void 0;\n this.throwOnError = void 0;\n this.errorColor = void 0;\n this.macros = void 0;\n this.minRuleThickness = void 0;\n this.colorIsTextColor = void 0;\n this.strict = void 0;\n this.trust = void 0;\n this.maxSize = void 0;\n this.maxExpand = void 0;\n this.globalGroup = void 0;\n // allow null options\n options = options || {};\n\n for (var prop in SETTINGS_SCHEMA) {\n if (SETTINGS_SCHEMA.hasOwnProperty(prop)) {\n // $FlowFixMe\n var schema = SETTINGS_SCHEMA[prop]; // TODO: validate options\n // $FlowFixMe\n\n this[prop] = options[prop] !== undefined ? schema.processor ? schema.processor(options[prop]) : options[prop] : getDefaultValue(schema);\n }\n }\n }\n /**\n * Report nonstrict (non-LaTeX-compatible) input.\n * Can safely not be called if `this.strict` is false in JavaScript.\n */\n\n\n var _proto = Settings.prototype;\n\n _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) {\n var strict = this.strict;\n\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n strict = strict(errorCode, errorMsg, token);\n }\n\n if (!strict || strict === \"ignore\") {\n return;\n } else if (strict === true || strict === \"error\") {\n throw new src_ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n }\n }\n /**\n * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n * input (like `\\\\`). Unlike `nonstrict`, will not throw an error;\n * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n * translates to a return value of `false`. May still print a warning:\n * \"warn\" prints a warning and returns `false`.\n * This is for the second category of `errorCode`s listed in the README.\n */\n ;\n\n _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) {\n var strict = this.strict;\n\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n // But catch any exceptions thrown by function, treating them\n // like \"error\".\n try {\n strict = strict(errorCode, errorMsg, token);\n } catch (error) {\n strict = \"error\";\n }\n }\n\n if (!strict || strict === \"ignore\") {\n return false;\n } else if (strict === true || strict === \"error\") {\n return true;\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n }\n }\n /**\n * Check whether to test potentially dangerous input, and return\n * `true` (trusted) or `false` (untrusted). The sole argument `context`\n * should be an object with `command` field specifying the relevant LaTeX\n * command (as a string starting with `\\`), and any other arguments, etc.\n * If `context` has a `url` field, a `protocol` field will automatically\n * get added by this function (changing the specified object).\n */\n ;\n\n _proto.isTrusted = function isTrusted(context) {\n if (context.url && !context.protocol) {\n context.protocol = utils.protocolFromUrl(context.url);\n }\n\n var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n return Boolean(trust);\n };\n\n return Settings;\n}();\n\n\n;// CONCATENATED MODULE: ./src/Style.js\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nvar Style = /*#__PURE__*/function () {\n function Style(id, size, cramped) {\n this.id = void 0;\n this.size = void 0;\n this.cramped = void 0;\n this.id = id;\n this.size = size;\n this.cramped = cramped;\n }\n /**\n * Get the style of a superscript given a base in the current style.\n */\n\n\n var _proto = Style.prototype;\n\n _proto.sup = function sup() {\n return styles[_sup[this.id]];\n }\n /**\n * Get the style of a subscript given a base in the current style.\n */\n ;\n\n _proto.sub = function sub() {\n return styles[_sub[this.id]];\n }\n /**\n * Get the style of a fraction numerator given the fraction in the current\n * style.\n */\n ;\n\n _proto.fracNum = function fracNum() {\n return styles[_fracNum[this.id]];\n }\n /**\n * Get the style of a fraction denominator given the fraction in the current\n * style.\n */\n ;\n\n _proto.fracDen = function fracDen() {\n return styles[_fracDen[this.id]];\n }\n /**\n * Get the cramped version of a style (in particular, cramping a cramped style\n * doesn't change the style).\n */\n ;\n\n _proto.cramp = function cramp() {\n return styles[_cramp[this.id]];\n }\n /**\n * Get a text or display version of this style.\n */\n ;\n\n _proto.text = function text() {\n return styles[_text[this.id]];\n }\n /**\n * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n */\n ;\n\n _proto.isTight = function isTight() {\n return this.size >= 2;\n };\n\n return Style;\n}(); // Export an interface for type checking, but don't expose the implementation.\n// This way, no more styles can be generated.\n\n\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7; // Instances of the different styles\n\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another\n\nvar _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles.\n\n/* harmony default export */ var src_Style = ({\n DISPLAY: styles[D],\n TEXT: styles[T],\n SCRIPT: styles[S],\n SCRIPTSCRIPT: styles[SS]\n});\n;// CONCATENATED MODULE: ./src/unicodeScripts.js\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n\n/**\n * Each script or script family has a name and an array of blocks.\n * Each block is an array of two numbers which specify the start and\n * end points (inclusive) of a block of Unicode codepoints.\n */\n\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n // Latin characters beyond the Latin-1 characters we have metrics for.\n // Needed for Czech, Hungarian and Turkish text, for example.\n name: 'latin',\n blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B\n [0x0300, 0x036f] // Combining Diacritical marks\n ]\n}, {\n // The Cyrillic script used by Russian and related languages.\n // A Cyrillic subset used to be supported as explicitly defined\n // symbols in symbols.js\n name: 'cyrillic',\n blocks: [[0x0400, 0x04ff]]\n}, {\n // Armenian\n name: 'armenian',\n blocks: [[0x0530, 0x058F]]\n}, {\n // The Brahmic scripts of South and Southeast Asia\n // Devanagari (0900097F)\n // Bengali (098009FF)\n // Gurmukhi (0A000A7F)\n // Gujarati (0A800AFF)\n // Oriya (0B000B7F)\n // Tamil (0B800BFF)\n // Telugu (0C000C7F)\n // Kannada (0C800CFF)\n // Malayalam (0D000D7F)\n // Sinhala (0D800DFF)\n // Thai (0E000E7F)\n // Lao (0E800EFF)\n // Tibetan (0F000FFF)\n // Myanmar (1000109F)\n name: 'brahmic',\n blocks: [[0x0900, 0x109F]]\n}, {\n name: 'georgian',\n blocks: [[0x10A0, 0x10ff]]\n}, {\n // Chinese and Japanese.\n // The \"k\" in cjk is for Korean, but we've separated Korean out\n name: \"cjk\",\n blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana\n [0x4E00, 0x9FAF], // CJK ideograms\n [0xFF00, 0xFF60] // Fullwidth punctuation\n // TODO: add halfwidth Katakana and Romanji glyphs\n ]\n}, {\n // Korean\n name: 'hangul',\n blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\n\nfunction scriptFromCodepoint(codepoint) {\n for (var i = 0; i < scriptData.length; i++) {\n var script = scriptData[i];\n\n for (var _i = 0; _i < script.blocks.length; _i++) {\n var block = script.blocks[_i];\n\n if (codepoint >= block[0] && codepoint <= block[1]) {\n return script.name;\n }\n }\n }\n\n return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\n\nvar allBlocks = [];\nscriptData.forEach(function (s) {\n return s.blocks.forEach(function (b) {\n return allBlocks.push.apply(allBlocks, b);\n });\n});\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\n\nfunction supportedCodepoint(codepoint) {\n for (var i = 0; i < allBlocks.length; i += 2) {\n if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n return true;\n }\n }\n\n return false;\n}\n;// CONCATENATED MODULE: ./src/svgGeometry.js\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\nvar hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping.\n// The viniculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraViniculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraViniculum below.\n// The detour proceeds one extraViniculum distance up and slightly to the right,\n// displacing the radiused corner between surd and viniculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long viniculumn, then down one extraViniculum distance,\n// after which it resumes regular path geometry for the radical.\n\n/* viniculum\n /\n /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum\n / █████████████████████←0.04em (40 unit) std viniculum thickness\n / /\n / /\n / /\\\n / / surd\n*/\n\nvar sqrtMain = function sqrtMain(extraViniculum, hLinePad) {\n // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n return \"M95,\" + (622 + extraViniculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraViniculum / 2.075 + \" -\" + extraViniculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraViniculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraViniculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraViniculum) + \"h-400000z\";\n};\n\nvar sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) {\n // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n return \"M263,\" + (601 + extraViniculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraViniculum / 2.084 + \" -\" + extraViniculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraViniculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraViniculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraViniculum) + \"h-400000z\";\n};\n\nvar sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) {\n // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n return \"M983 \" + (10 + extraViniculum + hLinePad) + \"\\nl\" + extraViniculum / 3.13 + \" -\" + extraViniculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraViniculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraViniculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraViniculum) + \"h-400000z\";\n};\n\nvar sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) {\n // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n return \"M424,\" + (2398 + extraViniculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraViniculum / 4.223 + \" -\" + extraViniculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraViniculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraViniculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraViniculum) + \"h-400000z\";\n};\n\nvar sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) {\n // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n return \"M473,\" + (2713 + extraViniculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraViniculum / 5.298 + \" -\" + extraViniculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraViniculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraViniculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraViniculum) + \"H1017.7z\";\n};\n\nvar phasePath = function phasePath(y) {\n var x = y / 2; // x coordinate at top of angle\n\n return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\n\nvar sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) {\n // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n // One path edge has a variable length. It runs vertically from the viniculumn\n // to a point near (14 units) the bottom of the surd. The viniculum\n // is normally 40 units thick. So the length of the line in question is:\n var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum;\n return \"M702 \" + (extraViniculum + hLinePad) + \"H400000\" + (40 + extraViniculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" + hLinePad + \"H400000v\" + (40 + extraViniculum) + \"H742z\";\n};\n\nvar sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) {\n extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox.\n\n var path = \"\";\n\n switch (size) {\n case \"sqrtMain\":\n path = sqrtMain(extraViniculum, hLinePad);\n break;\n\n case \"sqrtSize1\":\n path = sqrtSize1(extraViniculum, hLinePad);\n break;\n\n case \"sqrtSize2\":\n path = sqrtSize2(extraViniculum, hLinePad);\n break;\n\n case \"sqrtSize3\":\n path = sqrtSize3(extraViniculum, hLinePad);\n break;\n\n case \"sqrtSize4\":\n path = sqrtSize4(extraViniculum, hLinePad);\n break;\n\n case \"sqrtTall\":\n path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight);\n }\n\n return path;\n};\nvar innerPath = function innerPath(name, height) {\n // The inner part of stretchy tall delimiters\n switch (name) {\n case \"\\u239C\":\n return \"M291 0 H417 V\" + height + \" H291z M291 0 H417 V\" + height + \" H291z\";\n\n case \"\\u2223\":\n return \"M145 0 H188 V\" + height + \" H145z M145 0 H188 V\" + height + \" H145z\";\n\n case \"\\u2225\":\n return \"M145 0 H188 V\" + height + \" H145z M145 0 H188 V\" + height + \" H145z\" + (\"M367 0 H410 V\" + height + \" H367z M367 0 H410 V\" + height + \" H367z\");\n\n case \"\\u239F\":\n return \"M457 0 H583 V\" + height + \" H457z M457 0 H583 V\" + height + \" H457z\";\n\n case \"\\u23A2\":\n return \"M319 0 H403 V\" + height + \" H319z M319 0 H403 V\" + height + \" H319z\";\n\n case \"\\u23A5\":\n return \"M263 0 H347 V\" + height + \" H263z M263 0 H347 V\" + height + \" H263z\";\n\n case \"\\u23AA\":\n return \"M384 0 H504 V\" + height + \" H384z M384 0 H504 V\" + height + \" H384z\";\n\n case \"\\u23D0\":\n return \"M312 0 H355 V\" + height + \" H312z M312 0 H355 V\" + height + \" H312z\";\n\n case \"\\u2016\":\n return \"M257 0 H300 V\" + height + \" H257z M257 0 H300 V\" + height + \" H257z\" + (\"M478 0 H521 V\" + height + \" H478z M478 0 H521 V\" + height + \" H478z\");\n\n default:\n return \"\";\n }\n};\nvar path = {\n // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main\n doubleleftarrow: \"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",\n // doublerightarrow is from glyph U+21D2 in font KaTeX Main\n doublerightarrow: \"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",\n // leftarrow is from glyph U+2190 in font KaTeX Main\n leftarrow: \"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",\n // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular\n leftbrace: \"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",\n leftbraceunder: \"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",\n // overgroup is from the MnSymbol package (public domain)\n leftgroup: \"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",\n leftgroupunder: \"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",\n // Harpoons are from glyph U+21BD in font KaTeX Main\n leftharpoon: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",\n leftharpoonplus: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",\n leftharpoondown: \"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",\n leftharpoondownplus: \"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",\n // hook is from glyph U+21A9 in font KaTeX Main\n lefthook: \"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",\n leftlinesegment: \"M40 281 V428 H0 V94 H40 V241 H400000 v40z\\nM40 281 V428 H0 V94 H40 V241 H400000 v40z\",\n leftmapsto: \"M40 281 V448H0V74H40V241H400000v40z\\nM40 281 V448H0V74H40V241H400000v40z\",\n // tofrom is from glyph U+21C4 in font KaTeX AMS Regular\n leftToFrom: \"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",\n longequal: \"M0 50 h400000 v40H0z m0 194h40000v40H0z\\nM0 50 h400000 v40H0z m0 194h40000v40H0z\",\n midbrace: \"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",\n midbraceunder: \"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",\n oiintSize1: \"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",\n oiintSize2: \"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",\n oiiintSize1: \"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",\n oiiintSize2: \"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",\n rightarrow: \"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",\n rightbrace: \"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",\n rightbraceunder: \"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",\n rightgroup: \"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",\n rightgroupunder: \"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",\n rightharpoon: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",\n rightharpoonplus: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",\n rightharpoondown: \"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",\n rightharpoondownplus: \"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",\n righthook: \"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",\n rightlinesegment: \"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z\",\n rightToFrom: \"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",\n // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular\n twoheadleftarrow: \"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",\n twoheadrightarrow: \"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",\n // tilde1 is a modified version of a glyph from the MnSymbol package\n tilde1: \"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",\n // ditto tilde2, tilde3, & tilde4\n tilde2: \"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",\n tilde3: \"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",\n tilde4: \"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",\n // vec is from glyph U+20D7 in font KaTeX Main\n vec: \"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",\n // widehat1 is a modified version of a glyph from the MnSymbol package\n widehat1: \"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",\n // ditto widehat2, widehat3, & widehat4\n widehat2: \"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n widehat3: \"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n widehat4: \"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n // widecheck paths are all inverted versions of widehat\n widecheck1: \"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",\n widecheck2: \"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n widecheck3: \"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n widecheck4: \"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n // The next ten paths support reaction arrows from the mhchem package.\n // Arrows for \\ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX\n // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main\n baraboveleftarrow: \"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",\n // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main\n rightarrowabovebar: \"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",\n // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.\n // Ref from mhchem.sty: \\rlap{\\raisebox{-.22ex}{$\\kern0.5em\n baraboveshortleftharpoon: \"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",\n rightharpoonaboveshortbar: \"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",\n shortbaraboveleftharpoon: \"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",\n shortrightharpoonabovebar: \"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"\n};\nvar tallDelim = function tallDelim(label, midHeight) {\n switch (label) {\n case \"lbrack\":\n return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v1759 h347 v-84\\nH403z M403 1759 V0 H319 V1759 v\" + midHeight + \" v1759 h84z\";\n\n case \"rbrack\":\n return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v1759 H0 v84 H347z\\nM347 1759 V0 H263 V1759 v\" + midHeight + \" v1759 h84z\";\n\n case \"vert\":\n return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\";\n\n case \"doublevert\":\n return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\\nM367 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v\" + midHeight + \" v585 h43z\";\n\n case \"lfloor\":\n return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1715 h263 v84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n\n case \"rfloor\":\n return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1799 H0 v-84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n\n case \"lceil\":\n return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v602 h84z\\nM403 1759 V0 H319 V1759 v\" + midHeight + \" v602 h84z\";\n\n case \"rceil\":\n return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v602 h84z\\nM347 1759 V0 h-84 V1759 v\" + midHeight + \" v602 h84z\";\n\n case \"lparen\":\n return \"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\\n-36,557 l0,\" + (midHeight + 84) + \"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\\nl0,-\" + (midHeight + 92) + \"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z\";\n\n case \"rparen\":\n return \"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,\" + (midHeight + 9) + \"\\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\\nl0,-\" + (midHeight + 144) + \"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z\";\n\n default:\n // We should not ever get here.\n throw new Error(\"Unknown stretchy delimiter.\");\n }\n};\n;// CONCATENATED MODULE: ./src/tree.js\n\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nvar DocumentFragment = /*#__PURE__*/function () {\n // HtmlDomNode\n // Never used; needed for satisfying interface.\n function DocumentFragment(children) {\n this.children = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n this.children = children;\n this.classes = [];\n this.height = 0;\n this.depth = 0;\n this.maxFontSize = 0;\n this.style = {};\n }\n\n var _proto = DocumentFragment.prototype;\n\n _proto.hasClass = function hasClass(className) {\n return utils.contains(this.classes, className);\n }\n /** Convert the fragment into a node. */\n ;\n\n _proto.toNode = function toNode() {\n var frag = document.createDocumentFragment();\n\n for (var i = 0; i < this.children.length; i++) {\n frag.appendChild(this.children[i].toNode());\n }\n\n return frag;\n }\n /** Convert the fragment into HTML markup. */\n ;\n\n _proto.toMarkup = function toMarkup() {\n var markup = \"\"; // Simply concatenate the markup for the children together.\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n return markup;\n }\n /**\n * Converts the math node into a string, similar to innerText. Applies to\n * MathDomNode's only.\n */\n ;\n\n _proto.toText = function toText() {\n // To avoid this, we would subclass documentFragment separately for\n // MathML, but polyfills for subclassing is expensive per PR 1469.\n // $FlowFixMe: Only works for ChildType = MathDomNode.\n var toText = function toText(child) {\n return child.toText();\n };\n\n return this.children.map(toText).join(\"\");\n };\n\n return DocumentFragment;\n}();\n;// CONCATENATED MODULE: ./src/fontMetricsData.js\n// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\n/* harmony default export */ var fontMetricsData = ({\n \"AMS-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.68889, 0, 0, 0.72222],\n \"66\": [0, 0.68889, 0, 0, 0.66667],\n \"67\": [0, 0.68889, 0, 0, 0.72222],\n \"68\": [0, 0.68889, 0, 0, 0.72222],\n \"69\": [0, 0.68889, 0, 0, 0.66667],\n \"70\": [0, 0.68889, 0, 0, 0.61111],\n \"71\": [0, 0.68889, 0, 0, 0.77778],\n \"72\": [0, 0.68889, 0, 0, 0.77778],\n \"73\": [0, 0.68889, 0, 0, 0.38889],\n \"74\": [0.16667, 0.68889, 0, 0, 0.5],\n \"75\": [0, 0.68889, 0, 0, 0.77778],\n \"76\": [0, 0.68889, 0, 0, 0.66667],\n \"77\": [0, 0.68889, 0, 0, 0.94445],\n \"78\": [0, 0.68889, 0, 0, 0.72222],\n \"79\": [0.16667, 0.68889, 0, 0, 0.77778],\n \"80\": [0, 0.68889, 0, 0, 0.61111],\n \"81\": [0.16667, 0.68889, 0, 0, 0.77778],\n \"82\": [0, 0.68889, 0, 0, 0.72222],\n \"83\": [0, 0.68889, 0, 0, 0.55556],\n \"84\": [0, 0.68889, 0, 0, 0.66667],\n \"85\": [0, 0.68889, 0, 0, 0.72222],\n \"86\": [0, 0.68889, 0, 0, 0.72222],\n \"87\": [0, 0.68889, 0, 0, 1.0],\n \"88\": [0, 0.68889, 0, 0, 0.72222],\n \"89\": [0, 0.68889, 0, 0, 0.72222],\n \"90\": [0, 0.68889, 0, 0, 0.66667],\n \"107\": [0, 0.68889, 0, 0, 0.55556],\n \"160\": [0, 0, 0, 0, 0.25],\n \"165\": [0, 0.675, 0.025, 0, 0.75],\n \"174\": [0.15559, 0.69224, 0, 0, 0.94666],\n \"240\": [0, 0.68889, 0, 0, 0.55556],\n \"295\": [0, 0.68889, 0, 0, 0.54028],\n \"710\": [0, 0.825, 0, 0, 2.33334],\n \"732\": [0, 0.9, 0, 0, 2.33334],\n \"770\": [0, 0.825, 0, 0, 2.33334],\n \"771\": [0, 0.9, 0, 0, 2.33334],\n \"989\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"1008\": [0, 0.43056, 0.04028, 0, 0.66667],\n \"8245\": [0, 0.54986, 0, 0, 0.275],\n \"8463\": [0, 0.68889, 0, 0, 0.54028],\n \"8487\": [0, 0.68889, 0, 0, 0.72222],\n \"8498\": [0, 0.68889, 0, 0, 0.55556],\n \"8502\": [0, 0.68889, 0, 0, 0.66667],\n \"8503\": [0, 0.68889, 0, 0, 0.44445],\n \"8504\": [0, 0.68889, 0, 0, 0.66667],\n \"8513\": [0, 0.68889, 0, 0, 0.63889],\n \"8592\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8594\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8602\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8603\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8606\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8608\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8610\": [0.01354, 0.52239, 0, 0, 1.11111],\n \"8611\": [0.01354, 0.52239, 0, 0, 1.11111],\n \"8619\": [0, 0.54986, 0, 0, 1.0],\n \"8620\": [0, 0.54986, 0, 0, 1.0],\n \"8621\": [-0.13313, 0.37788, 0, 0, 1.38889],\n \"8622\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8624\": [0, 0.69224, 0, 0, 0.5],\n \"8625\": [0, 0.69224, 0, 0, 0.5],\n \"8630\": [0, 0.43056, 0, 0, 1.0],\n \"8631\": [0, 0.43056, 0, 0, 1.0],\n \"8634\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8635\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8638\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8639\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8642\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8643\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8644\": [0.1808, 0.675, 0, 0, 1.0],\n \"8646\": [0.1808, 0.675, 0, 0, 1.0],\n \"8647\": [0.1808, 0.675, 0, 0, 1.0],\n \"8648\": [0.19444, 0.69224, 0, 0, 0.83334],\n \"8649\": [0.1808, 0.675, 0, 0, 1.0],\n \"8650\": [0.19444, 0.69224, 0, 0, 0.83334],\n \"8651\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8652\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8653\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8654\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8655\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8666\": [0.13667, 0.63667, 0, 0, 1.0],\n \"8667\": [0.13667, 0.63667, 0, 0, 1.0],\n \"8669\": [-0.13313, 0.37788, 0, 0, 1.0],\n \"8672\": [-0.064, 0.437, 0, 0, 1.334],\n \"8674\": [-0.064, 0.437, 0, 0, 1.334],\n \"8705\": [0, 0.825, 0, 0, 0.5],\n \"8708\": [0, 0.68889, 0, 0, 0.55556],\n \"8709\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8717\": [0, 0.43056, 0, 0, 0.42917],\n \"8722\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8724\": [0.08198, 0.69224, 0, 0, 0.77778],\n \"8726\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8733\": [0, 0.69224, 0, 0, 0.77778],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8737\": [0, 0.69224, 0, 0, 0.72222],\n \"8738\": [0.03517, 0.52239, 0, 0, 0.72222],\n \"8739\": [0.08167, 0.58167, 0, 0, 0.22222],\n \"8740\": [0.25142, 0.74111, 0, 0, 0.27778],\n \"8741\": [0.08167, 0.58167, 0, 0, 0.38889],\n \"8742\": [0.25142, 0.74111, 0, 0, 0.5],\n \"8756\": [0, 0.69224, 0, 0, 0.66667],\n \"8757\": [0, 0.69224, 0, 0, 0.66667],\n \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8765\": [-0.13313, 0.37788, 0, 0, 0.77778],\n \"8769\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8770\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8774\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n \"8778\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8782\": [0.06062, 0.54986, 0, 0, 0.77778],\n \"8783\": [0.06062, 0.54986, 0, 0, 0.77778],\n \"8785\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8786\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8787\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8790\": [0, 0.69224, 0, 0, 0.77778],\n \"8791\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8796\": [0.08198, 0.91667, 0, 0, 0.77778],\n \"8806\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"8807\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"8808\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"8809\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"8812\": [0.25583, 0.75583, 0, 0, 0.5],\n \"8814\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8815\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8816\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8817\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8818\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8819\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8822\": [0.1808, 0.675, 0, 0, 0.77778],\n \"8823\": [0.1808, 0.675, 0, 0, 0.77778],\n \"8828\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8829\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8830\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8831\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8832\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8833\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8840\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8841\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8842\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8843\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8847\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8848\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8858\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8859\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8861\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8862\": [0, 0.675, 0, 0, 0.77778],\n \"8863\": [0, 0.675, 0, 0, 0.77778],\n \"8864\": [0, 0.675, 0, 0, 0.77778],\n \"8865\": [0, 0.675, 0, 0, 0.77778],\n \"8872\": [0, 0.69224, 0, 0, 0.61111],\n \"8873\": [0, 0.69224, 0, 0, 0.72222],\n \"8874\": [0, 0.69224, 0, 0, 0.88889],\n \"8876\": [0, 0.68889, 0, 0, 0.61111],\n \"8877\": [0, 0.68889, 0, 0, 0.61111],\n \"8878\": [0, 0.68889, 0, 0, 0.72222],\n \"8879\": [0, 0.68889, 0, 0, 0.72222],\n \"8882\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8883\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8884\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8885\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8888\": [0, 0.54986, 0, 0, 1.11111],\n \"8890\": [0.19444, 0.43056, 0, 0, 0.55556],\n \"8891\": [0.19444, 0.69224, 0, 0, 0.61111],\n \"8892\": [0.19444, 0.69224, 0, 0, 0.61111],\n \"8901\": [0, 0.54986, 0, 0, 0.27778],\n \"8903\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8905\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8906\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8907\": [0, 0.69224, 0, 0, 0.77778],\n \"8908\": [0, 0.69224, 0, 0, 0.77778],\n \"8909\": [-0.03598, 0.46402, 0, 0, 0.77778],\n \"8910\": [0, 0.54986, 0, 0, 0.76042],\n \"8911\": [0, 0.54986, 0, 0, 0.76042],\n \"8912\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8913\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8914\": [0, 0.54986, 0, 0, 0.66667],\n \"8915\": [0, 0.54986, 0, 0, 0.66667],\n \"8916\": [0, 0.69224, 0, 0, 0.66667],\n \"8918\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8919\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8920\": [0.03517, 0.54986, 0, 0, 1.33334],\n \"8921\": [0.03517, 0.54986, 0, 0, 1.33334],\n \"8922\": [0.38569, 0.88569, 0, 0, 0.77778],\n \"8923\": [0.38569, 0.88569, 0, 0, 0.77778],\n \"8926\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8927\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8928\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8929\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8934\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8935\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8936\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8937\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8938\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8939\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8940\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8941\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8994\": [0.19444, 0.69224, 0, 0, 0.77778],\n \"8995\": [0.19444, 0.69224, 0, 0, 0.77778],\n \"9416\": [0.15559, 0.69224, 0, 0, 0.90222],\n \"9484\": [0, 0.69224, 0, 0, 0.5],\n \"9488\": [0, 0.69224, 0, 0, 0.5],\n \"9492\": [0, 0.37788, 0, 0, 0.5],\n \"9496\": [0, 0.37788, 0, 0, 0.5],\n \"9585\": [0.19444, 0.68889, 0, 0, 0.88889],\n \"9586\": [0.19444, 0.74111, 0, 0, 0.88889],\n \"9632\": [0, 0.675, 0, 0, 0.77778],\n \"9633\": [0, 0.675, 0, 0, 0.77778],\n \"9650\": [0, 0.54986, 0, 0, 0.72222],\n \"9651\": [0, 0.54986, 0, 0, 0.72222],\n \"9654\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"9660\": [0, 0.54986, 0, 0, 0.72222],\n \"9661\": [0, 0.54986, 0, 0, 0.72222],\n \"9664\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"9674\": [0.11111, 0.69224, 0, 0, 0.66667],\n \"9733\": [0.19444, 0.69224, 0, 0, 0.94445],\n \"10003\": [0, 0.69224, 0, 0, 0.83334],\n \"10016\": [0, 0.69224, 0, 0, 0.83334],\n \"10731\": [0.11111, 0.69224, 0, 0, 0.66667],\n \"10846\": [0.19444, 0.75583, 0, 0, 0.61111],\n \"10877\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10878\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10885\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10886\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10887\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10888\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10889\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10890\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10891\": [0.48256, 0.98256, 0, 0, 0.77778],\n \"10892\": [0.48256, 0.98256, 0, 0, 0.77778],\n \"10901\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10902\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10933\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"10934\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"10935\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10936\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10937\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10938\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10949\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10950\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10955\": [0.28481, 0.79383, 0, 0, 0.77778],\n \"10956\": [0.28481, 0.79383, 0, 0, 0.77778],\n \"57350\": [0.08167, 0.58167, 0, 0, 0.22222],\n \"57351\": [0.08167, 0.58167, 0, 0, 0.38889],\n \"57352\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"57353\": [0, 0.43056, 0.04028, 0, 0.66667],\n \"57356\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57357\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57358\": [0.41951, 0.91951, 0, 0, 0.77778],\n \"57359\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"57360\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"57361\": [0.41951, 0.91951, 0, 0, 0.77778],\n \"57366\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57367\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57368\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57369\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57370\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"57371\": [0.13597, 0.63597, 0, 0, 0.77778]\n },\n \"Caligraphic-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.68333, 0, 0.19445, 0.79847],\n \"66\": [0, 0.68333, 0.03041, 0.13889, 0.65681],\n \"67\": [0, 0.68333, 0.05834, 0.13889, 0.52653],\n \"68\": [0, 0.68333, 0.02778, 0.08334, 0.77139],\n \"69\": [0, 0.68333, 0.08944, 0.11111, 0.52778],\n \"70\": [0, 0.68333, 0.09931, 0.11111, 0.71875],\n \"71\": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],\n \"72\": [0, 0.68333, 0.00965, 0.11111, 0.84452],\n \"73\": [0, 0.68333, 0.07382, 0, 0.54452],\n \"74\": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],\n \"75\": [0, 0.68333, 0.01445, 0.05556, 0.76195],\n \"76\": [0, 0.68333, 0, 0.13889, 0.68972],\n \"77\": [0, 0.68333, 0, 0.13889, 1.2009],\n \"78\": [0, 0.68333, 0.14736, 0.08334, 0.82049],\n \"79\": [0, 0.68333, 0.02778, 0.11111, 0.79611],\n \"80\": [0, 0.68333, 0.08222, 0.08334, 0.69556],\n \"81\": [0.09722, 0.68333, 0, 0.11111, 0.81667],\n \"82\": [0, 0.68333, 0, 0.08334, 0.8475],\n \"83\": [0, 0.68333, 0.075, 0.13889, 0.60556],\n \"84\": [0, 0.68333, 0.25417, 0, 0.54464],\n \"85\": [0, 0.68333, 0.09931, 0.08334, 0.62583],\n \"86\": [0, 0.68333, 0.08222, 0, 0.61278],\n \"87\": [0, 0.68333, 0.08222, 0.08334, 0.98778],\n \"88\": [0, 0.68333, 0.14643, 0.13889, 0.7133],\n \"89\": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],\n \"90\": [0, 0.68333, 0.07944, 0.13889, 0.72473],\n \"160\": [0, 0, 0, 0, 0.25]\n },\n \"Fraktur-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69141, 0, 0, 0.29574],\n \"34\": [0, 0.69141, 0, 0, 0.21471],\n \"38\": [0, 0.69141, 0, 0, 0.73786],\n \"39\": [0, 0.69141, 0, 0, 0.21201],\n \"40\": [0.24982, 0.74947, 0, 0, 0.38865],\n \"41\": [0.24982, 0.74947, 0, 0, 0.38865],\n \"42\": [0, 0.62119, 0, 0, 0.27764],\n \"43\": [0.08319, 0.58283, 0, 0, 0.75623],\n \"44\": [0, 0.10803, 0, 0, 0.27764],\n \"45\": [0.08319, 0.58283, 0, 0, 0.75623],\n \"46\": [0, 0.10803, 0, 0, 0.27764],\n \"47\": [0.24982, 0.74947, 0, 0, 0.50181],\n \"48\": [0, 0.47534, 0, 0, 0.50181],\n \"49\": [0, 0.47534, 0, 0, 0.50181],\n \"50\": [0, 0.47534, 0, 0, 0.50181],\n \"51\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"52\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"53\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"54\": [0, 0.69141, 0, 0, 0.50181],\n \"55\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"56\": [0, 0.69141, 0, 0, 0.50181],\n \"57\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"58\": [0, 0.47534, 0, 0, 0.21606],\n \"59\": [0.12604, 0.47534, 0, 0, 0.21606],\n \"61\": [-0.13099, 0.36866, 0, 0, 0.75623],\n \"63\": [0, 0.69141, 0, 0, 0.36245],\n \"65\": [0, 0.69141, 0, 0, 0.7176],\n \"66\": [0, 0.69141, 0, 0, 0.88397],\n \"67\": [0, 0.69141, 0, 0, 0.61254],\n \"68\": [0, 0.69141, 0, 0, 0.83158],\n \"69\": [0, 0.69141, 0, 0, 0.66278],\n \"70\": [0.12604, 0.69141, 0, 0, 0.61119],\n \"71\": [0, 0.69141, 0, 0, 0.78539],\n \"72\": [0.06302, 0.69141, 0, 0, 0.7203],\n \"73\": [0, 0.69141, 0, 0, 0.55448],\n \"74\": [0.12604, 0.69141, 0, 0, 0.55231],\n \"75\": [0, 0.69141, 0, 0, 0.66845],\n \"76\": [0, 0.69141, 0, 0, 0.66602],\n \"77\": [0, 0.69141, 0, 0, 1.04953],\n \"78\": [0, 0.69141, 0, 0, 0.83212],\n \"79\": [0, 0.69141, 0, 0, 0.82699],\n \"80\": [0.18906, 0.69141, 0, 0, 0.82753],\n \"81\": [0.03781, 0.69141, 0, 0, 0.82699],\n \"82\": [0, 0.69141, 0, 0, 0.82807],\n \"83\": [0, 0.69141, 0, 0, 0.82861],\n \"84\": [0, 0.69141, 0, 0, 0.66899],\n \"85\": [0, 0.69141, 0, 0, 0.64576],\n \"86\": [0, 0.69141, 0, 0, 0.83131],\n \"87\": [0, 0.69141, 0, 0, 1.04602],\n \"88\": [0, 0.69141, 0, 0, 0.71922],\n \"89\": [0.18906, 0.69141, 0, 0, 0.83293],\n \"90\": [0.12604, 0.69141, 0, 0, 0.60201],\n \"91\": [0.24982, 0.74947, 0, 0, 0.27764],\n \"93\": [0.24982, 0.74947, 0, 0, 0.27764],\n \"94\": [0, 0.69141, 0, 0, 0.49965],\n \"97\": [0, 0.47534, 0, 0, 0.50046],\n \"98\": [0, 0.69141, 0, 0, 0.51315],\n \"99\": [0, 0.47534, 0, 0, 0.38946],\n \"100\": [0, 0.62119, 0, 0, 0.49857],\n \"101\": [0, 0.47534, 0, 0, 0.40053],\n \"102\": [0.18906, 0.69141, 0, 0, 0.32626],\n \"103\": [0.18906, 0.47534, 0, 0, 0.5037],\n \"104\": [0.18906, 0.69141, 0, 0, 0.52126],\n \"105\": [0, 0.69141, 0, 0, 0.27899],\n \"106\": [0, 0.69141, 0, 0, 0.28088],\n \"107\": [0, 0.69141, 0, 0, 0.38946],\n \"108\": [0, 0.69141, 0, 0, 0.27953],\n \"109\": [0, 0.47534, 0, 0, 0.76676],\n \"110\": [0, 0.47534, 0, 0, 0.52666],\n \"111\": [0, 0.47534, 0, 0, 0.48885],\n \"112\": [0.18906, 0.52396, 0, 0, 0.50046],\n \"113\": [0.18906, 0.47534, 0, 0, 0.48912],\n \"114\": [0, 0.47534, 0, 0, 0.38919],\n \"115\": [0, 0.47534, 0, 0, 0.44266],\n \"116\": [0, 0.62119, 0, 0, 0.33301],\n \"117\": [0, 0.47534, 0, 0, 0.5172],\n \"118\": [0, 0.52396, 0, 0, 0.5118],\n \"119\": [0, 0.52396, 0, 0, 0.77351],\n \"120\": [0.18906, 0.47534, 0, 0, 0.38865],\n \"121\": [0.18906, 0.47534, 0, 0, 0.49884],\n \"122\": [0.18906, 0.47534, 0, 0, 0.39054],\n \"160\": [0, 0, 0, 0, 0.25],\n \"8216\": [0, 0.69141, 0, 0, 0.21471],\n \"8217\": [0, 0.69141, 0, 0, 0.21471],\n \"58112\": [0, 0.62119, 0, 0, 0.49749],\n \"58113\": [0, 0.62119, 0, 0, 0.4983],\n \"58114\": [0.18906, 0.69141, 0, 0, 0.33328],\n \"58115\": [0.18906, 0.69141, 0, 0, 0.32923],\n \"58116\": [0.18906, 0.47534, 0, 0, 0.50343],\n \"58117\": [0, 0.69141, 0, 0, 0.33301],\n \"58118\": [0, 0.62119, 0, 0, 0.33409],\n \"58119\": [0, 0.47534, 0, 0, 0.50073]\n },\n \"Main-Bold\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.35],\n \"34\": [0, 0.69444, 0, 0, 0.60278],\n \"35\": [0.19444, 0.69444, 0, 0, 0.95833],\n \"36\": [0.05556, 0.75, 0, 0, 0.575],\n \"37\": [0.05556, 0.75, 0, 0, 0.95833],\n \"38\": [0, 0.69444, 0, 0, 0.89444],\n \"39\": [0, 0.69444, 0, 0, 0.31944],\n \"40\": [0.25, 0.75, 0, 0, 0.44722],\n \"41\": [0.25, 0.75, 0, 0, 0.44722],\n \"42\": [0, 0.75, 0, 0, 0.575],\n \"43\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"44\": [0.19444, 0.15556, 0, 0, 0.31944],\n \"45\": [0, 0.44444, 0, 0, 0.38333],\n \"46\": [0, 0.15556, 0, 0, 0.31944],\n \"47\": [0.25, 0.75, 0, 0, 0.575],\n \"48\": [0, 0.64444, 0, 0, 0.575],\n \"49\": [0, 0.64444, 0, 0, 0.575],\n \"50\": [0, 0.64444, 0, 0, 0.575],\n \"51\": [0, 0.64444, 0, 0, 0.575],\n \"52\": [0, 0.64444, 0, 0, 0.575],\n \"53\": [0, 0.64444, 0, 0, 0.575],\n \"54\": [0, 0.64444, 0, 0, 0.575],\n \"55\": [0, 0.64444, 0, 0, 0.575],\n \"56\": [0, 0.64444, 0, 0, 0.575],\n \"57\": [0, 0.64444, 0, 0, 0.575],\n \"58\": [0, 0.44444, 0, 0, 0.31944],\n \"59\": [0.19444, 0.44444, 0, 0, 0.31944],\n \"60\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"61\": [-0.10889, 0.39111, 0, 0, 0.89444],\n \"62\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"63\": [0, 0.69444, 0, 0, 0.54305],\n \"64\": [0, 0.69444, 0, 0, 0.89444],\n \"65\": [0, 0.68611, 0, 0, 0.86944],\n \"66\": [0, 0.68611, 0, 0, 0.81805],\n \"67\": [0, 0.68611, 0, 0, 0.83055],\n \"68\": [0, 0.68611, 0, 0, 0.88194],\n \"69\": [0, 0.68611, 0, 0, 0.75555],\n \"70\": [0, 0.68611, 0, 0, 0.72361],\n \"71\": [0, 0.68611, 0, 0, 0.90416],\n \"72\": [0, 0.68611, 0, 0, 0.9],\n \"73\": [0, 0.68611, 0, 0, 0.43611],\n \"74\": [0, 0.68611, 0, 0, 0.59444],\n \"75\": [0, 0.68611, 0, 0, 0.90138],\n \"76\": [0, 0.68611, 0, 0, 0.69166],\n \"77\": [0, 0.68611, 0, 0, 1.09166],\n \"78\": [0, 0.68611, 0, 0, 0.9],\n \"79\": [0, 0.68611, 0, 0, 0.86388],\n \"80\": [0, 0.68611, 0, 0, 0.78611],\n \"81\": [0.19444, 0.68611, 0, 0, 0.86388],\n \"82\": [0, 0.68611, 0, 0, 0.8625],\n \"83\": [0, 0.68611, 0, 0, 0.63889],\n \"84\": [0, 0.68611, 0, 0, 0.8],\n \"85\": [0, 0.68611, 0, 0, 0.88472],\n \"86\": [0, 0.68611, 0.01597, 0, 0.86944],\n \"87\": [0, 0.68611, 0.01597, 0, 1.18888],\n \"88\": [0, 0.68611, 0, 0, 0.86944],\n \"89\": [0, 0.68611, 0.02875, 0, 0.86944],\n \"90\": [0, 0.68611, 0, 0, 0.70277],\n \"91\": [0.25, 0.75, 0, 0, 0.31944],\n \"92\": [0.25, 0.75, 0, 0, 0.575],\n \"93\": [0.25, 0.75, 0, 0, 0.31944],\n \"94\": [0, 0.69444, 0, 0, 0.575],\n \"95\": [0.31, 0.13444, 0.03194, 0, 0.575],\n \"97\": [0, 0.44444, 0, 0, 0.55902],\n \"98\": [0, 0.69444, 0, 0, 0.63889],\n \"99\": [0, 0.44444, 0, 0, 0.51111],\n \"100\": [0, 0.69444, 0, 0, 0.63889],\n \"101\": [0, 0.44444, 0, 0, 0.52708],\n \"102\": [0, 0.69444, 0.10903, 0, 0.35139],\n \"103\": [0.19444, 0.44444, 0.01597, 0, 0.575],\n \"104\": [0, 0.69444, 0, 0, 0.63889],\n \"105\": [0, 0.69444, 0, 0, 0.31944],\n \"106\": [0.19444, 0.69444, 0, 0, 0.35139],\n \"107\": [0, 0.69444, 0, 0, 0.60694],\n \"108\": [0, 0.69444, 0, 0, 0.31944],\n \"109\": [0, 0.44444, 0, 0, 0.95833],\n \"110\": [0, 0.44444, 0, 0, 0.63889],\n \"111\": [0, 0.44444, 0, 0, 0.575],\n \"112\": [0.19444, 0.44444, 0, 0, 0.63889],\n \"113\": [0.19444, 0.44444, 0, 0, 0.60694],\n \"114\": [0, 0.44444, 0, 0, 0.47361],\n \"115\": [0, 0.44444, 0, 0, 0.45361],\n \"116\": [0, 0.63492, 0, 0, 0.44722],\n \"117\": [0, 0.44444, 0, 0, 0.63889],\n \"118\": [0, 0.44444, 0.01597, 0, 0.60694],\n \"119\": [0, 0.44444, 0.01597, 0, 0.83055],\n \"120\": [0, 0.44444, 0, 0, 0.60694],\n \"121\": [0.19444, 0.44444, 0.01597, 0, 0.60694],\n \"122\": [0, 0.44444, 0, 0, 0.51111],\n \"123\": [0.25, 0.75, 0, 0, 0.575],\n \"124\": [0.25, 0.75, 0, 0, 0.31944],\n \"125\": [0.25, 0.75, 0, 0, 0.575],\n \"126\": [0.35, 0.34444, 0, 0, 0.575],\n \"160\": [0, 0, 0, 0, 0.25],\n \"163\": [0, 0.69444, 0, 0, 0.86853],\n \"168\": [0, 0.69444, 0, 0, 0.575],\n \"172\": [0, 0.44444, 0, 0, 0.76666],\n \"176\": [0, 0.69444, 0, 0, 0.86944],\n \"177\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"184\": [0.17014, 0, 0, 0, 0.51111],\n \"198\": [0, 0.68611, 0, 0, 1.04166],\n \"215\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"216\": [0.04861, 0.73472, 0, 0, 0.89444],\n \"223\": [0, 0.69444, 0, 0, 0.59722],\n \"230\": [0, 0.44444, 0, 0, 0.83055],\n \"247\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"248\": [0.09722, 0.54167, 0, 0, 0.575],\n \"305\": [0, 0.44444, 0, 0, 0.31944],\n \"338\": [0, 0.68611, 0, 0, 1.16944],\n \"339\": [0, 0.44444, 0, 0, 0.89444],\n \"567\": [0.19444, 0.44444, 0, 0, 0.35139],\n \"710\": [0, 0.69444, 0, 0, 0.575],\n \"711\": [0, 0.63194, 0, 0, 0.575],\n \"713\": [0, 0.59611, 0, 0, 0.575],\n \"714\": [0, 0.69444, 0, 0, 0.575],\n \"715\": [0, 0.69444, 0, 0, 0.575],\n \"728\": [0, 0.69444, 0, 0, 0.575],\n \"729\": [0, 0.69444, 0, 0, 0.31944],\n \"730\": [0, 0.69444, 0, 0, 0.86944],\n \"732\": [0, 0.69444, 0, 0, 0.575],\n \"733\": [0, 0.69444, 0, 0, 0.575],\n \"915\": [0, 0.68611, 0, 0, 0.69166],\n \"916\": [0, 0.68611, 0, 0, 0.95833],\n \"920\": [0, 0.68611, 0, 0, 0.89444],\n \"923\": [0, 0.68611, 0, 0, 0.80555],\n \"926\": [0, 0.68611, 0, 0, 0.76666],\n \"928\": [0, 0.68611, 0, 0, 0.9],\n \"931\": [0, 0.68611, 0, 0, 0.83055],\n \"933\": [0, 0.68611, 0, 0, 0.89444],\n \"934\": [0, 0.68611, 0, 0, 0.83055],\n \"936\": [0, 0.68611, 0, 0, 0.89444],\n \"937\": [0, 0.68611, 0, 0, 0.83055],\n \"8211\": [0, 0.44444, 0.03194, 0, 0.575],\n \"8212\": [0, 0.44444, 0.03194, 0, 1.14999],\n \"8216\": [0, 0.69444, 0, 0, 0.31944],\n \"8217\": [0, 0.69444, 0, 0, 0.31944],\n \"8220\": [0, 0.69444, 0, 0, 0.60278],\n \"8221\": [0, 0.69444, 0, 0, 0.60278],\n \"8224\": [0.19444, 0.69444, 0, 0, 0.51111],\n \"8225\": [0.19444, 0.69444, 0, 0, 0.51111],\n \"8242\": [0, 0.55556, 0, 0, 0.34444],\n \"8407\": [0, 0.72444, 0.15486, 0, 0.575],\n \"8463\": [0, 0.69444, 0, 0, 0.66759],\n \"8465\": [0, 0.69444, 0, 0, 0.83055],\n \"8467\": [0, 0.69444, 0, 0, 0.47361],\n \"8472\": [0.19444, 0.44444, 0, 0, 0.74027],\n \"8476\": [0, 0.69444, 0, 0, 0.83055],\n \"8501\": [0, 0.69444, 0, 0, 0.70277],\n \"8592\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8593\": [0.19444, 0.69444, 0, 0, 0.575],\n \"8594\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8595\": [0.19444, 0.69444, 0, 0, 0.575],\n \"8596\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8597\": [0.25, 0.75, 0, 0, 0.575],\n \"8598\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8599\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8600\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8601\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8636\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8637\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8640\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8641\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8656\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8657\": [0.19444, 0.69444, 0, 0, 0.70277],\n \"8658\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8659\": [0.19444, 0.69444, 0, 0, 0.70277],\n \"8660\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8661\": [0.25, 0.75, 0, 0, 0.70277],\n \"8704\": [0, 0.69444, 0, 0, 0.63889],\n \"8706\": [0, 0.69444, 0.06389, 0, 0.62847],\n \"8707\": [0, 0.69444, 0, 0, 0.63889],\n \"8709\": [0.05556, 0.75, 0, 0, 0.575],\n \"8711\": [0, 0.68611, 0, 0, 0.95833],\n \"8712\": [0.08556, 0.58556, 0, 0, 0.76666],\n \"8715\": [0.08556, 0.58556, 0, 0, 0.76666],\n \"8722\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8723\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8725\": [0.25, 0.75, 0, 0, 0.575],\n \"8726\": [0.25, 0.75, 0, 0, 0.575],\n \"8727\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"8728\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8729\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8730\": [0.18, 0.82, 0, 0, 0.95833],\n \"8733\": [0, 0.44444, 0, 0, 0.89444],\n \"8734\": [0, 0.44444, 0, 0, 1.14999],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8739\": [0.25, 0.75, 0, 0, 0.31944],\n \"8741\": [0.25, 0.75, 0, 0, 0.575],\n \"8743\": [0, 0.55556, 0, 0, 0.76666],\n \"8744\": [0, 0.55556, 0, 0, 0.76666],\n \"8745\": [0, 0.55556, 0, 0, 0.76666],\n \"8746\": [0, 0.55556, 0, 0, 0.76666],\n \"8747\": [0.19444, 0.69444, 0.12778, 0, 0.56875],\n \"8764\": [-0.10889, 0.39111, 0, 0, 0.89444],\n \"8768\": [0.19444, 0.69444, 0, 0, 0.31944],\n \"8771\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8773\": [0.027, 0.638, 0, 0, 0.894],\n \"8776\": [0.02444, 0.52444, 0, 0, 0.89444],\n \"8781\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8801\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8804\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8805\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8810\": [0.08556, 0.58556, 0, 0, 1.14999],\n \"8811\": [0.08556, 0.58556, 0, 0, 1.14999],\n \"8826\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8827\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8834\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8835\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8838\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8839\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8846\": [0, 0.55556, 0, 0, 0.76666],\n \"8849\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8850\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8851\": [0, 0.55556, 0, 0, 0.76666],\n \"8852\": [0, 0.55556, 0, 0, 0.76666],\n \"8853\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8854\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8855\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8856\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8857\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8866\": [0, 0.69444, 0, 0, 0.70277],\n \"8867\": [0, 0.69444, 0, 0, 0.70277],\n \"8868\": [0, 0.69444, 0, 0, 0.89444],\n \"8869\": [0, 0.69444, 0, 0, 0.89444],\n \"8900\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8901\": [-0.02639, 0.47361, 0, 0, 0.31944],\n \"8902\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"8968\": [0.25, 0.75, 0, 0, 0.51111],\n \"8969\": [0.25, 0.75, 0, 0, 0.51111],\n \"8970\": [0.25, 0.75, 0, 0, 0.51111],\n \"8971\": [0.25, 0.75, 0, 0, 0.51111],\n \"8994\": [-0.13889, 0.36111, 0, 0, 1.14999],\n \"8995\": [-0.13889, 0.36111, 0, 0, 1.14999],\n \"9651\": [0.19444, 0.69444, 0, 0, 1.02222],\n \"9657\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"9661\": [0.19444, 0.69444, 0, 0, 1.02222],\n \"9667\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"9711\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"9824\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9825\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9826\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9827\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9837\": [0, 0.75, 0, 0, 0.44722],\n \"9838\": [0.19444, 0.69444, 0, 0, 0.44722],\n \"9839\": [0.19444, 0.69444, 0, 0, 0.44722],\n \"10216\": [0.25, 0.75, 0, 0, 0.44722],\n \"10217\": [0.25, 0.75, 0, 0, 0.44722],\n \"10815\": [0, 0.68611, 0, 0, 0.9],\n \"10927\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"10928\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"57376\": [0.19444, 0.69444, 0, 0, 0]\n },\n \"Main-BoldItalic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.11417, 0, 0.38611],\n \"34\": [0, 0.69444, 0.07939, 0, 0.62055],\n \"35\": [0.19444, 0.69444, 0.06833, 0, 0.94444],\n \"37\": [0.05556, 0.75, 0.12861, 0, 0.94444],\n \"38\": [0, 0.69444, 0.08528, 0, 0.88555],\n \"39\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"40\": [0.25, 0.75, 0.15806, 0, 0.47333],\n \"41\": [0.25, 0.75, 0.03306, 0, 0.47333],\n \"42\": [0, 0.75, 0.14333, 0, 0.59111],\n \"43\": [0.10333, 0.60333, 0.03306, 0, 0.88555],\n \"44\": [0.19444, 0.14722, 0, 0, 0.35555],\n \"45\": [0, 0.44444, 0.02611, 0, 0.41444],\n \"46\": [0, 0.14722, 0, 0, 0.35555],\n \"47\": [0.25, 0.75, 0.15806, 0, 0.59111],\n \"48\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"49\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"50\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"51\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"52\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n \"53\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"54\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"55\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n \"56\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"57\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"58\": [0, 0.44444, 0.06695, 0, 0.35555],\n \"59\": [0.19444, 0.44444, 0.06695, 0, 0.35555],\n \"61\": [-0.10889, 0.39111, 0.06833, 0, 0.88555],\n \"63\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"64\": [0, 0.69444, 0.09208, 0, 0.88555],\n \"65\": [0, 0.68611, 0, 0, 0.86555],\n \"66\": [0, 0.68611, 0.0992, 0, 0.81666],\n \"67\": [0, 0.68611, 0.14208, 0, 0.82666],\n \"68\": [0, 0.68611, 0.09062, 0, 0.87555],\n \"69\": [0, 0.68611, 0.11431, 0, 0.75666],\n \"70\": [0, 0.68611, 0.12903, 0, 0.72722],\n \"71\": [0, 0.68611, 0.07347, 0, 0.89527],\n \"72\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"73\": [0, 0.68611, 0.15681, 0, 0.47166],\n \"74\": [0, 0.68611, 0.145, 0, 0.61055],\n \"75\": [0, 0.68611, 0.14208, 0, 0.89499],\n \"76\": [0, 0.68611, 0, 0, 0.69777],\n \"77\": [0, 0.68611, 0.17208, 0, 1.07277],\n \"78\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"79\": [0, 0.68611, 0.09062, 0, 0.85499],\n \"80\": [0, 0.68611, 0.0992, 0, 0.78721],\n \"81\": [0.19444, 0.68611, 0.09062, 0, 0.85499],\n \"82\": [0, 0.68611, 0.02559, 0, 0.85944],\n \"83\": [0, 0.68611, 0.11264, 0, 0.64999],\n \"84\": [0, 0.68611, 0.12903, 0, 0.7961],\n \"85\": [0, 0.68611, 0.17208, 0, 0.88083],\n \"86\": [0, 0.68611, 0.18625, 0, 0.86555],\n \"87\": [0, 0.68611, 0.18625, 0, 1.15999],\n \"88\": [0, 0.68611, 0.15681, 0, 0.86555],\n \"89\": [0, 0.68611, 0.19803, 0, 0.86555],\n \"90\": [0, 0.68611, 0.14208, 0, 0.70888],\n \"91\": [0.25, 0.75, 0.1875, 0, 0.35611],\n \"93\": [0.25, 0.75, 0.09972, 0, 0.35611],\n \"94\": [0, 0.69444, 0.06709, 0, 0.59111],\n \"95\": [0.31, 0.13444, 0.09811, 0, 0.59111],\n \"97\": [0, 0.44444, 0.09426, 0, 0.59111],\n \"98\": [0, 0.69444, 0.07861, 0, 0.53222],\n \"99\": [0, 0.44444, 0.05222, 0, 0.53222],\n \"100\": [0, 0.69444, 0.10861, 0, 0.59111],\n \"101\": [0, 0.44444, 0.085, 0, 0.53222],\n \"102\": [0.19444, 0.69444, 0.21778, 0, 0.4],\n \"103\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n \"104\": [0, 0.69444, 0.09426, 0, 0.59111],\n \"105\": [0, 0.69326, 0.11387, 0, 0.35555],\n \"106\": [0.19444, 0.69326, 0.1672, 0, 0.35555],\n \"107\": [0, 0.69444, 0.11111, 0, 0.53222],\n \"108\": [0, 0.69444, 0.10861, 0, 0.29666],\n \"109\": [0, 0.44444, 0.09426, 0, 0.94444],\n \"110\": [0, 0.44444, 0.09426, 0, 0.64999],\n \"111\": [0, 0.44444, 0.07861, 0, 0.59111],\n \"112\": [0.19444, 0.44444, 0.07861, 0, 0.59111],\n \"113\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n \"114\": [0, 0.44444, 0.11111, 0, 0.50167],\n \"115\": [0, 0.44444, 0.08167, 0, 0.48694],\n \"116\": [0, 0.63492, 0.09639, 0, 0.385],\n \"117\": [0, 0.44444, 0.09426, 0, 0.62055],\n \"118\": [0, 0.44444, 0.11111, 0, 0.53222],\n \"119\": [0, 0.44444, 0.11111, 0, 0.76777],\n \"120\": [0, 0.44444, 0.12583, 0, 0.56055],\n \"121\": [0.19444, 0.44444, 0.105, 0, 0.56166],\n \"122\": [0, 0.44444, 0.13889, 0, 0.49055],\n \"126\": [0.35, 0.34444, 0.11472, 0, 0.59111],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.69444, 0.11473, 0, 0.59111],\n \"176\": [0, 0.69444, 0, 0, 0.94888],\n \"184\": [0.17014, 0, 0, 0, 0.53222],\n \"198\": [0, 0.68611, 0.11431, 0, 1.02277],\n \"216\": [0.04861, 0.73472, 0.09062, 0, 0.88555],\n \"223\": [0.19444, 0.69444, 0.09736, 0, 0.665],\n \"230\": [0, 0.44444, 0.085, 0, 0.82666],\n \"248\": [0.09722, 0.54167, 0.09458, 0, 0.59111],\n \"305\": [0, 0.44444, 0.09426, 0, 0.35555],\n \"338\": [0, 0.68611, 0.11431, 0, 1.14054],\n \"339\": [0, 0.44444, 0.085, 0, 0.82666],\n \"567\": [0.19444, 0.44444, 0.04611, 0, 0.385],\n \"710\": [0, 0.69444, 0.06709, 0, 0.59111],\n \"711\": [0, 0.63194, 0.08271, 0, 0.59111],\n \"713\": [0, 0.59444, 0.10444, 0, 0.59111],\n \"714\": [0, 0.69444, 0.08528, 0, 0.59111],\n \"715\": [0, 0.69444, 0, 0, 0.59111],\n \"728\": [0, 0.69444, 0.10333, 0, 0.59111],\n \"729\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"730\": [0, 0.69444, 0, 0, 0.94888],\n \"732\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"733\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"915\": [0, 0.68611, 0.12903, 0, 0.69777],\n \"916\": [0, 0.68611, 0, 0, 0.94444],\n \"920\": [0, 0.68611, 0.09062, 0, 0.88555],\n \"923\": [0, 0.68611, 0, 0, 0.80666],\n \"926\": [0, 0.68611, 0.15092, 0, 0.76777],\n \"928\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"931\": [0, 0.68611, 0.11431, 0, 0.82666],\n \"933\": [0, 0.68611, 0.10778, 0, 0.88555],\n \"934\": [0, 0.68611, 0.05632, 0, 0.82666],\n \"936\": [0, 0.68611, 0.10778, 0, 0.88555],\n \"937\": [0, 0.68611, 0.0992, 0, 0.82666],\n \"8211\": [0, 0.44444, 0.09811, 0, 0.59111],\n \"8212\": [0, 0.44444, 0.09811, 0, 1.18221],\n \"8216\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"8217\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"8220\": [0, 0.69444, 0.16772, 0, 0.62055],\n \"8221\": [0, 0.69444, 0.07939, 0, 0.62055]\n },\n \"Main-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"34\": [0, 0.69444, 0.06961, 0, 0.51444],\n \"35\": [0.19444, 0.69444, 0.06616, 0, 0.81777],\n \"37\": [0.05556, 0.75, 0.13639, 0, 0.81777],\n \"38\": [0, 0.69444, 0.09694, 0, 0.76666],\n \"39\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"40\": [0.25, 0.75, 0.16194, 0, 0.40889],\n \"41\": [0.25, 0.75, 0.03694, 0, 0.40889],\n \"42\": [0, 0.75, 0.14917, 0, 0.51111],\n \"43\": [0.05667, 0.56167, 0.03694, 0, 0.76666],\n \"44\": [0.19444, 0.10556, 0, 0, 0.30667],\n \"45\": [0, 0.43056, 0.02826, 0, 0.35778],\n \"46\": [0, 0.10556, 0, 0, 0.30667],\n \"47\": [0.25, 0.75, 0.16194, 0, 0.51111],\n \"48\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"49\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"50\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"51\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"52\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n \"53\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"54\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"55\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n \"56\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"57\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"58\": [0, 0.43056, 0.0582, 0, 0.30667],\n \"59\": [0.19444, 0.43056, 0.0582, 0, 0.30667],\n \"61\": [-0.13313, 0.36687, 0.06616, 0, 0.76666],\n \"63\": [0, 0.69444, 0.1225, 0, 0.51111],\n \"64\": [0, 0.69444, 0.09597, 0, 0.76666],\n \"65\": [0, 0.68333, 0, 0, 0.74333],\n \"66\": [0, 0.68333, 0.10257, 0, 0.70389],\n \"67\": [0, 0.68333, 0.14528, 0, 0.71555],\n \"68\": [0, 0.68333, 0.09403, 0, 0.755],\n \"69\": [0, 0.68333, 0.12028, 0, 0.67833],\n \"70\": [0, 0.68333, 0.13305, 0, 0.65277],\n \"71\": [0, 0.68333, 0.08722, 0, 0.77361],\n \"72\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"73\": [0, 0.68333, 0.15806, 0, 0.38555],\n \"74\": [0, 0.68333, 0.14028, 0, 0.525],\n \"75\": [0, 0.68333, 0.14528, 0, 0.76888],\n \"76\": [0, 0.68333, 0, 0, 0.62722],\n \"77\": [0, 0.68333, 0.16389, 0, 0.89666],\n \"78\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"79\": [0, 0.68333, 0.09403, 0, 0.76666],\n \"80\": [0, 0.68333, 0.10257, 0, 0.67833],\n \"81\": [0.19444, 0.68333, 0.09403, 0, 0.76666],\n \"82\": [0, 0.68333, 0.03868, 0, 0.72944],\n \"83\": [0, 0.68333, 0.11972, 0, 0.56222],\n \"84\": [0, 0.68333, 0.13305, 0, 0.71555],\n \"85\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"86\": [0, 0.68333, 0.18361, 0, 0.74333],\n \"87\": [0, 0.68333, 0.18361, 0, 0.99888],\n \"88\": [0, 0.68333, 0.15806, 0, 0.74333],\n \"89\": [0, 0.68333, 0.19383, 0, 0.74333],\n \"90\": [0, 0.68333, 0.14528, 0, 0.61333],\n \"91\": [0.25, 0.75, 0.1875, 0, 0.30667],\n \"93\": [0.25, 0.75, 0.10528, 0, 0.30667],\n \"94\": [0, 0.69444, 0.06646, 0, 0.51111],\n \"95\": [0.31, 0.12056, 0.09208, 0, 0.51111],\n \"97\": [0, 0.43056, 0.07671, 0, 0.51111],\n \"98\": [0, 0.69444, 0.06312, 0, 0.46],\n \"99\": [0, 0.43056, 0.05653, 0, 0.46],\n \"100\": [0, 0.69444, 0.10333, 0, 0.51111],\n \"101\": [0, 0.43056, 0.07514, 0, 0.46],\n \"102\": [0.19444, 0.69444, 0.21194, 0, 0.30667],\n \"103\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n \"104\": [0, 0.69444, 0.07671, 0, 0.51111],\n \"105\": [0, 0.65536, 0.1019, 0, 0.30667],\n \"106\": [0.19444, 0.65536, 0.14467, 0, 0.30667],\n \"107\": [0, 0.69444, 0.10764, 0, 0.46],\n \"108\": [0, 0.69444, 0.10333, 0, 0.25555],\n \"109\": [0, 0.43056, 0.07671, 0, 0.81777],\n \"110\": [0, 0.43056, 0.07671, 0, 0.56222],\n \"111\": [0, 0.43056, 0.06312, 0, 0.51111],\n \"112\": [0.19444, 0.43056, 0.06312, 0, 0.51111],\n \"113\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n \"114\": [0, 0.43056, 0.10764, 0, 0.42166],\n \"115\": [0, 0.43056, 0.08208, 0, 0.40889],\n \"116\": [0, 0.61508, 0.09486, 0, 0.33222],\n \"117\": [0, 0.43056, 0.07671, 0, 0.53666],\n \"118\": [0, 0.43056, 0.10764, 0, 0.46],\n \"119\": [0, 0.43056, 0.10764, 0, 0.66444],\n \"120\": [0, 0.43056, 0.12042, 0, 0.46389],\n \"121\": [0.19444, 0.43056, 0.08847, 0, 0.48555],\n \"122\": [0, 0.43056, 0.12292, 0, 0.40889],\n \"126\": [0.35, 0.31786, 0.11585, 0, 0.51111],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.66786, 0.10474, 0, 0.51111],\n \"176\": [0, 0.69444, 0, 0, 0.83129],\n \"184\": [0.17014, 0, 0, 0, 0.46],\n \"198\": [0, 0.68333, 0.12028, 0, 0.88277],\n \"216\": [0.04861, 0.73194, 0.09403, 0, 0.76666],\n \"223\": [0.19444, 0.69444, 0.10514, 0, 0.53666],\n \"230\": [0, 0.43056, 0.07514, 0, 0.71555],\n \"248\": [0.09722, 0.52778, 0.09194, 0, 0.51111],\n \"338\": [0, 0.68333, 0.12028, 0, 0.98499],\n \"339\": [0, 0.43056, 0.07514, 0, 0.71555],\n \"710\": [0, 0.69444, 0.06646, 0, 0.51111],\n \"711\": [0, 0.62847, 0.08295, 0, 0.51111],\n \"713\": [0, 0.56167, 0.10333, 0, 0.51111],\n \"714\": [0, 0.69444, 0.09694, 0, 0.51111],\n \"715\": [0, 0.69444, 0, 0, 0.51111],\n \"728\": [0, 0.69444, 0.10806, 0, 0.51111],\n \"729\": [0, 0.66786, 0.11752, 0, 0.30667],\n \"730\": [0, 0.69444, 0, 0, 0.83129],\n \"732\": [0, 0.66786, 0.11585, 0, 0.51111],\n \"733\": [0, 0.69444, 0.1225, 0, 0.51111],\n \"915\": [0, 0.68333, 0.13305, 0, 0.62722],\n \"916\": [0, 0.68333, 0, 0, 0.81777],\n \"920\": [0, 0.68333, 0.09403, 0, 0.76666],\n \"923\": [0, 0.68333, 0, 0, 0.69222],\n \"926\": [0, 0.68333, 0.15294, 0, 0.66444],\n \"928\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"931\": [0, 0.68333, 0.12028, 0, 0.71555],\n \"933\": [0, 0.68333, 0.11111, 0, 0.76666],\n \"934\": [0, 0.68333, 0.05986, 0, 0.71555],\n \"936\": [0, 0.68333, 0.11111, 0, 0.76666],\n \"937\": [0, 0.68333, 0.10257, 0, 0.71555],\n \"8211\": [0, 0.43056, 0.09208, 0, 0.51111],\n \"8212\": [0, 0.43056, 0.09208, 0, 1.02222],\n \"8216\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"8217\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"8220\": [0, 0.69444, 0.1685, 0, 0.51444],\n \"8221\": [0, 0.69444, 0.06961, 0, 0.51444],\n \"8463\": [0, 0.68889, 0, 0, 0.54028]\n },\n \"Main-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.27778],\n \"34\": [0, 0.69444, 0, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0, 0, 0.5],\n \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n \"38\": [0, 0.69444, 0, 0, 0.77778],\n \"39\": [0, 0.69444, 0, 0, 0.27778],\n \"40\": [0.25, 0.75, 0, 0, 0.38889],\n \"41\": [0.25, 0.75, 0, 0, 0.38889],\n \"42\": [0, 0.75, 0, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"44\": [0.19444, 0.10556, 0, 0, 0.27778],\n \"45\": [0, 0.43056, 0, 0, 0.33333],\n \"46\": [0, 0.10556, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0, 0, 0.5],\n \"48\": [0, 0.64444, 0, 0, 0.5],\n \"49\": [0, 0.64444, 0, 0, 0.5],\n \"50\": [0, 0.64444, 0, 0, 0.5],\n \"51\": [0, 0.64444, 0, 0, 0.5],\n \"52\": [0, 0.64444, 0, 0, 0.5],\n \"53\": [0, 0.64444, 0, 0, 0.5],\n \"54\": [0, 0.64444, 0, 0, 0.5],\n \"55\": [0, 0.64444, 0, 0, 0.5],\n \"56\": [0, 0.64444, 0, 0, 0.5],\n \"57\": [0, 0.64444, 0, 0, 0.5],\n \"58\": [0, 0.43056, 0, 0, 0.27778],\n \"59\": [0.19444, 0.43056, 0, 0, 0.27778],\n \"60\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"61\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"62\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"63\": [0, 0.69444, 0, 0, 0.47222],\n \"64\": [0, 0.69444, 0, 0, 0.77778],\n \"65\": [0, 0.68333, 0, 0, 0.75],\n \"66\": [0, 0.68333, 0, 0, 0.70834],\n \"67\": [0, 0.68333, 0, 0, 0.72222],\n \"68\": [0, 0.68333, 0, 0, 0.76389],\n \"69\": [0, 0.68333, 0, 0, 0.68056],\n \"70\": [0, 0.68333, 0, 0, 0.65278],\n \"71\": [0, 0.68333, 0, 0, 0.78472],\n \"72\": [0, 0.68333, 0, 0, 0.75],\n \"73\": [0, 0.68333, 0, 0, 0.36111],\n \"74\": [0, 0.68333, 0, 0, 0.51389],\n \"75\": [0, 0.68333, 0, 0, 0.77778],\n \"76\": [0, 0.68333, 0, 0, 0.625],\n \"77\": [0, 0.68333, 0, 0, 0.91667],\n \"78\": [0, 0.68333, 0, 0, 0.75],\n \"79\": [0, 0.68333, 0, 0, 0.77778],\n \"80\": [0, 0.68333, 0, 0, 0.68056],\n \"81\": [0.19444, 0.68333, 0, 0, 0.77778],\n \"82\": [0, 0.68333, 0, 0, 0.73611],\n \"83\": [0, 0.68333, 0, 0, 0.55556],\n \"84\": [0, 0.68333, 0, 0, 0.72222],\n \"85\": [0, 0.68333, 0, 0, 0.75],\n \"86\": [0, 0.68333, 0.01389, 0, 0.75],\n \"87\": [0, 0.68333, 0.01389, 0, 1.02778],\n \"88\": [0, 0.68333, 0, 0, 0.75],\n \"89\": [0, 0.68333, 0.025, 0, 0.75],\n \"90\": [0, 0.68333, 0, 0, 0.61111],\n \"91\": [0.25, 0.75, 0, 0, 0.27778],\n \"92\": [0.25, 0.75, 0, 0, 0.5],\n \"93\": [0.25, 0.75, 0, 0, 0.27778],\n \"94\": [0, 0.69444, 0, 0, 0.5],\n \"95\": [0.31, 0.12056, 0.02778, 0, 0.5],\n \"97\": [0, 0.43056, 0, 0, 0.5],\n \"98\": [0, 0.69444, 0, 0, 0.55556],\n \"99\": [0, 0.43056, 0, 0, 0.44445],\n \"100\": [0, 0.69444, 0, 0, 0.55556],\n \"101\": [0, 0.43056, 0, 0, 0.44445],\n \"102\": [0, 0.69444, 0.07778, 0, 0.30556],\n \"103\": [0.19444, 0.43056, 0.01389, 0, 0.5],\n \"104\": [0, 0.69444, 0, 0, 0.55556],\n \"105\": [0, 0.66786, 0, 0, 0.27778],\n \"106\": [0.19444, 0.66786, 0, 0, 0.30556],\n \"107\": [0, 0.69444, 0, 0, 0.52778],\n \"108\": [0, 0.69444, 0, 0, 0.27778],\n \"109\": [0, 0.43056, 0, 0, 0.83334],\n \"110\": [0, 0.43056, 0, 0, 0.55556],\n \"111\": [0, 0.43056, 0, 0, 0.5],\n \"112\": [0.19444, 0.43056, 0, 0, 0.55556],\n \"113\": [0.19444, 0.43056, 0, 0, 0.52778],\n \"114\": [0, 0.43056, 0, 0, 0.39167],\n \"115\": [0, 0.43056, 0, 0, 0.39445],\n \"116\": [0, 0.61508, 0, 0, 0.38889],\n \"117\": [0, 0.43056, 0, 0, 0.55556],\n \"118\": [0, 0.43056, 0.01389, 0, 0.52778],\n \"119\": [0, 0.43056, 0.01389, 0, 0.72222],\n \"120\": [0, 0.43056, 0, 0, 0.52778],\n \"121\": [0.19444, 0.43056, 0.01389, 0, 0.52778],\n \"122\": [0, 0.43056, 0, 0, 0.44445],\n \"123\": [0.25, 0.75, 0, 0, 0.5],\n \"124\": [0.25, 0.75, 0, 0, 0.27778],\n \"125\": [0.25, 0.75, 0, 0, 0.5],\n \"126\": [0.35, 0.31786, 0, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"163\": [0, 0.69444, 0, 0, 0.76909],\n \"167\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"168\": [0, 0.66786, 0, 0, 0.5],\n \"172\": [0, 0.43056, 0, 0, 0.66667],\n \"176\": [0, 0.69444, 0, 0, 0.75],\n \"177\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"182\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"198\": [0, 0.68333, 0, 0, 0.90278],\n \"215\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"216\": [0.04861, 0.73194, 0, 0, 0.77778],\n \"223\": [0, 0.69444, 0, 0, 0.5],\n \"230\": [0, 0.43056, 0, 0, 0.72222],\n \"247\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"248\": [0.09722, 0.52778, 0, 0, 0.5],\n \"305\": [0, 0.43056, 0, 0, 0.27778],\n \"338\": [0, 0.68333, 0, 0, 1.01389],\n \"339\": [0, 0.43056, 0, 0, 0.77778],\n \"567\": [0.19444, 0.43056, 0, 0, 0.30556],\n \"710\": [0, 0.69444, 0, 0, 0.5],\n \"711\": [0, 0.62847, 0, 0, 0.5],\n \"713\": [0, 0.56778, 0, 0, 0.5],\n \"714\": [0, 0.69444, 0, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0, 0, 0.5],\n \"729\": [0, 0.66786, 0, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.75],\n \"732\": [0, 0.66786, 0, 0, 0.5],\n \"733\": [0, 0.69444, 0, 0, 0.5],\n \"915\": [0, 0.68333, 0, 0, 0.625],\n \"916\": [0, 0.68333, 0, 0, 0.83334],\n \"920\": [0, 0.68333, 0, 0, 0.77778],\n \"923\": [0, 0.68333, 0, 0, 0.69445],\n \"926\": [0, 0.68333, 0, 0, 0.66667],\n \"928\": [0, 0.68333, 0, 0, 0.75],\n \"931\": [0, 0.68333, 0, 0, 0.72222],\n \"933\": [0, 0.68333, 0, 0, 0.77778],\n \"934\": [0, 0.68333, 0, 0, 0.72222],\n \"936\": [0, 0.68333, 0, 0, 0.77778],\n \"937\": [0, 0.68333, 0, 0, 0.72222],\n \"8211\": [0, 0.43056, 0.02778, 0, 0.5],\n \"8212\": [0, 0.43056, 0.02778, 0, 1.0],\n \"8216\": [0, 0.69444, 0, 0, 0.27778],\n \"8217\": [0, 0.69444, 0, 0, 0.27778],\n \"8220\": [0, 0.69444, 0, 0, 0.5],\n \"8221\": [0, 0.69444, 0, 0, 0.5],\n \"8224\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"8225\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"8230\": [0, 0.123, 0, 0, 1.172],\n \"8242\": [0, 0.55556, 0, 0, 0.275],\n \"8407\": [0, 0.71444, 0.15382, 0, 0.5],\n \"8463\": [0, 0.68889, 0, 0, 0.54028],\n \"8465\": [0, 0.69444, 0, 0, 0.72222],\n \"8467\": [0, 0.69444, 0, 0.11111, 0.41667],\n \"8472\": [0.19444, 0.43056, 0, 0.11111, 0.63646],\n \"8476\": [0, 0.69444, 0, 0, 0.72222],\n \"8501\": [0, 0.69444, 0, 0, 0.61111],\n \"8592\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8593\": [0.19444, 0.69444, 0, 0, 0.5],\n \"8594\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8595\": [0.19444, 0.69444, 0, 0, 0.5],\n \"8596\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8597\": [0.25, 0.75, 0, 0, 0.5],\n \"8598\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8599\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8600\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8601\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8614\": [0.011, 0.511, 0, 0, 1.0],\n \"8617\": [0.011, 0.511, 0, 0, 1.126],\n \"8618\": [0.011, 0.511, 0, 0, 1.126],\n \"8636\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8637\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8640\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8641\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8652\": [0.011, 0.671, 0, 0, 1.0],\n \"8656\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8657\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"8658\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8659\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"8660\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8661\": [0.25, 0.75, 0, 0, 0.61111],\n \"8704\": [0, 0.69444, 0, 0, 0.55556],\n \"8706\": [0, 0.69444, 0.05556, 0.08334, 0.5309],\n \"8707\": [0, 0.69444, 0, 0, 0.55556],\n \"8709\": [0.05556, 0.75, 0, 0, 0.5],\n \"8711\": [0, 0.68333, 0, 0, 0.83334],\n \"8712\": [0.0391, 0.5391, 0, 0, 0.66667],\n \"8715\": [0.0391, 0.5391, 0, 0, 0.66667],\n \"8722\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8723\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8725\": [0.25, 0.75, 0, 0, 0.5],\n \"8726\": [0.25, 0.75, 0, 0, 0.5],\n \"8727\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"8728\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8729\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8730\": [0.2, 0.8, 0, 0, 0.83334],\n \"8733\": [0, 0.43056, 0, 0, 0.77778],\n \"8734\": [0, 0.43056, 0, 0, 1.0],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8739\": [0.25, 0.75, 0, 0, 0.27778],\n \"8741\": [0.25, 0.75, 0, 0, 0.5],\n \"8743\": [0, 0.55556, 0, 0, 0.66667],\n \"8744\": [0, 0.55556, 0, 0, 0.66667],\n \"8745\": [0, 0.55556, 0, 0, 0.66667],\n \"8746\": [0, 0.55556, 0, 0, 0.66667],\n \"8747\": [0.19444, 0.69444, 0.11111, 0, 0.41667],\n \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8768\": [0.19444, 0.69444, 0, 0, 0.27778],\n \"8771\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8773\": [-0.022, 0.589, 0, 0, 0.778],\n \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n \"8781\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8784\": [-0.133, 0.673, 0, 0, 0.778],\n \"8801\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8804\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8805\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8810\": [0.0391, 0.5391, 0, 0, 1.0],\n \"8811\": [0.0391, 0.5391, 0, 0, 1.0],\n \"8826\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8827\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8834\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8835\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8838\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8839\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8846\": [0, 0.55556, 0, 0, 0.66667],\n \"8849\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8850\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8851\": [0, 0.55556, 0, 0, 0.66667],\n \"8852\": [0, 0.55556, 0, 0, 0.66667],\n \"8853\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8854\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8855\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8856\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8857\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8866\": [0, 0.69444, 0, 0, 0.61111],\n \"8867\": [0, 0.69444, 0, 0, 0.61111],\n \"8868\": [0, 0.69444, 0, 0, 0.77778],\n \"8869\": [0, 0.69444, 0, 0, 0.77778],\n \"8872\": [0.249, 0.75, 0, 0, 0.867],\n \"8900\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8901\": [-0.05555, 0.44445, 0, 0, 0.27778],\n \"8902\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"8904\": [0.005, 0.505, 0, 0, 0.9],\n \"8942\": [0.03, 0.903, 0, 0, 0.278],\n \"8943\": [-0.19, 0.313, 0, 0, 1.172],\n \"8945\": [-0.1, 0.823, 0, 0, 1.282],\n \"8968\": [0.25, 0.75, 0, 0, 0.44445],\n \"8969\": [0.25, 0.75, 0, 0, 0.44445],\n \"8970\": [0.25, 0.75, 0, 0, 0.44445],\n \"8971\": [0.25, 0.75, 0, 0, 0.44445],\n \"8994\": [-0.14236, 0.35764, 0, 0, 1.0],\n \"8995\": [-0.14236, 0.35764, 0, 0, 1.0],\n \"9136\": [0.244, 0.744, 0, 0, 0.412],\n \"9137\": [0.244, 0.745, 0, 0, 0.412],\n \"9651\": [0.19444, 0.69444, 0, 0, 0.88889],\n \"9657\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"9661\": [0.19444, 0.69444, 0, 0, 0.88889],\n \"9667\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"9711\": [0.19444, 0.69444, 0, 0, 1.0],\n \"9824\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9825\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9826\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9827\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9837\": [0, 0.75, 0, 0, 0.38889],\n \"9838\": [0.19444, 0.69444, 0, 0, 0.38889],\n \"9839\": [0.19444, 0.69444, 0, 0, 0.38889],\n \"10216\": [0.25, 0.75, 0, 0, 0.38889],\n \"10217\": [0.25, 0.75, 0, 0, 0.38889],\n \"10222\": [0.244, 0.744, 0, 0, 0.412],\n \"10223\": [0.244, 0.745, 0, 0, 0.412],\n \"10229\": [0.011, 0.511, 0, 0, 1.609],\n \"10230\": [0.011, 0.511, 0, 0, 1.638],\n \"10231\": [0.011, 0.511, 0, 0, 1.859],\n \"10232\": [0.024, 0.525, 0, 0, 1.609],\n \"10233\": [0.024, 0.525, 0, 0, 1.638],\n \"10234\": [0.024, 0.525, 0, 0, 1.858],\n \"10236\": [0.011, 0.511, 0, 0, 1.638],\n \"10815\": [0, 0.68333, 0, 0, 0.75],\n \"10927\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10928\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"57376\": [0.19444, 0.69444, 0, 0, 0]\n },\n \"Math-BoldItalic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"48\": [0, 0.44444, 0, 0, 0.575],\n \"49\": [0, 0.44444, 0, 0, 0.575],\n \"50\": [0, 0.44444, 0, 0, 0.575],\n \"51\": [0.19444, 0.44444, 0, 0, 0.575],\n \"52\": [0.19444, 0.44444, 0, 0, 0.575],\n \"53\": [0.19444, 0.44444, 0, 0, 0.575],\n \"54\": [0, 0.64444, 0, 0, 0.575],\n \"55\": [0.19444, 0.44444, 0, 0, 0.575],\n \"56\": [0, 0.64444, 0, 0, 0.575],\n \"57\": [0.19444, 0.44444, 0, 0, 0.575],\n \"65\": [0, 0.68611, 0, 0, 0.86944],\n \"66\": [0, 0.68611, 0.04835, 0, 0.8664],\n \"67\": [0, 0.68611, 0.06979, 0, 0.81694],\n \"68\": [0, 0.68611, 0.03194, 0, 0.93812],\n \"69\": [0, 0.68611, 0.05451, 0, 0.81007],\n \"70\": [0, 0.68611, 0.15972, 0, 0.68889],\n \"71\": [0, 0.68611, 0, 0, 0.88673],\n \"72\": [0, 0.68611, 0.08229, 0, 0.98229],\n \"73\": [0, 0.68611, 0.07778, 0, 0.51111],\n \"74\": [0, 0.68611, 0.10069, 0, 0.63125],\n \"75\": [0, 0.68611, 0.06979, 0, 0.97118],\n \"76\": [0, 0.68611, 0, 0, 0.75555],\n \"77\": [0, 0.68611, 0.11424, 0, 1.14201],\n \"78\": [0, 0.68611, 0.11424, 0, 0.95034],\n \"79\": [0, 0.68611, 0.03194, 0, 0.83666],\n \"80\": [0, 0.68611, 0.15972, 0, 0.72309],\n \"81\": [0.19444, 0.68611, 0, 0, 0.86861],\n \"82\": [0, 0.68611, 0.00421, 0, 0.87235],\n \"83\": [0, 0.68611, 0.05382, 0, 0.69271],\n \"84\": [0, 0.68611, 0.15972, 0, 0.63663],\n \"85\": [0, 0.68611, 0.11424, 0, 0.80027],\n \"86\": [0, 0.68611, 0.25555, 0, 0.67778],\n \"87\": [0, 0.68611, 0.15972, 0, 1.09305],\n \"88\": [0, 0.68611, 0.07778, 0, 0.94722],\n \"89\": [0, 0.68611, 0.25555, 0, 0.67458],\n \"90\": [0, 0.68611, 0.06979, 0, 0.77257],\n \"97\": [0, 0.44444, 0, 0, 0.63287],\n \"98\": [0, 0.69444, 0, 0, 0.52083],\n \"99\": [0, 0.44444, 0, 0, 0.51342],\n \"100\": [0, 0.69444, 0, 0, 0.60972],\n \"101\": [0, 0.44444, 0, 0, 0.55361],\n \"102\": [0.19444, 0.69444, 0.11042, 0, 0.56806],\n \"103\": [0.19444, 0.44444, 0.03704, 0, 0.5449],\n \"104\": [0, 0.69444, 0, 0, 0.66759],\n \"105\": [0, 0.69326, 0, 0, 0.4048],\n \"106\": [0.19444, 0.69326, 0.0622, 0, 0.47083],\n \"107\": [0, 0.69444, 0.01852, 0, 0.6037],\n \"108\": [0, 0.69444, 0.0088, 0, 0.34815],\n \"109\": [0, 0.44444, 0, 0, 1.0324],\n \"110\": [0, 0.44444, 0, 0, 0.71296],\n \"111\": [0, 0.44444, 0, 0, 0.58472],\n \"112\": [0.19444, 0.44444, 0, 0, 0.60092],\n \"113\": [0.19444, 0.44444, 0.03704, 0, 0.54213],\n \"114\": [0, 0.44444, 0.03194, 0, 0.5287],\n \"115\": [0, 0.44444, 0, 0, 0.53125],\n \"116\": [0, 0.63492, 0, 0, 0.41528],\n \"117\": [0, 0.44444, 0, 0, 0.68102],\n \"118\": [0, 0.44444, 0.03704, 0, 0.56666],\n \"119\": [0, 0.44444, 0.02778, 0, 0.83148],\n \"120\": [0, 0.44444, 0, 0, 0.65903],\n \"121\": [0.19444, 0.44444, 0.03704, 0, 0.59028],\n \"122\": [0, 0.44444, 0.04213, 0, 0.55509],\n \"160\": [0, 0, 0, 0, 0.25],\n \"915\": [0, 0.68611, 0.15972, 0, 0.65694],\n \"916\": [0, 0.68611, 0, 0, 0.95833],\n \"920\": [0, 0.68611, 0.03194, 0, 0.86722],\n \"923\": [0, 0.68611, 0, 0, 0.80555],\n \"926\": [0, 0.68611, 0.07458, 0, 0.84125],\n \"928\": [0, 0.68611, 0.08229, 0, 0.98229],\n \"931\": [0, 0.68611, 0.05451, 0, 0.88507],\n \"933\": [0, 0.68611, 0.15972, 0, 0.67083],\n \"934\": [0, 0.68611, 0, 0, 0.76666],\n \"936\": [0, 0.68611, 0.11653, 0, 0.71402],\n \"937\": [0, 0.68611, 0.04835, 0, 0.8789],\n \"945\": [0, 0.44444, 0, 0, 0.76064],\n \"946\": [0.19444, 0.69444, 0.03403, 0, 0.65972],\n \"947\": [0.19444, 0.44444, 0.06389, 0, 0.59003],\n \"948\": [0, 0.69444, 0.03819, 0, 0.52222],\n \"949\": [0, 0.44444, 0, 0, 0.52882],\n \"950\": [0.19444, 0.69444, 0.06215, 0, 0.50833],\n \"951\": [0.19444, 0.44444, 0.03704, 0, 0.6],\n \"952\": [0, 0.69444, 0.03194, 0, 0.5618],\n \"953\": [0, 0.44444, 0, 0, 0.41204],\n \"954\": [0, 0.44444, 0, 0, 0.66759],\n \"955\": [0, 0.69444, 0, 0, 0.67083],\n \"956\": [0.19444, 0.44444, 0, 0, 0.70787],\n \"957\": [0, 0.44444, 0.06898, 0, 0.57685],\n \"958\": [0.19444, 0.69444, 0.03021, 0, 0.50833],\n \"959\": [0, 0.44444, 0, 0, 0.58472],\n \"960\": [0, 0.44444, 0.03704, 0, 0.68241],\n \"961\": [0.19444, 0.44444, 0, 0, 0.6118],\n \"962\": [0.09722, 0.44444, 0.07917, 0, 0.42361],\n \"963\": [0, 0.44444, 0.03704, 0, 0.68588],\n \"964\": [0, 0.44444, 0.13472, 0, 0.52083],\n \"965\": [0, 0.44444, 0.03704, 0, 0.63055],\n \"966\": [0.19444, 0.44444, 0, 0, 0.74722],\n \"967\": [0.19444, 0.44444, 0, 0, 0.71805],\n \"968\": [0.19444, 0.69444, 0.03704, 0, 0.75833],\n \"969\": [0, 0.44444, 0.03704, 0, 0.71782],\n \"977\": [0, 0.69444, 0, 0, 0.69155],\n \"981\": [0.19444, 0.69444, 0, 0, 0.7125],\n \"982\": [0, 0.44444, 0.03194, 0, 0.975],\n \"1009\": [0.19444, 0.44444, 0, 0, 0.6118],\n \"1013\": [0, 0.44444, 0, 0, 0.48333],\n \"57649\": [0, 0.44444, 0, 0, 0.39352],\n \"57911\": [0.19444, 0.44444, 0, 0, 0.43889]\n },\n \"Math-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"48\": [0, 0.43056, 0, 0, 0.5],\n \"49\": [0, 0.43056, 0, 0, 0.5],\n \"50\": [0, 0.43056, 0, 0, 0.5],\n \"51\": [0.19444, 0.43056, 0, 0, 0.5],\n \"52\": [0.19444, 0.43056, 0, 0, 0.5],\n \"53\": [0.19444, 0.43056, 0, 0, 0.5],\n \"54\": [0, 0.64444, 0, 0, 0.5],\n \"55\": [0.19444, 0.43056, 0, 0, 0.5],\n \"56\": [0, 0.64444, 0, 0, 0.5],\n \"57\": [0.19444, 0.43056, 0, 0, 0.5],\n \"65\": [0, 0.68333, 0, 0.13889, 0.75],\n \"66\": [0, 0.68333, 0.05017, 0.08334, 0.75851],\n \"67\": [0, 0.68333, 0.07153, 0.08334, 0.71472],\n \"68\": [0, 0.68333, 0.02778, 0.05556, 0.82792],\n \"69\": [0, 0.68333, 0.05764, 0.08334, 0.7382],\n \"70\": [0, 0.68333, 0.13889, 0.08334, 0.64306],\n \"71\": [0, 0.68333, 0, 0.08334, 0.78625],\n \"72\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n \"73\": [0, 0.68333, 0.07847, 0.11111, 0.43958],\n \"74\": [0, 0.68333, 0.09618, 0.16667, 0.55451],\n \"75\": [0, 0.68333, 0.07153, 0.05556, 0.84931],\n \"76\": [0, 0.68333, 0, 0.02778, 0.68056],\n \"77\": [0, 0.68333, 0.10903, 0.08334, 0.97014],\n \"78\": [0, 0.68333, 0.10903, 0.08334, 0.80347],\n \"79\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n \"80\": [0, 0.68333, 0.13889, 0.08334, 0.64201],\n \"81\": [0.19444, 0.68333, 0, 0.08334, 0.79056],\n \"82\": [0, 0.68333, 0.00773, 0.08334, 0.75929],\n \"83\": [0, 0.68333, 0.05764, 0.08334, 0.6132],\n \"84\": [0, 0.68333, 0.13889, 0.08334, 0.58438],\n \"85\": [0, 0.68333, 0.10903, 0.02778, 0.68278],\n \"86\": [0, 0.68333, 0.22222, 0, 0.58333],\n \"87\": [0, 0.68333, 0.13889, 0, 0.94445],\n \"88\": [0, 0.68333, 0.07847, 0.08334, 0.82847],\n \"89\": [0, 0.68333, 0.22222, 0, 0.58056],\n \"90\": [0, 0.68333, 0.07153, 0.08334, 0.68264],\n \"97\": [0, 0.43056, 0, 0, 0.52859],\n \"98\": [0, 0.69444, 0, 0, 0.42917],\n \"99\": [0, 0.43056, 0, 0.05556, 0.43276],\n \"100\": [0, 0.69444, 0, 0.16667, 0.52049],\n \"101\": [0, 0.43056, 0, 0.05556, 0.46563],\n \"102\": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],\n \"103\": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],\n \"104\": [0, 0.69444, 0, 0, 0.57616],\n \"105\": [0, 0.65952, 0, 0, 0.34451],\n \"106\": [0.19444, 0.65952, 0.05724, 0, 0.41181],\n \"107\": [0, 0.69444, 0.03148, 0, 0.5206],\n \"108\": [0, 0.69444, 0.01968, 0.08334, 0.29838],\n \"109\": [0, 0.43056, 0, 0, 0.87801],\n \"110\": [0, 0.43056, 0, 0, 0.60023],\n \"111\": [0, 0.43056, 0, 0.05556, 0.48472],\n \"112\": [0.19444, 0.43056, 0, 0.08334, 0.50313],\n \"113\": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],\n \"114\": [0, 0.43056, 0.02778, 0.05556, 0.45116],\n \"115\": [0, 0.43056, 0, 0.05556, 0.46875],\n \"116\": [0, 0.61508, 0, 0.08334, 0.36111],\n \"117\": [0, 0.43056, 0, 0.02778, 0.57246],\n \"118\": [0, 0.43056, 0.03588, 0.02778, 0.48472],\n \"119\": [0, 0.43056, 0.02691, 0.08334, 0.71592],\n \"120\": [0, 0.43056, 0, 0.02778, 0.57153],\n \"121\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],\n \"122\": [0, 0.43056, 0.04398, 0.05556, 0.46505],\n \"160\": [0, 0, 0, 0, 0.25],\n \"915\": [0, 0.68333, 0.13889, 0.08334, 0.61528],\n \"916\": [0, 0.68333, 0, 0.16667, 0.83334],\n \"920\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n \"923\": [0, 0.68333, 0, 0.16667, 0.69445],\n \"926\": [0, 0.68333, 0.07569, 0.08334, 0.74236],\n \"928\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n \"931\": [0, 0.68333, 0.05764, 0.08334, 0.77986],\n \"933\": [0, 0.68333, 0.13889, 0.05556, 0.58333],\n \"934\": [0, 0.68333, 0, 0.08334, 0.66667],\n \"936\": [0, 0.68333, 0.11, 0.05556, 0.61222],\n \"937\": [0, 0.68333, 0.05017, 0.08334, 0.7724],\n \"945\": [0, 0.43056, 0.0037, 0.02778, 0.6397],\n \"946\": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],\n \"947\": [0.19444, 0.43056, 0.05556, 0, 0.51773],\n \"948\": [0, 0.69444, 0.03785, 0.05556, 0.44444],\n \"949\": [0, 0.43056, 0, 0.08334, 0.46632],\n \"950\": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],\n \"951\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],\n \"952\": [0, 0.69444, 0.02778, 0.08334, 0.46944],\n \"953\": [0, 0.43056, 0, 0.05556, 0.35394],\n \"954\": [0, 0.43056, 0, 0, 0.57616],\n \"955\": [0, 0.69444, 0, 0, 0.58334],\n \"956\": [0.19444, 0.43056, 0, 0.02778, 0.60255],\n \"957\": [0, 0.43056, 0.06366, 0.02778, 0.49398],\n \"958\": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],\n \"959\": [0, 0.43056, 0, 0.05556, 0.48472],\n \"960\": [0, 0.43056, 0.03588, 0, 0.57003],\n \"961\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n \"962\": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],\n \"963\": [0, 0.43056, 0.03588, 0, 0.57141],\n \"964\": [0, 0.43056, 0.1132, 0.02778, 0.43715],\n \"965\": [0, 0.43056, 0.03588, 0.02778, 0.54028],\n \"966\": [0.19444, 0.43056, 0, 0.08334, 0.65417],\n \"967\": [0.19444, 0.43056, 0, 0.05556, 0.62569],\n \"968\": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],\n \"969\": [0, 0.43056, 0.03588, 0, 0.62245],\n \"977\": [0, 0.69444, 0, 0.08334, 0.59144],\n \"981\": [0.19444, 0.69444, 0, 0.08334, 0.59583],\n \"982\": [0, 0.43056, 0.02778, 0, 0.82813],\n \"1009\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n \"1013\": [0, 0.43056, 0, 0.05556, 0.4059],\n \"57649\": [0, 0.43056, 0, 0.02778, 0.32246],\n \"57911\": [0.19444, 0.43056, 0, 0.08334, 0.38403]\n },\n \"SansSerif-Bold\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.36667],\n \"34\": [0, 0.69444, 0, 0, 0.55834],\n \"35\": [0.19444, 0.69444, 0, 0, 0.91667],\n \"36\": [0.05556, 0.75, 0, 0, 0.55],\n \"37\": [0.05556, 0.75, 0, 0, 1.02912],\n \"38\": [0, 0.69444, 0, 0, 0.83056],\n \"39\": [0, 0.69444, 0, 0, 0.30556],\n \"40\": [0.25, 0.75, 0, 0, 0.42778],\n \"41\": [0.25, 0.75, 0, 0, 0.42778],\n \"42\": [0, 0.75, 0, 0, 0.55],\n \"43\": [0.11667, 0.61667, 0, 0, 0.85556],\n \"44\": [0.10556, 0.13056, 0, 0, 0.30556],\n \"45\": [0, 0.45833, 0, 0, 0.36667],\n \"46\": [0, 0.13056, 0, 0, 0.30556],\n \"47\": [0.25, 0.75, 0, 0, 0.55],\n \"48\": [0, 0.69444, 0, 0, 0.55],\n \"49\": [0, 0.69444, 0, 0, 0.55],\n \"50\": [0, 0.69444, 0, 0, 0.55],\n \"51\": [0, 0.69444, 0, 0, 0.55],\n \"52\": [0, 0.69444, 0, 0, 0.55],\n \"53\": [0, 0.69444, 0, 0, 0.55],\n \"54\": [0, 0.69444, 0, 0, 0.55],\n \"55\": [0, 0.69444, 0, 0, 0.55],\n \"56\": [0, 0.69444, 0, 0, 0.55],\n \"57\": [0, 0.69444, 0, 0, 0.55],\n \"58\": [0, 0.45833, 0, 0, 0.30556],\n \"59\": [0.10556, 0.45833, 0, 0, 0.30556],\n \"61\": [-0.09375, 0.40625, 0, 0, 0.85556],\n \"63\": [0, 0.69444, 0, 0, 0.51945],\n \"64\": [0, 0.69444, 0, 0, 0.73334],\n \"65\": [0, 0.69444, 0, 0, 0.73334],\n \"66\": [0, 0.69444, 0, 0, 0.73334],\n \"67\": [0, 0.69444, 0, 0, 0.70278],\n \"68\": [0, 0.69444, 0, 0, 0.79445],\n \"69\": [0, 0.69444, 0, 0, 0.64167],\n \"70\": [0, 0.69444, 0, 0, 0.61111],\n \"71\": [0, 0.69444, 0, 0, 0.73334],\n \"72\": [0, 0.69444, 0, 0, 0.79445],\n \"73\": [0, 0.69444, 0, 0, 0.33056],\n \"74\": [0, 0.69444, 0, 0, 0.51945],\n \"75\": [0, 0.69444, 0, 0, 0.76389],\n \"76\": [0, 0.69444, 0, 0, 0.58056],\n \"77\": [0, 0.69444, 0, 0, 0.97778],\n \"78\": [0, 0.69444, 0, 0, 0.79445],\n \"79\": [0, 0.69444, 0, 0, 0.79445],\n \"80\": [0, 0.69444, 0, 0, 0.70278],\n \"81\": [0.10556, 0.69444, 0, 0, 0.79445],\n \"82\": [0, 0.69444, 0, 0, 0.70278],\n \"83\": [0, 0.69444, 0, 0, 0.61111],\n \"84\": [0, 0.69444, 0, 0, 0.73334],\n \"85\": [0, 0.69444, 0, 0, 0.76389],\n \"86\": [0, 0.69444, 0.01528, 0, 0.73334],\n \"87\": [0, 0.69444, 0.01528, 0, 1.03889],\n \"88\": [0, 0.69444, 0, 0, 0.73334],\n \"89\": [0, 0.69444, 0.0275, 0, 0.73334],\n \"90\": [0, 0.69444, 0, 0, 0.67223],\n \"91\": [0.25, 0.75, 0, 0, 0.34306],\n \"93\": [0.25, 0.75, 0, 0, 0.34306],\n \"94\": [0, 0.69444, 0, 0, 0.55],\n \"95\": [0.35, 0.10833, 0.03056, 0, 0.55],\n \"97\": [0, 0.45833, 0, 0, 0.525],\n \"98\": [0, 0.69444, 0, 0, 0.56111],\n \"99\": [0, 0.45833, 0, 0, 0.48889],\n \"100\": [0, 0.69444, 0, 0, 0.56111],\n \"101\": [0, 0.45833, 0, 0, 0.51111],\n \"102\": [0, 0.69444, 0.07639, 0, 0.33611],\n \"103\": [0.19444, 0.45833, 0.01528, 0, 0.55],\n \"104\": [0, 0.69444, 0, 0, 0.56111],\n \"105\": [0, 0.69444, 0, 0, 0.25556],\n \"106\": [0.19444, 0.69444, 0, 0, 0.28611],\n \"107\": [0, 0.69444, 0, 0, 0.53056],\n \"108\": [0, 0.69444, 0, 0, 0.25556],\n \"109\": [0, 0.45833, 0, 0, 0.86667],\n \"110\": [0, 0.45833, 0, 0, 0.56111],\n \"111\": [0, 0.45833, 0, 0, 0.55],\n \"112\": [0.19444, 0.45833, 0, 0, 0.56111],\n \"113\": [0.19444, 0.45833, 0, 0, 0.56111],\n \"114\": [0, 0.45833, 0.01528, 0, 0.37222],\n \"115\": [0, 0.45833, 0, 0, 0.42167],\n \"116\": [0, 0.58929, 0, 0, 0.40417],\n \"117\": [0, 0.45833, 0, 0, 0.56111],\n \"118\": [0, 0.45833, 0.01528, 0, 0.5],\n \"119\": [0, 0.45833, 0.01528, 0, 0.74445],\n \"120\": [0, 0.45833, 0, 0, 0.5],\n \"121\": [0.19444, 0.45833, 0.01528, 0, 0.5],\n \"122\": [0, 0.45833, 0, 0, 0.47639],\n \"126\": [0.35, 0.34444, 0, 0, 0.55],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.69444, 0, 0, 0.55],\n \"176\": [0, 0.69444, 0, 0, 0.73334],\n \"180\": [0, 0.69444, 0, 0, 0.55],\n \"184\": [0.17014, 0, 0, 0, 0.48889],\n \"305\": [0, 0.45833, 0, 0, 0.25556],\n \"567\": [0.19444, 0.45833, 0, 0, 0.28611],\n \"710\": [0, 0.69444, 0, 0, 0.55],\n \"711\": [0, 0.63542, 0, 0, 0.55],\n \"713\": [0, 0.63778, 0, 0, 0.55],\n \"728\": [0, 0.69444, 0, 0, 0.55],\n \"729\": [0, 0.69444, 0, 0, 0.30556],\n \"730\": [0, 0.69444, 0, 0, 0.73334],\n \"732\": [0, 0.69444, 0, 0, 0.55],\n \"733\": [0, 0.69444, 0, 0, 0.55],\n \"915\": [0, 0.69444, 0, 0, 0.58056],\n \"916\": [0, 0.69444, 0, 0, 0.91667],\n \"920\": [0, 0.69444, 0, 0, 0.85556],\n \"923\": [0, 0.69444, 0, 0, 0.67223],\n \"926\": [0, 0.69444, 0, 0, 0.73334],\n \"928\": [0, 0.69444, 0, 0, 0.79445],\n \"931\": [0, 0.69444, 0, 0, 0.79445],\n \"933\": [0, 0.69444, 0, 0, 0.85556],\n \"934\": [0, 0.69444, 0, 0, 0.79445],\n \"936\": [0, 0.69444, 0, 0, 0.85556],\n \"937\": [0, 0.69444, 0, 0, 0.79445],\n \"8211\": [0, 0.45833, 0.03056, 0, 0.55],\n \"8212\": [0, 0.45833, 0.03056, 0, 1.10001],\n \"8216\": [0, 0.69444, 0, 0, 0.30556],\n \"8217\": [0, 0.69444, 0, 0, 0.30556],\n \"8220\": [0, 0.69444, 0, 0, 0.55834],\n \"8221\": [0, 0.69444, 0, 0, 0.55834]\n },\n \"SansSerif-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.05733, 0, 0.31945],\n \"34\": [0, 0.69444, 0.00316, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0.05087, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0.11156, 0, 0.5],\n \"37\": [0.05556, 0.75, 0.03126, 0, 0.83334],\n \"38\": [0, 0.69444, 0.03058, 0, 0.75834],\n \"39\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"40\": [0.25, 0.75, 0.13164, 0, 0.38889],\n \"41\": [0.25, 0.75, 0.02536, 0, 0.38889],\n \"42\": [0, 0.75, 0.11775, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0.02536, 0, 0.77778],\n \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n \"45\": [0, 0.44444, 0.01946, 0, 0.33333],\n \"46\": [0, 0.08333, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0.13164, 0, 0.5],\n \"48\": [0, 0.65556, 0.11156, 0, 0.5],\n \"49\": [0, 0.65556, 0.11156, 0, 0.5],\n \"50\": [0, 0.65556, 0.11156, 0, 0.5],\n \"51\": [0, 0.65556, 0.11156, 0, 0.5],\n \"52\": [0, 0.65556, 0.11156, 0, 0.5],\n \"53\": [0, 0.65556, 0.11156, 0, 0.5],\n \"54\": [0, 0.65556, 0.11156, 0, 0.5],\n \"55\": [0, 0.65556, 0.11156, 0, 0.5],\n \"56\": [0, 0.65556, 0.11156, 0, 0.5],\n \"57\": [0, 0.65556, 0.11156, 0, 0.5],\n \"58\": [0, 0.44444, 0.02502, 0, 0.27778],\n \"59\": [0.125, 0.44444, 0.02502, 0, 0.27778],\n \"61\": [-0.13, 0.37, 0.05087, 0, 0.77778],\n \"63\": [0, 0.69444, 0.11809, 0, 0.47222],\n \"64\": [0, 0.69444, 0.07555, 0, 0.66667],\n \"65\": [0, 0.69444, 0, 0, 0.66667],\n \"66\": [0, 0.69444, 0.08293, 0, 0.66667],\n \"67\": [0, 0.69444, 0.11983, 0, 0.63889],\n \"68\": [0, 0.69444, 0.07555, 0, 0.72223],\n \"69\": [0, 0.69444, 0.11983, 0, 0.59722],\n \"70\": [0, 0.69444, 0.13372, 0, 0.56945],\n \"71\": [0, 0.69444, 0.11983, 0, 0.66667],\n \"72\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"73\": [0, 0.69444, 0.13372, 0, 0.27778],\n \"74\": [0, 0.69444, 0.08094, 0, 0.47222],\n \"75\": [0, 0.69444, 0.11983, 0, 0.69445],\n \"76\": [0, 0.69444, 0, 0, 0.54167],\n \"77\": [0, 0.69444, 0.08094, 0, 0.875],\n \"78\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"79\": [0, 0.69444, 0.07555, 0, 0.73611],\n \"80\": [0, 0.69444, 0.08293, 0, 0.63889],\n \"81\": [0.125, 0.69444, 0.07555, 0, 0.73611],\n \"82\": [0, 0.69444, 0.08293, 0, 0.64584],\n \"83\": [0, 0.69444, 0.09205, 0, 0.55556],\n \"84\": [0, 0.69444, 0.13372, 0, 0.68056],\n \"85\": [0, 0.69444, 0.08094, 0, 0.6875],\n \"86\": [0, 0.69444, 0.1615, 0, 0.66667],\n \"87\": [0, 0.69444, 0.1615, 0, 0.94445],\n \"88\": [0, 0.69444, 0.13372, 0, 0.66667],\n \"89\": [0, 0.69444, 0.17261, 0, 0.66667],\n \"90\": [0, 0.69444, 0.11983, 0, 0.61111],\n \"91\": [0.25, 0.75, 0.15942, 0, 0.28889],\n \"93\": [0.25, 0.75, 0.08719, 0, 0.28889],\n \"94\": [0, 0.69444, 0.0799, 0, 0.5],\n \"95\": [0.35, 0.09444, 0.08616, 0, 0.5],\n \"97\": [0, 0.44444, 0.00981, 0, 0.48056],\n \"98\": [0, 0.69444, 0.03057, 0, 0.51667],\n \"99\": [0, 0.44444, 0.08336, 0, 0.44445],\n \"100\": [0, 0.69444, 0.09483, 0, 0.51667],\n \"101\": [0, 0.44444, 0.06778, 0, 0.44445],\n \"102\": [0, 0.69444, 0.21705, 0, 0.30556],\n \"103\": [0.19444, 0.44444, 0.10836, 0, 0.5],\n \"104\": [0, 0.69444, 0.01778, 0, 0.51667],\n \"105\": [0, 0.67937, 0.09718, 0, 0.23889],\n \"106\": [0.19444, 0.67937, 0.09162, 0, 0.26667],\n \"107\": [0, 0.69444, 0.08336, 0, 0.48889],\n \"108\": [0, 0.69444, 0.09483, 0, 0.23889],\n \"109\": [0, 0.44444, 0.01778, 0, 0.79445],\n \"110\": [0, 0.44444, 0.01778, 0, 0.51667],\n \"111\": [0, 0.44444, 0.06613, 0, 0.5],\n \"112\": [0.19444, 0.44444, 0.0389, 0, 0.51667],\n \"113\": [0.19444, 0.44444, 0.04169, 0, 0.51667],\n \"114\": [0, 0.44444, 0.10836, 0, 0.34167],\n \"115\": [0, 0.44444, 0.0778, 0, 0.38333],\n \"116\": [0, 0.57143, 0.07225, 0, 0.36111],\n \"117\": [0, 0.44444, 0.04169, 0, 0.51667],\n \"118\": [0, 0.44444, 0.10836, 0, 0.46111],\n \"119\": [0, 0.44444, 0.10836, 0, 0.68334],\n \"120\": [0, 0.44444, 0.09169, 0, 0.46111],\n \"121\": [0.19444, 0.44444, 0.10836, 0, 0.46111],\n \"122\": [0, 0.44444, 0.08752, 0, 0.43472],\n \"126\": [0.35, 0.32659, 0.08826, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.67937, 0.06385, 0, 0.5],\n \"176\": [0, 0.69444, 0, 0, 0.73752],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"305\": [0, 0.44444, 0.04169, 0, 0.23889],\n \"567\": [0.19444, 0.44444, 0.04169, 0, 0.26667],\n \"710\": [0, 0.69444, 0.0799, 0, 0.5],\n \"711\": [0, 0.63194, 0.08432, 0, 0.5],\n \"713\": [0, 0.60889, 0.08776, 0, 0.5],\n \"714\": [0, 0.69444, 0.09205, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0.09483, 0, 0.5],\n \"729\": [0, 0.67937, 0.07774, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.73752],\n \"732\": [0, 0.67659, 0.08826, 0, 0.5],\n \"733\": [0, 0.69444, 0.09205, 0, 0.5],\n \"915\": [0, 0.69444, 0.13372, 0, 0.54167],\n \"916\": [0, 0.69444, 0, 0, 0.83334],\n \"920\": [0, 0.69444, 0.07555, 0, 0.77778],\n \"923\": [0, 0.69444, 0, 0, 0.61111],\n \"926\": [0, 0.69444, 0.12816, 0, 0.66667],\n \"928\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"931\": [0, 0.69444, 0.11983, 0, 0.72222],\n \"933\": [0, 0.69444, 0.09031, 0, 0.77778],\n \"934\": [0, 0.69444, 0.04603, 0, 0.72222],\n \"936\": [0, 0.69444, 0.09031, 0, 0.77778],\n \"937\": [0, 0.69444, 0.08293, 0, 0.72222],\n \"8211\": [0, 0.44444, 0.08616, 0, 0.5],\n \"8212\": [0, 0.44444, 0.08616, 0, 1.0],\n \"8216\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"8217\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"8220\": [0, 0.69444, 0.14205, 0, 0.5],\n \"8221\": [0, 0.69444, 0.00316, 0, 0.5]\n },\n \"SansSerif-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.31945],\n \"34\": [0, 0.69444, 0, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0, 0, 0.5],\n \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n \"38\": [0, 0.69444, 0, 0, 0.75834],\n \"39\": [0, 0.69444, 0, 0, 0.27778],\n \"40\": [0.25, 0.75, 0, 0, 0.38889],\n \"41\": [0.25, 0.75, 0, 0, 0.38889],\n \"42\": [0, 0.75, 0, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n \"45\": [0, 0.44444, 0, 0, 0.33333],\n \"46\": [0, 0.08333, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0, 0, 0.5],\n \"48\": [0, 0.65556, 0, 0, 0.5],\n \"49\": [0, 0.65556, 0, 0, 0.5],\n \"50\": [0, 0.65556, 0, 0, 0.5],\n \"51\": [0, 0.65556, 0, 0, 0.5],\n \"52\": [0, 0.65556, 0, 0, 0.5],\n \"53\": [0, 0.65556, 0, 0, 0.5],\n \"54\": [0, 0.65556, 0, 0, 0.5],\n \"55\": [0, 0.65556, 0, 0, 0.5],\n \"56\": [0, 0.65556, 0, 0, 0.5],\n \"57\": [0, 0.65556, 0, 0, 0.5],\n \"58\": [0, 0.44444, 0, 0, 0.27778],\n \"59\": [0.125, 0.44444, 0, 0, 0.27778],\n \"61\": [-0.13, 0.37, 0, 0, 0.77778],\n \"63\": [0, 0.69444, 0, 0, 0.47222],\n \"64\": [0, 0.69444, 0, 0, 0.66667],\n \"65\": [0, 0.69444, 0, 0, 0.66667],\n \"66\": [0, 0.69444, 0, 0, 0.66667],\n \"67\": [0, 0.69444, 0, 0, 0.63889],\n \"68\": [0, 0.69444, 0, 0, 0.72223],\n \"69\": [0, 0.69444, 0, 0, 0.59722],\n \"70\": [0, 0.69444, 0, 0, 0.56945],\n \"71\": [0, 0.69444, 0, 0, 0.66667],\n \"72\": [0, 0.69444, 0, 0, 0.70834],\n \"73\": [0, 0.69444, 0, 0, 0.27778],\n \"74\": [0, 0.69444, 0, 0, 0.47222],\n \"75\": [0, 0.69444, 0, 0, 0.69445],\n \"76\": [0, 0.69444, 0, 0, 0.54167],\n \"77\": [0, 0.69444, 0, 0, 0.875],\n \"78\": [0, 0.69444, 0, 0, 0.70834],\n \"79\": [0, 0.69444, 0, 0, 0.73611],\n \"80\": [0, 0.69444, 0, 0, 0.63889],\n \"81\": [0.125, 0.69444, 0, 0, 0.73611],\n \"82\": [0, 0.69444, 0, 0, 0.64584],\n \"83\": [0, 0.69444, 0, 0, 0.55556],\n \"84\": [0, 0.69444, 0, 0, 0.68056],\n \"85\": [0, 0.69444, 0, 0, 0.6875],\n \"86\": [0, 0.69444, 0.01389, 0, 0.66667],\n \"87\": [0, 0.69444, 0.01389, 0, 0.94445],\n \"88\": [0, 0.69444, 0, 0, 0.66667],\n \"89\": [0, 0.69444, 0.025, 0, 0.66667],\n \"90\": [0, 0.69444, 0, 0, 0.61111],\n \"91\": [0.25, 0.75, 0, 0, 0.28889],\n \"93\": [0.25, 0.75, 0, 0, 0.28889],\n \"94\": [0, 0.69444, 0, 0, 0.5],\n \"95\": [0.35, 0.09444, 0.02778, 0, 0.5],\n \"97\": [0, 0.44444, 0, 0, 0.48056],\n \"98\": [0, 0.69444, 0, 0, 0.51667],\n \"99\": [0, 0.44444, 0, 0, 0.44445],\n \"100\": [0, 0.69444, 0, 0, 0.51667],\n \"101\": [0, 0.44444, 0, 0, 0.44445],\n \"102\": [0, 0.69444, 0.06944, 0, 0.30556],\n \"103\": [0.19444, 0.44444, 0.01389, 0, 0.5],\n \"104\": [0, 0.69444, 0, 0, 0.51667],\n \"105\": [0, 0.67937, 0, 0, 0.23889],\n \"106\": [0.19444, 0.67937, 0, 0, 0.26667],\n \"107\": [0, 0.69444, 0, 0, 0.48889],\n \"108\": [0, 0.69444, 0, 0, 0.23889],\n \"109\": [0, 0.44444, 0, 0, 0.79445],\n \"110\": [0, 0.44444, 0, 0, 0.51667],\n \"111\": [0, 0.44444, 0, 0, 0.5],\n \"112\": [0.19444, 0.44444, 0, 0, 0.51667],\n \"113\": [0.19444, 0.44444, 0, 0, 0.51667],\n \"114\": [0, 0.44444, 0.01389, 0, 0.34167],\n \"115\": [0, 0.44444, 0, 0, 0.38333],\n \"116\": [0, 0.57143, 0, 0, 0.36111],\n \"117\": [0, 0.44444, 0, 0, 0.51667],\n \"118\": [0, 0.44444, 0.01389, 0, 0.46111],\n \"119\": [0, 0.44444, 0.01389, 0, 0.68334],\n \"120\": [0, 0.44444, 0, 0, 0.46111],\n \"121\": [0.19444, 0.44444, 0.01389, 0, 0.46111],\n \"122\": [0, 0.44444, 0, 0, 0.43472],\n \"126\": [0.35, 0.32659, 0, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.67937, 0, 0, 0.5],\n \"176\": [0, 0.69444, 0, 0, 0.66667],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"305\": [0, 0.44444, 0, 0, 0.23889],\n \"567\": [0.19444, 0.44444, 0, 0, 0.26667],\n \"710\": [0, 0.69444, 0, 0, 0.5],\n \"711\": [0, 0.63194, 0, 0, 0.5],\n \"713\": [0, 0.60889, 0, 0, 0.5],\n \"714\": [0, 0.69444, 0, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0, 0, 0.5],\n \"729\": [0, 0.67937, 0, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.66667],\n \"732\": [0, 0.67659, 0, 0, 0.5],\n \"733\": [0, 0.69444, 0, 0, 0.5],\n \"915\": [0, 0.69444, 0, 0, 0.54167],\n \"916\": [0, 0.69444, 0, 0, 0.83334],\n \"920\": [0, 0.69444, 0, 0, 0.77778],\n \"923\": [0, 0.69444, 0, 0, 0.61111],\n \"926\": [0, 0.69444, 0, 0, 0.66667],\n \"928\": [0, 0.69444, 0, 0, 0.70834],\n \"931\": [0, 0.69444, 0, 0, 0.72222],\n \"933\": [0, 0.69444, 0, 0, 0.77778],\n \"934\": [0, 0.69444, 0, 0, 0.72222],\n \"936\": [0, 0.69444, 0, 0, 0.77778],\n \"937\": [0, 0.69444, 0, 0, 0.72222],\n \"8211\": [0, 0.44444, 0.02778, 0, 0.5],\n \"8212\": [0, 0.44444, 0.02778, 0, 1.0],\n \"8216\": [0, 0.69444, 0, 0, 0.27778],\n \"8217\": [0, 0.69444, 0, 0, 0.27778],\n \"8220\": [0, 0.69444, 0, 0, 0.5],\n \"8221\": [0, 0.69444, 0, 0, 0.5]\n },\n \"Script-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.7, 0.22925, 0, 0.80253],\n \"66\": [0, 0.7, 0.04087, 0, 0.90757],\n \"67\": [0, 0.7, 0.1689, 0, 0.66619],\n \"68\": [0, 0.7, 0.09371, 0, 0.77443],\n \"69\": [0, 0.7, 0.18583, 0, 0.56162],\n \"70\": [0, 0.7, 0.13634, 0, 0.89544],\n \"71\": [0, 0.7, 0.17322, 0, 0.60961],\n \"72\": [0, 0.7, 0.29694, 0, 0.96919],\n \"73\": [0, 0.7, 0.19189, 0, 0.80907],\n \"74\": [0.27778, 0.7, 0.19189, 0, 1.05159],\n \"75\": [0, 0.7, 0.31259, 0, 0.91364],\n \"76\": [0, 0.7, 0.19189, 0, 0.87373],\n \"77\": [0, 0.7, 0.15981, 0, 1.08031],\n \"78\": [0, 0.7, 0.3525, 0, 0.9015],\n \"79\": [0, 0.7, 0.08078, 0, 0.73787],\n \"80\": [0, 0.7, 0.08078, 0, 1.01262],\n \"81\": [0, 0.7, 0.03305, 0, 0.88282],\n \"82\": [0, 0.7, 0.06259, 0, 0.85],\n \"83\": [0, 0.7, 0.19189, 0, 0.86767],\n \"84\": [0, 0.7, 0.29087, 0, 0.74697],\n \"85\": [0, 0.7, 0.25815, 0, 0.79996],\n \"86\": [0, 0.7, 0.27523, 0, 0.62204],\n \"87\": [0, 0.7, 0.27523, 0, 0.80532],\n \"88\": [0, 0.7, 0.26006, 0, 0.94445],\n \"89\": [0, 0.7, 0.2939, 0, 0.70961],\n \"90\": [0, 0.7, 0.24037, 0, 0.8212],\n \"160\": [0, 0, 0, 0, 0.25]\n },\n \"Size1-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.35001, 0.85, 0, 0, 0.45834],\n \"41\": [0.35001, 0.85, 0, 0, 0.45834],\n \"47\": [0.35001, 0.85, 0, 0, 0.57778],\n \"91\": [0.35001, 0.85, 0, 0, 0.41667],\n \"92\": [0.35001, 0.85, 0, 0, 0.57778],\n \"93\": [0.35001, 0.85, 0, 0, 0.41667],\n \"123\": [0.35001, 0.85, 0, 0, 0.58334],\n \"125\": [0.35001, 0.85, 0, 0, 0.58334],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.72222, 0, 0, 0.55556],\n \"732\": [0, 0.72222, 0, 0, 0.55556],\n \"770\": [0, 0.72222, 0, 0, 0.55556],\n \"771\": [0, 0.72222, 0, 0, 0.55556],\n \"8214\": [-0.00099, 0.601, 0, 0, 0.77778],\n \"8593\": [1e-05, 0.6, 0, 0, 0.66667],\n \"8595\": [1e-05, 0.6, 0, 0, 0.66667],\n \"8657\": [1e-05, 0.6, 0, 0, 0.77778],\n \"8659\": [1e-05, 0.6, 0, 0, 0.77778],\n \"8719\": [0.25001, 0.75, 0, 0, 0.94445],\n \"8720\": [0.25001, 0.75, 0, 0, 0.94445],\n \"8721\": [0.25001, 0.75, 0, 0, 1.05556],\n \"8730\": [0.35001, 0.85, 0, 0, 1.0],\n \"8739\": [-0.00599, 0.606, 0, 0, 0.33333],\n \"8741\": [-0.00599, 0.606, 0, 0, 0.55556],\n \"8747\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n \"8748\": [0.306, 0.805, 0.19445, 0, 0.47222],\n \"8749\": [0.306, 0.805, 0.19445, 0, 0.47222],\n \"8750\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n \"8896\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8897\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8898\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8899\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8968\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8969\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8970\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8971\": [0.35001, 0.85, 0, 0, 0.47222],\n \"9168\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"10216\": [0.35001, 0.85, 0, 0, 0.47222],\n \"10217\": [0.35001, 0.85, 0, 0, 0.47222],\n \"10752\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10753\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10754\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10756\": [0.25001, 0.75, 0, 0, 0.83334],\n \"10758\": [0.25001, 0.75, 0, 0, 0.83334]\n },\n \"Size2-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.65002, 1.15, 0, 0, 0.59722],\n \"41\": [0.65002, 1.15, 0, 0, 0.59722],\n \"47\": [0.65002, 1.15, 0, 0, 0.81111],\n \"91\": [0.65002, 1.15, 0, 0, 0.47222],\n \"92\": [0.65002, 1.15, 0, 0, 0.81111],\n \"93\": [0.65002, 1.15, 0, 0, 0.47222],\n \"123\": [0.65002, 1.15, 0, 0, 0.66667],\n \"125\": [0.65002, 1.15, 0, 0, 0.66667],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.75, 0, 0, 1.0],\n \"732\": [0, 0.75, 0, 0, 1.0],\n \"770\": [0, 0.75, 0, 0, 1.0],\n \"771\": [0, 0.75, 0, 0, 1.0],\n \"8719\": [0.55001, 1.05, 0, 0, 1.27778],\n \"8720\": [0.55001, 1.05, 0, 0, 1.27778],\n \"8721\": [0.55001, 1.05, 0, 0, 1.44445],\n \"8730\": [0.65002, 1.15, 0, 0, 1.0],\n \"8747\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n \"8748\": [0.862, 1.36, 0.44445, 0, 0.55556],\n \"8749\": [0.862, 1.36, 0.44445, 0, 0.55556],\n \"8750\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n \"8896\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8897\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8898\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8899\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8968\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8969\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8970\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8971\": [0.65002, 1.15, 0, 0, 0.52778],\n \"10216\": [0.65002, 1.15, 0, 0, 0.61111],\n \"10217\": [0.65002, 1.15, 0, 0, 0.61111],\n \"10752\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10753\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10754\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10756\": [0.55001, 1.05, 0, 0, 1.11111],\n \"10758\": [0.55001, 1.05, 0, 0, 1.11111]\n },\n \"Size3-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.95003, 1.45, 0, 0, 0.73611],\n \"41\": [0.95003, 1.45, 0, 0, 0.73611],\n \"47\": [0.95003, 1.45, 0, 0, 1.04445],\n \"91\": [0.95003, 1.45, 0, 0, 0.52778],\n \"92\": [0.95003, 1.45, 0, 0, 1.04445],\n \"93\": [0.95003, 1.45, 0, 0, 0.52778],\n \"123\": [0.95003, 1.45, 0, 0, 0.75],\n \"125\": [0.95003, 1.45, 0, 0, 0.75],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.75, 0, 0, 1.44445],\n \"732\": [0, 0.75, 0, 0, 1.44445],\n \"770\": [0, 0.75, 0, 0, 1.44445],\n \"771\": [0, 0.75, 0, 0, 1.44445],\n \"8730\": [0.95003, 1.45, 0, 0, 1.0],\n \"8968\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8969\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8970\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8971\": [0.95003, 1.45, 0, 0, 0.58334],\n \"10216\": [0.95003, 1.45, 0, 0, 0.75],\n \"10217\": [0.95003, 1.45, 0, 0, 0.75]\n },\n \"Size4-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [1.25003, 1.75, 0, 0, 0.79167],\n \"41\": [1.25003, 1.75, 0, 0, 0.79167],\n \"47\": [1.25003, 1.75, 0, 0, 1.27778],\n \"91\": [1.25003, 1.75, 0, 0, 0.58334],\n \"92\": [1.25003, 1.75, 0, 0, 1.27778],\n \"93\": [1.25003, 1.75, 0, 0, 0.58334],\n \"123\": [1.25003, 1.75, 0, 0, 0.80556],\n \"125\": [1.25003, 1.75, 0, 0, 0.80556],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.825, 0, 0, 1.8889],\n \"732\": [0, 0.825, 0, 0, 1.8889],\n \"770\": [0, 0.825, 0, 0, 1.8889],\n \"771\": [0, 0.825, 0, 0, 1.8889],\n \"8730\": [1.25003, 1.75, 0, 0, 1.0],\n \"8968\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8969\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8970\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8971\": [1.25003, 1.75, 0, 0, 0.63889],\n \"9115\": [0.64502, 1.155, 0, 0, 0.875],\n \"9116\": [1e-05, 0.6, 0, 0, 0.875],\n \"9117\": [0.64502, 1.155, 0, 0, 0.875],\n \"9118\": [0.64502, 1.155, 0, 0, 0.875],\n \"9119\": [1e-05, 0.6, 0, 0, 0.875],\n \"9120\": [0.64502, 1.155, 0, 0, 0.875],\n \"9121\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9122\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"9123\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9124\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9125\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"9126\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9127\": [1e-05, 0.9, 0, 0, 0.88889],\n \"9128\": [0.65002, 1.15, 0, 0, 0.88889],\n \"9129\": [0.90001, 0, 0, 0, 0.88889],\n \"9130\": [0, 0.3, 0, 0, 0.88889],\n \"9131\": [1e-05, 0.9, 0, 0, 0.88889],\n \"9132\": [0.65002, 1.15, 0, 0, 0.88889],\n \"9133\": [0.90001, 0, 0, 0, 0.88889],\n \"9143\": [0.88502, 0.915, 0, 0, 1.05556],\n \"10216\": [1.25003, 1.75, 0, 0, 0.80556],\n \"10217\": [1.25003, 1.75, 0, 0, 0.80556],\n \"57344\": [-0.00499, 0.605, 0, 0, 1.05556],\n \"57345\": [-0.00499, 0.605, 0, 0, 1.05556],\n \"57680\": [0, 0.12, 0, 0, 0.45],\n \"57681\": [0, 0.12, 0, 0, 0.45],\n \"57682\": [0, 0.12, 0, 0, 0.45],\n \"57683\": [0, 0.12, 0, 0, 0.45]\n },\n \"Typewriter-Regular\": {\n \"32\": [0, 0, 0, 0, 0.525],\n \"33\": [0, 0.61111, 0, 0, 0.525],\n \"34\": [0, 0.61111, 0, 0, 0.525],\n \"35\": [0, 0.61111, 0, 0, 0.525],\n \"36\": [0.08333, 0.69444, 0, 0, 0.525],\n \"37\": [0.08333, 0.69444, 0, 0, 0.525],\n \"38\": [0, 0.61111, 0, 0, 0.525],\n \"39\": [0, 0.61111, 0, 0, 0.525],\n \"40\": [0.08333, 0.69444, 0, 0, 0.525],\n \"41\": [0.08333, 0.69444, 0, 0, 0.525],\n \"42\": [0, 0.52083, 0, 0, 0.525],\n \"43\": [-0.08056, 0.53055, 0, 0, 0.525],\n \"44\": [0.13889, 0.125, 0, 0, 0.525],\n \"45\": [-0.08056, 0.53055, 0, 0, 0.525],\n \"46\": [0, 0.125, 0, 0, 0.525],\n \"47\": [0.08333, 0.69444, 0, 0, 0.525],\n \"48\": [0, 0.61111, 0, 0, 0.525],\n \"49\": [0, 0.61111, 0, 0, 0.525],\n \"50\": [0, 0.61111, 0, 0, 0.525],\n \"51\": [0, 0.61111, 0, 0, 0.525],\n \"52\": [0, 0.61111, 0, 0, 0.525],\n \"53\": [0, 0.61111, 0, 0, 0.525],\n \"54\": [0, 0.61111, 0, 0, 0.525],\n \"55\": [0, 0.61111, 0, 0, 0.525],\n \"56\": [0, 0.61111, 0, 0, 0.525],\n \"57\": [0, 0.61111, 0, 0, 0.525],\n \"58\": [0, 0.43056, 0, 0, 0.525],\n \"59\": [0.13889, 0.43056, 0, 0, 0.525],\n \"60\": [-0.05556, 0.55556, 0, 0, 0.525],\n \"61\": [-0.19549, 0.41562, 0, 0, 0.525],\n \"62\": [-0.05556, 0.55556, 0, 0, 0.525],\n \"63\": [0, 0.61111, 0, 0, 0.525],\n \"64\": [0, 0.61111, 0, 0, 0.525],\n \"65\": [0, 0.61111, 0, 0, 0.525],\n \"66\": [0, 0.61111, 0, 0, 0.525],\n \"67\": [0, 0.61111, 0, 0, 0.525],\n \"68\": [0, 0.61111, 0, 0, 0.525],\n \"69\": [0, 0.61111, 0, 0, 0.525],\n \"70\": [0, 0.61111, 0, 0, 0.525],\n \"71\": [0, 0.61111, 0, 0, 0.525],\n \"72\": [0, 0.61111, 0, 0, 0.525],\n \"73\": [0, 0.61111, 0, 0, 0.525],\n \"74\": [0, 0.61111, 0, 0, 0.525],\n \"75\": [0, 0.61111, 0, 0, 0.525],\n \"76\": [0, 0.61111, 0, 0, 0.525],\n \"77\": [0, 0.61111, 0, 0, 0.525],\n \"78\": [0, 0.61111, 0, 0, 0.525],\n \"79\": [0, 0.61111, 0, 0, 0.525],\n \"80\": [0, 0.61111, 0, 0, 0.525],\n \"81\": [0.13889, 0.61111, 0, 0, 0.525],\n \"82\": [0, 0.61111, 0, 0, 0.525],\n \"83\": [0, 0.61111, 0, 0, 0.525],\n \"84\": [0, 0.61111, 0, 0, 0.525],\n \"85\": [0, 0.61111, 0, 0, 0.525],\n \"86\": [0, 0.61111, 0, 0, 0.525],\n \"87\": [0, 0.61111, 0, 0, 0.525],\n \"88\": [0, 0.61111, 0, 0, 0.525],\n \"89\": [0, 0.61111, 0, 0, 0.525],\n \"90\": [0, 0.61111, 0, 0, 0.525],\n \"91\": [0.08333, 0.69444, 0, 0, 0.525],\n \"92\": [0.08333, 0.69444, 0, 0, 0.525],\n \"93\": [0.08333, 0.69444, 0, 0, 0.525],\n \"94\": [0, 0.61111, 0, 0, 0.525],\n \"95\": [0.09514, 0, 0, 0, 0.525],\n \"96\": [0, 0.61111, 0, 0, 0.525],\n \"97\": [0, 0.43056, 0, 0, 0.525],\n \"98\": [0, 0.61111, 0, 0, 0.525],\n \"99\": [0, 0.43056, 0, 0, 0.525],\n \"100\": [0, 0.61111, 0, 0, 0.525],\n \"101\": [0, 0.43056, 0, 0, 0.525],\n \"102\": [0, 0.61111, 0, 0, 0.525],\n \"103\": [0.22222, 0.43056, 0, 0, 0.525],\n \"104\": [0, 0.61111, 0, 0, 0.525],\n \"105\": [0, 0.61111, 0, 0, 0.525],\n \"106\": [0.22222, 0.61111, 0, 0, 0.525],\n \"107\": [0, 0.61111, 0, 0, 0.525],\n \"108\": [0, 0.61111, 0, 0, 0.525],\n \"109\": [0, 0.43056, 0, 0, 0.525],\n \"110\": [0, 0.43056, 0, 0, 0.525],\n \"111\": [0, 0.43056, 0, 0, 0.525],\n \"112\": [0.22222, 0.43056, 0, 0, 0.525],\n \"113\": [0.22222, 0.43056, 0, 0, 0.525],\n \"114\": [0, 0.43056, 0, 0, 0.525],\n \"115\": [0, 0.43056, 0, 0, 0.525],\n \"116\": [0, 0.55358, 0, 0, 0.525],\n \"117\": [0, 0.43056, 0, 0, 0.525],\n \"118\": [0, 0.43056, 0, 0, 0.525],\n \"119\": [0, 0.43056, 0, 0, 0.525],\n \"120\": [0, 0.43056, 0, 0, 0.525],\n \"121\": [0.22222, 0.43056, 0, 0, 0.525],\n \"122\": [0, 0.43056, 0, 0, 0.525],\n \"123\": [0.08333, 0.69444, 0, 0, 0.525],\n \"124\": [0.08333, 0.69444, 0, 0, 0.525],\n \"125\": [0.08333, 0.69444, 0, 0, 0.525],\n \"126\": [0, 0.61111, 0, 0, 0.525],\n \"127\": [0, 0.61111, 0, 0, 0.525],\n \"160\": [0, 0, 0, 0, 0.525],\n \"176\": [0, 0.61111, 0, 0, 0.525],\n \"184\": [0.19445, 0, 0, 0, 0.525],\n \"305\": [0, 0.43056, 0, 0, 0.525],\n \"567\": [0.22222, 0.43056, 0, 0, 0.525],\n \"711\": [0, 0.56597, 0, 0, 0.525],\n \"713\": [0, 0.56555, 0, 0, 0.525],\n \"714\": [0, 0.61111, 0, 0, 0.525],\n \"715\": [0, 0.61111, 0, 0, 0.525],\n \"728\": [0, 0.61111, 0, 0, 0.525],\n \"730\": [0, 0.61111, 0, 0, 0.525],\n \"770\": [0, 0.61111, 0, 0, 0.525],\n \"771\": [0, 0.61111, 0, 0, 0.525],\n \"776\": [0, 0.61111, 0, 0, 0.525],\n \"915\": [0, 0.61111, 0, 0, 0.525],\n \"916\": [0, 0.61111, 0, 0, 0.525],\n \"920\": [0, 0.61111, 0, 0, 0.525],\n \"923\": [0, 0.61111, 0, 0, 0.525],\n \"926\": [0, 0.61111, 0, 0, 0.525],\n \"928\": [0, 0.61111, 0, 0, 0.525],\n \"931\": [0, 0.61111, 0, 0, 0.525],\n \"933\": [0, 0.61111, 0, 0, 0.525],\n \"934\": [0, 0.61111, 0, 0, 0.525],\n \"936\": [0, 0.61111, 0, 0, 0.525],\n \"937\": [0, 0.61111, 0, 0, 0.525],\n \"8216\": [0, 0.61111, 0, 0, 0.525],\n \"8217\": [0, 0.61111, 0, 0, 0.525],\n \"8242\": [0, 0.61111, 0, 0, 0.525],\n \"9251\": [0.11111, 0.21944, 0, 0, 0.525]\n }\n});\n;// CONCATENATED MODULE: ./src/fontMetrics.js\n\n\n/**\n * This file contains metrics regarding fonts and individual symbols. The sigma\n * and xi variables, as well as the metricMap map contain data extracted from\n * TeX, TeX font metrics, and the TTF files. These data are then exposed via the\n * `metrics` variable and the getCharacterMetrics function.\n */\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:\n// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are\n// provided in the the arrays below, in that order.\n//\n// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively.\n// This was determined by running the following script:\n//\n// latex -interaction=nonstopmode \\\n// '\\documentclass{article}\\usepackage{amsmath}\\begin{document}' \\\n// '$a$ \\expandafter\\show\\the\\textfont2' \\\n// '\\expandafter\\show\\the\\scriptfont2' \\\n// '\\expandafter\\show\\the\\scriptscriptfont2' \\\n// '\\stop'\n//\n// The metrics themselves were retreived using the following commands:\n//\n// tftopl cmsy10\n// tftopl cmsy7\n// tftopl cmsy5\n//\n// The output of each of these commands is quite lengthy. The only part we\n// care about is the FONTDIMEN section. Each value is measured in EMs.\nvar sigmasAndXis = {\n slant: [0.250, 0.250, 0.250],\n // sigma1\n space: [0.000, 0.000, 0.000],\n // sigma2\n stretch: [0.000, 0.000, 0.000],\n // sigma3\n shrink: [0.000, 0.000, 0.000],\n // sigma4\n xHeight: [0.431, 0.431, 0.431],\n // sigma5\n quad: [1.000, 1.171, 1.472],\n // sigma6\n extraSpace: [0.000, 0.000, 0.000],\n // sigma7\n num1: [0.677, 0.732, 0.925],\n // sigma8\n num2: [0.394, 0.384, 0.387],\n // sigma9\n num3: [0.444, 0.471, 0.504],\n // sigma10\n denom1: [0.686, 0.752, 1.025],\n // sigma11\n denom2: [0.345, 0.344, 0.532],\n // sigma12\n sup1: [0.413, 0.503, 0.504],\n // sigma13\n sup2: [0.363, 0.431, 0.404],\n // sigma14\n sup3: [0.289, 0.286, 0.294],\n // sigma15\n sub1: [0.150, 0.143, 0.200],\n // sigma16\n sub2: [0.247, 0.286, 0.400],\n // sigma17\n supDrop: [0.386, 0.353, 0.494],\n // sigma18\n subDrop: [0.050, 0.071, 0.100],\n // sigma19\n delim1: [2.390, 1.700, 1.980],\n // sigma20\n delim2: [1.010, 1.157, 1.420],\n // sigma21\n axisHeight: [0.250, 0.250, 0.250],\n // sigma22\n // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;\n // they correspond to the font parameters of the extension fonts (family 3).\n // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to\n // match cmex7, we'd use cmex7.tfm values for script and scriptscript\n // values.\n defaultRuleThickness: [0.04, 0.049, 0.049],\n // xi8; cmex7: 0.049\n bigOpSpacing1: [0.111, 0.111, 0.111],\n // xi9\n bigOpSpacing2: [0.166, 0.166, 0.166],\n // xi10\n bigOpSpacing3: [0.2, 0.2, 0.2],\n // xi11\n bigOpSpacing4: [0.6, 0.611, 0.611],\n // xi12; cmex7: 0.611\n bigOpSpacing5: [0.1, 0.143, 0.143],\n // xi13; cmex7: 0.143\n // The \\sqrt rule width is taken from the height of the surd character.\n // Since we use the same font at all sizes, this thickness doesn't scale.\n sqrtRuleThickness: [0.04, 0.04, 0.04],\n // This value determines how large a pt is, for metrics which are defined\n // in terms of pts.\n // This value is also used in katex.less; if you change it make sure the\n // values match.\n ptPerEm: [10.0, 10.0, 10.0],\n // The space between adjacent `|` columns in an array definition. From\n // `\\showthe\\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.\n doubleRuleSep: [0.2, 0.2, 0.2],\n // The width of separator lines in {array} environments. From\n // `\\showthe\\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.\n arrayRuleWidth: [0.04, 0.04, 0.04],\n // Two values from LaTeX source2e:\n fboxsep: [0.3, 0.3, 0.3],\n // 3 pt / ptPerEm\n fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm\n\n}; // This map contains a mapping from font name and character code to character\n// metrics, including height, depth, italic correction, and skew (kern from the\n// character to the corresponding \\skewchar)\n// This map is generated via `make metrics`. It should not be changed manually.\n\n // These are very rough approximations. We default to Times New Roman which\n// should have Latin-1 and Cyrillic characters, but may not depending on the\n// operating system. The metrics do not account for extra height from the\n// accents. In the case of Cyrillic characters which have both ascenders and\n// descenders we prefer approximations with ascenders, primarily to prevent\n// the fraction bar or root line from intersecting the glyph.\n// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.\n\nvar extraCharacterMap = {\n // Latin-1\n 'Å': 'A',\n 'Ð': 'D',\n 'Þ': 'o',\n 'å': 'a',\n 'ð': 'd',\n 'þ': 'o',\n // Cyrillic\n 'А': 'A',\n 'Б': 'B',\n 'В': 'B',\n 'Г': 'F',\n 'Д': 'A',\n 'Е': 'E',\n 'Ж': 'K',\n 'З': '3',\n 'И': 'N',\n 'Й': 'N',\n 'К': 'K',\n 'Л': 'N',\n 'М': 'M',\n 'Н': 'H',\n 'О': 'O',\n 'П': 'N',\n 'Р': 'P',\n 'С': 'C',\n 'Т': 'T',\n 'У': 'y',\n 'Ф': 'O',\n 'Х': 'X',\n 'Ц': 'U',\n 'Ч': 'h',\n 'Ш': 'W',\n 'Щ': 'W',\n 'Ъ': 'B',\n 'Ы': 'X',\n 'Ь': 'B',\n 'Э': '3',\n 'Ю': 'X',\n 'Я': 'R',\n 'а': 'a',\n 'б': 'b',\n 'в': 'a',\n 'г': 'r',\n 'д': 'y',\n 'е': 'e',\n 'ж': 'm',\n 'з': 'e',\n 'и': 'n',\n 'й': 'n',\n 'к': 'n',\n 'л': 'n',\n 'м': 'm',\n 'н': 'n',\n 'о': 'o',\n 'п': 'n',\n 'р': 'p',\n 'с': 'c',\n 'т': 'o',\n 'у': 'y',\n 'ф': 'b',\n 'х': 'x',\n 'ц': 'n',\n 'ч': 'n',\n 'ш': 'w',\n 'щ': 'w',\n 'ъ': 'a',\n 'ы': 'm',\n 'ь': 'a',\n 'э': 'e',\n 'ю': 'm',\n 'я': 'r'\n};\n\n/**\n * This function adds new font metrics to default metricMap\n * It can also override existing metrics\n */\nfunction setFontMetrics(fontName, metrics) {\n fontMetricsData[fontName] = metrics;\n}\n/**\n * This function is a convenience function for looking up information in the\n * metricMap table. It takes a character as a string, and a font.\n *\n * Note: the `width` property may be undefined if fontMetricsData.js wasn't\n * built using `Make extended_metrics`.\n */\n\nfunction getCharacterMetrics(character, font, mode) {\n if (!fontMetricsData[font]) {\n throw new Error(\"Font metrics not found for font: \" + font + \".\");\n }\n\n var ch = character.charCodeAt(0);\n var metrics = fontMetricsData[font][ch];\n\n if (!metrics && character[0] in extraCharacterMap) {\n ch = extraCharacterMap[character[0]].charCodeAt(0);\n metrics = fontMetricsData[font][ch];\n }\n\n if (!metrics && mode === 'text') {\n // We don't typically have font metrics for Asian scripts.\n // But since we support them in text mode, we need to return\n // some sort of metrics.\n // So if the character is in a script we support but we\n // don't have metrics for it, just use the metrics for\n // the Latin capital letter M. This is close enough because\n // we (currently) only care about the height of the glpyh\n // not its width.\n if (supportedCodepoint(ch)) {\n metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'\n }\n }\n\n if (metrics) {\n return {\n depth: metrics[0],\n height: metrics[1],\n italic: metrics[2],\n skew: metrics[3],\n width: metrics[4]\n };\n }\n}\nvar fontMetricsBySizeIndex = {};\n/**\n * Get the font metrics for a given size.\n */\n\nfunction getGlobalMetrics(size) {\n var sizeIndex;\n\n if (size >= 5) {\n sizeIndex = 0;\n } else if (size >= 3) {\n sizeIndex = 1;\n } else {\n sizeIndex = 2;\n }\n\n if (!fontMetricsBySizeIndex[sizeIndex]) {\n var metrics = fontMetricsBySizeIndex[sizeIndex] = {\n cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18\n };\n\n for (var key in sigmasAndXis) {\n if (sigmasAndXis.hasOwnProperty(key)) {\n metrics[key] = sigmasAndXis[key][sizeIndex];\n }\n }\n }\n\n return fontMetricsBySizeIndex[sizeIndex];\n}\n;// CONCATENATED MODULE: ./src/Options.js\n/**\n * This file contains information about the options that the Parser carries\n * around with it while parsing. Data is held in an `Options` object, and when\n * recursing, a new `Options` object can be created with the `.with*` and\n * `.reset` functions.\n */\n\nvar sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize].\n// The size mappings are taken from TeX with \\normalsize=10pt.\n[1, 1, 1], // size1: [5, 5, 5] \\tiny\n[2, 1, 1], // size2: [6, 5, 5]\n[3, 1, 1], // size3: [7, 5, 5] \\scriptsize\n[4, 2, 1], // size4: [8, 6, 5] \\footnotesize\n[5, 2, 1], // size5: [9, 6, 5] \\small\n[6, 3, 1], // size6: [10, 7, 5] \\normalsize\n[7, 4, 2], // size7: [12, 8, 6] \\large\n[8, 6, 3], // size8: [14.4, 10, 7] \\Large\n[9, 7, 6], // size9: [17.28, 12, 10] \\LARGE\n[10, 8, 7], // size10: [20.74, 14.4, 12] \\huge\n[11, 10, 9] // size11: [24.88, 20.74, 17.28] \\HUGE\n];\nvar sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if\n// you change size indexes, change that function.\n0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];\n\nvar sizeAtStyle = function sizeAtStyle(size, style) {\n return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];\n}; // In these types, \"\" (empty string) means \"no change\".\n\n\n/**\n * This is the main options class. It contains the current style, size, color,\n * and font.\n *\n * Options objects should not be modified. To create a new Options with\n * different properties, call a `.having*` method.\n */\nvar Options = /*#__PURE__*/function () {\n // A font family applies to a group of fonts (i.e. SansSerif), while a font\n // represents a specific font (i.e. SansSerif Bold).\n // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n\n /**\n * The base size index.\n */\n function Options(data) {\n this.style = void 0;\n this.color = void 0;\n this.size = void 0;\n this.textSize = void 0;\n this.phantom = void 0;\n this.font = void 0;\n this.fontFamily = void 0;\n this.fontWeight = void 0;\n this.fontShape = void 0;\n this.sizeMultiplier = void 0;\n this.maxSize = void 0;\n this.minRuleThickness = void 0;\n this._fontMetrics = void 0;\n this.style = data.style;\n this.color = data.color;\n this.size = data.size || Options.BASESIZE;\n this.textSize = data.textSize || this.size;\n this.phantom = !!data.phantom;\n this.font = data.font || \"\";\n this.fontFamily = data.fontFamily || \"\";\n this.fontWeight = data.fontWeight || '';\n this.fontShape = data.fontShape || '';\n this.sizeMultiplier = sizeMultipliers[this.size - 1];\n this.maxSize = data.maxSize;\n this.minRuleThickness = data.minRuleThickness;\n this._fontMetrics = undefined;\n }\n /**\n * Returns a new options object with the same properties as \"this\". Properties\n * from \"extension\" will be copied to the new options object.\n */\n\n\n var _proto = Options.prototype;\n\n _proto.extend = function extend(extension) {\n var data = {\n style: this.style,\n size: this.size,\n textSize: this.textSize,\n color: this.color,\n phantom: this.phantom,\n font: this.font,\n fontFamily: this.fontFamily,\n fontWeight: this.fontWeight,\n fontShape: this.fontShape,\n maxSize: this.maxSize,\n minRuleThickness: this.minRuleThickness\n };\n\n for (var key in extension) {\n if (extension.hasOwnProperty(key)) {\n data[key] = extension[key];\n }\n }\n\n return new Options(data);\n }\n /**\n * Return an options object with the given style. If `this.style === style`,\n * returns `this`.\n */\n ;\n\n _proto.havingStyle = function havingStyle(style) {\n if (this.style === style) {\n return this;\n } else {\n return this.extend({\n style: style,\n size: sizeAtStyle(this.textSize, style)\n });\n }\n }\n /**\n * Return an options object with a cramped version of the current style. If\n * the current style is cramped, returns `this`.\n */\n ;\n\n _proto.havingCrampedStyle = function havingCrampedStyle() {\n return this.havingStyle(this.style.cramp());\n }\n /**\n * Return an options object with the given size and in at least `\\textstyle`.\n * Returns `this` if appropriate.\n */\n ;\n\n _proto.havingSize = function havingSize(size) {\n if (this.size === size && this.textSize === size) {\n return this;\n } else {\n return this.extend({\n style: this.style.text(),\n size: size,\n textSize: size,\n sizeMultiplier: sizeMultipliers[size - 1]\n });\n }\n }\n /**\n * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,\n * changes to at least `\\textstyle`.\n */\n ;\n\n _proto.havingBaseStyle = function havingBaseStyle(style) {\n style = style || this.style.text();\n var wantSize = sizeAtStyle(Options.BASESIZE, style);\n\n if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {\n return this;\n } else {\n return this.extend({\n style: style,\n size: wantSize\n });\n }\n }\n /**\n * Remove the effect of sizing changes such as \\Huge.\n * Keep the effect of the current style, such as \\scriptstyle.\n */\n ;\n\n _proto.havingBaseSizing = function havingBaseSizing() {\n var size;\n\n switch (this.style.id) {\n case 4:\n case 5:\n size = 3; // normalsize in scriptstyle\n\n break;\n\n case 6:\n case 7:\n size = 1; // normalsize in scriptscriptstyle\n\n break;\n\n default:\n size = 6;\n // normalsize in textstyle or displaystyle\n }\n\n return this.extend({\n style: this.style.text(),\n size: size\n });\n }\n /**\n * Create a new options object with the given color.\n */\n ;\n\n _proto.withColor = function withColor(color) {\n return this.extend({\n color: color\n });\n }\n /**\n * Create a new options object with \"phantom\" set to true.\n */\n ;\n\n _proto.withPhantom = function withPhantom() {\n return this.extend({\n phantom: true\n });\n }\n /**\n * Creates a new options object with the given math font or old text font.\n * @type {[type]}\n */\n ;\n\n _proto.withFont = function withFont(font) {\n return this.extend({\n font: font\n });\n }\n /**\n * Create a new options objects with the given fontFamily.\n */\n ;\n\n _proto.withTextFontFamily = function withTextFontFamily(fontFamily) {\n return this.extend({\n fontFamily: fontFamily,\n font: \"\"\n });\n }\n /**\n * Creates a new options object with the given font weight\n */\n ;\n\n _proto.withTextFontWeight = function withTextFontWeight(fontWeight) {\n return this.extend({\n fontWeight: fontWeight,\n font: \"\"\n });\n }\n /**\n * Creates a new options object with the given font weight\n */\n ;\n\n _proto.withTextFontShape = function withTextFontShape(fontShape) {\n return this.extend({\n fontShape: fontShape,\n font: \"\"\n });\n }\n /**\n * Return the CSS sizing classes required to switch from enclosing options\n * `oldOptions` to `this`. Returns an array of classes.\n */\n ;\n\n _proto.sizingClasses = function sizingClasses(oldOptions) {\n if (oldOptions.size !== this.size) {\n return [\"sizing\", \"reset-size\" + oldOptions.size, \"size\" + this.size];\n } else {\n return [];\n }\n }\n /**\n * Return the CSS sizing classes required to switch to the base size. Like\n * `this.havingSize(BASESIZE).sizingClasses(this)`.\n */\n ;\n\n _proto.baseSizingClasses = function baseSizingClasses() {\n if (this.size !== Options.BASESIZE) {\n return [\"sizing\", \"reset-size\" + this.size, \"size\" + Options.BASESIZE];\n } else {\n return [];\n }\n }\n /**\n * Return the font metrics for this size.\n */\n ;\n\n _proto.fontMetrics = function fontMetrics() {\n if (!this._fontMetrics) {\n this._fontMetrics = getGlobalMetrics(this.size);\n }\n\n return this._fontMetrics;\n }\n /**\n * Gets the CSS color of the current options object\n */\n ;\n\n _proto.getColor = function getColor() {\n if (this.phantom) {\n return \"transparent\";\n } else {\n return this.color;\n }\n };\n\n return Options;\n}();\n\nOptions.BASESIZE = 6;\n/* harmony default export */ var src_Options = (Options);\n;// CONCATENATED MODULE: ./src/units.js\n/**\n * This file does conversion between units. In particular, it provides\n * calculateSize to convert other units into ems.\n */\n\n // This table gives the number of TeX pts in one of each *absolute* TeX unit.\n// Thus, multiplying a length by this number converts the length from units\n// into pts. Dividing the result by ptPerEm gives the number of ems\n// *assuming* a font size of ptPerEm (normal size, normal style).\n\nvar ptPerUnit = {\n // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n // https://tex.stackexchange.com/a/8263\n \"pt\": 1,\n // TeX point\n \"mm\": 7227 / 2540,\n // millimeter\n \"cm\": 7227 / 254,\n // centimeter\n \"in\": 72.27,\n // inch\n \"bp\": 803 / 800,\n // big (PostScript) points\n \"pc\": 12,\n // pica\n \"dd\": 1238 / 1157,\n // didot\n \"cc\": 14856 / 1157,\n // cicero (12 didot)\n \"nd\": 685 / 642,\n // new didot\n \"nc\": 1370 / 107,\n // new cicero (12 new didot)\n \"sp\": 1 / 65536,\n // scaled point (TeX's internal smallest unit)\n // https://tex.stackexchange.com/a/41371\n \"px\": 803 / 800 // \\pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX\n\n}; // Dictionary of relative units, for fast validity testing.\n\nvar relativeUnit = {\n \"ex\": true,\n \"em\": true,\n \"mu\": true\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nvar validUnit = function validUnit(unit) {\n if (typeof unit !== \"string\") {\n unit = unit.unit;\n }\n\n return unit in ptPerUnit || unit in relativeUnit || unit === \"ex\";\n};\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS em value for the\n * current style/scale. `options` gives the current options.\n */\n\nvar calculateSize = function calculateSize(sizeValue, options) {\n var scale;\n\n if (sizeValue.unit in ptPerUnit) {\n // Absolute units\n scale = ptPerUnit[sizeValue.unit] // Convert unit to pt\n / options.fontMetrics().ptPerEm // Convert pt to CSS em\n / options.sizeMultiplier; // Unscale to make absolute units\n } else if (sizeValue.unit === \"mu\") {\n // `mu` units scale with scriptstyle/scriptscriptstyle.\n scale = options.fontMetrics().cssEmPerMu;\n } else {\n // Other relative units always refer to the *textstyle* font\n // in the current size.\n var unitOptions;\n\n if (options.style.isTight()) {\n // isTight() means current style is script/scriptscript.\n unitOptions = options.havingStyle(options.style.text());\n } else {\n unitOptions = options;\n } // TODO: In TeX these units are relative to the quad of the current\n // *text* font, e.g. cmr10. KaTeX instead uses values from the\n // comparably-sized *Computer Modern symbol* font. At 10pt, these\n // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;\n // cmr5=1.361133, cmsy5=1.472241. Consider $\\scriptsize a\\kern1emb$.\n // TeX \\showlists shows a kern of 1.13889 * fontsize;\n // KaTeX shows a kern of 1.171 * fontsize.\n\n\n if (sizeValue.unit === \"ex\") {\n scale = unitOptions.fontMetrics().xHeight;\n } else if (sizeValue.unit === \"em\") {\n scale = unitOptions.fontMetrics().quad;\n } else {\n throw new src_ParseError(\"Invalid unit: '\" + sizeValue.unit + \"'\");\n }\n\n if (unitOptions !== options) {\n scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;\n }\n }\n\n return Math.min(sizeValue.number * scale, options.maxSize);\n};\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. See\n * https://github.com/KaTeX/KaTeX/pull/2460.\n */\n\nvar makeEm = function makeEm(n) {\n return +n.toFixed(4) + \"em\";\n};\n;// CONCATENATED MODULE: ./src/domTree.js\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n * TODO: refactor `span` and `anchor` into common superclass when\n * target environments support class inheritance\n */\n\n\n\n\n\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nvar createClass = function createClass(classes) {\n return classes.filter(function (cls) {\n return cls;\n }).join(\" \");\n};\n\nvar initNode = function initNode(classes, options, style) {\n this.classes = classes || [];\n this.attributes = {};\n this.height = 0;\n this.depth = 0;\n this.maxFontSize = 0;\n this.style = style || {};\n\n if (options) {\n if (options.style.isTight()) {\n this.classes.push(\"mtight\");\n }\n\n var color = options.getColor();\n\n if (color) {\n this.style.color = color;\n }\n }\n};\n/**\n * Convert into an HTML node\n */\n\n\nvar _toNode = function toNode(tagName) {\n var node = document.createElement(tagName); // Apply the class\n\n node.className = createClass(this.classes); // Apply inline styles\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n // $FlowFixMe Flow doesn't seem to understand span.style's type.\n node.style[style] = this.style[style];\n }\n } // Apply attributes\n\n\n for (var attr in this.attributes) {\n if (this.attributes.hasOwnProperty(attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n } // Append the children, also as HTML nodes\n\n\n for (var i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n};\n/**\n * Convert into an HTML markup string\n */\n\n\nvar _toMarkup = function toMarkup(tagName) {\n var markup = \"<\" + tagName; // Add the class\n\n if (this.classes.length) {\n markup += \" class=\\\"\" + utils.escape(createClass(this.classes)) + \"\\\"\";\n }\n\n var styles = \"\"; // Add the styles, after hyphenation\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n styles += utils.hyphenate(style) + \":\" + this.style[style] + \";\";\n }\n }\n\n if (styles) {\n markup += \" style=\\\"\" + utils.escape(styles) + \"\\\"\";\n } // Add the attributes\n\n\n for (var attr in this.attributes) {\n if (this.attributes.hasOwnProperty(attr)) {\n markup += \" \" + attr + \"=\\\"\" + utils.escape(this.attributes[attr]) + \"\\\"\";\n }\n }\n\n markup += \">\"; // Add the markup of the children, also as markup\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"</\" + tagName + \">\";\n return markup;\n}; // Making the type below exact with all optional fields doesn't work due to\n// - https://github.com/facebook/flow/issues/4582\n// - https://github.com/facebook/flow/issues/5688\n// However, since *all* fields are optional, $Shape<> works as suggested in 5688\n// above.\n// This type does not include all CSS properties. Additional properties should\n// be added as needed.\n\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style. It also contains information about its height, depth, and\n * maxFontSize.\n *\n * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan\n * otherwise. This typesafety is important when HTML builders access a span's\n * children.\n */\nvar Span = /*#__PURE__*/function () {\n function Span(classes, children, options, style) {\n this.children = void 0;\n this.attributes = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.width = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n initNode.call(this, classes, options, style);\n this.children = children || [];\n }\n /**\n * Sets an arbitrary attribute on the span. Warning: use this wisely. Not\n * all browsers support attributes the same, and having too many custom\n * attributes is probably bad.\n */\n\n\n var _proto = Span.prototype;\n\n _proto.setAttribute = function setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n };\n\n _proto.hasClass = function hasClass(className) {\n return utils.contains(this.classes, className);\n };\n\n _proto.toNode = function toNode() {\n return _toNode.call(this, \"span\");\n };\n\n _proto.toMarkup = function toMarkup() {\n return _toMarkup.call(this, \"span\");\n };\n\n return Span;\n}();\n/**\n * This node represents an anchor (<a>) element with a hyperlink. See `span`\n * for further details.\n */\n\nvar Anchor = /*#__PURE__*/function () {\n function Anchor(href, classes, children, options) {\n this.children = void 0;\n this.attributes = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n initNode.call(this, classes, options);\n this.children = children || [];\n this.setAttribute('href', href);\n }\n\n var _proto2 = Anchor.prototype;\n\n _proto2.setAttribute = function setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n };\n\n _proto2.hasClass = function hasClass(className) {\n return utils.contains(this.classes, className);\n };\n\n _proto2.toNode = function toNode() {\n return _toNode.call(this, \"a\");\n };\n\n _proto2.toMarkup = function toMarkup() {\n return _toMarkup.call(this, \"a\");\n };\n\n return Anchor;\n}();\n/**\n * This node represents an image embed (<img>) element.\n */\n\nvar Img = /*#__PURE__*/function () {\n function Img(src, alt, style) {\n this.src = void 0;\n this.alt = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n this.alt = alt;\n this.src = src;\n this.classes = [\"mord\"];\n this.style = style;\n }\n\n var _proto3 = Img.prototype;\n\n _proto3.hasClass = function hasClass(className) {\n return utils.contains(this.classes, className);\n };\n\n _proto3.toNode = function toNode() {\n var node = document.createElement(\"img\");\n node.src = this.src;\n node.alt = this.alt;\n node.className = \"mord\"; // Apply inline styles\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n // $FlowFixMe\n node.style[style] = this.style[style];\n }\n }\n\n return node;\n };\n\n _proto3.toMarkup = function toMarkup() {\n var markup = \"<img src='\" + this.src + \" 'alt='\" + this.alt + \"' \"; // Add the styles, after hyphenation\n\n var styles = \"\";\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n styles += utils.hyphenate(style) + \":\" + this.style[style] + \";\";\n }\n }\n\n if (styles) {\n markup += \" style=\\\"\" + utils.escape(styles) + \"\\\"\";\n }\n\n markup += \"'/>\";\n return markup;\n };\n\n return Img;\n}();\nvar iCombinations = {\n 'î': \"\\u0131\\u0302\",\n 'ï': \"\\u0131\\u0308\",\n 'í': \"\\u0131\\u0301\",\n // 'ī': '\\u0131\\u0304', // enable when we add Extended Latin\n 'ì': \"\\u0131\\u0300\"\n};\n/**\n * A symbol node contains information about a single symbol. It either renders\n * to a single text node, or a span with a single text node in it, depending on\n * whether it has CSS classes, styles, or needs italic correction.\n */\n\nvar SymbolNode = /*#__PURE__*/function () {\n function SymbolNode(text, height, depth, italic, skew, width, classes, style) {\n this.text = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.italic = void 0;\n this.skew = void 0;\n this.width = void 0;\n this.maxFontSize = void 0;\n this.classes = void 0;\n this.style = void 0;\n this.text = text;\n this.height = height || 0;\n this.depth = depth || 0;\n this.italic = italic || 0;\n this.skew = skew || 0;\n this.width = width || 0;\n this.classes = classes || [];\n this.style = style || {};\n this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we\n // can specify which fonts to use. This allows us to render these\n // characters with a serif font in situations where the browser would\n // either default to a sans serif or render a placeholder character.\n // We use CSS class names like cjk_fallback, hangul_fallback and\n // brahmic_fallback. See ./unicodeScripts.js for the set of possible\n // script names\n\n var script = scriptFromCodepoint(this.text.charCodeAt(0));\n\n if (script) {\n this.classes.push(script + \"_fallback\");\n }\n\n if (/[îïíì]/.test(this.text)) {\n // add ī when we add Extended Latin\n this.text = iCombinations[this.text];\n }\n }\n\n var _proto4 = SymbolNode.prototype;\n\n _proto4.hasClass = function hasClass(className) {\n return utils.contains(this.classes, className);\n }\n /**\n * Creates a text node or span from a symbol node. Note that a span is only\n * created if it is needed.\n */\n ;\n\n _proto4.toNode = function toNode() {\n var node = document.createTextNode(this.text);\n var span = null;\n\n if (this.italic > 0) {\n span = document.createElement(\"span\");\n span.style.marginRight = makeEm(this.italic);\n }\n\n if (this.classes.length > 0) {\n span = span || document.createElement(\"span\");\n span.className = createClass(this.classes);\n }\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n span = span || document.createElement(\"span\"); // $FlowFixMe Flow doesn't seem to understand span.style's type.\n\n span.style[style] = this.style[style];\n }\n }\n\n if (span) {\n span.appendChild(node);\n return span;\n } else {\n return node;\n }\n }\n /**\n * Creates markup for a symbol node.\n */\n ;\n\n _proto4.toMarkup = function toMarkup() {\n // TODO(alpert): More duplication than I'd like from\n // span.prototype.toMarkup and symbolNode.prototype.toNode...\n var needsSpan = false;\n var markup = \"<span\";\n\n if (this.classes.length) {\n needsSpan = true;\n markup += \" class=\\\"\";\n markup += utils.escape(createClass(this.classes));\n markup += \"\\\"\";\n }\n\n var styles = \"\";\n\n if (this.italic > 0) {\n styles += \"margin-right:\" + this.italic + \"em;\";\n }\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n styles += utils.hyphenate(style) + \":\" + this.style[style] + \";\";\n }\n }\n\n if (styles) {\n needsSpan = true;\n markup += \" style=\\\"\" + utils.escape(styles) + \"\\\"\";\n }\n\n var escaped = utils.escape(this.text);\n\n if (needsSpan) {\n markup += \">\";\n markup += escaped;\n markup += \"</span>\";\n return markup;\n } else {\n return escaped;\n }\n };\n\n return SymbolNode;\n}();\n/**\n * SVG nodes are used to render stretchy wide elements.\n */\n\nvar SvgNode = /*#__PURE__*/function () {\n function SvgNode(children, attributes) {\n this.children = void 0;\n this.attributes = void 0;\n this.children = children || [];\n this.attributes = attributes || {};\n }\n\n var _proto5 = SvgNode.prototype;\n\n _proto5.toNode = function toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"svg\"); // Apply attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n for (var i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n };\n\n _proto5.toMarkup = function toMarkup() {\n var markup = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\"; // Apply attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + \"='\" + this.attributes[attr] + \"'\";\n }\n }\n\n markup += \">\";\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"</svg>\";\n return markup;\n };\n\n return SvgNode;\n}();\nvar PathNode = /*#__PURE__*/function () {\n function PathNode(pathName, alternate) {\n this.pathName = void 0;\n this.alternate = void 0;\n this.pathName = pathName;\n this.alternate = alternate; // Used only for \\sqrt, \\phase, & tall delims\n }\n\n var _proto6 = PathNode.prototype;\n\n _proto6.toNode = function toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"path\");\n\n if (this.alternate) {\n node.setAttribute(\"d\", this.alternate);\n } else {\n node.setAttribute(\"d\", path[this.pathName]);\n }\n\n return node;\n };\n\n _proto6.toMarkup = function toMarkup() {\n if (this.alternate) {\n return \"<path d='\" + this.alternate + \"'/>\";\n } else {\n return \"<path d='\" + path[this.pathName] + \"'/>\";\n }\n };\n\n return PathNode;\n}();\nvar LineNode = /*#__PURE__*/function () {\n function LineNode(attributes) {\n this.attributes = void 0;\n this.attributes = attributes || {};\n }\n\n var _proto7 = LineNode.prototype;\n\n _proto7.toNode = function toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"line\"); // Apply attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n return node;\n };\n\n _proto7.toMarkup = function toMarkup() {\n var markup = \"<line\";\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + \"='\" + this.attributes[attr] + \"'\";\n }\n }\n\n markup += \"/>\";\n return markup;\n };\n\n return LineNode;\n}();\nfunction assertSymbolDomNode(group) {\n if (group instanceof SymbolNode) {\n return group;\n } else {\n throw new Error(\"Expected symbolNode but got \" + String(group) + \".\");\n }\n}\nfunction assertSpan(group) {\n if (group instanceof Span) {\n return group;\n } else {\n throw new Error(\"Expected span<HtmlDomNode> but got \" + String(group) + \".\");\n }\n}\n;// CONCATENATED MODULE: ./src/symbols.js\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are three properties they can have:\n * - font (required): the font to be used for this symbol. Either \"main\" (the\n normal font), or \"ams\" (the ams fonts).\n * - group (required): the ParseNode group type the symbol should have (i.e.\n \"textord\", \"mathord\", etc).\n See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types\n * - replace: the character that this symbol or function should be\n * replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n * character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nvar ATOMS = {\n \"bin\": 1,\n \"close\": 1,\n \"inner\": 1,\n \"open\": 1,\n \"punct\": 1,\n \"rel\": 1\n};\nvar NON_ATOMS = {\n \"accent-token\": 1,\n \"mathord\": 1,\n \"op-token\": 1,\n \"spacing\": 1,\n \"textord\": 1\n};\nvar symbols = {\n \"math\": {},\n \"text\": {}\n};\n/* harmony default export */ var src_symbols = (symbols);\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\n\nfunction defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {\n symbols[mode][name] = {\n font: font,\n group: group,\n replace: replace\n };\n\n if (acceptUnicodeChar && replace) {\n symbols[mode][replace] = symbols[mode][name];\n }\n} // Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n// modes:\n\nvar math = \"math\";\nvar symbols_text = \"text\"; // fonts:\n\nvar main = \"main\";\nvar ams = \"ams\"; // groups:\n\nvar accent = \"accent-token\";\nvar bin = \"bin\";\nvar symbols_close = \"close\";\nvar inner = \"inner\";\nvar mathord = \"mathord\";\nvar op = \"op-token\";\nvar symbols_open = \"open\";\nvar punct = \"punct\";\nvar rel = \"rel\";\nvar spacing = \"spacing\";\nvar textord = \"textord\"; // Now comes the symbol table\n// Relation Symbols\n\ndefineSymbol(math, main, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, main, rel, \"\\u227A\", \"\\\\prec\", true);\ndefineSymbol(math, main, rel, \"\\u227B\", \"\\\\succ\", true);\ndefineSymbol(math, main, rel, \"\\u223C\", \"\\\\sim\", true);\ndefineSymbol(math, main, rel, \"\\u22A5\", \"\\\\perp\");\ndefineSymbol(math, main, rel, \"\\u2AAF\", \"\\\\preceq\", true);\ndefineSymbol(math, main, rel, \"\\u2AB0\", \"\\\\succeq\", true);\ndefineSymbol(math, main, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, main, rel, \"\\u2223\", \"\\\\mid\", true);\ndefineSymbol(math, main, rel, \"\\u226A\", \"\\\\ll\", true);\ndefineSymbol(math, main, rel, \"\\u226B\", \"\\\\gg\", true);\ndefineSymbol(math, main, rel, \"\\u224D\", \"\\\\asymp\", true);\ndefineSymbol(math, main, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, main, rel, \"\\u22C8\", \"\\\\bowtie\", true);\ndefineSymbol(math, main, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, main, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, main, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, main, rel, \"\\u220B\", \"\\\\ni\", true);\ndefineSymbol(math, main, rel, \"\\u221D\", \"\\\\propto\", true);\ndefineSymbol(math, main, rel, \"\\u22A2\", \"\\\\vdash\", true);\ndefineSymbol(math, main, rel, \"\\u22A3\", \"\\\\dashv\", true);\ndefineSymbol(math, main, rel, \"\\u220B\", \"\\\\owns\"); // Punctuation\n\ndefineSymbol(math, main, punct, \".\", \"\\\\ldotp\");\ndefineSymbol(math, main, punct, \"\\u22C5\", \"\\\\cdotp\"); // Misc Symbols\n\ndefineSymbol(math, main, textord, \"#\", \"\\\\#\");\ndefineSymbol(symbols_text, main, textord, \"#\", \"\\\\#\");\ndefineSymbol(math, main, textord, \"&\", \"\\\\&\");\ndefineSymbol(symbols_text, main, textord, \"&\", \"\\\\&\");\ndefineSymbol(math, main, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, main, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, main, textord, \"\\u210F\", \"\\\\hbar\", true);\ndefineSymbol(math, main, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, main, textord, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, main, textord, \"\\u266D\", \"\\\\flat\", true);\ndefineSymbol(math, main, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, main, textord, \"\\u266E\", \"\\\\natural\", true);\ndefineSymbol(math, main, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, main, textord, \"\\u266F\", \"\\\\sharp\", true);\ndefineSymbol(math, main, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, main, textord, \"\\u211C\", \"\\\\Re\", true);\ndefineSymbol(math, main, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, main, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, main, textord, \"\\xA7\", \"\\\\S\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xA7\", \"\\\\S\");\ndefineSymbol(math, main, textord, \"\\xB6\", \"\\\\P\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xB6\", \"\\\\P\"); // Math and Text\n\ndefineSymbol(math, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(symbols_text, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(symbols_text, main, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(symbols_text, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(symbols_text, main, textord, \"\\u2021\", \"\\\\textdaggerdbl\"); // Large Delimiters\n\ndefineSymbol(math, main, symbols_close, \"\\u23B1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, main, symbols_open, \"\\u23B0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, main, symbols_close, \"\\u27EF\", \"\\\\rgroup\", true);\ndefineSymbol(math, main, symbols_open, \"\\u27EE\", \"\\\\lgroup\", true); // Binary Operators\n\ndefineSymbol(math, main, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, main, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, main, bin, \"\\u228E\", \"\\\\uplus\", true);\ndefineSymbol(math, main, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, main, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, main, bin, \"\\u25EF\", \"\\\\bigcirc\", true);\ndefineSymbol(math, main, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, main, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, main, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, main, bin, \"\\u2A3F\", \"\\\\amalg\");\ndefineSymbol(math, main, bin, \"&\", \"\\\\And\"); // from amsmath\n// Arrow Symbols\n\ndefineSymbol(math, main, rel, \"\\u27F5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27F8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27F6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27F9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27F7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27FA\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21A6\", \"\\\\mapsto\", true);\ndefineSymbol(math, main, rel, \"\\u27FC\", \"\\\\longmapsto\", true);\ndefineSymbol(math, main, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, main, rel, \"\\u21A9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21AA\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, main, rel, \"\\u21BC\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u21C0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21BD\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u21C1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21CC\", \"\\\\rightleftharpoons\", true); // AMS Negated Binary Relations\n\ndefineSymbol(math, ams, rel, \"\\u226E\", \"\\\\nless\", true); // Symbol names preceeded by \"@\" each have a corresponding macro.\n\ndefineSymbol(math, ams, rel, \"\\uE010\", \"\\\\@nleqslant\");\ndefineSymbol(math, ams, rel, \"\\uE011\", \"\\\\@nleqq\");\ndefineSymbol(math, ams, rel, \"\\u2A87\", \"\\\\lneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, ams, rel, \"\\uE00C\", \"\\\\@lvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22E6\", \"\\\\lnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2A89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2280\", \"\\\\nprec\", true); // unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u22E0\", \"\\\\npreceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22E8\", \"\\\\precnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2AB9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, ams, rel, \"\\uE006\", \"\\\\@nshortmid\");\ndefineSymbol(math, ams, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, ams, rel, \"\\u22AC\", \"\\\\nvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u22AD\", \"\\\\nvDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22EA\", \"\\\\ntriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22EC\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, ams, rel, \"\\u228A\", \"\\\\subsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\uE01A\", \"\\\\@varsubsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2ACB\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\uE017\", \"\\\\@varsubsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u226F\", \"\\\\ngtr\", true);\ndefineSymbol(math, ams, rel, \"\\uE00F\", \"\\\\@ngeqslant\");\ndefineSymbol(math, ams, rel, \"\\uE00E\", \"\\\\@ngeqq\");\ndefineSymbol(math, ams, rel, \"\\u2A88\", \"\\\\gneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, ams, rel, \"\\uE00D\", \"\\\\@gvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22E7\", \"\\\\gnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2A8A\", \"\\\\gnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2281\", \"\\\\nsucc\", true); // unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u22E1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22E9\", \"\\\\succnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ABA\", \"\\\\succnapprox\", true); // unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, ams, rel, \"\\uE007\", \"\\\\@nshortparallel\");\ndefineSymbol(math, ams, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, ams, rel, \"\\u22AF\", \"\\\\nVDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22EB\", \"\\\\ntriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22ED\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, ams, rel, \"\\uE018\", \"\\\\@nsupseteqq\");\ndefineSymbol(math, ams, rel, \"\\u228B\", \"\\\\supsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\uE01B\", \"\\\\@varsupsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2ACC\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\uE019\", \"\\\\@varsupsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u22AE\", \"\\\\nVdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2AB5\", \"\\\\precneqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2AB6\", \"\\\\succneqq\", true);\ndefineSymbol(math, ams, rel, \"\\uE016\", \"\\\\@nsubseteqq\");\ndefineSymbol(math, ams, bin, \"\\u22B4\", \"\\\\unlhd\");\ndefineSymbol(math, ams, bin, \"\\u22B5\", \"\\\\unrhd\"); // AMS Negated Arrows\n\ndefineSymbol(math, ams, rel, \"\\u219A\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219B\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21CD\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21CF\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21AE\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21CE\", \"\\\\nLeftrightarrow\", true); // AMS Misc\n\ndefineSymbol(math, ams, rel, \"\\u25B3\", \"\\\\vartriangle\");\ndefineSymbol(math, ams, textord, \"\\u210F\", \"\\\\hslash\");\ndefineSymbol(math, ams, textord, \"\\u25BD\", \"\\\\triangledown\");\ndefineSymbol(math, ams, textord, \"\\u25CA\", \"\\\\lozenge\");\ndefineSymbol(math, ams, textord, \"\\u24C8\", \"\\\\circledS\");\ndefineSymbol(math, ams, textord, \"\\xAE\", \"\\\\circledR\");\ndefineSymbol(symbols_text, ams, textord, \"\\xAE\", \"\\\\circledR\");\ndefineSymbol(math, ams, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, ams, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, ams, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, ams, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, ams, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, ams, textord, \"\\u25B2\", \"\\\\blacktriangle\");\ndefineSymbol(math, ams, textord, \"\\u25BC\", \"\\\\blacktriangledown\");\ndefineSymbol(math, ams, textord, \"\\u25A0\", \"\\\\blacksquare\");\ndefineSymbol(math, ams, textord, \"\\u29EB\", \"\\\\blacklozenge\");\ndefineSymbol(math, ams, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, ams, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2201\", \"\\\\complement\", true); // unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\n\ndefineSymbol(math, ams, textord, \"\\xF0\", \"\\\\eth\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xF0\", \"\\xF0\");\ndefineSymbol(math, ams, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, ams, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, ams, textord, \"\\u25A1\", \"\\\\square\");\ndefineSymbol(math, ams, textord, \"\\u25A1\", \"\\\\Box\");\ndefineSymbol(math, ams, textord, \"\\u25CA\", \"\\\\Diamond\"); // unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\n\ndefineSymbol(math, ams, textord, \"\\xA5\", \"\\\\yen\", true);\ndefineSymbol(symbols_text, ams, textord, \"\\xA5\", \"\\\\yen\", true);\ndefineSymbol(math, ams, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(symbols_text, ams, textord, \"\\u2713\", \"\\\\checkmark\"); // AMS Hebrew\n\ndefineSymbol(math, ams, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, ams, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, ams, textord, \"\\u2137\", \"\\\\gimel\", true); // AMS Greek\n\ndefineSymbol(math, ams, textord, \"\\u03DD\", \"\\\\digamma\", true);\ndefineSymbol(math, ams, textord, \"\\u03F0\", \"\\\\varkappa\"); // AMS Delimiters\n\ndefineSymbol(math, ams, symbols_open, \"\\u250C\", \"\\\\@ulcorner\", true);\ndefineSymbol(math, ams, symbols_close, \"\\u2510\", \"\\\\@urcorner\", true);\ndefineSymbol(math, ams, symbols_open, \"\\u2514\", \"\\\\@llcorner\", true);\ndefineSymbol(math, ams, symbols_close, \"\\u2518\", \"\\\\@lrcorner\", true); // AMS Binary Relations\n\ndefineSymbol(math, ams, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2A7D\", \"\\\\leqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2A95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, ams, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, ams, rel, \"\\u2A85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u224A\", \"\\\\approxeq\", true);\ndefineSymbol(math, ams, bin, \"\\u22D6\", \"\\\\lessdot\");\ndefineSymbol(math, ams, rel, \"\\u22D8\", \"\\\\lll\", true);\ndefineSymbol(math, ams, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u22DA\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2A8B\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, ams, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u223D\", \"\\\\backsim\", true);\ndefineSymbol(math, ams, rel, \"\\u22CD\", \"\\\\backsimeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2AC5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22D0\", \"\\\\Subset\", true);\ndefineSymbol(math, ams, rel, \"\\u228F\", \"\\\\sqsubset\", true);\ndefineSymbol(math, ams, rel, \"\\u227C\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22DE\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, ams, rel, \"\\u227E\", \"\\\\precsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2AB7\", \"\\\\precapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22B2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22B4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, ams, rel, \"\\u22A8\", \"\\\\vDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22AA\", \"\\\\Vvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, ams, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, ams, rel, \"\\u224F\", \"\\\\bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u224E\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2A7E\", \"\\\\geqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2A96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2A86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, ams, bin, \"\\u22D7\", \"\\\\gtrdot\");\ndefineSymbol(math, ams, rel, \"\\u22D9\", \"\\\\ggg\", true);\ndefineSymbol(math, ams, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, ams, rel, \"\\u22DB\", \"\\\\gtreqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2A8C\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, ams, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, ams, rel, \"\\u225C\", \"\\\\triangleq\", true);\ndefineSymbol(math, ams, rel, \"\\u223C\", \"\\\\thicksim\");\ndefineSymbol(math, ams, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, ams, rel, \"\\u2AC6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22D1\", \"\\\\Supset\", true);\ndefineSymbol(math, ams, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, ams, rel, \"\\u227D\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22DF\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, ams, rel, \"\\u227F\", \"\\\\succsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2AB8\", \"\\\\succapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22B3\", \"\\\\vartriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22B5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, ams, rel, \"\\u22A9\", \"\\\\Vdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, ams, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, ams, rel, \"\\u226C\", \"\\\\between\", true);\ndefineSymbol(math, ams, rel, \"\\u22D4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, ams, rel, \"\\u221D\", \"\\\\varpropto\");\ndefineSymbol(math, ams, rel, \"\\u25C0\", \"\\\\blacktriangleleft\"); // unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\n\ndefineSymbol(math, ams, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, ams, rel, \"\\u220D\", \"\\\\backepsilon\");\ndefineSymbol(math, ams, rel, \"\\u25B6\", \"\\\\blacktriangleright\"); // unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\n\ndefineSymbol(math, ams, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, ams, rel, \"\\u22D8\", \"\\\\llless\");\ndefineSymbol(math, ams, rel, \"\\u22D9\", \"\\\\gggtr\");\ndefineSymbol(math, ams, bin, \"\\u22B2\", \"\\\\lhd\");\ndefineSymbol(math, ams, bin, \"\\u22B3\", \"\\\\rhd\");\ndefineSymbol(math, ams, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, main, rel, \"\\u22C8\", \"\\\\Join\");\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\Doteq\", true); // AMS Binary Operators\n\ndefineSymbol(math, ams, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, ams, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, ams, bin, \"\\u22D2\", \"\\\\Cap\", true);\ndefineSymbol(math, ams, bin, \"\\u22D3\", \"\\\\Cup\", true);\ndefineSymbol(math, ams, bin, \"\\u2A5E\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u229F\", \"\\\\boxminus\", true);\ndefineSymbol(math, ams, bin, \"\\u229E\", \"\\\\boxplus\", true);\ndefineSymbol(math, ams, bin, \"\\u22C7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22C9\", \"\\\\ltimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22CA\", \"\\\\rtimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22CB\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22CC\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22CF\", \"\\\\curlywedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22CE\", \"\\\\curlyvee\", true);\ndefineSymbol(math, ams, bin, \"\\u229D\", \"\\\\circleddash\", true);\ndefineSymbol(math, ams, bin, \"\\u229B\", \"\\\\circledast\", true);\ndefineSymbol(math, ams, bin, \"\\u22C5\", \"\\\\centerdot\");\ndefineSymbol(math, ams, bin, \"\\u22BA\", \"\\\\intercal\", true);\ndefineSymbol(math, ams, bin, \"\\u22D2\", \"\\\\doublecap\");\ndefineSymbol(math, ams, bin, \"\\u22D3\", \"\\\\doublecup\");\ndefineSymbol(math, ams, bin, \"\\u22A0\", \"\\\\boxtimes\", true); // AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\n\ndefineSymbol(math, ams, rel, \"\\u21E2\", \"\\\\dashrightarrow\", true); // unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21E0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21C7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21C6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21DA\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219E\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21A2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21AB\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21CB\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, ams, rel, \"\\u21B6\", \"\\\\curvearrowleft\", true); // unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21BA\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21B0\", \"\\\\Lsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21C8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21BF\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21C3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, main, rel, \"\\u22B6\", \"\\\\origof\", true); // not in font\n\ndefineSymbol(math, main, rel, \"\\u22B7\", \"\\\\imageof\", true); // not in font\n\ndefineSymbol(math, ams, rel, \"\\u22B8\", \"\\\\multimap\", true);\ndefineSymbol(math, ams, rel, \"\\u21AD\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21C9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21C4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21A0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21A3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21AC\", \"\\\\looparrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21B7\", \"\\\\curvearrowright\", true); // unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21BB\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21B1\", \"\\\\Rsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21CA\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21BE\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21C2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21DD\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21DD\", \"\\\\leadsto\");\ndefineSymbol(math, ams, rel, \"\\u21DB\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21BE\", \"\\\\restriction\");\ndefineSymbol(math, main, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(symbols_text, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(symbols_text, main, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(symbols_text, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(symbols_text, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(symbols_text, main, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(math, main, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, main, textord, \"\\u221E\", \"\\\\infty\", true);\ndefineSymbol(math, main, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, main, textord, \"\\u25B3\", \"\\\\triangle\");\ndefineSymbol(math, main, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, main, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, main, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, main, textord, \"\\u039B\", \"\\\\Lambda\", true);\ndefineSymbol(math, main, textord, \"\\u039E\", \"\\\\Xi\", true);\ndefineSymbol(math, main, textord, \"\\u03A0\", \"\\\\Pi\", true);\ndefineSymbol(math, main, textord, \"\\u03A3\", \"\\\\Sigma\", true);\ndefineSymbol(math, main, textord, \"\\u03A5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, main, textord, \"\\u03A6\", \"\\\\Phi\", true);\ndefineSymbol(math, main, textord, \"\\u03A8\", \"\\\\Psi\", true);\ndefineSymbol(math, main, textord, \"\\u03A9\", \"\\\\Omega\", true);\ndefineSymbol(math, main, textord, \"A\", \"\\u0391\");\ndefineSymbol(math, main, textord, \"B\", \"\\u0392\");\ndefineSymbol(math, main, textord, \"E\", \"\\u0395\");\ndefineSymbol(math, main, textord, \"Z\", \"\\u0396\");\ndefineSymbol(math, main, textord, \"H\", \"\\u0397\");\ndefineSymbol(math, main, textord, \"I\", \"\\u0399\");\ndefineSymbol(math, main, textord, \"K\", \"\\u039A\");\ndefineSymbol(math, main, textord, \"M\", \"\\u039C\");\ndefineSymbol(math, main, textord, \"N\", \"\\u039D\");\ndefineSymbol(math, main, textord, \"O\", \"\\u039F\");\ndefineSymbol(math, main, textord, \"P\", \"\\u03A1\");\ndefineSymbol(math, main, textord, \"T\", \"\\u03A4\");\ndefineSymbol(math, main, textord, \"X\", \"\\u03A7\");\ndefineSymbol(math, main, textord, \"\\xAC\", \"\\\\neg\", true);\ndefineSymbol(math, main, textord, \"\\xAC\", \"\\\\lnot\");\ndefineSymbol(math, main, textord, \"\\u22A4\", \"\\\\top\");\ndefineSymbol(math, main, textord, \"\\u22A5\", \"\\\\bot\");\ndefineSymbol(math, main, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, ams, textord, \"\\u2205\", \"\\\\varnothing\");\ndefineSymbol(math, main, mathord, \"\\u03B1\", \"\\\\alpha\", true);\ndefineSymbol(math, main, mathord, \"\\u03B2\", \"\\\\beta\", true);\ndefineSymbol(math, main, mathord, \"\\u03B3\", \"\\\\gamma\", true);\ndefineSymbol(math, main, mathord, \"\\u03B4\", \"\\\\delta\", true);\ndefineSymbol(math, main, mathord, \"\\u03F5\", \"\\\\epsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03B6\", \"\\\\zeta\", true);\ndefineSymbol(math, main, mathord, \"\\u03B7\", \"\\\\eta\", true);\ndefineSymbol(math, main, mathord, \"\\u03B8\", \"\\\\theta\", true);\ndefineSymbol(math, main, mathord, \"\\u03B9\", \"\\\\iota\", true);\ndefineSymbol(math, main, mathord, \"\\u03BA\", \"\\\\kappa\", true);\ndefineSymbol(math, main, mathord, \"\\u03BB\", \"\\\\lambda\", true);\ndefineSymbol(math, main, mathord, \"\\u03BC\", \"\\\\mu\", true);\ndefineSymbol(math, main, mathord, \"\\u03BD\", \"\\\\nu\", true);\ndefineSymbol(math, main, mathord, \"\\u03BE\", \"\\\\xi\", true);\ndefineSymbol(math, main, mathord, \"\\u03BF\", \"\\\\omicron\", true);\ndefineSymbol(math, main, mathord, \"\\u03C0\", \"\\\\pi\", true);\ndefineSymbol(math, main, mathord, \"\\u03C1\", \"\\\\rho\", true);\ndefineSymbol(math, main, mathord, \"\\u03C3\", \"\\\\sigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03C4\", \"\\\\tau\", true);\ndefineSymbol(math, main, mathord, \"\\u03C5\", \"\\\\upsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03D5\", \"\\\\phi\", true);\ndefineSymbol(math, main, mathord, \"\\u03C7\", \"\\\\chi\", true);\ndefineSymbol(math, main, mathord, \"\\u03C8\", \"\\\\psi\", true);\ndefineSymbol(math, main, mathord, \"\\u03C9\", \"\\\\omega\", true);\ndefineSymbol(math, main, mathord, \"\\u03B5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03D1\", \"\\\\vartheta\", true);\ndefineSymbol(math, main, mathord, \"\\u03D6\", \"\\\\varpi\", true);\ndefineSymbol(math, main, mathord, \"\\u03F1\", \"\\\\varrho\", true);\ndefineSymbol(math, main, mathord, \"\\u03C2\", \"\\\\varsigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03C6\", \"\\\\varphi\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"*\", true);\ndefineSymbol(math, main, bin, \"+\", \"+\");\ndefineSymbol(math, main, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, main, bin, \"\\u22C5\", \"\\\\cdot\", true);\ndefineSymbol(math, main, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, main, bin, \"\\xF7\", \"\\\\div\", true);\ndefineSymbol(math, main, bin, \"\\xB1\", \"\\\\pm\", true);\ndefineSymbol(math, main, bin, \"\\xD7\", \"\\\\times\", true);\ndefineSymbol(math, main, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, main, bin, \"\\u222A\", \"\\\\cup\", true);\ndefineSymbol(math, main, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, main, textord, \"\\u221A\", \"\\\\surd\");\ndefineSymbol(math, main, symbols_open, \"\\u27E8\", \"\\\\langle\", true);\ndefineSymbol(math, main, symbols_open, \"\\u2223\", \"\\\\lvert\");\ndefineSymbol(math, main, symbols_open, \"\\u2225\", \"\\\\lVert\");\ndefineSymbol(math, main, symbols_close, \"?\", \"?\");\ndefineSymbol(math, main, symbols_close, \"!\", \"!\");\ndefineSymbol(math, main, symbols_close, \"\\u27E9\", \"\\\\rangle\", true);\ndefineSymbol(math, main, symbols_close, \"\\u2223\", \"\\\\rvert\");\ndefineSymbol(math, main, symbols_close, \"\\u2225\", \"\\\\rVert\");\ndefineSymbol(math, main, rel, \"=\", \"=\");\ndefineSymbol(math, main, rel, \":\", \":\");\ndefineSymbol(math, main, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, main, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, main, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, main, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, main, rel, \"\\uE020\", \"\\\\@not\");\ndefineSymbol(math, main, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, main, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, main, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u22A8\", \"\\\\models\");\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, main, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, ams, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, main, spacing, \"\\xA0\", \"\\\\ \");\ndefineSymbol(math, main, spacing, \"\\xA0\", \"\\\\space\"); // Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\n\ndefineSymbol(math, main, spacing, \"\\xA0\", \"\\\\nobreakspace\");\ndefineSymbol(symbols_text, main, spacing, \"\\xA0\", \"\\\\ \");\ndefineSymbol(symbols_text, main, spacing, \"\\xA0\", \" \");\ndefineSymbol(symbols_text, main, spacing, \"\\xA0\", \"\\\\space\");\ndefineSymbol(symbols_text, main, spacing, \"\\xA0\", \"\\\\nobreakspace\");\ndefineSymbol(math, main, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, main, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, main, punct, \",\", \",\");\ndefineSymbol(math, main, punct, \";\", \";\");\ndefineSymbol(math, ams, bin, \"\\u22BC\", \"\\\\barwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22BB\", \"\\\\veebar\", true);\ndefineSymbol(math, main, bin, \"\\u2299\", \"\\\\odot\", true);\ndefineSymbol(math, main, bin, \"\\u2295\", \"\\\\oplus\", true);\ndefineSymbol(math, main, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, main, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, main, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, ams, bin, \"\\u229A\", \"\\\\circledcirc\", true);\ndefineSymbol(math, ams, bin, \"\\u22A1\", \"\\\\boxdot\", true);\ndefineSymbol(math, main, bin, \"\\u25B3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, main, bin, \"\\u25BD\", \"\\\\bigtriangledown\");\ndefineSymbol(math, main, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, main, bin, \"\\u22C4\", \"\\\\diamond\");\ndefineSymbol(math, main, bin, \"\\u22C6\", \"\\\\star\");\ndefineSymbol(math, main, bin, \"\\u25C3\", \"\\\\triangleleft\");\ndefineSymbol(math, main, bin, \"\\u25B9\", \"\\\\triangleright\");\ndefineSymbol(math, main, symbols_open, \"{\", \"\\\\{\");\ndefineSymbol(symbols_text, main, textord, \"{\", \"\\\\{\");\ndefineSymbol(symbols_text, main, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, main, symbols_close, \"}\", \"\\\\}\");\ndefineSymbol(symbols_text, main, textord, \"}\", \"\\\\}\");\ndefineSymbol(symbols_text, main, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, main, symbols_open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, main, symbols_close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, main, symbols_open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(symbols_text, main, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, main, symbols_close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(symbols_text, main, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, main, symbols_open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, main, symbols_close, \")\", \"\\\\rparen\", true);\ndefineSymbol(symbols_text, main, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\n\ndefineSymbol(symbols_text, main, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\n\ndefineSymbol(math, main, symbols_open, \"\\u230A\", \"\\\\lfloor\", true);\ndefineSymbol(math, main, symbols_close, \"\\u230B\", \"\\\\rfloor\", true);\ndefineSymbol(math, main, symbols_open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, main, symbols_close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, main, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"|\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"\\\\vert\");\ndefineSymbol(symbols_text, main, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\n\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\|\");\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\Vert\");\ndefineSymbol(symbols_text, main, textord, \"\\u2225\", \"\\\\textbardbl\");\ndefineSymbol(symbols_text, main, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(symbols_text, main, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(symbols_text, main, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, main, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21D5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, main, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, main, op, \"\\u22C1\", \"\\\\bigvee\");\ndefineSymbol(math, main, op, \"\\u22C0\", \"\\\\bigwedge\");\ndefineSymbol(math, main, op, \"\\u2A04\", \"\\\\biguplus\");\ndefineSymbol(math, main, op, \"\\u22C2\", \"\\\\bigcap\");\ndefineSymbol(math, main, op, \"\\u22C3\", \"\\\\bigcup\");\ndefineSymbol(math, main, op, \"\\u222B\", \"\\\\int\");\ndefineSymbol(math, main, op, \"\\u222B\", \"\\\\intop\");\ndefineSymbol(math, main, op, \"\\u222C\", \"\\\\iint\");\ndefineSymbol(math, main, op, \"\\u222D\", \"\\\\iiint\");\ndefineSymbol(math, main, op, \"\\u220F\", \"\\\\prod\");\ndefineSymbol(math, main, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, main, op, \"\\u2A02\", \"\\\\bigotimes\");\ndefineSymbol(math, main, op, \"\\u2A01\", \"\\\\bigoplus\");\ndefineSymbol(math, main, op, \"\\u2A00\", \"\\\\bigodot\");\ndefineSymbol(math, main, op, \"\\u222E\", \"\\\\oint\");\ndefineSymbol(math, main, op, \"\\u222F\", \"\\\\oiint\");\ndefineSymbol(math, main, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, main, op, \"\\u2A06\", \"\\\\bigsqcup\");\ndefineSymbol(math, main, op, \"\\u222B\", \"\\\\smallint\");\ndefineSymbol(symbols_text, main, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(symbols_text, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u22EF\", \"\\\\@cdots\", true);\ndefineSymbol(math, main, inner, \"\\u22F1\", \"\\\\ddots\", true);\ndefineSymbol(math, main, textord, \"\\u22EE\", \"\\\\varvdots\"); // \\vdots is a macro\n\ndefineSymbol(math, main, accent, \"\\u02CA\", \"\\\\acute\");\ndefineSymbol(math, main, accent, \"\\u02CB\", \"\\\\grave\");\ndefineSymbol(math, main, accent, \"\\xA8\", \"\\\\ddot\");\ndefineSymbol(math, main, accent, \"~\", \"\\\\tilde\");\ndefineSymbol(math, main, accent, \"\\u02C9\", \"\\\\bar\");\ndefineSymbol(math, main, accent, \"\\u02D8\", \"\\\\breve\");\ndefineSymbol(math, main, accent, \"\\u02C7\", \"\\\\check\");\ndefineSymbol(math, main, accent, \"^\", \"\\\\hat\");\ndefineSymbol(math, main, accent, \"\\u20D7\", \"\\\\vec\");\ndefineSymbol(math, main, accent, \"\\u02D9\", \"\\\\dot\");\ndefineSymbol(math, main, accent, \"\\u02DA\", \"\\\\mathring\"); // \\imath and \\jmath should be invariant to \\mathrm, \\mathbf, etc., so use PUA\n\ndefineSymbol(math, main, mathord, \"\\uE131\", \"\\\\@imath\");\ndefineSymbol(math, main, mathord, \"\\uE237\", \"\\\\@jmath\");\ndefineSymbol(math, main, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, main, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(symbols_text, main, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xDF\", \"\\\\ss\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xE6\", \"\\\\ae\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xF8\", \"\\\\o\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xC6\", \"\\\\AE\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xD8\", \"\\\\O\", true);\ndefineSymbol(symbols_text, main, accent, \"\\u02CA\", \"\\\\'\"); // acute\n\ndefineSymbol(symbols_text, main, accent, \"\\u02CB\", \"\\\\`\"); // grave\n\ndefineSymbol(symbols_text, main, accent, \"\\u02C6\", \"\\\\^\"); // circumflex\n\ndefineSymbol(symbols_text, main, accent, \"\\u02DC\", \"\\\\~\"); // tilde\n\ndefineSymbol(symbols_text, main, accent, \"\\u02C9\", \"\\\\=\"); // macron\n\ndefineSymbol(symbols_text, main, accent, \"\\u02D8\", \"\\\\u\"); // breve\n\ndefineSymbol(symbols_text, main, accent, \"\\u02D9\", \"\\\\.\"); // dot above\n\ndefineSymbol(symbols_text, main, accent, \"\\xB8\", \"\\\\c\"); // cedilla\n\ndefineSymbol(symbols_text, main, accent, \"\\u02DA\", \"\\\\r\"); // ring above\n\ndefineSymbol(symbols_text, main, accent, \"\\u02C7\", \"\\\\v\"); // caron\n\ndefineSymbol(symbols_text, main, accent, \"\\xA8\", '\\\\\"'); // diaresis\n\ndefineSymbol(symbols_text, main, accent, \"\\u02DD\", \"\\\\H\"); // double acute\n\ndefineSymbol(symbols_text, main, accent, \"\\u25EF\", \"\\\\textcircled\"); // \\bigcirc glyph\n// These ligatures are detected and created in Parser.js's `formLigatures`.\n\nvar ligatures = {\n \"--\": true,\n \"---\": true,\n \"``\": true,\n \"''\": true\n};\ndefineSymbol(symbols_text, main, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(symbols_text, main, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(symbols_text, main, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(symbols_text, main, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(symbols_text, main, textord, \"\\u201C\", \"``\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u201C\", \"\\\\textquotedblleft\");\ndefineSymbol(symbols_text, main, textord, \"\\u201D\", \"''\", true);\ndefineSymbol(symbols_text, main, textord, \"\\u201D\", \"\\\\textquotedblright\"); // \\degree from gensymb package\n\ndefineSymbol(math, main, textord, \"\\xB0\", \"\\\\degree\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xB0\", \"\\\\degree\"); // \\textdegree from inputenc package\n\ndefineSymbol(symbols_text, main, textord, \"\\xB0\", \"\\\\textdegree\", true); // TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\n\ndefineSymbol(math, main, textord, \"\\xA3\", \"\\\\pounds\");\ndefineSymbol(math, main, textord, \"\\xA3\", \"\\\\mathsterling\", true);\ndefineSymbol(symbols_text, main, textord, \"\\xA3\", \"\\\\pounds\");\ndefineSymbol(symbols_text, main, textord, \"\\xA3\", \"\\\\textsterling\", true);\ndefineSymbol(math, ams, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(symbols_text, ams, textord, \"\\u2720\", \"\\\\maltese\"); // There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\n\nvar mathTextSymbols = \"0123456789/@.\\\"\";\n\nfor (var i = 0; i < mathTextSymbols.length; i++) {\n var ch = mathTextSymbols.charAt(i);\n defineSymbol(math, main, textord, ch, ch);\n} // All of these are textords in text mode\n\n\nvar textSymbols = \"0123456789!@*()-=+\\\";:?/.,\";\n\nfor (var _i = 0; _i < textSymbols.length; _i++) {\n var _ch = textSymbols.charAt(_i);\n\n defineSymbol(symbols_text, main, textord, _ch, _ch);\n} // All of these are textords in text mode, and mathords in math mode\n\n\nvar letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfor (var _i2 = 0; _i2 < letters.length; _i2++) {\n var _ch2 = letters.charAt(_i2);\n\n defineSymbol(math, main, mathord, _ch2, _ch2);\n defineSymbol(symbols_text, main, textord, _ch2, _ch2);\n} // Blackboard bold and script letters in Unicode range\n\n\ndefineSymbol(math, ams, textord, \"C\", \"\\u2102\"); // blackboard bold\n\ndefineSymbol(symbols_text, ams, textord, \"C\", \"\\u2102\");\ndefineSymbol(math, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(symbols_text, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(math, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(symbols_text, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(math, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(symbols_text, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(math, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(symbols_text, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(math, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(symbols_text, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(math, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(symbols_text, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(math, main, mathord, \"h\", \"\\u210E\"); // italic h, Planck constant\n\ndefineSymbol(symbols_text, main, mathord, \"h\", \"\\u210E\"); // The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\n// Some editors do not deal well with wide characters. So don't write the\n// string into this file. Instead, create the string from the surrogate pair.\n\nvar wideChar = \"\";\n\nfor (var _i3 = 0; _i3 < letters.length; _i3++) {\n var _ch3 = letters.charAt(_i3); // The hex numbers in the next line are a surrogate pair.\n // 0xD835 is the high surrogate for all letters in the range we support.\n // 0xDC00 is the low surrogate for bold A.\n\n\n wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fractur\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n\n if (_i3 < 26) {\n // KaTeX fonts have only capital letters for blackboard bold and script.\n // See exception for k below.\n wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(symbols_text, main, textord, _ch3, wideChar);\n } // TODO: Add bold script when it is supported by a KaTeX font.\n\n} // \"k\" is the only double struck lower case letter in the KaTeX fonts.\n\n\nwideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck\n\ndefineSymbol(math, main, mathord, \"k\", wideChar);\ndefineSymbol(symbols_text, main, textord, \"k\", wideChar); // Next, some wide character numerals\n\nfor (var _i4 = 0; _i4 < 10; _i4++) {\n var _ch4 = _i4.toString();\n\n wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(symbols_text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(symbols_text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(symbols_text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(symbols_text, main, textord, _ch4, wideChar);\n} // We add these Latin-1 letters as symbols for backwards-compatibility,\n// but they are not actually in the font, nor are they supported by the\n// Unicode accent mechanism, so they fall back to Times font and look ugly.\n// TODO(edemaine): Fix this.\n\n\nvar extraLatin = \"\\xD0\\xDE\\xFE\";\n\nfor (var _i5 = 0; _i5 < extraLatin.length; _i5++) {\n var _ch5 = extraLatin.charAt(_i5);\n\n defineSymbol(math, main, mathord, _ch5, _ch5);\n defineSymbol(symbols_text, main, textord, _ch5, _ch5);\n}\n;// CONCATENATED MODULE: ./src/wide-character.js\n/**\n * This file provides support for Unicode range U+1D400 to U+1D7FF,\n * Mathematical Alphanumeric Symbols.\n *\n * Function wideCharacterFont takes a wide character as input and returns\n * the font information necessary to render it properly.\n */\n\n/**\n * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf\n * That document sorts characters into groups by font type, say bold or italic.\n *\n * In the arrays below, each subarray consists three elements:\n * * The CSS class of that group when in math mode.\n * * The CSS class of that group when in text mode.\n * * The font name, so that KaTeX can get font metrics.\n */\n\nvar wideLatinLetterData = [[\"mathbf\", \"textbf\", \"Main-Bold\"], // A-Z bold upright\n[\"mathbf\", \"textbf\", \"Main-Bold\"], // a-z bold upright\n[\"mathnormal\", \"textit\", \"Math-Italic\"], // A-Z italic\n[\"mathnormal\", \"textit\", \"Math-Italic\"], // a-z italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"], // A-Z bold italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"], // a-z bold italic\n// Map fancy A-Z letters to script, not calligraphic.\n// This aligns with unicode-math and math fonts (except Cambria Math).\n[\"mathscr\", \"textscr\", \"Script-Regular\"], // A-Z script\n[\"\", \"\", \"\"], // a-z script. No font\n[\"\", \"\", \"\"], // A-Z bold script. No font\n[\"\", \"\", \"\"], // a-z bold script. No font\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"], // A-Z Fraktur\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"], // a-z Fraktur\n[\"mathbb\", \"textbb\", \"AMS-Regular\"], // A-Z double-struck\n[\"mathbb\", \"textbb\", \"AMS-Regular\"], // k double-struck\n[\"\", \"\", \"\"], // A-Z bold Fraktur No font metrics\n[\"\", \"\", \"\"], // a-z bold Fraktur. No font.\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // A-Z sans-serif\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // a-z sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // A-Z bold sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // a-z bold sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"], // A-Z italic sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"], // a-z italic sans-serif\n[\"\", \"\", \"\"], // A-Z bold italic sans. No font\n[\"\", \"\", \"\"], // a-z bold italic sans. No font\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"], // A-Z monospace\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // a-z monospace\n];\nvar wideNumeralData = [[\"mathbf\", \"textbf\", \"Main-Bold\"], // 0-9 bold\n[\"\", \"\", \"\"], // 0-9 double-struck. No KaTeX font.\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // 0-9 sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // 0-9 bold sans-serif\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // 0-9 monospace\n];\nvar wideCharacterFont = function wideCharacterFont(wideChar, mode) {\n // IE doesn't support codePointAt(). So work with the surrogate pair.\n var H = wideChar.charCodeAt(0); // high surrogate\n\n var L = wideChar.charCodeAt(1); // low surrogate\n\n var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;\n var j = mode === \"math\" ? 0 : 1; // column index for CSS class.\n\n if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {\n // wideLatinLetterData contains exactly 26 chars on each row.\n // So we can calculate the relevant row. No traverse necessary.\n var i = Math.floor((codePoint - 0x1D400) / 26);\n return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];\n } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {\n // Numerals, ten per row.\n var _i = Math.floor((codePoint - 0x1D7CE) / 10);\n\n return [wideNumeralData[_i][2], wideNumeralData[_i][j]];\n } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {\n // dotless i or j\n return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];\n } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {\n // Greek letters. Not supported, yet.\n return [\"\", \"\"];\n } else {\n // We don't support any wide characters outside 1D4001D7FF.\n throw new src_ParseError(\"Unsupported character: \" + wideChar);\n }\n};\n;// CONCATENATED MODULE: ./src/buildCommon.js\n/* eslint no-console:0 */\n\n/**\n * This module contains general functions that can be used for building\n * different kinds of domTree nodes in a consistent manner.\n */\n\n\n\n\n\n\n\n/**\n * Looks up the given symbol in fontMetrics, after applying any symbol\n * replacements defined in symbol.js\n */\nvar lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this.\nfontName, mode) {\n // Replace the value with its replaced value from symbol.js\n if (src_symbols[mode][value] && src_symbols[mode][value].replace) {\n value = src_symbols[mode][value].replace;\n }\n\n return {\n value: value,\n metrics: getCharacterMetrics(value, fontName, mode)\n };\n};\n/**\n * Makes a symbolNode after translation via the list of symbols in symbols.js.\n * Correctly pulls out metrics for the character, and optionally takes a list of\n * classes to be attached to the node.\n *\n * TODO: make argument order closer to makeSpan\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n * TODO(#953): Make `options` mandatory and always pass it in.\n */\n\n\nvar makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {\n var lookup = lookupSymbol(value, fontName, mode);\n var metrics = lookup.metrics;\n value = lookup.value;\n var symbolNode;\n\n if (metrics) {\n var italic = metrics.italic;\n\n if (mode === \"text\" || options && options.font === \"mathit\") {\n italic = 0;\n }\n\n symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);\n } else {\n // TODO(emily): Figure out a good way to only print this in development\n typeof console !== \"undefined\" && console.warn(\"No character metrics \" + (\"for '\" + value + \"' in style '\" + fontName + \"' and mode '\" + mode + \"'\"));\n symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);\n }\n\n if (options) {\n symbolNode.maxFontSize = options.sizeMultiplier;\n\n if (options.style.isTight()) {\n symbolNode.classes.push(\"mtight\");\n }\n\n var color = options.getColor();\n\n if (color) {\n symbolNode.style.color = color;\n }\n }\n\n return symbolNode;\n};\n/**\n * Makes a symbol in Main-Regular or AMS-Regular.\n * Used for rel, bin, open, close, inner, and punct.\n */\n\n\nvar mathsym = function mathsym(value, mode, options, classes) {\n if (classes === void 0) {\n classes = [];\n }\n\n // Decide what font to render the symbol in by its entry in the symbols\n // table.\n // Have a special case for when the value = \\ because the \\ is used as a\n // textord in unsupported command errors but cannot be parsed as a regular\n // text ordinal and is therefore not present as a symbol in the symbols\n // table for text, as well as a special case for boldsymbol because it\n // can be used for bold + and -\n if (options.font === \"boldsymbol\" && lookupSymbol(value, \"Main-Bold\", mode).metrics) {\n return makeSymbol(value, \"Main-Bold\", mode, options, classes.concat([\"mathbf\"]));\n } else if (value === \"\\\\\" || src_symbols[mode][value].font === \"main\") {\n return makeSymbol(value, \"Main-Regular\", mode, options, classes);\n } else {\n return makeSymbol(value, \"AMS-Regular\", mode, options, classes.concat([\"amsrm\"]));\n }\n};\n/**\n * Determines which of the two font names (Main-Bold and Math-BoldItalic) and\n * corresponding style tags (mathbf or boldsymbol) to use for font \"boldsymbol\",\n * depending on the symbol. Use this function instead of fontMap for font\n * \"boldsymbol\".\n */\n\n\nvar boldsymbol = function boldsymbol(value, mode, options, classes, type) {\n if (type !== \"textord\" && lookupSymbol(value, \"Math-BoldItalic\", mode).metrics) {\n return {\n fontName: \"Math-BoldItalic\",\n fontClass: \"boldsymbol\"\n };\n } else {\n // Some glyphs do not exist in Math-BoldItalic so we need to use\n // Main-Bold instead.\n return {\n fontName: \"Main-Bold\",\n fontClass: \"mathbf\"\n };\n }\n};\n/**\n * Makes either a mathord or textord in the correct font and color.\n */\n\n\nvar makeOrd = function makeOrd(group, options, type) {\n var mode = group.mode;\n var text = group.text;\n var classes = [\"mord\"]; // Math mode or Old font (i.e. \\rm)\n\n var isFont = mode === \"math\" || mode === \"text\" && options.font;\n var fontOrFamily = isFont ? options.font : options.fontFamily;\n\n if (text.charCodeAt(0) === 0xD835) {\n // surrogate pairs get special treatment\n var _wideCharacterFont = wideCharacterFont(text, mode),\n wideFontName = _wideCharacterFont[0],\n wideFontClass = _wideCharacterFont[1];\n\n return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));\n } else if (fontOrFamily) {\n var fontName;\n var fontClasses;\n\n if (fontOrFamily === \"boldsymbol\") {\n var fontData = boldsymbol(text, mode, options, classes, type);\n fontName = fontData.fontName;\n fontClasses = [fontData.fontClass];\n } else if (isFont) {\n fontName = fontMap[fontOrFamily].fontName;\n fontClasses = [fontOrFamily];\n } else {\n fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);\n fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];\n }\n\n if (lookupSymbol(text, fontName, mode).metrics) {\n return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));\n } else if (ligatures.hasOwnProperty(text) && fontName.slice(0, 10) === \"Typewriter\") {\n // Deconstruct ligatures in monospace fonts (\\texttt, \\tt).\n var parts = [];\n\n for (var i = 0; i < text.length; i++) {\n parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));\n }\n\n return makeFragment(parts);\n }\n } // Makes a symbol in the default font for mathords and textords.\n\n\n if (type === \"mathord\") {\n return makeSymbol(text, \"Math-Italic\", mode, options, classes.concat([\"mathnormal\"]));\n } else if (type === \"textord\") {\n var font = src_symbols[mode][text] && src_symbols[mode][text].font;\n\n if (font === \"ams\") {\n var _fontName = retrieveTextFontName(\"amsrm\", options.fontWeight, options.fontShape);\n\n return makeSymbol(text, _fontName, mode, options, classes.concat(\"amsrm\", options.fontWeight, options.fontShape));\n } else if (font === \"main\" || !font) {\n var _fontName2 = retrieveTextFontName(\"textrm\", options.fontWeight, options.fontShape);\n\n return makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));\n } else {\n // fonts added by plugins\n var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class\n\n\n return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));\n }\n } else {\n throw new Error(\"unexpected type: \" + type + \" in makeOrd\");\n }\n};\n/**\n * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,\n * and styles.\n */\n\n\nvar canCombine = function canCombine(prev, next) {\n if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) {\n return false;\n } // If prev and next both are just \"mbin\"s or \"mord\"s we don't combine them\n // so that the proper spacing can be preserved.\n\n\n if (prev.classes.length === 1) {\n var cls = prev.classes[0];\n\n if (cls === \"mbin\" || cls === \"mord\") {\n return false;\n }\n }\n\n for (var style in prev.style) {\n if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {\n return false;\n }\n }\n\n for (var _style in next.style) {\n if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) {\n return false;\n }\n }\n\n return true;\n};\n/**\n * Combine consecutive domTree.symbolNodes into a single symbolNode.\n * Note: this function mutates the argument.\n */\n\n\nvar tryCombineChars = function tryCombineChars(chars) {\n for (var i = 0; i < chars.length - 1; i++) {\n var prev = chars[i];\n var next = chars[i + 1];\n\n if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {\n prev.text += next.text;\n prev.height = Math.max(prev.height, next.height);\n prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use\n // it to add padding to the right of the span created from\n // the combined characters.\n\n prev.italic = next.italic;\n chars.splice(i + 1, 1);\n i--;\n }\n }\n\n return chars;\n};\n/**\n * Calculate the height, depth, and maxFontSize of an element based on its\n * children.\n */\n\n\nvar sizeElementFromChildren = function sizeElementFromChildren(elem) {\n var height = 0;\n var depth = 0;\n var maxFontSize = 0;\n\n for (var i = 0; i < elem.children.length; i++) {\n var child = elem.children[i];\n\n if (child.height > height) {\n height = child.height;\n }\n\n if (child.depth > depth) {\n depth = child.depth;\n }\n\n if (child.maxFontSize > maxFontSize) {\n maxFontSize = child.maxFontSize;\n }\n }\n\n elem.height = height;\n elem.depth = depth;\n elem.maxFontSize = maxFontSize;\n};\n/**\n * Makes a span with the given list of classes, list of children, and options.\n *\n * TODO(#953): Ensure that `options` is always provided (currently some call\n * sites don't pass it) and make the type below mandatory.\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n */\n\n\nvar makeSpan = function makeSpan(classes, children, options, style) {\n var span = new Span(classes, children, options, style);\n sizeElementFromChildren(span);\n return span;\n}; // SVG one is simpler -- doesn't require height, depth, max-font setting.\n// This is also a separate method for typesafety.\n\n\nvar makeSvgSpan = function makeSvgSpan(classes, children, options, style) {\n return new Span(classes, children, options, style);\n};\n\nvar makeLineSpan = function makeLineSpan(className, options, thickness) {\n var line = makeSpan([className], [], options);\n line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n line.style.borderBottomWidth = makeEm(line.height);\n line.maxFontSize = 1.0;\n return line;\n};\n/**\n * Makes an anchor with the given href, list of classes, list of children,\n * and options.\n */\n\n\nvar makeAnchor = function makeAnchor(href, classes, children, options) {\n var anchor = new Anchor(href, classes, children, options);\n sizeElementFromChildren(anchor);\n return anchor;\n};\n/**\n * Makes a document fragment with the given list of children.\n */\n\n\nvar makeFragment = function makeFragment(children) {\n var fragment = new DocumentFragment(children);\n sizeElementFromChildren(fragment);\n return fragment;\n};\n/**\n * Wraps group in a span if it's a document fragment, allowing to apply classes\n * and styles\n */\n\n\nvar wrapFragment = function wrapFragment(group, options) {\n if (group instanceof DocumentFragment) {\n return makeSpan([], [group], options);\n }\n\n return group;\n}; // These are exact object types to catch typos in the names of the optional fields.\n\n\n// Computes the updated `children` list and the overall depth.\n//\n// This helper function for makeVList makes it easier to enforce type safety by\n// allowing early exits (returns) in the logic.\nvar getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {\n if (params.positionType === \"individualShift\") {\n var oldChildren = params.children;\n var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be\n // shifted to the correct specified shift\n\n var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;\n\n var currPos = _depth;\n\n for (var i = 1; i < oldChildren.length; i++) {\n var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;\n var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);\n currPos = currPos + diff;\n children.push({\n type: \"kern\",\n size: size\n });\n children.push(oldChildren[i]);\n }\n\n return {\n children: children,\n depth: _depth\n };\n }\n\n var depth;\n\n if (params.positionType === \"top\") {\n // We always start at the bottom, so calculate the bottom by adding up\n // all the sizes\n var bottom = params.positionData;\n\n for (var _i = 0; _i < params.children.length; _i++) {\n var child = params.children[_i];\n bottom -= child.type === \"kern\" ? child.size : child.elem.height + child.elem.depth;\n }\n\n depth = bottom;\n } else if (params.positionType === \"bottom\") {\n depth = -params.positionData;\n } else {\n var firstChild = params.children[0];\n\n if (firstChild.type !== \"elem\") {\n throw new Error('First child must have type \"elem\".');\n }\n\n if (params.positionType === \"shift\") {\n depth = -firstChild.elem.depth - params.positionData;\n } else if (params.positionType === \"firstBaseline\") {\n depth = -firstChild.elem.depth;\n } else {\n throw new Error(\"Invalid positionType \" + params.positionType + \".\");\n }\n }\n\n return {\n children: params.children,\n depth: depth\n };\n};\n/**\n * Makes a vertical list by stacking elements and kerns on top of each other.\n * Allows for many different ways of specifying the positioning method.\n *\n * See VListParam documentation above.\n */\n\n\nvar makeVList = function makeVList(params, options) {\n var _getVListChildrenAndD = getVListChildrenAndDepth(params),\n children = _getVListChildrenAndD.children,\n depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to\n // each item, where it will determine the item's baseline. Since it has\n // `overflow:hidden`, the strut's top edge will sit on the item's line box's\n // top edge and the strut's bottom edge will sit on the item's baseline,\n // with no additional line-height spacing. This allows the item baseline to\n // be positioned precisely without worrying about font ascent and\n // line-height.\n\n\n var pstrutSize = 0;\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n\n if (child.type === \"elem\") {\n var elem = child.elem;\n pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);\n }\n }\n\n pstrutSize += 2;\n var pstrut = makeSpan([\"pstrut\"], []);\n pstrut.style.height = makeEm(pstrutSize); // Create a new list of actual children at the correct offsets\n\n var realChildren = [];\n var minPos = depth;\n var maxPos = depth;\n var currPos = depth;\n\n for (var _i2 = 0; _i2 < children.length; _i2++) {\n var _child = children[_i2];\n\n if (_child.type === \"kern\") {\n currPos += _child.size;\n } else {\n var _elem = _child.elem;\n var classes = _child.wrapperClasses || [];\n var style = _child.wrapperStyle || {};\n var childWrap = makeSpan(classes, [pstrut, _elem], undefined, style);\n childWrap.style.top = makeEm(-pstrutSize - currPos - _elem.depth);\n\n if (_child.marginLeft) {\n childWrap.style.marginLeft = _child.marginLeft;\n }\n\n if (_child.marginRight) {\n childWrap.style.marginRight = _child.marginRight;\n }\n\n realChildren.push(childWrap);\n currPos += _elem.height + _elem.depth;\n }\n\n minPos = Math.min(minPos, currPos);\n maxPos = Math.max(maxPos, currPos);\n } // The vlist contents go in a table-cell with `vertical-align:bottom`.\n // This cell's bottom edge will determine the containing table's baseline\n // without overly expanding the containing line-box.\n\n\n var vlist = makeSpan([\"vlist\"], realChildren);\n vlist.style.height = makeEm(maxPos); // A second row is used if necessary to represent the vlist's depth.\n\n var rows;\n\n if (minPos < 0) {\n // We will define depth in an empty span with display: table-cell.\n // It should render with the height that we define. But Chrome, in\n // contenteditable mode only, treats that span as if it contains some\n // text content. And that min-height over-rides our desired height.\n // So we put another empty span inside the depth strut span.\n var emptySpan = makeSpan([], []);\n var depthStrut = makeSpan([\"vlist\"], [emptySpan]);\n depthStrut.style.height = makeEm(-minPos); // Safari wants the first row to have inline content; otherwise it\n // puts the bottom of the *second* row on the baseline.\n\n var topStrut = makeSpan([\"vlist-s\"], [new SymbolNode(\"\\u200B\")]);\n rows = [makeSpan([\"vlist-r\"], [vlist, topStrut]), makeSpan([\"vlist-r\"], [depthStrut])];\n } else {\n rows = [makeSpan([\"vlist-r\"], [vlist])];\n }\n\n var vtable = makeSpan([\"vlist-t\"], rows);\n\n if (rows.length === 2) {\n vtable.classes.push(\"vlist-t2\");\n }\n\n vtable.height = maxPos;\n vtable.depth = -minPos;\n return vtable;\n}; // Glue is a concept from TeX which is a flexible space between elements in\n// either a vertical or horizontal list. In KaTeX, at least for now, it's\n// static space between elements in a horizontal layout.\n\n\nvar makeGlue = function makeGlue(measurement, options) {\n // Make an empty span for the space\n var rule = makeSpan([\"mspace\"], [], options);\n var size = calculateSize(measurement, options);\n rule.style.marginRight = makeEm(size);\n return rule;\n}; // Takes font options, and returns the appropriate fontLookup name\n\n\nvar retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {\n var baseFontName = \"\";\n\n switch (fontFamily) {\n case \"amsrm\":\n baseFontName = \"AMS\";\n break;\n\n case \"textrm\":\n baseFontName = \"Main\";\n break;\n\n case \"textsf\":\n baseFontName = \"SansSerif\";\n break;\n\n case \"texttt\":\n baseFontName = \"Typewriter\";\n break;\n\n default:\n baseFontName = fontFamily;\n // use fonts added by a plugin\n }\n\n var fontStylesName;\n\n if (fontWeight === \"textbf\" && fontShape === \"textit\") {\n fontStylesName = \"BoldItalic\";\n } else if (fontWeight === \"textbf\") {\n fontStylesName = \"Bold\";\n } else if (fontWeight === \"textit\") {\n fontStylesName = \"Italic\";\n } else {\n fontStylesName = \"Regular\";\n }\n\n return baseFontName + \"-\" + fontStylesName;\n};\n/**\n * Maps TeX font commands to objects containing:\n * - variant: string used for \"mathvariant\" attribute in buildMathML.js\n * - fontName: the \"style\" parameter to fontMetrics.getCharacterMetrics\n */\n// A map between tex font commands an MathML mathvariant attribute values\n\n\nvar fontMap = {\n // styles\n \"mathbf\": {\n variant: \"bold\",\n fontName: \"Main-Bold\"\n },\n \"mathrm\": {\n variant: \"normal\",\n fontName: \"Main-Regular\"\n },\n \"textit\": {\n variant: \"italic\",\n fontName: \"Main-Italic\"\n },\n \"mathit\": {\n variant: \"italic\",\n fontName: \"Main-Italic\"\n },\n \"mathnormal\": {\n variant: \"italic\",\n fontName: \"Math-Italic\"\n },\n // \"boldsymbol\" is missing because they require the use of multiple fonts:\n // Math-BoldItalic and Main-Bold. This is handled by a special case in\n // makeOrd which ends up calling boldsymbol.\n // families\n \"mathbb\": {\n variant: \"double-struck\",\n fontName: \"AMS-Regular\"\n },\n \"mathcal\": {\n variant: \"script\",\n fontName: \"Caligraphic-Regular\"\n },\n \"mathfrak\": {\n variant: \"fraktur\",\n fontName: \"Fraktur-Regular\"\n },\n \"mathscr\": {\n variant: \"script\",\n fontName: \"Script-Regular\"\n },\n \"mathsf\": {\n variant: \"sans-serif\",\n fontName: \"SansSerif-Regular\"\n },\n \"mathtt\": {\n variant: \"monospace\",\n fontName: \"Typewriter-Regular\"\n }\n};\nvar svgData = {\n // path, width, height\n vec: [\"vec\", 0.471, 0.714],\n // values from the font glyph\n oiintSize1: [\"oiintSize1\", 0.957, 0.499],\n // oval to overlay the integrand\n oiintSize2: [\"oiintSize2\", 1.472, 0.659],\n oiiintSize1: [\"oiiintSize1\", 1.304, 0.499],\n oiiintSize2: [\"oiiintSize2\", 1.98, 0.659]\n};\n\nvar staticSvg = function staticSvg(value, options) {\n // Create a span with inline SVG for the element.\n var _svgData$value = svgData[value],\n pathName = _svgData$value[0],\n width = _svgData$value[1],\n height = _svgData$value[2];\n var path = new PathNode(pathName);\n var svgNode = new SvgNode([path], {\n \"width\": makeEm(width),\n \"height\": makeEm(height),\n // Override CSS rule `.katex svg { width: 100% }`\n \"style\": \"width:\" + makeEm(width),\n \"viewBox\": \"0 0 \" + 1000 * width + \" \" + 1000 * height,\n \"preserveAspectRatio\": \"xMinYMin\"\n });\n var span = makeSvgSpan([\"overlay\"], [svgNode], options);\n span.height = height;\n span.style.height = makeEm(height);\n span.style.width = makeEm(width);\n return span;\n};\n\n/* harmony default export */ var buildCommon = ({\n fontMap: fontMap,\n makeSymbol: makeSymbol,\n mathsym: mathsym,\n makeSpan: makeSpan,\n makeSvgSpan: makeSvgSpan,\n makeLineSpan: makeLineSpan,\n makeAnchor: makeAnchor,\n makeFragment: makeFragment,\n wrapFragment: wrapFragment,\n makeVList: makeVList,\n makeOrd: makeOrd,\n makeGlue: makeGlue,\n staticSvg: staticSvg,\n svgData: svgData,\n tryCombineChars: tryCombineChars\n});\n;// CONCATENATED MODULE: ./src/spacingData.js\n/**\n * Describes spaces between different classes of atoms.\n */\nvar thinspace = {\n number: 3,\n unit: \"mu\"\n};\nvar mediumspace = {\n number: 4,\n unit: \"mu\"\n};\nvar thickspace = {\n number: 5,\n unit: \"mu\"\n}; // Making the type below exact with all optional fields doesn't work due to\n// - https://github.com/facebook/flow/issues/4582\n// - https://github.com/facebook/flow/issues/5688\n// However, since *all* fields are optional, $Shape<> works as suggested in 5688\n// above.\n\n// Spacing relationships for display and text styles\nvar spacings = {\n mord: {\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n minner: thinspace\n },\n mop: {\n mord: thinspace,\n mop: thinspace,\n mrel: thickspace,\n minner: thinspace\n },\n mbin: {\n mord: mediumspace,\n mop: mediumspace,\n mopen: mediumspace,\n minner: mediumspace\n },\n mrel: {\n mord: thickspace,\n mop: thickspace,\n mopen: thickspace,\n minner: thickspace\n },\n mopen: {},\n mclose: {\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n minner: thinspace\n },\n mpunct: {\n mord: thinspace,\n mop: thinspace,\n mrel: thickspace,\n mopen: thinspace,\n mclose: thinspace,\n mpunct: thinspace,\n minner: thinspace\n },\n minner: {\n mord: thinspace,\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n mopen: thinspace,\n mpunct: thinspace,\n minner: thinspace\n }\n}; // Spacing relationships for script and scriptscript styles\n\nvar tightSpacings = {\n mord: {\n mop: thinspace\n },\n mop: {\n mord: thinspace,\n mop: thinspace\n },\n mbin: {},\n mrel: {},\n mopen: {},\n mclose: {\n mop: thinspace\n },\n mpunct: {},\n minner: {\n mop: thinspace\n }\n};\n;// CONCATENATED MODULE: ./src/defineFunction.js\n/** Context provided to function handlers for error messages. */\n// Note: reverse the order of the return type union will cause a flow error.\n// See https://github.com/facebook/flow/issues/3663.\n// More general version of `HtmlBuilder` for nodes (e.g. \\sum, accent types)\n// whose presence impacts super/subscripting. In this case, ParseNode<\"supsub\">\n// delegates its HTML building to the HtmlBuilder corresponding to these nodes.\n\n/**\n * Final function spec for use at parse time.\n * This is almost identical to `FunctionPropSpec`, except it\n * 1. includes the function handler, and\n * 2. requires all arguments except argTypes.\n * It is generated by `defineFunction()` below.\n */\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nvar _functions = {};\n/**\n * All HTML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\n\nvar _htmlGroupBuilders = {};\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\n\nvar _mathmlGroupBuilders = {};\nfunction defineFunction(_ref) {\n var type = _ref.type,\n names = _ref.names,\n props = _ref.props,\n handler = _ref.handler,\n htmlBuilder = _ref.htmlBuilder,\n mathmlBuilder = _ref.mathmlBuilder;\n // Set default values of functions\n var data = {\n type: type,\n numArgs: props.numArgs,\n argTypes: props.argTypes,\n allowedInArgument: !!props.allowedInArgument,\n allowedInText: !!props.allowedInText,\n allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n numOptionalArgs: props.numOptionalArgs || 0,\n infix: !!props.infix,\n primitive: !!props.primitive,\n handler: handler\n };\n\n for (var i = 0; i < names.length; ++i) {\n _functions[names[i]] = data;\n }\n\n if (type) {\n if (htmlBuilder) {\n _htmlGroupBuilders[type] = htmlBuilder;\n }\n\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n }\n}\n/**\n * Use this to register only the HTML and MathML builders for a function (e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\n\nfunction defineFunctionBuilders(_ref2) {\n var type = _ref2.type,\n htmlBuilder = _ref2.htmlBuilder,\n mathmlBuilder = _ref2.mathmlBuilder;\n defineFunction({\n type: type,\n names: [],\n props: {\n numArgs: 0\n },\n handler: function handler() {\n throw new Error('Should never be called.');\n },\n htmlBuilder: htmlBuilder,\n mathmlBuilder: mathmlBuilder\n });\n}\nvar normalizeArgument = function normalizeArgument(arg) {\n return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg;\n}; // Since the corresponding buildHTML/buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\n\nvar ordargument = function ordargument(arg) {\n return arg.type === \"ordgroup\" ? arg.body : [arg];\n};\n;// CONCATENATED MODULE: ./src/buildHTML.js\n/**\n * This file does the main work of building a domTree structure from a parse\n * tree. The entry point is the `buildHTML` function, which takes a parse tree.\n * Then, the buildExpression, buildGroup, and various groupBuilders functions\n * are called, to produce a final HTML tree.\n */\n\n\n\n\n\n\n\n\n\nvar buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)\n// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,\n// and the text before Rule 19.\n\nvar binLeftCanceller = [\"leftmost\", \"mbin\", \"mopen\", \"mrel\", \"mop\", \"mpunct\"];\nvar binRightCanceller = [\"rightmost\", \"mrel\", \"mclose\", \"mpunct\"];\nvar styleMap = {\n \"display\": src_Style.DISPLAY,\n \"text\": src_Style.TEXT,\n \"script\": src_Style.SCRIPT,\n \"scriptscript\": src_Style.SCRIPTSCRIPT\n};\nvar DomEnum = {\n mord: \"mord\",\n mop: \"mop\",\n mbin: \"mbin\",\n mrel: \"mrel\",\n mopen: \"mopen\",\n mclose: \"mclose\",\n mpunct: \"mpunct\",\n minner: \"minner\"\n};\n\n/**\n * Take a list of nodes, build them in order, and return a list of the built\n * nodes. documentFragments are flattened into their contents, so the\n * returned list contains no fragments. `isRealGroup` is true if `expression`\n * is a real group (no atoms will be added on either side), as opposed to\n * a partial group (e.g. one created by \\color). `surrounding` is an array\n * consisting type of nodes that will be added to the left and right.\n */\nvar buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) {\n if (surrounding === void 0) {\n surrounding = [null, null];\n }\n\n // Parse expressions into `groups`.\n var groups = [];\n\n for (var i = 0; i < expression.length; i++) {\n var output = buildGroup(expression[i], options);\n\n if (output instanceof DocumentFragment) {\n var children = output.children;\n groups.push.apply(groups, children);\n } else {\n groups.push(output);\n }\n } // Combine consecutive domTree.symbolNodes into a single symbolNode.\n\n\n buildCommon.tryCombineChars(groups); // If `expression` is a partial group, let the parent handle spacings\n // to avoid processing groups multiple times.\n\n if (!isRealGroup) {\n return groups;\n }\n\n var glueOptions = options;\n\n if (expression.length === 1) {\n var node = expression[0];\n\n if (node.type === \"sizing\") {\n glueOptions = options.havingSize(node.size);\n } else if (node.type === \"styling\") {\n glueOptions = options.havingStyle(styleMap[node.style]);\n }\n } // Dummy spans for determining spacings between surrounding atoms.\n // If `expression` has no atoms on the left or right, class \"leftmost\"\n // or \"rightmost\", respectively, is used to indicate it.\n\n\n var dummyPrev = buildHTML_makeSpan([surrounding[0] || \"leftmost\"], [], options);\n var dummyNext = buildHTML_makeSpan([surrounding[1] || \"rightmost\"], [], options); // TODO: These code assumes that a node's math class is the first element\n // of its `classes` array. A later cleanup should ensure this, for\n // instance by changing the signature of `makeSpan`.\n // Before determining what spaces to insert, perform bin cancellation.\n // Binary operators change to ordinary symbols in some contexts.\n\n var isRoot = isRealGroup === \"root\";\n traverseNonSpaceNodes(groups, function (node, prev) {\n var prevType = prev.classes[0];\n var type = node.classes[0];\n\n if (prevType === \"mbin\" && utils.contains(binRightCanceller, type)) {\n prev.classes[0] = \"mord\";\n } else if (type === \"mbin\" && utils.contains(binLeftCanceller, prevType)) {\n node.classes[0] = \"mord\";\n }\n }, {\n node: dummyPrev\n }, dummyNext, isRoot);\n traverseNonSpaceNodes(groups, function (node, prev) {\n var prevType = getTypeOfDomTree(prev);\n var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.\n\n var space = prevType && type ? node.hasClass(\"mtight\") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;\n\n if (space) {\n // Insert glue (spacing) after the `prev`.\n return buildCommon.makeGlue(space, glueOptions);\n }\n }, {\n node: dummyPrev\n }, dummyNext, isRoot);\n return groups;\n}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and\n// previous node as arguments, optionally returning a node to insert after the\n// previous node. `prev` is an object with the previous node and `insertAfter`\n// function to insert after it. `next` is a node that will be added to the right.\n// Used for bin cancellation and inserting spacings.\n\nvar traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) {\n if (next) {\n // temporarily append the right node, if exists\n nodes.push(next);\n }\n\n var i = 0;\n\n for (; i < nodes.length; i++) {\n var node = nodes[i];\n var partialGroup = checkPartialGroup(node);\n\n if (partialGroup) {\n // Recursive DFS\n // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array\n traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot);\n continue;\n } // Ignore explicit spaces (e.g., \\;, \\,) when determining what implicit\n // spacing should go between atoms of different classes\n\n\n var nonspace = !node.hasClass(\"mspace\");\n\n if (nonspace) {\n var result = callback(node, prev.node);\n\n if (result) {\n if (prev.insertAfter) {\n prev.insertAfter(result);\n } else {\n // insert at front\n nodes.unshift(result);\n i++;\n }\n }\n }\n\n if (nonspace) {\n prev.node = node;\n } else if (isRoot && node.hasClass(\"newline\")) {\n prev.node = buildHTML_makeSpan([\"leftmost\"]); // treat like beginning of line\n }\n\n prev.insertAfter = function (index) {\n return function (n) {\n nodes.splice(index + 1, 0, n);\n i++;\n };\n }(i);\n }\n\n if (next) {\n nodes.pop();\n }\n}; // Check if given node is a partial group, i.e., does not affect spacing around.\n\n\nvar checkPartialGroup = function checkPartialGroup(node) {\n if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass(\"enclosing\")) {\n return node;\n }\n\n return null;\n}; // Return the outermost node of a domTree.\n\n\nvar getOutermostNode = function getOutermostNode(node, side) {\n var partialGroup = checkPartialGroup(node);\n\n if (partialGroup) {\n var children = partialGroup.children;\n\n if (children.length) {\n if (side === \"right\") {\n return getOutermostNode(children[children.length - 1], \"right\");\n } else if (side === \"left\") {\n return getOutermostNode(children[0], \"left\");\n }\n }\n }\n\n return node;\n}; // Return math atom class (mclass) of a domTree.\n// If `side` is given, it will get the type of the outermost node at given side.\n\n\nvar getTypeOfDomTree = function getTypeOfDomTree(node, side) {\n if (!node) {\n return null;\n }\n\n if (side) {\n node = getOutermostNode(node, side);\n } // This makes a lot of assumptions as to where the type of atom\n // appears. We should do a better job of enforcing this.\n\n\n return DomEnum[node.classes[0]] || null;\n};\nvar makeNullDelimiter = function makeNullDelimiter(options, classes) {\n var moreClasses = [\"nulldelimiter\"].concat(options.baseSizingClasses());\n return buildHTML_makeSpan(classes.concat(moreClasses));\n};\n/**\n * buildGroup is the function that takes a group and calls the correct groupType\n * function for it. It also handles the interaction of size and style changes\n * between parents and children.\n */\n\nvar buildGroup = function buildGroup(group, options, baseOptions) {\n if (!group) {\n return buildHTML_makeSpan();\n }\n\n if (_htmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n // $FlowFixMe\n var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account\n // for that size difference.\n\n if (baseOptions && options.size !== baseOptions.size) {\n groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options);\n var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n groupNode.height *= multiplier;\n groupNode.depth *= multiplier;\n }\n\n return groupNode;\n } else {\n throw new src_ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n/**\n * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)\n * into an unbreakable HTML node of class .base, with proper struts to\n * guarantee correct vertical extent. `buildHTML` calls this repeatedly to\n * make up the entire expression as a sequence of unbreakable units.\n */\n\nfunction buildHTMLUnbreakable(children, options) {\n // Compute height and depth of this chunk.\n var body = buildHTML_makeSpan([\"base\"], children, options); // Add strut, which ensures that the top of the HTML element falls at\n // the height of the expression, and the bottom of the HTML element\n // falls at the depth of the expression.\n\n var strut = buildHTML_makeSpan([\"strut\"]);\n strut.style.height = makeEm(body.height + body.depth);\n\n if (body.depth) {\n strut.style.verticalAlign = makeEm(-body.depth);\n }\n\n body.children.unshift(strut);\n return body;\n}\n/**\n * Take an entire parse tree, and build it into an appropriate set of HTML\n * nodes.\n */\n\n\nfunction buildHTML(tree, options) {\n // Strip off outer tag wrapper for processing below.\n var tag = null;\n\n if (tree.length === 1 && tree[0].type === \"tag\") {\n tag = tree[0].tag;\n tree = tree[0].body;\n } // Build the expression contained in the tree\n\n\n var expression = buildExpression(tree, options, \"root\");\n var eqnNum;\n\n if (expression.length === 2 && expression[1].hasClass(\"tag\")) {\n // An environment with automatic equation numbers, e.g. {gather}.\n eqnNum = expression.pop();\n }\n\n var children = []; // Create one base node for each chunk between potential line breaks.\n // The TeXBook [p.173] says \"A formula will be broken only after a\n // relation symbol like $=$ or $<$ or $\\rightarrow$, or after a binary\n // operation symbol like $+$ or $-$ or $\\times$, where the relation or\n // binary operation is on the ``outer level'' of the formula (i.e., not\n // enclosed in {...} and not part of an \\over construction).\"\n\n var parts = [];\n\n for (var i = 0; i < expression.length; i++) {\n parts.push(expression[i]);\n\n if (expression[i].hasClass(\"mbin\") || expression[i].hasClass(\"mrel\") || expression[i].hasClass(\"allowbreak\")) {\n // Put any post-operator glue on same line as operator.\n // Watch for \\nobreak along the way, and stop at \\newline.\n var nobreak = false;\n\n while (i < expression.length - 1 && expression[i + 1].hasClass(\"mspace\") && !expression[i + 1].hasClass(\"newline\")) {\n i++;\n parts.push(expression[i]);\n\n if (expression[i].hasClass(\"nobreak\")) {\n nobreak = true;\n }\n } // Don't allow break if \\nobreak among the post-operator glue.\n\n\n if (!nobreak) {\n children.push(buildHTMLUnbreakable(parts, options));\n parts = [];\n }\n } else if (expression[i].hasClass(\"newline\")) {\n // Write the line except the newline\n parts.pop();\n\n if (parts.length > 0) {\n children.push(buildHTMLUnbreakable(parts, options));\n parts = [];\n } // Put the newline at the top level\n\n\n children.push(expression[i]);\n }\n }\n\n if (parts.length > 0) {\n children.push(buildHTMLUnbreakable(parts, options));\n } // Now, if there was a tag, build it too and append it as a final child.\n\n\n var tagChild;\n\n if (tag) {\n tagChild = buildHTMLUnbreakable(buildExpression(tag, options, true));\n tagChild.classes = [\"tag\"];\n children.push(tagChild);\n } else if (eqnNum) {\n children.push(eqnNum);\n }\n\n var htmlNode = buildHTML_makeSpan([\"katex-html\"], children);\n htmlNode.setAttribute(\"aria-hidden\", \"true\"); // Adjust the strut of the tag to be the maximum height of all children\n // (the height of the enclosing htmlNode) for proper vertical alignment.\n\n if (tagChild) {\n var strut = tagChild.children[0];\n strut.style.height = makeEm(htmlNode.height + htmlNode.depth);\n\n if (htmlNode.depth) {\n strut.style.verticalAlign = makeEm(-htmlNode.depth);\n }\n }\n\n return htmlNode;\n}\n;// CONCATENATED MODULE: ./src/mathMLTree.js\n/**\n * These objects store data about MathML nodes. This is the MathML equivalent\n * of the types in domTree.js. Since MathML handles its own rendering, and\n * since we're mainly using MathML to improve accessibility, we don't manage\n * any of the styling state that the plain DOM nodes do.\n *\n * The `toNode` and `toMarkup` functions work simlarly to how they do in\n * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.\n */\n\n\n\n\nfunction newDocumentFragment(children) {\n return new DocumentFragment(children);\n}\n/**\n * This node represents a general purpose MathML node of any type. The\n * constructor requires the type of node to create (for example, `\"mo\"` or\n * `\"mspace\"`, corresponding to `<mo>` and `<mspace>` tags).\n */\n\nvar MathNode = /*#__PURE__*/function () {\n function MathNode(type, children, classes) {\n this.type = void 0;\n this.attributes = void 0;\n this.children = void 0;\n this.classes = void 0;\n this.type = type;\n this.attributes = {};\n this.children = children || [];\n this.classes = classes || [];\n }\n /**\n * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n * semantic content, so this is used heavily.\n */\n\n\n var _proto = MathNode.prototype;\n\n _proto.setAttribute = function setAttribute(name, value) {\n this.attributes[name] = value;\n }\n /**\n * Gets an attribute on a MathML node.\n */\n ;\n\n _proto.getAttribute = function getAttribute(name) {\n return this.attributes[name];\n }\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n ;\n\n _proto.toNode = function toNode() {\n var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n\n for (var i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n }\n /**\n * Converts the math node into an HTML markup string.\n */\n ;\n\n _proto.toMarkup = function toMarkup() {\n var markup = \"<\" + this.type; // Add the attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + \"=\\\"\";\n markup += utils.escape(this.attributes[attr]);\n markup += \"\\\"\";\n }\n }\n\n if (this.classes.length > 0) {\n markup += \" class =\\\"\" + utils.escape(createClass(this.classes)) + \"\\\"\";\n }\n\n markup += \">\";\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"</\" + this.type + \">\";\n return markup;\n }\n /**\n * Converts the math node into a string, similar to innerText, but escaped.\n */\n ;\n\n _proto.toText = function toText() {\n return this.children.map(function (child) {\n return child.toText();\n }).join(\"\");\n };\n\n return MathNode;\n}();\n/**\n * This node represents a piece of text.\n */\n\nvar TextNode = /*#__PURE__*/function () {\n function TextNode(text) {\n this.text = void 0;\n this.text = text;\n }\n /**\n * Converts the text node into a DOM text node.\n */\n\n\n var _proto2 = TextNode.prototype;\n\n _proto2.toNode = function toNode() {\n return document.createTextNode(this.text);\n }\n /**\n * Converts the text node into escaped HTML markup\n * (representing the text itself).\n */\n ;\n\n _proto2.toMarkup = function toMarkup() {\n return utils.escape(this.toText());\n }\n /**\n * Converts the text node into a string\n * (representing the text iteself).\n */\n ;\n\n _proto2.toText = function toText() {\n return this.text;\n };\n\n return TextNode;\n}();\n/**\n * This node represents a space, but may render as <mspace.../> or as text,\n * depending on the width.\n */\n\nvar SpaceNode = /*#__PURE__*/function () {\n /**\n * Create a Space node with width given in CSS ems.\n */\n function SpaceNode(width) {\n this.width = void 0;\n this.character = void 0;\n this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html\n // for a table of space-like characters. We use Unicode\n // representations instead of &LongNames; as it's not clear how to\n // make the latter via document.createTextNode.\n\n if (width >= 0.05555 && width <= 0.05556) {\n this.character = \"\\u200A\"; // &VeryThinSpace;\n } else if (width >= 0.1666 && width <= 0.1667) {\n this.character = \"\\u2009\"; // &ThinSpace;\n } else if (width >= 0.2222 && width <= 0.2223) {\n this.character = \"\\u2005\"; // &MediumSpace;\n } else if (width >= 0.2777 && width <= 0.2778) {\n this.character = \"\\u2005\\u200A\"; // &ThickSpace;\n } else if (width >= -0.05556 && width <= -0.05555) {\n this.character = \"\\u200A\\u2063\"; // &NegativeVeryThinSpace;\n } else if (width >= -0.1667 && width <= -0.1666) {\n this.character = \"\\u2009\\u2063\"; // &NegativeThinSpace;\n } else if (width >= -0.2223 && width <= -0.2222) {\n this.character = \"\\u205F\\u2063\"; // &NegativeMediumSpace;\n } else if (width >= -0.2778 && width <= -0.2777) {\n this.character = \"\\u2005\\u2063\"; // &NegativeThickSpace;\n } else {\n this.character = null;\n }\n }\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n\n\n var _proto3 = SpaceNode.prototype;\n\n _proto3.toNode = function toNode() {\n if (this.character) {\n return document.createTextNode(this.character);\n } else {\n var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mspace\");\n node.setAttribute(\"width\", makeEm(this.width));\n return node;\n }\n }\n /**\n * Converts the math node into an HTML markup string.\n */\n ;\n\n _proto3.toMarkup = function toMarkup() {\n if (this.character) {\n return \"<mtext>\" + this.character + \"</mtext>\";\n } else {\n return \"<mspace width=\\\"\" + makeEm(this.width) + \"\\\"/>\";\n }\n }\n /**\n * Converts the math node into a string, similar to innerText.\n */\n ;\n\n _proto3.toText = function toText() {\n if (this.character) {\n return this.character;\n } else {\n return \" \";\n }\n };\n\n return SpaceNode;\n}();\n\n/* harmony default export */ var mathMLTree = ({\n MathNode: MathNode,\n TextNode: TextNode,\n SpaceNode: SpaceNode,\n newDocumentFragment: newDocumentFragment\n});\n;// CONCATENATED MODULE: ./src/buildMathML.js\n/**\n * This file converts a parse tree into a cooresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n\n\n\n\n\n\n\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nvar makeText = function makeText(text, mode, options) {\n if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.slice(4, 6) === \"tt\" || options.font && options.font.slice(4, 6) === \"tt\"))) {\n text = src_symbols[mode][text].replace;\n }\n\n return new mathMLTree.TextNode(text);\n};\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1. Always returns a single node.\n */\n\nvar makeRow = function makeRow(body) {\n if (body.length === 1) {\n return body[0];\n } else {\n return new mathMLTree.MathNode(\"mrow\", body);\n }\n};\n/**\n * Returns the math variant as a string or null if none is required.\n */\n\nvar getVariant = function getVariant(group, options) {\n // Handle \\text... font specifiers as best we can.\n // MathML has a limited list of allowable mathvariant specifiers; see\n // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt\n if (options.fontFamily === \"texttt\") {\n return \"monospace\";\n } else if (options.fontFamily === \"textsf\") {\n if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n return \"sans-serif-bold-italic\";\n } else if (options.fontShape === \"textit\") {\n return \"sans-serif-italic\";\n } else if (options.fontWeight === \"textbf\") {\n return \"bold-sans-serif\";\n } else {\n return \"sans-serif\";\n }\n } else if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n return \"bold-italic\";\n } else if (options.fontShape === \"textit\") {\n return \"italic\";\n } else if (options.fontWeight === \"textbf\") {\n return \"bold\";\n }\n\n var font = options.font;\n\n if (!font || font === \"mathnormal\") {\n return null;\n }\n\n var mode = group.mode;\n\n if (font === \"mathit\") {\n return \"italic\";\n } else if (font === \"boldsymbol\") {\n return group.type === \"textord\" ? \"bold\" : \"bold-italic\";\n } else if (font === \"mathbf\") {\n return \"bold\";\n } else if (font === \"mathbb\") {\n return \"double-struck\";\n } else if (font === \"mathfrak\") {\n return \"fraktur\";\n } else if (font === \"mathscr\" || font === \"mathcal\") {\n // MathML makes no distinction between script and caligrahpic\n return \"script\";\n } else if (font === \"mathsf\") {\n return \"sans-serif\";\n } else if (font === \"mathtt\") {\n return \"monospace\";\n }\n\n var text = group.text;\n\n if (utils.contains([\"\\\\imath\", \"\\\\jmath\"], text)) {\n return null;\n }\n\n if (src_symbols[mode][text] && src_symbols[mode][text].replace) {\n text = src_symbols[mode][text].replace;\n }\n\n var fontName = buildCommon.fontMap[font].fontName;\n\n if (getCharacterMetrics(text, fontName, mode)) {\n return buildCommon.fontMap[font].variant;\n }\n\n return null;\n};\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes. Also combine consecutive <mtext> outputs into a single\n * <mtext> tag.\n */\n\nvar buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) {\n if (expression.length === 1) {\n var group = buildMathML_buildGroup(expression[0], options);\n\n if (isOrdgroup && group instanceof MathNode && group.type === \"mo\") {\n // When TeX writers want to suppress spacing on an operator,\n // they often put the operator by itself inside braces.\n group.setAttribute(\"lspace\", \"0em\");\n group.setAttribute(\"rspace\", \"0em\");\n }\n\n return [group];\n }\n\n var groups = [];\n var lastGroup;\n\n for (var i = 0; i < expression.length; i++) {\n var _group = buildMathML_buildGroup(expression[i], options);\n\n if (_group instanceof MathNode && lastGroup instanceof MathNode) {\n // Concatenate adjacent <mtext>s\n if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {\n var _lastGroup$children;\n\n (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children);\n\n continue; // Concatenate adjacent <mn>s\n } else if (_group.type === 'mn' && lastGroup.type === 'mn') {\n var _lastGroup$children2;\n\n (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children);\n\n continue; // Concatenate <mn>...</mn> followed by <mi>.</mi>\n } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') {\n var child = _group.children[0];\n\n if (child instanceof TextNode && child.text === '.') {\n var _lastGroup$children3;\n\n (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children);\n\n continue;\n }\n } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {\n var lastChild = lastGroup.children[0];\n\n if (lastChild instanceof TextNode && lastChild.text === \"\\u0338\" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {\n var _child = _group.children[0];\n\n if (_child instanceof TextNode && _child.text.length > 0) {\n // Overlay with combining character long solidus\n _child.text = _child.text.slice(0, 1) + \"\\u0338\" + _child.text.slice(1);\n groups.pop();\n }\n }\n }\n }\n\n groups.push(_group);\n lastGroup = _group;\n }\n\n return groups;\n};\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one. Returns a single node instead of an array.\n */\n\nvar buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {\n return makeRow(buildMathML_buildExpression(expression, options, isOrdgroup));\n};\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\n\nvar buildMathML_buildGroup = function buildGroup(group, options) {\n if (!group) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n\n if (_mathmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n // $FlowFixMe\n var result = _mathmlGroupBuilders[group.type](group, options); // $FlowFixMe\n\n return result;\n } else {\n throw new src_ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it. In particular, we put the elements from building the parse tree into a\n * <semantics> tag so we can also include that TeX source as an annotation.\n *\n * Note that we actually return a domTree element with a `<math>` inside it so\n * we can do appropriate styling.\n */\n\nfunction buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) {\n var expression = buildMathML_buildExpression(tree, options); // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes\n // and add spacing nodes. This is necessary only adjacent to math operators\n // like \\sin or \\lim or to subsup elements that contain math operators.\n // MathML takes care of the other spacing issues.\n // Wrap up the expression in an mrow so it is presented in the semantics\n // tag correctly, unless it's a single <mrow> or <mtable>.\n\n var wrapper;\n\n if (expression.length === 1 && expression[0] instanceof MathNode && utils.contains([\"mrow\", \"mtable\"], expression[0].type)) {\n wrapper = expression[0];\n } else {\n wrapper = new mathMLTree.MathNode(\"mrow\", expression);\n } // Build a TeX annotation of the source\n\n\n var annotation = new mathMLTree.MathNode(\"annotation\", [new mathMLTree.TextNode(texExpression)]);\n annotation.setAttribute(\"encoding\", \"application/x-tex\");\n var semantics = new mathMLTree.MathNode(\"semantics\", [wrapper, annotation]);\n var math = new mathMLTree.MathNode(\"math\", [semantics]);\n math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n\n if (isDisplayMode) {\n math.setAttribute(\"display\", \"block\");\n } // You can't style <math> nodes, so we wrap the node in a span.\n // NOTE: The span class is not typed to have <math> nodes as children, and\n // we don't want to make the children type more generic since the children\n // of span are expected to have more fields in `buildHtml` contexts.\n\n\n var wrapperClass = forMathmlOnly ? \"katex\" : \"katex-mathml\"; // $FlowFixMe\n\n return buildCommon.makeSpan([wrapperClass], [math]);\n}\n;// CONCATENATED MODULE: ./src/buildTree.js\n\n\n\n\n\n\n\nvar optionsFromSettings = function optionsFromSettings(settings) {\n return new src_Options({\n style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT,\n maxSize: settings.maxSize,\n minRuleThickness: settings.minRuleThickness\n });\n};\n\nvar displayWrap = function displayWrap(node, settings) {\n if (settings.displayMode) {\n var classes = [\"katex-display\"];\n\n if (settings.leqno) {\n classes.push(\"leqno\");\n }\n\n if (settings.fleqn) {\n classes.push(\"fleqn\");\n }\n\n node = buildCommon.makeSpan(classes, [node]);\n }\n\n return node;\n};\n\nvar buildTree = function buildTree(tree, expression, settings) {\n var options = optionsFromSettings(settings);\n var katexNode;\n\n if (settings.output === \"mathml\") {\n return buildMathML(tree, expression, options, settings.displayMode, true);\n } else if (settings.output === \"html\") {\n var htmlNode = buildHTML(tree, options);\n katexNode = buildCommon.makeSpan([\"katex\"], [htmlNode]);\n } else {\n var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false);\n\n var _htmlNode = buildHTML(tree, options);\n\n katexNode = buildCommon.makeSpan([\"katex\"], [mathMLNode, _htmlNode]);\n }\n\n return displayWrap(katexNode, settings);\n};\nvar buildHTMLTree = function buildHTMLTree(tree, expression, settings) {\n var options = optionsFromSettings(settings);\n var htmlNode = buildHTML(tree, options);\n var katexNode = buildCommon.makeSpan([\"katex\"], [htmlNode]);\n return displayWrap(katexNode, settings);\n};\n/* harmony default export */ var src_buildTree = ((/* unused pure expression or super */ null && (0)));\n;// CONCATENATED MODULE: ./src/stretchy.js\n/**\n * This file provides support to buildMathML.js and buildHTML.js\n * for stretchy wide elements rendered from SVG files\n * and other CSS trickery.\n */\n\n\n\n\n\nvar stretchyCodePoint = {\n widehat: \"^\",\n widecheck: \"ˇ\",\n widetilde: \"~\",\n utilde: \"~\",\n overleftarrow: \"\\u2190\",\n underleftarrow: \"\\u2190\",\n xleftarrow: \"\\u2190\",\n overrightarrow: \"\\u2192\",\n underrightarrow: \"\\u2192\",\n xrightarrow: \"\\u2192\",\n underbrace: \"\\u23DF\",\n overbrace: \"\\u23DE\",\n overgroup: \"\\u23E0\",\n undergroup: \"\\u23E1\",\n overleftrightarrow: \"\\u2194\",\n underleftrightarrow: \"\\u2194\",\n xleftrightarrow: \"\\u2194\",\n Overrightarrow: \"\\u21D2\",\n xRightarrow: \"\\u21D2\",\n overleftharpoon: \"\\u21BC\",\n xleftharpoonup: \"\\u21BC\",\n overrightharpoon: \"\\u21C0\",\n xrightharpoonup: \"\\u21C0\",\n xLeftarrow: \"\\u21D0\",\n xLeftrightarrow: \"\\u21D4\",\n xhookleftarrow: \"\\u21A9\",\n xhookrightarrow: \"\\u21AA\",\n xmapsto: \"\\u21A6\",\n xrightharpoondown: \"\\u21C1\",\n xleftharpoondown: \"\\u21BD\",\n xrightleftharpoons: \"\\u21CC\",\n xleftrightharpoons: \"\\u21CB\",\n xtwoheadleftarrow: \"\\u219E\",\n xtwoheadrightarrow: \"\\u21A0\",\n xlongequal: \"=\",\n xtofrom: \"\\u21C4\",\n xrightleftarrows: \"\\u21C4\",\n xrightequilibrium: \"\\u21CC\",\n // Not a perfect match.\n xleftequilibrium: \"\\u21CB\",\n // None better available.\n \"\\\\cdrightarrow\": \"\\u2192\",\n \"\\\\cdleftarrow\": \"\\u2190\",\n \"\\\\cdlongequal\": \"=\"\n};\n\nvar mathMLnode = function mathMLnode(label) {\n var node = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(stretchyCodePoint[label.replace(/^\\\\/, '')])]);\n node.setAttribute(\"stretchy\", \"true\");\n return node;\n}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.\n// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)\n// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)\n// Licensed under the SIL Open Font License, Version 1.1.\n// See \\nhttp://scripts.sil.org/OFL\n// Very Long SVGs\n// Many of the KaTeX stretchy wide elements use a long SVG image and an\n// overflow: hidden tactic to achieve a stretchy image while avoiding\n// distortion of arrowheads or brace corners.\n// The SVG typically contains a very long (400 em) arrow.\n// The SVG is in a container span that has overflow: hidden, so the span\n// acts like a window that exposes only part of the SVG.\n// The SVG always has a longer, thinner aspect ratio than the container span.\n// After the SVG fills 100% of the height of the container span,\n// there is a long arrow shaft left over. That left-over shaft is not shown.\n// Instead, it is sliced off because the span's CSS has overflow: hidden.\n// Thus, the reader sees an arrow that matches the subject matter width\n// without distortion.\n// Some functions, such as \\cancel, need to vary their aspect ratio. These\n// functions do not get the overflow SVG treatment.\n// Second Brush Stroke\n// Low resolution monitors struggle to display images in fine detail.\n// So browsers apply anti-aliasing. A long straight arrow shaft therefore\n// will sometimes appear as if it has a blurred edge.\n// To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n// arrow shafts. That is, a second long thin rectangular SVG path has been\n// written directly on top of each arrow shaft. This reinforcement causes\n// some of the screen pixels to display as black instead of the anti-aliased\n// gray pixel that a single path would generate. So we get arrow shafts\n// whose edges appear to be sharper.\n// In the katexImagesData object just below, the dimensions all\n// correspond to path geometry inside the relevant SVG.\n// For example, \\overrightarrow uses the same arrowhead as glyph U+2192\n// from the KaTeX Main font. The scaling factor is 1000.\n// That is, inside the font, that arrowhead is 522 units tall, which\n// corresponds to 0.522 em inside the document.\n\n\nvar katexImagesData = {\n // path(s), minWidth, height, align\n overrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n overleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n underrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n underleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n xrightarrow: [[\"rightarrow\"], 1.469, 522, \"xMaxYMin\"],\n \"\\\\cdrightarrow\": [[\"rightarrow\"], 3.0, 522, \"xMaxYMin\"],\n // CD minwwidth2.5pc\n xleftarrow: [[\"leftarrow\"], 1.469, 522, \"xMinYMin\"],\n \"\\\\cdleftarrow\": [[\"leftarrow\"], 3.0, 522, \"xMinYMin\"],\n Overrightarrow: [[\"doublerightarrow\"], 0.888, 560, \"xMaxYMin\"],\n xRightarrow: [[\"doublerightarrow\"], 1.526, 560, \"xMaxYMin\"],\n xLeftarrow: [[\"doubleleftarrow\"], 1.526, 560, \"xMinYMin\"],\n overleftharpoon: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n xleftharpoonup: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n xleftharpoondown: [[\"leftharpoondown\"], 0.888, 522, \"xMinYMin\"],\n overrightharpoon: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n xrightharpoonup: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n xrightharpoondown: [[\"rightharpoondown\"], 0.888, 522, \"xMaxYMin\"],\n xlongequal: [[\"longequal\"], 0.888, 334, \"xMinYMin\"],\n \"\\\\cdlongequal\": [[\"longequal\"], 3.0, 334, \"xMinYMin\"],\n xtwoheadleftarrow: [[\"twoheadleftarrow\"], 0.888, 334, \"xMinYMin\"],\n xtwoheadrightarrow: [[\"twoheadrightarrow\"], 0.888, 334, \"xMaxYMin\"],\n overleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n overbrace: [[\"leftbrace\", \"midbrace\", \"rightbrace\"], 1.6, 548],\n underbrace: [[\"leftbraceunder\", \"midbraceunder\", \"rightbraceunder\"], 1.6, 548],\n underleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n xleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 1.75, 522],\n xLeftrightarrow: [[\"doubleleftarrow\", \"doublerightarrow\"], 1.75, 560],\n xrightleftharpoons: [[\"leftharpoondownplus\", \"rightharpoonplus\"], 1.75, 716],\n xleftrightharpoons: [[\"leftharpoonplus\", \"rightharpoondownplus\"], 1.75, 716],\n xhookleftarrow: [[\"leftarrow\", \"righthook\"], 1.08, 522],\n xhookrightarrow: [[\"lefthook\", \"rightarrow\"], 1.08, 522],\n overlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n underlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n overgroup: [[\"leftgroup\", \"rightgroup\"], 0.888, 342],\n undergroup: [[\"leftgroupunder\", \"rightgroupunder\"], 0.888, 342],\n xmapsto: [[\"leftmapsto\", \"rightarrow\"], 1.5, 522],\n xtofrom: [[\"leftToFrom\", \"rightToFrom\"], 1.75, 528],\n // The next three arrows are from the mhchem package.\n // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the\n // document as \\xrightarrow or \\xrightleftharpoons. Those have\n // min-length = 1.75em, so we set min-length on these next three to match.\n xrightleftarrows: [[\"baraboveleftarrow\", \"rightarrowabovebar\"], 1.75, 901],\n xrightequilibrium: [[\"baraboveshortleftharpoon\", \"rightharpoonaboveshortbar\"], 1.75, 716],\n xleftequilibrium: [[\"shortbaraboveleftharpoon\", \"shortrightharpoonabovebar\"], 1.75, 716]\n};\n\nvar groupLength = function groupLength(arg) {\n if (arg.type === \"ordgroup\") {\n return arg.body.length;\n } else {\n return 1;\n }\n};\n\nvar svgSpan = function svgSpan(group, options) {\n // Create a span with inline SVG for the element.\n function buildSvgSpan_() {\n var viewBoxWidth = 400000; // default\n\n var label = group.label.slice(1);\n\n if (utils.contains([\"widehat\", \"widecheck\", \"widetilde\", \"utilde\"], label)) {\n // Each type in the `if` statement corresponds to one of the ParseNode\n // types below. This narrowing is required to access `grp.base`.\n // $FlowFixMe\n var grp = group; // There are four SVG images available for each function.\n // Choose a taller image when there are more characters.\n\n var numChars = groupLength(grp.base);\n var viewBoxHeight;\n var pathName;\n\n var _height;\n\n if (numChars > 5) {\n if (label === \"widehat\" || label === \"widecheck\") {\n viewBoxHeight = 420;\n viewBoxWidth = 2364;\n _height = 0.42;\n pathName = label + \"4\";\n } else {\n viewBoxHeight = 312;\n viewBoxWidth = 2340;\n _height = 0.34;\n pathName = \"tilde4\";\n }\n } else {\n var imgIndex = [1, 1, 2, 2, 3, 3][numChars];\n\n if (label === \"widehat\" || label === \"widecheck\") {\n viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];\n viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];\n _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];\n pathName = label + imgIndex;\n } else {\n viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];\n viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];\n _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];\n pathName = \"tilde\" + imgIndex;\n }\n }\n\n var path = new PathNode(pathName);\n var svgNode = new SvgNode([path], {\n \"width\": \"100%\",\n \"height\": makeEm(_height),\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight,\n \"preserveAspectRatio\": \"none\"\n });\n return {\n span: buildCommon.makeSvgSpan([], [svgNode], options),\n minWidth: 0,\n height: _height\n };\n } else {\n var spans = [];\n var data = katexImagesData[label];\n var paths = data[0],\n _minWidth = data[1],\n _viewBoxHeight = data[2];\n\n var _height2 = _viewBoxHeight / 1000;\n\n var numSvgChildren = paths.length;\n var widthClasses;\n var aligns;\n\n if (numSvgChildren === 1) {\n // $FlowFixMe: All these cases must be of the 4-tuple type.\n var align1 = data[3];\n widthClasses = [\"hide-tail\"];\n aligns = [align1];\n } else if (numSvgChildren === 2) {\n widthClasses = [\"halfarrow-left\", \"halfarrow-right\"];\n aligns = [\"xMinYMin\", \"xMaxYMin\"];\n } else if (numSvgChildren === 3) {\n widthClasses = [\"brace-left\", \"brace-center\", \"brace-right\"];\n aligns = [\"xMinYMin\", \"xMidYMin\", \"xMaxYMin\"];\n } else {\n throw new Error(\"Correct katexImagesData or update code here to support\\n \" + numSvgChildren + \" children.\");\n }\n\n for (var i = 0; i < numSvgChildren; i++) {\n var _path = new PathNode(paths[i]);\n\n var _svgNode = new SvgNode([_path], {\n \"width\": \"400em\",\n \"height\": makeEm(_height2),\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + _viewBoxHeight,\n \"preserveAspectRatio\": aligns[i] + \" slice\"\n });\n\n var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options);\n\n if (numSvgChildren === 1) {\n return {\n span: _span,\n minWidth: _minWidth,\n height: _height2\n };\n } else {\n _span.style.height = makeEm(_height2);\n spans.push(_span);\n }\n }\n\n return {\n span: buildCommon.makeSpan([\"stretchy\"], spans, options),\n minWidth: _minWidth,\n height: _height2\n };\n }\n } // buildSvgSpan_()\n\n\n var _buildSvgSpan_ = buildSvgSpan_(),\n span = _buildSvgSpan_.span,\n minWidth = _buildSvgSpan_.minWidth,\n height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0.\n // Any adjustments relative to the baseline must be done in buildHTML.\n\n\n span.height = height;\n span.style.height = makeEm(height);\n\n if (minWidth > 0) {\n span.style.minWidth = makeEm(minWidth);\n }\n\n return span;\n};\n\nvar encloseSpan = function encloseSpan(inner, label, topPad, bottomPad, options) {\n // Return an image span for \\cancel, \\bcancel, \\xcancel, \\fbox, or \\angl\n var img;\n var totalHeight = inner.height + inner.depth + topPad + bottomPad;\n\n if (/fbox|color|angl/.test(label)) {\n img = buildCommon.makeSpan([\"stretchy\", label], [], options);\n\n if (label === \"fbox\") {\n var color = options.color && options.getColor();\n\n if (color) {\n img.style.borderColor = color;\n }\n }\n } else {\n // \\cancel, \\bcancel, or \\xcancel\n // Since \\cancel's SVG is inline and it omits the viewBox attribute,\n // its stroke-width will not vary with span area.\n var lines = [];\n\n if (/^[bx]cancel$/.test(label)) {\n lines.push(new LineNode({\n \"x1\": \"0\",\n \"y1\": \"0\",\n \"x2\": \"100%\",\n \"y2\": \"100%\",\n \"stroke-width\": \"0.046em\"\n }));\n }\n\n if (/^x?cancel$/.test(label)) {\n lines.push(new LineNode({\n \"x1\": \"0\",\n \"y1\": \"100%\",\n \"x2\": \"100%\",\n \"y2\": \"0\",\n \"stroke-width\": \"0.046em\"\n }));\n }\n\n var svgNode = new SvgNode(lines, {\n \"width\": \"100%\",\n \"height\": makeEm(totalHeight)\n });\n img = buildCommon.makeSvgSpan([], [svgNode], options);\n }\n\n img.height = totalHeight;\n img.style.height = makeEm(totalHeight);\n return img;\n};\n\n/* harmony default export */ var stretchy = ({\n encloseSpan: encloseSpan,\n mathMLnode: mathMLnode,\n svgSpan: svgSpan\n});\n;// CONCATENATED MODULE: ./src/parseNode.js\n\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n if (!node || node.type !== type) {\n throw new Error(\"Expected node of type \" + type + \", but got \" + (node ? \"node of type \" + node.type : String(node)));\n } // $FlowFixMe, >=0.125\n\n\n return node;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\n\nfunction assertSymbolNodeType(node) {\n var typedNode = checkSymbolNodeType(node);\n\n if (!typedNode) {\n throw new Error(\"Expected node of symbol group type, but got \" + (node ? \"node of type \" + node.type : String(node)));\n }\n\n return typedNode;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\n\nfunction checkSymbolNodeType(node) {\n if (node && (node.type === \"atom\" || NON_ATOMS.hasOwnProperty(node.type))) {\n // $FlowFixMe\n return node;\n }\n\n return null;\n}\n;// CONCATENATED MODULE: ./src/functions/accent.js\n\n\n\n\n\n\n\n\n\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"accent\", but\n// also \"supsub\" since an accent can affect super/subscripting.\nvar htmlBuilder = function htmlBuilder(grp, options) {\n // Accents are handled in the TeXbook pg. 443, rule 12.\n var base;\n var group;\n var supSubGroup;\n\n if (grp && grp.type === \"supsub\") {\n // If our base is a character box, and we have superscripts and\n // subscripts, the supsub will defer to us. In particular, we want\n // to attach the superscripts and subscripts to the inner body (so\n // that the position of the superscripts and subscripts won't be\n // affected by the height of the accent). We accomplish this by\n // sticking the base of the accent into the base of the supsub, and\n // rendering that, while keeping track of where the accent is.\n // The real accent group is the base of the supsub group\n group = assertNodeType(grp.base, \"accent\"); // The character box is the base of the accent group\n\n base = group.base; // Stick the character box into the base of the supsub group\n\n grp.base = base; // Rerender the supsub group with its new base, and store that\n // result.\n\n supSubGroup = assertSpan(buildGroup(grp, options)); // reset original base\n\n grp.base = group;\n } else {\n group = assertNodeType(grp, \"accent\");\n base = group.base;\n } // Build the base group\n\n\n var body = buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character?\n\n var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line \"If the\n // nucleus is not a single character, let s = 0; otherwise set s to the\n // kern amount for the nucleus followed by the \\skewchar of its font.\"\n // Note that our skew metrics are just the kern between each character\n // and the skewchar.\n\n var skew = 0;\n\n if (mustShift) {\n // If the base is a character box, then we want the skew of the\n // innermost character. To do that, we find the innermost character:\n var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it\n\n var baseGroup = buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol.\n\n skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we\n // removed with getBaseElem might contain things like \\color which\n // we can't get rid of.\n // TODO(emily): Find a better way to get the skew\n }\n\n var accentBelow = group.label === \"\\\\c\"; // calculate the amount of space between the body and the accent\n\n var clearance = accentBelow ? body.height + body.depth : Math.min(body.height, options.fontMetrics().xHeight); // Build the accent\n\n var accentBody;\n\n if (!group.isStretchy) {\n var accent;\n var width;\n\n if (group.label === \"\\\\vec\") {\n // Before version 0.9, \\vec used the combining font glyph U+20D7.\n // But browsers, especially Safari, are not consistent in how they\n // render combining characters when not preceded by a character.\n // So now we use an SVG.\n // If Safari reforms, we should consider reverting to the glyph.\n accent = buildCommon.staticSvg(\"vec\", options);\n width = buildCommon.svgData.vec[1];\n } else {\n accent = buildCommon.makeOrd({\n mode: group.mode,\n text: group.label\n }, options, \"textord\");\n accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to\n // shift the accent over to a place we don't want.\n\n accent.italic = 0;\n width = accent.width;\n\n if (accentBelow) {\n clearance += accent.depth;\n }\n }\n\n accentBody = buildCommon.makeSpan([\"accent-body\"], [accent]); // \"Full\" accents expand the width of the resulting symbol to be\n // at least the width of the accent, and overlap directly onto the\n // character without any vertical offset.\n\n var accentFull = group.label === \"\\\\textcircled\";\n\n if (accentFull) {\n accentBody.classes.push('accent-full');\n clearance = body.height;\n } // Shift the accent over by the skew.\n\n\n var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`\n // so that the accent doesn't contribute to the bounding box.\n // We need to shift the character by its width (effectively half\n // its width) to compensate.\n\n if (!accentFull) {\n left -= width / 2;\n }\n\n accentBody.style.left = makeEm(left); // \\textcircled uses the \\bigcirc glyph, so it needs some\n // vertical adjustment to match LaTeX.\n\n if (group.label === \"\\\\textcircled\") {\n accentBody.style.top = \".2em\";\n }\n\n accentBody = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"kern\",\n size: -clearance\n }, {\n type: \"elem\",\n elem: accentBody\n }]\n }, options);\n } else {\n accentBody = stretchy.svgSpan(group, options);\n accentBody = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"elem\",\n elem: accentBody,\n wrapperClasses: [\"svg-align\"],\n wrapperStyle: skew > 0 ? {\n width: \"calc(100% - \" + makeEm(2 * skew) + \")\",\n marginLeft: makeEm(2 * skew)\n } : undefined\n }]\n }, options);\n }\n\n var accentWrap = buildCommon.makeSpan([\"mord\", \"accent\"], [accentBody], options);\n\n if (supSubGroup) {\n // Here, we replace the \"base\" child of the supsub with our newly\n // generated accent.\n supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the\n // accent, we manually recalculate height.\n\n supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not.\n\n supSubGroup.classes[0] = \"mord\";\n return supSubGroup;\n } else {\n return accentWrap;\n }\n};\n\nvar mathmlBuilder = function mathmlBuilder(group, options) {\n var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode(\"mo\", [makeText(group.label, group.mode)]);\n var node = new mathMLTree.MathNode(\"mover\", [buildMathML_buildGroup(group.base, options), accentNode]);\n node.setAttribute(\"accent\", \"true\");\n return node;\n};\n\nvar NON_STRETCHY_ACCENT_REGEX = new RegExp([\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\"].map(function (accent) {\n return \"\\\\\" + accent;\n}).join(\"|\")); // Accents\n\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\", \"\\\\widecheck\", \"\\\\widehat\", \"\\\\widetilde\", \"\\\\overrightarrow\", \"\\\\overleftarrow\", \"\\\\Overrightarrow\", \"\\\\overleftrightarrow\", \"\\\\overgroup\", \"\\\\overlinesegment\", \"\\\\overleftharpoon\", \"\\\\overrightharpoon\"],\n props: {\n numArgs: 1\n },\n handler: function handler(context, args) {\n var base = normalizeArgument(args[0]);\n var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);\n var isShifty = !isStretchy || context.funcName === \"\\\\widehat\" || context.funcName === \"\\\\widetilde\" || context.funcName === \"\\\\widecheck\";\n return {\n type: \"accent\",\n mode: context.parser.mode,\n label: context.funcName,\n isStretchy: isStretchy,\n isShifty: isShifty,\n base: base\n };\n },\n htmlBuilder: htmlBuilder,\n mathmlBuilder: mathmlBuilder\n}); // Text-mode accents\n\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\c\", \"\\\\r\", \"\\\\H\", \"\\\\v\", \"\\\\textcircled\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n // unless in strict mode\n argTypes: [\"primitive\"]\n },\n handler: function handler(context, args) {\n var base = args[0];\n var mode = context.parser.mode;\n\n if (mode === \"math\") {\n context.parser.settings.reportNonstrict(\"mathVsTextAccents\", \"LaTeX's accent \" + context.funcName + \" works only in text mode\");\n mode = \"text\";\n }\n\n return {\n type: \"accent\",\n mode: mode,\n label: context.funcName,\n isStretchy: false,\n isShifty: true,\n base: base\n };\n },\n htmlBuilder: htmlBuilder,\n mathmlBuilder: mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/accentunder.js\n// Horizontal overlap functions\n\n\n\n\n\n\ndefineFunction({\n type: \"accentUnder\",\n names: [\"\\\\underleftarrow\", \"\\\\underrightarrow\", \"\\\\underleftrightarrow\", \"\\\\undergroup\", \"\\\\underlinesegment\", \"\\\\utilde\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var base = args[0];\n return {\n type: \"accentUnder\",\n mode: parser.mode,\n label: funcName,\n base: base\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Treat under accents much like underlines.\n var innerGroup = buildGroup(group.base, options);\n var accentBody = stretchy.svgSpan(group, options);\n var kern = group.label === \"\\\\utilde\" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns\n\n var vlist = buildCommon.makeVList({\n positionType: \"top\",\n positionData: innerGroup.height,\n children: [{\n type: \"elem\",\n elem: accentBody,\n wrapperClasses: [\"svg-align\"]\n }, {\n type: \"kern\",\n size: kern\n }, {\n type: \"elem\",\n elem: innerGroup\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"accentunder\"], [vlist], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var accentNode = stretchy.mathMLnode(group.label);\n var node = new mathMLTree.MathNode(\"munder\", [buildMathML_buildGroup(group.base, options), accentNode]);\n node.setAttribute(\"accentunder\", \"true\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/arrow.js\n\n\n\n\n\n\n\n// Helper function\nvar paddedNode = function paddedNode(group) {\n var node = new mathMLTree.MathNode(\"mpadded\", group ? [group] : []);\n node.setAttribute(\"width\", \"+0.6em\");\n node.setAttribute(\"lspace\", \"0.3em\");\n return node;\n}; // Stretchy arrows with an optional argument\n\n\ndefineFunction({\n type: \"xArrow\",\n names: [\"\\\\xleftarrow\", \"\\\\xrightarrow\", \"\\\\xLeftarrow\", \"\\\\xRightarrow\", \"\\\\xleftrightarrow\", \"\\\\xLeftrightarrow\", \"\\\\xhookleftarrow\", \"\\\\xhookrightarrow\", \"\\\\xmapsto\", \"\\\\xrightharpoondown\", \"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\", \"\\\\xleftharpoonup\", \"\\\\xrightleftharpoons\", \"\\\\xleftrightharpoons\", \"\\\\xlongequal\", \"\\\\xtwoheadrightarrow\", \"\\\\xtwoheadleftarrow\", \"\\\\xtofrom\", // The next 3 functions are here to support the mhchem extension.\n // Direct use of these functions is discouraged and may break someday.\n \"\\\\xrightleftarrows\", \"\\\\xrightequilibrium\", \"\\\\xleftequilibrium\", // The next 3 functions are here only to support the {CD} environment.\n \"\\\\\\\\cdrightarrow\", \"\\\\\\\\cdleftarrow\", \"\\\\\\\\cdlongequal\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n return {\n type: \"xArrow\",\n mode: parser.mode,\n label: funcName,\n body: args[0],\n below: optArgs[0]\n };\n },\n // Flow is unable to correctly infer the type of `group`, even though it's\n // unamibiguously determined from the passed-in `type` above.\n htmlBuilder: function htmlBuilder(group, options) {\n var style = options.style; // Build the argument groups in the appropriate style.\n // Ref: amsmath.dtx: \\hbox{$\\scriptstyle\\mkern#3mu{#6}\\mkern#4mu$}%\n // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n\n var newOptions = options.havingStyle(style.sup());\n var upperGroup = buildCommon.wrapFragment(buildGroup(group.body, newOptions, options), options);\n var arrowPrefix = group.label.slice(0, 2) === \"\\\\x\" ? \"x\" : \"cd\";\n upperGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n var lowerGroup;\n\n if (group.below) {\n // Build the lower group\n newOptions = options.havingStyle(style.sub());\n lowerGroup = buildCommon.wrapFragment(buildGroup(group.below, newOptions, options), options);\n lowerGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n }\n\n var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0.\n // The point we want on the math axis is at 0.5 * arrowBody.height.\n\n var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\\if0#2\\else\\mkern#2mu\\fi\n\n var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu\n\n if (upperGroup.depth > 0.25 || group.label === \"\\\\xleftequilibrium\") {\n upperShift -= upperGroup.depth; // shift up if depth encroaches\n } // Generate the vlist\n\n\n var vlist;\n\n if (lowerGroup) {\n var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: upperGroup,\n shift: upperShift\n }, {\n type: \"elem\",\n elem: arrowBody,\n shift: arrowShift\n }, {\n type: \"elem\",\n elem: lowerGroup,\n shift: lowerShift\n }]\n }, options);\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: upperGroup,\n shift: upperShift\n }, {\n type: \"elem\",\n elem: arrowBody,\n shift: arrowShift\n }]\n }, options);\n } // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n\n vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n return buildCommon.makeSpan([\"mrel\", \"x-arrow\"], [vlist], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var arrowNode = stretchy.mathMLnode(group.label);\n arrowNode.setAttribute(\"minsize\", group.label.charAt(0) === \"x\" ? \"1.75em\" : \"3.0em\");\n var node;\n\n if (group.body) {\n var upperNode = paddedNode(buildMathML_buildGroup(group.body, options));\n\n if (group.below) {\n var lowerNode = paddedNode(buildMathML_buildGroup(group.below, options));\n node = new mathMLTree.MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n } else {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, upperNode]);\n }\n } else if (group.below) {\n var _lowerNode = paddedNode(buildMathML_buildGroup(group.below, options));\n\n node = new mathMLTree.MathNode(\"munder\", [arrowNode, _lowerNode]);\n } else {\n // This should never happen.\n // Parser.js throws an error if there is no argument.\n node = paddedNode();\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, node]);\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/mclass.js\n\n\n\n\n\n\nvar mclass_makeSpan = buildCommon.makeSpan;\n\nfunction mclass_htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options, true);\n return mclass_makeSpan([group.mclass], elements, options);\n}\n\nfunction mclass_mathmlBuilder(group, options) {\n var node;\n var inner = buildMathML_buildExpression(group.body, options);\n\n if (group.mclass === \"minner\") {\n node = new mathMLTree.MathNode(\"mpadded\", inner);\n } else if (group.mclass === \"mord\") {\n if (group.isCharacterBox) {\n node = inner[0];\n node.type = \"mi\";\n } else {\n node = new mathMLTree.MathNode(\"mi\", inner);\n }\n } else {\n if (group.isCharacterBox) {\n node = inner[0];\n node.type = \"mo\";\n } else {\n node = new mathMLTree.MathNode(\"mo\", inner);\n } // Set spacing based on what is the most likely adjacent atom type.\n // See TeXbook p170.\n\n\n if (group.mclass === \"mbin\") {\n node.attributes.lspace = \"0.22em\"; // medium space\n\n node.attributes.rspace = \"0.22em\";\n } else if (group.mclass === \"mpunct\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0.17em\"; // thinspace\n } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0em\";\n } else if (group.mclass === \"minner\") {\n node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n\n node.attributes.width = \"+0.1111em\";\n } // MathML <mo> default space is 5/18 em, so <mrel> needs no action.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo\n\n }\n\n return node;\n} // Math class commands except \\mathop\n\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\mathord\", \"\\\\mathbin\", \"\\\\mathrel\", \"\\\\mathopen\", \"\\\\mathclose\", \"\\\\mathpunct\", \"\\\\mathinner\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var body = args[0];\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: \"m\" + funcName.slice(5),\n // TODO(kevinb): don't prefix with 'm'\n body: ordargument(body),\n isCharacterBox: utils.isCharacterBox(body)\n };\n },\n htmlBuilder: mclass_htmlBuilder,\n mathmlBuilder: mclass_mathmlBuilder\n});\nvar binrelClass = function binrelClass(arg) {\n // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n // (by rendering separately and with {}s before and after, and measuring\n // the change in spacing). We'll do roughly the same by detecting the\n // atom type directly.\n var atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n\n if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n return \"m\" + atom.family;\n } else {\n return \"mord\";\n }\n}; // \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\@binrel\"],\n props: {\n numArgs: 2\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[1]),\n isCharacterBox: utils.isCharacterBox(args[1])\n };\n }\n}); // Build a relation or stacked op by placing one symbol on top of another\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n props: {\n numArgs: 2\n },\n handler: function handler(_ref3, args) {\n var parser = _ref3.parser,\n funcName = _ref3.funcName;\n var baseArg = args[1];\n var shiftedArg = args[0];\n var mclass;\n\n if (funcName !== \"\\\\stackrel\") {\n // LaTeX applies \\binrel spacing to \\overset and \\underset.\n mclass = binrelClass(baseArg);\n } else {\n mclass = \"mrel\"; // for \\stackrel\n }\n\n var baseOp = {\n type: \"op\",\n mode: baseArg.mode,\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: false,\n symbol: false,\n suppressBaseShift: funcName !== \"\\\\stackrel\",\n body: ordargument(baseArg)\n };\n var supsub = {\n type: \"supsub\",\n mode: shiftedArg.mode,\n base: baseOp,\n sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n sub: funcName === \"\\\\underset\" ? shiftedArg : null\n };\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: mclass,\n body: [supsub],\n isCharacterBox: utils.isCharacterBox(supsub)\n };\n },\n htmlBuilder: mclass_htmlBuilder,\n mathmlBuilder: mclass_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/pmb.js\n\n\n\n\n\n\n// \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies\n// with small offsets. We use CSS text-shadow.\n// It's a hack. Not as good as a real bold font. Better than nothing.\ndefineFunction({\n type: \"pmb\",\n names: [\"\\\\pmb\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"pmb\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[0])\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options, true);\n var node = buildCommon.makeSpan([group.mclass], elements, options);\n node.style.textShadow = \"0.02em 0.01em 0.04px\";\n return node;\n },\n mathmlBuilder: function mathmlBuilder(group, style) {\n var inner = buildMathML_buildExpression(group.body, style); // Wrap with an <mstyle> element.\n\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n node.setAttribute(\"style\", \"text-shadow: 0.02em 0.01em 0.04px\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/environments/cd.js\n\n\n\n\n\n\n\n\nvar cdArrowFunctionName = {\n \">\": \"\\\\\\\\cdrightarrow\",\n \"<\": \"\\\\\\\\cdleftarrow\",\n \"=\": \"\\\\\\\\cdlongequal\",\n \"A\": \"\\\\uparrow\",\n \"V\": \"\\\\downarrow\",\n \"|\": \"\\\\Vert\",\n \".\": \"no arrow\"\n};\n\nvar newCell = function newCell() {\n // Create an empty cell, to be filled below with parse nodes.\n // The parseTree from this module must be constructed like the\n // one created by parseArray(), so an empty CD cell must\n // be a ParseNode<\"styling\">. And CD is always displaystyle.\n // So these values are fixed and flow can do implicit typing.\n return {\n type: \"styling\",\n body: [],\n mode: \"math\",\n style: \"display\"\n };\n};\n\nvar isStartOfArrow = function isStartOfArrow(node) {\n return node.type === \"textord\" && node.text === \"@\";\n};\n\nvar isLabelEnd = function isLabelEnd(node, endChar) {\n return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n // Return a parse tree of an arrow and its labels.\n // This acts in a way similar to a macro expansion.\n var funcName = cdArrowFunctionName[arrowChar];\n\n switch (funcName) {\n case \"\\\\\\\\cdrightarrow\":\n case \"\\\\\\\\cdleftarrow\":\n return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n\n case \"\\\\uparrow\":\n case \"\\\\downarrow\":\n {\n var leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n var bareArrow = {\n type: \"atom\",\n text: funcName,\n mode: \"math\",\n family: \"rel\"\n };\n var sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n var rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n var arrowGroup = {\n type: \"ordgroup\",\n mode: \"math\",\n body: [leftLabel, sizedArrow, rightLabel]\n };\n return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n }\n\n case \"\\\\\\\\cdlongequal\":\n return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n\n case \"\\\\Vert\":\n {\n var arrow = {\n type: \"textord\",\n text: \"\\\\Vert\",\n mode: \"math\"\n };\n return parser.callFunction(\"\\\\Big\", [arrow], []);\n }\n\n default:\n return {\n type: \"textord\",\n text: \" \",\n mode: \"math\"\n };\n }\n}\n\nfunction parseCD(parser) {\n // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n var parsedRows = [];\n parser.gullet.beginGroup();\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n parser.gullet.beginGroup();\n\n while (true) {\n // eslint-disable-line no-constant-condition\n // Get the parse nodes for the next row.\n parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n var next = parser.fetch().text;\n\n if (next === \"&\" || next === \"\\\\\\\\\") {\n parser.consume();\n } else if (next === \"\\\\end\") {\n if (parsedRows[parsedRows.length - 1].length === 0) {\n parsedRows.pop(); // final row ended in \\\\\n }\n\n break;\n } else {\n throw new src_ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n }\n\n var row = [];\n var body = [row]; // Loop thru the parse nodes. Collect them into cells and arrows.\n\n for (var i = 0; i < parsedRows.length; i++) {\n // Start a new row.\n var rowNodes = parsedRows[i]; // Create the first cell.\n\n var cell = newCell();\n\n for (var j = 0; j < rowNodes.length; j++) {\n if (!isStartOfArrow(rowNodes[j])) {\n // If a parseNode is not an arrow, it goes into a cell.\n cell.body.push(rowNodes[j]);\n } else {\n // Parse node j is an \"@\", the start of an arrow.\n // Before starting on the arrow, push the cell into `row`.\n row.push(cell); // Now collect parseNodes into an arrow.\n // The character after \"@\" defines the arrow type.\n\n j += 1;\n var arrowChar = assertSymbolNodeType(rowNodes[j]).text; // Create two empty label nodes. We may or may not use them.\n\n var labels = new Array(2);\n labels[0] = {\n type: \"ordgroup\",\n mode: \"math\",\n body: []\n };\n labels[1] = {\n type: \"ordgroup\",\n mode: \"math\",\n body: []\n }; // Process the arrow.\n\n if (\"=|.\".indexOf(arrowChar) > -1) {// Three \"arrows\", ``@=`, `@|`, and `@.`, do not take labels.\n // Do nothing here.\n } else if (\"<>AV\".indexOf(arrowChar) > -1) {\n // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n // two optional labels. E.g. the right-point arrow syntax is\n // really: @>{optional label}>{optional label}>\n // Collect parseNodes into labels.\n for (var labelNum = 0; labelNum < 2; labelNum++) {\n var inLabel = true;\n\n for (var k = j + 1; k < rowNodes.length; k++) {\n if (isLabelEnd(rowNodes[k], arrowChar)) {\n inLabel = false;\n j = k;\n break;\n }\n\n if (isStartOfArrow(rowNodes[k])) {\n throw new src_ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[k]);\n }\n\n labels[labelNum].body.push(rowNodes[k]);\n }\n\n if (inLabel) {\n // isLabelEnd never returned a true.\n throw new src_ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[j]);\n }\n }\n } else {\n throw new src_ParseError(\"Expected one of \\\"<>AV=|.\\\" after @\", rowNodes[j]);\n } // Now join the arrow to its labels.\n\n\n var arrow = cdArrow(arrowChar, labels, parser); // Wrap the arrow in ParseNode<\"styling\">.\n // This is done to match parseArray() behavior.\n\n var wrappedArrow = {\n type: \"styling\",\n body: [arrow],\n mode: \"math\",\n style: \"display\" // CD is always displaystyle.\n\n };\n row.push(wrappedArrow); // In CD's syntax, cells are implicit. That is, everything that\n // is not an arrow gets collected into a cell. So create an empty\n // cell now. It will collect upcoming parseNodes.\n\n cell = newCell();\n }\n }\n\n if (i % 2 === 0) {\n // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n // The last cell is not yet pushed into `row`, so:\n row.push(cell);\n } else {\n // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n // Remove the empty cell that was placed at the beginning of `row`.\n row.shift();\n }\n\n row = [];\n body.push(row);\n } // End row group\n\n\n parser.gullet.endGroup(); // End array group defining \\\\\n\n parser.gullet.endGroup(); // define column separation.\n\n var cols = new Array(body[0].length).fill({\n type: \"align\",\n align: \"c\",\n pregap: 0.25,\n // CD package sets \\enskip between columns.\n postgap: 0.25 // So pre and post each get half an \\enskip, i.e. 0.25em.\n\n });\n return {\n type: \"array\",\n mode: \"math\",\n body: body,\n arraystretch: 1,\n addJot: true,\n rowGaps: [null],\n cols: cols,\n colSeparationType: \"CD\",\n hLinesBeforeRow: new Array(body.length + 1).fill([])\n };\n} // The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n type: \"cdlabel\",\n names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n return {\n type: \"cdlabel\",\n mode: parser.mode,\n side: funcName.slice(4),\n label: args[0]\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var newOptions = options.havingStyle(options.style.sup());\n var label = buildCommon.wrapFragment(buildGroup(group.label, newOptions, options), options);\n label.classes.push(\"cd-label-\" + group.side);\n label.style.bottom = makeEm(0.8 - label.depth); // Zero out label height & depth, so vertical align of arrow is set\n // by the arrow height, not by the label.\n\n label.height = 0;\n label.depth = 0;\n return label;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var label = new mathMLTree.MathNode(\"mrow\", [buildMathML_buildGroup(group.label, options)]);\n label = new mathMLTree.MathNode(\"mpadded\", [label]);\n label.setAttribute(\"width\", \"0\");\n\n if (group.side === \"left\") {\n label.setAttribute(\"lspace\", \"-1width\");\n } // We have to guess at vertical alignment. We know the arrow is 1.8em tall,\n // But we don't know the height or depth of the label.\n\n\n label.setAttribute(\"voffset\", \"0.7em\");\n label = new mathMLTree.MathNode(\"mstyle\", [label]);\n label.setAttribute(\"displaystyle\", \"false\");\n label.setAttribute(\"scriptlevel\", \"1\");\n return label;\n }\n});\ndefineFunction({\n type: \"cdlabelparent\",\n names: [\"\\\\\\\\cdparent\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n return {\n type: \"cdlabelparent\",\n mode: parser.mode,\n fragment: args[0]\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Wrap the vertical arrow and its labels.\n // The parent gets position: relative. The child gets position: absolute.\n // So CSS can locate the label correctly.\n var parent = buildCommon.wrapFragment(buildGroup(group.fragment, options), options);\n parent.classes.push(\"cd-vert-arrow\");\n return parent;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n return new mathMLTree.MathNode(\"mrow\", [buildMathML_buildGroup(group.fragment, options)]);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/char.js\n\n\n // \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123. It is used by the *macro*\n// \\char defined in macros.js.\n\ndefineFunction({\n type: \"textord\",\n names: [\"\\\\@char\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var arg = assertNodeType(args[0], \"ordgroup\");\n var group = arg.body;\n var number = \"\";\n\n for (var i = 0; i < group.length; i++) {\n var node = assertNodeType(group[i], \"textord\");\n number += node.text;\n }\n\n var code = parseInt(number);\n var text;\n\n if (isNaN(code)) {\n throw new src_ParseError(\"\\\\@char has non-numeric argument \" + number); // If we drop IE support, the following code could be replaced with\n // text = String.fromCodePoint(code)\n } else if (code < 0 || code >= 0x10ffff) {\n throw new src_ParseError(\"\\\\@char with invalid code point \" + number);\n } else if (code <= 0xffff) {\n text = String.fromCharCode(code);\n } else {\n // Astral code point; split into surrogate halves\n code -= 0x10000;\n text = String.fromCharCode((code >> 10) + 0xd800, (code & 0x3ff) + 0xdc00);\n }\n\n return {\n type: \"textord\",\n mode: parser.mode,\n text: text\n };\n }\n});\n;// CONCATENATED MODULE: ./src/functions/color.js\n\n\n\n\n\n\n\nvar color_htmlBuilder = function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options.withColor(group.color), false); // \\color isn't supposed to affect the type of the elements it contains.\n // To accomplish this, we wrap the results in a fragment, so the inner\n // elements will be able to directly interact with their neighbors. For\n // example, `\\color{red}{2 +} 3` has the same spacing as `2 + 3`\n\n return buildCommon.makeFragment(elements);\n};\n\nvar color_mathmlBuilder = function mathmlBuilder(group, options) {\n var inner = buildMathML_buildExpression(group.body, options.withColor(group.color));\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n node.setAttribute(\"mathcolor\", group.color);\n return node;\n};\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\textcolor\"],\n props: {\n numArgs: 2,\n allowedInText: true,\n argTypes: [\"color\", \"original\"]\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var color = assertNodeType(args[0], \"color-token\").color;\n var body = args[1];\n return {\n type: \"color\",\n mode: parser.mode,\n color: color,\n body: ordargument(body)\n };\n },\n htmlBuilder: color_htmlBuilder,\n mathmlBuilder: color_mathmlBuilder\n});\ndefineFunction({\n type: \"color\",\n names: [\"\\\\color\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n argTypes: [\"color\"]\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser,\n breakOnTokenText = _ref2.breakOnTokenText;\n var color = assertNodeType(args[0], \"color-token\").color; // Set macro \\current@color in current namespace to store the current\n // color, mimicking the behavior of color.sty.\n // This is currently used just to correctly color a \\right\n // that follows a \\color command.\n\n parser.gullet.macros.set(\"\\\\current@color\", color); // Parse out the implicit body that should be colored.\n\n var body = parser.parseExpression(true, breakOnTokenText);\n return {\n type: \"color\",\n mode: parser.mode,\n color: color,\n body: body\n };\n },\n htmlBuilder: color_htmlBuilder,\n mathmlBuilder: color_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/cr.js\n// Row breaks within tabular environments, and line breaks at top level\n\n\n\n\n // \\DeclareRobustCommand\\\\{...\\@xnewline}\n\ndefineFunction({\n type: \"cr\",\n names: [\"\\\\\\\\\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 0,\n allowedInText: true\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser;\n var size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior(\"newLineInDisplayMode\", \"In LaTeX, \\\\\\\\ or \\\\newline \" + \"does nothing in display mode\");\n return {\n type: \"cr\",\n mode: parser.mode,\n newLine: newLine,\n size: size && assertNodeType(size, \"size\").value\n };\n },\n // The following builders are called only at the top level,\n // not within tabular/array environments.\n htmlBuilder: function htmlBuilder(group, options) {\n var span = buildCommon.makeSpan([\"mspace\"], [], options);\n\n if (group.newLine) {\n span.classes.push(\"newline\");\n\n if (group.size) {\n span.style.marginTop = makeEm(calculateSize(group.size, options));\n }\n }\n\n return span;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mspace\");\n\n if (group.newLine) {\n node.setAttribute(\"linebreak\", \"newline\");\n\n if (group.size) {\n node.setAttribute(\"height\", makeEm(calculateSize(group.size, options)));\n }\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/def.js\n\n\n\nvar globalMap = {\n \"\\\\global\": \"\\\\global\",\n \"\\\\long\": \"\\\\\\\\globallong\",\n \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n \"\\\\def\": \"\\\\gdef\",\n \"\\\\gdef\": \"\\\\gdef\",\n \"\\\\edef\": \"\\\\xdef\",\n \"\\\\xdef\": \"\\\\xdef\",\n \"\\\\let\": \"\\\\\\\\globallet\",\n \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nvar checkControlSequence = function checkControlSequence(tok) {\n var name = tok.text;\n\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new src_ParseError(\"Expected a control sequence\", tok);\n }\n\n return name;\n};\n\nvar getRHS = function getRHS(parser) {\n var tok = parser.gullet.popToken();\n\n if (tok.text === \"=\") {\n // consume optional equals\n tok = parser.gullet.popToken();\n\n if (tok.text === \" \") {\n // consume one optional space\n tok = parser.gullet.popToken();\n }\n }\n\n return tok;\n};\n\nvar letCommand = function letCommand(parser, name, tok, global) {\n var macro = parser.gullet.macros.get(tok.text);\n\n if (macro == null) {\n // don't expand it later even if a macro with the same name is defined\n // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n tok.noexpand = true;\n macro = {\n tokens: [tok],\n numArgs: 0,\n // reproduce the same behavior in expansion\n unexpandable: !parser.gullet.isExpandable(tok.text)\n };\n }\n\n parser.gullet.macros.set(name, macro, global);\n}; // <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\n\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\global\", \"\\\\long\", \"\\\\\\\\globallong\" // cant be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: function handler(_ref) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n parser.consumeSpaces();\n var token = parser.fetch();\n\n if (globalMap[token.text]) {\n // KaTeX doesn't have \\par, so ignore \\long\n if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n token.text = globalMap[token.text];\n }\n\n return assertNodeType(parser.parseFunction(), \"internal\");\n }\n\n throw new src_ParseError(\"Invalid token after macro prefix\", token);\n }\n}); // Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler: function handler(_ref2) {\n var parser = _ref2.parser,\n funcName = _ref2.funcName;\n var tok = parser.gullet.popToken();\n var name = tok.text;\n\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new src_ParseError(\"Expected a control sequence\", tok);\n }\n\n var numArgs = 0;\n var insert;\n var delimiters = [[]]; // <parameter text> contains no braces\n\n while (parser.gullet.future().text !== \"{\") {\n tok = parser.gullet.popToken();\n\n if (tok.text === \"#\") {\n // If the very last character of the <parameter text> is #, so that\n // this # is immediately followed by {, TeX will behave as if the {\n // had been inserted at the right end of both the parameter text\n // and the replacement text.\n if (parser.gullet.future().text === \"{\") {\n insert = parser.gullet.future();\n delimiters[numArgs].push(\"{\");\n break;\n } // A parameter, the first appearance of # must be followed by 1,\n // the next by 2, and so on; up to nine #s are allowed\n\n\n tok = parser.gullet.popToken();\n\n if (!/^[1-9]$/.test(tok.text)) {\n throw new src_ParseError(\"Invalid argument number \\\"\" + tok.text + \"\\\"\");\n }\n\n if (parseInt(tok.text) !== numArgs + 1) {\n throw new src_ParseError(\"Argument number \\\"\" + tok.text + \"\\\" out of order\");\n }\n\n numArgs++;\n delimiters.push([]);\n } else if (tok.text === \"EOF\") {\n throw new src_ParseError(\"Expected a macro definition\");\n } else {\n delimiters[numArgs].push(tok.text);\n }\n } // replacement text, enclosed in '{' and '}' and properly nested\n\n\n var _parser$gullet$consum = parser.gullet.consumeArg(),\n tokens = _parser$gullet$consum.tokens;\n\n if (insert) {\n tokens.unshift(insert);\n }\n\n if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n tokens = parser.gullet.expandTokens(tokens);\n tokens.reverse(); // to fit in with stack order\n } // Final arg is the expansion of the macro\n\n\n parser.gullet.macros.set(name, {\n tokens: tokens,\n numArgs: numArgs,\n delimiters: delimiters\n }, funcName === globalMap[funcName]);\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n}); // <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n// | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\let\", \"\\\\\\\\globallet\" // cant be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler: function handler(_ref3) {\n var parser = _ref3.parser,\n funcName = _ref3.funcName;\n var name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.consumeSpaces();\n var tok = getRHS(parser);\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\futurelet\", \"\\\\\\\\globalfuture\" // cant be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler: function handler(_ref4) {\n var parser = _ref4.parser,\n funcName = _ref4.funcName;\n var name = checkControlSequence(parser.gullet.popToken());\n var middle = parser.gullet.popToken();\n var tok = parser.gullet.popToken();\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n parser.gullet.pushToken(tok);\n parser.gullet.pushToken(middle);\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n});\n;// CONCATENATED MODULE: ./src/delimiter.js\n/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function getMetrics(symbol, font, mode) {\n var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace;\n var metrics = getCharacterMetrics(replace || symbol, font, mode);\n\n if (!metrics) {\n throw new Error(\"Unsupported symbol \" + symbol + \" and font size \" + font + \".\");\n }\n\n return metrics;\n};\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\n\n\nvar styleWrap = function styleWrap(delim, toStyle, options, classes) {\n var newOptions = options.havingBaseStyle(toStyle);\n var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);\n var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;\n span.height *= delimSizeMultiplier;\n span.depth *= delimSizeMultiplier;\n span.maxFontSize = newOptions.sizeMultiplier;\n return span;\n};\n\nvar centerSpan = function centerSpan(span, options, style) {\n var newOptions = options.havingBaseStyle(style);\n var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;\n span.classes.push(\"delimcenter\");\n span.style.top = makeEm(shift);\n span.height -= shift;\n span.depth += shift;\n};\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\n\n\nvar makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {\n var text = buildCommon.makeSymbol(delim, \"Main-Regular\", mode, options);\n var span = styleWrap(text, style, options, classes);\n\n if (center) {\n centerSpan(span, options, style);\n }\n\n return span;\n};\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\n\n\nvar mathrmSize = function mathrmSize(value, size, mode, options) {\n return buildCommon.makeSymbol(value, \"Size\" + size + \"-Regular\", mode, options);\n};\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\n\n\nvar makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {\n var inner = mathrmSize(delim, size, mode, options);\n var span = styleWrap(buildCommon.makeSpan([\"delimsizing\", \"size\" + size], [inner], options), src_Style.TEXT, options, classes);\n\n if (center) {\n centerSpan(span, options, src_Style.TEXT);\n }\n\n return span;\n};\n/**\n * Make a span from a font glyph with the given offset and in the given font.\n * This is used in makeStackedDelim to make the stacking pieces for the delimiter.\n */\n\n\nvar makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) {\n var sizeClass; // Apply the correct CSS class to choose the right font.\n\n if (font === \"Size1-Regular\") {\n sizeClass = \"delim-size1\";\n } else\n /* if (font === \"Size4-Regular\") */\n {\n sizeClass = \"delim-size4\";\n }\n\n var corner = buildCommon.makeSpan([\"delimsizinginner\", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element\n // in the appropriate tag that VList uses.\n\n return {\n type: \"elem\",\n elem: corner\n };\n};\n\nvar makeInner = function makeInner(ch, height, options) {\n // Create a span with inline SVG for the inner part of a tall stacked delimiter.\n var width = fontMetricsData[\"Size4-Regular\"][ch.charCodeAt(0)] ? fontMetricsData[\"Size4-Regular\"][ch.charCodeAt(0)][4] : fontMetricsData[\"Size1-Regular\"][ch.charCodeAt(0)][4];\n var path = new PathNode(\"inner\", innerPath(ch, Math.round(1000 * height)));\n var svgNode = new SvgNode([path], {\n \"width\": makeEm(width),\n \"height\": makeEm(height),\n // Override CSS rule `.katex svg { width: 100% }`\n \"style\": \"width:\" + makeEm(width),\n \"viewBox\": \"0 0 \" + 1000 * width + \" \" + Math.round(1000 * height),\n \"preserveAspectRatio\": \"xMinYMin\"\n });\n var span = buildCommon.makeSvgSpan([], [svgNode], options);\n span.height = height;\n span.style.height = makeEm(height);\n span.style.width = makeEm(width);\n return {\n type: \"elem\",\n elem: span\n };\n}; // Helpers for makeStackedDelim\n\n\nvar lapInEms = 0.008;\nvar lap = {\n type: \"kern\",\n size: -1 * lapInEms\n};\nvar verts = [\"|\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\vert\"];\nvar doubleVerts = [\"\\\\|\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\Vert\"];\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\n\nvar makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {\n // There are four parts, the top, an optional middle, a repeated part, and a\n // bottom.\n var top;\n var middle;\n var repeat;\n var bottom;\n var svgLabel = \"\";\n var viewBoxWidth = 0;\n top = repeat = bottom = delim;\n middle = null; // Also keep track of what font the delimiters are in\n\n var font = \"Size1-Regular\"; // We set the parts and font based on the symbol. Note that we use\n // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n // repeats of the arrows\n\n if (delim === \"\\\\uparrow\") {\n repeat = bottom = \"\\u23D0\";\n } else if (delim === \"\\\\Uparrow\") {\n repeat = bottom = \"\\u2016\";\n } else if (delim === \"\\\\downarrow\") {\n top = repeat = \"\\u23D0\";\n } else if (delim === \"\\\\Downarrow\") {\n top = repeat = \"\\u2016\";\n } else if (delim === \"\\\\updownarrow\") {\n top = \"\\\\uparrow\";\n repeat = \"\\u23D0\";\n bottom = \"\\\\downarrow\";\n } else if (delim === \"\\\\Updownarrow\") {\n top = \"\\\\Uparrow\";\n repeat = \"\\u2016\";\n bottom = \"\\\\Downarrow\";\n } else if (utils.contains(verts, delim)) {\n repeat = \"\\u2223\";\n svgLabel = \"vert\";\n viewBoxWidth = 333;\n } else if (utils.contains(doubleVerts, delim)) {\n repeat = \"\\u2225\";\n svgLabel = \"doublevert\";\n viewBoxWidth = 556;\n } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n top = \"\\u23A1\";\n repeat = \"\\u23A2\";\n bottom = \"\\u23A3\";\n font = \"Size4-Regular\";\n svgLabel = \"lbrack\";\n viewBoxWidth = 667;\n } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n top = \"\\u23A4\";\n repeat = \"\\u23A5\";\n bottom = \"\\u23A6\";\n font = \"Size4-Regular\";\n svgLabel = \"rbrack\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\lfloor\" || delim === \"\\u230A\") {\n repeat = top = \"\\u23A2\";\n bottom = \"\\u23A3\";\n font = \"Size4-Regular\";\n svgLabel = \"lfloor\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\lceil\" || delim === \"\\u2308\") {\n top = \"\\u23A1\";\n repeat = bottom = \"\\u23A2\";\n font = \"Size4-Regular\";\n svgLabel = \"lceil\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\rfloor\" || delim === \"\\u230B\") {\n repeat = top = \"\\u23A5\";\n bottom = \"\\u23A6\";\n font = \"Size4-Regular\";\n svgLabel = \"rfloor\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\rceil\" || delim === \"\\u2309\") {\n top = \"\\u23A4\";\n repeat = bottom = \"\\u23A5\";\n font = \"Size4-Regular\";\n svgLabel = \"rceil\";\n viewBoxWidth = 667;\n } else if (delim === \"(\" || delim === \"\\\\lparen\") {\n top = \"\\u239B\";\n repeat = \"\\u239C\";\n bottom = \"\\u239D\";\n font = \"Size4-Regular\";\n svgLabel = \"lparen\";\n viewBoxWidth = 875;\n } else if (delim === \")\" || delim === \"\\\\rparen\") {\n top = \"\\u239E\";\n repeat = \"\\u239F\";\n bottom = \"\\u23A0\";\n font = \"Size4-Regular\";\n svgLabel = \"rparen\";\n viewBoxWidth = 875;\n } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n top = \"\\u23A7\";\n middle = \"\\u23A8\";\n bottom = \"\\u23A9\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n top = \"\\u23AB\";\n middle = \"\\u23AC\";\n bottom = \"\\u23AD\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lgroup\" || delim === \"\\u27EE\") {\n top = \"\\u23A7\";\n bottom = \"\\u23A9\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rgroup\" || delim === \"\\u27EF\") {\n top = \"\\u23AB\";\n bottom = \"\\u23AD\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lmoustache\" || delim === \"\\u23B0\") {\n top = \"\\u23A7\";\n bottom = \"\\u23AD\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rmoustache\" || delim === \"\\u23B1\") {\n top = \"\\u23AB\";\n bottom = \"\\u23A9\";\n repeat = \"\\u23AA\";\n font = \"Size4-Regular\";\n } // Get the metrics of the four sections\n\n\n var topMetrics = getMetrics(top, font, mode);\n var topHeightTotal = topMetrics.height + topMetrics.depth;\n var repeatMetrics = getMetrics(repeat, font, mode);\n var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n var bottomMetrics = getMetrics(bottom, font, mode);\n var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n var middleHeightTotal = 0;\n var middleFactor = 1;\n\n if (middle !== null) {\n var middleMetrics = getMetrics(middle, font, mode);\n middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n middleFactor = 2; // repeat symmetrically above and below middle\n } // Calcuate the minimal height that the delimiter can have.\n // It is at least the size of the top, bottom, and optional middle combined.\n\n\n var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need\n\n var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols\n\n var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note\n // that in this context, \"center\" means that the delimiter should be\n // centered around the axis in the current style, while normally it is\n // centered around the axis in textstyle.\n\n var axisHeight = options.fontMetrics().axisHeight;\n\n if (center) {\n axisHeight *= options.sizeMultiplier;\n } // Calculate the depth\n\n\n var depth = realHeightTotal / 2 - axisHeight; // Now, we start building the pieces that will go into the vlist\n // Keep a list of the pieces of the stacked delimiter\n\n var stack = [];\n\n if (svgLabel.length > 0) {\n // Instead of stacking glyphs, create a single SVG.\n // This evades browser problems with imprecise positioning of spans.\n var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;\n var viewBoxHeight = Math.round(realHeightTotal * 1000);\n var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1000));\n var path = new PathNode(svgLabel, pathStr);\n var width = (viewBoxWidth / 1000).toFixed(3) + \"em\";\n var height = (viewBoxHeight / 1000).toFixed(3) + \"em\";\n var svg = new SvgNode([path], {\n \"width\": width,\n \"height\": height,\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight\n });\n var wrapper = buildCommon.makeSvgSpan([], [svg], options);\n wrapper.height = viewBoxHeight / 1000;\n wrapper.style.width = width;\n wrapper.style.height = height;\n stack.push({\n type: \"elem\",\n elem: wrapper\n });\n } else {\n // Stack glyphs\n // Start by adding the bottom symbol\n stack.push(makeGlyphSpan(bottom, font, mode));\n stack.push(lap); // overlap\n\n if (middle === null) {\n // The middle section will be an SVG. Make it an extra 0.016em tall.\n // We'll overlap by 0.008em at top and bottom.\n var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms;\n stack.push(makeInner(repeat, innerHeight, options));\n } else {\n // When there is a middle bit, we need the middle part and two repeated\n // sections\n var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms;\n\n stack.push(makeInner(repeat, _innerHeight, options)); // Now insert the middle of the brace.\n\n stack.push(lap);\n stack.push(makeGlyphSpan(middle, font, mode));\n stack.push(lap);\n stack.push(makeInner(repeat, _innerHeight, options));\n } // Add the top symbol\n\n\n stack.push(lap);\n stack.push(makeGlyphSpan(top, font, mode));\n } // Finally, build the vlist\n\n\n var newOptions = options.havingBaseStyle(src_Style.TEXT);\n var inner = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: depth,\n children: stack\n }, newOptions);\n return styleWrap(buildCommon.makeSpan([\"delimsizing\", \"mult\"], [inner], newOptions), src_Style.TEXT, options, classes);\n}; // All surds have 0.08em padding above the viniculum inside the SVG.\n// That keeps browser span height rounding error from pinching the line.\n\n\nvar vbPad = 80; // padding above the surd, measured inside the viewBox.\n\nvar emPad = 0.08; // padding, in ems, measured in the document.\n\nvar sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) {\n var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight);\n var pathNode = new PathNode(sqrtName, path);\n var svg = new SvgNode([pathNode], {\n // Note: 1000:1 ratio of viewBox to document em width.\n \"width\": \"400em\",\n \"height\": makeEm(height),\n \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n \"preserveAspectRatio\": \"xMinYMin slice\"\n });\n return buildCommon.makeSvgSpan([\"hide-tail\"], [svg], options);\n};\n/**\n * Make a sqrt image of the given height,\n */\n\n\nvar makeSqrtImage = function makeSqrtImage(height, options) {\n // Define a newOptions that removes the effect of size changes such as \\Huge.\n // We don't pick different a height surd for \\Huge. For it, we scale up.\n var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds.\n\n var delim = traverseSequence(\"\\\\surd\", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);\n var sizeMultiplier = newOptions.sizeMultiplier; // default\n // The standard sqrt SVGs each have a 0.04em thick viniculum.\n // If Settings.minRuleThickness is larger than that, we add extraViniculum.\n\n var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol.\n\n var span;\n var spanHeight = 0;\n var texHeight = 0;\n var viewBoxHeight = 0;\n var advanceWidth; // We create viewBoxes with 80 units of \"padding\" above each surd.\n // Then browser rounding error on the parent span height will not\n // encroach on the ink of the viniculum. But that padding is not\n // included in the TeX-like `height` used for calculation of\n // vertical alignment. So texHeight = span.height < span.style.height.\n\n if (delim.type === \"small\") {\n // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.\n // 1000 unit normal glyph height.\n viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad;\n\n if (height < 1.0) {\n sizeMultiplier = 1.0; // mimic a \\textfont radical\n } else if (height < 1.4) {\n sizeMultiplier = 0.7; // mimic a \\scriptfont radical\n }\n\n spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier;\n texHeight = (1.00 + extraViniculum) / sizeMultiplier;\n span = sqrtSvg(\"sqrtMain\", spanHeight, viewBoxHeight, extraViniculum, options);\n span.style.minWidth = \"0.853em\";\n advanceWidth = 0.833 / sizeMultiplier; // from the font.\n } else if (delim.type === \"large\") {\n // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.\n viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];\n texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier;\n spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier;\n span = sqrtSvg(\"sqrtSize\" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options);\n span.style.minWidth = \"1.02em\";\n advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.\n } else {\n // Tall sqrt. In TeX, this would be stacked using multiple glyphs.\n // We'll use a single SVG to accomplish the same thing.\n spanHeight = height + extraViniculum + emPad;\n texHeight = height + extraViniculum;\n viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad;\n span = sqrtSvg(\"sqrtTall\", spanHeight, viewBoxHeight, extraViniculum, options);\n span.style.minWidth = \"0.742em\";\n advanceWidth = 1.056;\n }\n\n span.height = texHeight;\n span.style.height = makeEm(spanHeight);\n return {\n span: span,\n advanceWidth: advanceWidth,\n // Calculate the actual line width.\n // This actually should depend on the chosen font -- e.g. \\boldmath\n // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and\n // have thicker rules.\n ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier\n };\n}; // There are three kinds of delimiters, delimiters that stack when they become\n// too large\n\n\nvar stackLargeDelimiters = [\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230A\", \"\\u230B\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"\\\\surd\"]; // delimiters that always stack\n\nvar stackAlwaysDelimiters = [\"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\", \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\", \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27EE\", \"\\u27EF\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23B0\", \"\\u23B1\"]; // and delimiters that never stack\n\nvar stackNeverDelimiters = [\"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\"]; // Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\n\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\n\nvar makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {\n // < and > turn into \\langle and \\rangle in delimiters\n if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27E8\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27E9\") {\n delim = \"\\\\rangle\";\n } // Sized delimiters are never centered.\n\n\n if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) {\n return makeLargeDelim(delim, size, false, options, mode, classes);\n } else if (utils.contains(stackAlwaysDelimiters, delim)) {\n return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);\n } else {\n throw new src_ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n }\n};\n/**\n * There are three different sequences of delimiter sizes that the delimiters\n * follow depending on the kind of delimiter. This is used when creating custom\n * sized delimiters to decide whether to create a small, large, or stacked\n * delimiter.\n *\n * In real TeX, these sequences aren't explicitly defined, but are instead\n * defined inside the font metrics. Since there are only three sequences that\n * are possible for the delimiters that TeX defines, it is easier to just encode\n * them explicitly here.\n */\n\n\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [{\n type: \"small\",\n style: src_Style.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: src_Style.SCRIPT\n}, {\n type: \"small\",\n style: src_Style.TEXT\n}, {\n type: \"large\",\n size: 1\n}, {\n type: \"large\",\n size: 2\n}, {\n type: \"large\",\n size: 3\n}, {\n type: \"large\",\n size: 4\n}]; // Delimiters that always stack try the small delimiters first, then stack\n\nvar stackAlwaysDelimiterSequence = [{\n type: \"small\",\n style: src_Style.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: src_Style.SCRIPT\n}, {\n type: \"small\",\n style: src_Style.TEXT\n}, {\n type: \"stack\"\n}]; // Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\n\nvar stackLargeDelimiterSequence = [{\n type: \"small\",\n style: src_Style.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: src_Style.SCRIPT\n}, {\n type: \"small\",\n style: src_Style.TEXT\n}, {\n type: \"large\",\n size: 1\n}, {\n type: \"large\",\n size: 2\n}, {\n type: \"large\",\n size: 3\n}, {\n type: \"large\",\n size: 4\n}, {\n type: \"stack\"\n}];\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n * TODO(#963) Use more specific font family return type once that is introduced.\n */\n\nvar delimTypeToFont = function delimTypeToFont(type) {\n if (type.type === \"small\") {\n return \"Main-Regular\";\n } else if (type.type === \"large\") {\n return \"Size\" + type.size + \"-Regular\";\n } else if (type.type === \"stack\") {\n return \"Size4-Regular\";\n } else {\n throw new Error(\"Add support for delim type '\" + type.type + \"' here.\");\n }\n};\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\n\n\nvar traverseSequence = function traverseSequence(delim, height, sequence, options) {\n // Here, we choose the index we should start at in the sequences. In smaller\n // sizes (which correspond to larger numbers in style.size) we start earlier\n // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n var start = Math.min(2, 3 - options.style.size);\n\n for (var i = start; i < sequence.length; i++) {\n if (sequence[i].type === \"stack\") {\n // This is always the last delimiter, so we just break the loop now.\n break;\n }\n\n var metrics = getMetrics(delim, delimTypeToFont(sequence[i]), \"math\");\n var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we\n // account for the style change size.\n\n if (sequence[i].type === \"small\") {\n var newOptions = options.havingBaseStyle(sequence[i].style);\n heightDepth *= newOptions.sizeMultiplier;\n } // Check if the delimiter at this size works for the given height.\n\n\n if (heightDepth > height) {\n return sequence[i];\n }\n } // If we reached the end of the sequence, return the last sequence element.\n\n\n return sequence[sequence.length - 1];\n};\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\n\n\nvar makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {\n if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27E8\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27E9\") {\n delim = \"\\\\rangle\";\n } // Decide what sequence to use\n\n\n var sequence;\n\n if (utils.contains(stackNeverDelimiters, delim)) {\n sequence = stackNeverDelimiterSequence;\n } else if (utils.contains(stackLargeDelimiters, delim)) {\n sequence = stackLargeDelimiterSequence;\n } else {\n sequence = stackAlwaysDelimiterSequence;\n } // Look through the sequence\n\n\n var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs.\n // Depending on the sequence element we decided on, call the\n // appropriate function.\n\n if (delimType.type === \"small\") {\n return makeSmallDelim(delim, delimType.style, center, options, mode, classes);\n } else if (delimType.type === \"large\") {\n return makeLargeDelim(delim, delimType.size, center, options, mode, classes);\n } else\n /* if (delimType.type === \"stack\") */\n {\n return makeStackedDelim(delim, height, center, options, mode, classes);\n }\n};\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\n\n\nvar makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {\n // We always center \\left/\\right delimiters, so the axis is always shifted\n var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right\n\n var delimiterFactor = 901;\n var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;\n var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);\n var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are\n // 65536 per pt, or 655360 per em. So, the division here truncates in\n // TeX but doesn't here, producing different results. If we wanted to\n // exactly match TeX's calculation, we could do\n // Math.floor(655360 * maxDistFromAxis / 500) *\n // delimiterFactor / 655360\n // (To see the difference, compare\n // x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n // in TeX and KaTeX)\n maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n // height\n\n return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);\n};\n\n/* harmony default export */ var delimiter = ({\n sqrtImage: makeSqrtImage,\n sizedDelim: makeSizedDelim,\n sizeToMaxHeight: sizeToMaxHeight,\n customSizedDelim: makeCustomSizedDelim,\n leftRightDelim: makeLeftRightDelim\n});\n;// CONCATENATED MODULE: ./src/functions/delimsizing.js\n\n\n\n\n\n\n\n\n\n\n// Extra data needed for the delimiter handler down below\nvar delimiterSizes = {\n \"\\\\bigl\": {\n mclass: \"mopen\",\n size: 1\n },\n \"\\\\Bigl\": {\n mclass: \"mopen\",\n size: 2\n },\n \"\\\\biggl\": {\n mclass: \"mopen\",\n size: 3\n },\n \"\\\\Biggl\": {\n mclass: \"mopen\",\n size: 4\n },\n \"\\\\bigr\": {\n mclass: \"mclose\",\n size: 1\n },\n \"\\\\Bigr\": {\n mclass: \"mclose\",\n size: 2\n },\n \"\\\\biggr\": {\n mclass: \"mclose\",\n size: 3\n },\n \"\\\\Biggr\": {\n mclass: \"mclose\",\n size: 4\n },\n \"\\\\bigm\": {\n mclass: \"mrel\",\n size: 1\n },\n \"\\\\Bigm\": {\n mclass: \"mrel\",\n size: 2\n },\n \"\\\\biggm\": {\n mclass: \"mrel\",\n size: 3\n },\n \"\\\\Biggm\": {\n mclass: \"mrel\",\n size: 4\n },\n \"\\\\big\": {\n mclass: \"mord\",\n size: 1\n },\n \"\\\\Big\": {\n mclass: \"mord\",\n size: 2\n },\n \"\\\\bigg\": {\n mclass: \"mord\",\n size: 3\n },\n \"\\\\Bigg\": {\n mclass: \"mord\",\n size: 4\n }\n};\nvar delimiters = [\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230A\", \"\\u230B\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"<\", \">\", \"\\\\langle\", \"\\u27E8\", \"\\\\rangle\", \"\\u27E9\", \"\\\\lt\", \"\\\\gt\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27EE\", \"\\u27EF\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23B0\", \"\\u23B1\", \"/\", \"\\\\backslash\", \"|\", \"\\\\vert\", \"\\\\|\", \"\\\\Vert\", \"\\\\uparrow\", \"\\\\Uparrow\", \"\\\\downarrow\", \"\\\\Downarrow\", \"\\\\updownarrow\", \"\\\\Updownarrow\", \".\"];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n var symDelim = checkSymbolNodeType(delim);\n\n if (symDelim && utils.contains(delimiters, symDelim.text)) {\n return symDelim;\n } else if (symDelim) {\n throw new src_ParseError(\"Invalid delimiter '\" + symDelim.text + \"' after '\" + context.funcName + \"'\", delim);\n } else {\n throw new src_ParseError(\"Invalid delimiter type '\" + delim.type + \"'\", delim);\n }\n}\n\ndefineFunction({\n type: \"delimsizing\",\n names: [\"\\\\bigl\", \"\\\\Bigl\", \"\\\\biggl\", \"\\\\Biggl\", \"\\\\bigr\", \"\\\\Bigr\", \"\\\\biggr\", \"\\\\Biggr\", \"\\\\bigm\", \"\\\\Bigm\", \"\\\\biggm\", \"\\\\Biggm\", \"\\\\big\", \"\\\\Big\", \"\\\\bigg\", \"\\\\Bigg\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: function handler(context, args) {\n var delim = checkDelimiter(args[0], context);\n return {\n type: \"delimsizing\",\n mode: context.parser.mode,\n size: delimiterSizes[context.funcName].size,\n mclass: delimiterSizes[context.funcName].mclass,\n delim: delim.text\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n if (group.delim === \".\") {\n // Empty delimiters still count as elements, even though they don't\n // show anything.\n return buildCommon.makeSpan([group.mclass]);\n } // Use delimiter.sizedDelim to generate the delimiter.\n\n\n return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);\n },\n mathmlBuilder: function mathmlBuilder(group) {\n var children = [];\n\n if (group.delim !== \".\") {\n children.push(makeText(group.delim, group.mode));\n }\n\n var node = new mathMLTree.MathNode(\"mo\", children);\n\n if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n // Only some of the delimsizing functions act as fences, and they\n // return \"mopen\" or \"mclose\" mclass.\n node.setAttribute(\"fence\", \"true\");\n } else {\n // Explicitly disable fencing if it's not a fence, to override the\n // defaults.\n node.setAttribute(\"fence\", \"false\");\n }\n\n node.setAttribute(\"stretchy\", \"true\");\n var size = makeEm(delimiter.sizeToMaxHeight[group.size]);\n node.setAttribute(\"minsize\", size);\n node.setAttribute(\"maxsize\", size);\n return node;\n }\n});\n\nfunction assertParsed(group) {\n if (!group.body) {\n throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n }\n}\n\ndefineFunction({\n type: \"leftright-right\",\n names: [\"\\\\right\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: function handler(context, args) {\n // \\left case below triggers parsing of \\right in\n // `const right = parser.parseFunction();`\n // uses this return value.\n var color = context.parser.gullet.macros.get(\"\\\\current@color\");\n\n if (color && typeof color !== \"string\") {\n throw new src_ParseError(\"\\\\current@color set to non-string in \\\\right\");\n }\n\n return {\n type: \"leftright-right\",\n mode: context.parser.mode,\n delim: checkDelimiter(args[0], context).text,\n color: color // undefined if not set via \\color\n\n };\n }\n});\ndefineFunction({\n type: \"leftright\",\n names: [\"\\\\left\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: function handler(context, args) {\n var delim = checkDelimiter(args[0], context);\n var parser = context.parser; // Parse out the implicit body\n\n ++parser.leftrightDepth; // parseExpression stops before '\\\\right'\n\n var body = parser.parseExpression(false);\n --parser.leftrightDepth; // Check the next token\n\n parser.expect(\"\\\\right\", false);\n var right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n return {\n type: \"leftright\",\n mode: parser.mode,\n body: body,\n left: delim.text,\n right: right.delim,\n rightColor: right.color\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n assertParsed(group); // Build the inner expression\n\n var inner = buildExpression(group.body, options, true, [\"mopen\", \"mclose\"]);\n var innerHeight = 0;\n var innerDepth = 0;\n var hadMiddle = false; // Calculate its height and depth\n\n for (var i = 0; i < inner.length; i++) {\n // Property `isMiddle` not defined on `span`. See comment in\n // \"middle\"'s htmlBuilder.\n // $FlowFixMe\n if (inner[i].isMiddle) {\n hadMiddle = true;\n } else {\n innerHeight = Math.max(inner[i].height, innerHeight);\n innerDepth = Math.max(inner[i].depth, innerDepth);\n }\n } // The size of delimiters is the same, regardless of what style we are\n // in. Thus, to correctly calculate the size of delimiter we need around\n // a group, we scale down the inner size based on the size.\n\n\n innerHeight *= options.sizeMultiplier;\n innerDepth *= options.sizeMultiplier;\n var leftDelim;\n\n if (group.left === \".\") {\n // Empty delimiters in \\left and \\right make null delimiter spaces.\n leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n } else {\n // Otherwise, use leftRightDelim to generate the correct sized\n // delimiter.\n leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, [\"mopen\"]);\n } // Add it to the beginning of the expression\n\n\n inner.unshift(leftDelim); // Handle middle delimiters\n\n if (hadMiddle) {\n for (var _i = 1; _i < inner.length; _i++) {\n var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in\n // \"middle\"'s htmlBuilder.\n // $FlowFixMe\n\n var isMiddle = middleDelim.isMiddle;\n\n if (isMiddle) {\n // Apply the options that were active when \\middle was called\n inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);\n }\n }\n }\n\n var rightDelim; // Same for the right delimiter, but using color specified by \\color\n\n if (group.right === \".\") {\n rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n } else {\n var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;\n rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, [\"mclose\"]);\n } // Add it to the end of the expression.\n\n\n inner.push(rightDelim);\n return buildCommon.makeSpan([\"minner\"], inner, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n assertParsed(group);\n var inner = buildMathML_buildExpression(group.body, options);\n\n if (group.left !== \".\") {\n var leftNode = new mathMLTree.MathNode(\"mo\", [makeText(group.left, group.mode)]);\n leftNode.setAttribute(\"fence\", \"true\");\n inner.unshift(leftNode);\n }\n\n if (group.right !== \".\") {\n var rightNode = new mathMLTree.MathNode(\"mo\", [makeText(group.right, group.mode)]);\n rightNode.setAttribute(\"fence\", \"true\");\n\n if (group.rightColor) {\n rightNode.setAttribute(\"mathcolor\", group.rightColor);\n }\n\n inner.push(rightNode);\n }\n\n return makeRow(inner);\n }\n});\ndefineFunction({\n type: \"middle\",\n names: [\"\\\\middle\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: function handler(context, args) {\n var delim = checkDelimiter(args[0], context);\n\n if (!context.parser.leftrightDepth) {\n throw new src_ParseError(\"\\\\middle without preceding \\\\left\", delim);\n }\n\n return {\n type: \"middle\",\n mode: context.parser.mode,\n delim: delim.text\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var middleDelim;\n\n if (group.delim === \".\") {\n middleDelim = makeNullDelimiter(options, []);\n } else {\n middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []);\n var isMiddle = {\n delim: group.delim,\n options: options\n }; // Property `isMiddle` not defined on `span`. It is only used in\n // this file above.\n // TODO: Fix this violation of the `span` type and possibly rename\n // things since `isMiddle` sounds like a boolean, but is a struct.\n // $FlowFixMe\n\n middleDelim.isMiddle = isMiddle;\n }\n\n return middleDelim;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n // A Firefox \\middle will strech a character vertically only if it\n // is in the fence part of the operator dictionary at:\n // https://www.w3.org/TR/MathML3/appendixc.html.\n // So we need to avoid U+2223 and use plain \"|\" instead.\n var textNode = group.delim === \"\\\\vert\" || group.delim === \"|\" ? makeText(\"|\", \"text\") : makeText(group.delim, group.mode);\n var middleNode = new mathMLTree.MathNode(\"mo\", [textNode]);\n middleNode.setAttribute(\"fence\", \"true\"); // MathML gives 5/18em spacing to each <mo> element.\n // \\middle should get delimiter spacing instead.\n\n middleNode.setAttribute(\"lspace\", \"0.05em\");\n middleNode.setAttribute(\"rspace\", \"0.05em\");\n return middleNode;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/enclose.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar enclose_htmlBuilder = function htmlBuilder(group, options) {\n // \\cancel, \\bcancel, \\xcancel, \\sout, \\fbox, \\colorbox, \\fcolorbox, \\phase\n // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n var inner = buildCommon.wrapFragment(buildGroup(group.body, options), options);\n var label = group.label.slice(1);\n var scale = options.sizeMultiplier;\n var img;\n var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different\n // depending on whether the subject is wider than it is tall, or vice versa.\n // We don't know the width of a group, so as a proxy, we test if\n // the subject is a single character. This captures most of the\n // subjects that should get the \"tall\" treatment.\n\n var isSingleChar = utils.isCharacterBox(group.body);\n\n if (label === \"sout\") {\n img = buildCommon.makeSpan([\"stretchy\", \"sout\"]);\n img.height = options.fontMetrics().defaultRuleThickness / scale;\n imgShift = -0.5 * options.fontMetrics().xHeight;\n } else if (label === \"phase\") {\n // Set a couple of dimensions from the steinmetz package.\n var lineWeight = calculateSize({\n number: 0.6,\n unit: \"pt\"\n }, options);\n var clearance = calculateSize({\n number: 0.35,\n unit: \"ex\"\n }, options); // Prevent size changes like \\Huge from affecting line thickness\n\n var newOptions = options.havingBaseSizing();\n scale = scale / newOptions.sizeMultiplier;\n var angleHeight = inner.height + inner.depth + lineWeight + clearance; // Reserve a left pad for the angle.\n\n inner.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight); // Create an SVG\n\n var viewBoxHeight = Math.floor(1000 * angleHeight * scale);\n var path = phasePath(viewBoxHeight);\n var svgNode = new SvgNode([new PathNode(\"phase\", path)], {\n \"width\": \"400em\",\n \"height\": makeEm(viewBoxHeight / 1000),\n \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n \"preserveAspectRatio\": \"xMinYMin slice\"\n }); // Wrap it in a span with overflow: hidden.\n\n img = buildCommon.makeSvgSpan([\"hide-tail\"], [svgNode], options);\n img.style.height = makeEm(angleHeight);\n imgShift = inner.depth + lineWeight + clearance;\n } else {\n // Add horizontal padding\n if (/cancel/.test(label)) {\n if (!isSingleChar) {\n inner.classes.push(\"cancel-pad\");\n }\n } else if (label === \"angl\") {\n inner.classes.push(\"anglpad\");\n } else {\n inner.classes.push(\"boxpad\");\n } // Add vertical padding\n\n\n var topPad = 0;\n var bottomPad = 0;\n var ruleThickness = 0; // ref: cancel package: \\advance\\totalheight2\\p@ % \"+2\"\n\n if (/box/.test(label)) {\n ruleThickness = Math.max(options.fontMetrics().fboxrule, // default\n options.minRuleThickness // User override.\n );\n topPad = options.fontMetrics().fboxsep + (label === \"colorbox\" ? 0 : ruleThickness);\n bottomPad = topPad;\n } else if (label === \"angl\") {\n ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself.\n\n bottomPad = Math.max(0, 0.25 - inner.depth);\n } else {\n topPad = isSingleChar ? 0.2 : 0;\n bottomPad = topPad;\n }\n\n img = stretchy.encloseSpan(inner, label, topPad, bottomPad, options);\n\n if (/fbox|boxed|fcolorbox/.test(label)) {\n img.style.borderStyle = \"solid\";\n img.style.borderWidth = makeEm(ruleThickness);\n } else if (label === \"angl\" && ruleThickness !== 0.049) {\n img.style.borderTopWidth = makeEm(ruleThickness);\n img.style.borderRightWidth = makeEm(ruleThickness);\n }\n\n imgShift = inner.depth + bottomPad;\n\n if (group.backgroundColor) {\n img.style.backgroundColor = group.backgroundColor;\n\n if (group.borderColor) {\n img.style.borderColor = group.borderColor;\n }\n }\n }\n\n var vlist;\n\n if (group.backgroundColor) {\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [// Put the color background behind inner;\n {\n type: \"elem\",\n elem: img,\n shift: imgShift\n }, {\n type: \"elem\",\n elem: inner,\n shift: 0\n }]\n }, options);\n } else {\n var classes = /cancel|phase/.test(label) ? [\"svg-align\"] : [];\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [// Write the \\cancel stroke on top of inner.\n {\n type: \"elem\",\n elem: inner,\n shift: 0\n }, {\n type: \"elem\",\n elem: img,\n shift: imgShift,\n wrapperClasses: classes\n }]\n }, options);\n }\n\n if (/cancel/.test(label)) {\n // The cancel package documentation says that cancel lines add their height\n // to the expression, but tests show that isn't how it actually works.\n vlist.height = inner.height;\n vlist.depth = inner.depth;\n }\n\n if (/cancel/.test(label) && !isSingleChar) {\n // cancel does not create horiz space for its line extension.\n return buildCommon.makeSpan([\"mord\", \"cancel-lap\"], [vlist], options);\n } else {\n return buildCommon.makeSpan([\"mord\"], [vlist], options);\n }\n};\n\nvar enclose_mathmlBuilder = function mathmlBuilder(group, options) {\n var fboxsep = 0;\n var node = new mathMLTree.MathNode(group.label.indexOf(\"colorbox\") > -1 ? \"mpadded\" : \"menclose\", [buildMathML_buildGroup(group.body, options)]);\n\n switch (group.label) {\n case \"\\\\cancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike\");\n break;\n\n case \"\\\\bcancel\":\n node.setAttribute(\"notation\", \"downdiagonalstrike\");\n break;\n\n case \"\\\\phase\":\n node.setAttribute(\"notation\", \"phasorangle\");\n break;\n\n case \"\\\\sout\":\n node.setAttribute(\"notation\", \"horizontalstrike\");\n break;\n\n case \"\\\\fbox\":\n node.setAttribute(\"notation\", \"box\");\n break;\n\n case \"\\\\angl\":\n node.setAttribute(\"notation\", \"actuarial\");\n break;\n\n case \"\\\\fcolorbox\":\n case \"\\\\colorbox\":\n // <menclose> doesn't have a good notation option. So use <mpadded>\n // instead. Set some attributes that come included with <menclose>.\n fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;\n node.setAttribute(\"width\", \"+\" + 2 * fboxsep + \"pt\");\n node.setAttribute(\"height\", \"+\" + 2 * fboxsep + \"pt\");\n node.setAttribute(\"lspace\", fboxsep + \"pt\"); //\n\n node.setAttribute(\"voffset\", fboxsep + \"pt\");\n\n if (group.label === \"\\\\fcolorbox\") {\n var thk = Math.max(options.fontMetrics().fboxrule, // default\n options.minRuleThickness // user override\n );\n node.setAttribute(\"style\", \"border: \" + thk + \"em solid \" + String(group.borderColor));\n }\n\n break;\n\n case \"\\\\xcancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n break;\n }\n\n if (group.backgroundColor) {\n node.setAttribute(\"mathbackground\", group.backgroundColor);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\colorbox\"],\n props: {\n numArgs: 2,\n allowedInText: true,\n argTypes: [\"color\", \"text\"]\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var color = assertNodeType(args[0], \"color-token\").color;\n var body = args[1];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor: color,\n body: body\n };\n },\n htmlBuilder: enclose_htmlBuilder,\n mathmlBuilder: enclose_mathmlBuilder\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fcolorbox\"],\n props: {\n numArgs: 3,\n allowedInText: true,\n argTypes: [\"color\", \"color\", \"text\"]\n },\n handler: function handler(_ref2, args, optArgs) {\n var parser = _ref2.parser,\n funcName = _ref2.funcName;\n var borderColor = assertNodeType(args[0], \"color-token\").color;\n var backgroundColor = assertNodeType(args[1], \"color-token\").color;\n var body = args[2];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor: backgroundColor,\n borderColor: borderColor,\n body: body\n };\n },\n htmlBuilder: enclose_htmlBuilder,\n mathmlBuilder: enclose_mathmlBuilder\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n handler: function handler(_ref3, args) {\n var parser = _ref3.parser;\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\fbox\",\n body: args[0]\n };\n }\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\sout\", \"\\\\phase\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref4, args) {\n var parser = _ref4.parser,\n funcName = _ref4.funcName;\n var body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body: body\n };\n },\n htmlBuilder: enclose_htmlBuilder,\n mathmlBuilder: enclose_mathmlBuilder\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\angl\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: false\n },\n handler: function handler(_ref5, args) {\n var parser = _ref5.parser;\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\angl\",\n body: args[0]\n };\n }\n});\n;// CONCATENATED MODULE: ./src/defineEnvironment.js\n\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nvar _environments = {};\nfunction defineEnvironment(_ref) {\n var type = _ref.type,\n names = _ref.names,\n props = _ref.props,\n handler = _ref.handler,\n htmlBuilder = _ref.htmlBuilder,\n mathmlBuilder = _ref.mathmlBuilder;\n // Set default values of environments.\n var data = {\n type: type,\n numArgs: props.numArgs || 0,\n allowedInText: false,\n numOptionalArgs: 0,\n handler: handler\n };\n\n for (var i = 0; i < names.length; ++i) {\n // TODO: The value type of _environments should be a type union of all\n // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is\n // an existential type.\n _environments[names[i]] = data;\n }\n\n if (htmlBuilder) {\n _htmlGroupBuilders[type] = htmlBuilder;\n }\n\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n}\n;// CONCATENATED MODULE: ./src/defineMacro.js\n\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nvar _macros = {}; // This function might one day accept an additional argument and do more things.\n\nfunction defineMacro(name, body) {\n _macros[name] = body;\n}\n;// CONCATENATED MODULE: ./src/SourceLocation.js\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nvar SourceLocation = /*#__PURE__*/function () {\n // The + prefix indicates that these fields aren't writeable\n // Lexer holding the input string.\n // Start offset, zero-based inclusive.\n // End offset, zero-based exclusive.\n function SourceLocation(lexer, start, end) {\n this.lexer = void 0;\n this.start = void 0;\n this.end = void 0;\n this.lexer = lexer;\n this.start = start;\n this.end = end;\n }\n /**\n * Merges two `SourceLocation`s from location providers, given they are\n * provided in order of appearance.\n * - Returns the first one's location if only the first is provided.\n * - Returns a merged range of the first and the last if both are provided\n * and their lexers match.\n * - Otherwise, returns null.\n */\n\n\n SourceLocation.range = function range(first, second) {\n if (!second) {\n return first && first.loc;\n } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n return null;\n } else {\n return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n }\n };\n\n return SourceLocation;\n}();\n\n\n;// CONCATENATED MODULE: ./src/Token.js\n\n/**\n * Interface required to break circular dependency between Token, Lexer, and\n * ParseError.\n */\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nvar Token = /*#__PURE__*/function () {\n // don't expand the token\n // used in \\noexpand\n function Token(text, // the text of this token\n loc) {\n this.text = void 0;\n this.loc = void 0;\n this.noexpand = void 0;\n this.treatAsRelax = void 0;\n this.text = text;\n this.loc = loc;\n }\n /**\n * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n * the whole input range enclosed by these two.\n */\n\n\n var _proto = Token.prototype;\n\n _proto.range = function range(endToken, // last token of the range, inclusive\n text // the text of the newly constructed token\n ) {\n return new Token(text, SourceLocation.range(this, endToken));\n };\n\n return Token;\n}();\n;// CONCATENATED MODULE: ./src/environments/array.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Helper functions\nfunction getHLines(parser) {\n // Return an array. The array length = number of hlines.\n // Each element in the array tells if the line is dashed.\n var hlineInfo = [];\n parser.consumeSpaces();\n var nxt = parser.fetch().text;\n\n if (nxt === \"\\\\relax\") {\n // \\relax is an artifact of the \\cr macro below\n parser.consume();\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n\n while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n parser.consume();\n hlineInfo.push(nxt === \"\\\\hdashline\");\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n\n return hlineInfo;\n}\n\nvar validateAmsEnvironmentContext = function validateAmsEnvironmentContext(context) {\n var settings = context.parser.settings;\n\n if (!settings.displayMode) {\n throw new src_ParseError(\"{\" + context.envName + \"} can be used only in\" + \" display mode.\");\n }\n}; // autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\n\n\nfunction getAutoTag(name) {\n if (name.indexOf(\"ed\") === -1) {\n return name.indexOf(\"*\") === -1;\n } // return undefined;\n\n}\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell. If given an optional argument style\n * (\"text\", \"display\", etc.), then each cell is cast into that style.\n */\n\n\nfunction parseArray(parser, _ref, style) {\n var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter,\n addJot = _ref.addJot,\n cols = _ref.cols,\n arraystretch = _ref.arraystretch,\n colSeparationType = _ref.colSeparationType,\n autoTag = _ref.autoTag,\n singleRow = _ref.singleRow,\n emptySingleRow = _ref.emptySingleRow,\n maxNumCols = _ref.maxNumCols,\n leqno = _ref.leqno;\n parser.gullet.beginGroup();\n\n if (!singleRow) {\n // \\cr is equivalent to \\\\ without the optional size argument (see below)\n // TODO: provide helpful error when \\cr is used outside array environment\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n } // Get current arraystretch if it's not set by the environment\n\n\n if (!arraystretch) {\n var stretch = parser.gullet.expandMacroAsText(\"\\\\arraystretch\");\n\n if (stretch == null) {\n // Default \\arraystretch from lttab.dtx\n arraystretch = 1;\n } else {\n arraystretch = parseFloat(stretch);\n\n if (!arraystretch || arraystretch < 0) {\n throw new src_ParseError(\"Invalid \\\\arraystretch: \" + stretch);\n }\n }\n } // Start group for first cell\n\n\n parser.gullet.beginGroup();\n var row = [];\n var body = [row];\n var rowGaps = [];\n var hLinesBeforeRow = [];\n var tags = autoTag != null ? [] : undefined; // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n // whether this row should have an equation number. Simulate this with\n // a \\@eqnsw macro set to 1 or 0.\n\n function beginRow() {\n if (autoTag) {\n parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n }\n }\n\n function endRow() {\n if (tags) {\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n } else {\n tags.push(Boolean(autoTag) && parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n }\n }\n }\n\n beginRow(); // Test for \\hline at the top of the array.\n\n hLinesBeforeRow.push(getHLines(parser));\n\n while (true) {\n // eslint-disable-line no-constant-condition\n // Parse each cell in its own group (namespace)\n var cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n cell = {\n type: \"ordgroup\",\n mode: parser.mode,\n body: cell\n };\n\n if (style) {\n cell = {\n type: \"styling\",\n mode: parser.mode,\n style: style,\n body: [cell]\n };\n }\n\n row.push(cell);\n var next = parser.fetch().text;\n\n if (next === \"&\") {\n if (maxNumCols && row.length === maxNumCols) {\n if (singleRow || colSeparationType) {\n // {equation} or {split}\n throw new src_ParseError(\"Too many tab characters: &\", parser.nextToken);\n } else {\n // {array} environment\n parser.settings.reportNonstrict(\"textEnv\", \"Too few columns \" + \"specified in the {array} column argument.\");\n }\n }\n\n parser.consume();\n } else if (next === \"\\\\end\") {\n endRow(); // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n // the last line is empty. However, AMS environments keep the\n // empty row if it's the only one.\n // NOTE: Currently, `cell` is the last item added into `row`.\n\n if (row.length === 1 && cell.type === \"styling\" && cell.body[0].body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n body.pop();\n }\n\n if (hLinesBeforeRow.length < body.length + 1) {\n hLinesBeforeRow.push([]);\n }\n\n break;\n } else if (next === \"\\\\\\\\\") {\n parser.consume();\n var size = void 0; // \\def\\Let@{\\let\\\\\\math@cr}\n // \\def\\math@cr{...\\math@cr@}\n // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n // \\def\\math@cr@@@{\\cr}\n\n if (parser.gullet.future().text !== \" \") {\n size = parser.parseSizeGroup(true);\n }\n\n rowGaps.push(size ? size.value : null);\n endRow(); // check for \\hline(s) following the row separator\n\n hLinesBeforeRow.push(getHLines(parser));\n row = [];\n body.push(row);\n beginRow();\n } else {\n throw new src_ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n } // End cell group\n\n\n parser.gullet.endGroup(); // End array group defining \\cr\n\n parser.gullet.endGroup();\n return {\n type: \"array\",\n mode: parser.mode,\n addJot: addJot,\n arraystretch: arraystretch,\n body: body,\n cols: cols,\n rowGaps: rowGaps,\n hskipBeforeAndAfter: hskipBeforeAndAfter,\n hLinesBeforeRow: hLinesBeforeRow,\n colSeparationType: colSeparationType,\n tags: tags,\n leqno: leqno\n };\n} // Decides on a style for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\n\n\nfunction dCellStyle(envName) {\n if (envName.slice(0, 1) === \"d\") {\n return \"display\";\n } else {\n return \"text\";\n }\n}\n\nvar array_htmlBuilder = function htmlBuilder(group, options) {\n var r;\n var c;\n var nr = group.body.length;\n var hLinesBeforeRow = group.hLinesBeforeRow;\n var nc = 0;\n var body = new Array(nr);\n var hlines = [];\n var ruleThickness = Math.max( // From LaTeX \\showthe\\arrayrulewidth. Equals 0.04 em.\n options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override.\n ); // Horizontal spacing\n\n var pt = 1 / options.fontMetrics().ptPerEm;\n var arraycolsep = 5 * pt; // default value, i.e. \\arraycolsep in article.cls\n\n if (group.colSeparationType && group.colSeparationType === \"small\") {\n // We're in a {smallmatrix}. Default column space is \\thickspace,\n // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.\n // But that needs adjustment because LaTeX applies \\scriptstyle to the\n // entire array, including the colspace, but this function applies\n // \\scriptstyle only inside each element.\n var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier;\n arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);\n } // Vertical spacing\n\n\n var baselineskip = group.colSeparationType === \"CD\" ? calculateSize({\n number: 3,\n unit: \"ex\"\n }, options) : 12 * pt; // see size10.clo\n // Default \\jot from ltmath.dtx\n // TODO(edemaine): allow overriding \\jot via \\setlength (#687)\n\n var jot = 3 * pt;\n var arrayskip = group.arraystretch * baselineskip;\n var arstrutHeight = 0.7 * arrayskip; // \\strutbox in ltfsstrc.dtx and\n\n var arstrutDepth = 0.3 * arrayskip; // \\@arstrutbox in lttab.dtx\n\n var totalHeight = 0; // Set a position for \\hline(s) at the top of the array, if any.\n\n function setHLinePos(hlinesInGap) {\n for (var i = 0; i < hlinesInGap.length; ++i) {\n if (i > 0) {\n totalHeight += 0.25;\n }\n\n hlines.push({\n pos: totalHeight,\n isDashed: hlinesInGap[i]\n });\n }\n }\n\n setHLinePos(hLinesBeforeRow[0]);\n\n for (r = 0; r < group.body.length; ++r) {\n var inrow = group.body[r];\n var height = arstrutHeight; // \\@array adds an \\@arstrut\n\n var depth = arstrutDepth; // to each tow (via the template)\n\n if (nc < inrow.length) {\n nc = inrow.length;\n }\n\n var outrow = new Array(inrow.length);\n\n for (c = 0; c < inrow.length; ++c) {\n var elt = buildGroup(inrow[c], options);\n\n if (depth < elt.depth) {\n depth = elt.depth;\n }\n\n if (height < elt.height) {\n height = elt.height;\n }\n\n outrow[c] = elt;\n }\n\n var rowGap = group.rowGaps[r];\n var gap = 0;\n\n if (rowGap) {\n gap = calculateSize(rowGap, options);\n\n if (gap > 0) {\n // \\@argarraycr\n gap += arstrutDepth;\n\n if (depth < gap) {\n depth = gap; // \\@xargarraycr\n }\n\n gap = 0;\n }\n } // In AMS multiline environments such as aligned and gathered, rows\n // correspond to lines that have additional \\jot added to the\n // \\baselineskip via \\openup.\n\n\n if (group.addJot) {\n depth += jot;\n }\n\n outrow.height = height;\n outrow.depth = depth;\n totalHeight += height;\n outrow.pos = totalHeight;\n totalHeight += depth + gap; // \\@yargarraycr\n\n body[r] = outrow; // Set a position for \\hline(s), if any.\n\n setHLinePos(hLinesBeforeRow[r + 1]);\n }\n\n var offset = totalHeight / 2 + options.fontMetrics().axisHeight;\n var colDescriptions = group.cols || [];\n var cols = [];\n var colSep;\n var colDescrNum;\n var tagSpans = [];\n\n if (group.tags && group.tags.some(function (tag) {\n return tag;\n })) {\n // An environment with manual tags and/or automatic equation numbers.\n // Create node(s), the latter of which trigger CSS counter increment.\n for (r = 0; r < nr; ++r) {\n var rw = body[r];\n var shift = rw.pos - offset;\n var tag = group.tags[r];\n var tagSpan = void 0;\n\n if (tag === true) {\n // automatic numbering\n tagSpan = buildCommon.makeSpan([\"eqn-num\"], [], options);\n } else if (tag === false) {\n // \\nonumber/\\notag or starred environment\n tagSpan = buildCommon.makeSpan([], [], options);\n } else {\n // manual \\tag\n tagSpan = buildCommon.makeSpan([], buildExpression(tag, options, true), options);\n }\n\n tagSpan.depth = rw.depth;\n tagSpan.height = rw.height;\n tagSpans.push({\n type: \"elem\",\n elem: tagSpan,\n shift: shift\n });\n }\n }\n\n for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column\n // descriptions, so trailing separators don't get lost.\n c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {\n var colDescr = colDescriptions[colDescrNum] || {};\n var firstSeparator = true;\n\n while (colDescr.type === \"separator\") {\n // If there is more than one separator in a row, add a space\n // between them.\n if (!firstSeparator) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(options.fontMetrics().doubleRuleSep);\n cols.push(colSep);\n }\n\n if (colDescr.separator === \"|\" || colDescr.separator === \":\") {\n var lineType = colDescr.separator === \"|\" ? \"solid\" : \"dashed\";\n var separator = buildCommon.makeSpan([\"vertical-separator\"], [], options);\n separator.style.height = makeEm(totalHeight);\n separator.style.borderRightWidth = makeEm(ruleThickness);\n separator.style.borderRightStyle = lineType;\n separator.style.margin = \"0 \" + makeEm(-ruleThickness / 2);\n\n var _shift = totalHeight - offset;\n\n if (_shift) {\n separator.style.verticalAlign = makeEm(-_shift);\n }\n\n cols.push(separator);\n } else {\n throw new src_ParseError(\"Invalid separator type: \" + colDescr.separator);\n }\n\n colDescrNum++;\n colDescr = colDescriptions[colDescrNum] || {};\n firstSeparator = false;\n }\n\n if (c >= nc) {\n continue;\n }\n\n var sepwidth = void 0;\n\n if (c > 0 || group.hskipBeforeAndAfter) {\n sepwidth = utils.deflt(colDescr.pregap, arraycolsep);\n\n if (sepwidth !== 0) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(sepwidth);\n cols.push(colSep);\n }\n }\n\n var col = [];\n\n for (r = 0; r < nr; ++r) {\n var row = body[r];\n var elem = row[c];\n\n if (!elem) {\n continue;\n }\n\n var _shift2 = row.pos - offset;\n\n elem.depth = row.depth;\n elem.height = row.height;\n col.push({\n type: \"elem\",\n elem: elem,\n shift: _shift2\n });\n }\n\n col = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: col\n }, options);\n col = buildCommon.makeSpan([\"col-align-\" + (colDescr.align || \"c\")], [col]);\n cols.push(col);\n\n if (c < nc - 1 || group.hskipBeforeAndAfter) {\n sepwidth = utils.deflt(colDescr.postgap, arraycolsep);\n\n if (sepwidth !== 0) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(sepwidth);\n cols.push(colSep);\n }\n }\n }\n\n body = buildCommon.makeSpan([\"mtable\"], cols); // Add \\hline(s), if any.\n\n if (hlines.length > 0) {\n var line = buildCommon.makeLineSpan(\"hline\", options, ruleThickness);\n var dashes = buildCommon.makeLineSpan(\"hdashline\", options, ruleThickness);\n var vListElems = [{\n type: \"elem\",\n elem: body,\n shift: 0\n }];\n\n while (hlines.length > 0) {\n var hline = hlines.pop();\n var lineShift = hline.pos - offset;\n\n if (hline.isDashed) {\n vListElems.push({\n type: \"elem\",\n elem: dashes,\n shift: lineShift\n });\n } else {\n vListElems.push({\n type: \"elem\",\n elem: line,\n shift: lineShift\n });\n }\n }\n\n body = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: vListElems\n }, options);\n }\n\n if (tagSpans.length === 0) {\n return buildCommon.makeSpan([\"mord\"], [body], options);\n } else {\n var eqnNumCol = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: tagSpans\n }, options);\n eqnNumCol = buildCommon.makeSpan([\"tag\"], [eqnNumCol], options);\n return buildCommon.makeFragment([body, eqnNumCol]);\n }\n};\n\nvar alignMap = {\n c: \"center \",\n l: \"left \",\n r: \"right \"\n};\n\nvar array_mathmlBuilder = function mathmlBuilder(group, options) {\n var tbl = [];\n var glue = new mathMLTree.MathNode(\"mtd\", [], [\"mtr-glue\"]);\n var tag = new mathMLTree.MathNode(\"mtd\", [], [\"mml-eqn-num\"]);\n\n for (var i = 0; i < group.body.length; i++) {\n var rw = group.body[i];\n var row = [];\n\n for (var j = 0; j < rw.length; j++) {\n row.push(new mathMLTree.MathNode(\"mtd\", [buildMathML_buildGroup(rw[j], options)]));\n }\n\n if (group.tags && group.tags[i]) {\n row.unshift(glue);\n row.push(glue);\n\n if (group.leqno) {\n row.unshift(tag);\n } else {\n row.push(tag);\n }\n }\n\n tbl.push(new mathMLTree.MathNode(\"mtr\", row));\n }\n\n var table = new mathMLTree.MathNode(\"mtable\", tbl); // Set column alignment, row spacing, column spacing, and\n // array lines by setting attributes on the table element.\n // Set the row spacing. In MathML, we specify a gap distance.\n // We do not use rowGap[] because MathML automatically increases\n // cell height with the height/depth of the element content.\n // LaTeX \\arraystretch multiplies the row baseline-to-baseline distance.\n // We simulate this by adding (arraystretch - 1)em to the gap. This\n // does a reasonable job of adjusting arrays containing 1 em tall content.\n // The 0.16 and 0.09 values are found emprically. They produce an array\n // similar to LaTeX and in which content does not interfere with \\hines.\n\n var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}\n : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);\n table.setAttribute(\"rowspacing\", makeEm(gap)); // MathML table lines go only between cells.\n // To place a line on an edge we'll use <menclose>, if necessary.\n\n var menclose = \"\";\n var align = \"\";\n\n if (group.cols && group.cols.length > 0) {\n // Find column alignment, column spacing, and vertical lines.\n var cols = group.cols;\n var columnLines = \"\";\n var prevTypeWasAlign = false;\n var iStart = 0;\n var iEnd = cols.length;\n\n if (cols[0].type === \"separator\") {\n menclose += \"top \";\n iStart = 1;\n }\n\n if (cols[cols.length - 1].type === \"separator\") {\n menclose += \"bottom \";\n iEnd -= 1;\n }\n\n for (var _i = iStart; _i < iEnd; _i++) {\n if (cols[_i].type === \"align\") {\n align += alignMap[cols[_i].align];\n\n if (prevTypeWasAlign) {\n columnLines += \"none \";\n }\n\n prevTypeWasAlign = true;\n } else if (cols[_i].type === \"separator\") {\n // MathML accepts only single lines between cells.\n // So we read only the first of consecutive separators.\n if (prevTypeWasAlign) {\n columnLines += cols[_i].separator === \"|\" ? \"solid \" : \"dashed \";\n prevTypeWasAlign = false;\n }\n }\n }\n\n table.setAttribute(\"columnalign\", align.trim());\n\n if (/[sd]/.test(columnLines)) {\n table.setAttribute(\"columnlines\", columnLines.trim());\n }\n } // Set column spacing.\n\n\n if (group.colSeparationType === \"align\") {\n var _cols = group.cols || [];\n\n var spacing = \"\";\n\n for (var _i2 = 1; _i2 < _cols.length; _i2++) {\n spacing += _i2 % 2 ? \"0em \" : \"1em \";\n }\n\n table.setAttribute(\"columnspacing\", spacing.trim());\n } else if (group.colSeparationType === \"alignat\" || group.colSeparationType === \"gather\") {\n table.setAttribute(\"columnspacing\", \"0em\");\n } else if (group.colSeparationType === \"small\") {\n table.setAttribute(\"columnspacing\", \"0.2778em\");\n } else if (group.colSeparationType === \"CD\") {\n table.setAttribute(\"columnspacing\", \"0.5em\");\n } else {\n table.setAttribute(\"columnspacing\", \"1em\");\n } // Address \\hline and \\hdashline\n\n\n var rowLines = \"\";\n var hlines = group.hLinesBeforeRow;\n menclose += hlines[0].length > 0 ? \"left \" : \"\";\n menclose += hlines[hlines.length - 1].length > 0 ? \"right \" : \"\";\n\n for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) {\n rowLines += hlines[_i3].length === 0 ? \"none \" // MathML accepts only a single line between rows. Read one element.\n : hlines[_i3][0] ? \"dashed \" : \"solid \";\n }\n\n if (/[sd]/.test(rowLines)) {\n table.setAttribute(\"rowlines\", rowLines.trim());\n }\n\n if (menclose !== \"\") {\n table = new mathMLTree.MathNode(\"menclose\", [table]);\n table.setAttribute(\"notation\", menclose.trim());\n }\n\n if (group.arraystretch && group.arraystretch < 1) {\n // A small array. Wrap in scriptstyle so row gap is not too large.\n table = new mathMLTree.MathNode(\"mstyle\", [table]);\n table.setAttribute(\"scriptlevel\", \"1\");\n }\n\n return table;\n}; // Convenience function for align, align*, aligned, alignat, alignat*, alignedat.\n\n\nvar alignedHandler = function alignedHandler(context, args) {\n if (context.envName.indexOf(\"ed\") === -1) {\n validateAmsEnvironmentContext(context);\n }\n\n var cols = [];\n var separationType = context.envName.indexOf(\"at\") > -1 ? \"alignat\" : \"align\";\n var isSplit = context.envName === \"split\";\n var res = parseArray(context.parser, {\n cols: cols,\n addJot: true,\n autoTag: isSplit ? undefined : getAutoTag(context.envName),\n emptySingleRow: true,\n colSeparationType: separationType,\n maxNumCols: isSplit ? 2 : undefined,\n leqno: context.parser.settings.leqno\n }, \"display\"); // Determining number of columns.\n // 1. If the first argument is given, we use it as a number of columns,\n // and makes sure that each row doesn't exceed that number.\n // 2. Otherwise, just count number of columns = maximum number\n // of cells in each row (\"aligned\" mode -- isAligned will be true).\n //\n // At the same time, prepend empty group {} at beginning of every second\n // cell in each row (starting with second cell) so that operators become\n // binary. This behavior is implemented in amsmath's \\start@aligned.\n\n var numMaths;\n var numCols = 0;\n var emptyGroup = {\n type: \"ordgroup\",\n mode: context.mode,\n body: []\n };\n\n if (args[0] && args[0].type === \"ordgroup\") {\n var arg0 = \"\";\n\n for (var i = 0; i < args[0].body.length; i++) {\n var textord = assertNodeType(args[0].body[i], \"textord\");\n arg0 += textord.text;\n }\n\n numMaths = Number(arg0);\n numCols = numMaths * 2;\n }\n\n var isAligned = !numCols;\n res.body.forEach(function (row) {\n for (var _i4 = 1; _i4 < row.length; _i4 += 2) {\n // Modify ordgroup node within styling node\n var styling = assertNodeType(row[_i4], \"styling\");\n var ordgroup = assertNodeType(styling.body[0], \"ordgroup\");\n ordgroup.body.unshift(emptyGroup);\n }\n\n if (!isAligned) {\n // Case 1\n var curMaths = row.length / 2;\n\n if (numMaths < curMaths) {\n throw new src_ParseError(\"Too many math in a row: \" + (\"expected \" + numMaths + \", but got \" + curMaths), row[0]);\n }\n } else if (numCols < row.length) {\n // Case 2\n numCols = row.length;\n }\n }); // Adjusting alignment.\n // In aligned mode, we add one \\qquad between columns;\n // otherwise we add nothing.\n\n for (var _i5 = 0; _i5 < numCols; ++_i5) {\n var align = \"r\";\n var pregap = 0;\n\n if (_i5 % 2 === 1) {\n align = \"l\";\n } else if (_i5 > 0 && isAligned) {\n // \"aligned\" mode.\n pregap = 1; // add one \\quad\n }\n\n cols[_i5] = {\n type: \"align\",\n align: align,\n pregap: pregap,\n postgap: 0\n };\n }\n\n res.colSeparationType = isAligned ? \"align\" : \"alignat\";\n return res;\n}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\n\n\ndefineEnvironment({\n type: \"array\",\n names: [\"array\", \"darray\"],\n props: {\n numArgs: 1\n },\n handler: function handler(context, args) {\n // Since no types are specified above, the two possibilities are\n // - The argument is wrapped in {} or [], in which case Parser's\n // parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n // - The argument is a bare symbol node.\n var symNode = checkSymbolNodeType(args[0]);\n var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n var cols = colalign.map(function (nde) {\n var node = assertSymbolNodeType(nde);\n var ca = node.text;\n\n if (\"lcr\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n } else if (ca === \"|\") {\n return {\n type: \"separator\",\n separator: \"|\"\n };\n } else if (ca === \":\") {\n return {\n type: \"separator\",\n separator: \":\"\n };\n }\n\n throw new src_ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n var res = {\n cols: cols,\n hskipBeforeAndAfter: true,\n // \\@preamble in lttab.dtx\n maxNumCols: cols.length\n };\n return parseArray(context.parser, res, dCellStyle(context.envName));\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n}); // The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"matrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\", \"matrix*\", \"pmatrix*\", \"bmatrix*\", \"Bmatrix*\", \"vmatrix*\", \"Vmatrix*\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n var delimiters = {\n \"matrix\": null,\n \"pmatrix\": [\"(\", \")\"],\n \"bmatrix\": [\"[\", \"]\"],\n \"Bmatrix\": [\"\\\\{\", \"\\\\}\"],\n \"vmatrix\": [\"|\", \"|\"],\n \"Vmatrix\": [\"\\\\Vert\", \"\\\\Vert\"]\n }[context.envName.replace(\"*\", \"\")]; // \\hskip -\\arraycolsep in amsmath\n\n var colAlign = \"c\";\n var payload = {\n hskipBeforeAndAfter: false,\n cols: [{\n type: \"align\",\n align: colAlign\n }]\n };\n\n if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n // It's one of the mathtools starred functions.\n // Parse the optional alignment argument.\n var parser = context.parser;\n parser.consumeSpaces();\n\n if (parser.fetch().text === \"[\") {\n parser.consume();\n parser.consumeSpaces();\n colAlign = parser.fetch().text;\n\n if (\"lcr\".indexOf(colAlign) === -1) {\n throw new src_ParseError(\"Expected l or c or r\", parser.nextToken);\n }\n\n parser.consume();\n parser.consumeSpaces();\n parser.expect(\"]\");\n parser.consume();\n payload.cols = [{\n type: \"align\",\n align: colAlign\n }];\n }\n }\n\n var res = parseArray(context.parser, payload, dCellStyle(context.envName)); // Populate cols with the correct number of column alignment specs.\n\n var numCols = Math.max.apply(Math, [0].concat(res.body.map(function (row) {\n return row.length;\n })));\n res.cols = new Array(numCols).fill({\n type: \"align\",\n align: colAlign\n });\n return delimiters ? {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: delimiters[0],\n right: delimiters[1],\n rightColor: undefined // \\right uninfluenced by \\color in array\n\n } : res;\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"smallmatrix\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n var payload = {\n arraystretch: 0.5\n };\n var res = parseArray(context.parser, payload, \"script\");\n res.colSeparationType = \"small\";\n return res;\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"subarray\"],\n props: {\n numArgs: 1\n },\n handler: function handler(context, args) {\n // Parsing of {subarray} is similar to {array}\n var symNode = checkSymbolNodeType(args[0]);\n var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n var cols = colalign.map(function (nde) {\n var node = assertSymbolNodeType(nde);\n var ca = node.text; // {subarray} only recognizes \"l\" & \"c\"\n\n if (\"lc\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n }\n\n throw new src_ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n\n if (cols.length > 1) {\n throw new src_ParseError(\"{subarray} can contain only one column\");\n }\n\n var res = {\n cols: cols,\n hskipBeforeAndAfter: false,\n arraystretch: 0.5\n };\n res = parseArray(context.parser, res, \"script\");\n\n if (res.body.length > 0 && res.body[0].length > 1) {\n throw new src_ParseError(\"{subarray} can contain only one column\");\n }\n\n return res;\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n}); // A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\\arraystretch{1.2}%\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n var payload = {\n arraystretch: 1.2,\n cols: [{\n type: \"align\",\n align: \"l\",\n pregap: 0,\n // TODO(kevinb) get the current style.\n // For now we use the metrics for TEXT style which is what we were\n // doing before. Before attempting to get the current style we\n // should look at TeX's behavior especially for \\over and matrices.\n postgap: 1.0\n /* 1em quad */\n\n }, {\n type: \"align\",\n align: \"l\",\n pregap: 0,\n postgap: 0\n }]\n };\n var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n return {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n rightColor: undefined\n };\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n}); // In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\n// Note that we assume \\nomallineskiplimit to be zero,\n// so that \\strut@ is the same as \\strut.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"align\", \"align*\", \"aligned\", \"split\"],\n props: {\n numArgs: 0\n },\n handler: alignedHandler,\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n}); // A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"gathered\", \"gather\", \"gather*\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n if (utils.contains([\"gather\", \"gather*\"], context.envName)) {\n validateAmsEnvironmentContext(context);\n }\n\n var res = {\n cols: [{\n type: \"align\",\n align: \"c\"\n }],\n addJot: true,\n colSeparationType: \"gather\",\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n}); // alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust spacing between\n// each columns.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"alignat\", \"alignat*\", \"alignedat\"],\n props: {\n numArgs: 1\n },\n handler: alignedHandler,\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"equation\", \"equation*\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n validateAmsEnvironmentContext(context);\n var res = {\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n singleRow: true,\n maxNumCols: 1,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"CD\"],\n props: {\n numArgs: 0\n },\n handler: function handler(context) {\n validateAmsEnvironmentContext(context);\n return parseCD(context.parser);\n },\n htmlBuilder: array_htmlBuilder,\n mathmlBuilder: array_mathmlBuilder\n});\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\"); // Catch \\hline outside array environment\n\ndefineFunction({\n type: \"text\",\n // Doesn't matter what this is.\n names: [\"\\\\hline\", \"\\\\hdashline\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: true\n },\n handler: function handler(context, args) {\n throw new src_ParseError(context.funcName + \" valid only within array environment\");\n }\n});\n;// CONCATENATED MODULE: ./src/environments.js\n\nvar environments = _environments;\n/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below\n\n\n;// CONCATENATED MODULE: ./src/functions/environment.js\n\n\n\n // Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\n\ndefineFunction({\n type: \"environment\",\n names: [\"\\\\begin\", \"\\\\end\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"]\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var nameGroup = args[0];\n\n if (nameGroup.type !== \"ordgroup\") {\n throw new src_ParseError(\"Invalid environment name\", nameGroup);\n }\n\n var envName = \"\";\n\n for (var i = 0; i < nameGroup.body.length; ++i) {\n envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n }\n\n if (funcName === \"\\\\begin\") {\n // begin...end is similar to left...right\n if (!src_environments.hasOwnProperty(envName)) {\n throw new src_ParseError(\"No such environment: \" + envName, nameGroup);\n } // Build the environment object. Arguments and other information will\n // be made available to the begin and end methods using properties.\n\n\n var env = src_environments[envName];\n\n var _parser$parseArgument = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env),\n _args = _parser$parseArgument.args,\n optArgs = _parser$parseArgument.optArgs;\n\n var context = {\n mode: parser.mode,\n envName: envName,\n parser: parser\n };\n var result = env.handler(context, _args, optArgs);\n parser.expect(\"\\\\end\", false);\n var endNameToken = parser.nextToken;\n var end = assertNodeType(parser.parseFunction(), \"environment\");\n\n if (end.name !== envName) {\n throw new src_ParseError(\"Mismatch: \\\\begin{\" + envName + \"} matched by \\\\end{\" + end.name + \"}\", endNameToken);\n } // $FlowFixMe, \"environment\" handler returns an environment ParseNode\n\n\n return result;\n }\n\n return {\n type: \"environment\",\n mode: parser.mode,\n name: envName,\n nameGroup: nameGroup\n };\n }\n});\n;// CONCATENATED MODULE: ./src/functions/font.js\n// TODO(kevinb): implement \\\\sl and \\\\sc\n\n\n\n\n\n\nvar font_htmlBuilder = function htmlBuilder(group, options) {\n var font = group.font;\n var newOptions = options.withFont(font);\n return buildGroup(group.body, newOptions);\n};\n\nvar font_mathmlBuilder = function mathmlBuilder(group, options) {\n var font = group.font;\n var newOptions = options.withFont(font);\n return buildMathML_buildGroup(group.body, newOptions);\n};\n\nvar fontAliases = {\n \"\\\\Bbb\": \"\\\\mathbb\",\n \"\\\\bold\": \"\\\\mathbf\",\n \"\\\\frak\": \"\\\\mathfrak\",\n \"\\\\bm\": \"\\\\boldsymbol\"\n};\ndefineFunction({\n type: \"font\",\n names: [// styles, except \\boldsymbol defined below\n \"\\\\mathrm\", \"\\\\mathit\", \"\\\\mathbf\", \"\\\\mathnormal\", // families\n \"\\\\mathbb\", \"\\\\mathcal\", \"\\\\mathfrak\", \"\\\\mathscr\", \"\\\\mathsf\", \"\\\\mathtt\", // aliases, except \\bm defined below\n \"\\\\Bbb\", \"\\\\bold\", \"\\\\frak\"],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var body = normalizeArgument(args[0]);\n var func = funcName;\n\n if (func in fontAliases) {\n func = fontAliases[func];\n }\n\n return {\n type: \"font\",\n mode: parser.mode,\n font: func.slice(1),\n body: body\n };\n },\n htmlBuilder: font_htmlBuilder,\n mathmlBuilder: font_mathmlBuilder\n});\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\boldsymbol\", \"\\\\bm\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n var body = args[0];\n var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \\boldsymbol uses \\binrel spacing to inherit the\n // argument's bin|rel|ord status\n\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(body),\n body: [{\n type: \"font\",\n mode: parser.mode,\n font: \"boldsymbol\",\n body: body\n }],\n isCharacterBox: isCharacterBox\n };\n }\n}); // Old font changing functions\n\ndefineFunction({\n type: \"font\",\n names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: function handler(_ref3, args) {\n var parser = _ref3.parser,\n funcName = _ref3.funcName,\n breakOnTokenText = _ref3.breakOnTokenText;\n var mode = parser.mode;\n var body = parser.parseExpression(true, breakOnTokenText);\n var style = \"math\" + funcName.slice(1);\n return {\n type: \"font\",\n mode: mode,\n font: style,\n body: {\n type: \"ordgroup\",\n mode: parser.mode,\n body: body\n }\n };\n },\n htmlBuilder: font_htmlBuilder,\n mathmlBuilder: font_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/genfrac.js\n\n\n\n\n\n\n\n\n\n\n\nvar adjustStyle = function adjustStyle(size, originalStyle) {\n // Figure out what style this fraction should be in based on the\n // function used\n var style = originalStyle;\n\n if (size === \"display\") {\n // Get display style as a default.\n // If incoming style is sub/sup, use style.text() to get correct size.\n style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY;\n } else if (size === \"text\" && style.size === src_Style.DISPLAY.size) {\n // We're in a \\tfrac but incoming style is displaystyle, so:\n style = src_Style.TEXT;\n } else if (size === \"script\") {\n style = src_Style.SCRIPT;\n } else if (size === \"scriptscript\") {\n style = src_Style.SCRIPTSCRIPT;\n }\n\n return style;\n};\n\nvar genfrac_htmlBuilder = function htmlBuilder(group, options) {\n // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).\n var style = adjustStyle(group.size, options.style);\n var nstyle = style.fracNum();\n var dstyle = style.fracDen();\n var newOptions;\n newOptions = options.havingStyle(nstyle);\n var numerm = buildGroup(group.numer, newOptions, options);\n\n if (group.continued) {\n // \\cfrac inserts a \\strut into the numerator.\n // Get \\strut dimensions from TeXbook page 353.\n var hStrut = 8.5 / options.fontMetrics().ptPerEm;\n var dStrut = 3.5 / options.fontMetrics().ptPerEm;\n numerm.height = numerm.height < hStrut ? hStrut : numerm.height;\n numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;\n }\n\n newOptions = options.havingStyle(dstyle);\n var denomm = buildGroup(group.denom, newOptions, options);\n var rule;\n var ruleWidth;\n var ruleSpacing;\n\n if (group.hasBarLine) {\n if (group.barSize) {\n ruleWidth = calculateSize(group.barSize, options);\n rule = buildCommon.makeLineSpan(\"frac-line\", options, ruleWidth);\n } else {\n rule = buildCommon.makeLineSpan(\"frac-line\", options);\n }\n\n ruleWidth = rule.height;\n ruleSpacing = rule.height;\n } else {\n rule = null;\n ruleWidth = 0;\n ruleSpacing = options.fontMetrics().defaultRuleThickness;\n } // Rule 15b\n\n\n var numShift;\n var clearance;\n var denomShift;\n\n if (style.size === src_Style.DISPLAY.size || group.size === \"display\") {\n numShift = options.fontMetrics().num1;\n\n if (ruleWidth > 0) {\n clearance = 3 * ruleSpacing;\n } else {\n clearance = 7 * ruleSpacing;\n }\n\n denomShift = options.fontMetrics().denom1;\n } else {\n if (ruleWidth > 0) {\n numShift = options.fontMetrics().num2;\n clearance = ruleSpacing;\n } else {\n numShift = options.fontMetrics().num3;\n clearance = 3 * ruleSpacing;\n }\n\n denomShift = options.fontMetrics().denom2;\n }\n\n var frac;\n\n if (!rule) {\n // Rule 15c\n var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);\n\n if (candidateClearance < clearance) {\n numShift += 0.5 * (clearance - candidateClearance);\n denomShift += 0.5 * (clearance - candidateClearance);\n }\n\n frac = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: denomm,\n shift: denomShift\n }, {\n type: \"elem\",\n elem: numerm,\n shift: -numShift\n }]\n }, options);\n } else {\n // Rule 15d\n var axisHeight = options.fontMetrics().axisHeight;\n\n if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {\n numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));\n }\n\n if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {\n denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));\n }\n\n var midShift = -(axisHeight - 0.5 * ruleWidth);\n frac = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: denomm,\n shift: denomShift\n }, {\n type: \"elem\",\n elem: rule,\n shift: midShift\n }, {\n type: \"elem\",\n elem: numerm,\n shift: -numShift\n }]\n }, options);\n } // Since we manually change the style sometimes (with \\dfrac or \\tfrac),\n // account for the possible size change here.\n\n\n newOptions = options.havingStyle(style);\n frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;\n frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e\n\n var delimSize;\n\n if (style.size === src_Style.DISPLAY.size) {\n delimSize = options.fontMetrics().delim1;\n } else if (style.size === src_Style.SCRIPTSCRIPT.size) {\n delimSize = options.havingStyle(src_Style.SCRIPT).fontMetrics().delim2;\n } else {\n delimSize = options.fontMetrics().delim2;\n }\n\n var leftDelim;\n var rightDelim;\n\n if (group.leftDelim == null) {\n leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n } else {\n leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mopen\"]);\n }\n\n if (group.continued) {\n rightDelim = buildCommon.makeSpan([]); // zero width for \\cfrac\n } else if (group.rightDelim == null) {\n rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n } else {\n rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mclose\"]);\n }\n\n return buildCommon.makeSpan([\"mord\"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan([\"mfrac\"], [frac]), rightDelim], options);\n};\n\nvar genfrac_mathmlBuilder = function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mfrac\", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]);\n\n if (!group.hasBarLine) {\n node.setAttribute(\"linethickness\", \"0px\");\n } else if (group.barSize) {\n var ruleWidth = calculateSize(group.barSize, options);\n node.setAttribute(\"linethickness\", makeEm(ruleWidth));\n }\n\n var style = adjustStyle(group.size, options.style);\n\n if (style.size !== options.style.size) {\n node = new mathMLTree.MathNode(\"mstyle\", [node]);\n var isDisplay = style.size === src_Style.DISPLAY.size ? \"true\" : \"false\";\n node.setAttribute(\"displaystyle\", isDisplay);\n node.setAttribute(\"scriptlevel\", \"0\");\n }\n\n if (group.leftDelim != null || group.rightDelim != null) {\n var withDelims = [];\n\n if (group.leftDelim != null) {\n var leftOp = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(group.leftDelim.replace(\"\\\\\", \"\"))]);\n leftOp.setAttribute(\"fence\", \"true\");\n withDelims.push(leftOp);\n }\n\n withDelims.push(node);\n\n if (group.rightDelim != null) {\n var rightOp = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(group.rightDelim.replace(\"\\\\\", \"\"))]);\n rightOp.setAttribute(\"fence\", \"true\");\n withDelims.push(rightOp);\n }\n\n return makeRow(withDelims);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\dfrac\", \"\\\\frac\", \"\\\\tfrac\", \"\\\\dbinom\", \"\\\\binom\", \"\\\\tbinom\", \"\\\\\\\\atopfrac\", // cant be entered directly\n \"\\\\\\\\bracefrac\", \"\\\\\\\\brackfrac\" // ditto\n ],\n props: {\n numArgs: 2,\n allowedInArgument: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var numer = args[0];\n var denom = args[1];\n var hasBarLine;\n var leftDelim = null;\n var rightDelim = null;\n var size = \"auto\";\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\frac\":\n case \"\\\\tfrac\":\n hasBarLine = true;\n break;\n\n case \"\\\\\\\\atopfrac\":\n hasBarLine = false;\n break;\n\n case \"\\\\dbinom\":\n case \"\\\\binom\":\n case \"\\\\tbinom\":\n hasBarLine = false;\n leftDelim = \"(\";\n rightDelim = \")\";\n break;\n\n case \"\\\\\\\\bracefrac\":\n hasBarLine = false;\n leftDelim = \"\\\\{\";\n rightDelim = \"\\\\}\";\n break;\n\n case \"\\\\\\\\brackfrac\":\n hasBarLine = false;\n leftDelim = \"[\";\n rightDelim = \"]\";\n break;\n\n default:\n throw new Error(\"Unrecognized genfrac command\");\n }\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\dbinom\":\n size = \"display\";\n break;\n\n case \"\\\\tfrac\":\n case \"\\\\tbinom\":\n size = \"text\";\n break;\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: false,\n numer: numer,\n denom: denom,\n hasBarLine: hasBarLine,\n leftDelim: leftDelim,\n rightDelim: rightDelim,\n size: size,\n barSize: null\n };\n },\n htmlBuilder: genfrac_htmlBuilder,\n mathmlBuilder: genfrac_mathmlBuilder\n});\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\cfrac\"],\n props: {\n numArgs: 2\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser,\n funcName = _ref2.funcName;\n var numer = args[0];\n var denom = args[1];\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: true,\n numer: numer,\n denom: denom,\n hasBarLine: true,\n leftDelim: null,\n rightDelim: null,\n size: \"display\",\n barSize: null\n };\n }\n}); // Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\n\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n props: {\n numArgs: 0,\n infix: true\n },\n handler: function handler(_ref3) {\n var parser = _ref3.parser,\n funcName = _ref3.funcName,\n token = _ref3.token;\n var replaceWith;\n\n switch (funcName) {\n case \"\\\\over\":\n replaceWith = \"\\\\frac\";\n break;\n\n case \"\\\\choose\":\n replaceWith = \"\\\\binom\";\n break;\n\n case \"\\\\atop\":\n replaceWith = \"\\\\\\\\atopfrac\";\n break;\n\n case \"\\\\brace\":\n replaceWith = \"\\\\\\\\bracefrac\";\n break;\n\n case \"\\\\brack\":\n replaceWith = \"\\\\\\\\brackfrac\";\n break;\n\n default:\n throw new Error(\"Unrecognized infix genfrac command\");\n }\n\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith: replaceWith,\n token: token\n };\n }\n});\nvar stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\n\nvar delimFromValue = function delimFromValue(delimString) {\n var delim = null;\n\n if (delimString.length > 0) {\n delim = delimString;\n delim = delim === \".\" ? null : delim;\n }\n\n return delim;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\genfrac\"],\n props: {\n numArgs: 6,\n allowedInArgument: true,\n argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n },\n handler: function handler(_ref4, args) {\n var parser = _ref4.parser;\n var numer = args[4];\n var denom = args[5]; // Look into the parse nodes to get the desired delimiters.\n\n var leftNode = normalizeArgument(args[0]);\n var leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\" ? delimFromValue(leftNode.text) : null;\n var rightNode = normalizeArgument(args[1]);\n var rightDelim = rightNode.type === \"atom\" && rightNode.family === \"close\" ? delimFromValue(rightNode.text) : null;\n var barNode = assertNodeType(args[2], \"size\");\n var hasBarLine;\n var barSize = null;\n\n if (barNode.isBlank) {\n // \\genfrac acts differently than \\above.\n // \\genfrac treats an empty size group as a signal to use a\n // standard bar size. \\above would see size = 0 and omit the bar.\n hasBarLine = true;\n } else {\n barSize = barNode.value;\n hasBarLine = barSize.number > 0;\n } // Find out if we want displaystyle, textstyle, etc.\n\n\n var size = \"auto\";\n var styl = args[3];\n\n if (styl.type === \"ordgroup\") {\n if (styl.body.length > 0) {\n var textOrd = assertNodeType(styl.body[0], \"textord\");\n size = stylArray[Number(textOrd.text)];\n }\n } else {\n styl = assertNodeType(styl, \"textord\");\n size = stylArray[Number(styl.text)];\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer: numer,\n denom: denom,\n continued: false,\n hasBarLine: hasBarLine,\n barSize: barSize,\n leftDelim: leftDelim,\n rightDelim: rightDelim,\n size: size\n };\n },\n htmlBuilder: genfrac_htmlBuilder,\n mathmlBuilder: genfrac_mathmlBuilder\n}); // \\above is an infix fraction that also defines a fraction bar size.\n\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\above\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n infix: true\n },\n handler: function handler(_ref5, args) {\n var parser = _ref5.parser,\n funcName = _ref5.funcName,\n token = _ref5.token;\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith: \"\\\\\\\\abovefrac\",\n size: assertNodeType(args[0], \"size\").value,\n token: token\n };\n }\n});\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\\\\\abovefrac\"],\n props: {\n numArgs: 3,\n argTypes: [\"math\", \"size\", \"math\"]\n },\n handler: function handler(_ref6, args) {\n var parser = _ref6.parser,\n funcName = _ref6.funcName;\n var numer = args[0];\n var barSize = assert(assertNodeType(args[1], \"infix\").size);\n var denom = args[2];\n var hasBarLine = barSize.number > 0;\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer: numer,\n denom: denom,\n continued: false,\n hasBarLine: hasBarLine,\n barSize: barSize,\n leftDelim: null,\n rightDelim: null,\n size: \"auto\"\n };\n },\n htmlBuilder: genfrac_htmlBuilder,\n mathmlBuilder: genfrac_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/horizBrace.js\n\n\n\n\n\n\n\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"horizBrace\", but\n// also \"supsub\" since an over/underbrace can affect super/subscripting.\nvar horizBrace_htmlBuilder = function htmlBuilder(grp, options) {\n var style = options.style; // Pull out the `ParseNode<\"horizBrace\">` if `grp` is a \"supsub\" node.\n\n var supSubGroup;\n var group;\n\n if (grp.type === \"supsub\") {\n // Ref: LaTeX source2e: }}}}\\limits}\n // i.e. LaTeX treats the brace similar to an op and passes it\n // with \\limits, so we need to assign supsub style.\n supSubGroup = grp.sup ? buildGroup(grp.sup, options.havingStyle(style.sup()), options) : buildGroup(grp.sub, options.havingStyle(style.sub()), options);\n group = assertNodeType(grp.base, \"horizBrace\");\n } else {\n group = assertNodeType(grp, \"horizBrace\");\n } // Build the base group\n\n\n var body = buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element\n\n var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓\n // This first vlist contains the content and the brace: equation\n\n var vlist;\n\n if (group.isOver) {\n vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"kern\",\n size: 0.1\n }, {\n type: \"elem\",\n elem: braceBody\n }]\n }, options); // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: body.depth + 0.1 + braceBody.height,\n children: [{\n type: \"elem\",\n elem: braceBody\n }, {\n type: \"kern\",\n size: 0.1\n }, {\n type: \"elem\",\n elem: body\n }]\n }, options); // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n vlist.children[0].children[0].children[0].classes.push(\"svg-align\");\n }\n\n if (supSubGroup) {\n // To write the supsub, wrap the first vlist in another vlist:\n // They can't all go in the same vlist, because the note might be\n // wider than the equation. We want the equation to control the\n // brace width.\n // note long note long note\n // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓\n // equation eqn eqn\n var vSpan = buildCommon.makeSpan([\"mord\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n\n if (group.isOver) {\n vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: vSpan\n }, {\n type: \"kern\",\n size: 0.2\n }, {\n type: \"elem\",\n elem: supSubGroup\n }]\n }, options);\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,\n children: [{\n type: \"elem\",\n elem: supSubGroup\n }, {\n type: \"kern\",\n size: 0.2\n }, {\n type: \"elem\",\n elem: vSpan\n }]\n }, options);\n }\n }\n\n return buildCommon.makeSpan([\"mord\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n};\n\nvar horizBrace_mathmlBuilder = function mathmlBuilder(group, options) {\n var accentNode = stretchy.mathMLnode(group.label);\n return new mathMLTree.MathNode(group.isOver ? \"mover\" : \"munder\", [buildMathML_buildGroup(group.base, options), accentNode]);\n}; // Horizontal stretchy braces\n\n\ndefineFunction({\n type: \"horizBrace\",\n names: [\"\\\\overbrace\", \"\\\\underbrace\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n return {\n type: \"horizBrace\",\n mode: parser.mode,\n label: funcName,\n isOver: /^\\\\over/.test(funcName),\n base: args[0]\n };\n },\n htmlBuilder: horizBrace_htmlBuilder,\n mathmlBuilder: horizBrace_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/href.js\n\n\n\n\n\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\href\"],\n props: {\n numArgs: 2,\n argTypes: [\"url\", \"original\"],\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var body = args[1];\n var href = assertNodeType(args[0], \"url\").url;\n\n if (!parser.settings.isTrusted({\n command: \"\\\\href\",\n url: href\n })) {\n return parser.formatUnsupportedCmd(\"\\\\href\");\n }\n\n return {\n type: \"href\",\n mode: parser.mode,\n href: href,\n body: ordargument(body)\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options, false);\n return buildCommon.makeAnchor(group.href, [], elements, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var math = buildExpressionRow(group.body, options);\n\n if (!(math instanceof MathNode)) {\n math = new MathNode(\"mrow\", [math]);\n }\n\n math.setAttribute(\"href\", group.href);\n return math;\n }\n});\ndefineFunction({\n type: \"href\",\n names: [\"\\\\url\"],\n props: {\n numArgs: 1,\n argTypes: [\"url\"],\n allowedInText: true\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n var href = assertNodeType(args[0], \"url\").url;\n\n if (!parser.settings.isTrusted({\n command: \"\\\\url\",\n url: href\n })) {\n return parser.formatUnsupportedCmd(\"\\\\url\");\n }\n\n var chars = [];\n\n for (var i = 0; i < href.length; i++) {\n var c = href[i];\n\n if (c === \"~\") {\n c = \"\\\\textasciitilde\";\n }\n\n chars.push({\n type: \"textord\",\n mode: \"text\",\n text: c\n });\n }\n\n var body = {\n type: \"text\",\n mode: parser.mode,\n font: \"\\\\texttt\",\n body: chars\n };\n return {\n type: \"href\",\n mode: parser.mode,\n href: href,\n body: ordargument(body)\n };\n }\n});\n;// CONCATENATED MODULE: ./src/functions/hbox.js\n\n\n\n\n // \\hbox is provided for compatibility with LaTeX \\vcenter.\n// In LaTeX, \\vcenter can act only on a box, as in\n// \\vcenter{\\hbox{$\\frac{a+b}{\\dfrac{c}{d}}$}}\n// This function by itself doesn't do anything but prevent a soft line break.\n\ndefineFunction({\n type: \"hbox\",\n names: [\"\\\\hbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInText: true,\n primitive: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"hbox\",\n mode: parser.mode,\n body: ordargument(args[0])\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options, false);\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n return new mathMLTree.MathNode(\"mrow\", buildMathML_buildExpression(group.body, options));\n }\n});\n;// CONCATENATED MODULE: ./src/functions/html.js\n\n\n\n\n\n\ndefineFunction({\n type: \"html\",\n names: [\"\\\\htmlClass\", \"\\\\htmlId\", \"\\\\htmlStyle\", \"\\\\htmlData\"],\n props: {\n numArgs: 2,\n argTypes: [\"raw\", \"original\"],\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName,\n token = _ref.token;\n var value = assertNodeType(args[0], \"raw\").string;\n var body = args[1];\n\n if (parser.settings.strict) {\n parser.settings.reportNonstrict(\"htmlExtension\", \"HTML extension is disabled on strict mode\");\n }\n\n var trustContext;\n var attributes = {};\n\n switch (funcName) {\n case \"\\\\htmlClass\":\n attributes.class = value;\n trustContext = {\n command: \"\\\\htmlClass\",\n class: value\n };\n break;\n\n case \"\\\\htmlId\":\n attributes.id = value;\n trustContext = {\n command: \"\\\\htmlId\",\n id: value\n };\n break;\n\n case \"\\\\htmlStyle\":\n attributes.style = value;\n trustContext = {\n command: \"\\\\htmlStyle\",\n style: value\n };\n break;\n\n case \"\\\\htmlData\":\n {\n var data = value.split(\",\");\n\n for (var i = 0; i < data.length; i++) {\n var keyVal = data[i].split(\"=\");\n\n if (keyVal.length !== 2) {\n throw new src_ParseError(\"Error parsing key-value for \\\\htmlData\");\n }\n\n attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n }\n\n trustContext = {\n command: \"\\\\htmlData\",\n attributes: attributes\n };\n break;\n }\n\n default:\n throw new Error(\"Unrecognized html command\");\n }\n\n if (!parser.settings.isTrusted(trustContext)) {\n return parser.formatUnsupportedCmd(funcName);\n }\n\n return {\n type: \"html\",\n mode: parser.mode,\n attributes: attributes,\n body: ordargument(body)\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options, false);\n var classes = [\"enclosing\"];\n\n if (group.attributes.class) {\n classes.push.apply(classes, group.attributes.class.trim().split(/\\s+/));\n }\n\n var span = buildCommon.makeSpan(classes, elements, options);\n\n for (var attr in group.attributes) {\n if (attr !== \"class\" && group.attributes.hasOwnProperty(attr)) {\n span.setAttribute(attr, group.attributes[attr]);\n }\n }\n\n return span;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n return buildExpressionRow(group.body, options);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/htmlmathml.js\n\n\n\n\ndefineFunction({\n type: \"htmlmathml\",\n names: [\"\\\\html@mathml\"],\n props: {\n numArgs: 2,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"htmlmathml\",\n mode: parser.mode,\n html: ordargument(args[0]),\n mathml: ordargument(args[1])\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.html, options, false);\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n return buildExpressionRow(group.mathml, options);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/includegraphics.js\n\n\n\n\n\n\n\nvar sizeData = function sizeData(str) {\n if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n // str is a number with no unit specified.\n // default unit is bp, per graphix package.\n return {\n number: +str,\n unit: \"bp\"\n };\n } else {\n var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n\n if (!match) {\n throw new src_ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n }\n\n var data = {\n number: +(match[1] + match[2]),\n // sign + magnitude, cast to number\n unit: match[3]\n };\n\n if (!validUnit(data)) {\n throw new src_ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n }\n\n return data;\n }\n};\n\ndefineFunction({\n type: \"includegraphics\",\n names: [\"\\\\includegraphics\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n argTypes: [\"raw\", \"url\"],\n allowedInText: false\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser;\n var width = {\n number: 0,\n unit: \"em\"\n };\n var height = {\n number: 0.9,\n unit: \"em\"\n }; // sorta character sized.\n\n var totalheight = {\n number: 0,\n unit: \"em\"\n };\n var alt = \"\";\n\n if (optArgs[0]) {\n var attributeStr = assertNodeType(optArgs[0], \"raw\").string; // Parser.js does not parse key/value pairs. We get a string.\n\n var attributes = attributeStr.split(\",\");\n\n for (var i = 0; i < attributes.length; i++) {\n var keyVal = attributes[i].split(\"=\");\n\n if (keyVal.length === 2) {\n var str = keyVal[1].trim();\n\n switch (keyVal[0].trim()) {\n case \"alt\":\n alt = str;\n break;\n\n case \"width\":\n width = sizeData(str);\n break;\n\n case \"height\":\n height = sizeData(str);\n break;\n\n case \"totalheight\":\n totalheight = sizeData(str);\n break;\n\n default:\n throw new src_ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\");\n }\n }\n }\n }\n\n var src = assertNodeType(args[0], \"url\").url;\n\n if (alt === \"\") {\n // No alt given. Use the file name. Strip away the path.\n alt = src;\n alt = alt.replace(/^.*[\\\\/]/, '');\n alt = alt.substring(0, alt.lastIndexOf('.'));\n }\n\n if (!parser.settings.isTrusted({\n command: \"\\\\includegraphics\",\n url: src\n })) {\n return parser.formatUnsupportedCmd(\"\\\\includegraphics\");\n }\n\n return {\n type: \"includegraphics\",\n mode: parser.mode,\n alt: alt,\n width: width,\n height: height,\n totalheight: totalheight,\n src: src\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var height = calculateSize(group.height, options);\n var depth = 0;\n\n if (group.totalheight.number > 0) {\n depth = calculateSize(group.totalheight, options) - height;\n }\n\n var width = 0;\n\n if (group.width.number > 0) {\n width = calculateSize(group.width, options);\n }\n\n var style = {\n height: makeEm(height + depth)\n };\n\n if (width > 0) {\n style.width = makeEm(width);\n }\n\n if (depth > 0) {\n style.verticalAlign = makeEm(-depth);\n }\n\n var node = new Img(group.src, group.alt, style);\n node.height = height;\n node.depth = depth;\n return node;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mglyph\", []);\n node.setAttribute(\"alt\", group.alt);\n var height = calculateSize(group.height, options);\n var depth = 0;\n\n if (group.totalheight.number > 0) {\n depth = calculateSize(group.totalheight, options) - height;\n node.setAttribute(\"valign\", makeEm(-depth));\n }\n\n node.setAttribute(\"height\", makeEm(height + depth));\n\n if (group.width.number > 0) {\n var width = calculateSize(group.width, options);\n node.setAttribute(\"width\", makeEm(width));\n }\n\n node.setAttribute(\"src\", group.src);\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/kern.js\n// Horizontal spacing commands\n\n\n\n\n // TODO: \\hskip and \\mskip should support plus and minus in lengths\n\ndefineFunction({\n type: \"kern\",\n names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n primitive: true,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var size = assertNodeType(args[0], \"size\");\n\n if (parser.settings.strict) {\n var mathFunction = funcName[1] === 'm'; // \\mkern, \\mskip\n\n var muUnit = size.value.unit === 'mu';\n\n if (mathFunction) {\n if (!muUnit) {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" supports only mu units, \" + (\"not \" + size.value.unit + \" units\"));\n }\n\n if (parser.mode !== \"math\") {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" works only in math mode\");\n }\n } else {\n // !mathFunction\n if (muUnit) {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" doesn't support mu units\");\n }\n }\n }\n\n return {\n type: \"kern\",\n mode: parser.mode,\n dimension: size.value\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n return buildCommon.makeGlue(group.dimension, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var dimension = calculateSize(group.dimension, options);\n return new mathMLTree.SpaceNode(dimension);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/lap.js\n// Horizontal overlap functions\n\n\n\n\n\n\ndefineFunction({\n type: \"lap\",\n names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var body = args[0];\n return {\n type: \"lap\",\n mode: parser.mode,\n alignment: funcName.slice(5),\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // mathllap, mathrlap, mathclap\n var inner;\n\n if (group.alignment === \"clap\") {\n // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/\n inner = buildCommon.makeSpan([], [buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span\n\n inner = buildCommon.makeSpan([\"inner\"], [inner], options);\n } else {\n inner = buildCommon.makeSpan([\"inner\"], [buildGroup(group.body, options)]);\n }\n\n var fix = buildCommon.makeSpan([\"fix\"], []);\n var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the\n // two items involved in the lap.\n // Next, use a strut to set the height of the HTML bounding box.\n // Otherwise, a tall argument may be misplaced.\n // This code resolved issue #1153\n\n var strut = buildCommon.makeSpan([\"strut\"]);\n strut.style.height = makeEm(node.height + node.depth);\n\n if (node.depth) {\n strut.style.verticalAlign = makeEm(-node.depth);\n }\n\n node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall.\n // This code resolves issue #1234\n\n node = buildCommon.makeSpan([\"thinbox\"], [node], options);\n return buildCommon.makeSpan([\"mord\", \"vbox\"], [node], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n // mathllap, mathrlap, mathclap\n var node = new mathMLTree.MathNode(\"mpadded\", [buildMathML_buildGroup(group.body, options)]);\n\n if (group.alignment !== \"rlap\") {\n var offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n node.setAttribute(\"lspace\", offset + \"width\");\n }\n\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/math.js\n\n // Switching from text mode back to math mode\n\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\(\", \"$\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler: function handler(_ref, args) {\n var funcName = _ref.funcName,\n parser = _ref.parser;\n var outerMode = parser.mode;\n parser.switchMode(\"math\");\n var close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n var body = parser.parseExpression(false, close);\n parser.expect(close);\n parser.switchMode(outerMode);\n return {\n type: \"styling\",\n mode: parser.mode,\n style: \"text\",\n body: body\n };\n }\n}); // Check for extra closing math delimiters\n\ndefineFunction({\n type: \"text\",\n // Doesn't matter what this is.\n names: [\"\\\\)\", \"\\\\]\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n handler: function handler(context, args) {\n throw new src_ParseError(\"Mismatched \" + context.funcName);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/mathchoice.js\n\n\n\n\n\n\nvar chooseMathStyle = function chooseMathStyle(group, options) {\n switch (options.style.size) {\n case src_Style.DISPLAY.size:\n return group.display;\n\n case src_Style.TEXT.size:\n return group.text;\n\n case src_Style.SCRIPT.size:\n return group.script;\n\n case src_Style.SCRIPTSCRIPT.size:\n return group.scriptscript;\n\n default:\n return group.text;\n }\n};\n\ndefineFunction({\n type: \"mathchoice\",\n names: [\"\\\\mathchoice\"],\n props: {\n numArgs: 4,\n primitive: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"mathchoice\",\n mode: parser.mode,\n display: ordargument(args[0]),\n text: ordargument(args[1]),\n script: ordargument(args[2]),\n scriptscript: ordargument(args[3])\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var body = chooseMathStyle(group, options);\n var elements = buildExpression(body, options, false);\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var body = chooseMathStyle(group, options);\n return buildExpressionRow(body, options);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js\n\n\n\n // For an operator with limits, assemble the base, sup, and sub into a span.\n\nvar assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) {\n base = buildCommon.makeSpan([], [base]);\n var subIsSingleCharacter = subGroup && utils.isCharacterBox(subGroup);\n var sub;\n var sup; // We manually have to handle the superscripts and subscripts. This,\n // aside from the kern calculations, is copied from supsub.\n\n if (supGroup) {\n var elem = buildGroup(supGroup, options.havingStyle(style.sup()), options);\n sup = {\n elem: elem,\n kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)\n };\n }\n\n if (subGroup) {\n var _elem = buildGroup(subGroup, options.havingStyle(style.sub()), options);\n\n sub = {\n elem: _elem,\n kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)\n };\n } // Build the final group as a vlist of the possible subscript, base,\n // and possible superscript.\n\n\n var finalGroup;\n\n if (sup && sub) {\n var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;\n finalGroup = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: bottom,\n children: [{\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }, {\n type: \"elem\",\n elem: sub.elem,\n marginLeft: makeEm(-slant)\n }, {\n type: \"kern\",\n size: sub.kern\n }, {\n type: \"elem\",\n elem: base\n }, {\n type: \"kern\",\n size: sup.kern\n }, {\n type: \"elem\",\n elem: sup.elem,\n marginLeft: makeEm(slant)\n }, {\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }]\n }, options);\n } else if (sub) {\n var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note\n // that we are supposed to shift the limits by 1/2 of the slant,\n // but since we are centering the limits adding a full slant of\n // margin will shift by 1/2 that.\n\n finalGroup = buildCommon.makeVList({\n positionType: \"top\",\n positionData: top,\n children: [{\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }, {\n type: \"elem\",\n elem: sub.elem,\n marginLeft: makeEm(-slant)\n }, {\n type: \"kern\",\n size: sub.kern\n }, {\n type: \"elem\",\n elem: base\n }]\n }, options);\n } else if (sup) {\n var _bottom = base.depth + baseShift;\n\n finalGroup = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: _bottom,\n children: [{\n type: \"elem\",\n elem: base\n }, {\n type: \"kern\",\n size: sup.kern\n }, {\n type: \"elem\",\n elem: sup.elem,\n marginLeft: makeEm(slant)\n }, {\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }]\n }, options);\n } else {\n // This case probably shouldn't occur (this would mean the\n // supsub was sending us a group with no superscript or\n // subscript) but be safe.\n return base;\n }\n\n var parts = [finalGroup];\n\n if (sub && slant !== 0 && !subIsSingleCharacter) {\n // A negative margin-left was applied to the lower limit.\n // Avoid an overlap by placing a spacer on the left on the group.\n var spacer = buildCommon.makeSpan([\"mspace\"], [], options);\n spacer.style.marginRight = makeEm(slant);\n parts.unshift(spacer);\n }\n\n return buildCommon.makeSpan([\"mop\", \"op-limits\"], parts, options);\n};\n;// CONCATENATED MODULE: ./src/functions/op.js\n// Limits, symbols\n\n\n\n\n\n\n\n\n\n\n\n// Most operators have a large successor symbol, but these don't.\nvar noSuccessor = [\"\\\\smallint\"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nvar op_htmlBuilder = function htmlBuilder(grp, options) {\n // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n var supGroup;\n var subGroup;\n var hasLimits = false;\n var group;\n\n if (grp.type === \"supsub\") {\n // If we have limits, supsub will pass us its group to handle. Pull\n // out the superscript and subscript and set the group to the op in\n // its base.\n supGroup = grp.sup;\n subGroup = grp.sub;\n group = assertNodeType(grp.base, \"op\");\n hasLimits = true;\n } else {\n group = assertNodeType(grp, \"op\");\n }\n\n var style = options.style;\n var large = false;\n\n if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) {\n // Most symbol operators get larger in displaystyle (rule 13)\n large = true;\n }\n\n var base;\n\n if (group.symbol) {\n // If this is a symbol, create the symbol.\n var fontName = large ? \"Size2-Regular\" : \"Size1-Regular\";\n var stash = \"\";\n\n if (group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") {\n // No font glyphs yet, so use a glyph w/o the oval.\n // TODO: When font glyphs are available, delete this code.\n stash = group.name.slice(1);\n group.name = stash === \"oiint\" ? \"\\\\iint\" : \"\\\\iiint\";\n }\n\n base = buildCommon.makeSymbol(group.name, fontName, \"math\", options, [\"mop\", \"op-symbol\", large ? \"large-op\" : \"small-op\"]);\n\n if (stash.length > 0) {\n // We're in \\oiint or \\oiiint. Overlay the oval.\n // TODO: When font glyphs are available, delete this code.\n var italic = base.italic;\n var oval = buildCommon.staticSvg(stash + \"Size\" + (large ? \"2\" : \"1\"), options);\n base = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: base,\n shift: 0\n }, {\n type: \"elem\",\n elem: oval,\n shift: large ? 0.08 : 0\n }]\n }, options);\n group.name = \"\\\\\" + stash;\n base.classes.unshift(\"mop\"); // $FlowFixMe\n\n base.italic = italic;\n }\n } else if (group.body) {\n // If this is a list, compose that list.\n var inner = buildExpression(group.body, options, true);\n\n if (inner.length === 1 && inner[0] instanceof SymbolNode) {\n base = inner[0];\n base.classes[0] = \"mop\"; // replace old mclass\n } else {\n base = buildCommon.makeSpan([\"mop\"], inner, options);\n }\n } else {\n // Otherwise, this is a text operator. Build the text from the\n // operator's name.\n var output = [];\n\n for (var i = 1; i < group.name.length; i++) {\n output.push(buildCommon.mathsym(group.name[i], group.mode, options));\n }\n\n base = buildCommon.makeSpan([\"mop\"], output, options);\n } // If content of op is a single symbol, shift it vertically.\n\n\n var baseShift = 0;\n var slant = 0;\n\n if ((base instanceof SymbolNode || group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") && !group.suppressBaseShift) {\n // We suppress the shift of the base of \\overset and \\underset. Otherwise,\n // shift the symbol so its center lies on the axis (rule 13). It\n // appears that our fonts have the centers of the symbols already\n // almost on the axis, so these numbers are very small. Note we\n // don't actually apply this here, but instead it is used either in\n // the vlist creation or separately when there are no limits.\n baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction.\n // $FlowFixMe\n\n slant = base.italic;\n }\n\n if (hasLimits) {\n return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);\n } else {\n if (baseShift) {\n base.style.position = \"relative\";\n base.style.top = makeEm(baseShift);\n }\n\n return base;\n }\n};\n\nvar op_mathmlBuilder = function mathmlBuilder(group, options) {\n var node;\n\n if (group.symbol) {\n // This is a symbol. Just add the symbol.\n node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n\n if (utils.contains(noSuccessor, group.name)) {\n node.setAttribute(\"largeop\", \"false\");\n }\n } else if (group.body) {\n // This is an operator with children. Add them.\n node = new MathNode(\"mo\", buildMathML_buildExpression(group.body, options));\n } else {\n // This is a text operator. Add all of the characters from the\n // operator's name.\n node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]); // Append an <mo>&ApplyFunction;</mo>.\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n\n var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n\n if (group.parentIsSupSub) {\n node = new MathNode(\"mrow\", [node, operator]);\n } else {\n node = newDocumentFragment([node, operator]);\n }\n }\n\n return node;\n};\n\nvar singleCharBigOps = {\n \"\\u220F\": \"\\\\prod\",\n \"\\u2210\": \"\\\\coprod\",\n \"\\u2211\": \"\\\\sum\",\n \"\\u22C0\": \"\\\\bigwedge\",\n \"\\u22C1\": \"\\\\bigvee\",\n \"\\u22C2\": \"\\\\bigcap\",\n \"\\u22C3\": \"\\\\bigcup\",\n \"\\u2A00\": \"\\\\bigodot\",\n \"\\u2A01\": \"\\\\bigoplus\",\n \"\\u2A02\": \"\\\\bigotimes\",\n \"\\u2A04\": \"\\\\biguplus\",\n \"\\u2A06\": \"\\\\bigsqcup\"\n};\ndefineFunction({\n type: \"op\",\n names: [\"\\\\coprod\", \"\\\\bigvee\", \"\\\\bigwedge\", \"\\\\biguplus\", \"\\\\bigcap\", \"\\\\bigcup\", \"\\\\intop\", \"\\\\prod\", \"\\\\sum\", \"\\\\bigotimes\", \"\\\\bigoplus\", \"\\\\bigodot\", \"\\\\bigsqcup\", \"\\\\smallint\", \"\\u220F\", \"\\u2210\", \"\\u2211\", \"\\u22C0\", \"\\u22C1\", \"\\u22C2\", \"\\u22C3\", \"\\u2A00\", \"\\u2A01\", \"\\u2A02\", \"\\u2A04\", \"\\u2A06\"],\n props: {\n numArgs: 0\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var fName = funcName;\n\n if (fName.length === 1) {\n fName = singleCharBigOps[fName];\n }\n\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: true,\n name: fName\n };\n },\n htmlBuilder: op_htmlBuilder,\n mathmlBuilder: op_mathmlBuilder\n}); // Note: calling defineFunction with a type that's already been defined only\n// works because the same htmlBuilder and mathmlBuilder are being used.\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\mathop\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n var body = args[0];\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n body: ordargument(body)\n };\n },\n htmlBuilder: op_htmlBuilder,\n mathmlBuilder: op_mathmlBuilder\n}); // There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nvar singleCharIntegrals = {\n \"\\u222B\": \"\\\\int\",\n \"\\u222C\": \"\\\\iint\",\n \"\\u222D\": \"\\\\iiint\",\n \"\\u222E\": \"\\\\oint\",\n \"\\u222F\": \"\\\\oiint\",\n \"\\u2230\": \"\\\\oiiint\"\n}; // No limits, not symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\arcsin\", \"\\\\arccos\", \"\\\\arctan\", \"\\\\arctg\", \"\\\\arcctg\", \"\\\\arg\", \"\\\\ch\", \"\\\\cos\", \"\\\\cosec\", \"\\\\cosh\", \"\\\\cot\", \"\\\\cotg\", \"\\\\coth\", \"\\\\csc\", \"\\\\ctg\", \"\\\\cth\", \"\\\\deg\", \"\\\\dim\", \"\\\\exp\", \"\\\\hom\", \"\\\\ker\", \"\\\\lg\", \"\\\\ln\", \"\\\\log\", \"\\\\sec\", \"\\\\sin\", \"\\\\sinh\", \"\\\\sh\", \"\\\\tan\", \"\\\\tanh\", \"\\\\tg\", \"\\\\th\"],\n props: {\n numArgs: 0\n },\n handler: function handler(_ref3) {\n var parser = _ref3.parser,\n funcName = _ref3.funcName;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n name: funcName\n };\n },\n htmlBuilder: op_htmlBuilder,\n mathmlBuilder: op_mathmlBuilder\n}); // Limits, not symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n props: {\n numArgs: 0\n },\n handler: function handler(_ref4) {\n var parser = _ref4.parser,\n funcName = _ref4.funcName;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: false,\n name: funcName\n };\n },\n htmlBuilder: op_htmlBuilder,\n mathmlBuilder: op_mathmlBuilder\n}); // No limits, symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\int\", \"\\\\iint\", \"\\\\iiint\", \"\\\\oint\", \"\\\\oiint\", \"\\\\oiiint\", \"\\u222B\", \"\\u222C\", \"\\u222D\", \"\\u222E\", \"\\u222F\", \"\\u2230\"],\n props: {\n numArgs: 0\n },\n handler: function handler(_ref5) {\n var parser = _ref5.parser,\n funcName = _ref5.funcName;\n var fName = funcName;\n\n if (fName.length === 1) {\n fName = singleCharIntegrals[fName];\n }\n\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: true,\n name: fName\n };\n },\n htmlBuilder: op_htmlBuilder,\n mathmlBuilder: op_mathmlBuilder\n});\n;// CONCATENATED MODULE: ./src/functions/operatorname.js\n\n\n\n\n\n\n\n\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only\n// \"operatorname\", but also \"supsub\" since \\operatorname* can\n// affect super/subscripting.\nvar operatorname_htmlBuilder = function htmlBuilder(grp, options) {\n // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n var supGroup;\n var subGroup;\n var hasLimits = false;\n var group;\n\n if (grp.type === \"supsub\") {\n // If we have limits, supsub will pass us its group to handle. Pull\n // out the superscript and subscript and set the group to the op in\n // its base.\n supGroup = grp.sup;\n subGroup = grp.sub;\n group = assertNodeType(grp.base, \"operatorname\");\n hasLimits = true;\n } else {\n group = assertNodeType(grp, \"operatorname\");\n }\n\n var base;\n\n if (group.body.length > 0) {\n var body = group.body.map(function (child) {\n // $FlowFixMe: Check if the node has a string `text` property.\n var childText = child.text;\n\n if (typeof childText === \"string\") {\n return {\n type: \"textord\",\n mode: child.mode,\n text: childText\n };\n } else {\n return child;\n }\n }); // Consolidate function names into symbol characters.\n\n var expression = buildExpression(body, options.withFont(\"mathrm\"), true);\n\n for (var i = 0; i < expression.length; i++) {\n var child = expression[i];\n\n if (child instanceof SymbolNode) {\n // Per amsopn package,\n // change minus to hyphen and \\ast to asterisk\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n }\n }\n\n base = buildCommon.makeSpan([\"mop\"], expression, options);\n } else {\n base = buildCommon.makeSpan([\"mop\"], [], options);\n }\n\n if (hasLimits) {\n return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);\n } else {\n return base;\n }\n};\n\nvar operatorname_mathmlBuilder = function mathmlBuilder(group, options) {\n // The steps taken here are similar to the html version.\n var expression = buildMathML_buildExpression(group.body, options.withFont(\"mathrm\")); // Is expression a string or has it something like a fraction?\n\n var isAllString = true; // default\n\n for (var i = 0; i < expression.length; i++) {\n var node = expression[i];\n\n if (node instanceof mathMLTree.SpaceNode) {// Do nothing\n } else if (node instanceof mathMLTree.MathNode) {\n switch (node.type) {\n case \"mi\":\n case \"mn\":\n case \"ms\":\n case \"mspace\":\n case \"mtext\":\n break;\n // Do nothing yet.\n\n case \"mo\":\n {\n var child = node.children[0];\n\n if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n } else {\n isAllString = false;\n }\n\n break;\n }\n\n default:\n isAllString = false;\n }\n } else {\n isAllString = false;\n }\n }\n\n if (isAllString) {\n // Write a single TextNode instead of multiple nested tags.\n var word = expression.map(function (node) {\n return node.toText();\n }).join(\"\");\n expression = [new mathMLTree.TextNode(word)];\n }\n\n var identifier = new mathMLTree.MathNode(\"mi\", expression);\n identifier.setAttribute(\"mathvariant\", \"normal\"); // \\u2061 is the same as &ApplyFunction;\n // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp\n\n var operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n\n if (group.parentIsSupSub) {\n return new mathMLTree.MathNode(\"mrow\", [identifier, operator]);\n } else {\n return mathMLTree.newDocumentFragment([identifier, operator]);\n }\n}; // \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\n\n\ndefineFunction({\n type: \"operatorname\",\n names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var body = args[0];\n return {\n type: \"operatorname\",\n mode: parser.mode,\n body: ordargument(body),\n alwaysHandleSupSub: funcName === \"\\\\operatornamewithlimits\",\n limits: false,\n parentIsSupSub: false\n };\n },\n htmlBuilder: operatorname_htmlBuilder,\n mathmlBuilder: operatorname_mathmlBuilder\n});\ndefineMacro(\"\\\\operatorname\", \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n;// CONCATENATED MODULE: ./src/functions/ordgroup.js\n\n\n\n\ndefineFunctionBuilders({\n type: \"ordgroup\",\n htmlBuilder: function htmlBuilder(group, options) {\n if (group.semisimple) {\n return buildCommon.makeFragment(buildExpression(group.body, options, false));\n }\n\n return buildCommon.makeSpan([\"mord\"], buildExpression(group.body, options, true), options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n return buildExpressionRow(group.body, options, true);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/overline.js\n\n\n\n\n\ndefineFunction({\n type: \"overline\",\n names: [\"\\\\overline\"],\n props: {\n numArgs: 1\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var body = args[0];\n return {\n type: \"overline\",\n mode: parser.mode,\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Overlines are handled in the TeXbook pg 443, Rule 9.\n // Build the inner group in the cramped style.\n var innerGroup = buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body\n\n var line = buildCommon.makeLineSpan(\"overline-line\", options); // Generate the vlist, with the appropriate kerns\n\n var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n var vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: innerGroup\n }, {\n type: \"kern\",\n size: 3 * defaultRuleThickness\n }, {\n type: \"elem\",\n elem: line\n }, {\n type: \"kern\",\n size: defaultRuleThickness\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"overline\"], [vlist], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var operator = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(\"\\u203E\")]);\n operator.setAttribute(\"stretchy\", \"true\");\n var node = new mathMLTree.MathNode(\"mover\", [buildMathML_buildGroup(group.body, options), operator]);\n node.setAttribute(\"accent\", \"true\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/phantom.js\n\n\n\n\n\ndefineFunction({\n type: \"phantom\",\n names: [\"\\\\phantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var body = args[0];\n return {\n type: \"phantom\",\n mode: parser.mode,\n body: ordargument(body)\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var elements = buildExpression(group.body, options.withPhantom(), false); // \\phantom isn't supposed to affect the elements it contains.\n // See \"color\" for more details.\n\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var inner = buildMathML_buildExpression(group.body, options);\n return new mathMLTree.MathNode(\"mphantom\", inner);\n }\n});\ndefineFunction({\n type: \"hphantom\",\n names: [\"\\\\hphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref2, args) {\n var parser = _ref2.parser;\n var body = args[0];\n return {\n type: \"hphantom\",\n mode: parser.mode,\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var node = buildCommon.makeSpan([], [buildGroup(group.body, options.withPhantom())]);\n node.height = 0;\n node.depth = 0;\n\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].height = 0;\n node.children[i].depth = 0;\n }\n } // See smash for comment re: use of makeVList\n\n\n node = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: node\n }]\n }, options); // For spacing, TeX treats \\smash as a math group (same spacing as ord).\n\n return buildCommon.makeSpan([\"mord\"], [node], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var inner = buildMathML_buildExpression(ordargument(group.body), options);\n var phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n var node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"height\", \"0px\");\n node.setAttribute(\"depth\", \"0px\");\n return node;\n }\n});\ndefineFunction({\n type: \"vphantom\",\n names: [\"\\\\vphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref3, args) {\n var parser = _ref3.parser;\n var body = args[0];\n return {\n type: \"vphantom\",\n mode: parser.mode,\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var inner = buildCommon.makeSpan([\"inner\"], [buildGroup(group.body, options.withPhantom())]);\n var fix = buildCommon.makeSpan([\"fix\"], []);\n return buildCommon.makeSpan([\"mord\", \"rlap\"], [inner, fix], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var inner = buildMathML_buildExpression(ordargument(group.body), options);\n var phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n var node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/raisebox.js\n\n\n\n\n\n\n // Box manipulation\n\ndefineFunction({\n type: \"raisebox\",\n names: [\"\\\\raisebox\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"hbox\"],\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n var amount = assertNodeType(args[0], \"size\").value;\n var body = args[1];\n return {\n type: \"raisebox\",\n mode: parser.mode,\n dy: amount,\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var body = buildGroup(group.body, options);\n var dy = calculateSize(group.dy, options);\n return buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -dy,\n children: [{\n type: \"elem\",\n elem: body\n }]\n }, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mpadded\", [buildMathML_buildGroup(group.body, options)]);\n var dy = group.dy.number + group.dy.unit;\n node.setAttribute(\"voffset\", dy);\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/relax.js\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\relax\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: function handler(_ref) {\n var parser = _ref.parser;\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n});\n;// CONCATENATED MODULE: ./src/functions/rule.js\n\n\n\n\n\ndefineFunction({\n type: \"rule\",\n names: [\"\\\\rule\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n argTypes: [\"size\", \"size\", \"size\"]\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser;\n var shift = optArgs[0];\n var width = assertNodeType(args[0], \"size\");\n var height = assertNodeType(args[1], \"size\");\n return {\n type: \"rule\",\n mode: parser.mode,\n shift: shift && assertNodeType(shift, \"size\").value,\n width: width.value,\n height: height.value\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Make an empty span for the rule\n var rule = buildCommon.makeSpan([\"mord\", \"rule\"], [], options); // Calculate the shift, width, and height of the rule, and account for units\n\n var width = calculateSize(group.width, options);\n var height = calculateSize(group.height, options);\n var shift = group.shift ? calculateSize(group.shift, options) : 0; // Style the rule to the right size\n\n rule.style.borderRightWidth = makeEm(width);\n rule.style.borderTopWidth = makeEm(height);\n rule.style.bottom = makeEm(shift); // Record the height and width\n\n rule.width = width;\n rule.height = height + shift;\n rule.depth = -shift; // Font size is the number large enough that the browser will\n // reserve at least `absHeight` space above the baseline.\n // The 1.125 factor was empirically determined\n\n rule.maxFontSize = height * 1.125 * options.sizeMultiplier;\n return rule;\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var width = calculateSize(group.width, options);\n var height = calculateSize(group.height, options);\n var shift = group.shift ? calculateSize(group.shift, options) : 0;\n var color = options.color && options.getColor() || \"black\";\n var rule = new mathMLTree.MathNode(\"mspace\");\n rule.setAttribute(\"mathbackground\", color);\n rule.setAttribute(\"width\", makeEm(width));\n rule.setAttribute(\"height\", makeEm(height));\n var wrapper = new mathMLTree.MathNode(\"mpadded\", [rule]);\n\n if (shift >= 0) {\n wrapper.setAttribute(\"height\", makeEm(shift));\n } else {\n wrapper.setAttribute(\"height\", makeEm(shift));\n wrapper.setAttribute(\"depth\", makeEm(-shift));\n }\n\n wrapper.setAttribute(\"voffset\", makeEm(shift));\n return wrapper;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/sizing.js\n\n\n\n\n\n\nfunction sizingGroup(value, options, baseOptions) {\n var inner = buildExpression(value, options, false);\n var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize\n // manually. Handle nested size changes.\n\n for (var i = 0; i < inner.length; i++) {\n var pos = inner[i].classes.indexOf(\"sizing\");\n\n if (pos < 0) {\n Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));\n } else if (inner[i].classes[pos + 1] === \"reset-size\" + options.size) {\n // This is a nested size change: e.g., inner[i] is the \"b\" in\n // `\\Huge a \\small b`. Override the old size (the `reset-` class)\n // but not the new size.\n inner[i].classes[pos + 1] = \"reset-size\" + baseOptions.size;\n }\n\n inner[i].height *= multiplier;\n inner[i].depth *= multiplier;\n }\n\n return buildCommon.makeFragment(inner);\n}\nvar sizeFuncs = [\"\\\\tiny\", \"\\\\sixptsize\", \"\\\\scriptsize\", \"\\\\footnotesize\", \"\\\\small\", \"\\\\normalsize\", \"\\\\large\", \"\\\\Large\", \"\\\\LARGE\", \"\\\\huge\", \"\\\\Huge\"];\nvar sizing_htmlBuilder = function htmlBuilder(group, options) {\n // Handle sizing operators like \\Huge. Real TeX doesn't actually allow\n // these functions inside of math expressions, so we do some special\n // handling.\n var newOptions = options.havingSize(group.size);\n return sizingGroup(group.body, newOptions, options);\n};\ndefineFunction({\n type: \"sizing\",\n names: sizeFuncs,\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var breakOnTokenText = _ref.breakOnTokenText,\n funcName = _ref.funcName,\n parser = _ref.parser;\n var body = parser.parseExpression(false, breakOnTokenText);\n return {\n type: \"sizing\",\n mode: parser.mode,\n // Figure out what size to use based on the list of functions above\n size: sizeFuncs.indexOf(funcName) + 1,\n body: body\n };\n },\n htmlBuilder: sizing_htmlBuilder,\n mathmlBuilder: function mathmlBuilder(group, options) {\n var newOptions = options.havingSize(group.size);\n var inner = buildMathML_buildExpression(group.body, newOptions);\n var node = new mathMLTree.MathNode(\"mstyle\", inner); // TODO(emily): This doesn't produce the correct size for nested size\n // changes, because we don't keep state of what style we're currently\n // in, so we can't reset the size to normal before changing it. Now\n // that we're passing an options parameter we should be able to fix\n // this.\n\n node.setAttribute(\"mathsize\", makeEm(newOptions.sizeMultiplier));\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/smash.js\n// smash, with optional [tb], as in AMS\n\n\n\n\n\n\ndefineFunction({\n type: \"smash\",\n names: [\"\\\\smash\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser;\n var smashHeight = false;\n var smashDepth = false;\n var tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n\n if (tbArg) {\n // Optional [tb] argument is engaged.\n // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n // def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n var letter = \"\";\n\n for (var i = 0; i < tbArg.body.length; ++i) {\n var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property.\n\n letter = node.text;\n\n if (letter === \"t\") {\n smashHeight = true;\n } else if (letter === \"b\") {\n smashDepth = true;\n } else {\n smashHeight = false;\n smashDepth = false;\n break;\n }\n }\n } else {\n smashHeight = true;\n smashDepth = true;\n }\n\n var body = args[0];\n return {\n type: \"smash\",\n mode: parser.mode,\n body: body,\n smashHeight: smashHeight,\n smashDepth: smashDepth\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var node = buildCommon.makeSpan([], [buildGroup(group.body, options)]);\n\n if (!group.smashHeight && !group.smashDepth) {\n return node;\n }\n\n if (group.smashHeight) {\n node.height = 0; // In order to influence makeVList, we have to reset the children.\n\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].height = 0;\n }\n }\n }\n\n if (group.smashDepth) {\n node.depth = 0;\n\n if (node.children) {\n for (var _i = 0; _i < node.children.length; _i++) {\n node.children[_i].depth = 0;\n }\n }\n } // At this point, we've reset the TeX-like height and depth values.\n // But the span still has an HTML line height.\n // makeVList applies \"display: table-cell\", which prevents the browser\n // from acting on that line height. So we'll call makeVList now.\n\n\n var smashedNode = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: node\n }]\n }, options); // For spacing, TeX treats \\hphantom as a math group (same spacing as ord).\n\n return buildCommon.makeSpan([\"mord\"], [smashedNode], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mpadded\", [buildMathML_buildGroup(group.body, options)]);\n\n if (group.smashHeight) {\n node.setAttribute(\"height\", \"0px\");\n }\n\n if (group.smashDepth) {\n node.setAttribute(\"depth\", \"0px\");\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/sqrt.js\n\n\n\n\n\n\n\n\ndefineFunction({\n type: \"sqrt\",\n names: [\"\\\\sqrt\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n handler: function handler(_ref, args, optArgs) {\n var parser = _ref.parser;\n var index = optArgs[0];\n var body = args[0];\n return {\n type: \"sqrt\",\n mode: parser.mode,\n body: body,\n index: index\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Square roots are handled in the TeXbook pg. 443, Rule 11.\n // First, we do the same steps as in overline to build the inner group\n // and line\n var inner = buildGroup(group.body, options.havingCrampedStyle());\n\n if (inner.height === 0) {\n // Render a small surd.\n inner.height = options.fontMetrics().xHeight;\n } // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n\n\n inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \\surd delimiter\n\n var metrics = options.fontMetrics();\n var theta = metrics.defaultRuleThickness;\n var phi = theta;\n\n if (options.style.id < src_Style.TEXT.id) {\n phi = options.fontMetrics().xHeight;\n } // Calculate the clearance between the body and line\n\n\n var lineClearance = theta + phi / 4;\n var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size\n\n var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options),\n img = _delimiter$sqrtImage.span,\n ruleWidth = _delimiter$sqrtImage.ruleWidth,\n advanceWidth = _delimiter$sqrtImage.advanceWidth;\n\n var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size\n\n if (delimDepth > inner.height + inner.depth + lineClearance) {\n lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;\n } // Shift the sqrt image\n\n\n var imgShift = img.height - inner.height - lineClearance - ruleWidth;\n inner.style.paddingLeft = makeEm(advanceWidth); // Overlay the image and the argument.\n\n var body = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: inner,\n wrapperClasses: [\"svg-align\"]\n }, {\n type: \"kern\",\n size: -(inner.height + imgShift)\n }, {\n type: \"elem\",\n elem: img\n }, {\n type: \"kern\",\n size: ruleWidth\n }]\n }, options);\n\n if (!group.index) {\n return buildCommon.makeSpan([\"mord\", \"sqrt\"], [body], options);\n } else {\n // Handle the optional root index\n // The index is always in scriptscript style\n var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT);\n var rootm = buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX\n // source, in the definition of `\\r@@t`.\n\n var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly\n\n var rootVList = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -toShift,\n children: [{\n type: \"elem\",\n elem: rootm\n }]\n }, options); // Add a class surrounding it so we can add on the appropriate\n // kerning\n\n var rootVListWrap = buildCommon.makeSpan([\"root\"], [rootVList]);\n return buildCommon.makeSpan([\"mord\", \"sqrt\"], [rootVListWrap, body], options);\n }\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var body = group.body,\n index = group.index;\n return index ? new mathMLTree.MathNode(\"mroot\", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode(\"msqrt\", [buildMathML_buildGroup(body, options)]);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/styling.js\n\n\n\n\n\nvar styling_styleMap = {\n \"display\": src_Style.DISPLAY,\n \"text\": src_Style.TEXT,\n \"script\": src_Style.SCRIPT,\n \"scriptscript\": src_Style.SCRIPTSCRIPT\n};\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n handler: function handler(_ref, args) {\n var breakOnTokenText = _ref.breakOnTokenText,\n funcName = _ref.funcName,\n parser = _ref.parser;\n // parse out the implicit body\n var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.\n // here and in buildHTML and de-dupe the enumeration of all the styles).\n // $FlowFixMe: The names above exactly match the styles.\n\n var style = funcName.slice(1, funcName.length - 5);\n return {\n type: \"styling\",\n mode: parser.mode,\n // Figure out what style to use by pulling out the style from\n // the function name\n style: style,\n body: body\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Style changes are handled in the TeXbook on pg. 442, Rule 3.\n var newStyle = styling_styleMap[group.style];\n var newOptions = options.havingStyle(newStyle).withFont('');\n return sizingGroup(group.body, newOptions, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n // Figure out what style we're changing to.\n var newStyle = styling_styleMap[group.style];\n var newOptions = options.havingStyle(newStyle);\n var inner = buildMathML_buildExpression(group.body, newOptions);\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n var styleAttributes = {\n \"display\": [\"0\", \"true\"],\n \"text\": [\"0\", \"false\"],\n \"script\": [\"1\", \"false\"],\n \"scriptscript\": [\"2\", \"false\"]\n };\n var attr = styleAttributes[group.style];\n node.setAttribute(\"scriptlevel\", attr[0]);\n node.setAttribute(\"displaystyle\", attr[1]);\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/supsub.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\nvar htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {\n var base = group.base;\n\n if (!base) {\n return null;\n } else if (base.type === \"op\") {\n // Operators handle supsubs differently when they have limits\n // (e.g. `\\displaystyle\\sum_2^3`)\n var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub);\n return delegate ? op_htmlBuilder : null;\n } else if (base.type === \"operatorname\") {\n var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits);\n\n return _delegate ? operatorname_htmlBuilder : null;\n } else if (base.type === \"accent\") {\n return utils.isCharacterBox(base.base) ? htmlBuilder : null;\n } else if (base.type === \"horizBrace\") {\n var isSup = !group.sub;\n return isSup === base.isOver ? horizBrace_htmlBuilder : null;\n } else {\n return null;\n }\n}; // Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\n\n\ndefineFunctionBuilders({\n type: \"supsub\",\n htmlBuilder: function htmlBuilder(group, options) {\n // Superscript and subscripts are handled in the TeXbook on page\n // 445-446, rules 18(a-f).\n // Here is where we defer to the inner group if it should handle\n // superscripts and subscripts itself.\n var builderDelegate = htmlBuilderDelegate(group, options);\n\n if (builderDelegate) {\n return builderDelegate(group, options);\n }\n\n var valueBase = group.base,\n valueSup = group.sup,\n valueSub = group.sub;\n var base = buildGroup(valueBase, options);\n var supm;\n var subm;\n var metrics = options.fontMetrics(); // Rule 18a\n\n var supShift = 0;\n var subShift = 0;\n var isCharacterBox = valueBase && utils.isCharacterBox(valueBase);\n\n if (valueSup) {\n var newOptions = options.havingStyle(options.style.sup());\n supm = buildGroup(valueSup, newOptions, options);\n\n if (!isCharacterBox) {\n supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;\n }\n }\n\n if (valueSub) {\n var _newOptions = options.havingStyle(options.style.sub());\n\n subm = buildGroup(valueSub, _newOptions, options);\n\n if (!isCharacterBox) {\n subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;\n }\n } // Rule 18c\n\n\n var minSupShift;\n\n if (options.style === src_Style.DISPLAY) {\n minSupShift = metrics.sup1;\n } else if (options.style.cramped) {\n minSupShift = metrics.sup3;\n } else {\n minSupShift = metrics.sup2;\n } // scriptspace is a font-size-independent size, so scale it\n // appropriately for use as the marginRight.\n\n\n var multiplier = options.sizeMultiplier;\n var marginRight = makeEm(0.5 / metrics.ptPerEm / multiplier);\n var marginLeft = null;\n\n if (subm) {\n // Subscripts shouldn't be shifted by the base's italic correction.\n // Account for that by shifting the subscript back the appropriate\n // amount. Note we only do this when the base is a single symbol.\n var isOiint = group.base && group.base.type === \"op\" && group.base.name && (group.base.name === \"\\\\oiint\" || group.base.name === \"\\\\oiiint\");\n\n if (base instanceof SymbolNode || isOiint) {\n // $FlowFixMe\n marginLeft = makeEm(-base.italic);\n }\n }\n\n var supsub;\n\n if (supm && subm) {\n supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n subShift = Math.max(subShift, metrics.sub2);\n var ruleWidth = metrics.defaultRuleThickness; // Rule 18e\n\n var maxWidth = 4 * ruleWidth;\n\n if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {\n subShift = maxWidth - (supShift - supm.depth) + subm.height;\n var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);\n\n if (psi > 0) {\n supShift += psi;\n subShift -= psi;\n }\n }\n\n var vlistElem = [{\n type: \"elem\",\n elem: subm,\n shift: subShift,\n marginRight: marginRight,\n marginLeft: marginLeft\n }, {\n type: \"elem\",\n elem: supm,\n shift: -supShift,\n marginRight: marginRight\n }];\n supsub = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: vlistElem\n }, options);\n } else if (subm) {\n // Rule 18b\n subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);\n var _vlistElem = [{\n type: \"elem\",\n elem: subm,\n marginLeft: marginLeft,\n marginRight: marginRight\n }];\n supsub = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: subShift,\n children: _vlistElem\n }, options);\n } else if (supm) {\n // Rule 18c, d\n supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n supsub = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -supShift,\n children: [{\n type: \"elem\",\n elem: supm,\n marginRight: marginRight\n }]\n }, options);\n } else {\n throw new Error(\"supsub must have either sup or sub.\");\n } // Wrap the supsub vlist in a span.msupsub to reset text-align.\n\n\n var mclass = getTypeOfDomTree(base, \"right\") || \"mord\";\n return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan([\"msupsub\"], [supsub])], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n // Is the inner group a relevant horizonal brace?\n var isBrace = false;\n var isOver;\n var isSup;\n\n if (group.base && group.base.type === \"horizBrace\") {\n isSup = !!group.sup;\n\n if (isSup === group.base.isOver) {\n isBrace = true;\n isOver = group.base.isOver;\n }\n }\n\n if (group.base && (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n group.base.parentIsSupSub = true;\n }\n\n var children = [buildMathML_buildGroup(group.base, options)];\n\n if (group.sub) {\n children.push(buildMathML_buildGroup(group.sub, options));\n }\n\n if (group.sup) {\n children.push(buildMathML_buildGroup(group.sup, options));\n }\n\n var nodeType;\n\n if (isBrace) {\n nodeType = isOver ? \"mover\" : \"munder\";\n } else if (!group.sub) {\n var base = group.base;\n\n if (base && base.type === \"op\" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) {\n nodeType = \"mover\";\n } else if (base && base.type === \"operatorname\" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) {\n nodeType = \"mover\";\n } else {\n nodeType = \"msup\";\n }\n } else if (!group.sup) {\n var _base = group.base;\n\n if (_base && _base.type === \"op\" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) {\n nodeType = \"munder\";\n } else if (_base && _base.type === \"operatorname\" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) {\n nodeType = \"munder\";\n } else {\n nodeType = \"msub\";\n }\n } else {\n var _base2 = group.base;\n\n if (_base2 && _base2.type === \"op\" && _base2.limits && options.style === src_Style.DISPLAY) {\n nodeType = \"munderover\";\n } else if (_base2 && _base2.type === \"operatorname\" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) {\n nodeType = \"munderover\";\n } else {\n nodeType = \"msubsup\";\n }\n }\n\n return new mathMLTree.MathNode(nodeType, children);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/symbolsOp.js\n\n\n\n // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\n\ndefineFunctionBuilders({\n type: \"atom\",\n htmlBuilder: function htmlBuilder(group, options) {\n return buildCommon.mathsym(group.text, group.mode, options, [\"m\" + group.family]);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mo\", [makeText(group.text, group.mode)]);\n\n if (group.family === \"bin\") {\n var variant = getVariant(group, options);\n\n if (variant === \"bold-italic\") {\n node.setAttribute(\"mathvariant\", variant);\n }\n } else if (group.family === \"punct\") {\n node.setAttribute(\"separator\", \"true\");\n } else if (group.family === \"open\" || group.family === \"close\") {\n // Delims built here should not stretch vertically.\n // See delimsizing.js for stretchy delims.\n node.setAttribute(\"stretchy\", \"false\");\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/symbolsOrd.js\n\n\n\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\nvar defaultVariant = {\n \"mi\": \"italic\",\n \"mn\": \"normal\",\n \"mtext\": \"normal\"\n};\ndefineFunctionBuilders({\n type: \"mathord\",\n htmlBuilder: function htmlBuilder(group, options) {\n return buildCommon.makeOrd(group, options, \"mathord\");\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mi\", [makeText(group.text, group.mode, options)]);\n var variant = getVariant(group, options) || \"italic\";\n\n if (variant !== defaultVariant[node.type]) {\n node.setAttribute(\"mathvariant\", variant);\n }\n\n return node;\n }\n});\ndefineFunctionBuilders({\n type: \"textord\",\n htmlBuilder: function htmlBuilder(group, options) {\n return buildCommon.makeOrd(group, options, \"textord\");\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var text = makeText(group.text, group.mode, options);\n var variant = getVariant(group, options) || \"normal\";\n var node;\n\n if (group.mode === 'text') {\n node = new mathMLTree.MathNode(\"mtext\", [text]);\n } else if (/[0-9]/.test(group.text)) {\n node = new mathMLTree.MathNode(\"mn\", [text]);\n } else if (group.text === \"\\\\prime\") {\n node = new mathMLTree.MathNode(\"mo\", [text]);\n } else {\n node = new mathMLTree.MathNode(\"mi\", [text]);\n }\n\n if (variant !== defaultVariant[node.type]) {\n node.setAttribute(\"mathvariant\", variant);\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js\n\n\n\n // A map of CSS-based spacing functions to their CSS class.\n\nvar cssSpace = {\n \"\\\\nobreak\": \"nobreak\",\n \"\\\\allowbreak\": \"allowbreak\"\n}; // A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character. If a symbol or command is a key\n// in this table, then it should be a regular space character. Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\n\nvar regularSpace = {\n \" \": {},\n \"\\\\ \": {},\n \"~\": {\n className: \"nobreak\"\n },\n \"\\\\space\": {},\n \"\\\\nobreakspace\": {\n className: \"nobreak\"\n }\n}; // ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\n\ndefineFunctionBuilders({\n type: \"spacing\",\n htmlBuilder: function htmlBuilder(group, options) {\n if (regularSpace.hasOwnProperty(group.text)) {\n var className = regularSpace[group.text].className || \"\"; // Spaces are generated by adding an actual space. Each of these\n // things has an entry in the symbols table, so these will be turned\n // into appropriate outputs.\n\n if (group.mode === \"text\") {\n var ord = buildCommon.makeOrd(group, options, \"textord\");\n ord.classes.push(className);\n return ord;\n } else {\n return buildCommon.makeSpan([\"mspace\", className], [buildCommon.mathsym(group.text, group.mode, options)], options);\n }\n } else if (cssSpace.hasOwnProperty(group.text)) {\n // Spaces based on just a CSS class.\n return buildCommon.makeSpan([\"mspace\", cssSpace[group.text]], [], options);\n } else {\n throw new src_ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n }\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var node;\n\n if (regularSpace.hasOwnProperty(group.text)) {\n node = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(\"\\xA0\")]);\n } else if (cssSpace.hasOwnProperty(group.text)) {\n // CSS-based MathML spaces (\\nobreak, \\allowbreak) are ignored\n return new mathMLTree.MathNode(\"mspace\");\n } else {\n throw new src_ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n }\n\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/tag.js\n\n\n\n\nvar pad = function pad() {\n var padNode = new mathMLTree.MathNode(\"mtd\", []);\n padNode.setAttribute(\"width\", \"50%\");\n return padNode;\n};\n\ndefineFunctionBuilders({\n type: \"tag\",\n mathmlBuilder: function mathmlBuilder(group, options) {\n var table = new mathMLTree.MathNode(\"mtable\", [new mathMLTree.MathNode(\"mtr\", [pad(), new mathMLTree.MathNode(\"mtd\", [buildExpressionRow(group.body, options)]), pad(), new mathMLTree.MathNode(\"mtd\", [buildExpressionRow(group.tag, options)])])]);\n table.setAttribute(\"width\", \"100%\");\n return table; // TODO: Left-aligned tags.\n // Currently, the group and options passed here do not contain\n // enough info to set tag alignment. `leqno` is in Settings but it is\n // not passed to Options. On the HTML side, leqno is\n // set by a CSS class applied in buildTree.js. That would have worked\n // in MathML if browsers supported <mlabeledtr>. Since they don't, we\n // need to rewrite the way this function is called.\n }\n});\n;// CONCATENATED MODULE: ./src/functions/text.js\n\n\n\n // Non-mathy text, possibly in a font\n\nvar textFontFamilies = {\n \"\\\\text\": undefined,\n \"\\\\textrm\": \"textrm\",\n \"\\\\textsf\": \"textsf\",\n \"\\\\texttt\": \"texttt\",\n \"\\\\textnormal\": \"textrm\"\n};\nvar textFontWeights = {\n \"\\\\textbf\": \"textbf\",\n \"\\\\textmd\": \"textmd\"\n};\nvar textFontShapes = {\n \"\\\\textit\": \"textit\",\n \"\\\\textup\": \"textup\"\n};\n\nvar optionsWithFont = function optionsWithFont(group, options) {\n var font = group.font; // Checks if the argument is a font family or a font style.\n\n if (!font) {\n return options;\n } else if (textFontFamilies[font]) {\n return options.withTextFontFamily(textFontFamilies[font]);\n } else if (textFontWeights[font]) {\n return options.withTextFontWeight(textFontWeights[font]);\n } else {\n return options.withTextFontShape(textFontShapes[font]);\n }\n};\n\ndefineFunction({\n type: \"text\",\n names: [// Font families\n \"\\\\text\", \"\\\\textrm\", \"\\\\textsf\", \"\\\\texttt\", \"\\\\textnormal\", // Font weights\n \"\\\\textbf\", \"\\\\textmd\", // Font Shapes\n \"\\\\textit\", \"\\\\textup\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser,\n funcName = _ref.funcName;\n var body = args[0];\n return {\n type: \"text\",\n mode: parser.mode,\n body: ordargument(body),\n font: funcName\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var newOptions = optionsWithFont(group, options);\n var inner = buildExpression(group.body, newOptions, true);\n return buildCommon.makeSpan([\"mord\", \"text\"], inner, newOptions);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var newOptions = optionsWithFont(group, options);\n return buildExpressionRow(group.body, newOptions);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/underline.js\n\n\n\n\n\ndefineFunction({\n type: \"underline\",\n names: [\"\\\\underline\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"underline\",\n mode: parser.mode,\n body: args[0]\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n // Underlines are handled in the TeXbook pg 443, Rule 10.\n // Build the inner group.\n var innerGroup = buildGroup(group.body, options); // Create the line to go below the body\n\n var line = buildCommon.makeLineSpan(\"underline-line\", options); // Generate the vlist, with the appropriate kerns\n\n var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n var vlist = buildCommon.makeVList({\n positionType: \"top\",\n positionData: innerGroup.height,\n children: [{\n type: \"kern\",\n size: defaultRuleThickness\n }, {\n type: \"elem\",\n elem: line\n }, {\n type: \"kern\",\n size: 3 * defaultRuleThickness\n }, {\n type: \"elem\",\n elem: innerGroup\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"underline\"], [vlist], options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var operator = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(\"\\u203E\")]);\n operator.setAttribute(\"stretchy\", \"true\");\n var node = new mathMLTree.MathNode(\"munder\", [buildMathML_buildGroup(group.body, options), operator]);\n node.setAttribute(\"accentunder\", \"true\");\n return node;\n }\n});\n;// CONCATENATED MODULE: ./src/functions/vcenter.js\n\n\n\n\n // \\vcenter: Vertically center the argument group on the math axis.\n\ndefineFunction({\n type: \"vcenter\",\n names: [\"\\\\vcenter\"],\n props: {\n numArgs: 1,\n argTypes: [\"original\"],\n // In LaTeX, \\vcenter can act only on a box.\n allowedInText: false\n },\n handler: function handler(_ref, args) {\n var parser = _ref.parser;\n return {\n type: \"vcenter\",\n mode: parser.mode,\n body: args[0]\n };\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var body = buildGroup(group.body, options);\n var axisHeight = options.fontMetrics().axisHeight;\n var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight));\n return buildCommon.makeVList({\n positionType: \"shift\",\n positionData: dy,\n children: [{\n type: \"elem\",\n elem: body\n }]\n }, options);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n // There is no way to do this in MathML.\n // Write a class as a breadcrumb in case some post-processor wants\n // to perform a vcenter adjustment.\n return new mathMLTree.MathNode(\"mpadded\", [buildMathML_buildGroup(group.body, options)], [\"vcenter\"]);\n }\n});\n;// CONCATENATED MODULE: ./src/functions/verb.js\n\n\n\n\ndefineFunction({\n type: \"verb\",\n names: [\"\\\\verb\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: function handler(context, args, optArgs) {\n // \\verb and \\verb* are dealt with directly in Parser.js.\n // If we end up here, it's because of a failure to match the two delimiters\n // in the regex in Lexer.js. LaTeX raises the following error when \\verb is\n // terminated by end of line (or file).\n throw new src_ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n },\n htmlBuilder: function htmlBuilder(group, options) {\n var text = makeVerb(group);\n var body = []; // \\verb enters text mode and therefore is sized like \\textstyle\n\n var newOptions = options.havingStyle(options.style.text());\n\n for (var i = 0; i < text.length; i++) {\n var c = text[i];\n\n if (c === '~') {\n c = '\\\\textasciitilde';\n }\n\n body.push(buildCommon.makeSymbol(c, \"Typewriter-Regular\", group.mode, newOptions, [\"mord\", \"texttt\"]));\n }\n\n return buildCommon.makeSpan([\"mord\", \"text\"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions);\n },\n mathmlBuilder: function mathmlBuilder(group, options) {\n var text = new mathMLTree.TextNode(makeVerb(group));\n var node = new mathMLTree.MathNode(\"mtext\", [text]);\n node.setAttribute(\"mathvariant\", \"monospace\");\n return node;\n }\n});\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\n\nvar makeVerb = function makeVerb(group) {\n return group.body.replace(/ /g, group.star ? \"\\u2423\" : '\\xA0');\n};\n;// CONCATENATED MODULE: ./src/functions.js\n/** Include this to ensure that all functions are defined. */\n\nvar functions = _functions;\n/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with\n// that object in this file instead of relying on side-effects.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/Lexer.js\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n\n\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first group\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n * [1] regular whitespace\n * [2] backslash followed by whitespace\n * [3] anything else, which may include:\n * [4] left character of \\verb*\n * [5] left character of \\verb\n * [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nvar spaceRegexString = \"[ \\r\\n\\t]\";\nvar controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nvar controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nvar controlWordWhitespaceRegexString = \"(\" + controlWordRegexString + \")\" + spaceRegexString + \"*\";\nvar controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nvar combiningDiacriticalMarkString = \"[\\u0300-\\u036F]\";\nvar combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + \"+$\");\nvar tokenRegexString = \"(\" + spaceRegexString + \"+)|\" + ( // whitespace\ncontrolSpaceRegexString + \"|\") + // \\whitespace\n\"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + ( // single codepoint\ncombiningDiacriticalMarkString + \"*\") + // ...plus accents\n\"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + ( // surrogate pair\ncombiningDiacriticalMarkString + \"*\") + // ...plus accents\n\"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n\"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + ( // \\verb unstarred\n\"|\" + controlWordWhitespaceRegexString) + ( // \\macroName + spaces\n\"|\" + controlSymbolRegexString + \")\"); // \\\\, \\', etc.\n\n/** Main Lexer class */\n\nvar Lexer = /*#__PURE__*/function () {\n // Category codes. The lexer only supports comment characters (14) for now.\n // MacroExpander additionally distinguishes active (13).\n function Lexer(input, settings) {\n this.input = void 0;\n this.settings = void 0;\n this.tokenRegex = void 0;\n this.catcodes = void 0;\n // Separate accents from characters\n this.input = input;\n this.settings = settings;\n this.tokenRegex = new RegExp(tokenRegexString, 'g');\n this.catcodes = {\n \"%\": 14,\n // comment character\n \"~\": 13 // active character\n\n };\n }\n\n var _proto = Lexer.prototype;\n\n _proto.setCatcode = function setCatcode(char, code) {\n this.catcodes[char] = code;\n }\n /**\n * This function lexes a single token.\n */\n ;\n\n _proto.lex = function lex() {\n var input = this.input;\n var pos = this.tokenRegex.lastIndex;\n\n if (pos === input.length) {\n return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n }\n\n var match = this.tokenRegex.exec(input);\n\n if (match === null || match.index !== pos) {\n throw new src_ParseError(\"Unexpected character: '\" + input[pos] + \"'\", new Token(input[pos], new SourceLocation(this, pos, pos + 1)));\n }\n\n var text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n if (this.catcodes[text] === 14) {\n // comment character\n var nlIndex = input.indexOf('\\n', this.tokenRegex.lastIndex);\n\n if (nlIndex === -1) {\n this.tokenRegex.lastIndex = input.length; // EOF\n\n this.settings.reportNonstrict(\"commentAtEnd\", \"% comment has no terminating newline; LaTeX would \" + \"fail because of commenting the end of math mode (e.g. $)\");\n } else {\n this.tokenRegex.lastIndex = nlIndex + 1;\n }\n\n return this.lex();\n }\n\n return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n };\n\n return Lexer;\n}();\n\n\n;// CONCATENATED MODULE: ./src/Namespace.js\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\n\n\nvar Namespace = /*#__PURE__*/function () {\n /**\n * Both arguments are optional. The first argument is an object of\n * built-in mappings which never change. The second argument is an object\n * of initial (global-level) mappings, which will constantly change\n * according to any global/top-level `set`s done.\n */\n function Namespace(builtins, globalMacros) {\n if (builtins === void 0) {\n builtins = {};\n }\n\n if (globalMacros === void 0) {\n globalMacros = {};\n }\n\n this.current = void 0;\n this.builtins = void 0;\n this.undefStack = void 0;\n this.current = globalMacros;\n this.builtins = builtins;\n this.undefStack = [];\n }\n /**\n * Start a new nested group, affecting future local `set`s.\n */\n\n\n var _proto = Namespace.prototype;\n\n _proto.beginGroup = function beginGroup() {\n this.undefStack.push({});\n }\n /**\n * End current nested group, restoring values before the group began.\n */\n ;\n\n _proto.endGroup = function endGroup() {\n if (this.undefStack.length === 0) {\n throw new src_ParseError(\"Unbalanced namespace destruction: attempt \" + \"to pop global namespace; please report this as a bug\");\n }\n\n var undefs = this.undefStack.pop();\n\n for (var undef in undefs) {\n if (undefs.hasOwnProperty(undef)) {\n if (undefs[undef] == null) {\n delete this.current[undef];\n } else {\n this.current[undef] = undefs[undef];\n }\n }\n }\n }\n /**\n * Ends all currently nested groups (if any), restoring values before the\n * groups began. Useful in case of an error in the middle of parsing.\n */\n ;\n\n _proto.endGroups = function endGroups() {\n while (this.undefStack.length > 0) {\n this.endGroup();\n }\n }\n /**\n * Detect whether `name` has a definition. Equivalent to\n * `get(name) != null`.\n */\n ;\n\n _proto.has = function has(name) {\n return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);\n }\n /**\n * Get the current value of a name, or `undefined` if there is no value.\n *\n * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n * is defined, as the definition may be the empty string which evaluates\n * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or\n * `if (namespace.has(...))`.\n */\n ;\n\n _proto.get = function get(name) {\n if (this.current.hasOwnProperty(name)) {\n return this.current[name];\n } else {\n return this.builtins[name];\n }\n }\n /**\n * Set the current value of a name, and optionally set it globally too.\n * Local set() sets the current value and (when appropriate) adds an undo\n * operation to the undo stack. Global set() may change the undo\n * operation at every level, so takes time linear in their number.\n * A value of undefined means to delete existing definitions.\n */\n ;\n\n _proto.set = function set(name, value, global) {\n if (global === void 0) {\n global = false;\n }\n\n if (global) {\n // Global set is equivalent to setting in all groups. Simulate this\n // by destroying any undos currently scheduled for this name,\n // and adding an undo with the *new* value (in case it later gets\n // locally reset within this environment).\n for (var i = 0; i < this.undefStack.length; i++) {\n delete this.undefStack[i][name];\n }\n\n if (this.undefStack.length > 0) {\n this.undefStack[this.undefStack.length - 1][name] = value;\n }\n } else {\n // Undo this set at end of this group (possibly to `undefined`),\n // unless an undo is already in place, in which case that older\n // value is the correct one.\n var top = this.undefStack[this.undefStack.length - 1];\n\n if (top && !top.hasOwnProperty(name)) {\n top[name] = this.current[name];\n }\n }\n\n if (value == null) {\n delete this.current[name];\n } else {\n this.current[name] = value;\n }\n };\n\n return Namespace;\n}();\n\n\n;// CONCATENATED MODULE: ./src/macros.js\n/**\n * Predefined macros for KaTeX.\n * This can be used to define some commands in terms of others.\n */\n// Export global macros object from defineMacro\n\nvar macros = _macros;\n/* harmony default export */ var src_macros = (macros);\n\n\n\n\n\n //////////////////////////////////////////////////////////////////////\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function (context) {\n // The expansion is the token itself; but that token is interpreted\n // as if its meaning were \\relax if it is a control sequence that\n // would ordinarily be expanded by TeXs expansion rules.\n var t = context.popToken();\n\n if (context.isExpandable(t.text)) {\n t.noexpand = true;\n t.treatAsRelax = true;\n }\n\n return {\n tokens: [t],\n numArgs: 0\n };\n});\ndefineMacro(\"\\\\expandafter\", function (context) {\n // TeX first reads the token that comes immediately after \\expandafter,\n // without expanding it; lets call this token t. Then TeX reads the\n // token that comes after t (and possibly more tokens, if that token\n // has an argument), replacing it by its expansion. Finally TeX puts\n // t back in front of that expansion.\n var t = context.popToken();\n context.expandOnce(true); // expand only an expandable token\n\n return {\n tokens: [t],\n numArgs: 0\n };\n}); // LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\n\ndefineMacro(\"\\\\@firstoftwo\", function (context) {\n var args = context.consumeArgs(2);\n return {\n tokens: args[0],\n numArgs: 0\n };\n}); // LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\n\ndefineMacro(\"\\\\@secondoftwo\", function (context) {\n var args = context.consumeArgs(2);\n return {\n tokens: args[1],\n numArgs: 0\n };\n}); // LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character. If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\n\ndefineMacro(\"\\\\@ifnextchar\", function (context) {\n var args = context.consumeArgs(3); // symbol, if, else\n\n context.consumeSpaces();\n var nextToken = context.future();\n\n if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n return {\n tokens: args[1],\n numArgs: 0\n };\n } else {\n return {\n tokens: args[2],\n numArgs: 0\n };\n }\n}); // LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\n\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\"); // LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\n\ndefineMacro(\"\\\\TextOrMath\", function (context) {\n var args = context.consumeArgs(2);\n\n if (context.mode === 'text') {\n return {\n tokens: args[0],\n numArgs: 0\n };\n } else {\n return {\n tokens: args[1],\n numArgs: 0\n };\n }\n}); // Lookup table for parsing numbers in base 8 through 16\n\nvar digitToNumber = {\n \"0\": 0,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n \"5\": 5,\n \"6\": 6,\n \"7\": 7,\n \"8\": 8,\n \"9\": 9,\n \"a\": 10,\n \"A\": 10,\n \"b\": 11,\n \"B\": 11,\n \"c\": 12,\n \"C\": 12,\n \"d\": 13,\n \"D\": 13,\n \"e\": 14,\n \"E\": 14,\n \"f\": 15,\n \"F\": 15\n}; // TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n// \\char123 -- decimal\n// \\char'123 -- octal\n// \\char\"123 -- hex\n// \\char`x -- character that can be written (i.e. isn't active)\n// \\char`\\x -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\n\ndefineMacro(\"\\\\char\", function (context) {\n var token = context.popToken();\n var base;\n var number = '';\n\n if (token.text === \"'\") {\n base = 8;\n token = context.popToken();\n } else if (token.text === '\"') {\n base = 16;\n token = context.popToken();\n } else if (token.text === \"`\") {\n token = context.popToken();\n\n if (token.text[0] === \"\\\\\") {\n number = token.text.charCodeAt(1);\n } else if (token.text === \"EOF\") {\n throw new src_ParseError(\"\\\\char` missing argument\");\n } else {\n number = token.text.charCodeAt(0);\n }\n } else {\n base = 10;\n }\n\n if (base) {\n // Parse a number in the given base, starting with first `token`.\n number = digitToNumber[token.text];\n\n if (number == null || number >= base) {\n throw new src_ParseError(\"Invalid base-\" + base + \" digit \" + token.text);\n }\n\n var digit;\n\n while ((digit = digitToNumber[context.future().text]) != null && digit < base) {\n number *= base;\n number += digit;\n context.popToken();\n }\n }\n\n return \"\\\\@char{\" + number + \"}\";\n}); // \\newcommand{\\macro}[args]{definition}\n// \\renewcommand{\\macro}[args]{definition}\n// TODO: Optional arguments: \\newcommand{\\macro}[args][default]{definition}\n\nvar newcommand = function newcommand(context, existsOK, nonexistsOK) {\n var arg = context.consumeArg().tokens;\n\n if (arg.length !== 1) {\n throw new src_ParseError(\"\\\\newcommand's first argument must be a macro name\");\n }\n\n var name = arg[0].text;\n var exists = context.isDefined(name);\n\n if (exists && !existsOK) {\n throw new src_ParseError(\"\\\\newcommand{\" + name + \"} attempting to redefine \" + (name + \"; use \\\\renewcommand\"));\n }\n\n if (!exists && !nonexistsOK) {\n throw new src_ParseError(\"\\\\renewcommand{\" + name + \"} when command \" + name + \" \" + \"does not yet exist; use \\\\newcommand\");\n }\n\n var numArgs = 0;\n arg = context.consumeArg().tokens;\n\n if (arg.length === 1 && arg[0].text === \"[\") {\n var argText = '';\n var token = context.expandNextToken();\n\n while (token.text !== \"]\" && token.text !== \"EOF\") {\n // TODO: Should properly expand arg, e.g., ignore {}s\n argText += token.text;\n token = context.expandNextToken();\n }\n\n if (!argText.match(/^\\s*[0-9]+\\s*$/)) {\n throw new src_ParseError(\"Invalid number of arguments: \" + argText);\n }\n\n numArgs = parseInt(argText);\n arg = context.consumeArg().tokens;\n } // Final arg is the expansion of the macro\n\n\n context.macros.set(name, {\n tokens: arg,\n numArgs: numArgs\n });\n return '';\n};\n\ndefineMacro(\"\\\\newcommand\", function (context) {\n return newcommand(context, false, true);\n});\ndefineMacro(\"\\\\renewcommand\", function (context) {\n return newcommand(context, true, false);\n});\ndefineMacro(\"\\\\providecommand\", function (context) {\n return newcommand(context, true, true);\n}); // terminal (console) tools\n\ndefineMacro(\"\\\\message\", function (context) {\n var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console\n\n console.log(arg.reverse().map(function (token) {\n return token.text;\n }).join(\"\"));\n return '';\n});\ndefineMacro(\"\\\\errmessage\", function (context) {\n var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console\n\n console.error(arg.reverse().map(function (token) {\n return token.text;\n }).join(\"\"));\n return '';\n});\ndefineMacro(\"\\\\show\", function (context) {\n var tok = context.popToken();\n var name = tok.text; // eslint-disable-next-line no-console\n\n console.log(tok, context.macros.get(name), src_functions[name], src_symbols.math[name], src_symbols.text[name]);\n return '';\n}); //////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\n\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\"); // Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\n// \\def \\AA {\\r A}\n\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\ndefineMacro(\"\\\\AA\", \"\\\\r A\"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML.\n// \\DeclareTextCommandDefault{\\textcopyright}{\\textcircled{c}}\n// \\DeclareTextCommandDefault{\\textregistered}{\\textcircled{%\n// \\check@mathfonts\\fontsize\\sf@size\\z@\\math@fontsfalse\\selectfont R}}\n// \\DeclareRobustCommand{\\copyright}{%\n// \\ifmmode{\\nfss@text{\\textcopyright}}\\else\\textcopyright\\fi}\n\ndefineMacro(\"\\\\textcopyright\", \"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`©}\");\ndefineMacro(\"\\\\copyright\", \"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\");\ndefineMacro(\"\\\\textregistered\", \"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`®}\"); // Characters omitted from Unicode range 1D4001D7FF\n\ndefineMacro(\"\\u212C\", \"\\\\mathscr{B}\"); // script\n\ndefineMacro(\"\\u2130\", \"\\\\mathscr{E}\");\ndefineMacro(\"\\u2131\", \"\\\\mathscr{F}\");\ndefineMacro(\"\\u210B\", \"\\\\mathscr{H}\");\ndefineMacro(\"\\u2110\", \"\\\\mathscr{I}\");\ndefineMacro(\"\\u2112\", \"\\\\mathscr{L}\");\ndefineMacro(\"\\u2133\", \"\\\\mathscr{M}\");\ndefineMacro(\"\\u211B\", \"\\\\mathscr{R}\");\ndefineMacro(\"\\u212D\", \"\\\\mathfrak{C}\"); // Fraktur\n\ndefineMacro(\"\\u210C\", \"\\\\mathfrak{H}\");\ndefineMacro(\"\\u2128\", \"\\\\mathfrak{Z}\"); // Define \\Bbbk with a macro that works in both HTML and MathML.\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\"); // Unicode middle dot\n// The KaTeX fonts do not contain U+00B7. Instead, \\cdotp displays\n// the dot at U+22C5 and gives it punct spacing.\n\ndefineMacro(\"\\xB7\", \"\\\\cdotp\"); // \\llap and \\rlap render their contents in text mode\n\ndefineMacro(\"\\\\llap\", \"\\\\mathllap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\rlap\", \"\\\\mathrlap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\clap\", \"\\\\mathclap{\\\\textrm{#1}}\"); // \\mathstrut from the TeXbook, p 360\n\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\"); // \\underbar from TeXbook p 353\n\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\"); // \\not is defined by base/fontmath.ltx via\n// \\DeclareMathSymbol{\\not}{\\mathrel}{symbols}{\"36}\n// It's thus treated like a \\mathrel, but defined by a symbol that has zero\n// width but extends to the right. We use \\rlap to get that spacing.\n// For MathML we write U+0338 here. buildMathML.js will then do the overlay.\n\ndefineMacro(\"\\\\not\", '\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}}{\\\\char\"338}'); // Negated symbols from base/fontmath.ltx:\n// \\def\\neq{\\not=} \\let\\ne=\\neq\n// \\DeclareRobustCommand\n// \\notin{\\mathrel{\\m@th\\mathpalette\\c@ncel\\in}}\n// \\def\\c@ncel#1#2{\\m@th\\ooalign{$\\hfil#1\\mkern1mu/\\hfil$\\crcr$#1#2$}}\n\ndefineMacro(\"\\\\neq\", \"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`≠}}\");\ndefineMacro(\"\\\\ne\", \"\\\\neq\");\ndefineMacro(\"\\u2260\", \"\\\\neq\");\ndefineMacro(\"\\\\notin\", \"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}\" + \"{\\\\mathrel{\\\\char`∉}}\");\ndefineMacro(\"\\u2209\", \"\\\\notin\"); // Unicode stacked relations\n\ndefineMacro(\"\\u2258\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}\" + \"}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u2259\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u225A\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225A}}\");\ndefineMacro(\"\\u225B\", \"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225B}}\");\ndefineMacro(\"\\u225D\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225D}}\");\ndefineMacro(\"\\u225E\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225E}}\");\ndefineMacro(\"\\u225F\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225F}}\"); // Misc Unicode\n\ndefineMacro(\"\\u27C2\", \"\\\\perp\");\ndefineMacro(\"\\u203C\", \"\\\\mathclose{!\\\\mkern-0.8mu!}\");\ndefineMacro(\"\\u220C\", \"\\\\notni\");\ndefineMacro(\"\\u231C\", \"\\\\ulcorner\");\ndefineMacro(\"\\u231D\", \"\\\\urcorner\");\ndefineMacro(\"\\u231E\", \"\\\\llcorner\");\ndefineMacro(\"\\u231F\", \"\\\\lrcorner\");\ndefineMacro(\"\\xA9\", \"\\\\copyright\");\ndefineMacro(\"\\xAE\", \"\\\\textregistered\");\ndefineMacro(\"\\uFE0F\", \"\\\\textregistered\"); // The KaTeX fonts have corners at codepoints that don't match Unicode.\n// For MathML purposes, use the Unicode code point.\n\ndefineMacro(\"\\\\ulcorner\", \"\\\\html@mathml{\\\\@ulcorner}{\\\\mathop{\\\\char\\\"231c}}\");\ndefineMacro(\"\\\\urcorner\", \"\\\\html@mathml{\\\\@urcorner}{\\\\mathop{\\\\char\\\"231d}}\");\ndefineMacro(\"\\\\llcorner\", \"\\\\html@mathml{\\\\@llcorner}{\\\\mathop{\\\\char\\\"231e}}\");\ndefineMacro(\"\\\\lrcorner\", \"\\\\html@mathml{\\\\@lrcorner}{\\\\mathop{\\\\char\\\"231f}}\"); //////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n// \\vdots{\\vbox{\\baselineskip4\\p@ \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\n\ndefineMacro(\"\\\\vdots\", \"\\\\mathord{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22EE\", \"\\\\vdots\"); //////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n// Italic Greek capital letters. AMS defines these with \\DeclareMathSymbol,\n// but they are equivalent to \\mathit{\\Letter}.\n\ndefineMacro(\"\\\\varGamma\", \"\\\\mathit{\\\\Gamma}\");\ndefineMacro(\"\\\\varDelta\", \"\\\\mathit{\\\\Delta}\");\ndefineMacro(\"\\\\varTheta\", \"\\\\mathit{\\\\Theta}\");\ndefineMacro(\"\\\\varLambda\", \"\\\\mathit{\\\\Lambda}\");\ndefineMacro(\"\\\\varXi\", \"\\\\mathit{\\\\Xi}\");\ndefineMacro(\"\\\\varPi\", \"\\\\mathit{\\\\Pi}\");\ndefineMacro(\"\\\\varSigma\", \"\\\\mathit{\\\\Sigma}\");\ndefineMacro(\"\\\\varUpsilon\", \"\\\\mathit{\\\\Upsilon}\");\ndefineMacro(\"\\\\varPhi\", \"\\\\mathit{\\\\Phi}\");\ndefineMacro(\"\\\\varPsi\", \"\\\\mathit{\\\\Psi}\");\ndefineMacro(\"\\\\varOmega\", \"\\\\mathit{\\\\Omega}\"); //\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\n\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\"); // \\renewcommand{\\colon}{\\nobreak\\mskip2mu\\mathpunct{}\\nonscript\n// \\mkern-\\thinmuskip{:}\\mskip6muplus1mu\\relax}\n\ndefineMacro(\"\\\\colon\", \"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\" + \"\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\\\\relax\"); // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}}\n\ndefineMacro(\"\\\\boxed\", \"\\\\fbox{$\\\\displaystyle{#1}$}\"); // \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\n\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\"); // AMSMath's automatic \\dots, based on \\mdots@@ macro.\n\nvar dotsByToken = {\n ',': '\\\\dotsc',\n '\\\\not': '\\\\dotsb',\n // \\keybin@ checks for the following:\n '+': '\\\\dotsb',\n '=': '\\\\dotsb',\n '<': '\\\\dotsb',\n '>': '\\\\dotsb',\n '-': '\\\\dotsb',\n '*': '\\\\dotsb',\n ':': '\\\\dotsb',\n // Symbols whose definition starts with \\DOTSB:\n '\\\\DOTSB': '\\\\dotsb',\n '\\\\coprod': '\\\\dotsb',\n '\\\\bigvee': '\\\\dotsb',\n '\\\\bigwedge': '\\\\dotsb',\n '\\\\biguplus': '\\\\dotsb',\n '\\\\bigcap': '\\\\dotsb',\n '\\\\bigcup': '\\\\dotsb',\n '\\\\prod': '\\\\dotsb',\n '\\\\sum': '\\\\dotsb',\n '\\\\bigotimes': '\\\\dotsb',\n '\\\\bigoplus': '\\\\dotsb',\n '\\\\bigodot': '\\\\dotsb',\n '\\\\bigsqcup': '\\\\dotsb',\n '\\\\And': '\\\\dotsb',\n '\\\\longrightarrow': '\\\\dotsb',\n '\\\\Longrightarrow': '\\\\dotsb',\n '\\\\longleftarrow': '\\\\dotsb',\n '\\\\Longleftarrow': '\\\\dotsb',\n '\\\\longleftrightarrow': '\\\\dotsb',\n '\\\\Longleftrightarrow': '\\\\dotsb',\n '\\\\mapsto': '\\\\dotsb',\n '\\\\longmapsto': '\\\\dotsb',\n '\\\\hookrightarrow': '\\\\dotsb',\n '\\\\doteq': '\\\\dotsb',\n // Symbols whose definition starts with \\mathbin:\n '\\\\mathbin': '\\\\dotsb',\n // Symbols whose definition starts with \\mathrel:\n '\\\\mathrel': '\\\\dotsb',\n '\\\\relbar': '\\\\dotsb',\n '\\\\Relbar': '\\\\dotsb',\n '\\\\xrightarrow': '\\\\dotsb',\n '\\\\xleftarrow': '\\\\dotsb',\n // Symbols whose definition starts with \\DOTSI:\n '\\\\DOTSI': '\\\\dotsi',\n '\\\\int': '\\\\dotsi',\n '\\\\oint': '\\\\dotsi',\n '\\\\iint': '\\\\dotsi',\n '\\\\iiint': '\\\\dotsi',\n '\\\\iiiint': '\\\\dotsi',\n '\\\\idotsint': '\\\\dotsi',\n // Symbols whose definition starts with \\DOTSX:\n '\\\\DOTSX': '\\\\dotsx'\n};\ndefineMacro(\"\\\\dots\", function (context) {\n // TODO: If used in text mode, should expand to \\textellipsis.\n // However, in KaTeX, \\textellipsis and \\ldots behave the same\n // (in text mode), and it's unlikely we'd see any of the math commands\n // that affect the behavior of \\dots when in text mode. So fine for now\n // (until we support \\ifmmode ... \\else ... \\fi).\n var thedots = '\\\\dotso';\n var next = context.expandAfterFuture().text;\n\n if (next in dotsByToken) {\n thedots = dotsByToken[next];\n } else if (next.slice(0, 4) === '\\\\not') {\n thedots = '\\\\dotsb';\n } else if (next in src_symbols.math) {\n if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) {\n thedots = '\\\\dotsb';\n }\n }\n\n return thedots;\n});\nvar spaceAfterDots = {\n // \\rightdelim@ checks for the following:\n ')': true,\n ']': true,\n '\\\\rbrack': true,\n '\\\\}': true,\n '\\\\rbrace': true,\n '\\\\rangle': true,\n '\\\\rceil': true,\n '\\\\rfloor': true,\n '\\\\rgroup': true,\n '\\\\rmoustache': true,\n '\\\\right': true,\n '\\\\bigr': true,\n '\\\\biggr': true,\n '\\\\Bigr': true,\n '\\\\Biggr': true,\n // \\extra@ also tests for the following:\n '$': true,\n // \\extrap@ checks for the following:\n ';': true,\n '.': true,\n ',': true\n};\ndefineMacro(\"\\\\dotso\", function (context) {\n var next = context.future().text;\n\n if (next in spaceAfterDots) {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\ndefineMacro(\"\\\\dotsc\", function (context) {\n var next = context.future().text; // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n // ';' and '.', but doesn't check for ','.\n\n if (next in spaceAfterDots && next !== ',') {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\ndefineMacro(\"\\\\cdots\", function (context) {\n var next = context.future().text;\n\n if (next in spaceAfterDots) {\n return \"\\\\@cdots\\\\,\";\n } else {\n return \"\\\\@cdots\";\n }\n});\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\"); // amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\n\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\"); // \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\n\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\"); // Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n// \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\n\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\"); // \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\n\ndefineMacro(\"\\\\,\", \"\\\\tmspace+{3mu}{.1667em}\"); // \\let\\thinspace\\,\n\ndefineMacro(\"\\\\thinspace\", \"\\\\,\"); // \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\n\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"\\\\tmspace+{4mu}{.2222em}\"); // \\let\\medspace\\:\n\ndefineMacro(\"\\\\medspace\", \"\\\\:\"); // \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\n\ndefineMacro(\"\\\\;\", \"\\\\tmspace+{5mu}{.2777em}\"); // \\let\\thickspace\\;\n\ndefineMacro(\"\\\\thickspace\", \"\\\\;\"); // \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\n\ndefineMacro(\"\\\\!\", \"\\\\tmspace-{3mu}{.1667em}\"); // \\let\\negthinspace\\!\n\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\"); // \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\n\ndefineMacro(\"\\\\negmedspace\", \"\\\\tmspace-{4mu}{.2222em}\"); // \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\n\ndefineMacro(\"\\\\negthickspace\", \"\\\\tmspace-{5mu}{.277em}\"); // \\def\\enspace{\\kern.5em }\n\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \"); // \\def\\enskip{\\hskip.5em\\relax}\n\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\"); // \\def\\quad{\\hskip1em\\relax}\n\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\"); // \\def\\qquad{\\hskip2em\\relax}\n\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\"); // \\tag@in@display form of \\tag\n\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", function (context) {\n if (context.macros.get(\"\\\\df@tag\")) {\n throw new src_ParseError(\"Multiple \\\\tag\");\n }\n\n return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n}); // \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n// {\\operator@font mod}\\penalty900\n// \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n// \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n// \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\n\ndefineMacro(\"\\\\bmod\", \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\" + \"\\\\mathbin{\\\\rm mod}\" + \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\");\ndefineMacro(\"\\\\pod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\");\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\"\\\\mod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" + \"{\\\\rm mod}\\\\,\\\\,#1\"); //////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n// \\expandafter\\let\\expandafter\\@normalcr\n// \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\n\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\"); // \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails. KaTeX doesn't\n// support \\@ yet, so that's omitted, and we add \\text so that the result\n// doesn't look funny in math mode.\n\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{\\\\html@mathml{\" + \"T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX\" + \"}{TeX}}\"); // \\DeclareRobustCommand{\\LaTeX}{L\\kern-.36em%\n// {\\sbox\\z@ T%\n// \\vbox to\\ht\\z@{\\hbox{\\check@mathfonts\n// \\fontsize\\sf@size\\z@\n// \\math@fontsfalse\\selectfont\n// A}%\n// \\vss}%\n// }%\n// \\kern-.15em%\n// \\TeX}\n// This code aligns the top of the A with the T (from the perspective of TeX's\n// boxes, though visually the A appears to extend above slightly).\n// We compute the corresponding \\raisebox when A is rendered in \\normalsize\n// \\scriptstyle, which has a scale factor of 0.7 (see Options.js).\n\nvar latexRaiseA = makeEm(fontMetricsData[\"Main-Regular\"][\"T\".charCodeAt(0)][1] - 0.7 * fontMetricsData[\"Main-Regular\"][\"A\".charCodeAt(0)][1]);\ndefineMacro(\"\\\\LaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"L\\\\kern-.36em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{LaTeX}}\"); // New KaTeX logo based on tweaking LaTeX logo\n\ndefineMacro(\"\\\\KaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"K\\\\kern-.17em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{KaTeX}}\"); // \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n// \\hskip #1\\hskip \\z@skip}\n\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\"); //////////////////////////////////////////////////////////////////////\n// mathtools.sty\n//\\providecommand\\ordinarycolon{:}\n\ndefineMacro(\"\\\\ordinarycolon\", \":\"); //\\def\\vcentcolon{\\mathrel{\\mathop\\ordinarycolon}}\n//TODO(edemaine): Not yet centered. Fix via \\raisebox or #726\n\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\"); // \\providecommand*\\dblcolon{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}\n\ndefineMacro(\"\\\\dblcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2237}}\"); // \\providecommand*\\coloneqq{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}\n\ndefineMacro(\"\\\\coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2254}}\"); // ≔\n// \\providecommand*\\Coloneqq{\\dblcolon\\mathrel{\\mkern-1.2mu}=}\n\ndefineMacro(\"\\\\Coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"3d}}\"); // \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\n\ndefineMacro(\"\\\\coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2212}}\"); // \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\n\ndefineMacro(\"\\\\Coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2212}}\"); // \\providecommand*\\eqqcolon{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}\n\ndefineMacro(\"\\\\eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2255}}\"); // ≕\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\n\ndefineMacro(\"\\\\Eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"3d\\\\char\\\"2237}}\"); // \\providecommand*\\eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}\n\ndefineMacro(\"\\\\eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2239}}\"); // \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\n\ndefineMacro(\"\\\\Eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"2212\\\\char\\\"2237}}\"); // \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\n\ndefineMacro(\"\\\\colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2248}}\"); // \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\n\ndefineMacro(\"\\\\Colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2248}}\"); // \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\n\ndefineMacro(\"\\\\colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"223c}}\"); // \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\n\ndefineMacro(\"\\\\Colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"223c}}\"); // Some Unicode characters are implemented with macros to mathtools functions.\n\ndefineMacro(\"\\u2237\", \"\\\\dblcolon\"); // ::\n\ndefineMacro(\"\\u2239\", \"\\\\eqcolon\"); // -:\n\ndefineMacro(\"\\u2254\", \"\\\\coloneqq\"); // :=\n\ndefineMacro(\"\\u2255\", \"\\\\eqqcolon\"); // =:\n\ndefineMacro(\"\\u2A74\", \"\\\\Coloneqq\"); // ::=\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n// Alternate names for mathtools's macros:\n\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\"); // \\colonapprox name is same in mathtools and colonequals.\n\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\"); // \\colonsim name is same in mathtools and colonequals.\n\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\"); // Additional macros, implemented by analogy with mathtools definitions:\n\ndefineMacro(\"\\\\simcolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\simcoloncolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\ndefineMacro(\"\\\\approxcolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\approxcoloncolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"); // Present in newtxmath, pxfonts and txfonts\n\ndefineMacro(\"\\\\notni\", \"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220C}}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\"); //////////////////////////////////////////////////////////////////////\n// From amsopn.sty\n\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{lim}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{lim}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{lim}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{lim}}\"); //////////////////////////////////////////////////////////////////////\n// MathML alternates for KaTeX glyphs in the Unicode private area\n\ndefineMacro(\"\\\\gvertneqq\", \"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\");\ndefineMacro(\"\\\\lvertneqq\", \"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\");\ndefineMacro(\"\\\\ngeqq\", \"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\");\ndefineMacro(\"\\\\ngeqslant\", \"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\");\ndefineMacro(\"\\\\nleqq\", \"\\\\html@mathml{\\\\@nleqq}{\\u2270}\");\ndefineMacro(\"\\\\nleqslant\", \"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\");\ndefineMacro(\"\\\\nshortmid\", \"\\\\html@mathml{\\\\@nshortmid}{∤}\");\ndefineMacro(\"\\\\nshortparallel\", \"\\\\html@mathml{\\\\@nshortparallel}{∦}\");\ndefineMacro(\"\\\\nsubseteqq\", \"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\");\ndefineMacro(\"\\\\nsupseteqq\", \"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\");\ndefineMacro(\"\\\\varsubsetneq\", \"\\\\html@mathml{\\\\@varsubsetneq}{⊊}\");\ndefineMacro(\"\\\\varsubsetneqq\", \"\\\\html@mathml{\\\\@varsubsetneqq}{⫋}\");\ndefineMacro(\"\\\\varsupsetneq\", \"\\\\html@mathml{\\\\@varsupsetneq}{⊋}\");\ndefineMacro(\"\\\\varsupsetneqq\", \"\\\\html@mathml{\\\\@varsupsetneqq}{⫌}\");\ndefineMacro(\"\\\\imath\", \"\\\\html@mathml{\\\\@imath}{\\u0131}\");\ndefineMacro(\"\\\\jmath\", \"\\\\html@mathml{\\\\@jmath}{\\u0237}\"); //////////////////////////////////////////////////////////////////////\n// stmaryrd and semantic\n// The stmaryrd and semantic packages render the next four items by calling a\n// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.\n\ndefineMacro(\"\\\\llbracket\", \"\\\\html@mathml{\" + \"\\\\mathopen{[\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u27E6}}\");\ndefineMacro(\"\\\\rrbracket\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu]}}\" + \"{\\\\mathclose{\\\\char`\\u27E7}}\");\ndefineMacro(\"\\u27E6\", \"\\\\llbracket\"); // blackboard bold [\n\ndefineMacro(\"\\u27E7\", \"\\\\rrbracket\"); // blackboard bold ]\n\ndefineMacro(\"\\\\lBrace\", \"\\\\html@mathml{\" + \"\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u2983}}\");\ndefineMacro(\"\\\\rBrace\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}\" + \"{\\\\mathclose{\\\\char`\\u2984}}\");\ndefineMacro(\"\\u2983\", \"\\\\lBrace\"); // blackboard bold {\n\ndefineMacro(\"\\u2984\", \"\\\\rBrace\"); // blackboard bold }\n// TODO: Create variable sized versions of the last two items. I believe that\n// will require new font glyphs.\n// The stmaryrd function `\\minuso` provides a \"Plimsoll\" symbol that\n// superimposes the characters \\circ and \\mathminus. Used in chemistry.\n\ndefineMacro(\"\\\\minuso\", \"\\\\mathbin{\\\\html@mathml{\" + \"{\\\\mathrlap{\\\\mathchoice{\\\\kern{0.145em}}{\\\\kern{0.145em}}\" + \"{\\\\kern{0.1015em}}{\\\\kern{0.0725em}}\\\\circ}{-}}}\" + \"{\\\\char`⦵}}\");\ndefineMacro(\"⦵\", \"\\\\minuso\"); //////////////////////////////////////////////////////////////////////\n// texvc.sty\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\Alpha\", \"\\\\mathrm{A}\");\ndefineMacro(\"\\\\Beta\", \"\\\\mathrm{B}\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\Chi\", \"\\\\mathrm{X}\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\Epsilon\", \"\\\\mathrm{E}\");\ndefineMacro(\"\\\\Eta\", \"\\\\mathrm{H}\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\Iota\", \"\\\\mathrm{I}\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\Kappa\", \"\\\\mathrm{K}\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Mu\", \"\\\\mathrm{M}\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\Nu\", \"\\\\mathrm{N}\");\ndefineMacro(\"\\\\Omicron\", \"\\\\mathrm{O}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Rho\", \"\\\\mathrm{P}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\Tau\", \"\\\\mathrm{T}\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\"); // TODO: defineMacro(\"\\\\varcoppa\", \"\\\\\\mbox{\\\\coppa}\");\n\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\ndefineMacro(\"\\\\Zeta\", \"\\\\mathrm{Z}\"); //////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\mathop{\\\\operatorname{plim}}\\\\limits\"); //////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n\nvar braketHelper = function braketHelper(one) {\n return function (context) {\n var left = context.consumeArg().tokens;\n var middle = context.consumeArg().tokens;\n var middleDouble = context.consumeArg().tokens;\n var right = context.consumeArg().tokens;\n var oldMiddle = context.macros.get(\"|\");\n var oldMiddleDouble = context.macros.get(\"\\\\|\");\n context.macros.beginGroup();\n\n var midMacro = function midMacro(double) {\n return function (context) {\n if (one) {\n // Only modify the first instance of | or \\|\n context.macros.set(\"|\", oldMiddle);\n\n if (middleDouble.length) {\n context.macros.set(\"\\\\|\", oldMiddleDouble);\n }\n }\n\n var doubled = double;\n\n if (!double && middleDouble.length) {\n // Mimic \\@ifnextchar\n var nextToken = context.future();\n\n if (nextToken.text === \"|\") {\n context.popToken();\n doubled = true;\n }\n }\n\n return {\n tokens: doubled ? middleDouble : middle,\n numArgs: 0\n };\n };\n };\n\n context.macros.set(\"|\", midMacro(false));\n\n if (middleDouble.length) {\n context.macros.set(\"\\\\|\", midMacro(true));\n }\n\n var arg = context.consumeArg().tokens;\n var expanded = context.expandTokens([].concat(right, arg, left));\n context.macros.endGroup();\n return {\n tokens: expanded.reverse(),\n numArgs: 0\n };\n };\n};\n\ndefineMacro(\"\\\\bra@ket\", braketHelper(false));\ndefineMacro(\"\\\\bra@set\", braketHelper(true));\ndefineMacro(\"\\\\Braket\", \"\\\\bra@ket{\\\\left\\\\langle}\" + \"{\\\\,\\\\middle\\\\vert\\\\,}{\\\\,\\\\middle\\\\vert\\\\,}{\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\Set\", \"\\\\bra@set{\\\\left\\\\{\\\\:}\" + \"{\\\\;\\\\middle\\\\vert\\\\;}{\\\\;\\\\middle\\\\Vert\\\\;}{\\\\:\\\\right\\\\}}\");\ndefineMacro(\"\\\\set\", \"\\\\bra@set{\\\\{\\\\,}{\\\\mid}{}{\\\\,\\\\}}\"); // has no support for special || or \\|\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\n\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\"); // Custom Khan Academy colors, should be moved to an optional package\n\ndefineMacro(\"\\\\blue\", \"\\\\textcolor{##6495ed}{#1}\");\ndefineMacro(\"\\\\orange\", \"\\\\textcolor{##ffa500}{#1}\");\ndefineMacro(\"\\\\pink\", \"\\\\textcolor{##ff00af}{#1}\");\ndefineMacro(\"\\\\red\", \"\\\\textcolor{##df0030}{#1}\");\ndefineMacro(\"\\\\green\", \"\\\\textcolor{##28ae7b}{#1}\");\ndefineMacro(\"\\\\gray\", \"\\\\textcolor{gray}{#1}\");\ndefineMacro(\"\\\\purple\", \"\\\\textcolor{##9d38bd}{#1}\");\ndefineMacro(\"\\\\blueA\", \"\\\\textcolor{##ccfaff}{#1}\");\ndefineMacro(\"\\\\blueB\", \"\\\\textcolor{##80f6ff}{#1}\");\ndefineMacro(\"\\\\blueC\", \"\\\\textcolor{##63d9ea}{#1}\");\ndefineMacro(\"\\\\blueD\", \"\\\\textcolor{##11accd}{#1}\");\ndefineMacro(\"\\\\blueE\", \"\\\\textcolor{##0c7f99}{#1}\");\ndefineMacro(\"\\\\tealA\", \"\\\\textcolor{##94fff5}{#1}\");\ndefineMacro(\"\\\\tealB\", \"\\\\textcolor{##26edd5}{#1}\");\ndefineMacro(\"\\\\tealC\", \"\\\\textcolor{##01d1c1}{#1}\");\ndefineMacro(\"\\\\tealD\", \"\\\\textcolor{##01a995}{#1}\");\ndefineMacro(\"\\\\tealE\", \"\\\\textcolor{##208170}{#1}\");\ndefineMacro(\"\\\\greenA\", \"\\\\textcolor{##b6ffb0}{#1}\");\ndefineMacro(\"\\\\greenB\", \"\\\\textcolor{##8af281}{#1}\");\ndefineMacro(\"\\\\greenC\", \"\\\\textcolor{##74cf70}{#1}\");\ndefineMacro(\"\\\\greenD\", \"\\\\textcolor{##1fab54}{#1}\");\ndefineMacro(\"\\\\greenE\", \"\\\\textcolor{##0d923f}{#1}\");\ndefineMacro(\"\\\\goldA\", \"\\\\textcolor{##ffd0a9}{#1}\");\ndefineMacro(\"\\\\goldB\", \"\\\\textcolor{##ffbb71}{#1}\");\ndefineMacro(\"\\\\goldC\", \"\\\\textcolor{##ff9c39}{#1}\");\ndefineMacro(\"\\\\goldD\", \"\\\\textcolor{##e07d10}{#1}\");\ndefineMacro(\"\\\\goldE\", \"\\\\textcolor{##a75a05}{#1}\");\ndefineMacro(\"\\\\redA\", \"\\\\textcolor{##fca9a9}{#1}\");\ndefineMacro(\"\\\\redB\", \"\\\\textcolor{##ff8482}{#1}\");\ndefineMacro(\"\\\\redC\", \"\\\\textcolor{##f9685d}{#1}\");\ndefineMacro(\"\\\\redD\", \"\\\\textcolor{##e84d39}{#1}\");\ndefineMacro(\"\\\\redE\", \"\\\\textcolor{##bc2612}{#1}\");\ndefineMacro(\"\\\\maroonA\", \"\\\\textcolor{##ffbde0}{#1}\");\ndefineMacro(\"\\\\maroonB\", \"\\\\textcolor{##ff92c6}{#1}\");\ndefineMacro(\"\\\\maroonC\", \"\\\\textcolor{##ed5fa6}{#1}\");\ndefineMacro(\"\\\\maroonD\", \"\\\\textcolor{##ca337c}{#1}\");\ndefineMacro(\"\\\\maroonE\", \"\\\\textcolor{##9e034e}{#1}\");\ndefineMacro(\"\\\\purpleA\", \"\\\\textcolor{##ddd7ff}{#1}\");\ndefineMacro(\"\\\\purpleB\", \"\\\\textcolor{##c6b9fc}{#1}\");\ndefineMacro(\"\\\\purpleC\", \"\\\\textcolor{##aa87ff}{#1}\");\ndefineMacro(\"\\\\purpleD\", \"\\\\textcolor{##7854ab}{#1}\");\ndefineMacro(\"\\\\purpleE\", \"\\\\textcolor{##543b78}{#1}\");\ndefineMacro(\"\\\\mintA\", \"\\\\textcolor{##f5f9e8}{#1}\");\ndefineMacro(\"\\\\mintB\", \"\\\\textcolor{##edf2df}{#1}\");\ndefineMacro(\"\\\\mintC\", \"\\\\textcolor{##e0e5cc}{#1}\");\ndefineMacro(\"\\\\grayA\", \"\\\\textcolor{##f6f7f7}{#1}\");\ndefineMacro(\"\\\\grayB\", \"\\\\textcolor{##f0f1f2}{#1}\");\ndefineMacro(\"\\\\grayC\", \"\\\\textcolor{##e3e5e6}{#1}\");\ndefineMacro(\"\\\\grayD\", \"\\\\textcolor{##d6d8da}{#1}\");\ndefineMacro(\"\\\\grayE\", \"\\\\textcolor{##babec2}{#1}\");\ndefineMacro(\"\\\\grayF\", \"\\\\textcolor{##888d93}{#1}\");\ndefineMacro(\"\\\\grayG\", \"\\\\textcolor{##626569}{#1}\");\ndefineMacro(\"\\\\grayH\", \"\\\\textcolor{##3b3e40}{#1}\");\ndefineMacro(\"\\\\grayI\", \"\\\\textcolor{##21242c}{#1}\");\ndefineMacro(\"\\\\kaBlue\", \"\\\\textcolor{##314453}{#1}\");\ndefineMacro(\"\\\\kaGreen\", \"\\\\textcolor{##71B307}{#1}\");\n;// CONCATENATED MODULE: ./src/MacroExpander.js\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n\n\n\n\n\n\n\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol. Used in `isDefined`.\nvar implicitCommands = {\n \"^\": true,\n // Parser.js\n \"_\": true,\n // Parser.js\n \"\\\\limits\": true,\n // Parser.js\n \"\\\\nolimits\": true // Parser.js\n\n};\n\nvar MacroExpander = /*#__PURE__*/function () {\n function MacroExpander(input, settings, mode) {\n this.settings = void 0;\n this.expansionCount = void 0;\n this.lexer = void 0;\n this.macros = void 0;\n this.stack = void 0;\n this.mode = void 0;\n this.settings = settings;\n this.expansionCount = 0;\n this.feed(input); // Make new global namespace\n\n this.macros = new Namespace(src_macros, settings.macros);\n this.mode = mode;\n this.stack = []; // contains tokens in REVERSE order\n }\n /**\n * Feed a new input string to the same MacroExpander\n * (with existing macros etc.).\n */\n\n\n var _proto = MacroExpander.prototype;\n\n _proto.feed = function feed(input) {\n this.lexer = new Lexer(input, this.settings);\n }\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n ;\n\n _proto.switchMode = function switchMode(newMode) {\n this.mode = newMode;\n }\n /**\n * Start a new group nesting within all namespaces.\n */\n ;\n\n _proto.beginGroup = function beginGroup() {\n this.macros.beginGroup();\n }\n /**\n * End current group nesting within all namespaces.\n */\n ;\n\n _proto.endGroup = function endGroup() {\n this.macros.endGroup();\n }\n /**\n * Ends all currently nested groups (if any), restoring values before the\n * groups began. Useful in case of an error in the middle of parsing.\n */\n ;\n\n _proto.endGroups = function endGroups() {\n this.macros.endGroups();\n }\n /**\n * Returns the topmost token on the stack, without expanding it.\n * Similar in behavior to TeX's `\\futurelet`.\n */\n ;\n\n _proto.future = function future() {\n if (this.stack.length === 0) {\n this.pushToken(this.lexer.lex());\n }\n\n return this.stack[this.stack.length - 1];\n }\n /**\n * Remove and return the next unexpanded token.\n */\n ;\n\n _proto.popToken = function popToken() {\n this.future(); // ensure non-empty stack\n\n return this.stack.pop();\n }\n /**\n * Add a given token to the token stack. In particular, this get be used\n * to put back a token returned from one of the other methods.\n */\n ;\n\n _proto.pushToken = function pushToken(token) {\n this.stack.push(token);\n }\n /**\n * Append an array of tokens to the token stack.\n */\n ;\n\n _proto.pushTokens = function pushTokens(tokens) {\n var _this$stack;\n\n (_this$stack = this.stack).push.apply(_this$stack, tokens);\n }\n /**\n * Find an macro argument without expanding tokens and append the array of\n * tokens to the token stack. Uses Token as a container for the result.\n */\n ;\n\n _proto.scanArgument = function scanArgument(isOptional) {\n var start;\n var end;\n var tokens;\n\n if (isOptional) {\n this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n\n if (this.future().text !== \"[\") {\n return null;\n }\n\n start = this.popToken(); // don't include [ in tokens\n\n var _this$consumeArg = this.consumeArg([\"]\"]);\n\n tokens = _this$consumeArg.tokens;\n end = _this$consumeArg.end;\n } else {\n var _this$consumeArg2 = this.consumeArg();\n\n tokens = _this$consumeArg2.tokens;\n start = _this$consumeArg2.start;\n end = _this$consumeArg2.end;\n } // indicate the end of an argument\n\n\n this.pushToken(new Token(\"EOF\", end.loc));\n this.pushTokens(tokens);\n return start.range(end, \"\");\n }\n /**\n * Consume all following space tokens, without expansion.\n */\n ;\n\n _proto.consumeSpaces = function consumeSpaces() {\n for (;;) {\n var token = this.future();\n\n if (token.text === \" \") {\n this.stack.pop();\n } else {\n break;\n }\n }\n }\n /**\n * Consume an argument from the token stream, and return the resulting array\n * of tokens and start/end token.\n */\n ;\n\n _proto.consumeArg = function consumeArg(delims) {\n // The argument for a delimited parameter is the shortest (possibly\n // empty) sequence of tokens with properly nested {...} groups that is\n // followed ... by this particular list of non-parameter tokens.\n // The argument for an undelimited parameter is the next nonblank\n // token, unless that token is {, when the argument will be the\n // entire {...} group that follows.\n var tokens = [];\n var isDelimited = delims && delims.length > 0;\n\n if (!isDelimited) {\n // Ignore spaces between arguments. As the TeXbook says:\n // \"After you have said \\def\\row#1#2{...}, you are allowed to\n // put spaces between the arguments (e.g., \\row x n), because\n // TeX doesnt use single spaces as undelimited arguments.\"\n this.consumeSpaces();\n }\n\n var start = this.future();\n var tok;\n var depth = 0;\n var match = 0;\n\n do {\n tok = this.popToken();\n tokens.push(tok);\n\n if (tok.text === \"{\") {\n ++depth;\n } else if (tok.text === \"}\") {\n --depth;\n\n if (depth === -1) {\n throw new src_ParseError(\"Extra }\", tok);\n }\n } else if (tok.text === \"EOF\") {\n throw new src_ParseError(\"Unexpected end of input in a macro argument\" + \", expected '\" + (delims && isDelimited ? delims[match] : \"}\") + \"'\", tok);\n }\n\n if (delims && isDelimited) {\n if ((depth === 0 || depth === 1 && delims[match] === \"{\") && tok.text === delims[match]) {\n ++match;\n\n if (match === delims.length) {\n // don't include delims in tokens\n tokens.splice(-match, match);\n break;\n }\n } else {\n match = 0;\n }\n }\n } while (depth !== 0 || isDelimited); // If the argument found ... has the form {<nested tokens>},\n // ... the outermost braces enclosing the argument are removed\n\n\n if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n tokens.pop();\n tokens.shift();\n }\n\n tokens.reverse(); // to fit in with stack order\n\n return {\n tokens: tokens,\n start: start,\n end: tok\n };\n }\n /**\n * Consume the specified number of (delimited) arguments from the token\n * stream and return the resulting array of arguments.\n */\n ;\n\n _proto.consumeArgs = function consumeArgs(numArgs, delimiters) {\n if (delimiters) {\n if (delimiters.length !== numArgs + 1) {\n throw new src_ParseError(\"The length of delimiters doesn't match the number of args!\");\n }\n\n var delims = delimiters[0];\n\n for (var i = 0; i < delims.length; i++) {\n var tok = this.popToken();\n\n if (delims[i] !== tok.text) {\n throw new src_ParseError(\"Use of the macro doesn't match its definition\", tok);\n }\n }\n }\n\n var args = [];\n\n for (var _i = 0; _i < numArgs; _i++) {\n args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens);\n }\n\n return args;\n }\n /**\n * Expand the next token only once if possible.\n *\n * If the token is expanded, the resulting tokens will be pushed onto\n * the stack in reverse order and will be returned as an array,\n * also in reverse order.\n *\n * If not, the next token will be returned without removing it\n * from the stack. This case can be detected by a `Token` return value\n * instead of an `Array` return value.\n *\n * In either case, the next token will be on the top of the stack,\n * or the stack will be empty.\n *\n * Used to implement `expandAfterFuture` and `expandNextToken`.\n *\n * If expandableOnly, only expandable tokens are expanded and\n * an undefined control sequence results in an error.\n */\n ;\n\n _proto.expandOnce = function expandOnce(expandableOnly) {\n var topToken = this.popToken();\n var name = topToken.text;\n var expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n\n if (expansion == null || expandableOnly && expansion.unexpandable) {\n if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n throw new src_ParseError(\"Undefined control sequence: \" + name);\n }\n\n this.pushToken(topToken);\n return topToken;\n }\n\n this.expansionCount++;\n\n if (this.expansionCount > this.settings.maxExpand) {\n throw new src_ParseError(\"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\");\n }\n\n var tokens = expansion.tokens;\n var args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n\n if (expansion.numArgs) {\n // paste arguments in place of the placeholders\n tokens = tokens.slice(); // make a shallow copy\n\n for (var i = tokens.length - 1; i >= 0; --i) {\n var tok = tokens[i];\n\n if (tok.text === \"#\") {\n if (i === 0) {\n throw new src_ParseError(\"Incomplete placeholder at end of macro body\", tok);\n }\n\n tok = tokens[--i]; // next token on stack\n\n if (tok.text === \"#\") {\n // ## → #\n tokens.splice(i + 1, 1); // drop first #\n } else if (/^[1-9]$/.test(tok.text)) {\n var _tokens;\n\n // replace the placeholder with the indicated argument\n (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1]));\n } else {\n throw new src_ParseError(\"Not a valid argument number\", tok);\n }\n }\n }\n } // Concatenate expansion onto top of stack.\n\n\n this.pushTokens(tokens);\n return tokens;\n }\n /**\n * Expand the next token only once (if possible), and return the resulting\n * top token on the stack (without removing anything from the stack).\n * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n * Equivalent to expandOnce() followed by future().\n */\n ;\n\n _proto.expandAfterFuture = function expandAfterFuture() {\n this.expandOnce();\n return this.future();\n }\n /**\n * Recursively expand first token, then return first non-expandable token.\n */\n ;\n\n _proto.expandNextToken = function expandNextToken() {\n for (;;) {\n var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.\n\n if (expanded instanceof Token) {\n // the token after \\noexpand is interpreted as if its meaning\n // were \\relax\n if (expanded.treatAsRelax) {\n expanded.text = \"\\\\relax\";\n }\n\n return this.stack.pop(); // === expanded\n }\n } // Flow unable to figure out that this pathway is impossible.\n // https://github.com/facebook/flow/issues/4808\n\n\n throw new Error(); // eslint-disable-line no-unreachable\n }\n /**\n * Fully expand the given macro name and return the resulting list of\n * tokens, or return `undefined` if no such macro is defined.\n */\n ;\n\n _proto.expandMacro = function expandMacro(name) {\n return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n }\n /**\n * Fully expand the given token stream and return the resulting list of\n * tokens. Note that the input tokens are in reverse order, but the\n * output tokens are in forward order.\n */\n ;\n\n _proto.expandTokens = function expandTokens(tokens) {\n var output = [];\n var oldStackLength = this.stack.length;\n this.pushTokens(tokens);\n\n while (this.stack.length > oldStackLength) {\n var expanded = this.expandOnce(true); // expand only expandable tokens\n // expandOnce returns Token if and only if it's fully expanded.\n\n if (expanded instanceof Token) {\n if (expanded.treatAsRelax) {\n // the expansion of \\noexpand is the token itself\n expanded.noexpand = false;\n expanded.treatAsRelax = false;\n }\n\n output.push(this.stack.pop());\n }\n }\n\n return output;\n }\n /**\n * Fully expand the given macro name and return the result as a string,\n * or return `undefined` if no such macro is defined.\n */\n ;\n\n _proto.expandMacroAsText = function expandMacroAsText(name) {\n var tokens = this.expandMacro(name);\n\n if (tokens) {\n return tokens.map(function (token) {\n return token.text;\n }).join(\"\");\n } else {\n return tokens;\n }\n }\n /**\n * Returns the expanded macro as a reversed array of tokens and a macro\n * argument count. Or returns `null` if no such macro.\n */\n ;\n\n _proto._getExpansion = function _getExpansion(name) {\n var definition = this.macros.get(name);\n\n if (definition == null) {\n // mainly checking for undefined here\n return definition;\n } // If a single character has an associated catcode other than 13\n // (active character), then don't expand it.\n\n\n if (name.length === 1) {\n var catcode = this.lexer.catcodes[name];\n\n if (catcode != null && catcode !== 13) {\n return;\n }\n }\n\n var expansion = typeof definition === \"function\" ? definition(this) : definition;\n\n if (typeof expansion === \"string\") {\n var numArgs = 0;\n\n if (expansion.indexOf(\"#\") !== -1) {\n var stripped = expansion.replace(/##/g, \"\");\n\n while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n ++numArgs;\n }\n }\n\n var bodyLexer = new Lexer(expansion, this.settings);\n var tokens = [];\n var tok = bodyLexer.lex();\n\n while (tok.text !== \"EOF\") {\n tokens.push(tok);\n tok = bodyLexer.lex();\n }\n\n tokens.reverse(); // to fit in with stack using push and pop\n\n var expanded = {\n tokens: tokens,\n numArgs: numArgs\n };\n return expanded;\n }\n\n return expansion;\n }\n /**\n * Determine whether a command is currently \"defined\" (has some\n * functionality), meaning that it's a macro (in the current group),\n * a function, a symbol, or one of the special commands listed in\n * `implicitCommands`.\n */\n ;\n\n _proto.isDefined = function isDefined(name) {\n return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);\n }\n /**\n * Determine whether a command is expandable.\n */\n ;\n\n _proto.isExpandable = function isExpandable(name) {\n var macro = this.macros.get(name);\n return macro != null ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable : src_functions.hasOwnProperty(name) && !src_functions[name].primitive;\n };\n\n return MacroExpander;\n}();\n\n\n;// CONCATENATED MODULE: ./src/unicodeSupOrSub.js\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\nvar unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\nvar uSubsAndSups = Object.freeze({\n '₊': '+',\n '₋': '-',\n '₌': '=',\n '₍': '(',\n '₎': ')',\n '₀': '0',\n '₁': '1',\n '₂': '2',\n '₃': '3',\n '₄': '4',\n '₅': '5',\n '₆': '6',\n '₇': '7',\n '₈': '8',\n '₉': '9',\n \"\\u2090\": 'a',\n \"\\u2091\": 'e',\n \"\\u2095\": 'h',\n \"\\u1D62\": 'i',\n \"\\u2C7C\": 'j',\n \"\\u2096\": 'k',\n \"\\u2097\": 'l',\n \"\\u2098\": 'm',\n \"\\u2099\": 'n',\n \"\\u2092\": 'o',\n \"\\u209A\": 'p',\n \"\\u1D63\": 'r',\n \"\\u209B\": 's',\n \"\\u209C\": 't',\n \"\\u1D64\": 'u',\n \"\\u1D65\": 'v',\n \"\\u2093\": 'x',\n \"\\u1D66\": 'β',\n \"\\u1D67\": 'γ',\n \"\\u1D68\": 'ρ',\n \"\\u1D69\": \"\\u03D5\",\n \"\\u1D6A\": 'χ',\n '⁺': '+',\n '⁻': '-',\n '⁼': '=',\n '⁽': '(',\n '⁾': ')',\n '⁰': '0',\n '¹': '1',\n '²': '2',\n '³': '3',\n '⁴': '4',\n '⁵': '5',\n '⁶': '6',\n '⁷': '7',\n '⁸': '8',\n '⁹': '9',\n \"\\u1D2C\": 'A',\n \"\\u1D2E\": 'B',\n \"\\u1D30\": 'D',\n \"\\u1D31\": 'E',\n \"\\u1D33\": 'G',\n \"\\u1D34\": 'H',\n \"\\u1D35\": 'I',\n \"\\u1D36\": 'J',\n \"\\u1D37\": 'K',\n \"\\u1D38\": 'L',\n \"\\u1D39\": 'M',\n \"\\u1D3A\": 'N',\n \"\\u1D3C\": 'O',\n \"\\u1D3E\": 'P',\n \"\\u1D3F\": 'R',\n \"\\u1D40\": 'T',\n \"\\u1D41\": 'U',\n \"\\u2C7D\": 'V',\n \"\\u1D42\": 'W',\n \"\\u1D43\": 'a',\n \"\\u1D47\": 'b',\n \"\\u1D9C\": 'c',\n \"\\u1D48\": 'd',\n \"\\u1D49\": 'e',\n \"\\u1DA0\": 'f',\n \"\\u1D4D\": 'g',\n \"\\u02B0\": 'h',\n \"\\u2071\": 'i',\n \"\\u02B2\": 'j',\n \"\\u1D4F\": 'k',\n \"\\u02E1\": 'l',\n \"\\u1D50\": 'm',\n \"\\u207F\": 'n',\n \"\\u1D52\": 'o',\n \"\\u1D56\": 'p',\n \"\\u02B3\": 'r',\n \"\\u02E2\": 's',\n \"\\u1D57\": 't',\n \"\\u1D58\": 'u',\n \"\\u1D5B\": 'v',\n \"\\u02B7\": 'w',\n \"\\u02E3\": 'x',\n \"\\u02B8\": 'y',\n \"\\u1DBB\": 'z',\n \"\\u1D5D\": 'β',\n \"\\u1D5E\": 'γ',\n \"\\u1D5F\": 'δ',\n \"\\u1D60\": \"\\u03D5\",\n \"\\u1D61\": 'χ',\n \"\\u1DBF\": 'θ'\n});\n;// CONCATENATED MODULE: ./src/Parser.js\n/* eslint no-constant-condition:0 */\n\n\n\n\n\n\n\n\n\n\n // Pre-evaluate both modules as unicodeSymbols require String.normalize()\n\nvar unicodeAccents = {\n \"́\": {\n \"text\": \"\\\\'\",\n \"math\": \"\\\\acute\"\n },\n \"̀\": {\n \"text\": \"\\\\`\",\n \"math\": \"\\\\grave\"\n },\n \"̈\": {\n \"text\": \"\\\\\\\"\",\n \"math\": \"\\\\ddot\"\n },\n \"̃\": {\n \"text\": \"\\\\~\",\n \"math\": \"\\\\tilde\"\n },\n \"̄\": {\n \"text\": \"\\\\=\",\n \"math\": \"\\\\bar\"\n },\n \"̆\": {\n \"text\": \"\\\\u\",\n \"math\": \"\\\\breve\"\n },\n \"̌\": {\n \"text\": \"\\\\v\",\n \"math\": \"\\\\check\"\n },\n \"̂\": {\n \"text\": \"\\\\^\",\n \"math\": \"\\\\hat\"\n },\n \"̇\": {\n \"text\": \"\\\\.\",\n \"math\": \"\\\\dot\"\n },\n \"̊\": {\n \"text\": \"\\\\r\",\n \"math\": \"\\\\mathring\"\n },\n \"̋\": {\n \"text\": \"\\\\H\"\n },\n \"̧\": {\n \"text\": \"\\\\c\"\n }\n};\nvar unicodeSymbols = {\n \"á\": \"á\",\n \"à\": \"à\",\n \"ä\": \"ä\",\n \"ǟ\": \"ǟ\",\n \"ã\": \"ã\",\n \"ā\": \"ā\",\n \"ă\": \"ă\",\n \"ắ\": \"ắ\",\n \"ằ\": \"ằ\",\n \"ẵ\": \"ẵ\",\n \"ǎ\": \"ǎ\",\n \"â\": \"â\",\n \"ấ\": \"ấ\",\n \"ầ\": \"ầ\",\n \"ẫ\": \"ẫ\",\n \"ȧ\": \"ȧ\",\n \"ǡ\": \"ǡ\",\n \"å\": \"å\",\n \"ǻ\": \"ǻ\",\n \"ḃ\": \"ḃ\",\n \"ć\": \"ć\",\n \"ḉ\": \"ḉ\",\n \"č\": \"č\",\n \"ĉ\": \"ĉ\",\n \"ċ\": \"ċ\",\n \"ç\": \"ç\",\n \"ď\": \"ď\",\n \"ḋ\": \"ḋ\",\n \"ḑ\": \"ḑ\",\n \"é\": \"é\",\n \"è\": \"è\",\n \"ë\": \"ë\",\n \"ẽ\": \"ẽ\",\n \"ē\": \"ē\",\n \"ḗ\": \"ḗ\",\n \"ḕ\": \"ḕ\",\n \"ĕ\": \"ĕ\",\n \"ḝ\": \"ḝ\",\n \"ě\": \"ě\",\n \"ê\": \"ê\",\n \"ế\": \"ế\",\n \"ề\": \"ề\",\n \"ễ\": \"ễ\",\n \"ė\": \"ė\",\n \"ȩ\": \"ȩ\",\n \"ḟ\": \"ḟ\",\n \"ǵ\": \"ǵ\",\n \"ḡ\": \"ḡ\",\n \"ğ\": \"ğ\",\n \"ǧ\": \"ǧ\",\n \"ĝ\": \"ĝ\",\n \"ġ\": \"ġ\",\n \"ģ\": \"ģ\",\n \"ḧ\": \"ḧ\",\n \"ȟ\": \"ȟ\",\n \"ĥ\": \"ĥ\",\n \"ḣ\": \"ḣ\",\n \"ḩ\": \"ḩ\",\n \"í\": \"í\",\n \"ì\": \"ì\",\n \"ï\": \"ï\",\n \"ḯ\": \"ḯ\",\n \"ĩ\": \"ĩ\",\n \"ī\": \"ī\",\n \"ĭ\": \"ĭ\",\n \"ǐ\": \"ǐ\",\n \"î\": \"î\",\n \"ǰ\": \"ǰ\",\n \"ĵ\": \"ĵ\",\n \"ḱ\": \"ḱ\",\n \"ǩ\": \"ǩ\",\n \"ķ\": \"ķ\",\n \"ĺ\": \"ĺ\",\n \"ľ\": \"ľ\",\n \"ļ\": \"ļ\",\n \"ḿ\": \"ḿ\",\n \"ṁ\": \"ṁ\",\n \"ń\": \"ń\",\n \"ǹ\": \"ǹ\",\n \"ñ\": \"ñ\",\n \"ň\": \"ň\",\n \"ṅ\": \"ṅ\",\n \"ņ\": \"ņ\",\n \"ó\": \"ó\",\n \"ò\": \"ò\",\n \"ö\": \"ö\",\n \"ȫ\": \"ȫ\",\n \"õ\": \"õ\",\n \"ṍ\": \"ṍ\",\n \"ṏ\": \"ṏ\",\n \"ȭ\": \"ȭ\",\n \"ō\": \"ō\",\n \"ṓ\": \"ṓ\",\n \"ṑ\": \"ṑ\",\n \"ŏ\": \"ŏ\",\n \"ǒ\": \"ǒ\",\n \"ô\": \"ô\",\n \"ố\": \"ố\",\n \"ồ\": \"ồ\",\n \"ỗ\": \"ỗ\",\n \"ȯ\": \"ȯ\",\n \"ȱ\": \"ȱ\",\n \"ő\": \"ő\",\n \"ṕ\": \"ṕ\",\n \"ṗ\": \"ṗ\",\n \"ŕ\": \"ŕ\",\n \"ř\": \"ř\",\n \"ṙ\": \"ṙ\",\n \"ŗ\": \"ŗ\",\n \"ś\": \"ś\",\n \"ṥ\": \"ṥ\",\n \"š\": \"š\",\n \"ṧ\": \"ṧ\",\n \"ŝ\": \"ŝ\",\n \"ṡ\": \"ṡ\",\n \"ş\": \"ş\",\n \"ẗ\": \"ẗ\",\n \"ť\": \"ť\",\n \"ṫ\": \"ṫ\",\n \"ţ\": \"ţ\",\n \"ú\": \"ú\",\n \"ù\": \"ù\",\n \"ü\": \"ü\",\n \"ǘ\": \"ǘ\",\n \"ǜ\": \"ǜ\",\n \"ǖ\": \"ǖ\",\n \"ǚ\": \"ǚ\",\n \"ũ\": \"ũ\",\n \"ṹ\": \"ṹ\",\n \"ū\": \"ū\",\n \"ṻ\": \"ṻ\",\n \"ŭ\": \"ŭ\",\n \"ǔ\": \"ǔ\",\n \"û\": \"û\",\n \"ů\": \"ů\",\n \"ű\": \"ű\",\n \"ṽ\": \"ṽ\",\n \"ẃ\": \"ẃ\",\n \"ẁ\": \"ẁ\",\n \"ẅ\": \"ẅ\",\n \"ŵ\": \"ŵ\",\n \"ẇ\": \"ẇ\",\n \"ẘ\": \"ẘ\",\n \"ẍ\": \"ẍ\",\n \"ẋ\": \"ẋ\",\n \"ý\": \"ý\",\n \"ỳ\": \"ỳ\",\n \"ÿ\": \"ÿ\",\n \"ỹ\": \"ỹ\",\n \"ȳ\": \"ȳ\",\n \"ŷ\": \"ŷ\",\n \"ẏ\": \"ẏ\",\n \"ẙ\": \"ẙ\",\n \"ź\": \"ź\",\n \"ž\": \"ž\",\n \"ẑ\": \"ẑ\",\n \"ż\": \"ż\",\n \"Á\": \"Á\",\n \"À\": \"À\",\n \"Ä\": \"Ä\",\n \"Ǟ\": \"Ǟ\",\n \"Ã\": \"Ã\",\n \"Ā\": \"Ā\",\n \"Ă\": \"Ă\",\n \"Ắ\": \"Ắ\",\n \"Ằ\": \"Ằ\",\n \"Ẵ\": \"Ẵ\",\n \"Ǎ\": \"Ǎ\",\n \"Â\": \"Â\",\n \"Ấ\": \"Ấ\",\n \"Ầ\": \"Ầ\",\n \"Ẫ\": \"Ẫ\",\n \"Ȧ\": \"Ȧ\",\n \"Ǡ\": \"Ǡ\",\n \"Å\": \"Å\",\n \"Ǻ\": \"Ǻ\",\n \"Ḃ\": \"Ḃ\",\n \"Ć\": \"Ć\",\n \"Ḉ\": \"Ḉ\",\n \"Č\": \"Č\",\n \"Ĉ\": \"Ĉ\",\n \"Ċ\": \"Ċ\",\n \"Ç\": \"Ç\",\n \"Ď\": \"Ď\",\n \"Ḋ\": \"Ḋ\",\n \"Ḑ\": \"Ḑ\",\n \"É\": \"É\",\n \"È\": \"È\",\n \"Ë\": \"Ë\",\n \"Ẽ\": \"Ẽ\",\n \"Ē\": \"Ē\",\n \"Ḗ\": \"Ḗ\",\n \"Ḕ\": \"Ḕ\",\n \"Ĕ\": \"Ĕ\",\n \"Ḝ\": \"Ḝ\",\n \"Ě\": \"Ě\",\n \"Ê\": \"Ê\",\n \"Ế\": \"Ế\",\n \"Ề\": \"Ề\",\n \"Ễ\": \"Ễ\",\n \"Ė\": \"Ė\",\n \"Ȩ\": \"Ȩ\",\n \"Ḟ\": \"Ḟ\",\n \"Ǵ\": \"Ǵ\",\n \"Ḡ\": \"Ḡ\",\n \"Ğ\": \"Ğ\",\n \"Ǧ\": \"Ǧ\",\n \"Ĝ\": \"Ĝ\",\n \"Ġ\": \"Ġ\",\n \"Ģ\": \"Ģ\",\n \"Ḧ\": \"Ḧ\",\n \"Ȟ\": \"Ȟ\",\n \"Ĥ\": \"Ĥ\",\n \"Ḣ\": \"Ḣ\",\n \"Ḩ\": \"Ḩ\",\n \"Í\": \"Í\",\n \"Ì\": \"Ì\",\n \"Ï\": \"Ï\",\n \"Ḯ\": \"Ḯ\",\n \"Ĩ\": \"Ĩ\",\n \"Ī\": \"Ī\",\n \"Ĭ\": \"Ĭ\",\n \"Ǐ\": \"Ǐ\",\n \"Î\": \"Î\",\n \"İ\": \"İ\",\n \"Ĵ\": \"Ĵ\",\n \"Ḱ\": \"Ḱ\",\n \"Ǩ\": \"Ǩ\",\n \"Ķ\": \"Ķ\",\n \"Ĺ\": \"Ĺ\",\n \"Ľ\": \"Ľ\",\n \"Ļ\": \"Ļ\",\n \"Ḿ\": \"Ḿ\",\n \"Ṁ\": \"Ṁ\",\n \"Ń\": \"Ń\",\n \"Ǹ\": \"Ǹ\",\n \"Ñ\": \"Ñ\",\n \"Ň\": \"Ň\",\n \"Ṅ\": \"Ṅ\",\n \"Ņ\": \"Ņ\",\n \"Ó\": \"Ó\",\n \"Ò\": \"Ò\",\n \"Ö\": \"Ö\",\n \"Ȫ\": \"Ȫ\",\n \"Õ\": \"Õ\",\n \"Ṍ\": \"Ṍ\",\n \"Ṏ\": \"Ṏ\",\n \"Ȭ\": \"Ȭ\",\n \"Ō\": \"Ō\",\n \"Ṓ\": \"Ṓ\",\n \"Ṑ\": \"Ṑ\",\n \"Ŏ\": \"Ŏ\",\n \"Ǒ\": \"Ǒ\",\n \"Ô\": \"Ô\",\n \"Ố\": \"Ố\",\n \"Ồ\": \"Ồ\",\n \"Ỗ\": \"Ỗ\",\n \"Ȯ\": \"Ȯ\",\n \"Ȱ\": \"Ȱ\",\n \"Ő\": \"Ő\",\n \"Ṕ\": \"Ṕ\",\n \"Ṗ\": \"Ṗ\",\n \"Ŕ\": \"Ŕ\",\n \"Ř\": \"Ř\",\n \"Ṙ\": \"Ṙ\",\n \"Ŗ\": \"Ŗ\",\n \"Ś\": \"Ś\",\n \"Ṥ\": \"Ṥ\",\n \"Š\": \"Š\",\n \"Ṧ\": \"Ṧ\",\n \"Ŝ\": \"Ŝ\",\n \"Ṡ\": \"Ṡ\",\n \"Ş\": \"Ş\",\n \"Ť\": \"Ť\",\n \"Ṫ\": \"Ṫ\",\n \"Ţ\": \"Ţ\",\n \"Ú\": \"Ú\",\n \"Ù\": \"Ù\",\n \"Ü\": \"Ü\",\n \"Ǘ\": \"Ǘ\",\n \"Ǜ\": \"Ǜ\",\n \"Ǖ\": \"Ǖ\",\n \"Ǚ\": \"Ǚ\",\n \"Ũ\": \"Ũ\",\n \"Ṹ\": \"Ṹ\",\n \"Ū\": \"Ū\",\n \"Ṻ\": \"Ṻ\",\n \"Ŭ\": \"Ŭ\",\n \"Ǔ\": \"Ǔ\",\n \"Û\": \"Û\",\n \"Ů\": \"Ů\",\n \"Ű\": \"Ű\",\n \"Ṽ\": \"Ṽ\",\n \"Ẃ\": \"Ẃ\",\n \"Ẁ\": \"Ẁ\",\n \"Ẅ\": \"Ẅ\",\n \"Ŵ\": \"Ŵ\",\n \"Ẇ\": \"Ẇ\",\n \"Ẍ\": \"Ẍ\",\n \"Ẋ\": \"Ẋ\",\n \"Ý\": \"Ý\",\n \"Ỳ\": \"Ỳ\",\n \"Ÿ\": \"Ÿ\",\n \"Ỹ\": \"Ỹ\",\n \"Ȳ\": \"Ȳ\",\n \"Ŷ\": \"Ŷ\",\n \"Ẏ\": \"Ẏ\",\n \"Ź\": \"Ź\",\n \"Ž\": \"Ž\",\n \"Ẑ\": \"Ẑ\",\n \"Ż\": \"Ż\",\n \"ά\": \"ά\",\n \"ὰ\": \"ὰ\",\n \"ᾱ\": \"ᾱ\",\n \"ᾰ\": \"ᾰ\",\n \"έ\": \"έ\",\n \"ὲ\": \"ὲ\",\n \"ή\": \"ή\",\n \"ὴ\": \"ὴ\",\n \"ί\": \"ί\",\n \"ὶ\": \"ὶ\",\n \"ϊ\": \"ϊ\",\n \"ΐ\": \"ΐ\",\n \"ῒ\": \"ῒ\",\n \"ῑ\": \"ῑ\",\n \"ῐ\": \"ῐ\",\n \"ό\": \"ό\",\n \"ὸ\": \"ὸ\",\n \"ύ\": \"ύ\",\n \"ὺ\": \"ὺ\",\n \"ϋ\": \"ϋ\",\n \"ΰ\": \"ΰ\",\n \"ῢ\": \"ῢ\",\n \"ῡ\": \"ῡ\",\n \"ῠ\": \"ῠ\",\n \"ώ\": \"ώ\",\n \"ὼ\": \"ὼ\",\n \"Ύ\": \"Ύ\",\n \"Ὺ\": \"Ὺ\",\n \"Ϋ\": \"Ϋ\",\n \"Ῡ\": \"Ῡ\",\n \"Ῠ\": \"Ῠ\",\n \"Ώ\": \"Ώ\",\n \"Ὼ\": \"Ὼ\"\n};\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\nvar Parser = /*#__PURE__*/function () {\n function Parser(input, settings) {\n this.mode = void 0;\n this.gullet = void 0;\n this.settings = void 0;\n this.leftrightDepth = void 0;\n this.nextToken = void 0;\n // Start in math mode\n this.mode = \"math\"; // Create a new macro expander (gullet) and (indirectly via that) also a\n // new lexer (mouth) for this parser (stomach, in the language of TeX)\n\n this.gullet = new MacroExpander(input, settings, this.mode); // Store the settings for use in parsing\n\n this.settings = settings; // Count leftright depth (for \\middle errors)\n\n this.leftrightDepth = 0;\n }\n /**\n * Checks a result to make sure it has the right type, and throws an\n * appropriate error otherwise.\n */\n\n\n var _proto = Parser.prototype;\n\n _proto.expect = function expect(text, consume) {\n if (consume === void 0) {\n consume = true;\n }\n\n if (this.fetch().text !== text) {\n throw new src_ParseError(\"Expected '\" + text + \"', got '\" + this.fetch().text + \"'\", this.fetch());\n }\n\n if (consume) {\n this.consume();\n }\n }\n /**\n * Discards the current lookahead token, considering it consumed.\n */\n ;\n\n _proto.consume = function consume() {\n this.nextToken = null;\n }\n /**\n * Return the current lookahead token, or if there isn't one (at the\n * beginning, or if the previous lookahead token was consume()d),\n * fetch the next token as the new lookahead token and return it.\n */\n ;\n\n _proto.fetch = function fetch() {\n if (this.nextToken == null) {\n this.nextToken = this.gullet.expandNextToken();\n }\n\n return this.nextToken;\n }\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n ;\n\n _proto.switchMode = function switchMode(newMode) {\n this.mode = newMode;\n this.gullet.switchMode(newMode);\n }\n /**\n * Main parsing function, which parses an entire input.\n */\n ;\n\n _proto.parse = function parse() {\n if (!this.settings.globalGroup) {\n // Create a group namespace for the math expression.\n // (LaTeX creates a new group for every $...$, $$...$$, \\[...\\].)\n this.gullet.beginGroup();\n } // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n // We do this within the group for the math expression, so it doesn't\n // pollute settings.macros.\n\n\n if (this.settings.colorIsTextColor) {\n this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n }\n\n try {\n // Try to parse the input\n var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end\n\n this.expect(\"EOF\"); // End the group namespace for the expression\n\n if (!this.settings.globalGroup) {\n this.gullet.endGroup();\n }\n\n return parse; // Close any leftover groups in case of a parse error.\n } finally {\n this.gullet.endGroups();\n }\n }\n /**\n * Fully parse a separate sequence of tokens as a separate job.\n * Tokens should be specified in reverse order, as in a MacroDefinition.\n */\n ;\n\n _proto.subparse = function subparse(tokens) {\n // Save the next token from the current job.\n var oldToken = this.nextToken;\n this.consume(); // Run the new job, terminating it with an excess '}'\n\n this.gullet.pushToken(new Token(\"}\"));\n this.gullet.pushTokens(tokens);\n var parse = this.parseExpression(false);\n this.expect(\"}\"); // Restore the next token from the current job.\n\n this.nextToken = oldToken;\n return parse;\n };\n\n /**\n * Parses an \"expression\", which is a list of atoms.\n *\n * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n * happens when functions have higher precendence han infix\n * nodes in implicit parses.\n *\n * `breakOnTokenText`: The text of the token that the expression should end\n * with, or `null` if something else should end the\n * expression.\n */\n _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) {\n var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either\n // we reached the end, a }, or a \\right)\n\n while (true) {\n // Ignore spaces in math mode\n if (this.mode === \"math\") {\n this.consumeSpaces();\n }\n\n var lex = this.fetch();\n\n if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n break;\n }\n\n if (breakOnTokenText && lex.text === breakOnTokenText) {\n break;\n }\n\n if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) {\n break;\n }\n\n var atom = this.parseAtom(breakOnTokenText);\n\n if (!atom) {\n break;\n } else if (atom.type === \"internal\") {\n continue;\n }\n\n body.push(atom);\n }\n\n if (this.mode === \"text\") {\n this.formLigatures(body);\n }\n\n return this.handleInfixNodes(body);\n }\n /**\n * Rewrites infix operators such as \\over with corresponding commands such\n * as \\frac.\n *\n * There can only be one infix operator per group. If there's more than one\n * then the expression is ambiguous. This can be resolved by adding {}.\n */\n ;\n\n _proto.handleInfixNodes = function handleInfixNodes(body) {\n var overIndex = -1;\n var funcName;\n\n for (var i = 0; i < body.length; i++) {\n if (body[i].type === \"infix\") {\n if (overIndex !== -1) {\n throw new src_ParseError(\"only one infix operator per group\", body[i].token);\n }\n\n overIndex = i;\n funcName = body[i].replaceWith;\n }\n }\n\n if (overIndex !== -1 && funcName) {\n var numerNode;\n var denomNode;\n var numerBody = body.slice(0, overIndex);\n var denomBody = body.slice(overIndex + 1);\n\n if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n numerNode = numerBody[0];\n } else {\n numerNode = {\n type: \"ordgroup\",\n mode: this.mode,\n body: numerBody\n };\n }\n\n if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n denomNode = denomBody[0];\n } else {\n denomNode = {\n type: \"ordgroup\",\n mode: this.mode,\n body: denomBody\n };\n }\n\n var node;\n\n if (funcName === \"\\\\\\\\abovefrac\") {\n node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n } else {\n node = this.callFunction(funcName, [numerNode, denomNode], []);\n }\n\n return [node];\n } else {\n return body;\n }\n }\n /**\n * Handle a subscript or superscript with nice errors.\n */\n ;\n\n _proto.handleSupSubscript = function handleSupSubscript(name // For error reporting.\n ) {\n var symbolToken = this.fetch();\n var symbol = symbolToken.text;\n this.consume();\n this.consumeSpaces(); // ignore spaces before sup/subscript argument\n\n var group = this.parseGroup(name);\n\n if (!group) {\n throw new src_ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n }\n\n return group;\n }\n /**\n * Converts the textual input of an unsupported command into a text node\n * contained within a color node whose color is determined by errorColor\n */\n ;\n\n _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) {\n var textordArray = [];\n\n for (var i = 0; i < text.length; i++) {\n textordArray.push({\n type: \"textord\",\n mode: \"text\",\n text: text[i]\n });\n }\n\n var textNode = {\n type: \"text\",\n mode: this.mode,\n body: textordArray\n };\n var colorNode = {\n type: \"color\",\n mode: this.mode,\n color: this.settings.errorColor,\n body: [textNode]\n };\n return colorNode;\n }\n /**\n * Parses a group with optional super/subscripts.\n */\n ;\n\n _proto.parseAtom = function parseAtom(breakOnTokenText) {\n // The body of an atom is an implicit group, so that things like\n // \\left(x\\right)^2 work correctly.\n var base = this.parseGroup(\"atom\", breakOnTokenText); // In text mode, we don't have superscripts or subscripts\n\n if (this.mode === \"text\") {\n return base;\n } // Note that base may be empty (i.e. null) at this point.\n\n\n var superscript;\n var subscript;\n\n while (true) {\n // Guaranteed in math mode, so eat any spaces first.\n this.consumeSpaces(); // Lex the first token\n\n var lex = this.fetch();\n\n if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n // We got a limit control\n if (base && base.type === \"op\") {\n var limits = lex.text === \"\\\\limits\";\n base.limits = limits;\n base.alwaysHandleSupSub = true;\n } else if (base && base.type === \"operatorname\") {\n if (base.alwaysHandleSupSub) {\n base.limits = lex.text === \"\\\\limits\";\n }\n } else {\n throw new src_ParseError(\"Limit controls must follow a math operator\", lex);\n }\n\n this.consume();\n } else if (lex.text === \"^\") {\n // We got a superscript start\n if (superscript) {\n throw new src_ParseError(\"Double superscript\", lex);\n }\n\n superscript = this.handleSupSubscript(\"superscript\");\n } else if (lex.text === \"_\") {\n // We got a subscript start\n if (subscript) {\n throw new src_ParseError(\"Double subscript\", lex);\n }\n\n subscript = this.handleSupSubscript(\"subscript\");\n } else if (lex.text === \"'\") {\n // We got a prime\n if (superscript) {\n throw new src_ParseError(\"Double superscript\", lex);\n }\n\n var prime = {\n type: \"textord\",\n mode: this.mode,\n text: \"\\\\prime\"\n }; // Many primes can be grouped together, so we handle this here\n\n var primes = [prime];\n this.consume(); // Keep lexing tokens until we get something that's not a prime\n\n while (this.fetch().text === \"'\") {\n // For each one, add another prime to the list\n primes.push(prime);\n this.consume();\n } // If there's a superscript following the primes, combine that\n // superscript in with the primes.\n\n\n if (this.fetch().text === \"^\") {\n primes.push(this.handleSupSubscript(\"superscript\"));\n } // Put everything into an ordgroup as the superscript\n\n\n superscript = {\n type: \"ordgroup\",\n mode: this.mode,\n body: primes\n };\n } else if (uSubsAndSups[lex.text]) {\n // A Unicode subscript or superscript character.\n // We treat these similarly to the unicode-math package.\n // So we render a string of Unicode (sub|super)scripts the\n // same as a (sub|super)script of regular characters.\n var str = uSubsAndSups[lex.text];\n var isSub = unicodeSubRegEx.test(lex.text);\n this.consume(); // Continue fetching tokens to fill out the string.\n\n while (true) {\n var token = this.fetch().text;\n\n if (!uSubsAndSups[token]) {\n break;\n }\n\n if (unicodeSubRegEx.test(token) !== isSub) {\n break;\n }\n\n this.consume();\n str += uSubsAndSups[token];\n } // Now create a (sub|super)script.\n\n\n var body = new Parser(str, this.settings).parse();\n\n if (isSub) {\n subscript = {\n type: \"ordgroup\",\n mode: \"math\",\n body: body\n };\n } else {\n superscript = {\n type: \"ordgroup\",\n mode: \"math\",\n body: body\n };\n }\n } else {\n // If it wasn't ^, _, or ', stop parsing super/subscripts\n break;\n }\n } // Base must be set if superscript or subscript are set per logic above,\n // but need to check here for type check to pass.\n\n\n if (superscript || subscript) {\n // If we got either a superscript or subscript, create a supsub\n return {\n type: \"supsub\",\n mode: this.mode,\n base: base,\n sup: superscript,\n sub: subscript\n };\n } else {\n // Otherwise return the original body\n return base;\n }\n }\n /**\n * Parses an entire function, including its base and all of its arguments.\n */\n ;\n\n _proto.parseFunction = function parseFunction(breakOnTokenText, name // For determining its context\n ) {\n var token = this.fetch();\n var func = token.text;\n var funcData = src_functions[func];\n\n if (!funcData) {\n return null;\n }\n\n this.consume(); // consume command token\n\n if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n throw new src_ParseError(\"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"), token);\n } else if (this.mode === \"text\" && !funcData.allowedInText) {\n throw new src_ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n throw new src_ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n }\n\n var _this$parseArguments = this.parseArguments(func, funcData),\n args = _this$parseArguments.args,\n optArgs = _this$parseArguments.optArgs;\n\n return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n }\n /**\n * Call a function handler with a suitable context and arguments.\n */\n ;\n\n _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) {\n var context = {\n funcName: name,\n parser: this,\n token: token,\n breakOnTokenText: breakOnTokenText\n };\n var func = src_functions[name];\n\n if (func && func.handler) {\n return func.handler(context, args, optArgs);\n } else {\n throw new src_ParseError(\"No function handler for \" + name);\n }\n }\n /**\n * Parses the arguments of a function or environment\n */\n ;\n\n _proto.parseArguments = function parseArguments(func, // Should look like \"\\name\" or \"\\begin{name}\".\n funcData) {\n var totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n\n if (totalArgs === 0) {\n return {\n args: [],\n optArgs: []\n };\n }\n\n var args = [];\n var optArgs = [];\n\n for (var i = 0; i < totalArgs; i++) {\n var argType = funcData.argTypes && funcData.argTypes[i];\n var isOptional = i < funcData.numOptionalArgs;\n\n if (funcData.primitive && argType == null || // \\sqrt expands into primitive if optional argument doesn't exist\n funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null) {\n argType = \"primitive\";\n }\n\n var arg = this.parseGroupOfType(\"argument to '\" + func + \"'\", argType, isOptional);\n\n if (isOptional) {\n optArgs.push(arg);\n } else if (arg != null) {\n args.push(arg);\n } else {\n // should be unreachable\n throw new src_ParseError(\"Null argument, please report this as a bug\");\n }\n }\n\n return {\n args: args,\n optArgs: optArgs\n };\n }\n /**\n * Parses a group when the mode is changing.\n */\n ;\n\n _proto.parseGroupOfType = function parseGroupOfType(name, type, optional) {\n switch (type) {\n case \"color\":\n return this.parseColorGroup(optional);\n\n case \"size\":\n return this.parseSizeGroup(optional);\n\n case \"url\":\n return this.parseUrlGroup(optional);\n\n case \"math\":\n case \"text\":\n return this.parseArgumentGroup(optional, type);\n\n case \"hbox\":\n {\n // hbox argument type wraps the argument in the equivalent of\n // \\hbox, which is like \\text but switching to \\textstyle size.\n var group = this.parseArgumentGroup(optional, \"text\");\n return group != null ? {\n type: \"styling\",\n mode: group.mode,\n body: [group],\n style: \"text\" // simulate \\textstyle\n\n } : null;\n }\n\n case \"raw\":\n {\n var token = this.parseStringGroup(\"raw\", optional);\n return token != null ? {\n type: \"raw\",\n mode: \"text\",\n string: token.text\n } : null;\n }\n\n case \"primitive\":\n {\n if (optional) {\n throw new src_ParseError(\"A primitive argument cannot be optional\");\n }\n\n var _group = this.parseGroup(name);\n\n if (_group == null) {\n throw new src_ParseError(\"Expected group as \" + name, this.fetch());\n }\n\n return _group;\n }\n\n case \"original\":\n case null:\n case undefined:\n return this.parseArgumentGroup(optional);\n\n default:\n throw new src_ParseError(\"Unknown group type as \" + name, this.fetch());\n }\n }\n /**\n * Discard any space tokens, fetching the next non-space token.\n */\n ;\n\n _proto.consumeSpaces = function consumeSpaces() {\n while (this.fetch().text === \" \") {\n this.consume();\n }\n }\n /**\n * Parses a group, essentially returning the string formed by the\n * brace-enclosed tokens plus some position information.\n */\n ;\n\n _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages.\n optional) {\n var argToken = this.gullet.scanArgument(optional);\n\n if (argToken == null) {\n return null;\n }\n\n var str = \"\";\n var nextToken;\n\n while ((nextToken = this.fetch()).text !== \"EOF\") {\n str += nextToken.text;\n this.consume();\n }\n\n this.consume(); // consume the end of the argument\n\n argToken.text = str;\n return argToken;\n }\n /**\n * Parses a regex-delimited group: the largest sequence of tokens\n * whose concatenated strings match `regex`. Returns the string\n * formed by the tokens plus some position information.\n */\n ;\n\n _proto.parseRegexGroup = function parseRegexGroup(regex, modeName // Used to describe the mode in error messages.\n ) {\n var firstToken = this.fetch();\n var lastToken = firstToken;\n var str = \"\";\n var nextToken;\n\n while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n lastToken = nextToken;\n str += lastToken.text;\n this.consume();\n }\n\n if (str === \"\") {\n throw new src_ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n }\n\n return firstToken.range(lastToken, str);\n }\n /**\n * Parses a color description.\n */\n ;\n\n _proto.parseColorGroup = function parseColorGroup(optional) {\n var res = this.parseStringGroup(\"color\", optional);\n\n if (res == null) {\n return null;\n }\n\n var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);\n\n if (!match) {\n throw new src_ParseError(\"Invalid color: '\" + res.text + \"'\", res);\n }\n\n var color = match[0];\n\n if (/^[0-9a-f]{6}$/i.test(color)) {\n // We allow a 6-digit HTML color spec without a leading \"#\".\n // This follows the xcolor package's HTML color model.\n // Predefined color names are all missed by this RegEx pattern.\n color = \"#\" + color;\n }\n\n return {\n type: \"color-token\",\n mode: this.mode,\n color: color\n };\n }\n /**\n * Parses a size specification, consisting of magnitude and unit.\n */\n ;\n\n _proto.parseSizeGroup = function parseSizeGroup(optional) {\n var res;\n var isBlank = false; // don't expand before parseStringGroup\n\n this.gullet.consumeSpaces();\n\n if (!optional && this.gullet.future().text !== \"{\") {\n res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n } else {\n res = this.parseStringGroup(\"size\", optional);\n }\n\n if (!res) {\n return null;\n }\n\n if (!optional && res.text.length === 0) {\n // Because we've tested for what is !optional, this block won't\n // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n // to \\genfrac and \\above.\n res.text = \"0pt\"; // Enable \\above{}\n\n isBlank = true; // This is here specifically for \\genfrac\n }\n\n var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(res.text);\n\n if (!match) {\n throw new src_ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n }\n\n var data = {\n number: +(match[1] + match[2]),\n // sign + magnitude, cast to number\n unit: match[3]\n };\n\n if (!validUnit(data)) {\n throw new src_ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n }\n\n return {\n type: \"size\",\n mode: this.mode,\n value: data,\n isBlank: isBlank\n };\n }\n /**\n * Parses an URL, checking escaped letters and allowed protocols,\n * and setting the catcode of % as an active character (as in \\hyperref).\n */\n ;\n\n _proto.parseUrlGroup = function parseUrlGroup(optional) {\n this.gullet.lexer.setCatcode(\"%\", 13); // active character\n\n this.gullet.lexer.setCatcode(\"~\", 12); // other character\n\n var res = this.parseStringGroup(\"url\", optional);\n this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n\n this.gullet.lexer.setCatcode(\"~\", 13); // active character\n\n if (res == null) {\n return null;\n } // hyperref package allows backslashes alone in href, but doesn't\n // generate valid links in such cases; we interpret this as\n // \"undefined\" behaviour, and keep them as-is. Some browser will\n // replace backslashes with forward slashes.\n\n\n var url = res.text.replace(/\\\\([#$%&~_^{}])/g, '$1');\n return {\n type: \"url\",\n mode: this.mode,\n url: url\n };\n }\n /**\n * Parses an argument with the mode specified.\n */\n ;\n\n _proto.parseArgumentGroup = function parseArgumentGroup(optional, mode) {\n var argToken = this.gullet.scanArgument(optional);\n\n if (argToken == null) {\n return null;\n }\n\n var outerMode = this.mode;\n\n if (mode) {\n // Switch to specified mode\n this.switchMode(mode);\n }\n\n this.gullet.beginGroup();\n var expression = this.parseExpression(false, \"EOF\"); // TODO: find an alternative way to denote the end\n\n this.expect(\"EOF\"); // expect the end of the argument\n\n this.gullet.endGroup();\n var result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: argToken.loc,\n body: expression\n };\n\n if (mode) {\n // Switch mode back\n this.switchMode(outerMode);\n }\n\n return result;\n }\n /**\n * Parses an ordinary group, which is either a single nucleus (like \"x\")\n * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n * that starts at the current position, and ends right before a higher explicit\n * group ends, or at EOF.\n */\n ;\n\n _proto.parseGroup = function parseGroup(name, // For error reporting.\n breakOnTokenText) {\n var firstToken = this.fetch();\n var text = firstToken.text;\n var result; // Try to parse an open brace or \\begingroup\n\n if (text === \"{\" || text === \"\\\\begingroup\") {\n this.consume();\n var groupEnd = text === \"{\" ? \"}\" : \"\\\\endgroup\";\n this.gullet.beginGroup(); // If we get a brace, parse an expression\n\n var expression = this.parseExpression(false, groupEnd);\n var lastToken = this.fetch();\n this.expect(groupEnd); // Check that we got a matching closing brace\n\n this.gullet.endGroup();\n result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: SourceLocation.range(firstToken, lastToken),\n body: expression,\n // A group formed by \\begingroup...\\endgroup is a semi-simple group\n // which doesn't affect spacing in math mode, i.e., is transparent.\n // https://tex.stackexchange.com/questions/1930/when-should-one-\n // use-begingroup-instead-of-bgroup\n semisimple: text === \"\\\\begingroup\" || undefined\n };\n } else {\n // If there exists a function with this name, parse the function.\n // Otherwise, just return a nucleus\n result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n\n if (result == null && text[0] === \"\\\\\" && !implicitCommands.hasOwnProperty(text)) {\n if (this.settings.throwOnError) {\n throw new src_ParseError(\"Undefined control sequence: \" + text, firstToken);\n }\n\n result = this.formatUnsupportedCmd(text);\n this.consume();\n }\n }\n\n return result;\n }\n /**\n * Form ligature-like combinations of characters for text mode.\n * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n * The result will simply replace multiple textord nodes with a single\n * character in each value by a single textord node having multiple\n * characters in its value. The representation is still ASCII source.\n * The group will be modified in place.\n */\n ;\n\n _proto.formLigatures = function formLigatures(group) {\n var n = group.length - 1;\n\n for (var i = 0; i < n; ++i) {\n var a = group[i]; // $FlowFixMe: Not every node type has a `text` property.\n\n var v = a.text;\n\n if (v === \"-\" && group[i + 1].text === \"-\") {\n if (i + 1 < n && group[i + 2].text === \"-\") {\n group.splice(i, 3, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 2]),\n text: \"---\"\n });\n n -= 2;\n } else {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: \"--\"\n });\n n -= 1;\n }\n }\n\n if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: v + v\n });\n n -= 1;\n }\n }\n }\n /**\n * Parse a single symbol out of the string. Here, we handle single character\n * symbols and special functions like \\verb.\n */\n ;\n\n _proto.parseSymbol = function parseSymbol() {\n var nucleus = this.fetch();\n var text = nucleus.text;\n\n if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n this.consume();\n var arg = text.slice(5);\n var star = arg.charAt(0) === \"*\";\n\n if (star) {\n arg = arg.slice(1);\n } // Lexer's tokenRegex is constructed to always have matching\n // first/last characters.\n\n\n if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n throw new src_ParseError(\"\\\\verb assertion failed --\\n please report what input caused this bug\");\n }\n\n arg = arg.slice(1, -1); // remove first and last char\n\n return {\n type: \"verb\",\n mode: \"text\",\n body: arg,\n star: star\n };\n } // At this point, we should have a symbol, possibly with accents.\n // First expand any accented base symbol according to unicodeSymbols.\n\n\n if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) {\n // This behavior is not strict (XeTeX-compatible) in math mode.\n if (this.settings.strict && this.mode === \"math\") {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Accented Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n }\n\n text = unicodeSymbols[text[0]] + text.slice(1);\n } // Strip off any combining characters\n\n\n var match = combiningDiacriticalMarksEndRegex.exec(text);\n\n if (match) {\n text = text.substring(0, match.index);\n\n if (text === 'i') {\n text = \"\\u0131\"; // dotless i, in math and text mode\n } else if (text === 'j') {\n text = \"\\u0237\"; // dotless j, in math and text mode\n }\n } // Recognize base symbol\n\n\n var symbol;\n\n if (src_symbols[this.mode][text]) {\n if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Latin-1/Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n }\n\n var group = src_symbols[this.mode][text].group;\n var loc = SourceLocation.range(nucleus);\n var s;\n\n if (ATOMS.hasOwnProperty(group)) {\n // $FlowFixMe\n var family = group;\n s = {\n type: \"atom\",\n mode: this.mode,\n family: family,\n loc: loc,\n text: text\n };\n } else {\n // $FlowFixMe\n s = {\n type: group,\n mode: this.mode,\n loc: loc,\n text: text\n };\n } // $FlowFixMe\n\n\n symbol = s;\n } else if (text.charCodeAt(0) >= 0x80) {\n // no symbol for e.g. ^\n if (this.settings.strict) {\n if (!supportedCodepoint(text.charCodeAt(0))) {\n this.settings.reportNonstrict(\"unknownSymbol\", \"Unrecognized Unicode character \\\"\" + text[0] + \"\\\"\" + (\" (\" + text.charCodeAt(0) + \")\"), nucleus);\n } else if (this.mode === \"math\") {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Unicode text character \\\"\" + text[0] + \"\\\" used in math mode\", nucleus);\n }\n } // All nonmathematical Unicode characters are rendered as if they\n // are in text mode (wrapped in \\text) because that's what it\n // takes to render them in LaTeX. Setting `mode: this.mode` is\n // another natural choice (the user requested math mode), but\n // this makes it more difficult for getCharacterMetrics() to\n // distinguish Unicode characters without metrics and those for\n // which we want to simulate the letter M.\n\n\n symbol = {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(nucleus),\n text: text\n };\n } else {\n return null; // EOF, ^, _, {, }, etc.\n }\n\n this.consume(); // Transform combining characters into accents\n\n if (match) {\n for (var i = 0; i < match[0].length; i++) {\n var accent = match[0][i];\n\n if (!unicodeAccents[accent]) {\n throw new src_ParseError(\"Unknown accent ' \" + accent + \"'\", nucleus);\n }\n\n var command = unicodeAccents[accent][this.mode] || unicodeAccents[accent].text;\n\n if (!command) {\n throw new src_ParseError(\"Accent \" + accent + \" unsupported in \" + this.mode + \" mode\", nucleus);\n }\n\n symbol = {\n type: \"accent\",\n mode: this.mode,\n loc: SourceLocation.range(nucleus),\n label: command,\n isStretchy: false,\n isShifty: true,\n // $FlowFixMe\n base: symbol\n };\n }\n } // $FlowFixMe\n\n\n return symbol;\n };\n\n return Parser;\n}();\n\nParser.endOfExpression = [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"&\"];\n\n;// CONCATENATED MODULE: ./src/parseTree.js\n/**\n * Provides a single function for parsing an expression using a Parser\n * TODO(emily): Remove this\n */\n\n\n\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nvar parseTree = function parseTree(toParse, settings) {\n if (!(typeof toParse === 'string' || toParse instanceof String)) {\n throw new TypeError('KaTeX can only parse string typed expression');\n }\n\n var parser = new Parser(toParse, settings); // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n var tree = parser.parse(); // Prevent a color definition from persisting between calls to katex.render().\n\n delete parser.gullet.macros.current[\"\\\\current@color\"];\n delete parser.gullet.macros.current[\"\\\\color\"]; // If the input used \\tag, it will set the \\df@tag macro to the tag.\n // In this case, we separately parse the tag and wrap the tree.\n\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n if (!settings.displayMode) {\n throw new src_ParseError(\"\\\\tag works only in display equations\");\n }\n\n tree = [{\n type: \"tag\",\n mode: \"text\",\n body: tree,\n tag: parser.subparse([new Token(\"\\\\df@tag\")])\n }];\n }\n\n return tree;\n};\n\n/* harmony default export */ var src_parseTree = (parseTree);\n;// CONCATENATED MODULE: ./katex.js\n/* eslint no-console:0 */\n\n/**\n * This is the main entry point for KaTeX. Here, we expose functions for\n * rendering expressions either to DOM nodes or to markup strings.\n *\n * We also expose the ParseError class to check if errors thrown from KaTeX are\n * errors in the expression, or errors in javascript handling.\n */\n\n\n\n\n\n\n\n\n\n\n/**\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nvar render = function render(expression, baseNode, options) {\n baseNode.textContent = \"\";\n var node = renderToDomTree(expression, options).toNode();\n baseNode.appendChild(node);\n}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\n\n\nif (typeof document !== \"undefined\") {\n if (document.compatMode !== \"CSS1Compat\") {\n typeof console !== \"undefined\" && console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your \" + \"website has a suitable doctype.\");\n\n render = function render() {\n throw new src_ParseError(\"KaTeX doesn't work in quirks mode.\");\n };\n }\n}\n/**\n * Parse and build an expression, and return the markup for that.\n */\n\n\nvar renderToString = function renderToString(expression, options) {\n var markup = renderToDomTree(expression, options).toMarkup();\n return markup;\n};\n/**\n * Parse an expression and return the parse tree.\n */\n\n\nvar generateParseTree = function generateParseTree(expression, options) {\n var settings = new Settings(options);\n return src_parseTree(expression, settings);\n};\n/**\n * If the given error is a KaTeX ParseError and options.throwOnError is false,\n * renders the invalid LaTeX as a span with hover title giving the KaTeX\n * error message. Otherwise, simply throws the error.\n */\n\n\nvar renderError = function renderError(error, expression, options) {\n if (options.throwOnError || !(error instanceof src_ParseError)) {\n throw error;\n }\n\n var node = buildCommon.makeSpan([\"katex-error\"], [new SymbolNode(expression)]);\n node.setAttribute(\"title\", error.toString());\n node.setAttribute(\"style\", \"color:\" + options.errorColor);\n return node;\n};\n/**\n * Generates and returns the katex build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\n\n\nvar renderToDomTree = function renderToDomTree(expression, options) {\n var settings = new Settings(options);\n\n try {\n var tree = src_parseTree(expression, settings);\n return buildTree(tree, expression, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n/**\n * Generates and returns the katex build tree, with just HTML (no MathML).\n * This is used for advanced use cases (like rendering to custom output).\n */\n\n\nvar renderToHTMLTree = function renderToHTMLTree(expression, options) {\n var settings = new Settings(options);\n\n try {\n var tree = src_parseTree(expression, settings);\n return buildHTMLTree(tree, expression, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n\n/* harmony default export */ var katex = ({\n /**\n * Current KaTeX version\n */\n version: \"0.16.4\",\n\n /**\n * Renders the given LaTeX into an HTML+MathML combination, and adds\n * it as a child to the specified DOM node.\n */\n render: render,\n\n /**\n * Renders the given LaTeX into an HTML+MathML combination string,\n * for sending to the client.\n */\n renderToString: renderToString,\n\n /**\n * KaTeX error, usually during parsing.\n */\n ParseError: src_ParseError,\n\n /**\n * The shema of Settings\n */\n SETTINGS_SCHEMA: SETTINGS_SCHEMA,\n\n /**\n * Parses the given LaTeX into KaTeX's internal parse tree structure,\n * without rendering to HTML or MathML.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __parse: generateParseTree,\n\n /**\n * Renders the given LaTeX into an HTML+MathML internal DOM tree\n * representation, without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToDomTree: renderToDomTree,\n\n /**\n * Renders the given LaTeX into an HTML internal DOM tree representation,\n * without MathML and without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToHTMLTree: renderToHTMLTree,\n\n /**\n * extends internal font metrics object with a new object\n * each key in the new object represents a font name\n */\n __setFontMetrics: setFontMetrics,\n\n /**\n * adds a new symbol to builtin symbols table\n */\n __defineSymbol: defineSymbol,\n\n /**\n * adds a new macro to builtin macro list\n */\n __defineMacro: defineMacro,\n\n /**\n * Expose the dom tree node types, which can be useful for type checking nodes.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __domTree: {\n Span: Span,\n Anchor: Anchor,\n SymbolNode: SymbolNode,\n SvgNode: SvgNode,\n PathNode: PathNode,\n LineNode: LineNode\n }\n});\n;// CONCATENATED MODULE: ./katex.webpack.js\n/**\n * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2]\n * doesn't support CSS modules natively, a separate entry point is used and\n * it is not flowtyped.\n *\n * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef\n * [2] https://facebook.github.io/jest/docs/en/webpack.html\n */\n\n\n/* harmony default export */ var katex_webpack = (katex);\n__webpack_exports__ = __webpack_exports__[\"default\"];\n/******/ \treturn __webpack_exports__;\n/******/ })()\n;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMva2F0ZXgvZGlzdC9rYXRleC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBLElBQUksSUFBeUQ7QUFDN0Q7QUFDQSxNQUFNLEVBS3NCO0FBQzVCLENBQUM7QUFDRCw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLGNBQWMsOEJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUFtQjtBQUM5QjtBQUNBLGdCQUFnQiw4QkFBbUIsd0JBQXdCLDhCQUFtQjtBQUM5RSxvREFBb0Qsd0NBQXdDO0FBQzVGO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUFtQiwyQkFBMkI7QUFDekQsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUFtQjtBQUNuQiwwQkFBMEI7QUFDMUIsQ0FBQzs7QUFFRCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07OztBQUdOLDBFQUEwRTs7QUFFMUU7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQSw0QkFBNEI7O0FBRTVCLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaLFlBQVk7QUFDWixlQUFlO0FBQ2YsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0Esd0dBQXdHLE1BQU07QUFDOUc7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLE9BQU8sTUFBTTtBQUMxRjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7O0FBR0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLElBQUk7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWIsaU5BQWlOOztBQUVqTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFD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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUSxZQUFZLFFBQVEsT0FBTyxTQUFTO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE9BQU87QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsOENBQThDOztBQUU5Qyw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakIsa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHlFQUF5RTs7QUFFekU7O0FBRUE7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7O0FBRW5EO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7O0FBRXRFLHlEQUF5RDs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEOztBQUV6RDtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTs7QUFFbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDs7QUFFekQ7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FOztBQUVuRTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7O0FBRUEsa0VBQWtFOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEOztBQUUzRCw0REFBNEQ7O0FBRTVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsK0NBQStDLGVBQWU7O0FBRXBIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsS0FBSztBQUN2QztBQUNBO0FB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OztBQUVBLGtCQUFrQix5QkFBeUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEMsa0NBQWtDOztBQUVsQztBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQSwwRkFBMEY7OztBQUcxRjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiwwQkFBMEI7QUFDNUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDOztBQUVBOztBQUVBOztBQUVBLG9CQUFvQix3QkFBd0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsNkJBQTZCO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsa0JBQWtCLHFCQUFxQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix1QkFBdUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0Msc0RBQXNEO0FBQ3JHOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsYUFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILFVBQVU7QUFDVixVQUFVO0FBQ1YsV0FBVztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0I7QUFDbEIsUUFBUTtBQUNSOztBQUVBOztBQUVBLGtCQUFrQjtBQUNsQixRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTs7QUFFbkU7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7OztBQVFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHLENBQVM7QUFDM0csQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUEsc0JBQXNCLG9CQUFvQjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFD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OztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7OztBQU9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGdFQUFnRTs7QUFFaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7Ozs7O0FBU0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQSx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQztBQUNEOzs7OztBQUtBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0IsNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBLHFDQUFxQztBQUNyQztBQUNBLFVBQVU7QUFDVixxQ0FBcUM7OztBQUdyQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU0sbUNBQW1DLFFBQVE7OztBQUdqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdKQUFnSjtBQUNoSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGFBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQiw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7OztBQUdKLHNFQUFzRTtBQUN0RTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsOEVBQThFOztBQUU5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRyxZQUFZLE9BQU8sT0FBTztBQUN4QztBQUNBLG1GQUFtRjtBQUNuRjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7Ozs7Ozs7OztBQVdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLG1CQUFtQjs7QUFFN0c7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsR0FBRztBQUNIO0FB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Q0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUFHRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0EsR0FBRztBQUNILCtDQUErQztBQUMvQztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjOztBQUVkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVSxJQUFJO0FBQzVCO0FBQ0EsVUFBVTtBQUNWLGNBQWMsT0FBTztBQUNyQiw2RkFBNkYsT0FBTztBQUNwRztBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDLHNCQUFzQjtBQUN0Qix1QkFBdUIsMkJBQTJCO0FBQ2xELDRCQUE0QjtBQUM1Qix5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7OztBQUdKLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQSxtQkFBbUIsWUFBWTtBQUMvQixvREFBb0QsWUFBWTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsR0FBRyxzQkFBc0I7QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QyxzQ0FBc0M7O0FBRXRDLHVCQUF1Qjs7QUFFdkI7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQSxjQUFjLHVCQUF1QjtBQUNyQztBQUNBLGdDQUFnQzs7QUFFaEMsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZ0JBQWdCLGtCQUFrQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEMsc0JBQXNCOztBQUV0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBOztBQUVBLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsWUFBWSxHQUFHO0FBQ2hFO0FBQ0EsaURBQWlEO0FBQ2pEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLFdBQVc7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBOztBQUVBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsY0FBYztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7O0FBRUEsb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxJQUFJLFFBQVEsT0FBTyxPQUFPO0FBQzFCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE9BQU87QUFDN0I7QUFDQTtBQUNBLEtBQUssb0NBQW9DOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSxnRkFBZ0Y7O0FBRWhGO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQU07QUFDTixHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG1CQUFtQixVQUFVLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsSUFBSSxVQUFVOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsaUNBQWlDLFVBQVU7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLFVBQVU7QUFDM0M7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKLHFCQUFxQixJQUFJO0FBQ3pCLFVBQVUsT0FBTyxPQUFPLEdBQUcsR0FBRyxNQUFNLE1BQU0sT0FBTyxNQUFNO0FBQ3ZELElBQUksUUFBUSxNQUFNLE9BQU87QUFDekI7QUFDQSxJQUFJLFFBQVE7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFELHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNELDBDQUEwQyxFQUFFO0FBQzVDLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7QUFFRDtBQUNBLG9FQUFvRTs7O0FBR3BFLENBQUM7Ozs7QUFJRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTs7QUFFQSxpRUFBaUUsZ0JBQWdCO0FBQ2pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0RBQW9ELGlCQUFpQixpQkFBaUIsaUJBQWlCO0FBQ3ZHLFFBQVE7OztBQUdSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQztBQUNEOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0Esb0VBQW9FOztBQUVwRTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0MsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQSxZQUFZLE1BQU0sT0FBTyxLQUFLLE9BQU8sR0FBRyxHQUFHO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7Ozs7O0FBT0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBCQUEwQixpQkFBaUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7Ozs7Ozs7O0FBUUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSix3REFBd0QsRUFBRTs7QUFFMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkU7O0FBRUEsc0JBQXNCLHVCQUF1QjtBQUM3Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7QUFDRDs7Ozs7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDO0FBQ0Q7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyRUFBMkU7O0FBRTNFO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELENBQUM7Ozs7Ozs7QUFPRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7OztBQUlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0osdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7Ozs7QUFZQTtBQUNBLGtDQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esb0VBQW9FLGdDQUFnQztBQUNwRzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQyxHQUFHLG9DQUFvQztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7Ozs7Ozs7OztBQVVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FB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Q0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQzs7OztBQUlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRCxDQUFDOzs7O0FBSUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULFdBQVc7QUFDWDtBQUNBO0FBQ0EsR0FBRztBQUNILGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFB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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQztBQUNEOzs7Ozs7Ozs7OztBQVdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOzs7QUFHQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjs7QUFFcEI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtGQUErRixLQUFLO0FBQ3BHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjs7QUFFcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLEVBQUUsWUFBWSxFQUFFOztBQUU3QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsbUJBQW1CLEVBQUU7QUFDckI7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9WdWV4eS8uL25vZGVfbW9kdWxlcy9rYXRleC9kaXN0L2thdGV4LmpzPzNiMmYiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wia2F0ZXhcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wia2F0ZXhcIl0gPSBmYWN0b3J5KCk7XG59KSgodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMpLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIHNjb3BlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzICovXG4vKioqKioqLyBcdCFmdW5jdGlvbigpIHtcbi8qKioqKiovIFx0XHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuLyoqKioqKi8gXHRcdFx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuLyoqKioqKi8gXHRcdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0fSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqL1xuLyoqKioqKi8gXHQhZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfVxuLyoqKioqKi8gXHR9KCk7XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0ge307XG5cbi8vIEVYUE9SVFNcbl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbigpIHsgcmV0dXJuIC8qIGJpbmRpbmcgKi8ga2F0ZXhfd2VicGFjazsgfVxufSk7XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9QYXJzZUVycm9yLmpzXG5cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBQYXJzZUVycm9yIGNsYXNzLCB3aGljaCBpcyB0aGUgbWFpbiBlcnJvciB0aHJvd24gYnkgS2FUZVhcbiAqIGZ1bmN0aW9ucyB3aGVuIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4gVGhpcyBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGludGVybmFsXG4gKiBlcnJvcnMgZnJvbSBlcnJvcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgdXNlciBwcm92aWRlZC5cbiAqXG4gKiBJZiBwb3NzaWJsZSwgYSBjYWxsZXIgc2hvdWxkIHByb3ZpZGUgYSBUb2tlbiBvciBQYXJzZU5vZGUgd2l0aCBpbmZvcm1hdGlvblxuICogYWJvdXQgd2hlcmUgaW4gdGhlIHNvdXJjZSBzdHJpbmcgdGhlIHByb2JsZW0gb2NjdXJyZWQuXG4gKi9cbnZhciBQYXJzZUVycm9yID0gLy8gRXJyb3IgcG9zaXRpb24gYmFzZWQgb24gcGFzc2VkLWluIFRva2VuIG9yIFBhcnNlTm9kZS5cbmZ1bmN0aW9uIFBhcnNlRXJyb3IobWVzc2FnZSwgLy8gVGhlIGVycm9yIG1lc3NhZ2VcbnRva2VuIC8vIEFuIG9iamVjdCBwcm92aWRpbmcgcG9zaXRpb24gaW5mb3JtYXRpb25cbikge1xuICB0aGlzLnBvc2l0aW9uID0gdm9pZCAwO1xuICB2YXIgZXJyb3IgPSBcIkthVGVYIHBhcnNlIGVycm9yOiBcIiArIG1lc3NhZ2U7XG4gIHZhciBzdGFydDtcbiAgdmFyIGxvYyA9IHRva2VuICYmIHRva2VuLmxvYztcblxuICBpZiAobG9jICYmIGxvYy5zdGFydCA8PSBsb2MuZW5kKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSB0aGUgaW5wdXQgYW5kIGEgcG9zaXRpb24sIG1ha2UgdGhlIGVycm9yIGEgYml0IGZhbmNpZXJcbiAgICAvLyBHZXQgdGhlIGlucHV0XG4gICAgdmFyIGlucHV0ID0gbG9jLmxleGVyLmlucHV0OyAvLyBQcmVwZW5kIHNvbWUgaW5mb3JtYXRpb25cblxuICAgIHN0YXJ0ID0gbG9jLnN0YXJ0O1xuICAgIHZhciBlbmQgPSBsb2MuZW5kO1xuXG4gICAgaWYgKHN0YXJ0ID09PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIGVycm9yICs9IFwiIGF0IGVuZCBvZiBpbnB1dDogXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yICs9IFwiIGF0IHBvc2l0aW9uIFwiICsgKHN0YXJ0ICsgMSkgKyBcIjogXCI7XG4gICAgfSAvLyBVbmRlcmxpbmUgdG9rZW4gaW4gcXVlc3Rpb24gdXNpbmcgY29tYmluaW5nIHVuZGVyc2NvcmVzXG5cblxuICAgIHZhciB1bmRlcmxpbmVkID0gaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZSgvW15dL2csIFwiJCZcXHUwMzMyXCIpOyAvLyBFeHRyYWN0IHNvbWUgY29udGV4dCBmcm9tIHRoZSBpbnB1dCBhbmQgYWRkIGl0IHRvIHRoZSBlcnJvclxuXG4gICAgdmFyIGxlZnQ7XG5cbiAgICBpZiAoc3RhcnQgPiAxNSkge1xuICAgICAgbGVmdCA9IFwi4oCmXCIgKyBpbnB1dC5zbGljZShzdGFydCAtIDE1LCBzdGFydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSBpbnB1dC5zbGljZSgwLCBzdGFydCk7XG4gICAgfVxuXG4gICAgdmFyIHJpZ2h0O1xuXG4gICAgaWYgKGVuZCArIDE1IDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICByaWdodCA9IGlucHV0LnNsaWNlKGVuZCwgZW5kICsgMTUpICsgXCLigKZcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmlnaHQgPSBpbnB1dC5zbGljZShlbmQpO1xuICAgIH1cblxuICAgIGVycm9yICs9IGxlZnQgKyB1bmRlcmxpbmVkICsgcmlnaHQ7XG4gIH0gLy8gU29tZSBoYWNrZXJ5IHRvIG1ha2UgUGFyc2VFcnJvciBhIHByb3RvdHlwZSBvZiBFcnJvclxuICAvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvODQ2MDc1M1xuXG5cbiAgdmFyIHNlbGYgPSBuZXcgRXJyb3IoZXJyb3IpO1xuICBzZWxmLm5hbWUgPSBcIlBhcnNlRXJyb3JcIjsgLy8gJEZsb3dGaXhNZVxuXG4gIHNlbGYuX19wcm90b19fID0gUGFyc2VFcnJvci5wcm90b3R5cGU7IC8vICRGbG93Rml4TWVcblxuICBzZWxmLnBvc2l0aW9uID0gc3RhcnQ7XG4gIHJldHVybiBzZWxmO1xufTsgLy8gJEZsb3dGaXhNZSBNb3JlIGhhY2tlcnlcblxuXG5QYXJzZUVycm9yLnByb3RvdHlwZS5fX3Byb3RvX18gPSBFcnJvci5wcm90b3R5cGU7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfUGFyc2VFcnJvciA9IChQYXJzZUVycm9yKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy91dGlscy5qc1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VmdWwgaW4gb3RoZXJcbiAqIGZpbGVzLlxuICovXG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBjb250YWluZWQgaW4gYSBsaXN0XG4gKi9cbnZhciBjb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGxpc3QsIGVsZW0pIHtcbiAgcmV0dXJuIGxpc3QuaW5kZXhPZihlbGVtKSAhPT0gLTE7XG59O1xuLyoqXG4gKiBQcm92aWRlIGEgZGVmYXVsdCB2YWx1ZSBpZiBhIHNldHRpbmcgaXMgdW5kZWZpbmVkXG4gKiBOT1RFOiBDb3VsZG4ndCB1c2UgYFRgIGFzIHRoZSBvdXRwdXQgdHlwZSBkdWUgdG8gZmFjZWJvb2svZmxvdyM1MDIyLlxuICovXG5cblxudmFyIGRlZmx0ID0gZnVuY3Rpb24gZGVmbHQoc2V0dGluZywgZGVmYXVsdElmVW5kZWZpbmVkKSB7XG4gIHJldHVybiBzZXR0aW5nID09PSB1bmRlZmluZWQgPyBkZWZhdWx0SWZVbmRlZmluZWQgOiBzZXR0aW5nO1xufTsgLy8gaHlwaGVuYXRlIGFuZCBlc2NhcGUgYWRhcHRlZCBmcm9tIEZhY2Vib29rJ3MgUmVhY3QgdW5kZXIgQXBhY2hlIDIgbGljZW5zZVxuXG5cbnZhciB1cHBlcmNhc2UgPSAvKFtBLVpdKS9nO1xuXG52YXIgaHlwaGVuYXRlID0gZnVuY3Rpb24gaHlwaGVuYXRlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UodXBwZXJjYXNlLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIEVTQ0FQRV9MT09LVVAgPSB7XG4gIFwiJlwiOiBcIiZhbXA7XCIsXG4gIFwiPlwiOiBcIiZndDtcIixcbiAgXCI8XCI6IFwiJmx0O1wiLFxuICBcIlxcXCJcIjogXCImcXVvdDtcIixcbiAgXCInXCI6IFwiJiN4Mjc7XCJcbn07XG52YXIgRVNDQVBFX1JFR0VYID0gL1smPjxcIiddL2c7XG4vKipcbiAqIEVzY2FwZXMgdGV4dCB0byBwcmV2ZW50IHNjcmlwdGluZyBhdHRhY2tzLlxuICovXG5cbmZ1bmN0aW9uIHV0aWxzX2VzY2FwZSh0ZXh0KSB7XG4gIHJldHVybiBTdHJpbmcodGV4dCkucmVwbGFjZShFU0NBUEVfUkVHRVgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBFU0NBUEVfTE9PS1VQW21hdGNoXTtcbiAgfSk7XG59XG4vKipcbiAqIFNvbWV0aW1lcyB3ZSB3YW50IHRvIHB1bGwgb3V0IHRoZSBpbm5lcm1vc3QgZWxlbWVudCBvZiBhIGdyb3VwLiBJbiBtb3N0XG4gKiBjYXNlcywgdGhpcyB3aWxsIGp1c3QgYmUgdGhlIGdyb3VwIGl0c2VsZiwgYnV0IHdoZW4gb3JkZ3JvdXBzIGFuZCBjb2xvcnMgaGF2ZVxuICogYSBzaW5nbGUgZWxlbWVudCwgd2Ugd2FudCB0byBwdWxsIHRoYXQgb3V0LlxuICovXG5cblxudmFyIGdldEJhc2VFbGVtID0gZnVuY3Rpb24gZ2V0QmFzZUVsZW0oZ3JvdXApIHtcbiAgaWYgKGdyb3VwLnR5cGUgPT09IFwib3JkZ3JvdXBcIikge1xuICAgIGlmIChncm91cC5ib2R5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEJhc2VFbGVtKGdyb3VwLmJvZHlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiY29sb3JcIikge1xuICAgIGlmIChncm91cC5ib2R5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEJhc2VFbGVtKGdyb3VwLmJvZHlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ3JvdXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiZm9udFwiKSB7XG4gICAgcmV0dXJuIGdldEJhc2VFbGVtKGdyb3VwLmJvZHkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBncm91cDtcbiAgfVxufTtcbi8qKlxuICogVGVYYm9vayBhbGdvcml0aG1zIG9mdGVuIHJlZmVyZW5jZSBcImNoYXJhY3RlciBib3hlc1wiLCB3aGljaCBhcmUgc2ltcGx5IGdyb3Vwc1xuICogd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgaW4gdGhlbS4gVG8gZGVjaWRlIGlmIHNvbWV0aGluZyBpcyBhIGNoYXJhY3RlciBib3gsXG4gKiB3ZSBmaW5kIGl0cyBpbm5lcm1vc3QgZ3JvdXAsIGFuZCBzZWUgaWYgaXQgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLlxuICovXG5cblxudmFyIGlzQ2hhcmFjdGVyQm94ID0gZnVuY3Rpb24gaXNDaGFyYWN0ZXJCb3goZ3JvdXApIHtcbiAgdmFyIGJhc2VFbGVtID0gZ2V0QmFzZUVsZW0oZ3JvdXApOyAvLyBUaGVzZSBhcmUgYWxsIHRoZXkgdHlwZXMgb2YgZ3JvdXBzIHdoaWNoIGhvbGQgc2luZ2xlIGNoYXJhY3RlcnNcblxuICByZXR1cm4gYmFzZUVsZW0udHlwZSA9PT0gXCJtYXRob3JkXCIgfHwgYmFzZUVsZW0udHlwZSA9PT0gXCJ0ZXh0b3JkXCIgfHwgYmFzZUVsZW0udHlwZSA9PT0gXCJhdG9tXCI7XG59O1xuXG52YXIgYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vbi1udWxsLCBidXQgZ290ICcgKyBTdHJpbmcodmFsdWUpKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG4vKipcbiAqIFJldHVybiB0aGUgcHJvdG9jb2wgb2YgYSBVUkwsIG9yIFwiX3JlbGF0aXZlXCIgaWYgdGhlIFVSTCBkb2VzIG5vdCBzcGVjaWZ5IGFcbiAqIHByb3RvY29sIChhbmQgdGh1cyBpcyByZWxhdGl2ZSkuXG4gKi9cblxudmFyIHByb3RvY29sRnJvbVVybCA9IGZ1bmN0aW9uIHByb3RvY29sRnJvbVVybCh1cmwpIHtcbiAgdmFyIHByb3RvY29sID0gL15cXHMqKFteXFxcXC8jXSo/KSg/Ojp8JiMwKjU4fCYjeDAqM2EpL2kuZXhlYyh1cmwpO1xuICByZXR1cm4gcHJvdG9jb2wgIT0gbnVsbCA/IHByb3RvY29sWzFdIDogXCJfcmVsYXRpdmVcIjtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciB1dGlscyA9ICh7XG4gIGNvbnRhaW5zOiBjb250YWlucyxcbiAgZGVmbHQ6IGRlZmx0LFxuICBlc2NhcGU6IHV0aWxzX2VzY2FwZSxcbiAgaHlwaGVuYXRlOiBoeXBoZW5hdGUsXG4gIGdldEJhc2VFbGVtOiBnZXRCYXNlRWxlbSxcbiAgaXNDaGFyYWN0ZXJCb3g6IGlzQ2hhcmFjdGVyQm94LFxuICBwcm90b2NvbEZyb21Vcmw6IHByb3RvY29sRnJvbVVybFxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvU2V0dGluZ3MuanNcbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgbW9kdWxlIGZvciBzdG9yaW5nIHNldHRpbmdzIHBhc3NlZCBpbnRvIEthVGVYLiBJdCBjb3JyZWN0bHkgaGFuZGxlc1xuICogZGVmYXVsdCBzZXR0aW5ncy5cbiAqL1xuXG5cblxuLy8gVE9ETzogYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uXG4vLyBUT0RPOiBjaGVjayBhbGwgcHJvcGVydGllcyBvbiBTZXR0aW5ncyBleGlzdFxuLy8gVE9ETzogY2hlY2sgdGhlIHR5cGUgb2YgYSBwcm9wZXJ0eSBvbiBTZXR0aW5ncyBtYXRjaGVzXG52YXIgU0VUVElOR1NfU0NIRU1BID0ge1xuICBkaXNwbGF5TW9kZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbmRlciBtYXRoIGluIGRpc3BsYXkgbW9kZSwgd2hpY2ggcHV0cyB0aGUgbWF0aCBpbiBcIiArIFwiZGlzcGxheSBzdHlsZSAoc28gXFxcXGludCBhbmQgXFxcXHN1bSBhcmUgbGFyZ2UsIGZvciBleGFtcGxlKSwgYW5kIFwiICsgXCJjZW50ZXJzIHRoZSBtYXRoIG9uIHRoZSBwYWdlIG9uIGl0cyBvd24gbGluZS5cIixcbiAgICBjbGk6IFwiLWQsIC0tZGlzcGxheS1tb2RlXCJcbiAgfSxcbiAgb3V0cHV0OiB7XG4gICAgdHlwZToge1xuICAgICAgZW51bTogW1wiaHRtbEFuZE1hdGhtbFwiLCBcImh0bWxcIiwgXCJtYXRobWxcIl1cbiAgICB9LFxuICAgIGRlc2NyaXB0aW9uOiBcIkRldGVybWluZXMgdGhlIG1hcmt1cCBsYW5ndWFnZSBvZiB0aGUgb3V0cHV0LlwiLFxuICAgIGNsaTogXCItRiwgLS1mb3JtYXQgPHR5cGU+XCJcbiAgfSxcbiAgbGVxbm86IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZW5kZXIgZGlzcGxheSBtYXRoIGluIGxlcW5vIHN0eWxlIChsZWZ0LWp1c3RpZmllZCB0YWdzKS5cIlxuICB9LFxuICBmbGVxbjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbmRlciBkaXNwbGF5IG1hdGggZmx1c2ggbGVmdC5cIlxuICB9LFxuICB0aHJvd09uRXJyb3I6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIGNsaTogXCItdCwgLS1uby10aHJvdy1vbi1lcnJvclwiLFxuICAgIGNsaURlc2NyaXB0aW9uOiBcIlJlbmRlciBlcnJvcnMgKGluIHRoZSBjb2xvciBnaXZlbiBieSAtLWVycm9yLWNvbG9yKSBpbnNcIiArIFwidGVhZCBvZiB0aHJvd2luZyBhIFBhcnNlRXJyb3IgZXhjZXB0aW9uIHdoZW4gZW5jb3VudGVyaW5nIGFuIGVycm9yLlwiXG4gIH0sXG4gIGVycm9yQ29sb3I6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlZmF1bHQ6IFwiI2NjMDAwMFwiLFxuICAgIGNsaTogXCItYywgLS1lcnJvci1jb2xvciA8Y29sb3I+XCIsXG4gICAgY2xpRGVzY3JpcHRpb246IFwiQSBjb2xvciBzdHJpbmcgZ2l2ZW4gaW4gdGhlIGZvcm1hdCAncmdiJyBvciAncnJnZ2JiJyBcIiArIFwiKG5vICMpLiBUaGlzIG9wdGlvbiBkZXRlcm1pbmVzIHRoZSBjb2xvciBvZiBlcnJvcnMgcmVuZGVyZWQgYnkgdGhlIFwiICsgXCItdCBvcHRpb24uXCIsXG4gICAgY2xpUHJvY2Vzc29yOiBmdW5jdGlvbiBjbGlQcm9jZXNzb3IoY29sb3IpIHtcbiAgICAgIHJldHVybiBcIiNcIiArIGNvbG9yO1xuICAgIH1cbiAgfSxcbiAgbWFjcm9zOiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBjbGk6IFwiLW0sIC0tbWFjcm8gPGRlZj5cIixcbiAgICBjbGlEZXNjcmlwdGlvbjogXCJEZWZpbmUgY3VzdG9tIG1hY3JvIG9mIHRoZSBmb3JtICdcXFxcZm9vOmV4cGFuc2lvbicgKHVzZSBcIiArIFwibXVsdGlwbGUgLW0gYXJndW1lbnRzIGZvciBtdWx0aXBsZSBtYWNyb3MpLlwiLFxuICAgIGNsaURlZmF1bHQ6IFtdLFxuICAgIGNsaVByb2Nlc3NvcjogZnVuY3Rpb24gY2xpUHJvY2Vzc29yKGRlZiwgZGVmcykge1xuICAgICAgZGVmcy5wdXNoKGRlZik7XG4gICAgICByZXR1cm4gZGVmcztcbiAgICB9XG4gIH0sXG4gIG1pblJ1bGVUaGlja25lc3M6IHtcbiAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNwZWNpZmllcyBhIG1pbmltdW0gdGhpY2tuZXNzLCBpbiBlbXMsIGZvciBmcmFjdGlvbiBsaW5lcyxcIiArIFwiIGBcXFxcc3FydGAgdG9wIGxpbmVzLCBge2FycmF5fWAgdmVydGljYWwgbGluZXMsIGBcXFxcaGxpbmVgLCBcIiArIFwiYFxcXFxoZGFzaGxpbmVgLCBgXFxcXHVuZGVybGluZWAsIGBcXFxcb3ZlcmxpbmVgLCBhbmQgdGhlIGJvcmRlcnMgb2YgXCIgKyBcImBcXFxcZmJveGAsIGBcXFxcYm94ZWRgLCBhbmQgYFxcXFxmY29sb3Jib3hgLlwiLFxuICAgIHByb2Nlc3NvcjogZnVuY3Rpb24gcHJvY2Vzc29yKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCB0KTtcbiAgICB9LFxuICAgIGNsaTogXCItLW1pbi1ydWxlLXRoaWNrbmVzcyA8c2l6ZT5cIixcbiAgICBjbGlQcm9jZXNzb3I6IHBhcnNlRmxvYXRcbiAgfSxcbiAgY29sb3JJc1RleHRDb2xvcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk1ha2VzIFxcXFxjb2xvciBiZWhhdmUgbGlrZSBMYVRlWCdzIDItYXJndW1lbnQgXFxcXHRleHRjb2xvciwgXCIgKyBcImluc3RlYWQgb2YgTGFUZVgncyBvbmUtYXJndW1lbnQgXFxcXGNvbG9yIG1vZGUgY2hhbmdlLlwiLFxuICAgIGNsaTogXCItYiwgLS1jb2xvci1pcy10ZXh0LWNvbG9yXCJcbiAgfSxcbiAgc3RyaWN0OiB7XG4gICAgdHlwZTogW3tcbiAgICAgIGVudW06IFtcIndhcm5cIiwgXCJpZ25vcmVcIiwgXCJlcnJvclwiXVxuICAgIH0sIFwiYm9vbGVhblwiLCBcImZ1bmN0aW9uXCJdLFxuICAgIGRlc2NyaXB0aW9uOiBcIlR1cm4gb24gc3RyaWN0IC8gTGFUZVggZmFpdGhmdWxuZXNzIG1vZGUsIHdoaWNoIHRocm93cyBhbiBcIiArIFwiZXJyb3IgaWYgdGhlIGlucHV0IHVzZXMgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBMYVRlWC5cIixcbiAgICBjbGk6IFwiLVMsIC0tc3RyaWN0XCIsXG4gICAgY2xpRGVmYXVsdDogZmFsc2VcbiAgfSxcbiAgdHJ1c3Q6IHtcbiAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwiZnVuY3Rpb25cIl0sXG4gICAgZGVzY3JpcHRpb246IFwiVHJ1c3QgdGhlIGlucHV0LCBlbmFibGluZyBhbGwgSFRNTCBmZWF0dXJlcyBzdWNoIGFzIFxcXFx1cmwuXCIsXG4gICAgY2xpOiBcIi1ULCAtLXRydXN0XCJcbiAgfSxcbiAgbWF4U2l6ZToge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgZGVmYXVsdDogSW5maW5pdHksXG4gICAgZGVzY3JpcHRpb246IFwiSWYgbm9uLXplcm8sIGFsbCB1c2VyLXNwZWNpZmllZCBzaXplcywgZS5nLiBpbiBcIiArIFwiXFxcXHJ1bGV7NTAwZW19ezUwMGVtfSwgd2lsbCBiZSBjYXBwZWQgdG8gbWF4U2l6ZSBlbXMuIE90aGVyd2lzZSwgXCIgKyBcImVsZW1lbnRzIGFuZCBzcGFjZXMgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlXCIsXG4gICAgcHJvY2Vzc29yOiBmdW5jdGlvbiBwcm9jZXNzb3Iocykge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHMpO1xuICAgIH0sXG4gICAgY2xpOiBcIi1zLCAtLW1heC1zaXplIDxuPlwiLFxuICAgIGNsaVByb2Nlc3NvcjogcGFyc2VJbnRcbiAgfSxcbiAgbWF4RXhwYW5kOiB7XG4gICAgdHlwZTogXCJudW1iZXJcIixcbiAgICBkZWZhdWx0OiAxMDAwLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxpbWl0IHRoZSBudW1iZXIgb2YgbWFjcm8gZXhwYW5zaW9ucyB0byB0aGUgc3BlY2lmaWVkIFwiICsgXCJudW1iZXIsIHRvIHByZXZlbnQgZS5nLiBpbmZpbml0ZSBtYWNybyBsb29wcy4gSWYgc2V0IHRvIEluZmluaXR5LCBcIiArIFwidGhlIG1hY3JvIGV4cGFuZGVyIHdpbGwgdHJ5IHRvIGZ1bGx5IGV4cGFuZCBhcyBpbiBMYVRlWC5cIixcbiAgICBwcm9jZXNzb3I6IGZ1bmN0aW9uIHByb2Nlc3NvcihuKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgbik7XG4gICAgfSxcbiAgICBjbGk6IFwiLWUsIC0tbWF4LWV4cGFuZCA8bj5cIixcbiAgICBjbGlQcm9jZXNzb3I6IGZ1bmN0aW9uIGNsaVByb2Nlc3NvcihuKSB7XG4gICAgICByZXR1cm4gbiA9PT0gXCJJbmZpbml0eVwiID8gSW5maW5pdHkgOiBwYXJzZUludChuKTtcbiAgICB9XG4gIH0sXG4gIGdsb2JhbEdyb3VwOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgY2xpOiBmYWxzZVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gIGlmIChzY2hlbWEuZGVmYXVsdCkge1xuICAgIHJldHVybiBzY2hlbWEuZGVmYXVsdDtcbiAgfVxuXG4gIHZhciB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIHZhciBkZWZhdWx0VHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcblxuICBpZiAodHlwZW9mIGRlZmF1bHRUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZWZhdWx0VHlwZS5lbnVtWzBdO1xuICB9XG5cbiAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiAnJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gMDtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICByZXR1cm4ge307XG4gIH1cbn1cbi8qKlxuICogVGhlIG1haW4gU2V0dGluZ3Mgb2JqZWN0XG4gKlxuICogVGhlIGN1cnJlbnQgb3B0aW9ucyBzdG9yZWQgYXJlOlxuICogIC0gZGlzcGxheU1vZGU6IFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHR5cGVzZXQgYXMgaW5saW5lIG1hdGhcbiAqICAgICAgICAgICAgICAgICAoZmFsc2UsIHRoZSBkZWZhdWx0KSwgbWVhbmluZyB0aGF0IHRoZSBtYXRoIHN0YXJ0cyBpblxuICogICAgICAgICAgICAgICAgIFxcdGV4dHN0eWxlIGFuZCBpcyBwbGFjZWQgaW4gYW4gaW5saW5lLWJsb2NrKTsgb3IgYXMgZGlzcGxheVxuICogICAgICAgICAgICAgICAgIG1hdGggKHRydWUpLCBtZWFuaW5nIHRoYXQgdGhlIG1hdGggc3RhcnRzIGluIFxcZGlzcGxheXN0eWxlXG4gKiAgICAgICAgICAgICAgICAgYW5kIGlzIHBsYWNlZCBpbiBhIGJsb2NrIHdpdGggdmVydGljYWwgbWFyZ2luLlxuICovXG5cblxudmFyIFNldHRpbmdzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2V0dGluZ3Mob3B0aW9ucykge1xuICAgIHRoaXMuZGlzcGxheU1vZGUgPSB2b2lkIDA7XG4gICAgdGhpcy5vdXRwdXQgPSB2b2lkIDA7XG4gICAgdGhpcy5sZXFubyA9IHZvaWQgMDtcbiAgICB0aGlzLmZsZXFuID0gdm9pZCAwO1xuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdm9pZCAwO1xuICAgIHRoaXMuZXJyb3JDb2xvciA9IHZvaWQgMDtcbiAgICB0aGlzLm1hY3JvcyA9IHZvaWQgMDtcbiAgICB0aGlzLm1pblJ1bGVUaGlja25lc3MgPSB2b2lkIDA7XG4gICAgdGhpcy5jb2xvcklzVGV4dENvbG9yID0gdm9pZCAwO1xuICAgIHRoaXMuc3RyaWN0ID0gdm9pZCAwO1xuICAgIHRoaXMudHJ1c3QgPSB2b2lkIDA7XG4gICAgdGhpcy5tYXhTaXplID0gdm9pZCAwO1xuICAgIHRoaXMubWF4RXhwYW5kID0gdm9pZCAwO1xuICAgIHRoaXMuZ2xvYmFsR3JvdXAgPSB2b2lkIDA7XG4gICAgLy8gYWxsb3cgbnVsbCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBmb3IgKHZhciBwcm9wIGluIFNFVFRJTkdTX1NDSEVNQSkge1xuICAgICAgaWYgKFNFVFRJTkdTX1NDSEVNQS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIHZhciBzY2hlbWEgPSBTRVRUSU5HU19TQ0hFTUFbcHJvcF07IC8vIFRPRE86IHZhbGlkYXRlIG9wdGlvbnNcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgIHRoaXNbcHJvcF0gPSBvcHRpb25zW3Byb3BdICE9PSB1bmRlZmluZWQgPyBzY2hlbWEucHJvY2Vzc29yID8gc2NoZW1hLnByb2Nlc3NvcihvcHRpb25zW3Byb3BdKSA6IG9wdGlvbnNbcHJvcF0gOiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlcG9ydCBub25zdHJpY3QgKG5vbi1MYVRlWC1jb21wYXRpYmxlKSBpbnB1dC5cbiAgICogQ2FuIHNhZmVseSBub3QgYmUgY2FsbGVkIGlmIGB0aGlzLnN0cmljdGAgaXMgZmFsc2UgaW4gSmF2YVNjcmlwdC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU2V0dGluZ3MucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZXBvcnROb25zdHJpY3QgPSBmdW5jdGlvbiByZXBvcnROb25zdHJpY3QoZXJyb3JDb2RlLCBlcnJvck1zZywgdG9rZW4pIHtcbiAgICB2YXIgc3RyaWN0ID0gdGhpcy5zdHJpY3Q7XG5cbiAgICBpZiAodHlwZW9mIHN0cmljdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBBbGxvdyByZXR1cm4gdmFsdWUgb2Ygc3RyaWN0IGZ1bmN0aW9uIHRvIGJlIGJvb2xlYW4gb3Igc3RyaW5nXG4gICAgICAvLyAob3IgbnVsbC91bmRlZmluZWQsIG1lYW5pbmcgbm8gZnVydGhlciBwcm9jZXNzaW5nKS5cbiAgICAgIHN0cmljdCA9IHN0cmljdChlcnJvckNvZGUsIGVycm9yTXNnLCB0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKCFzdHJpY3QgfHwgc3RyaWN0ID09PSBcImlnbm9yZVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChzdHJpY3QgPT09IHRydWUgfHwgc3RyaWN0ID09PSBcImVycm9yXCIpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkxhVGVYLWluY29tcGF0aWJsZSBpbnB1dCBhbmQgc3RyaWN0IG1vZGUgaXMgc2V0IHRvICdlcnJvcic6IFwiICsgKGVycm9yTXNnICsgXCIgW1wiICsgZXJyb3JDb2RlICsgXCJdXCIpLCB0b2tlbik7XG4gICAgfSBlbHNlIGlmIChzdHJpY3QgPT09IFwid2FyblwiKSB7XG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4oXCJMYVRlWC1pbmNvbXBhdGlibGUgaW5wdXQgYW5kIHN0cmljdCBtb2RlIGlzIHNldCB0byAnd2Fybic6IFwiICsgKGVycm9yTXNnICsgXCIgW1wiICsgZXJyb3JDb2RlICsgXCJdXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd29uJ3QgaGFwcGVuIGluIHR5cGUtc2FmZSBjb2RlXG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4oXCJMYVRlWC1pbmNvbXBhdGlibGUgaW5wdXQgYW5kIHN0cmljdCBtb2RlIGlzIHNldCB0byBcIiArIChcInVucmVjb2duaXplZCAnXCIgKyBzdHJpY3QgKyBcIic6IFwiICsgZXJyb3JNc2cgKyBcIiBbXCIgKyBlcnJvckNvZGUgKyBcIl1cIikpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0byBhcHBseSBzdHJpY3QgKExhVGVYLWFkaGVyaW5nKSBiZWhhdmlvciBmb3IgdW51c3VhbFxuICAgKiBpbnB1dCAobGlrZSBgXFxcXGApLiAgVW5saWtlIGBub25zdHJpY3RgLCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvcjtcbiAgICogaW5zdGVhZCwgXCJlcnJvclwiIHRyYW5zbGF0ZXMgdG8gYSByZXR1cm4gdmFsdWUgb2YgYHRydWVgLCB3aGlsZSBcImlnbm9yZVwiXG4gICAqIHRyYW5zbGF0ZXMgdG8gYSByZXR1cm4gdmFsdWUgb2YgYGZhbHNlYC4gIE1heSBzdGlsbCBwcmludCBhIHdhcm5pbmc6XG4gICAqIFwid2FyblwiIHByaW50cyBhIHdhcm5pbmcgYW5kIHJldHVybnMgYGZhbHNlYC5cbiAgICogVGhpcyBpcyBmb3IgdGhlIHNlY29uZCBjYXRlZ29yeSBvZiBgZXJyb3JDb2RlYHMgbGlzdGVkIGluIHRoZSBSRUFETUUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZVN0cmljdEJlaGF2aW9yID0gZnVuY3Rpb24gdXNlU3RyaWN0QmVoYXZpb3IoZXJyb3JDb2RlLCBlcnJvck1zZywgdG9rZW4pIHtcbiAgICB2YXIgc3RyaWN0ID0gdGhpcy5zdHJpY3Q7XG5cbiAgICBpZiAodHlwZW9mIHN0cmljdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBBbGxvdyByZXR1cm4gdmFsdWUgb2Ygc3RyaWN0IGZ1bmN0aW9uIHRvIGJlIGJvb2xlYW4gb3Igc3RyaW5nXG4gICAgICAvLyAob3IgbnVsbC91bmRlZmluZWQsIG1lYW5pbmcgbm8gZnVydGhlciBwcm9jZXNzaW5nKS5cbiAgICAgIC8vIEJ1dCBjYXRjaCBhbnkgZXhjZXB0aW9ucyB0aHJvd24gYnkgZnVuY3Rpb24sIHRyZWF0aW5nIHRoZW1cbiAgICAgIC8vIGxpa2UgXCJlcnJvclwiLlxuICAgICAgdHJ5IHtcbiAgICAgICAgc3RyaWN0ID0gc3RyaWN0KGVycm9yQ29kZSwgZXJyb3JNc2csIHRva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN0cmljdCA9IFwiZXJyb3JcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXN0cmljdCB8fCBzdHJpY3QgPT09IFwiaWdub3JlXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHN0cmljdCA9PT0gdHJ1ZSB8fCBzdHJpY3QgPT09IFwiZXJyb3JcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChzdHJpY3QgPT09IFwid2FyblwiKSB7XG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4oXCJMYVRlWC1pbmNvbXBhdGlibGUgaW5wdXQgYW5kIHN0cmljdCBtb2RlIGlzIHNldCB0byAnd2Fybic6IFwiICsgKGVycm9yTXNnICsgXCIgW1wiICsgZXJyb3JDb2RlICsgXCJdXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd29uJ3QgaGFwcGVuIGluIHR5cGUtc2FmZSBjb2RlXG4gICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4oXCJMYVRlWC1pbmNvbXBhdGlibGUgaW5wdXQgYW5kIHN0cmljdCBtb2RlIGlzIHNldCB0byBcIiArIChcInVucmVjb2duaXplZCAnXCIgKyBzdHJpY3QgKyBcIic6IFwiICsgZXJyb3JNc2cgKyBcIiBbXCIgKyBlcnJvckNvZGUgKyBcIl1cIikpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0byB0ZXN0IHBvdGVudGlhbGx5IGRhbmdlcm91cyBpbnB1dCwgYW5kIHJldHVyblxuICAgKiBgdHJ1ZWAgKHRydXN0ZWQpIG9yIGBmYWxzZWAgKHVudHJ1c3RlZCkuICBUaGUgc29sZSBhcmd1bWVudCBgY29udGV4dGBcbiAgICogc2hvdWxkIGJlIGFuIG9iamVjdCB3aXRoIGBjb21tYW5kYCBmaWVsZCBzcGVjaWZ5aW5nIHRoZSByZWxldmFudCBMYVRlWFxuICAgKiBjb21tYW5kIChhcyBhIHN0cmluZyBzdGFydGluZyB3aXRoIGBcXGApLCBhbmQgYW55IG90aGVyIGFyZ3VtZW50cywgZXRjLlxuICAgKiBJZiBgY29udGV4dGAgaGFzIGEgYHVybGAgZmllbGQsIGEgYHByb3RvY29sYCBmaWVsZCB3aWxsIGF1dG9tYXRpY2FsbHlcbiAgICogZ2V0IGFkZGVkIGJ5IHRoaXMgZnVuY3Rpb24gKGNoYW5naW5nIHRoZSBzcGVjaWZpZWQgb2JqZWN0KS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaXNUcnVzdGVkID0gZnVuY3Rpb24gaXNUcnVzdGVkKGNvbnRleHQpIHtcbiAgICBpZiAoY29udGV4dC51cmwgJiYgIWNvbnRleHQucHJvdG9jb2wpIHtcbiAgICAgIGNvbnRleHQucHJvdG9jb2wgPSB1dGlscy5wcm90b2NvbEZyb21VcmwoY29udGV4dC51cmwpO1xuICAgIH1cblxuICAgIHZhciB0cnVzdCA9IHR5cGVvZiB0aGlzLnRydXN0ID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLnRydXN0KGNvbnRleHQpIDogdGhpcy50cnVzdDtcbiAgICByZXR1cm4gQm9vbGVhbih0cnVzdCk7XG4gIH07XG5cbiAgcmV0dXJuIFNldHRpbmdzO1xufSgpO1xuXG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9TdHlsZS5qc1xuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYW5kIGNsYXNzZXMgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mIHN0eWxlc1xuICogdXNlZCBpbiBUZVguIEl0IHByb3ZpZGVzIGEgZ2VuZXJpYyBgU3R5bGVgIGNsYXNzLCB3aGljaCBob2xkcyBpbmZvcm1hdGlvblxuICogYWJvdXQgYSBzcGVjaWZpYyBzdHlsZS4gSXQgdGhlbiBwcm92aWRlcyBpbnN0YW5jZXMgb2YgYWxsIHRoZSBkaWZmZXJlbnQga2luZHNcbiAqIG9mIHN0eWxlcyBwb3NzaWJsZSwgYW5kIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBtb3ZlIGJldHdlZW4gdGhlbSBhbmQgZ2V0XG4gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGVtLlxuICovXG5cbi8qKlxuICogVGhlIG1haW4gc3R5bGUgY2xhc3MuIENvbnRhaW5zIGEgdW5pcXVlIGlkIGZvciB0aGUgc3R5bGUsIGEgc2l6ZSAod2hpY2ggaXNcbiAqIHRoZSBzYW1lIGZvciBjcmFtcGVkIGFuZCB1bmNyYW1wZWQgdmVyc2lvbiBvZiBhIHN0eWxlKSwgYW5kIGEgY3JhbXBlZCBmbGFnLlxuICovXG52YXIgU3R5bGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdHlsZShpZCwgc2l6ZSwgY3JhbXBlZCkge1xuICAgIHRoaXMuaWQgPSB2b2lkIDA7XG4gICAgdGhpcy5zaXplID0gdm9pZCAwO1xuICAgIHRoaXMuY3JhbXBlZCA9IHZvaWQgMDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLmNyYW1wZWQgPSBjcmFtcGVkO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0eWxlIG9mIGEgc3VwZXJzY3JpcHQgZ2l2ZW4gYSBiYXNlIGluIHRoZSBjdXJyZW50IHN0eWxlLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBTdHlsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnN1cCA9IGZ1bmN0aW9uIHN1cCgpIHtcbiAgICByZXR1cm4gc3R5bGVzW19zdXBbdGhpcy5pZF1dO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0eWxlIG9mIGEgc3Vic2NyaXB0IGdpdmVuIGEgYmFzZSBpbiB0aGUgY3VycmVudCBzdHlsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc3ViID0gZnVuY3Rpb24gc3ViKCkge1xuICAgIHJldHVybiBzdHlsZXNbX3N1Ylt0aGlzLmlkXV07XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgc3R5bGUgb2YgYSBmcmFjdGlvbiBudW1lcmF0b3IgZ2l2ZW4gdGhlIGZyYWN0aW9uIGluIHRoZSBjdXJyZW50XG4gICAqIHN0eWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5mcmFjTnVtID0gZnVuY3Rpb24gZnJhY051bSgpIHtcbiAgICByZXR1cm4gc3R5bGVzW19mcmFjTnVtW3RoaXMuaWRdXTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBzdHlsZSBvZiBhIGZyYWN0aW9uIGRlbm9taW5hdG9yIGdpdmVuIHRoZSBmcmFjdGlvbiBpbiB0aGUgY3VycmVudFxuICAgKiBzdHlsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZnJhY0RlbiA9IGZ1bmN0aW9uIGZyYWNEZW4oKSB7XG4gICAgcmV0dXJuIHN0eWxlc1tfZnJhY0Rlblt0aGlzLmlkXV07XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgY3JhbXBlZCB2ZXJzaW9uIG9mIGEgc3R5bGUgKGluIHBhcnRpY3VsYXIsIGNyYW1waW5nIGEgY3JhbXBlZCBzdHlsZVxuICAgKiBkb2Vzbid0IGNoYW5nZSB0aGUgc3R5bGUpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmFtcCA9IGZ1bmN0aW9uIGNyYW1wKCkge1xuICAgIHJldHVybiBzdHlsZXNbX2NyYW1wW3RoaXMuaWRdXTtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgdGV4dCBvciBkaXNwbGF5IHZlcnNpb24gb2YgdGhpcyBzdHlsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udGV4dCA9IGZ1bmN0aW9uIHRleHQoKSB7XG4gICAgcmV0dXJuIHN0eWxlc1tfdGV4dFt0aGlzLmlkXV07XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHRoaXMgc3R5bGUgaXMgdGlnaHRseSBzcGFjZWQgKHNjcmlwdHN0eWxlL3NjcmlwdHNjcmlwdHN0eWxlKVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pc1RpZ2h0ID0gZnVuY3Rpb24gaXNUaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplID49IDI7XG4gIH07XG5cbiAgcmV0dXJuIFN0eWxlO1xufSgpOyAvLyBFeHBvcnQgYW4gaW50ZXJmYWNlIGZvciB0eXBlIGNoZWNraW5nLCBidXQgZG9uJ3QgZXhwb3NlIHRoZSBpbXBsZW1lbnRhdGlvbi5cbi8vIFRoaXMgd2F5LCBubyBtb3JlIHN0eWxlcyBjYW4gYmUgZ2VuZXJhdGVkLlxuXG5cbi8vIElEcyBvZiB0aGUgZGlmZmVyZW50IHN0eWxlc1xudmFyIEQgPSAwO1xudmFyIERjID0gMTtcbnZhciBUID0gMjtcbnZhciBUYyA9IDM7XG52YXIgUyA9IDQ7XG52YXIgU2MgPSA1O1xudmFyIFNTID0gNjtcbnZhciBTU2MgPSA3OyAvLyBJbnN0YW5jZXMgb2YgdGhlIGRpZmZlcmVudCBzdHlsZXNcblxudmFyIHN0eWxlcyA9IFtuZXcgU3R5bGUoRCwgMCwgZmFsc2UpLCBuZXcgU3R5bGUoRGMsIDAsIHRydWUpLCBuZXcgU3R5bGUoVCwgMSwgZmFsc2UpLCBuZXcgU3R5bGUoVGMsIDEsIHRydWUpLCBuZXcgU3R5bGUoUywgMiwgZmFsc2UpLCBuZXcgU3R5bGUoU2MsIDIsIHRydWUpLCBuZXcgU3R5bGUoU1MsIDMsIGZhbHNlKSwgbmV3IFN0eWxlKFNTYywgMywgdHJ1ZSldOyAvLyBMb29rdXAgdGFibGVzIGZvciBzd2l0Y2hpbmcgZnJvbSBvbmUgc3R5bGUgdG8gYW5vdGhlclxuXG52YXIgX3N1cCA9IFtTLCBTYywgUywgU2MsIFNTLCBTU2MsIFNTLCBTU2NdO1xudmFyIF9zdWIgPSBbU2MsIFNjLCBTYywgU2MsIFNTYywgU1NjLCBTU2MsIFNTY107XG52YXIgX2ZyYWNOdW0gPSBbVCwgVGMsIFMsIFNjLCBTUywgU1NjLCBTUywgU1NjXTtcbnZhciBfZnJhY0RlbiA9IFtUYywgVGMsIFNjLCBTYywgU1NjLCBTU2MsIFNTYywgU1NjXTtcbnZhciBfY3JhbXAgPSBbRGMsIERjLCBUYywgVGMsIFNjLCBTYywgU1NjLCBTU2NdO1xudmFyIF90ZXh0ID0gW0QsIERjLCBULCBUYywgVCwgVGMsIFQsIFRjXTsgLy8gV2Ugb25seSBleHBvcnQgc29tZSBvZiB0aGUgc3R5bGVzLlxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfU3R5bGUgPSAoe1xuICBESVNQTEFZOiBzdHlsZXNbRF0sXG4gIFRFWFQ6IHN0eWxlc1tUXSxcbiAgU0NSSVBUOiBzdHlsZXNbU10sXG4gIFNDUklQVFNDUklQVDogc3R5bGVzW1NTXVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdW5pY29kZVNjcmlwdHMuanNcbi8qXG4gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVW5pY29kZSBzY3JpcHRzIGFuZCBzY3JpcHQgZmFtaWxpZXMgdGhhdCB3ZVxuICogc3VwcG9ydC4gVG8gYWRkIG5ldyBzY3JpcHRzIG9yIGZhbWlsaWVzLCBqdXN0IGFkZCBhIG5ldyBlbnRyeSB0byB0aGVcbiAqIHNjcmlwdERhdGEgYXJyYXkgYmVsb3cuIEFkZGluZyBzY3JpcHRzIHRvIHRoZSBzY3JpcHREYXRhIGFycmF5IGFsbG93c1xuICogY2hhcmFjdGVycyBmcm9tIHRoYXQgc2NyaXB0IHRvIGFwcGVhciBpbiBcXHRleHR7fSBlbnZpcm9ubWVudHMuXG4gKi9cblxuLyoqXG4gKiBFYWNoIHNjcmlwdCBvciBzY3JpcHQgZmFtaWx5IGhhcyBhIG5hbWUgYW5kIGFuIGFycmF5IG9mIGJsb2Nrcy5cbiAqIEVhY2ggYmxvY2sgaXMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgd2hpY2ggc3BlY2lmeSB0aGUgc3RhcnQgYW5kXG4gKiBlbmQgcG9pbnRzIChpbmNsdXNpdmUpIG9mIGEgYmxvY2sgb2YgVW5pY29kZSBjb2RlcG9pbnRzLlxuICovXG5cbi8qKlxuICogVW5pY29kZSBibG9jayBkYXRhIGZvciB0aGUgZmFtaWxpZXMgb2Ygc2NyaXB0cyB3ZSBzdXBwb3J0IGluIFxcdGV4dHt9LlxuICogU2NyaXB0cyBvbmx5IG5lZWQgdG8gYXBwZWFyIGhlcmUgaWYgdGhleSBkbyBub3QgaGF2ZSBmb250IG1ldHJpY3MuXG4gKi9cbnZhciBzY3JpcHREYXRhID0gW3tcbiAgLy8gTGF0aW4gY2hhcmFjdGVycyBiZXlvbmQgdGhlIExhdGluLTEgY2hhcmFjdGVycyB3ZSBoYXZlIG1ldHJpY3MgZm9yLlxuICAvLyBOZWVkZWQgZm9yIEN6ZWNoLCBIdW5nYXJpYW4gYW5kIFR1cmtpc2ggdGV4dCwgZm9yIGV4YW1wbGUuXG4gIG5hbWU6ICdsYXRpbicsXG4gIGJsb2NrczogW1sweDAxMDAsIDB4MDI0Zl0sIC8vIExhdGluIEV4dGVuZGVkLUEgYW5kIExhdGluIEV4dGVuZGVkLUJcbiAgWzB4MDMwMCwgMHgwMzZmXSAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgbWFya3NcbiAgXVxufSwge1xuICAvLyBUaGUgQ3lyaWxsaWMgc2NyaXB0IHVzZWQgYnkgUnVzc2lhbiBhbmQgcmVsYXRlZCBsYW5ndWFnZXMuXG4gIC8vIEEgQ3lyaWxsaWMgc3Vic2V0IHVzZWQgdG8gYmUgc3VwcG9ydGVkIGFzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAvLyBzeW1ib2xzIGluIHN5bWJvbHMuanNcbiAgbmFtZTogJ2N5cmlsbGljJyxcbiAgYmxvY2tzOiBbWzB4MDQwMCwgMHgwNGZmXV1cbn0sIHtcbiAgLy8gQXJtZW5pYW5cbiAgbmFtZTogJ2FybWVuaWFuJyxcbiAgYmxvY2tzOiBbWzB4MDUzMCwgMHgwNThGXV1cbn0sIHtcbiAgLy8gVGhlIEJyYWhtaWMgc2NyaXB0cyBvZiBTb3V0aCBhbmQgU291dGhlYXN0IEFzaWFcbiAgLy8gRGV2YW5hZ2FyaSAoMDkwMOKAkzA5N0YpXG4gIC8vIEJlbmdhbGkgKDA5ODDigJMwOUZGKVxuICAvLyBHdXJtdWtoaSAoMEEwMOKAkzBBN0YpXG4gIC8vIEd1amFyYXRpICgwQTgw4oCTMEFGRilcbiAgLy8gT3JpeWEgKDBCMDDigJMwQjdGKVxuICAvLyBUYW1pbCAoMEI4MOKAkzBCRkYpXG4gIC8vIFRlbHVndSAoMEMwMOKAkzBDN0YpXG4gIC8vIEthbm5hZGEgKDBDODDigJMwQ0ZGKVxuICAvLyBNYWxheWFsYW0gKDBEMDDigJMwRDdGKVxuICAvLyBTaW5oYWxhICgwRDgw4oCTMERGRilcbiAgLy8gVGhhaSAoMEUwMOKAkzBFN0YpXG4gIC8vIExhbyAoMEU4MOKAkzBFRkYpXG4gIC8vIFRpYmV0YW4gKDBGMDDigJMwRkZGKVxuICAvLyBNeWFubWFyICgxMDAw4oCTMTA5RilcbiAgbmFtZTogJ2JyYWhtaWMnLFxuICBibG9ja3M6IFtbMHgwOTAwLCAweDEwOUZdXVxufSwge1xuICBuYW1lOiAnZ2VvcmdpYW4nLFxuICBibG9ja3M6IFtbMHgxMEEwLCAweDEwZmZdXVxufSwge1xuICAvLyBDaGluZXNlIGFuZCBKYXBhbmVzZS5cbiAgLy8gVGhlIFwia1wiIGluIGNqayBpcyBmb3IgS29yZWFuLCBidXQgd2UndmUgc2VwYXJhdGVkIEtvcmVhbiBvdXRcbiAgbmFtZTogXCJjamtcIixcbiAgYmxvY2tzOiBbWzB4MzAwMCwgMHgzMEZGXSwgLy8gQ0pLIHN5bWJvbHMgYW5kIHB1bmN0dWF0aW9uLCBIaXJhZ2FuYSwgS2F0YWthbmFcbiAgWzB4NEUwMCwgMHg5RkFGXSwgLy8gQ0pLIGlkZW9ncmFtc1xuICBbMHhGRjAwLCAweEZGNjBdIC8vIEZ1bGx3aWR0aCBwdW5jdHVhdGlvblxuICAvLyBUT0RPOiBhZGQgaGFsZndpZHRoIEthdGFrYW5hIGFuZCBSb21hbmppIGdseXBoc1xuICBdXG59LCB7XG4gIC8vIEtvcmVhblxuICBuYW1lOiAnaGFuZ3VsJyxcbiAgYmxvY2tzOiBbWzB4QUMwMCwgMHhEN0FGXV1cbn1dO1xuLyoqXG4gKiBHaXZlbiBhIGNvZGVwb2ludCwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgb3Igc2NyaXB0IGZhbWlseVxuICogaXQgaXMgZnJvbSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgcGFydCBvZiBhIGtub3duIGJsb2NrXG4gKi9cblxuZnVuY3Rpb24gc2NyaXB0RnJvbUNvZGVwb2ludChjb2RlcG9pbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY3JpcHREYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNjcmlwdCA9IHNjcmlwdERhdGFbaV07XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgc2NyaXB0LmJsb2Nrcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBibG9jayA9IHNjcmlwdC5ibG9ja3NbX2ldO1xuXG4gICAgICBpZiAoY29kZXBvaW50ID49IGJsb2NrWzBdICYmIGNvZGVwb2ludCA8PSBibG9ja1sxXSkge1xuICAgICAgICByZXR1cm4gc2NyaXB0Lm5hbWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEEgZmxhdHRlbmVkIHZlcnNpb24gb2YgYWxsIHRoZSBzdXBwb3J0ZWQgYmxvY2tzIGluIGEgc2luZ2xlIGFycmF5LlxuICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gdG8gbWFrZSBzdXBwb3J0ZWRDb2RlcG9pbnQoKSBmYXN0LlxuICovXG5cbnZhciBhbGxCbG9ja3MgPSBbXTtcbnNjcmlwdERhdGEuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5ibG9ja3MuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgIHJldHVybiBhbGxCbG9ja3MucHVzaC5hcHBseShhbGxCbG9ja3MsIGIpO1xuICB9KTtcbn0pO1xuLyoqXG4gKiBHaXZlbiBhIGNvZGVwb2ludCwgcmV0dXJuIHRydWUgaWYgaXQgZmFsbHMgd2l0aGluIG9uZSBvZiB0aGVcbiAqIHNjcmlwdHMgb3Igc2NyaXB0IGZhbWlsaWVzIGRlZmluZWQgYWJvdmUgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBNaWNybyBiZW5jaG1hcmtzIHNob3dzIHRoYXQgdGhpcyBpcyBmYXN0ZXIgdGhhblxuICogL1tcXHUzMDAwLVxcdTMwRkZcXHU0RTAwLVxcdTlGQUZcXHVGRjAwLVxcdUZGNjBcXHVBQzAwLVxcdUQ3QUZcXHUwOTAwLVxcdTEwOUZdLy50ZXN0KClcbiAqIGluIEZpcmVmb3gsIENocm9tZSBhbmQgTm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBzdXBwb3J0ZWRDb2RlcG9pbnQoY29kZXBvaW50KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsQmxvY2tzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKGNvZGVwb2ludCA+PSBhbGxCbG9ja3NbaV0gJiYgY29kZXBvaW50IDw9IGFsbEJsb2Nrc1tpICsgMV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zdmdHZW9tZXRyeS5qc1xuLyoqXG4gKiBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCB0byBkb21UcmVlLmpzIGFuZCBkZWxpbWl0ZXIuanMuXG4gKiBJdCdzIGEgc3RvcmVob3VzZSBvZiBwYXRoIGdlb21ldHJ5IGZvciBTVkcgaW1hZ2VzLlxuICovXG4vLyBJbiBhbGwgcGF0aHMgYmVsb3csIHRoZSB2aWV3Qm94LXRvLWVtIHNjYWxlIGlzIDEwMDA6MS5cbnZhciBoTGluZVBhZCA9IDgwOyAvLyBwYWRkaW5nIGFib3ZlIGEgc3FydCB2aW5pY3VsdW0uIFByZXZlbnRzIGltYWdlIGNyb3BwaW5nLlxuLy8gVGhlIHZpbmljdWx1bSBvZiBhIFxcc3FydCBjYW4gYmUgbWFkZSB0aGlja2VyIGJ5IGEgS2FUZVggcmVuZGVyaW5nIG9wdGlvbi5cbi8vIFRoaW5rIG9mIHZhcmlhYmxlIGV4dHJhVmluaWN1bHVtIGFzIHR3byBkZXRvdXJzIGluIHRoZSBTVkcgcGF0aC5cbi8vIFRoZSBkZXRvdXIgYmVnaW5zIGF0IHRoZSBsb3dlciBsZWZ0IG9mIHRoZSBhcmVhIGxhYmVsZWQgZXh0cmFWaW5pY3VsdW0gYmVsb3cuXG4vLyBUaGUgZGV0b3VyIHByb2NlZWRzIG9uZSBleHRyYVZpbmljdWx1bSBkaXN0YW5jZSB1cCBhbmQgc2xpZ2h0bHkgdG8gdGhlIHJpZ2h0LFxuLy8gZGlzcGxhY2luZyB0aGUgcmFkaXVzZWQgY29ybmVyIGJldHdlZW4gc3VyZCBhbmQgdmluaWN1bHVtLiBUaGUgcmFkaXVzIGlzXG4vLyB0cmF2ZXJzZWQgYXMgdXN1YWwsIHRoZW4gdGhlIGRldG91ciByZXN1bWVzLiBJdCBnb2VzIHJpZ2h0LCB0byB0aGUgZW5kIG9mXG4vLyB0aGUgdmVyeSBsb25nIHZpbmljdWx1bW4sIHRoZW4gZG93biBvbmUgZXh0cmFWaW5pY3VsdW0gZGlzdGFuY2UsXG4vLyBhZnRlciB3aGljaCBpdCByZXN1bWVzIHJlZ3VsYXIgcGF0aCBnZW9tZXRyeSBmb3IgdGhlIHJhZGljYWwuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aW5pY3VsdW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cbiAgICAgICAgIC/ilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLilpLihpBleHRyYVZpbmljdWx1bVxuICAgICAgICAvIOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKGkDAuMDRlbSAoNDAgdW5pdCkgc3RkIHZpbmljdWx1bSB0aGlja25lc3NcbiAgICAgICAvIC9cbiAgICAgIC8gL1xuICAgICAvIC9cXFxuICAgIC8gLyBzdXJkXG4qL1xuXG52YXIgc3FydE1haW4gPSBmdW5jdGlvbiBzcXJ0TWFpbihleHRyYVZpbmljdWx1bSwgaExpbmVQYWQpIHtcbiAgLy8gc3FydE1haW4gcGF0aCBnZW9tZXRyeSBpcyBmcm9tIGdseXBoIFUyMjFBIGluIHRoZSBmb250IEthVGVYIE1haW5cbiAgcmV0dXJuIFwiTTk1LFwiICsgKDYyMiArIGV4dHJhVmluaWN1bHVtICsgaExpbmVQYWQpICsgXCJcXG5jLTIuNywwLC03LjE3LC0yLjcsLTEzLjUsLThjLTUuOCwtNS4zLC05LjUsLTEwLC05LjUsLTE0XFxuYzAsLTIsMC4zLC0zLjMsMSwtNGMxLjMsLTIuNywyMy44MywtMjAuNyw2Ny41LC01NFxcbmM0NC4yLC0zMy4zLDY1LjgsLTUwLjMsNjYuNSwtNTFjMS4zLC0xLjMsMywtMiw1LC0yYzQuNywwLDguNywzLjMsMTIsMTBcXG5zMTczLDM3OCwxNzMsMzc4YzAuNywwLDM1LjMsLTcxLDEwNCwtMjEzYzY4LjcsLTE0MiwxMzcuNSwtMjg1LDIwNi41LC00MjlcXG5jNjksLTE0NCwxMDQuNSwtMjE3LjcsMTA2LjUsLTIyMVxcbmxcIiArIGV4dHJhVmluaWN1bHVtIC8gMi4wNzUgKyBcIiAtXCIgKyBleHRyYVZpbmljdWx1bSArIFwiXFxuYzUuMywtOS4zLDEyLC0xNCwyMCwtMTRcXG5INDAwMDAwdlwiICsgKDQwICsgZXh0cmFWaW5pY3VsdW0pICsgXCJIODQ1LjI3MjRcXG5zLTIyNS4yNzIsNDY3LC0yMjUuMjcyLDQ2N3MtMjM1LDQ4NiwtMjM1LDQ4NmMtMi43LDQuNywtOSw3LC0xOSw3XFxuYy02LDAsLTEwLC0xLC0xMiwtM3MtMTk0LC00MjIsLTE5NCwtNDIycy02NSw0NywtNjUsNDd6XFxuTVwiICsgKDgzNCArIGV4dHJhVmluaWN1bHVtKSArIFwiIFwiICsgaExpbmVQYWQgKyBcImg0MDAwMDB2XCIgKyAoNDAgKyBleHRyYVZpbmljdWx1bSkgKyBcImgtNDAwMDAwelwiO1xufTtcblxudmFyIHNxcnRTaXplMSA9IGZ1bmN0aW9uIHNxcnRTaXplMShleHRyYVZpbmljdWx1bSwgaExpbmVQYWQpIHtcbiAgLy8gc2l6ZTEgaXMgZnJvbSBnbHlwaCBVMjIxQSBpbiB0aGUgZm9udCBLYVRlWF9TaXplMS1SZWd1bGFyXG4gIHJldHVybiBcIk0yNjMsXCIgKyAoNjAxICsgZXh0cmFWaW5pY3VsdW0gKyBoTGluZVBhZCkgKyBcImMwLjcsMCwxOCwzOS43LDUyLDExOVxcbmMzNCw3OS4zLDY4LjE2NywxNTguNywxMDIuNSwyMzhjMzQuMyw3OS4zLDUxLjgsMTE5LjMsNTIuNSwxMjBcXG5jMzQwLC03MDQuNyw1MTAuNywtMTA2MC4zLDUxMiwtMTA2N1xcbmxcIiArIGV4dHJhVmluaWN1bHVtIC8gMi4wODQgKyBcIiAtXCIgKyBleHRyYVZpbmljdWx1bSArIFwiXFxuYzQuNywtNy4zLDExLC0xMSwxOSwtMTFcXG5INDAwMDB2XCIgKyAoNDAgKyBleHRyYVZpbmljdWx1bSkgKyBcIkgxMDEyLjNcXG5zLTI3MS4zLDU2NywtMjcxLjMsNTY3Yy0zOC43LDgwLjcsLTg0LDE3NSwtMTM2LDI4M2MtNTIsMTA4LC04OS4xNjcsMTg1LjMsLTExMS41LDIzMlxcbmMtMjIuMyw0Ni43LC0zMy44LDcwLjMsLTM0LjUsNzFjLTQuNyw0LjcsLTEyLjMsNywtMjMsN3MtMTIsLTEsLTEyLC0xXFxucy0xMDksLTI1MywtMTA5LC0yNTNjLTcyLjcsLTE2OCwtMTA5LjMsLTI1MiwtMTEwLC0yNTJjLTEwLjcsOCwtMjIsMTYuNywtMzQsMjZcXG5jLTIyLDE3LjMsLTMzLjMsMjYsLTM0LDI2cy0yNiwtMjYsLTI2LC0yNnM3NiwtNTksNzYsLTU5czc2LC02MCw3NiwtNjB6XFxuTVwiICsgKDEwMDEgKyBleHRyYVZpbmljdWx1bSkgKyBcIiBcIiArIGhMaW5lUGFkICsgXCJoNDAwMDAwdlwiICsgKDQwICsgZXh0cmFWaW5pY3VsdW0pICsgXCJoLTQwMDAwMHpcIjtcbn07XG5cbnZhciBzcXJ0U2l6ZTIgPSBmdW5jdGlvbiBzcXJ0U2l6ZTIoZXh0cmFWaW5pY3VsdW0sIGhMaW5lUGFkKSB7XG4gIC8vIHNpemUyIGlzIGZyb20gZ2x5cGggVTIyMUEgaW4gdGhlIGZvbnQgS2FUZVhfU2l6ZTItUmVndWxhclxuICByZXR1cm4gXCJNOTgzIFwiICsgKDEwICsgZXh0cmFWaW5pY3VsdW0gKyBoTGluZVBhZCkgKyBcIlxcbmxcIiArIGV4dHJhVmluaWN1bHVtIC8gMy4xMyArIFwiIC1cIiArIGV4dHJhVmluaWN1bHVtICsgXCJcXG5jNCwtNi43LDEwLC0xMCwxOCwtMTAgSDQwMDAwMHZcIiArICg0MCArIGV4dHJhVmluaWN1bHVtKSArIFwiXFxuSDEwMTMuMXMtODMuNCwyNjgsLTI2NC4xLDg0MGMtMTgwLjcsNTcyLC0yNzcsODc2LjMsLTI4OSw5MTNjLTQuNyw0LjcsLTEyLjcsNywtMjQsN1xcbnMtMTIsMCwtMTIsMGMtMS4zLC0zLjMsLTMuNywtMTEuNywtNywtMjVjLTM1LjMsLTEyNS4zLC0xMDYuNywtMzczLjMsLTIxNCwtNzQ0XFxuYy0xMCwxMiwtMjEsMjUsLTMzLDM5cy0zMiwzOSwtMzIsMzljLTYsLTUuMywtMTUsLTE0LC0yNywtMjZzMjUsLTMwLDI1LC0zMFxcbmMyNi43LC0zMi43LDUyLC02Myw3NiwtOTFzNTIsLTYwLDUyLC02MHMyMDgsNzIyLDIwOCw3MjJcXG5jNTYsLTE3NS4zLDEyNi4zLC0zOTcuMywyMTEsLTY2NmM4NC43LC0yNjguNywxNTMuOCwtNDg4LjIsMjA3LjUsLTY1OC41XFxuYzUzLjcsLTE3MC4zLDg0LjUsLTI2Ni44LDkyLjUsLTI4OS41elxcbk1cIiArICgxMDAxICsgZXh0cmFWaW5pY3VsdW0pICsgXCIgXCIgKyBoTGluZVBhZCArIFwiaDQwMDAwMHZcIiArICg0MCArIGV4dHJhVmluaWN1bHVtKSArIFwiaC00MDAwMDB6XCI7XG59O1xuXG52YXIgc3FydFNpemUzID0gZnVuY3Rpb24gc3FydFNpemUzKGV4dHJhVmluaWN1bHVtLCBoTGluZVBhZCkge1xuICAvLyBzaXplMyBpcyBmcm9tIGdseXBoIFUyMjFBIGluIHRoZSBmb250IEthVGVYX1NpemUzLVJlZ3VsYXJcbiAgcmV0dXJuIFwiTTQyNCxcIiArICgyMzk4ICsgZXh0cmFWaW5pY3VsdW0gKyBoTGluZVBhZCkgKyBcIlxcbmMtMS4zLC0wLjcsLTM4LjUsLTE3MiwtMTExLjUsLTUxNGMtNzMsLTM0MiwtMTA5LjgsLTUxMy4zLC0xMTAuNSwtNTE0XFxuYzAsLTIsLTEwLjcsMTQuMywtMzIsNDljLTQuNyw3LjMsLTkuOCwxNS43LC0xNS41LDI1Yy01LjcsOS4zLC05LjgsMTYsLTEyLjUsMjBcXG5zLTUsNywtNSw3Yy00LC0zLjMsLTguMywtNy43LC0xMywtMTNzLTEzLC0xMywtMTMsLTEzczc2LC0xMjIsNzYsLTEyMnM3NywtMTIxLDc3LC0xMjFcXG5zMjA5LDk2OCwyMDksOTY4YzAsLTIsODQuNywtMzYxLjcsMjU0LC0xMDc5YzE2OS4zLC03MTcuMywyNTQuNywtMTA3Ny43LDI1NiwtMTA4MVxcbmxcIiArIGV4dHJhVmluaWN1bHVtIC8gNC4yMjMgKyBcIiAtXCIgKyBleHRyYVZpbmljdWx1bSArIFwiYzQsLTYuNywxMCwtMTAsMTgsLTEwIEg0MDAwMDBcXG52XCIgKyAoNDAgKyBleHRyYVZpbmljdWx1bSkgKyBcIkgxMDE0LjZcXG5zLTg3LjMsMzc4LjcsLTI3Mi42LDExNjZjLTE4NS4zLDc4Ny4zLC0yNzkuMywxMTgyLjMsLTI4MiwxMTg1XFxuYy0yLDYsLTEwLDksLTI0LDlcXG5jLTgsMCwtMTIsLTAuNywtMTIsLTJ6IE1cIiArICgxMDAxICsgZXh0cmFWaW5pY3VsdW0pICsgXCIgXCIgKyBoTGluZVBhZCArIFwiXFxuaDQwMDAwMHZcIiArICg0MCArIGV4dHJhVmluaWN1bHVtKSArIFwiaC00MDAwMDB6XCI7XG59O1xuXG52YXIgc3FydFNpemU0ID0gZnVuY3Rpb24gc3FydFNpemU0KGV4dHJhVmluaWN1bHVtLCBoTGluZVBhZCkge1xuICAvLyBzaXplNCBpcyBmcm9tIGdseXBoIFUyMjFBIGluIHRoZSBmb250IEthVGVYX1NpemU0LVJlZ3VsYXJcbiAgcmV0dXJuIFwiTTQ3MyxcIiArICgyNzEzICsgZXh0cmFWaW5pY3VsdW0gKyBoTGluZVBhZCkgKyBcIlxcbmMzMzkuMywtMTc5OS4zLDUwOS4zLC0yNzAwLDUxMCwtMjcwMiBsXCIgKyBleHRyYVZpbmljdWx1bSAvIDUuMjk4ICsgXCIgLVwiICsgZXh0cmFWaW5pY3VsdW0gKyBcIlxcbmMzLjMsLTcuMyw5LjMsLTExLDE4LC0xMSBINDAwMDAwdlwiICsgKDQwICsgZXh0cmFWaW5pY3VsdW0pICsgXCJIMTAxNy43XFxucy05MC41LDQ3OCwtMjc2LjIsMTQ2NmMtMTg1LjcsOTg4LC0yNzkuNSwxNDgzLC0yODEuNSwxNDg1Yy0yLDYsLTEwLDksLTI0LDlcXG5jLTgsMCwtMTIsLTAuNywtMTIsLTJjMCwtMS4zLC01LjMsLTMyLC0xNiwtOTJjLTUwLjcsLTI5My4zLC0xMTkuNywtNjkzLjMsLTIwNywtMTIwMFxcbmMwLC0xLjMsLTUuMyw4LjcsLTE2LDMwYy0xMC43LDIxLjMsLTIxLjMsNDIuNywtMzIsNjRzLTE2LDMzLC0xNiwzM3MtMjYsLTI2LC0yNiwtMjZcXG5zNzYsLTE1Myw3NiwtMTUzczc3LC0xNTEsNzcsLTE1MWMwLjcsMC43LDM1LjcsMjAyLDEwNSw2MDRjNjcuMyw0MDAuNywxMDIsNjAyLjcsMTA0LFxcbjYwNnpNXCIgKyAoMTAwMSArIGV4dHJhVmluaWN1bHVtKSArIFwiIFwiICsgaExpbmVQYWQgKyBcImg0MDAwMDB2XCIgKyAoNDAgKyBleHRyYVZpbmljdWx1bSkgKyBcIkgxMDE3Ljd6XCI7XG59O1xuXG52YXIgcGhhc2VQYXRoID0gZnVuY3Rpb24gcGhhc2VQYXRoKHkpIHtcbiAgdmFyIHggPSB5IC8gMjsgLy8geCBjb29yZGluYXRlIGF0IHRvcCBvZiBhbmdsZVxuXG4gIHJldHVybiBcIk00MDAwMDAgXCIgKyB5ICsgXCIgSDAgTFwiICsgeCArIFwiIDAgbDY1IDQ1IEwxNDUgXCIgKyAoeSAtIDgwKSArIFwiIEg0MDAwMDB6XCI7XG59O1xuXG52YXIgc3FydFRhbGwgPSBmdW5jdGlvbiBzcXJ0VGFsbChleHRyYVZpbmljdWx1bSwgaExpbmVQYWQsIHZpZXdCb3hIZWlnaHQpIHtcbiAgLy8gc3FydFRhbGwgaXMgZnJvbSBnbHlwaCBVMjNCNyBpbiB0aGUgZm9udCBLYVRlWF9TaXplNC1SZWd1bGFyXG4gIC8vIE9uZSBwYXRoIGVkZ2UgaGFzIGEgdmFyaWFibGUgbGVuZ3RoLiBJdCBydW5zIHZlcnRpY2FsbHkgZnJvbSB0aGUgdmluaWN1bHVtblxuICAvLyB0byBhIHBvaW50IG5lYXIgKDE0IHVuaXRzKSB0aGUgYm90dG9tIG9mIHRoZSBzdXJkLiBUaGUgdmluaWN1bHVtXG4gIC8vIGlzIG5vcm1hbGx5IDQwIHVuaXRzIHRoaWNrLiBTbyB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lIGluIHF1ZXN0aW9uIGlzOlxuICB2YXIgdmVydFNlZ21lbnQgPSB2aWV3Qm94SGVpZ2h0IC0gNTQgLSBoTGluZVBhZCAtIGV4dHJhVmluaWN1bHVtO1xuICByZXR1cm4gXCJNNzAyIFwiICsgKGV4dHJhVmluaWN1bHVtICsgaExpbmVQYWQpICsgXCJINDAwMDAwXCIgKyAoNDAgKyBleHRyYVZpbmljdWx1bSkgKyBcIlxcbkg3NDJ2XCIgKyB2ZXJ0U2VnbWVudCArIFwibC00IDQtNCA0Yy0uNjY3LjcgLTIgMS41LTQgMi41cy00LjE2NyAxLjgzMy02LjUgMi41LTUuNSAxLTkuNSAxXFxuaC0xMmwtMjgtODRjLTE2LjY2Ny01Mi05Ni42NjcgLTI5NC4zMzMtMjQwLTcyN2wtMjEyIC02NDMgLTg1IDE3MFxcbmMtNC0zLjMzMy04LjMzMy03LjY2Ny0xMyAtMTNsLTEzLTEzbDc3LTE1NSA3Ny0xNTZjNjYgMTk5LjMzMyAxMzkgNDE5LjY2N1xcbjIxOSA2NjEgbDIxOCA2NjF6TTcwMiBcIiArIGhMaW5lUGFkICsgXCJINDAwMDAwdlwiICsgKDQwICsgZXh0cmFWaW5pY3VsdW0pICsgXCJINzQyelwiO1xufTtcblxudmFyIHNxcnRQYXRoID0gZnVuY3Rpb24gc3FydFBhdGgoc2l6ZSwgZXh0cmFWaW5pY3VsdW0sIHZpZXdCb3hIZWlnaHQpIHtcbiAgZXh0cmFWaW5pY3VsdW0gPSAxMDAwICogZXh0cmFWaW5pY3VsdW07IC8vIENvbnZlcnQgZnJvbSBkb2N1bWVudCBlbXMgdG8gdmlld0JveC5cblxuICB2YXIgcGF0aCA9IFwiXCI7XG5cbiAgc3dpdGNoIChzaXplKSB7XG4gICAgY2FzZSBcInNxcnRNYWluXCI6XG4gICAgICBwYXRoID0gc3FydE1haW4oZXh0cmFWaW5pY3VsdW0sIGhMaW5lUGFkKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcInNxcnRTaXplMVwiOlxuICAgICAgcGF0aCA9IHNxcnRTaXplMShleHRyYVZpbmljdWx1bSwgaExpbmVQYWQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwic3FydFNpemUyXCI6XG4gICAgICBwYXRoID0gc3FydFNpemUyKGV4dHJhVmluaWN1bHVtLCBoTGluZVBhZCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJzcXJ0U2l6ZTNcIjpcbiAgICAgIHBhdGggPSBzcXJ0U2l6ZTMoZXh0cmFWaW5pY3VsdW0sIGhMaW5lUGFkKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcInNxcnRTaXplNFwiOlxuICAgICAgcGF0aCA9IHNxcnRTaXplNChleHRyYVZpbmljdWx1bSwgaExpbmVQYWQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwic3FydFRhbGxcIjpcbiAgICAgIHBhdGggPSBzcXJ0VGFsbChleHRyYVZpbmljdWx1bSwgaExpbmVQYWQsIHZpZXdCb3hIZWlnaHQpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59O1xudmFyIGlubmVyUGF0aCA9IGZ1bmN0aW9uIGlubmVyUGF0aChuYW1lLCBoZWlnaHQpIHtcbiAgLy8gVGhlIGlubmVyIHBhcnQgb2Ygc3RyZXRjaHkgdGFsbCBkZWxpbWl0ZXJzXG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgXCJcXHUyMzlDXCI6XG4gICAgICByZXR1cm4gXCJNMjkxIDAgSDQxNyBWXCIgKyBoZWlnaHQgKyBcIiBIMjkxeiBNMjkxIDAgSDQxNyBWXCIgKyBoZWlnaHQgKyBcIiBIMjkxelwiO1xuXG4gICAgY2FzZSBcIlxcdTIyMjNcIjpcbiAgICAgIHJldHVybiBcIk0xNDUgMCBIMTg4IFZcIiArIGhlaWdodCArIFwiIEgxNDV6IE0xNDUgMCBIMTg4IFZcIiArIGhlaWdodCArIFwiIEgxNDV6XCI7XG5cbiAgICBjYXNlIFwiXFx1MjIyNVwiOlxuICAgICAgcmV0dXJuIFwiTTE0NSAwIEgxODggVlwiICsgaGVpZ2h0ICsgXCIgSDE0NXogTTE0NSAwIEgxODggVlwiICsgaGVpZ2h0ICsgXCIgSDE0NXpcIiArIChcIk0zNjcgMCBINDEwIFZcIiArIGhlaWdodCArIFwiIEgzNjd6IE0zNjcgMCBINDEwIFZcIiArIGhlaWdodCArIFwiIEgzNjd6XCIpO1xuXG4gICAgY2FzZSBcIlxcdTIzOUZcIjpcbiAgICAgIHJldHVybiBcIk00NTcgMCBINTgzIFZcIiArIGhlaWdodCArIFwiIEg0NTd6IE00NTcgMCBINTgzIFZcIiArIGhlaWdodCArIFwiIEg0NTd6XCI7XG5cbiAgICBjYXNlIFwiXFx1MjNBMlwiOlxuICAgICAgcmV0dXJuIFwiTTMxOSAwIEg0MDMgVlwiICsgaGVpZ2h0ICsgXCIgSDMxOXogTTMxOSAwIEg0MDMgVlwiICsgaGVpZ2h0ICsgXCIgSDMxOXpcIjtcblxuICAgIGNhc2UgXCJcXHUyM0E1XCI6XG4gICAgICByZXR1cm4gXCJNMjYzIDAgSDM0NyBWXCIgKyBoZWlnaHQgKyBcIiBIMjYzeiBNMjYzIDAgSDM0NyBWXCIgKyBoZWlnaHQgKyBcIiBIMjYzelwiO1xuXG4gICAgY2FzZSBcIlxcdTIzQUFcIjpcbiAgICAgIHJldHVybiBcIk0zODQgMCBINTA0IFZcIiArIGhlaWdodCArIFwiIEgzODR6IE0zODQgMCBINTA0IFZcIiArIGhlaWdodCArIFwiIEgzODR6XCI7XG5cbiAgICBjYXNlIFwiXFx1MjNEMFwiOlxuICAgICAgcmV0dXJuIFwiTTMxMiAwIEgzNTUgVlwiICsgaGVpZ2h0ICsgXCIgSDMxMnogTTMxMiAwIEgzNTUgVlwiICsgaGVpZ2h0ICsgXCIgSDMxMnpcIjtcblxuICAgIGNhc2UgXCJcXHUyMDE2XCI6XG4gICAgICByZXR1cm4gXCJNMjU3IDAgSDMwMCBWXCIgKyBoZWlnaHQgKyBcIiBIMjU3eiBNMjU3IDAgSDMwMCBWXCIgKyBoZWlnaHQgKyBcIiBIMjU3elwiICsgKFwiTTQ3OCAwIEg1MjEgVlwiICsgaGVpZ2h0ICsgXCIgSDQ3OHogTTQ3OCAwIEg1MjEgVlwiICsgaGVpZ2h0ICsgXCIgSDQ3OHpcIik7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiXCI7XG4gIH1cbn07XG52YXIgcGF0aCA9IHtcbiAgLy8gVGhlIGRvdWJsZWxlZnRhcnJvdyBnZW9tZXRyeSBpcyBmcm9tIGdseXBoIFUrMjFEMCBpbiB0aGUgZm9udCBLYVRlWCBNYWluXG4gIGRvdWJsZWxlZnRhcnJvdzogXCJNMjYyIDE1N1xcbmwxMC0xMGMzNC0zNiA2Mi43LTc3IDg2LTEyMyAzLjMtOCA1LTEzLjMgNS0xNiAwLTUuMy02LjctOC0yMC04LTcuM1xcbiAwLTEyLjIuNS0xNC41IDEuNS0yLjMgMS00LjggNC41LTcuNSAxMC41LTQ5LjMgOTcuMy0xMjEuNyAxNjkuMy0yMTcgMjE2LTI4XFxuIDE0LTU3LjMgMjUtODggMzMtNi43IDItMTEgMy44LTEzIDUuNS0yIDEuNy0zIDQuMi0zIDcuNXMxIDUuOCAzIDcuNVxcbmMyIDEuNyA2LjMgMy41IDEzIDUuNSA2OCAxNy4zIDEyOC4yIDQ3LjggMTgwLjUgOTEuNSA1Mi4zIDQzLjcgOTMuOCA5Ni4yIDEyNC41XFxuIDE1Ny41IDkuMyA4IDE1LjMgMTIuMyAxOCAxM2g2YzEyLS43IDE4LTQgMTgtMTAgMC0yLTEuNy03LTUtMTUtMjMuMy00Ni01Mi04N1xcbi04Ni0xMjNsLTEwLTEwaDM5OTczOHYtNDBIMjE4YzMyOCAwIDAgMCAwIDBsLTEwLThjLTI2LjctMjAtNjUuNy00My0xMTctNjkgMi43XFxuLTIgNi0zLjcgMTAtNSAzNi43LTE2IDcyLjMtMzcuMyAxMDctNjRsMTAtOGgzOTk3ODJ2LTQwelxcbm04IDB2NDBoMzk5NzMwdi00MHptMCAxOTR2NDBoMzk5NzMwdi00MHpcIixcbiAgLy8gZG91YmxlcmlnaHRhcnJvdyBpcyBmcm9tIGdseXBoIFUrMjFEMiBpbiBmb250IEthVGVYIE1haW5cbiAgZG91YmxlcmlnaHRhcnJvdzogXCJNMzk5NzM4IDM5MmxcXG4tMTAgMTBjLTM0IDM2LTYyLjcgNzctODYgMTIzLTMuMyA4LTUgMTMuMy01IDE2IDAgNS4zIDYuNyA4IDIwIDggNy4zIDAgMTIuMi0uNVxcbiAxNC41LTEuNSAyLjMtMSA0LjgtNC41IDcuNS0xMC41IDQ5LjMtOTcuMyAxMjEuNy0xNjkuMyAyMTctMjE2IDI4LTE0IDU3LjMtMjUgODhcXG4tMzMgNi43LTIgMTEtMy44IDEzLTUuNSAyLTEuNyAzLTQuMiAzLTcuNXMtMS01LjgtMy03LjVjLTItMS43LTYuMy0zLjUtMTMtNS41LTY4XFxuLTE3LjMtMTI4LjItNDcuOC0xODAuNS05MS41LTUyLjMtNDMuNy05My44LTk2LjItMTI0LjUtMTU3LjUtOS4zLTgtMTUuMy0xMi4zLTE4XFxuLTEzaC02Yy0xMiAuNy0xOCA0LTE4IDEwIDAgMiAxLjcgNyA1IDE1IDIzLjMgNDYgNTIgODcgODYgMTIzbDEwIDEwSDB2NDBoMzk5NzgyXFxuYy0zMjggMCAwIDAgMCAwbDEwIDhjMjYuNyAyMCA2NS43IDQzIDExNyA2OS0yLjcgMi02IDMuNy0xMCA1LTM2LjcgMTYtNzIuMyAzNy4zXFxuLTEwNyA2NGwtMTAgOEgwdjQwek0wIDE1N3Y0MGgzOTk3MzB2LTQwem0wIDE5NHY0MGgzOTk3MzB2LTQwelwiLFxuICAvLyBsZWZ0YXJyb3cgaXMgZnJvbSBnbHlwaCBVKzIxOTAgaW4gZm9udCBLYVRlWCBNYWluXG4gIGxlZnRhcnJvdzogXCJNNDAwMDAwIDI0MUgxMTBsMy0zYzY4LjctNTIuNyAxMTMuNy0xMjBcXG4gMTM1LTIwMiA0LTE0LjcgNi0yMyA2LTI1IDAtNy4zLTctMTEtMjEtMTEtOCAwLTEzLjIuOC0xNS41IDIuNS0yLjMgMS43LTQuMiA1LjhcXG4tNS41IDEyLjUtMS4zIDQuNy0yLjcgMTAuMy00IDE3LTEyIDQ4LjctMzQuOCA5Mi02OC41IDEzMFM2NS4zIDIyOC4zIDE4IDI0N1xcbmMtMTAgNC0xNiA3LjctMTggMTEgMCA4LjcgNiAxNC4zIDE4IDE3IDQ3LjMgMTguNyA4Ny44IDQ3IDEyMS41IDg1UzE5NiA0NDEuMyAyMDhcXG4gNDkwYy43IDIgMS4zIDUgMiA5czEuMiA2LjcgMS41IDhjLjMgMS4zIDEgMy4zIDIgNnMyLjIgNC41IDMuNSA1LjVjMS4zIDEgMy4zXFxuIDEuOCA2IDIuNXM2IDEgMTAgMWMxNCAwIDIxLTMuNyAyMS0xMSAwLTItMi0xMC4zLTYtMjUtMjAtNzkuMy02NS0xNDYuNy0xMzUtMjAyXFxuIGwtMy0zaDM5OTg5MHpNMTAwIDI0MXY0MGgzOTk5MDB2LTQwelwiLFxuICAvLyBvdmVyYnJhY2UgaXMgZnJvbSBnbHlwaHMgVSsyM0E5LzIzQTgvMjNBNyBpbiBmb250IEthVGVYX1NpemU0LVJlZ3VsYXJcbiAgbGVmdGJyYWNlOiBcIk02IDU0OGwtNi02di0zNWw2LTExYzU2LTEwNCAxMzUuMy0xODEuMyAyMzgtMjMyIDU3LjMtMjguNyAxMTdcXG4tNDUgMTc5LTUwaDM5OTU3N3YxMjBINDAzYy00My4zIDctODEgMTUtMTEzIDI2LTEwMC43IDMzLTE3OS43IDkxLTIzNyAxNzQtMi43XFxuIDUtNiA5LTEwIDEzLS43IDEtNy4zIDEtMjAgMUg2elwiLFxuICBsZWZ0YnJhY2V1bmRlcjogXCJNMCA2bDYtNmgxN2MxMi42ODggMCAxOS4zMTMuMyAyMCAxIDQgNCA3LjMxMyA4LjMgMTAgMTNcXG4gMzUuMzEzIDUxLjMgODAuODEzIDkzLjggMTM2LjUgMTI3LjUgNTUuNjg4IDMzLjcgMTE3LjE4OCA1NS44IDE4NC41IDY2LjUuNjg4XFxuIDAgMiAuMyA0IDEgMTguNjg4IDIuNyA3NiA0LjMgMTcyIDVoMzk5NDUwdjEyMEg0MjlsLTYtMWMtMTI0LjY4OC04LTIzNS02MS43XFxuLTMzMS0xNjFDNjAuNjg3IDEzOC43IDMyLjMxMiA5OS4zIDcgNTRMMCA0MVY2elwiLFxuICAvLyBvdmVyZ3JvdXAgaXMgZnJvbSB0aGUgTW5TeW1ib2wgcGFja2FnZSAocHVibGljIGRvbWFpbilcbiAgbGVmdGdyb3VwOiBcIk00MDAwMDAgODBcXG5INDM1QzY0IDgwIDE2OC4zIDIyOS40IDIxIDI2MGMtNS45IDEuMi0xOCAwLTE4IDAtMiAwLTMtMS0zLTN2LTM4Qzc2IDYxIDI1NyAwXFxuIDQzNSAwaDM5OTU2NXpcIixcbiAgbGVmdGdyb3VwdW5kZXI6IFwiTTQwMDAwMCAyNjJcXG5INDM1QzY0IDI2MiAxNjguMyAxMTIuNiAyMSA4MmMtNS45LTEuMi0xOCAwLTE4IDAtMiAwLTMgMS0zIDN2MzhjNzYgMTU4IDI1NyAyMTlcXG4gNDM1IDIxOWgzOTk1NjV6XCIsXG4gIC8vIEhhcnBvb25zIGFyZSBmcm9tIGdseXBoIFUrMjFCRCBpbiBmb250IEthVGVYIE1haW5cbiAgbGVmdGhhcnBvb246IFwiTTAgMjY3Yy43IDUuMyAzIDEwIDcgMTRoMzk5OTkzdi00MEg5M2MzLjNcXG4tMy4zIDEwLjItOS41IDIwLjUtMTguNXMxNy44LTE1LjggMjIuNS0yMC41YzUwLjctNTIgODgtMTEwLjMgMTEyLTE3NSA0LTExLjMgNVxcbi0xOC4zIDMtMjEtMS4zLTQtNy4zLTYtMTgtNi04IDAtMTMgLjctMTUgMnMtNC43IDYuNy04IDE2Yy00MiA5OC43LTEwNy4zIDE3NC43XFxuLTE5NiAyMjgtNi43IDQuNy0xMC43IDgtMTIgMTAtMS4zIDItMiA1LjctMiAxMXptMTAwLTI2djQwaDM5OTkwMHYtNDB6XCIsXG4gIGxlZnRoYXJwb29ucGx1czogXCJNMCAyNjdjLjcgNS4zIDMgMTAgNyAxNGgzOTk5OTN2LTQwSDkzYzMuMy0zLjMgMTAuMi05LjVcXG4gMjAuNS0xOC41czE3LjgtMTUuOCAyMi41LTIwLjVjNTAuNy01MiA4OC0xMTAuMyAxMTItMTc1IDQtMTEuMyA1LTE4LjMgMy0yMS0xLjNcXG4tNC03LjMtNi0xOC02LTggMC0xMyAuNy0xNSAycy00LjcgNi43LTggMTZjLTQyIDk4LjctMTA3LjMgMTc0LjctMTk2IDIyOC02LjcgNC43XFxuLTEwLjcgOC0xMiAxMC0xLjMgMi0yIDUuNy0yIDExem0xMDAtMjZ2NDBoMzk5OTAwdi00MHpNMCA0MzV2NDBoNDAwMDAwdi00MHpcXG5tMCAwdjQwaDQwMDAwMHYtNDB6XCIsXG4gIGxlZnRoYXJwb29uZG93bjogXCJNNyAyNDFjLTQgNC02LjMzMyA4LjY2Ny03IDE0IDAgNS4zMzMuNjY3IDkgMiAxMXM1LjMzM1xcbiA1LjMzMyAxMiAxMGM5MC42NjcgNTQgMTU2IDEzMCAxOTYgMjI4IDMuMzMzIDEwLjY2NyA2LjMzMyAxNi4zMzMgOSAxNyAyIC42NjcgNVxcbiAxIDkgMWg1YzEwLjY2NyAwIDE2LjY2Ny0yIDE4LTYgMi0yLjY2NyAxLTkuNjY3LTMtMjEtMzItODcuMzMzLTgyLjY2Ny0xNTcuNjY3XFxuLTE1Mi0yMTFsLTMtM2gzOTk5MDd2LTQwek05MyAyODEgSDQwMDAwMCB2LTQwTDcgMjQxelwiLFxuICBsZWZ0aGFycG9vbmRvd25wbHVzOiBcIk03IDQzNWMtNCA0LTYuMyA4LjctNyAxNCAwIDUuMy43IDkgMiAxMXM1LjMgNS4zIDEyXFxuIDEwYzkwLjcgNTQgMTU2IDEzMCAxOTYgMjI4IDMuMyAxMC43IDYuMyAxNi4zIDkgMTcgMiAuNyA1IDEgOSAxaDVjMTAuNyAwIDE2LjdcXG4tMiAxOC02IDItMi43IDEtOS43LTMtMjEtMzItODcuMy04Mi43LTE1Ny43LTE1Mi0yMTFsLTMtM2gzOTk5MDd2LTQwSDd6bTkzIDBcXG52NDBoMzk5OTAwdi00MHpNMCAyNDF2NDBoMzk5OTAwdi00MHptMCAwdjQwaDM5OTkwMHYtNDB6XCIsXG4gIC8vIGhvb2sgaXMgZnJvbSBnbHlwaCBVKzIxQTkgaW4gZm9udCBLYVRlWCBNYWluXG4gIGxlZnRob29rOiBcIk00MDAwMDAgMjgxIEgxMDNzLTMzLTExLjItNjEtMzMuNVMwIDE5Ny4zIDAgMTY0czE0LjItNjEuMiA0Mi41XFxuLTgzLjVDNzAuOCA1OC4yIDEwNCA0NyAxNDIgNDcgYzE2LjcgMCAyNSA2LjcgMjUgMjAgMCAxMi04LjcgMTguNy0yNiAyMC00MCAzLjNcXG4tNjguNyAxNS43LTg2IDM3LTEwIDEyLTE1IDI1LjMtMTUgNDAgMCAyMi43IDkuOCA0MC43IDI5LjUgNTQgMTkuNyAxMy4zIDQzLjUgMjFcXG4gNzEuNSAyM2gzOTk4NTl6TTEwMyAyODF2LTQwaDM5OTg5N3Y0MHpcIixcbiAgbGVmdGxpbmVzZWdtZW50OiBcIk00MCAyODEgVjQyOCBIMCBWOTQgSDQwIFYyNDEgSDQwMDAwMCB2NDB6XFxuTTQwIDI4MSBWNDI4IEgwIFY5NCBINDAgVjI0MSBINDAwMDAwIHY0MHpcIixcbiAgbGVmdG1hcHN0bzogXCJNNDAgMjgxIFY0NDhIMFY3NEg0MFYyNDFINDAwMDAwdjQwelxcbk00MCAyODEgVjQ0OEgwVjc0SDQwVjI0MUg0MDAwMDB2NDB6XCIsXG4gIC8vIHRvZnJvbSBpcyBmcm9tIGdseXBoIFUrMjFDNCBpbiBmb250IEthVGVYIEFNUyBSZWd1bGFyXG4gIGxlZnRUb0Zyb206IFwiTTAgMTQ3aDQwMDAwMHY0MEgwem0wIDIxNGM2OCA0MCAxMTUuNyA5NS43IDE0MyAxNjdoMjJjMTUuMyAwIDIzXFxuLS4zIDIzLTEgMC0xLjMtNS4zLTEzLjctMTYtMzctMTgtMzUuMy00MS4zLTY5LTcwLTEwMWwtNy04aDM5OTkwNXYtNDBIOTVsNy04XFxuYzI4LjctMzIgNTItNjUuNyA3MC0xMDEgMTAuNy0yMy4zIDE2LTM1LjcgMTYtMzcgMC0uNy03LjctMS0yMy0xaC0yMkMxMTUuNyAyNjUuM1xcbiA2OCAzMjEgMCAzNjF6bTAtMTc0di00MGgzOTk5MDB2NDB6bTEwMCAxNTR2NDBoMzk5OTAwdi00MHpcIixcbiAgbG9uZ2VxdWFsOiBcIk0wIDUwIGg0MDAwMDAgdjQwSDB6IG0wIDE5NGg0MDAwMHY0MEgwelxcbk0wIDUwIGg0MDAwMDAgdjQwSDB6IG0wIDE5NGg0MDAwMHY0MEgwelwiLFxuICBtaWRicmFjZTogXCJNMjAwNDI4IDMzNFxcbmMtMTAwLjctOC4zLTE5NS4zLTQ0LTI4MC0xMDgtNTUuMy00Mi0xMDEuNy05My0xMzktMTUzbC05LTE0Yy0yLjcgNC01LjcgOC43LTkgMTRcXG4tNTMuMyA4Ni43LTEyMy43IDE1My0yMTEgMTk5LTY2LjcgMzYtMTM3LjMgNTYuMy0yMTIgNjJIMFYyMTRoMTk5NTY4YzE3OC4zLTExLjdcXG4gMzExLjctNzguMyA0MDMtMjAxIDYtOCA5LjctMTIgMTEtMTIgLjctLjcgNi43LTEgMTgtMXMxNy4zLjMgMTggMWMxLjMgMCA1IDQgMTFcXG4gMTIgNDQuNyA1OS4zIDEwMS4zIDEwNi4zIDE3MCAxNDFzMTQ1LjMgNTQuMyAyMjkgNjBoMTk5NTcydjEyMHpcIixcbiAgbWlkYnJhY2V1bmRlcjogXCJNMTk5NTcyIDIxNFxcbmMxMDAuNyA4LjMgMTk1LjMgNDQgMjgwIDEwOCA1NS4zIDQyIDEwMS43IDkzIDEzOSAxNTNsOSAxNGMyLjctNCA1LjctOC43IDktMTRcXG4gNTMuMy04Ni43IDEyMy43LTE1MyAyMTEtMTk5IDY2LjctMzYgMTM3LjMtNTYuMyAyMTItNjJoMTk5NTY4djEyMEgyMDA0MzJjLTE3OC4zXFxuIDExLjctMzExLjcgNzguMy00MDMgMjAxLTYgOC05LjcgMTItMTEgMTItLjcuNy02LjcgMS0xOCAxcy0xNy4zLS4zLTE4LTFjLTEuMyAwXFxuLTUtNC0xMS0xMi00NC43LTU5LjMtMTAxLjMtMTA2LjMtMTcwLTE0MXMtMTQ1LjMtNTQuMy0yMjktNjBIMFYyMTR6XCIsXG4gIG9paW50U2l6ZTE6IFwiTTUxMi42IDcxLjZjMjcyLjYgMCAzMjAuMyAxMDYuOCAzMjAuMyAxNzguMiAwIDcwLjgtNDcuNyAxNzcuNlxcbi0zMjAuMyAxNzcuNlMxOTMuMSAzMjAuNiAxOTMuMSAyNDkuOGMwLTcxLjQgNDYuOS0xNzguMiAzMTkuNS0xNzguMnpcXG5tMzY4LjEgMTc4LjJjMC04Ni40LTYwLjktMjE1LjQtMzY4LjEtMjE1LjQtMzA2LjQgMC0zNjcuMyAxMjktMzY3LjMgMjE1LjQgMCA4NS44XFxuNjAuOSAyMTQuOCAzNjcuMyAyMTQuOCAzMDcuMiAwIDM2OC4xLTEyOSAzNjguMS0yMTQuOHpcIixcbiAgb2lpbnRTaXplMjogXCJNNzU3LjggMTAwLjFjMzg0LjcgMCA0NTEuMSAxMzcuNiA0NTEuMSAyMzAgMCA5MS4zLTY2LjQgMjI4LjhcXG4tNDUxLjEgMjI4LjgtMzg2LjMgMC00NTIuNy0xMzcuNS00NTIuNy0yMjguOCAwLTkyLjQgNjYuNC0yMzAgNDUyLjctMjMwelxcbm01MDIuNCAyMzBjMC0xMTEuMi04Mi40LTI3Ny4yLTUwMi40LTI3Ny4ycy01MDQgMTY2LTUwNCAyNzcuMlxcbmMwIDExMCA4NCAyNzYgNTA0IDI3NnM1MDIuNC0xNjYgNTAyLjQtMjc2elwiLFxuICBvaWlpbnRTaXplMTogXCJNNjgxLjQgNzEuNmM0MDguOSAwIDQ4MC41IDEwNi44IDQ4MC41IDE3OC4yIDAgNzAuOC03MS42IDE3Ny42XFxuLTQ4MC41IDE3Ny42UzIwMi4xIDMyMC42IDIwMi4xIDI0OS44YzAtNzEuNCA3MC41LTE3OC4yIDQ3OS4zLTE3OC4yelxcbm01MjUuOCAxNzguMmMwLTg2LjQtODYuOC0yMTUuNC01MjUuNy0yMTUuNC00MzcuOSAwLTUyNC43IDEyOS01MjQuNyAyMTUuNCAwXFxuODUuOCA4Ni44IDIxNC44IDUyNC43IDIxNC44IDQzOC45IDAgNTI1LjctMTI5IDUyNS43LTIxNC44elwiLFxuICBvaWlpbnRTaXplMjogXCJNMTAyMS4yIDUzYzYwMy42IDAgNzA3LjggMTY1LjggNzA3LjggMjc3LjIgMCAxMTAtMTA0LjIgMjc1LjhcXG4tNzA3LjggMjc1LjgtNjA2IDAtNzEwLjItMTY1LjgtNzEwLjItMjc1LjhDMzExIDIxOC44IDQxNS4yIDUzIDEwMjEuMiA1M3pcXG5tNzcwLjQgMjc3LjFjMC0xMzEuMi0xMjYuNC0zMjcuNi03NzAuNS0zMjcuNlMyNDguNCAxOTguOSAyNDguNCAzMzAuMVxcbmMwIDEzMCAxMjguOCAzMjYuNCA3NzIuNyAzMjYuNHM3NzAuNS0xOTYuNCA3NzAuNS0zMjYuNHpcIixcbiAgcmlnaHRhcnJvdzogXCJNMCAyNDF2NDBoMzk5ODkxYy00Ny4zIDM1LjMtODQgNzgtMTEwIDEyOFxcbi0xNi43IDMyLTI3LjcgNjMuNy0zMyA5NSAwIDEuMy0uMiAyLjctLjUgNC0uMyAxLjMtLjUgMi4zLS41IDMgMCA3LjMgNi43IDExIDIwXFxuIDExIDggMCAxMy4yLS44IDE1LjUtMi41IDIuMy0xLjcgNC4yLTUuNSA1LjUtMTEuNSAyLTEzLjMgNS43LTI3IDExLTQxIDE0LjctNDQuN1xcbiAzOS04NC41IDczLTExOS41czczLjctNjAuMiAxMTktNzUuNWM2LTIgOS01LjcgOS0xMXMtMy05LTktMTFjLTQ1LjMtMTUuMy04NVxcbi00MC41LTExOS03NS41cy01OC4zLTc0LjgtNzMtMTE5LjVjLTQuNy0xNC04LjMtMjcuMy0xMS00MC0xLjMtNi43LTMuMi0xMC44LTUuNVxcbi0xMi41LTIuMy0xLjctNy41LTIuNS0xNS41LTIuNS0xNCAwLTIxIDMuNy0yMSAxMSAwIDIgMiAxMC4zIDYgMjUgMjAuNyA4My4zIDY3XFxuIDE1MS43IDEzOSAyMDV6bTAgMHY0MGgzOTk5MDB2LTQwelwiLFxuICByaWdodGJyYWNlOiBcIk00MDAwMDAgNTQybFxcbi02IDZoLTE3Yy0xMi43IDAtMTkuMy0uMy0yMC0xLTQtNC03LjMtOC4zLTEwLTEzLTM1LjMtNTEuMy04MC44LTkzLjgtMTM2LjUtMTI3LjVcXG5zLTExNy4yLTU1LjgtMTg0LjUtNjYuNWMtLjcgMC0yLS4zLTQtMS0xOC43LTIuNy03Ni00LjMtMTcyLTVIMFYyMTRoMzk5NTcxbDYgMVxcbmMxMjQuNyA4IDIzNSA2MS43IDMzMSAxNjEgMzEuMyAzMy4zIDU5LjcgNzIuNyA4NSAxMThsNyAxM3YzNXpcIixcbiAgcmlnaHRicmFjZXVuZGVyOiBcIk0zOTk5OTQgMGw2IDZ2MzVsLTYgMTFjLTU2IDEwNC0xMzUuMyAxODEuMy0yMzggMjMyLTU3LjNcXG4gMjguNy0xMTcgNDUtMTc5IDUwSC0zMDBWMjE0aDM5OTg5N2M0My4zLTcgODEtMTUgMTEzLTI2IDEwMC43LTMzIDE3OS43LTkxIDIzN1xcbi0xNzQgMi43LTUgNi05IDEwLTEzIC43LTEgNy4zLTEgMjAtMWgxN3pcIixcbiAgcmlnaHRncm91cDogXCJNMCA4MGgzOTk1NjVjMzcxIDAgMjY2LjcgMTQ5LjQgNDE0IDE4MCA1LjkgMS4yIDE4IDAgMTggMCAyIDBcXG4gMy0xIDMtM3YtMzhjLTc2LTE1OC0yNTctMjE5LTQzNS0yMTlIMHpcIixcbiAgcmlnaHRncm91cHVuZGVyOiBcIk0wIDI2MmgzOTk1NjVjMzcxIDAgMjY2LjctMTQ5LjQgNDE0LTE4MCA1LjktMS4yIDE4IDAgMThcXG4gMCAyIDAgMyAxIDMgM3YzOGMtNzYgMTU4LTI1NyAyMTktNDM1IDIxOUgwelwiLFxuICByaWdodGhhcnBvb246IFwiTTAgMjQxdjQwaDM5OTk5M2M0LjctNC43IDctOS4zIDctMTQgMC05LjNcXG4tMy43LTE1LjMtMTEtMTgtOTIuNy01Ni43LTE1OS0xMzMuNy0xOTktMjMxLTMuMy05LjMtNi0xNC43LTgtMTYtMi0xLjMtNy0yLTE1LTJcXG4tMTAuNyAwLTE2LjcgMi0xOCA2LTIgMi43LTEgOS43IDMgMjEgMTUuMyA0MiAzNi43IDgxLjggNjQgMTE5LjUgMjcuMyAzNy43IDU4XFxuIDY5LjIgOTIgOTQuNXptMCAwdjQwaDM5OTkwMHYtNDB6XCIsXG4gIHJpZ2h0aGFycG9vbnBsdXM6IFwiTTAgMjQxdjQwaDM5OTk5M2M0LjctNC43IDctOS4zIDctMTQgMC05LjMtMy43LTE1LjMtMTFcXG4tMTgtOTIuNy01Ni43LTE1OS0xMzMuNy0xOTktMjMxLTMuMy05LjMtNi0xNC43LTgtMTYtMi0xLjMtNy0yLTE1LTItMTAuNyAwLTE2LjdcXG4gMi0xOCA2LTIgMi43LTEgOS43IDMgMjEgMTUuMyA0MiAzNi43IDgxLjggNjQgMTE5LjUgMjcuMyAzNy43IDU4IDY5LjIgOTIgOTQuNXpcXG5tMCAwdjQwaDM5OTkwMHYtNDB6IG0xMDAgMTk0djQwaDM5OTkwMHYtNDB6bTAgMHY0MGgzOTk5MDB2LTQwelwiLFxuICByaWdodGhhcnBvb25kb3duOiBcIk0zOTk3NDcgNTExYzAgNy4zIDYuNyAxMSAyMCAxMSA4IDAgMTMtLjggMTUtMi41czQuNy02LjhcXG4gOC0xNS41YzQwLTk0IDk5LjMtMTY2LjMgMTc4LTIxNyAxMy4zLTggMjAuMy0xMi4zIDIxLTEzIDUuMy0zLjMgOC41LTUuOCA5LjVcXG4tNy41IDEtMS43IDEuNS01LjIgMS41LTEwLjVzLTIuMy0xMC4zLTctMTVIMHY0MGgzOTk5MDhjLTM0IDI1LjMtNjQuNyA1Ny05MiA5NVxcbi0yNy4zIDM4LTQ4LjcgNzcuNy02NCAxMTktMy4zIDguNy01IDE0LTUgMTZ6TTAgMjQxdjQwaDM5OTkwMHYtNDB6XCIsXG4gIHJpZ2h0aGFycG9vbmRvd25wbHVzOiBcIk0zOTk3NDcgNzA1YzAgNy4zIDYuNyAxMSAyMCAxMSA4IDAgMTMtLjhcXG4gMTUtMi41czQuNy02LjggOC0xNS41YzQwLTk0IDk5LjMtMTY2LjMgMTc4LTIxNyAxMy4zLTggMjAuMy0xMi4zIDIxLTEzIDUuMy0zLjNcXG4gOC41LTUuOCA5LjUtNy41IDEtMS43IDEuNS01LjIgMS41LTEwLjVzLTIuMy0xMC4zLTctMTVIMHY0MGgzOTk5MDhjLTM0IDI1LjNcXG4tNjQuNyA1Ny05MiA5NS0yNy4zIDM4LTQ4LjcgNzcuNy02NCAxMTktMy4zIDguNy01IDE0LTUgMTZ6TTAgNDM1djQwaDM5OTkwMHYtNDB6XFxubTAtMTk0djQwaDQwMDAwMHYtNDB6bTAgMHY0MGg0MDAwMDB2LTQwelwiLFxuICByaWdodGhvb2s6IFwiTTM5OTg1OSAyNDFjLTc2NCAwIDAgMCAwIDAgNDAtMy4zIDY4LjctMTUuNyA4Ni0zNyAxMC0xMiAxNS0yNS4zXFxuIDE1LTQwIDAtMjIuNy05LjgtNDAuNy0yOS41LTU0LTE5LjctMTMuMy00My41LTIxLTcxLjUtMjMtMTcuMy0xLjMtMjYtOC0yNi0yMCAwXFxuLTEzLjMgOC43LTIwIDI2LTIwIDM4IDAgNzEgMTEuMiA5OSAzMy41IDAgMCA3IDUuNiAyMSAxNi43IDE0IDExLjIgMjEgMzMuNSAyMVxcbiA2Ni44cy0xNCA2MS4yLTQyIDgzLjVjLTI4IDIyLjMtNjEgMzMuNS05OSAzMy41TDAgMjQxeiBNMCAyODF2LTQwaDM5OTg1OXY0MHpcIixcbiAgcmlnaHRsaW5lc2VnbWVudDogXCJNMzk5OTYwIDI0MSBWOTQgaDQwIFY0MjggaC00MCBWMjgxIEgwIHYtNDB6XFxuTTM5OTk2MCAyNDEgVjk0IGg0MCBWNDI4IGgtNDAgVjI4MSBIMCB2LTQwelwiLFxuICByaWdodFRvRnJvbTogXCJNNDAwMDAwIDE2N2MtNzAuNy00Mi0xMTgtOTcuNy0xNDItMTY3aC0yM2MtMTUuMyAwLTIzIC4zLTIzXFxuIDEgMCAxLjMgNS4zIDEzLjcgMTYgMzcgMTggMzUuMyA0MS4zIDY5IDcwIDEwMWw3IDhIMHY0MGgzOTk5MDVsLTcgOGMtMjguNyAzMlxcbi01MiA2NS43LTcwIDEwMS0xMC43IDIzLjMtMTYgMzUuNy0xNiAzNyAwIC43IDcuNyAxIDIzIDFoMjNjMjQtNjkuMyA3MS4zLTEyNSAxNDJcXG4tMTY3eiBNMTAwIDE0N3Y0MGgzOTk5MDB2LTQwek0wIDM0MXY0MGgzOTk5MDB2LTQwelwiLFxuICAvLyB0d29oZWFkbGVmdGFycm93IGlzIGZyb20gZ2x5cGggVSsyMTlFIGluIGZvbnQgS2FUZVggQU1TIFJlZ3VsYXJcbiAgdHdvaGVhZGxlZnRhcnJvdzogXCJNMCAxNjdjNjggNDBcXG4gMTE1LjcgOTUuNyAxNDMgMTY3aDIyYzE1LjMgMCAyMy0uMyAyMy0xIDAtMS4zLTUuMy0xMy43LTE2LTM3LTE4LTM1LjMtNDEuMy02OVxcbi03MC0xMDFsLTctOGgxMjVsOSA3YzUwLjcgMzkuMyA4NSA4NiAxMDMgMTQwaDQ2YzAtNC43LTYuMy0xOC43LTE5LTQyLTE4LTM1LjNcXG4tNDAtNjcuMy02Ni05NmwtOS05aDM5OTcxNnYtNDBIMjg0bDktOWMyNi0yOC43IDQ4LTYwLjcgNjYtOTYgMTIuNy0yMy4zMzMgMTlcXG4tMzcuMzMzIDE5LTQyaC00NmMtMTggNTQtNTIuMyAxMDAuNy0xMDMgMTQwbC05IDdIOTVsNy04YzI4LjctMzIgNTItNjUuNyA3MC0xMDFcXG4gMTAuNy0yMy4zMzMgMTYtMzUuNyAxNi0zNyAwLS43LTcuNy0xLTIzLTFoLTIyQzExNS43IDcxLjMgNjggMTI3IDAgMTY3elwiLFxuICB0d29oZWFkcmlnaHRhcnJvdzogXCJNNDAwMDAwIDE2N1xcbmMtNjgtNDAtMTE1LjctOTUuNy0xNDMtMTY3aC0yMmMtMTUuMyAwLTIzIC4zLTIzIDEgMCAxLjMgNS4zIDEzLjcgMTYgMzcgMTggMzUuM1xcbiA0MS4zIDY5IDcwIDEwMWw3IDhoLTEyNWwtOS03Yy01MC43LTM5LjMtODUtODYtMTAzLTE0MGgtNDZjMCA0LjcgNi4zIDE4LjcgMTkgNDJcXG4gMTggMzUuMyA0MCA2Ny4zIDY2IDk2bDkgOUgwdjQwaDM5OTcxNmwtOSA5Yy0yNiAyOC43LTQ4IDYwLjctNjYgOTYtMTIuNyAyMy4zMzNcXG4tMTkgMzcuMzMzLTE5IDQyaDQ2YzE4LTU0IDUyLjMtMTAwLjcgMTAzLTE0MGw5LTdoMTI1bC03IDhjLTI4LjcgMzItNTIgNjUuNy03MFxcbiAxMDEtMTAuNyAyMy4zMzMtMTYgMzUuNy0xNiAzNyAwIC43IDcuNyAxIDIzIDFoMjJjMjcuMy03MS4zIDc1LTEyNyAxNDMtMTY3elwiLFxuICAvLyB0aWxkZTEgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGEgZ2x5cGggZnJvbSB0aGUgTW5TeW1ib2wgcGFja2FnZVxuICB0aWxkZTE6IFwiTTIwMCA1NS41MzhjLTc3IDAtMTY4IDczLjk1My0xNzcgNzMuOTUzLTMgMC03XFxuLTIuMTc1LTktNS40MzdMMiA5N2MtMS0yLTItNC0yLTYgMC00IDItNyA1LTlsMjAtMTJDMTE2IDEyIDE3MSAwIDIwNyAwYzg2IDBcXG4gMTE0IDY4IDE5MSA2OCA3OCAwIDE2OC02OCAxNzctNjggNCAwIDcgMiA5IDVsMTIgMTljMSAyLjE3NSAyIDQuMzUgMiA2LjUyNSAwXFxuIDQuMzUtMiA3LjYxMy01IDkuNzg4bC0xOSAxMy4wNWMtOTIgNjMuMDc3LTExNi45MzcgNzUuMzA4LTE4MyA3Ni4xMjhcXG4tNjguMjY3Ljg0Ny0xMTMtNzMuOTUyLTE5MS03My45NTJ6XCIsXG4gIC8vIGRpdHRvIHRpbGRlMiwgdGlsZGUzLCAmIHRpbGRlNFxuICB0aWxkZTI6IFwiTTM0NCA1NS4yNjZjLTE0MiAwLTMwMC42MzggODEuMzE2LTMxMS41IDg2LjQxOFxcbi04LjAxIDMuNzYyLTIyLjUgMTAuOTEtMjMuNSA1LjU2MkwxIDEyMGMtMS0yLTEtMy0xLTQgMC01IDMtOSA4LTEwbDE4LjQtOUMxNjAuOVxcbiAzMS45IDI4MyAwIDM1OCAwYzE0OCAwIDE4OCAxMjIgMzMxIDEyMnMzMTQtOTcgMzI2LTk3YzQgMCA4IDIgMTAgN2w3IDIxLjExNFxcbmMxIDIuMTQgMSAzLjIxIDEgNC4yOCAwIDUuMzQ3LTMgOS42MjYtNyAxMC42OTZsLTIyLjMgMTIuNjIyQzg1Mi42IDE1OC4zNzIgNzUxXFxuIDE4MS40NzYgNjc2IDE4MS40NzZjLTE0OSAwLTE4OS0xMjYuMjEtMzMyLTEyNi4yMXpcIixcbiAgdGlsZGUzOiBcIk03ODYgNTlDNDU3IDU5IDMyIDE3NS4yNDIgMTMgMTc1LjI0MmMtNiAwLTEwLTMuNDU3XFxuLTExLTEwLjM3TC4xNSAxMzhjLTEtNyAzLTEyIDEwLTEzbDE5LjItNi40QzM3OC40IDQwLjcgNjM0LjMgMCA4MDQuMyAwYzMzNyAwXFxuIDQxMS44IDE1NyA3NDYuOCAxNTcgMzI4IDAgNzU0LTExMiA3NzMtMTEyIDUgMCAxMCAzIDExIDlsMSAxNC4wNzVjMSA4LjA2Ni0uNjk3XFxuIDE2LjU5NS02LjY5NyAxNy40OTJsLTIxLjA1MiA3LjMxYy0zNjcuOSA5OC4xNDYtNjA5LjE1IDEyMi42OTYtNzc4LjE1IDEyMi42OTZcXG4gLTMzOCAwLTQwOS0xNTYuNTczLTc0NC0xNTYuNTczelwiLFxuICB0aWxkZTQ6IFwiTTc4NiA1OEM0NTcgNTggMzIgMTc3LjQ4NyAxMyAxNzcuNDg3Yy02IDAtMTAtMy4zNDVcXG4tMTEtMTAuMDM1TC4xNSAxNDNjLTEtNyAzLTEyIDEwLTEzbDIyLTYuN0MzODEuMiAzNSA2MzcuMTUgMCA4MDcuMTUgMGMzMzcgMCA0MDlcXG4gMTc3IDc0NCAxNzcgMzI4IDAgNzU0LTEyNyA3NzMtMTI3IDUgMCAxMCAzIDExIDlsMSAxNC43OTRjMSA3LjgwNS0zIDEzLjM4LTlcXG4gMTQuNDk1bC0yMC43IDUuNTc0Yy0zNjYuODUgOTkuNzktNjA3LjMgMTM5LjM3Mi03NzYuMyAxMzkuMzcyLTMzOCAwLTQwOVxcbiAtMTc1LjIzNi03NDQtMTc1LjIzNnpcIixcbiAgLy8gdmVjIGlzIGZyb20gZ2x5cGggVSsyMEQ3IGluIGZvbnQgS2FUZVggTWFpblxuICB2ZWM6IFwiTTM3NyAyMGMwLTUuMzMzIDEuODMzLTEwIDUuNS0xNFMzOTEgMCAzOTcgMGM0LjY2NyAwIDguNjY3IDEuNjY3IDEyIDVcXG4zLjMzMyAyLjY2NyA2LjY2NyA5IDEwIDE5IDYuNjY3IDI0LjY2NyAyMC4zMzMgNDMuNjY3IDQxIDU3IDcuMzMzIDQuNjY3IDExXFxuMTAuNjY3IDExIDE4IDAgNi0xIDEwLTMgMTJzLTYuNjY3IDUtMTQgOWMtMjguNjY3IDE0LjY2Ny01My42NjcgMzUuNjY3LTc1IDYzXFxuLTEuMzMzIDEuMzMzLTMuMTY3IDMuNS01LjUgNi41cy00IDQuODMzLTUgNS41Yy0xIC42NjctMi41IDEuMzMzLTQuNSAycy00LjMzMyAxXFxuLTcgMWMtNC42NjcgMC05LjE2Ny0xLjgzMy0xMy41LTUuNVMzMzcgMTg0IDMzNyAxNzhjMC0xMi42NjcgMTUuNjY3LTMyLjMzMyA0Ny01OVxcbkgyMTNsLTE3MS0xYy04LjY2Ny02LTEzLTEyLjMzMy0xMy0xOSAwLTQuNjY3IDQuMzMzLTExLjMzMyAxMy0yMGgzNTlcXG5jLTE2LTI1LjMzMy0yNC00NS0yNC01OXpcIixcbiAgLy8gd2lkZWhhdDEgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGEgZ2x5cGggZnJvbSB0aGUgTW5TeW1ib2wgcGFja2FnZVxuICB3aWRlaGF0MTogXCJNNTI5IDBoNWw1MTkgMTE1YzUgMSA5IDUgOSAxMCAwIDEtMSAyLTEgM2wtNCAyMlxcbmMtMSA1LTUgOS0xMSA5aC0yTDUzMiA2NyAxOSAxNTloLTJjLTUgMC05LTQtMTEtOWwtNS0yMmMtMS02IDItMTIgOC0xM3pcIixcbiAgLy8gZGl0dG8gd2lkZWhhdDIsIHdpZGVoYXQzLCAmIHdpZGVoYXQ0XG4gIHdpZGVoYXQyOiBcIk0xMTgxIDBoMmwxMTcxIDE3NmM2IDAgMTAgNSAxMCAxMWwtMiAyM2MtMSA2LTUgMTBcXG4tMTEgMTBoLTFMMTE4MiA2NyAxNSAyMjBoLTFjLTYgMC0xMC00LTExLTEwbC0yLTIzYy0xLTYgNC0xMSAxMC0xMXpcIixcbiAgd2lkZWhhdDM6IFwiTTExODEgMGgybDExNzEgMjM2YzYgMCAxMCA1IDEwIDExbC0yIDIzYy0xIDYtNSAxMFxcbi0xMSAxMGgtMUwxMTgyIDY3IDE1IDI4MGgtMWMtNiAwLTEwLTQtMTEtMTBsLTItMjNjLTEtNiA0LTExIDEwLTExelwiLFxuICB3aWRlaGF0NDogXCJNMTE4MSAwaDJsMTE3MSAyOTZjNiAwIDEwIDUgMTAgMTFsLTIgMjNjLTEgNi01IDEwXFxuLTExIDEwaC0xTDExODIgNjcgMTUgMzQwaC0xYy02IDAtMTAtNC0xMS0xMGwtMi0yM2MtMS02IDQtMTEgMTAtMTF6XCIsXG4gIC8vIHdpZGVjaGVjayBwYXRocyBhcmUgYWxsIGludmVydGVkIHZlcnNpb25zIG9mIHdpZGVoYXRcbiAgd2lkZWNoZWNrMTogXCJNNTI5LDE1OWg1bDUxOSwtMTE1YzUsLTEsOSwtNSw5LC0xMGMwLC0xLC0xLC0yLC0xLC0zbC00LC0yMmMtMSxcXG4tNSwtNSwtOSwtMTEsLTloLTJsLTUxMiw5MmwtNTEzLC05MmgtMmMtNSwwLC05LDQsLTExLDlsLTUsMjJjLTEsNiwyLDEyLDgsMTN6XCIsXG4gIHdpZGVjaGVjazI6IFwiTTExODEsMjIwaDJsMTE3MSwtMTc2YzYsMCwxMCwtNSwxMCwtMTFsLTIsLTIzYy0xLC02LC01LC0xMCxcXG4tMTEsLTEwaC0xbC0xMTY4LDE1M2wtMTE2NywtMTUzaC0xYy02LDAsLTEwLDQsLTExLDEwbC0yLDIzYy0xLDYsNCwxMSwxMCwxMXpcIixcbiAgd2lkZWNoZWNrMzogXCJNMTE4MSwyODBoMmwxMTcxLC0yMzZjNiwwLDEwLC01LDEwLC0xMWwtMiwtMjNjLTEsLTYsLTUsLTEwLFxcbi0xMSwtMTBoLTFsLTExNjgsMjEzbC0xMTY3LC0yMTNoLTFjLTYsMCwtMTAsNCwtMTEsMTBsLTIsMjNjLTEsNiw0LDExLDEwLDExelwiLFxuICB3aWRlY2hlY2s0OiBcIk0xMTgxLDM0MGgybDExNzEsLTI5NmM2LDAsMTAsLTUsMTAsLTExbC0yLC0yM2MtMSwtNiwtNSwtMTAsXFxuLTExLC0xMGgtMWwtMTE2OCwyNzNsLTExNjcsLTI3M2gtMWMtNiwwLC0xMCw0LC0xMSwxMGwtMiwyM2MtMSw2LDQsMTEsMTAsMTF6XCIsXG4gIC8vIFRoZSBuZXh0IHRlbiBwYXRocyBzdXBwb3J0IHJlYWN0aW9uIGFycm93cyBmcm9tIHRoZSBtaGNoZW0gcGFja2FnZS5cbiAgLy8gQXJyb3dzIGZvciBcXGNlezwtLT59IGFyZSBvZmZzZXQgZnJvbSB4QXhpcyBieSAwLjIyZXgsIHBlciBtaGNoZW0gaW4gTGFUZVhcbiAgLy8gYmFyYWJvdmVsZWZ0YXJyb3cgaXMgbW9zdGx5IGZyb20gZnJvbSBnbHlwaCBVKzIxOTAgaW4gZm9udCBLYVRlWCBNYWluXG4gIGJhcmFib3ZlbGVmdGFycm93OiBcIk00MDAwMDAgNjIwaC0zOTk4OTBsMyAtM2M2OC43IC01Mi43IDExMy43IC0xMjAgMTM1IC0yMDJcXG5jNCAtMTQuNyA2IC0yMyA2IC0yNWMwIC03LjMgLTcgLTExIC0yMSAtMTFjLTggMCAtMTMuMiAwLjggLTE1LjUgMi41XFxuYy0yLjMgMS43IC00LjIgNS44IC01LjUgMTIuNWMtMS4zIDQuNyAtMi43IDEwLjMgLTQgMTdjLTEyIDQ4LjcgLTM0LjggOTIgLTY4LjUgMTMwXFxucy03NC4yIDY2LjMgLTEyMS41IDg1Yy0xMCA0IC0xNiA3LjcgLTE4IDExYzAgOC43IDYgMTQuMyAxOCAxN2M0Ny4zIDE4LjcgODcuOCA0N1xcbjEyMS41IDg1czU2LjUgODEuMyA2OC41IDEzMGMwLjcgMiAxLjMgNSAyIDlzMS4yIDYuNyAxLjUgOGMwLjMgMS4zIDEgMy4zIDIgNlxcbnMyLjIgNC41IDMuNSA1LjVjMS4zIDEgMy4zIDEuOCA2IDIuNXM2IDEgMTAgMWMxNCAwIDIxIC0zLjcgMjEgLTExXFxuYzAgLTIgLTIgLTEwLjMgLTYgLTI1Yy0yMCAtNzkuMyAtNjUgLTE0Ni43IC0xMzUgLTIwMmwtMyAtM2gzOTk4OTB6XFxuTTEwMCA2MjB2NDBoMzk5OTAwdi00MHogTTAgMjQxdjQwaDM5OTkwMHYtNDB6TTAgMjQxdjQwaDM5OTkwMHYtNDB6XCIsXG4gIC8vIHJpZ2h0YXJyb3dhYm92ZWJhciBpcyBtb3N0bHkgZnJvbSBnbHlwaCBVKzIxOTIsIEthVGVYIE1haW5cbiAgcmlnaHRhcnJvd2Fib3ZlYmFyOiBcIk0wIDI0MXY0MGgzOTk4OTFjLTQ3LjMgMzUuMy04NCA3OC0xMTAgMTI4LTE2LjcgMzJcXG4tMjcuNyA2My43LTMzIDk1IDAgMS4zLS4yIDIuNy0uNSA0LS4zIDEuMy0uNSAyLjMtLjUgMyAwIDcuMyA2LjcgMTEgMjAgMTEgOCAwXFxuMTMuMi0uOCAxNS41LTIuNSAyLjMtMS43IDQuMi01LjUgNS41LTExLjUgMi0xMy4zIDUuNy0yNyAxMS00MSAxNC43LTQ0LjcgMzlcXG4tODQuNSA3My0xMTkuNXM3My43LTYwLjIgMTE5LTc1LjVjNi0yIDktNS43IDktMTFzLTMtOS05LTExYy00NS4zLTE1LjMtODUtNDAuNVxcbi0xMTktNzUuNXMtNTguMy03NC44LTczLTExOS41Yy00LjctMTQtOC4zLTI3LjMtMTEtNDAtMS4zLTYuNy0zLjItMTAuOC01LjVcXG4tMTIuNS0yLjMtMS43LTcuNS0yLjUtMTUuNS0yLjUtMTQgMC0yMSAzLjctMjEgMTEgMCAyIDIgMTAuMyA2IDI1IDIwLjcgODMuMyA2N1xcbjE1MS43IDEzOSAyMDV6bTk2IDM3OWgzOTk4OTR2NDBIMHptMCAwaDM5OTkwNHY0MEgwelwiLFxuICAvLyBUaGUgc2hvcnQgbGVmdCBoYXJwb29uIGhhcyAwLjVlbSAoaS5lLiA1MDAgdW5pdHMpIGtlcm4gb24gdGhlIGxlZnQgZW5kLlxuICAvLyBSZWYgZnJvbSBtaGNoZW0uc3R5OiBcXHJsYXB7XFxyYWlzZWJveHstLjIyZXh9eyRcXGtlcm4wLjVlbVxuICBiYXJhYm92ZXNob3J0bGVmdGhhcnBvb246IFwiTTUwNyw0MzVjLTQsNCwtNi4zLDguNywtNywxNGMwLDUuMywwLjcsOSwyLDExXFxuYzEuMywyLDUuMyw1LjMsMTIsMTBjOTAuNyw1NCwxNTYsMTMwLDE5NiwyMjhjMy4zLDEwLjcsNi4zLDE2LjMsOSwxN1xcbmMyLDAuNyw1LDEsOSwxYzAsMCw1LDAsNSwwYzEwLjcsMCwxNi43LC0yLDE4LC02YzIsLTIuNywxLC05LjcsLTMsLTIxXFxuYy0zMiwtODcuMywtODIuNywtMTU3LjcsLTE1MiwtMjExYzAsMCwtMywtMywtMywtM2wzOTkzNTEsMGwwLC00MFxcbmMtMzk4NTcwLDAsLTM5OTQzNywwLC0zOTk0MzcsMHogTTU5MyA0MzUgdjQwIEgzOTk1MDAgdi00MHpcXG5NMCAyODEgdi00MCBIMzk5OTA4IHY0MHogTTAgMjgxIHYtNDAgSDM5OTkwOCB2NDB6XCIsXG4gIHJpZ2h0aGFycG9vbmFib3Zlc2hvcnRiYXI6IFwiTTAsMjQxIGwwLDQwYzM5OTEyNiwwLDM5OTk5MywwLDM5OTk5MywwXFxuYzQuNywtNC43LDcsLTkuMyw3LC0xNGMwLC05LjMsLTMuNywtMTUuMywtMTEsLTE4Yy05Mi43LC01Ni43LC0xNTksLTEzMy43LC0xOTksXFxuLTIzMWMtMy4zLC05LjMsLTYsLTE0LjcsLTgsLTE2Yy0yLC0xLjMsLTcsLTIsLTE1LC0yYy0xMC43LDAsLTE2LjcsMiwtMTgsNlxcbmMtMiwyLjcsLTEsOS43LDMsMjFjMTUuMyw0MiwzNi43LDgxLjgsNjQsMTE5LjVjMjcuMywzNy43LDU4LDY5LjIsOTIsOTQuNXpcXG5NMCAyNDEgdjQwIEgzOTk5MDggdi00MHogTTAgNDc1IHYtNDAgSDM5OTUwMCB2NDB6IE0wIDQ3NSB2LTQwIEgzOTk1MDAgdjQwelwiLFxuICBzaG9ydGJhcmFib3ZlbGVmdGhhcnBvb246IFwiTTcsNDM1Yy00LDQsLTYuMyw4LjcsLTcsMTRjMCw1LjMsMC43LDksMiwxMVxcbmMxLjMsMiw1LjMsNS4zLDEyLDEwYzkwLjcsNTQsMTU2LDEzMCwxOTYsMjI4YzMuMywxMC43LDYuMywxNi4zLDksMTdjMiwwLjcsNSwxLDksXFxuMWMwLDAsNSwwLDUsMGMxMC43LDAsMTYuNywtMiwxOCwtNmMyLC0yLjcsMSwtOS43LC0zLC0yMWMtMzIsLTg3LjMsLTgyLjcsLTE1Ny43LFxcbi0xNTIsLTIxMWMwLDAsLTMsLTMsLTMsLTNsMzk5OTA3LDBsMCwtNDBjLTM5OTEyNiwwLC0zOTk5OTMsMCwtMzk5OTkzLDB6XFxuTTkzIDQzNSB2NDAgSDQwMDAwMCB2LTQweiBNNTAwIDI0MSB2NDAgSDQwMDAwMCB2LTQweiBNNTAwIDI0MSB2NDAgSDQwMDAwMCB2LTQwelwiLFxuICBzaG9ydHJpZ2h0aGFycG9vbmFib3ZlYmFyOiBcIk01MywyNDFsMCw0MGMzOTg1NzAsMCwzOTk0MzcsMCwzOTk0MzcsMFxcbmM0LjcsLTQuNyw3LC05LjMsNywtMTRjMCwtOS4zLC0zLjcsLTE1LjMsLTExLC0xOGMtOTIuNywtNTYuNywtMTU5LC0xMzMuNywtMTk5LFxcbi0yMzFjLTMuMywtOS4zLC02LC0xNC43LC04LC0xNmMtMiwtMS4zLC03LC0yLC0xNSwtMmMtMTAuNywwLC0xNi43LDIsLTE4LDZcXG5jLTIsMi43LC0xLDkuNywzLDIxYzE1LjMsNDIsMzYuNyw4MS44LDY0LDExOS41YzI3LjMsMzcuNyw1OCw2OS4yLDkyLDk0LjV6XFxuTTUwMCAyNDEgdjQwIEgzOTk0MDggdi00MHogTTUwMCA0MzUgdjQwIEg0MDAwMDAgdi00MHpcIlxufTtcbnZhciB0YWxsRGVsaW0gPSBmdW5jdGlvbiB0YWxsRGVsaW0obGFiZWwsIG1pZEhlaWdodCkge1xuICBzd2l0Y2ggKGxhYmVsKSB7XG4gICAgY2FzZSBcImxicmFja1wiOlxuICAgICAgcmV0dXJuIFwiTTQwMyAxNzU5IFY4NCBINjY2IFYwIEgzMTkgVjE3NTkgdlwiICsgbWlkSGVpZ2h0ICsgXCIgdjE3NTkgaDM0NyB2LTg0XFxuSDQwM3ogTTQwMyAxNzU5IFYwIEgzMTkgVjE3NTkgdlwiICsgbWlkSGVpZ2h0ICsgXCIgdjE3NTkgaDg0elwiO1xuXG4gICAgY2FzZSBcInJicmFja1wiOlxuICAgICAgcmV0dXJuIFwiTTM0NyAxNzU5IFYwIEgwIFY4NCBIMjYzIFYxNzU5IHZcIiArIG1pZEhlaWdodCArIFwiIHYxNzU5IEgwIHY4NCBIMzQ3elxcbk0zNDcgMTc1OSBWMCBIMjYzIFYxNzU5IHZcIiArIG1pZEhlaWdodCArIFwiIHYxNzU5IGg4NHpcIjtcblxuICAgIGNhc2UgXCJ2ZXJ0XCI6XG4gICAgICByZXR1cm4gXCJNMTQ1IDE1IHY1ODUgdlwiICsgbWlkSGVpZ2h0ICsgXCIgdjU4NSBjMi42NjcsMTAsOS42NjcsMTUsMjEsMTVcXG5jMTAsMCwxNi42NjcsLTUsMjAsLTE1IHYtNTg1IHZcIiArIC1taWRIZWlnaHQgKyBcIiB2LTU4NSBjLTIuNjY3LC0xMCwtOS42NjcsLTE1LC0yMSwtMTVcXG5jLTEwLDAsLTE2LjY2Nyw1LC0yMCwxNXogTTE4OCAxNSBIMTQ1IHY1ODUgdlwiICsgbWlkSGVpZ2h0ICsgXCIgdjU4NSBoNDN6XCI7XG5cbiAgICBjYXNlIFwiZG91YmxldmVydFwiOlxuICAgICAgcmV0dXJuIFwiTTE0NSAxNSB2NTg1IHZcIiArIG1pZEhlaWdodCArIFwiIHY1ODUgYzIuNjY3LDEwLDkuNjY3LDE1LDIxLDE1XFxuYzEwLDAsMTYuNjY3LC01LDIwLC0xNSB2LTU4NSB2XCIgKyAtbWlkSGVpZ2h0ICsgXCIgdi01ODUgYy0yLjY2NywtMTAsLTkuNjY3LC0xNSwtMjEsLTE1XFxuYy0xMCwwLC0xNi42NjcsNSwtMjAsMTV6IE0xODggMTUgSDE0NSB2NTg1IHZcIiArIG1pZEhlaWdodCArIFwiIHY1ODUgaDQzelxcbk0zNjcgMTUgdjU4NSB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2NTg1IGMyLjY2NywxMCw5LjY2NywxNSwyMSwxNVxcbmMxMCwwLDE2LjY2NywtNSwyMCwtMTUgdi01ODUgdlwiICsgLW1pZEhlaWdodCArIFwiIHYtNTg1IGMtMi42NjcsLTEwLC05LjY2NywtMTUsLTIxLC0xNVxcbmMtMTAsMCwtMTYuNjY3LDUsLTIwLDE1eiBNNDEwIDE1IEgzNjcgdjU4NSB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2NTg1IGg0M3pcIjtcblxuICAgIGNhc2UgXCJsZmxvb3JcIjpcbiAgICAgIHJldHVybiBcIk0zMTkgNjAyIFYwIEg0MDMgVjYwMiB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2MTcxNSBoMjYzIHY4NCBIMzE5elxcbk1NMzE5IDYwMiBWMCBINDAzIFY2MDIgdlwiICsgbWlkSGVpZ2h0ICsgXCIgdjE3MTUgSDMxOXpcIjtcblxuICAgIGNhc2UgXCJyZmxvb3JcIjpcbiAgICAgIHJldHVybiBcIk0zMTkgNjAyIFYwIEg0MDMgVjYwMiB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2MTc5OSBIMCB2LTg0IEgzMTl6XFxuTU0zMTkgNjAyIFYwIEg0MDMgVjYwMiB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2MTcxNSBIMzE5elwiO1xuXG4gICAgY2FzZSBcImxjZWlsXCI6XG4gICAgICByZXR1cm4gXCJNNDAzIDE3NTkgVjg0IEg2NjYgVjAgSDMxOSBWMTc1OSB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2NjAyIGg4NHpcXG5NNDAzIDE3NTkgVjAgSDMxOSBWMTc1OSB2XCIgKyBtaWRIZWlnaHQgKyBcIiB2NjAyIGg4NHpcIjtcblxuICAgIGNhc2UgXCJyY2VpbFwiOlxuICAgICAgcmV0dXJuIFwiTTM0NyAxNzU5IFYwIEgwIFY4NCBIMjYzIFYxNzU5IHZcIiArIG1pZEhlaWdodCArIFwiIHY2MDIgaDg0elxcbk0zNDcgMTc1OSBWMCBoLTg0IFYxNzU5IHZcIiArIG1pZEhlaWdodCArIFwiIHY2MDIgaDg0elwiO1xuXG4gICAgY2FzZSBcImxwYXJlblwiOlxuICAgICAgcmV0dXJuIFwiTTg2Myw5YzAsLTIsLTIsLTUsLTYsLTljMCwwLC0xNywwLC0xNywwYy0xMi43LDAsLTE5LjMsMC4zLC0yMCwxXFxuYy01LjMsNS4zLC0xMC4zLDExLC0xNSwxN2MtMjQyLjcsMjk0LjcsLTM5NS4zLDY4MiwtNDU4LDExNjJjLTIxLjMsMTYzLjMsLTMzLjMsMzQ5LFxcbi0zNiw1NTcgbDAsXCIgKyAobWlkSGVpZ2h0ICsgODQpICsgXCJjMC4yLDYsMCwyNiwwLDYwYzIsMTU5LjMsMTAsMzEwLjcsMjQsNDU0YzUzLjMsNTI4LDIxMCxcXG45NDkuNyw0NzAsMTI2NWM0LjcsNiw5LjcsMTEuNywxNSwxN2MwLjcsMC43LDcsMSwxOSwxYzAsMCwxOCwwLDE4LDBjNCwtNCw2LC03LDYsLTlcXG5jMCwtMi43LC0zLjMsLTguNywtMTAsLTE4Yy0xMzUuMywtMTkyLjcsLTIzNS41LC00MTQuMywtMzAwLjUsLTY2NWMtNjUsLTI1MC43LC0xMDIuNSxcXG4tNTQ0LjcsLTExMi41LC04ODJjLTIsLTEwNCwtMywtMTY3LC0zLC0xODlcXG5sMCwtXCIgKyAobWlkSGVpZ2h0ICsgOTIpICsgXCJjMCwtMTYyLjcsNS43LC0zMTQsMTcsLTQ1NGMyMC43LC0yNzIsNjMuNywtNTEzLDEyOSwtNzIzYzY1LjMsXFxuLTIxMCwxNTUuMywtMzk2LjMsMjcwLC01NTljNi43LC05LjMsMTAsLTE1LjMsMTAsLTE4elwiO1xuXG4gICAgY2FzZSBcInJwYXJlblwiOlxuICAgICAgcmV0dXJuIFwiTTc2LDBjLTE2LjcsMCwtMjUsMywtMjUsOWMwLDIsMiw2LjMsNiwxM2MyMS4zLDI4LjcsNDIuMyw2MC4zLFxcbjYzLDk1Yzk2LjcsMTU2LjcsMTcyLjgsMzMyLjUsMjI4LjUsNTI3LjVjNTUuNywxOTUsOTIuOCw0MTYuNSwxMTEuNSw2NjQuNVxcbmMxMS4zLDEzOS4zLDE3LDI5MC43LDE3LDQ1NGMwLDI4LDEuNyw0MywzLjMsNDVsMCxcIiArIChtaWRIZWlnaHQgKyA5KSArIFwiXFxuYy0zLDQsLTMuMywxNi43LC0zLjMsMzhjMCwxNjIsLTUuNywzMTMuNywtMTcsNDU1Yy0xOC43LDI0OCwtNTUuOCw0NjkuMywtMTExLjUsNjY0XFxuYy01NS43LDE5NC43LC0xMzEuOCwzNzAuMywtMjI4LjUsNTI3Yy0yMC43LDM0LjcsLTQxLjcsNjYuMywtNjMsOTVjLTIsMy4zLC00LDcsLTYsMTFcXG5jMCw3LjMsNS43LDExLDE3LDExYzAsMCwxMSwwLDExLDBjOS4zLDAsMTQuMywtMC4zLDE1LC0xYzUuMywtNS4zLDEwLjMsLTExLDE1LC0xN1xcbmMyNDIuNywtMjk0LjcsMzk1LjMsLTY4MS43LDQ1OCwtMTE2MWMyMS4zLC0xNjQuNywzMy4zLC0zNTAuNywzNiwtNTU4XFxubDAsLVwiICsgKG1pZEhlaWdodCArIDE0NCkgKyBcImMtMiwtMTU5LjMsLTEwLC0zMTAuNywtMjQsLTQ1NGMtNTMuMywtNTI4LC0yMTAsLTk0OS43LFxcbi00NzAsLTEyNjVjLTQuNywtNiwtOS43LC0xMS43LC0xNSwtMTdjLTAuNywtMC43LC02LjcsLTEsLTE4LC0xelwiO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFdlIHNob3VsZCBub3QgZXZlciBnZXQgaGVyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gc3RyZXRjaHkgZGVsaW1pdGVyLlwiKTtcbiAgfVxufTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy90cmVlLmpzXG5cblxuLyoqXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIGRvY3VtZW50IGZyYWdtZW50LCB3aGljaCBjb250YWlucyBlbGVtZW50cywgYnV0IHdoZW5cbiAqIHBsYWNlZCBpbnRvIHRoZSBET00gZG9lc24ndCBoYXZlIGFueSByZXByZXNlbnRhdGlvbiBpdHNlbGYuIEl0IG9ubHkgY29udGFpbnNcbiAqIGNoaWxkcmVuIGFuZCBkb2Vzbid0IGhhdmUgYW55IERPTSBub2RlIHByb3BlcnRpZXMuXG4gKi9cbnZhciBEb2N1bWVudEZyYWdtZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLy8gSHRtbERvbU5vZGVcbiAgLy8gTmV2ZXIgdXNlZDsgbmVlZGVkIGZvciBzYXRpc2Z5aW5nIGludGVyZmFjZS5cbiAgZnVuY3Rpb24gRG9jdW1lbnRGcmFnbWVudChjaGlsZHJlbikge1xuICAgIHRoaXMuY2hpbGRyZW4gPSB2b2lkIDA7XG4gICAgdGhpcy5jbGFzc2VzID0gdm9pZCAwO1xuICAgIHRoaXMuaGVpZ2h0ID0gdm9pZCAwO1xuICAgIHRoaXMuZGVwdGggPSB2b2lkIDA7XG4gICAgdGhpcy5tYXhGb250U2l6ZSA9IHZvaWQgMDtcbiAgICB0aGlzLnN0eWxlID0gdm9pZCAwO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB0aGlzLmNsYXNzZXMgPSBbXTtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5kZXB0aCA9IDA7XG4gICAgdGhpcy5tYXhGb250U2l6ZSA9IDA7XG4gICAgdGhpcy5zdHlsZSA9IHt9O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5oYXNDbGFzcyA9IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB1dGlscy5jb250YWlucyh0aGlzLmNsYXNzZXMsIGNsYXNzTmFtZSk7XG4gIH1cbiAgLyoqIENvbnZlcnQgdGhlIGZyYWdtZW50IGludG8gYSBub2RlLiAqL1xuICA7XG5cbiAgX3Byb3RvLnRvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSgpIHtcbiAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgZnJhZy5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkcmVuW2ldLnRvTm9kZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhZztcbiAgfVxuICAvKiogQ29udmVydCB0aGUgZnJhZ21lbnQgaW50byBIVE1MIG1hcmt1cC4gKi9cbiAgO1xuXG4gIF9wcm90by50b01hcmt1cCA9IGZ1bmN0aW9uIHRvTWFya3VwKCkge1xuICAgIHZhciBtYXJrdXAgPSBcIlwiOyAvLyBTaW1wbHkgY29uY2F0ZW5hdGUgdGhlIG1hcmt1cCBmb3IgdGhlIGNoaWxkcmVuIHRvZ2V0aGVyLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtYXJrdXAgKz0gdGhpcy5jaGlsZHJlbltpXS50b01hcmt1cCgpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrdXA7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYXRoIG5vZGUgaW50byBhIHN0cmluZywgc2ltaWxhciB0byBpbm5lclRleHQuIEFwcGxpZXMgdG9cbiAgICogTWF0aERvbU5vZGUncyBvbmx5LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1RleHQgPSBmdW5jdGlvbiB0b1RleHQoKSB7XG4gICAgLy8gVG8gYXZvaWQgdGhpcywgd2Ugd291bGQgc3ViY2xhc3MgZG9jdW1lbnRGcmFnbWVudCBzZXBhcmF0ZWx5IGZvclxuICAgIC8vIE1hdGhNTCwgYnV0IHBvbHlmaWxscyBmb3Igc3ViY2xhc3NpbmcgaXMgZXhwZW5zaXZlIHBlciBQUiAxNDY5LlxuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgd29ya3MgZm9yIENoaWxkVHlwZSA9IE1hdGhEb21Ob2RlLlxuICAgIHZhciB0b1RleHQgPSBmdW5jdGlvbiB0b1RleHQoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC50b1RleHQoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKHRvVGV4dCkuam9pbihcIlwiKTtcbiAgfTtcblxuICByZXR1cm4gRG9jdW1lbnRGcmFnbWVudDtcbn0oKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mb250TWV0cmljc0RhdGEuanNcbi8vIFRoaXMgZmlsZSBpcyBHRU5FUkFURUQgYnkgYnVpbGRNZXRyaWNzLnNoLiBETyBOT1QgTU9ESUZZLlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZm9udE1ldHJpY3NEYXRhID0gKHtcbiAgXCJBTVMtUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI2NVwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI2NlwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI2N1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI2OFwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI2OVwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI3MFwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI3MVwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI3MlwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI3M1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC4zODg4OV0sXG4gICAgXCI3NFwiOiBbMC4xNjY2NywgMC42ODg4OSwgMCwgMCwgMC41XSxcbiAgICBcIjc1XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjc2XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjc3XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjk0NDQ1XSxcbiAgICBcIjc4XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjc5XCI6IFswLjE2NjY3LCAwLjY4ODg5LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjgwXCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjYxMTExXSxcbiAgICBcIjgxXCI6IFswLjE2NjY3LCAwLjY4ODg5LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjgyXCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjgzXCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjg0XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg1XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg2XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg3XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAxLjBdLFxuICAgIFwiODhcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiODlcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiOTBcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiMTA3XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCIxNjVcIjogWzAsIDAuNjc1LCAwLjAyNSwgMCwgMC43NV0sXG4gICAgXCIxNzRcIjogWzAuMTU1NTksIDAuNjkyMjQsIDAsIDAsIDAuOTQ2NjZdLFxuICAgIFwiMjQwXCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjI5NVwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC41NDAyOF0sXG4gICAgXCI3MTBcIjogWzAsIDAuODI1LCAwLCAwLCAyLjMzMzM0XSxcbiAgICBcIjczMlwiOiBbMCwgMC45LCAwLCAwLCAyLjMzMzM0XSxcbiAgICBcIjc3MFwiOiBbMCwgMC44MjUsIDAsIDAsIDIuMzMzMzRdLFxuICAgIFwiNzcxXCI6IFswLCAwLjksIDAsIDAsIDIuMzMzMzRdLFxuICAgIFwiOTg5XCI6IFswLjA4MTY3LCAwLjU4MTY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjEwMDhcIjogWzAsIDAuNDMwNTYsIDAuMDQwMjgsIDAsIDAuNjY2NjddLFxuICAgIFwiODI0NVwiOiBbMCwgMC41NDk4NiwgMCwgMCwgMC4yNzVdLFxuICAgIFwiODQ2M1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC41NDAyOF0sXG4gICAgXCI4NDg3XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg0OThcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiODUwMlwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI4NTAzXCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjQ0NDQ1XSxcbiAgICBcIjg1MDRcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODUxM1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCI4NTkyXCI6IFstMC4wMzU5OCwgMC40NjQwMiwgMCwgMCwgMC41XSxcbiAgICBcIjg1OTRcIjogWy0wLjAzNTk4LCAwLjQ2NDAyLCAwLCAwLCAwLjVdLFxuICAgIFwiODYwMlwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjAzXCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMS4wXSxcbiAgICBcIjg2MDZcIjogWzAuMDEzNTQsIDAuNTIyMzksIDAsIDAsIDEuMF0sXG4gICAgXCI4NjA4XCI6IFswLjAxMzU0LCAwLjUyMjM5LCAwLCAwLCAxLjBdLFxuICAgIFwiODYxMFwiOiBbMC4wMTM1NCwgMC41MjIzOSwgMCwgMCwgMS4xMTExMV0sXG4gICAgXCI4NjExXCI6IFswLjAxMzU0LCAwLjUyMjM5LCAwLCAwLCAxLjExMTExXSxcbiAgICBcIjg2MTlcIjogWzAsIDAuNTQ5ODYsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjIwXCI6IFswLCAwLjU0OTg2LCAwLCAwLCAxLjBdLFxuICAgIFwiODYyMVwiOiBbLTAuMTMzMTMsIDAuMzc3ODgsIDAsIDAsIDEuMzg4ODldLFxuICAgIFwiODYyMlwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjI0XCI6IFswLCAwLjY5MjI0LCAwLCAwLCAwLjVdLFxuICAgIFwiODYyNVwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC41XSxcbiAgICBcIjg2MzBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjMxXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAxLjBdLFxuICAgIFwiODYzNFwiOiBbMC4wODE5OCwgMC41ODE5OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NjM1XCI6IFswLjA4MTk4LCAwLjU4MTk4LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg2MzhcIjogWzAuMTk0NDQsIDAuNjkyMjQsIDAsIDAsIDAuNDE2NjddLFxuICAgIFwiODYzOVwiOiBbMC4xOTQ0NCwgMC42OTIyNCwgMCwgMCwgMC40MTY2N10sXG4gICAgXCI4NjQyXCI6IFswLjE5NDQ0LCAwLjY5MjI0LCAwLCAwLCAwLjQxNjY3XSxcbiAgICBcIjg2NDNcIjogWzAuMTk0NDQsIDAuNjkyMjQsIDAsIDAsIDAuNDE2NjddLFxuICAgIFwiODY0NFwiOiBbMC4xODA4LCAwLjY3NSwgMCwgMCwgMS4wXSxcbiAgICBcIjg2NDZcIjogWzAuMTgwOCwgMC42NzUsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjQ3XCI6IFswLjE4MDgsIDAuNjc1LCAwLCAwLCAxLjBdLFxuICAgIFwiODY0OFwiOiBbMC4xOTQ0NCwgMC42OTIyNCwgMCwgMCwgMC44MzMzNF0sXG4gICAgXCI4NjQ5XCI6IFswLjE4MDgsIDAuNjc1LCAwLCAwLCAxLjBdLFxuICAgIFwiODY1MFwiOiBbMC4xOTQ0NCwgMC42OTIyNCwgMCwgMCwgMC44MzMzNF0sXG4gICAgXCI4NjUxXCI6IFswLjAxMzU0LCAwLjUyMjM5LCAwLCAwLCAxLjBdLFxuICAgIFwiODY1MlwiOiBbMC4wMTM1NCwgMC41MjIzOSwgMCwgMCwgMS4wXSxcbiAgICBcIjg2NTNcIjogWy0wLjEzMzEzLCAwLjM2Njg3LCAwLCAwLCAxLjBdLFxuICAgIFwiODY1NFwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjU1XCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMS4wXSxcbiAgICBcIjg2NjZcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjY3XCI6IFswLjEzNjY3LCAwLjYzNjY3LCAwLCAwLCAxLjBdLFxuICAgIFwiODY2OVwiOiBbLTAuMTMzMTMsIDAuMzc3ODgsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjcyXCI6IFstMC4wNjQsIDAuNDM3LCAwLCAwLCAxLjMzNF0sXG4gICAgXCI4Njc0XCI6IFstMC4wNjQsIDAuNDM3LCAwLCAwLCAxLjMzNF0sXG4gICAgXCI4NzA1XCI6IFswLCAwLjgyNSwgMCwgMCwgMC41XSxcbiAgICBcIjg3MDhcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiODcwOVwiOiBbMC4wODE2NywgMC41ODE2NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzE3XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjQyOTE3XSxcbiAgICBcIjg3MjJcIjogWy0wLjAzNTk4LCAwLjQ2NDAyLCAwLCAwLCAwLjVdLFxuICAgIFwiODcyNFwiOiBbMC4wODE5OCwgMC42OTIyNCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzI2XCI6IFswLjA4MTY3LCAwLjU4MTY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3MzNcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODczNlwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI4NzM3XCI6IFswLCAwLjY5MjI0LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg3MzhcIjogWzAuMDM1MTcsIDAuNTIyMzksIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiODczOVwiOiBbMC4wODE2NywgMC41ODE2NywgMCwgMCwgMC4yMjIyMl0sXG4gICAgXCI4NzQwXCI6IFswLjI1MTQyLCAwLjc0MTExLCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjg3NDFcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiODc0MlwiOiBbMC4yNTE0MiwgMC43NDExMSwgMCwgMCwgMC41XSxcbiAgICBcIjg3NTZcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODc1N1wiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI4NzY0XCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzY1XCI6IFstMC4xMzMxMywgMC4zNzc4OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzY5XCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzcwXCI6IFstMC4wMzYyNSwgMC40NjM3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4Nzc0XCI6IFswLjMwMjc0LCAwLjc5MzgzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3NzZcIjogWy0wLjAxNjg4LCAwLjQ4MzEyLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3NzhcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODc4MlwiOiBbMC4wNjA2MiwgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzgzXCI6IFswLjA2MDYyLCAwLjU0OTg2LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3ODVcIjogWzAuMDgxOTgsIDAuNTgxOTgsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODc4NlwiOiBbMC4wODE5OCwgMC41ODE5OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4Nzg3XCI6IFswLjA4MTk4LCAwLjU4MTk4LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3OTBcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODc5MVwiOiBbMC4yMjk1OCwgMC43Mjk1OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4Nzk2XCI6IFswLjA4MTk4LCAwLjkxNjY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MDZcIjogWzAuMjU1ODMsIDAuNzU1ODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgwN1wiOiBbMC4yNTU4MywgMC43NTU4MywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODA4XCI6IFswLjI1MTQyLCAwLjc1NzI2LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MDlcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgxMlwiOiBbMC4yNTU4MywgMC43NTU4MywgMCwgMCwgMC41XSxcbiAgICBcIjg4MTRcIjogWzAuMjA1NzYsIDAuNzA1NzYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgxNVwiOiBbMC4yMDU3NiwgMC43MDU3NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODE2XCI6IFswLjMwMjc0LCAwLjc5MzgzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MTdcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgxOFwiOiBbMC4yMjk1OCwgMC43Mjk1OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODE5XCI6IFswLjIyOTU4LCAwLjcyOTU4LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MjJcIjogWzAuMTgwOCwgMC42NzUsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgyM1wiOiBbMC4xODA4LCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODI4XCI6IFswLjEzNjY3LCAwLjYzNjY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MjlcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgzMFwiOiBbMC4yMjk1OCwgMC43Mjk1OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODMxXCI6IFswLjIyOTU4LCAwLjcyOTU4LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MzJcIjogWzAuMjA1NzYsIDAuNzA1NzYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgzM1wiOiBbMC4yMDU3NiwgMC43MDU3NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODQwXCI6IFswLjMwMjc0LCAwLjc5MzgzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NDFcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg0MlwiOiBbMC4xMzU5NywgMC42MzU5NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODQzXCI6IFswLjEzNTk3LCAwLjYzNTk3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NDdcIjogWzAuMDM1MTcsIDAuNTQ5ODYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg0OFwiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODU4XCI6IFswLjA4MTk4LCAwLjU4MTk4LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NTlcIjogWzAuMDgxOTgsIDAuNTgxOTgsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg2MVwiOiBbMC4wODE5OCwgMC41ODE5OCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODYyXCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODYzXCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODY0XCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODY1XCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODcyXCI6IFswLCAwLjY5MjI0LCAwLCAwLCAwLjYxMTExXSxcbiAgICBcIjg4NzNcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiODg3NFwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC44ODg4OV0sXG4gICAgXCI4ODc2XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjYxMTExXSxcbiAgICBcIjg4NzdcIjogWzAsIDAuNjg4ODksIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiODg3OFwiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI4ODc5XCI6IFswLCAwLjY4ODg5LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg4ODJcIjogWzAuMDM1MTcsIDAuNTQ5ODYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg4M1wiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODg0XCI6IFswLjEzNjY3LCAwLjYzNjY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4ODVcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg4OFwiOiBbMCwgMC41NDk4NiwgMCwgMCwgMS4xMTExMV0sXG4gICAgXCI4ODkwXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjg4OTFcIjogWzAuMTk0NDQsIDAuNjkyMjQsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiODg5MlwiOiBbMC4xOTQ0NCwgMC42OTIyNCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI4OTAxXCI6IFswLCAwLjU0OTg2LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjg5MDNcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkwNVwiOiBbMC4wODE2NywgMC41ODE2NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTA2XCI6IFswLjA4MTY3LCAwLjU4MTY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MDdcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkwOFwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTA5XCI6IFstMC4wMzU5OCwgMC40NjQwMiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTEwXCI6IFswLCAwLjU0OTg2LCAwLCAwLCAwLjc2MDQyXSxcbiAgICBcIjg5MTFcIjogWzAsIDAuNTQ5ODYsIDAsIDAsIDAuNzYwNDJdLFxuICAgIFwiODkxMlwiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTEzXCI6IFswLjAzNTE3LCAwLjU0OTg2LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MTRcIjogWzAsIDAuNTQ5ODYsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODkxNVwiOiBbMCwgMC41NDk4NiwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI4OTE2XCI6IFswLCAwLjY5MjI0LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg5MThcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MTlcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MjBcIjogWzAuMDM1MTcsIDAuNTQ5ODYsIDAsIDAsIDEuMzMzMzRdLFxuICAgIFwiODkyMVwiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMS4zMzMzNF0sXG4gICAgXCI4OTIyXCI6IFswLjM4NTY5LCAwLjg4NTY5LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MjNcIjogWzAuMzg1NjksIDAuODg1NjksIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkyNlwiOiBbMC4xMzY2NywgMC42MzY2NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTI3XCI6IFswLjEzNjY3LCAwLjYzNjY3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MjhcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkyOVwiOiBbMC4zMDI3NCwgMC43OTM4MywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTM0XCI6IFswLjIzMjIyLCAwLjc0MTExLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MzVcIjogWzAuMjMyMjIsIDAuNzQxMTEsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkzNlwiOiBbMC4yMzIyMiwgMC43NDExMSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTM3XCI6IFswLjIzMjIyLCAwLjc0MTExLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5MzhcIjogWzAuMjA1NzYsIDAuNzA1NzYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODkzOVwiOiBbMC4yMDU3NiwgMC43MDU3NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTQwXCI6IFswLjMwMjc0LCAwLjc5MzgzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg5NDFcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODk5NFwiOiBbMC4xOTQ0NCwgMC42OTIyNCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4OTk1XCI6IFswLjE5NDQ0LCAwLjY5MjI0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjk0MTZcIjogWzAuMTU1NTksIDAuNjkyMjQsIDAsIDAsIDAuOTAyMjJdLFxuICAgIFwiOTQ4NFwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC41XSxcbiAgICBcIjk0ODhcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuNV0sXG4gICAgXCI5NDkyXCI6IFswLCAwLjM3Nzg4LCAwLCAwLCAwLjVdLFxuICAgIFwiOTQ5NlwiOiBbMCwgMC4zNzc4OCwgMCwgMCwgMC41XSxcbiAgICBcIjk1ODVcIjogWzAuMTk0NDQsIDAuNjg4ODksIDAsIDAsIDAuODg4ODldLFxuICAgIFwiOTU4NlwiOiBbMC4xOTQ0NCwgMC43NDExMSwgMCwgMCwgMC44ODg4OV0sXG4gICAgXCI5NjMyXCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5NjMzXCI6IFswLCAwLjY3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5NjUwXCI6IFswLCAwLjU0OTg2LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjk2NTFcIjogWzAsIDAuNTQ5ODYsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiOTY1NFwiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5NjYwXCI6IFswLCAwLjU0OTg2LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjk2NjFcIjogWzAsIDAuNTQ5ODYsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiOTY2NFwiOiBbMC4wMzUxNywgMC41NDk4NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5Njc0XCI6IFswLjExMTExLCAwLjY5MjI0LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjk3MzNcIjogWzAuMTk0NDQsIDAuNjkyMjQsIDAsIDAsIDAuOTQ0NDVdLFxuICAgIFwiMTAwMDNcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiMTAwMTZcIjogWzAsIDAuNjkyMjQsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiMTA3MzFcIjogWzAuMTExMTEsIDAuNjkyMjQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiMTA4NDZcIjogWzAuMTk0NDQsIDAuNzU1ODMsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiMTA4NzdcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4NzhcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4ODVcIjogWzAuMjU1ODMsIDAuNzU1ODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4ODZcIjogWzAuMjU1ODMsIDAuNzU1ODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4ODdcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4ODhcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4ODlcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4OTBcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4OTFcIjogWzAuNDgyNTYsIDAuOTgyNTYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA4OTJcIjogWzAuNDgyNTYsIDAuOTgyNTYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MDFcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MDJcIjogWzAuMTM2NjcsIDAuNjM2NjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzNcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzRcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzVcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzZcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzdcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MzhcIjogWzAuMjYxNjcsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5NDlcIjogWzAuMjU1ODMsIDAuNzU1ODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5NTBcIjogWzAuMjU1ODMsIDAuNzU1ODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5NTVcIjogWzAuMjg0ODEsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5NTZcIjogWzAuMjg0ODEsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNTBcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuMjIyMjJdLFxuICAgIFwiNTczNTFcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiNTczNTJcIjogWzAuMDgxNjcsIDAuNTgxNjcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNTNcIjogWzAsIDAuNDMwNTYsIDAuMDQwMjgsIDAsIDAuNjY2NjddLFxuICAgIFwiNTczNTZcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNTdcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNThcIjogWzAuNDE5NTEsIDAuOTE5NTEsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNTlcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjBcIjogWzAuMzAyNzQsIDAuNzkzODMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjFcIjogWzAuNDE5NTEsIDAuOTE5NTEsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjZcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjdcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjhcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNjlcIjogWzAuMjUxNDIsIDAuNzU3MjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNzBcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNzFcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdXG4gIH0sXG4gIFwiQ2FsaWdyYXBoaWMtUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI2NVwiOiBbMCwgMC42ODMzMywgMCwgMC4xOTQ0NSwgMC43OTg0N10sXG4gICAgXCI2NlwiOiBbMCwgMC42ODMzMywgMC4wMzA0MSwgMC4xMzg4OSwgMC42NTY4MV0sXG4gICAgXCI2N1wiOiBbMCwgMC42ODMzMywgMC4wNTgzNCwgMC4xMzg4OSwgMC41MjY1M10sXG4gICAgXCI2OFwiOiBbMCwgMC42ODMzMywgMC4wMjc3OCwgMC4wODMzNCwgMC43NzEzOV0sXG4gICAgXCI2OVwiOiBbMCwgMC42ODMzMywgMC4wODk0NCwgMC4xMTExMSwgMC41Mjc3OF0sXG4gICAgXCI3MFwiOiBbMCwgMC42ODMzMywgMC4wOTkzMSwgMC4xMTExMSwgMC43MTg3NV0sXG4gICAgXCI3MVwiOiBbMC4wOTcyMiwgMC42ODMzMywgMC4wNTkzLCAwLjExMTExLCAwLjU5NDg3XSxcbiAgICBcIjcyXCI6IFswLCAwLjY4MzMzLCAwLjAwOTY1LCAwLjExMTExLCAwLjg0NDUyXSxcbiAgICBcIjczXCI6IFswLCAwLjY4MzMzLCAwLjA3MzgyLCAwLCAwLjU0NDUyXSxcbiAgICBcIjc0XCI6IFswLjA5NzIyLCAwLjY4MzMzLCAwLjE4NDcyLCAwLjE2NjY3LCAwLjY3Nzc4XSxcbiAgICBcIjc1XCI6IFswLCAwLjY4MzMzLCAwLjAxNDQ1LCAwLjA1NTU2LCAwLjc2MTk1XSxcbiAgICBcIjc2XCI6IFswLCAwLjY4MzMzLCAwLCAwLjEzODg5LCAwLjY4OTcyXSxcbiAgICBcIjc3XCI6IFswLCAwLjY4MzMzLCAwLCAwLjEzODg5LCAxLjIwMDldLFxuICAgIFwiNzhcIjogWzAsIDAuNjgzMzMsIDAuMTQ3MzYsIDAuMDgzMzQsIDAuODIwNDldLFxuICAgIFwiNzlcIjogWzAsIDAuNjgzMzMsIDAuMDI3NzgsIDAuMTExMTEsIDAuNzk2MTFdLFxuICAgIFwiODBcIjogWzAsIDAuNjgzMzMsIDAuMDgyMjIsIDAuMDgzMzQsIDAuNjk1NTZdLFxuICAgIFwiODFcIjogWzAuMDk3MjIsIDAuNjgzMzMsIDAsIDAuMTExMTEsIDAuODE2NjddLFxuICAgIFwiODJcIjogWzAsIDAuNjgzMzMsIDAsIDAuMDgzMzQsIDAuODQ3NV0sXG4gICAgXCI4M1wiOiBbMCwgMC42ODMzMywgMC4wNzUsIDAuMTM4ODksIDAuNjA1NTZdLFxuICAgIFwiODRcIjogWzAsIDAuNjgzMzMsIDAuMjU0MTcsIDAsIDAuNTQ0NjRdLFxuICAgIFwiODVcIjogWzAsIDAuNjgzMzMsIDAuMDk5MzEsIDAuMDgzMzQsIDAuNjI1ODNdLFxuICAgIFwiODZcIjogWzAsIDAuNjgzMzMsIDAuMDgyMjIsIDAsIDAuNjEyNzhdLFxuICAgIFwiODdcIjogWzAsIDAuNjgzMzMsIDAuMDgyMjIsIDAuMDgzMzQsIDAuOTg3NzhdLFxuICAgIFwiODhcIjogWzAsIDAuNjgzMzMsIDAuMTQ2NDMsIDAuMTM4ODksIDAuNzEzM10sXG4gICAgXCI4OVwiOiBbMC4wOTcyMiwgMC42ODMzMywgMC4wODIyMiwgMC4wODMzNCwgMC42NjgzNF0sXG4gICAgXCI5MFwiOiBbMCwgMC42ODMzMywgMC4wNzk0NCwgMC4xMzg4OSwgMC43MjQ3M10sXG4gICAgXCIxNjBcIjogWzAsIDAsIDAsIDAsIDAuMjVdXG4gIH0sXG4gIFwiRnJha3R1ci1SZWd1bGFyXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjMzXCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjI5NTc0XSxcbiAgICBcIjM0XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjIxNDcxXSxcbiAgICBcIjM4XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjczNzg2XSxcbiAgICBcIjM5XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjIxMjAxXSxcbiAgICBcIjQwXCI6IFswLjI0OTgyLCAwLjc0OTQ3LCAwLCAwLCAwLjM4ODY1XSxcbiAgICBcIjQxXCI6IFswLjI0OTgyLCAwLjc0OTQ3LCAwLCAwLCAwLjM4ODY1XSxcbiAgICBcIjQyXCI6IFswLCAwLjYyMTE5LCAwLCAwLCAwLjI3NzY0XSxcbiAgICBcIjQzXCI6IFswLjA4MzE5LCAwLjU4MjgzLCAwLCAwLCAwLjc1NjIzXSxcbiAgICBcIjQ0XCI6IFswLCAwLjEwODAzLCAwLCAwLCAwLjI3NzY0XSxcbiAgICBcIjQ1XCI6IFswLjA4MzE5LCAwLjU4MjgzLCAwLCAwLCAwLjc1NjIzXSxcbiAgICBcIjQ2XCI6IFswLCAwLjEwODAzLCAwLCAwLCAwLjI3NzY0XSxcbiAgICBcIjQ3XCI6IFswLjI0OTgyLCAwLjc0OTQ3LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjQ4XCI6IFswLCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjQ5XCI6IFswLCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjUwXCI6IFswLCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjUxXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjUyXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjUzXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjU0XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjU1XCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjU2XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjU3XCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMTgxXSxcbiAgICBcIjU4XCI6IFswLCAwLjQ3NTM0LCAwLCAwLCAwLjIxNjA2XSxcbiAgICBcIjU5XCI6IFswLjEyNjA0LCAwLjQ3NTM0LCAwLCAwLCAwLjIxNjA2XSxcbiAgICBcIjYxXCI6IFstMC4xMzA5OSwgMC4zNjg2NiwgMCwgMCwgMC43NTYyM10sXG4gICAgXCI2M1wiOiBbMCwgMC42OTE0MSwgMCwgMCwgMC4zNjI0NV0sXG4gICAgXCI2NVwiOiBbMCwgMC42OTE0MSwgMCwgMCwgMC43MTc2XSxcbiAgICBcIjY2XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjg4Mzk3XSxcbiAgICBcIjY3XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjYxMjU0XSxcbiAgICBcIjY4XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjgzMTU4XSxcbiAgICBcIjY5XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjY2Mjc4XSxcbiAgICBcIjcwXCI6IFswLjEyNjA0LCAwLjY5MTQxLCAwLCAwLCAwLjYxMTE5XSxcbiAgICBcIjcxXCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjc4NTM5XSxcbiAgICBcIjcyXCI6IFswLjA2MzAyLCAwLjY5MTQxLCAwLCAwLCAwLjcyMDNdLFxuICAgIFwiNzNcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNTU0NDhdLFxuICAgIFwiNzRcIjogWzAuMTI2MDQsIDAuNjkxNDEsIDAsIDAsIDAuNTUyMzFdLFxuICAgIFwiNzVcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNjY4NDVdLFxuICAgIFwiNzZcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNjY2MDJdLFxuICAgIFwiNzdcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDEuMDQ5NTNdLFxuICAgIFwiNzhcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuODMyMTJdLFxuICAgIFwiNzlcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuODI2OTldLFxuICAgIFwiODBcIjogWzAuMTg5MDYsIDAuNjkxNDEsIDAsIDAsIDAuODI3NTNdLFxuICAgIFwiODFcIjogWzAuMDM3ODEsIDAuNjkxNDEsIDAsIDAsIDAuODI2OTldLFxuICAgIFwiODJcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuODI4MDddLFxuICAgIFwiODNcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuODI4NjFdLFxuICAgIFwiODRcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNjY4OTldLFxuICAgIFwiODVcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNjQ1NzZdLFxuICAgIFwiODZcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuODMxMzFdLFxuICAgIFwiODdcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDEuMDQ2MDJdLFxuICAgIFwiODhcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNzE5MjJdLFxuICAgIFwiODlcIjogWzAuMTg5MDYsIDAuNjkxNDEsIDAsIDAsIDAuODMyOTNdLFxuICAgIFwiOTBcIjogWzAuMTI2MDQsIDAuNjkxNDEsIDAsIDAsIDAuNjAyMDFdLFxuICAgIFwiOTFcIjogWzAuMjQ5ODIsIDAuNzQ5NDcsIDAsIDAsIDAuMjc3NjRdLFxuICAgIFwiOTNcIjogWzAuMjQ5ODIsIDAuNzQ5NDcsIDAsIDAsIDAuMjc3NjRdLFxuICAgIFwiOTRcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNDk5NjVdLFxuICAgIFwiOTdcIjogWzAsIDAuNDc1MzQsIDAsIDAsIDAuNTAwNDZdLFxuICAgIFwiOThcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuNTEzMTVdLFxuICAgIFwiOTlcIjogWzAsIDAuNDc1MzQsIDAsIDAsIDAuMzg5NDZdLFxuICAgIFwiMTAwXCI6IFswLCAwLjYyMTE5LCAwLCAwLCAwLjQ5ODU3XSxcbiAgICBcIjEwMVwiOiBbMCwgMC40NzUzNCwgMCwgMCwgMC40MDA1M10sXG4gICAgXCIxMDJcIjogWzAuMTg5MDYsIDAuNjkxNDEsIDAsIDAsIDAuMzI2MjZdLFxuICAgIFwiMTAzXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjUwMzddLFxuICAgIFwiMTA0XCI6IFswLjE4OTA2LCAwLjY5MTQxLCAwLCAwLCAwLjUyMTI2XSxcbiAgICBcIjEwNVwiOiBbMCwgMC42OTE0MSwgMCwgMCwgMC4yNzg5OV0sXG4gICAgXCIxMDZcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuMjgwODhdLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjM4OTQ2XSxcbiAgICBcIjEwOFwiOiBbMCwgMC42OTE0MSwgMCwgMCwgMC4yNzk1M10sXG4gICAgXCIxMDlcIjogWzAsIDAuNDc1MzQsIDAsIDAsIDAuNzY2NzZdLFxuICAgIFwiMTEwXCI6IFswLCAwLjQ3NTM0LCAwLCAwLCAwLjUyNjY2XSxcbiAgICBcIjExMVwiOiBbMCwgMC40NzUzNCwgMCwgMCwgMC40ODg4NV0sXG4gICAgXCIxMTJcIjogWzAuMTg5MDYsIDAuNTIzOTYsIDAsIDAsIDAuNTAwNDZdLFxuICAgIFwiMTEzXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjQ4OTEyXSxcbiAgICBcIjExNFwiOiBbMCwgMC40NzUzNCwgMCwgMCwgMC4zODkxOV0sXG4gICAgXCIxMTVcIjogWzAsIDAuNDc1MzQsIDAsIDAsIDAuNDQyNjZdLFxuICAgIFwiMTE2XCI6IFswLCAwLjYyMTE5LCAwLCAwLCAwLjMzMzAxXSxcbiAgICBcIjExN1wiOiBbMCwgMC40NzUzNCwgMCwgMCwgMC41MTcyXSxcbiAgICBcIjExOFwiOiBbMCwgMC41MjM5NiwgMCwgMCwgMC41MTE4XSxcbiAgICBcIjExOVwiOiBbMCwgMC41MjM5NiwgMCwgMCwgMC43NzM1MV0sXG4gICAgXCIxMjBcIjogWzAuMTg5MDYsIDAuNDc1MzQsIDAsIDAsIDAuMzg4NjVdLFxuICAgIFwiMTIxXCI6IFswLjE4OTA2LCAwLjQ3NTM0LCAwLCAwLCAwLjQ5ODg0XSxcbiAgICBcIjEyMlwiOiBbMC4xODkwNiwgMC40NzUzNCwgMCwgMCwgMC4zOTA1NF0sXG4gICAgXCIxNjBcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiODIxNlwiOiBbMCwgMC42OTE0MSwgMCwgMCwgMC4yMTQ3MV0sXG4gICAgXCI4MjE3XCI6IFswLCAwLjY5MTQxLCAwLCAwLCAwLjIxNDcxXSxcbiAgICBcIjU4MTEyXCI6IFswLCAwLjYyMTE5LCAwLCAwLCAwLjQ5NzQ5XSxcbiAgICBcIjU4MTEzXCI6IFswLCAwLjYyMTE5LCAwLCAwLCAwLjQ5ODNdLFxuICAgIFwiNTgxMTRcIjogWzAuMTg5MDYsIDAuNjkxNDEsIDAsIDAsIDAuMzMzMjhdLFxuICAgIFwiNTgxMTVcIjogWzAuMTg5MDYsIDAuNjkxNDEsIDAsIDAsIDAuMzI5MjNdLFxuICAgIFwiNTgxMTZcIjogWzAuMTg5MDYsIDAuNDc1MzQsIDAsIDAsIDAuNTAzNDNdLFxuICAgIFwiNTgxMTdcIjogWzAsIDAuNjkxNDEsIDAsIDAsIDAuMzMzMDFdLFxuICAgIFwiNTgxMThcIjogWzAsIDAuNjIxMTksIDAsIDAsIDAuMzM0MDldLFxuICAgIFwiNTgxMTlcIjogWzAsIDAuNDc1MzQsIDAsIDAsIDAuNTAwNzNdXG4gIH0sXG4gIFwiTWFpbi1Cb2xkXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjMzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjM1XSxcbiAgICBcIjM0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjYwMjc4XSxcbiAgICBcIjM1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjk1ODMzXSxcbiAgICBcIjM2XCI6IFswLjA1NTU2LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCIzN1wiOiBbMC4wNTU1NiwgMC43NSwgMCwgMCwgMC45NTgzM10sXG4gICAgXCIzOFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCIzOVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI0MFwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC40NDcyMl0sXG4gICAgXCI0MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC40NDcyMl0sXG4gICAgXCI0MlwiOiBbMCwgMC43NSwgMCwgMCwgMC41NzVdLFxuICAgIFwiNDNcIjogWzAuMTMzMzMsIDAuNjMzMzMsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiNDRcIjogWzAuMTk0NDQsIDAuMTU1NTYsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiNDVcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuMzgzMzNdLFxuICAgIFwiNDZcIjogWzAsIDAuMTU1NTYsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiNDdcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjQ4XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI0OVwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTBcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjUxXCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI1MlwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTNcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjU0XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI1NVwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjU3XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI1OFwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI1OVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI2MFwiOiBbMC4wODU1NiwgMC41ODU1NiwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI2MVwiOiBbLTAuMTA4ODksIDAuMzkxMTEsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiNjJcIjogWzAuMDg1NTYsIDAuNTg1NTYsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiNjNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTQzMDVdLFxuICAgIFwiNjRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiNjVcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODY5NDRdLFxuICAgIFwiNjZcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODE4MDVdLFxuICAgIFwiNjdcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODMwNTVdLFxuICAgIFwiNjhcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODgxOTRdLFxuICAgIFwiNjlcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuNzU1NTVdLFxuICAgIFwiNzBcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuNzIzNjFdLFxuICAgIFwiNzFcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOTA0MTZdLFxuICAgIFwiNzJcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOV0sXG4gICAgXCI3M1wiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC40MzYxMV0sXG4gICAgXCI3NFwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC41OTQ0NF0sXG4gICAgXCI3NVwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC45MDEzOF0sXG4gICAgXCI3NlwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC42OTE2Nl0sXG4gICAgXCI3N1wiOiBbMCwgMC42ODYxMSwgMCwgMCwgMS4wOTE2Nl0sXG4gICAgXCI3OFwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC45XSxcbiAgICBcIjc5XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjg2Mzg4XSxcbiAgICBcIjgwXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjc4NjExXSxcbiAgICBcIjgxXCI6IFswLjE5NDQ0LCAwLjY4NjExLCAwLCAwLCAwLjg2Mzg4XSxcbiAgICBcIjgyXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjg2MjVdLFxuICAgIFwiODNcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuNjM4ODldLFxuICAgIFwiODRcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOF0sXG4gICAgXCI4NVwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC44ODQ3Ml0sXG4gICAgXCI4NlwiOiBbMCwgMC42ODYxMSwgMC4wMTU5NywgMCwgMC44Njk0NF0sXG4gICAgXCI4N1wiOiBbMCwgMC42ODYxMSwgMC4wMTU5NywgMCwgMS4xODg4OF0sXG4gICAgXCI4OFwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC44Njk0NF0sXG4gICAgXCI4OVwiOiBbMCwgMC42ODYxMSwgMC4wMjg3NSwgMCwgMC44Njk0NF0sXG4gICAgXCI5MFwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC43MDI3N10sXG4gICAgXCI5MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI5MlwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC41NzVdLFxuICAgIFwiOTNcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiOTRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjk1XCI6IFswLjMxLCAwLjEzNDQ0LCAwLjAzMTk0LCAwLCAwLjU3NV0sXG4gICAgXCI5N1wiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC41NTkwMl0sXG4gICAgXCI5OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCI5OVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC41MTExMV0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjM4ODldLFxuICAgIFwiMTAxXCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjUyNzA4XSxcbiAgICBcIjEwMlwiOiBbMCwgMC42OTQ0NCwgMC4xMDkwMywgMCwgMC4zNTEzOV0sXG4gICAgXCIxMDNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDE1OTcsIDAsIDAuNTc1XSxcbiAgICBcIjEwNFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCIxMDVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiMTA2XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjM1MTM5XSxcbiAgICBcIjEwN1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MDY5NF0sXG4gICAgXCIxMDhcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiMTA5XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjk1ODMzXSxcbiAgICBcIjExMFwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCIxMTFcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjExMlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCIxMTNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAsIDAsIDAuNjA2OTRdLFxuICAgIFwiMTE0XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjQ3MzYxXSxcbiAgICBcIjExNVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC40NTM2MV0sXG4gICAgXCIxMTZcIjogWzAsIDAuNjM0OTIsIDAsIDAsIDAuNDQ3MjJdLFxuICAgIFwiMTE3XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjYzODg5XSxcbiAgICBcIjExOFwiOiBbMCwgMC40NDQ0NCwgMC4wMTU5NywgMCwgMC42MDY5NF0sXG4gICAgXCIxMTlcIjogWzAsIDAuNDQ0NDQsIDAuMDE1OTcsIDAsIDAuODMwNTVdLFxuICAgIFwiMTIwXCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjYwNjk0XSxcbiAgICBcIjEyMVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wMTU5NywgMCwgMC42MDY5NF0sXG4gICAgXCIxMjJcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNTExMTFdLFxuICAgIFwiMTIzXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCIxMjRcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiMTI1XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCIxMjZcIjogWzAuMzUsIDAuMzQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCIxNjNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODY4NTNdLFxuICAgIFwiMTY4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCIxNzJcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNzY2NjZdLFxuICAgIFwiMTc2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjg2OTQ0XSxcbiAgICBcIjE3N1wiOiBbMC4xMzMzMywgMC42MzMzMywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCIxODRcIjogWzAuMTcwMTQsIDAsIDAsIDAsIDAuNTExMTFdLFxuICAgIFwiMTk4XCI6IFswLCAwLjY4NjExLCAwLCAwLCAxLjA0MTY2XSxcbiAgICBcIjIxNVwiOiBbMC4xMzMzMywgMC42MzMzMywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCIyMTZcIjogWzAuMDQ4NjEsIDAuNzM0NzIsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiMjIzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU5NzIyXSxcbiAgICBcIjIzMFwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC44MzA1NV0sXG4gICAgXCIyNDdcIjogWzAuMTMzMzMsIDAuNjMzMzMsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiMjQ4XCI6IFswLjA5NzIyLCAwLjU0MTY3LCAwLCAwLCAwLjU3NV0sXG4gICAgXCIzMDVcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiMzM4XCI6IFswLCAwLjY4NjExLCAwLCAwLCAxLjE2OTQ0XSxcbiAgICBcIjMzOVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI1NjdcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAsIDAsIDAuMzUxMzldLFxuICAgIFwiNzEwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNjMxOTQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjcxM1wiOiBbMCwgMC41OTYxMSwgMCwgMCwgMC41NzVdLFxuICAgIFwiNzE0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjcyOFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNzI5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjMxOTQ0XSxcbiAgICBcIjczMFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC44Njk0NF0sXG4gICAgXCI3MzJcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiOTE1XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjY5MTY2XSxcbiAgICBcIjkxNlwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC45NTgzM10sXG4gICAgXCI5MjBcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiOTIzXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjgwNTU1XSxcbiAgICBcIjkyNlwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI5MjhcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOV0sXG4gICAgXCI5MzFcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODMwNTVdLFxuICAgIFwiOTMzXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjkzNFwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC44MzA1NV0sXG4gICAgXCI5MzZcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiOTM3XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjgzMDU1XSxcbiAgICBcIjgyMTFcIjogWzAsIDAuNDQ0NDQsIDAuMDMxOTQsIDAsIDAuNTc1XSxcbiAgICBcIjgyMTJcIjogWzAsIDAuNDQ0NDQsIDAuMDMxOTQsIDAsIDEuMTQ5OTldLFxuICAgIFwiODIxNlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI4MjE3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjMxOTQ0XSxcbiAgICBcIjgyMjBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjAyNzhdLFxuICAgIFwiODIyMVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MDI3OF0sXG4gICAgXCI4MjI0XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjUxMTExXSxcbiAgICBcIjgyMjVcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuNTExMTFdLFxuICAgIFwiODI0MlwiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC4zNDQ0NF0sXG4gICAgXCI4NDA3XCI6IFswLCAwLjcyNDQ0LCAwLjE1NDg2LCAwLCAwLjU3NV0sXG4gICAgXCI4NDYzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY2NzU5XSxcbiAgICBcIjg0NjVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODMwNTVdLFxuICAgIFwiODQ2N1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC40NzM2MV0sXG4gICAgXCI4NDcyXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLCAwLCAwLjc0MDI3XSxcbiAgICBcIjg0NzZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODMwNTVdLFxuICAgIFwiODUwMVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MDI3N10sXG4gICAgXCI4NTkyXCI6IFstMC4xMDg4OSwgMC4zOTExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NTkzXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NTk0XCI6IFstMC4xMDg4OSwgMC4zOTExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NTk1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NTk2XCI6IFstMC4xMDg4OSwgMC4zOTExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NTk3XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NTk4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg1OTlcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDEuMTQ5OTldLFxuICAgIFwiODYwMFwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NjAxXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2MzZcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2MzdcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2NDBcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2NDFcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2NTZcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg2NTdcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuNzAyNzddLFxuICAgIFwiODY1OFwiOiBbLTAuMTA4ODksIDAuMzkxMTEsIDAsIDAsIDEuMTQ5OTldLFxuICAgIFwiODY1OVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMC43MDI3N10sXG4gICAgXCI4NjYwXCI6IFstMC4xMDg4OSwgMC4zOTExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NjYxXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjcwMjc3XSxcbiAgICBcIjg3MDRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjM4ODldLFxuICAgIFwiODcwNlwiOiBbMCwgMC42OTQ0NCwgMC4wNjM4OSwgMCwgMC42Mjg0N10sXG4gICAgXCI4NzA3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjYzODg5XSxcbiAgICBcIjg3MDlcIjogWzAuMDU1NTYsIDAuNzUsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjg3MTFcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOTU4MzNdLFxuICAgIFwiODcxMlwiOiBbMC4wODU1NiwgMC41ODU1NiwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI4NzE1XCI6IFswLjA4NTU2LCAwLjU4NTU2LCAwLCAwLCAwLjc2NjY2XSxcbiAgICBcIjg3MjJcIjogWzAuMTMzMzMsIDAuNjMzMzMsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODcyM1wiOiBbMC4xMzMzMywgMC42MzMzMywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4NzI1XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NzI2XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NzI3XCI6IFstMC4wMjc3OCwgMC40NzIyMiwgMCwgMCwgMC41NzVdLFxuICAgIFwiODcyOFwiOiBbLTAuMDI2MzksIDAuNDczNjEsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjg3MjlcIjogWy0wLjAyNjM5LCAwLjQ3MzYxLCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4NzMwXCI6IFswLjE4LCAwLjgyLCAwLCAwLCAwLjk1ODMzXSxcbiAgICBcIjg3MzNcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODczNFwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4NzM2XCI6IFswLCAwLjY5MjI0LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg3MzlcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiODc0MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC41NzVdLFxuICAgIFwiODc0M1wiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI4NzQ0XCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjc2NjY2XSxcbiAgICBcIjg3NDVcIjogWzAsIDAuNTU1NTYsIDAsIDAsIDAuNzY2NjZdLFxuICAgIFwiODc0NlwiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI4NzQ3XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjEyNzc4LCAwLCAwLjU2ODc1XSxcbiAgICBcIjg3NjRcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg3NjhcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuMzE5NDRdLFxuICAgIFwiODc3MVwiOiBbMC4wMDIyMiwgMC41MDIyMiwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4NzczXCI6IFswLjAyNywgMC42MzgsIDAsIDAsIDAuODk0XSxcbiAgICBcIjg3NzZcIjogWzAuMDI0NDQsIDAuNTI0NDQsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODc4MVwiOiBbMC4wMDIyMiwgMC41MDIyMiwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODAxXCI6IFswLjAwMjIyLCAwLjUwMjIyLCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg4MDRcIjogWzAuMTk2NjcsIDAuNjk2NjcsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODgwNVwiOiBbMC4xOTY2NywgMC42OTY2NywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODEwXCI6IFswLjA4NTU2LCAwLjU4NTU2LCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjg4MTFcIjogWzAuMDg1NTYsIDAuNTg1NTYsIDAsIDAsIDEuMTQ5OTldLFxuICAgIFwiODgyNlwiOiBbMC4wODU1NiwgMC41ODU1NiwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODI3XCI6IFswLjA4NTU2LCAwLjU4NTU2LCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg4MzRcIjogWzAuMDg1NTYsIDAuNTg1NTYsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODgzNVwiOiBbMC4wODU1NiwgMC41ODU1NiwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODM4XCI6IFswLjE5NjY3LCAwLjY5NjY3LCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg4MzlcIjogWzAuMTk2NjcsIDAuNjk2NjcsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODg0NlwiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI4ODQ5XCI6IFswLjE5NjY3LCAwLjY5NjY3LCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg4NTBcIjogWzAuMTk2NjcsIDAuNjk2NjcsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODg1MVwiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC43NjY2Nl0sXG4gICAgXCI4ODUyXCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjc2NjY2XSxcbiAgICBcIjg4NTNcIjogWzAuMTMzMzMsIDAuNjMzMzMsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODg1NFwiOiBbMC4xMzMzMywgMC42MzMzMywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODU1XCI6IFswLjEzMzMzLCAwLjYzMzMzLCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg4NTZcIjogWzAuMTMzMzMsIDAuNjMzMzMsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiODg1N1wiOiBbMC4xMzMzMywgMC42MzMzMywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODY2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcwMjc3XSxcbiAgICBcIjg4NjdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzAyNzddLFxuICAgIFwiODg2OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI4ODY5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjg5MDBcIjogWy0wLjAyNjM5LCAwLjQ3MzYxLCAwLCAwLCAwLjU3NV0sXG4gICAgXCI4OTAxXCI6IFstMC4wMjYzOSwgMC40NzM2MSwgMCwgMCwgMC4zMTk0NF0sXG4gICAgXCI4OTAyXCI6IFstMC4wMjc3OCwgMC40NzIyMiwgMCwgMCwgMC41NzVdLFxuICAgIFwiODk2OFwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC41MTExMV0sXG4gICAgXCI4OTY5XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjUxMTExXSxcbiAgICBcIjg5NzBcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNTExMTFdLFxuICAgIFwiODk3MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC41MTExMV0sXG4gICAgXCI4OTk0XCI6IFstMC4xMzg4OSwgMC4zNjExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI4OTk1XCI6IFstMC4xMzg4OSwgMC4zNjExMSwgMCwgMCwgMS4xNDk5OV0sXG4gICAgXCI5NjUxXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjAyMjIyXSxcbiAgICBcIjk2NTdcIjogWy0wLjAyNzc4LCAwLjQ3MjIyLCAwLCAwLCAwLjU3NV0sXG4gICAgXCI5NjYxXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjAyMjIyXSxcbiAgICBcIjk2NjdcIjogWy0wLjAyNzc4LCAwLjQ3MjIyLCAwLCAwLCAwLjU3NV0sXG4gICAgXCI5NzExXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjE0OTk5XSxcbiAgICBcIjk4MjRcIjogWzAuMTI5NjMsIDAuNjk0NDQsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiOTgyNVwiOiBbMC4xMjk2MywgMC42OTQ0NCwgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI5ODI2XCI6IFswLjEyOTYzLCAwLjY5NDQ0LCAwLCAwLCAwLjg5NDQ0XSxcbiAgICBcIjk4MjdcIjogWzAuMTI5NjMsIDAuNjk0NDQsIDAsIDAsIDAuODk0NDRdLFxuICAgIFwiOTgzN1wiOiBbMCwgMC43NSwgMCwgMCwgMC40NDcyMl0sXG4gICAgXCI5ODM4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjQ0NzIyXSxcbiAgICBcIjk4MzlcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuNDQ3MjJdLFxuICAgIFwiMTAyMTZcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNDQ3MjJdLFxuICAgIFwiMTAyMTdcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNDQ3MjJdLFxuICAgIFwiMTA4MTVcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuOV0sXG4gICAgXCIxMDkyN1wiOiBbMC4xOTY2NywgMC42OTY2NywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCIxMDkyOFwiOiBbMC4xOTY2NywgMC42OTY2NywgMCwgMCwgMC44OTQ0NF0sXG4gICAgXCI1NzM3NlwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMF1cbiAgfSxcbiAgXCJNYWluLUJvbGRJdGFsaWNcIjoge1xuICAgIFwiMzJcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiMzNcIjogWzAsIDAuNjk0NDQsIDAuMTE0MTcsIDAsIDAuMzg2MTFdLFxuICAgIFwiMzRcIjogWzAsIDAuNjk0NDQsIDAuMDc5MzksIDAsIDAuNjIwNTVdLFxuICAgIFwiMzVcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMDY4MzMsIDAsIDAuOTQ0NDRdLFxuICAgIFwiMzdcIjogWzAuMDU1NTYsIDAuNzUsIDAuMTI4NjEsIDAsIDAuOTQ0NDRdLFxuICAgIFwiMzhcIjogWzAsIDAuNjk0NDQsIDAuMDg1MjgsIDAsIDAuODg1NTVdLFxuICAgIFwiMzlcIjogWzAsIDAuNjk0NDQsIDAuMTI5NDUsIDAsIDAuMzU1NTVdLFxuICAgIFwiNDBcIjogWzAuMjUsIDAuNzUsIDAuMTU4MDYsIDAsIDAuNDczMzNdLFxuICAgIFwiNDFcIjogWzAuMjUsIDAuNzUsIDAuMDMzMDYsIDAsIDAuNDczMzNdLFxuICAgIFwiNDJcIjogWzAsIDAuNzUsIDAuMTQzMzMsIDAsIDAuNTkxMTFdLFxuICAgIFwiNDNcIjogWzAuMTAzMzMsIDAuNjAzMzMsIDAuMDMzMDYsIDAsIDAuODg1NTVdLFxuICAgIFwiNDRcIjogWzAuMTk0NDQsIDAuMTQ3MjIsIDAsIDAsIDAuMzU1NTVdLFxuICAgIFwiNDVcIjogWzAsIDAuNDQ0NDQsIDAuMDI2MTEsIDAsIDAuNDE0NDRdLFxuICAgIFwiNDZcIjogWzAsIDAuMTQ3MjIsIDAsIDAsIDAuMzU1NTVdLFxuICAgIFwiNDdcIjogWzAuMjUsIDAuNzUsIDAuMTU4MDYsIDAsIDAuNTkxMTFdLFxuICAgIFwiNDhcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNDlcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTBcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTFcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTJcIjogWzAuMTk0NDQsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTNcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTRcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTVcIjogWzAuMTk0NDQsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTZcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNTdcIjogWzAsIDAuNjQ0NDQsIDAuMTMxNjcsIDAsIDAuNTkxMTFdLFxuICAgIFwiNThcIjogWzAsIDAuNDQ0NDQsIDAuMDY2OTUsIDAsIDAuMzU1NTVdLFxuICAgIFwiNTlcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDY2OTUsIDAsIDAuMzU1NTVdLFxuICAgIFwiNjFcIjogWy0wLjEwODg5LCAwLjM5MTExLCAwLjA2ODMzLCAwLCAwLjg4NTU1XSxcbiAgICBcIjYzXCI6IFswLCAwLjY5NDQ0LCAwLjExNDcyLCAwLCAwLjU5MTExXSxcbiAgICBcIjY0XCI6IFswLCAwLjY5NDQ0LCAwLjA5MjA4LCAwLCAwLjg4NTU1XSxcbiAgICBcIjY1XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjg2NTU1XSxcbiAgICBcIjY2XCI6IFswLCAwLjY4NjExLCAwLjA5OTIsIDAsIDAuODE2NjZdLFxuICAgIFwiNjdcIjogWzAsIDAuNjg2MTEsIDAuMTQyMDgsIDAsIDAuODI2NjZdLFxuICAgIFwiNjhcIjogWzAsIDAuNjg2MTEsIDAuMDkwNjIsIDAsIDAuODc1NTVdLFxuICAgIFwiNjlcIjogWzAsIDAuNjg2MTEsIDAuMTE0MzEsIDAsIDAuNzU2NjZdLFxuICAgIFwiNzBcIjogWzAsIDAuNjg2MTEsIDAuMTI5MDMsIDAsIDAuNzI3MjJdLFxuICAgIFwiNzFcIjogWzAsIDAuNjg2MTEsIDAuMDczNDcsIDAsIDAuODk1MjddLFxuICAgIFwiNzJcIjogWzAsIDAuNjg2MTEsIDAuMTcyMDgsIDAsIDAuODk2MV0sXG4gICAgXCI3M1wiOiBbMCwgMC42ODYxMSwgMC4xNTY4MSwgMCwgMC40NzE2Nl0sXG4gICAgXCI3NFwiOiBbMCwgMC42ODYxMSwgMC4xNDUsIDAsIDAuNjEwNTVdLFxuICAgIFwiNzVcIjogWzAsIDAuNjg2MTEsIDAuMTQyMDgsIDAsIDAuODk0OTldLFxuICAgIFwiNzZcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuNjk3NzddLFxuICAgIFwiNzdcIjogWzAsIDAuNjg2MTEsIDAuMTcyMDgsIDAsIDEuMDcyNzddLFxuICAgIFwiNzhcIjogWzAsIDAuNjg2MTEsIDAuMTcyMDgsIDAsIDAuODk2MV0sXG4gICAgXCI3OVwiOiBbMCwgMC42ODYxMSwgMC4wOTA2MiwgMCwgMC44NTQ5OV0sXG4gICAgXCI4MFwiOiBbMCwgMC42ODYxMSwgMC4wOTkyLCAwLCAwLjc4NzIxXSxcbiAgICBcIjgxXCI6IFswLjE5NDQ0LCAwLjY4NjExLCAwLjA5MDYyLCAwLCAwLjg1NDk5XSxcbiAgICBcIjgyXCI6IFswLCAwLjY4NjExLCAwLjAyNTU5LCAwLCAwLjg1OTQ0XSxcbiAgICBcIjgzXCI6IFswLCAwLjY4NjExLCAwLjExMjY0LCAwLCAwLjY0OTk5XSxcbiAgICBcIjg0XCI6IFswLCAwLjY4NjExLCAwLjEyOTAzLCAwLCAwLjc5NjFdLFxuICAgIFwiODVcIjogWzAsIDAuNjg2MTEsIDAuMTcyMDgsIDAsIDAuODgwODNdLFxuICAgIFwiODZcIjogWzAsIDAuNjg2MTEsIDAuMTg2MjUsIDAsIDAuODY1NTVdLFxuICAgIFwiODdcIjogWzAsIDAuNjg2MTEsIDAuMTg2MjUsIDAsIDEuMTU5OTldLFxuICAgIFwiODhcIjogWzAsIDAuNjg2MTEsIDAuMTU2ODEsIDAsIDAuODY1NTVdLFxuICAgIFwiODlcIjogWzAsIDAuNjg2MTEsIDAuMTk4MDMsIDAsIDAuODY1NTVdLFxuICAgIFwiOTBcIjogWzAsIDAuNjg2MTEsIDAuMTQyMDgsIDAsIDAuNzA4ODhdLFxuICAgIFwiOTFcIjogWzAuMjUsIDAuNzUsIDAuMTg3NSwgMCwgMC4zNTYxMV0sXG4gICAgXCI5M1wiOiBbMC4yNSwgMC43NSwgMC4wOTk3MiwgMCwgMC4zNTYxMV0sXG4gICAgXCI5NFwiOiBbMCwgMC42OTQ0NCwgMC4wNjcwOSwgMCwgMC41OTExMV0sXG4gICAgXCI5NVwiOiBbMC4zMSwgMC4xMzQ0NCwgMC4wOTgxMSwgMCwgMC41OTExMV0sXG4gICAgXCI5N1wiOiBbMCwgMC40NDQ0NCwgMC4wOTQyNiwgMCwgMC41OTExMV0sXG4gICAgXCI5OFwiOiBbMCwgMC42OTQ0NCwgMC4wNzg2MSwgMCwgMC41MzIyMl0sXG4gICAgXCI5OVwiOiBbMCwgMC40NDQ0NCwgMC4wNTIyMiwgMCwgMC41MzIyMl0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjk0NDQsIDAuMTA4NjEsIDAsIDAuNTkxMTFdLFxuICAgIFwiMTAxXCI6IFswLCAwLjQ0NDQ0LCAwLjA4NSwgMCwgMC41MzIyMl0sXG4gICAgXCIxMDJcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMjE3NzgsIDAsIDAuNF0sXG4gICAgXCIxMDNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMTA1LCAwLCAwLjUzMjIyXSxcbiAgICBcIjEwNFwiOiBbMCwgMC42OTQ0NCwgMC4wOTQyNiwgMCwgMC41OTExMV0sXG4gICAgXCIxMDVcIjogWzAsIDAuNjkzMjYsIDAuMTEzODcsIDAsIDAuMzU1NTVdLFxuICAgIFwiMTA2XCI6IFswLjE5NDQ0LCAwLjY5MzI2LCAwLjE2NzIsIDAsIDAuMzU1NTVdLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5NDQ0LCAwLjExMTExLCAwLCAwLjUzMjIyXSxcbiAgICBcIjEwOFwiOiBbMCwgMC42OTQ0NCwgMC4xMDg2MSwgMCwgMC4yOTY2Nl0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDQ0NDQsIDAuMDk0MjYsIDAsIDAuOTQ0NDRdLFxuICAgIFwiMTEwXCI6IFswLCAwLjQ0NDQ0LCAwLjA5NDI2LCAwLCAwLjY0OTk5XSxcbiAgICBcIjExMVwiOiBbMCwgMC40NDQ0NCwgMC4wNzg2MSwgMCwgMC41OTExMV0sXG4gICAgXCIxMTJcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDc4NjEsIDAsIDAuNTkxMTFdLFxuICAgIFwiMTEzXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLjEwNSwgMCwgMC41MzIyMl0sXG4gICAgXCIxMTRcIjogWzAsIDAuNDQ0NDQsIDAuMTExMTEsIDAsIDAuNTAxNjddLFxuICAgIFwiMTE1XCI6IFswLCAwLjQ0NDQ0LCAwLjA4MTY3LCAwLCAwLjQ4Njk0XSxcbiAgICBcIjExNlwiOiBbMCwgMC42MzQ5MiwgMC4wOTYzOSwgMCwgMC4zODVdLFxuICAgIFwiMTE3XCI6IFswLCAwLjQ0NDQ0LCAwLjA5NDI2LCAwLCAwLjYyMDU1XSxcbiAgICBcIjExOFwiOiBbMCwgMC40NDQ0NCwgMC4xMTExMSwgMCwgMC41MzIyMl0sXG4gICAgXCIxMTlcIjogWzAsIDAuNDQ0NDQsIDAuMTExMTEsIDAsIDAuNzY3NzddLFxuICAgIFwiMTIwXCI6IFswLCAwLjQ0NDQ0LCAwLjEyNTgzLCAwLCAwLjU2MDU1XSxcbiAgICBcIjEyMVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4xMDUsIDAsIDAuNTYxNjZdLFxuICAgIFwiMTIyXCI6IFswLCAwLjQ0NDQ0LCAwLjEzODg5LCAwLCAwLjQ5MDU1XSxcbiAgICBcIjEyNlwiOiBbMC4zNSwgMC4zNDQ0NCwgMC4xMTQ3MiwgMCwgMC41OTExMV0sXG4gICAgXCIxNjBcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiMTY4XCI6IFswLCAwLjY5NDQ0LCAwLjExNDczLCAwLCAwLjU5MTExXSxcbiAgICBcIjE3NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC45NDg4OF0sXG4gICAgXCIxODRcIjogWzAuMTcwMTQsIDAsIDAsIDAsIDAuNTMyMjJdLFxuICAgIFwiMTk4XCI6IFswLCAwLjY4NjExLCAwLjExNDMxLCAwLCAxLjAyMjc3XSxcbiAgICBcIjIxNlwiOiBbMC4wNDg2MSwgMC43MzQ3MiwgMC4wOTA2MiwgMCwgMC44ODU1NV0sXG4gICAgXCIyMjNcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMDk3MzYsIDAsIDAuNjY1XSxcbiAgICBcIjIzMFwiOiBbMCwgMC40NDQ0NCwgMC4wODUsIDAsIDAuODI2NjZdLFxuICAgIFwiMjQ4XCI6IFswLjA5NzIyLCAwLjU0MTY3LCAwLjA5NDU4LCAwLCAwLjU5MTExXSxcbiAgICBcIjMwNVwiOiBbMCwgMC40NDQ0NCwgMC4wOTQyNiwgMCwgMC4zNTU1NV0sXG4gICAgXCIzMzhcIjogWzAsIDAuNjg2MTEsIDAuMTE0MzEsIDAsIDEuMTQwNTRdLFxuICAgIFwiMzM5XCI6IFswLCAwLjQ0NDQ0LCAwLjA4NSwgMCwgMC44MjY2Nl0sXG4gICAgXCI1NjdcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDQ2MTEsIDAsIDAuMzg1XSxcbiAgICBcIjcxMFwiOiBbMCwgMC42OTQ0NCwgMC4wNjcwOSwgMCwgMC41OTExMV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNjMxOTQsIDAuMDgyNzEsIDAsIDAuNTkxMTFdLFxuICAgIFwiNzEzXCI6IFswLCAwLjU5NDQ0LCAwLjEwNDQ0LCAwLCAwLjU5MTExXSxcbiAgICBcIjcxNFwiOiBbMCwgMC42OTQ0NCwgMC4wODUyOCwgMCwgMC41OTExMV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTkxMTFdLFxuICAgIFwiNzI4XCI6IFswLCAwLjY5NDQ0LCAwLjEwMzMzLCAwLCAwLjU5MTExXSxcbiAgICBcIjcyOVwiOiBbMCwgMC42OTQ0NCwgMC4xMjk0NSwgMCwgMC4zNTU1NV0sXG4gICAgXCI3MzBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuOTQ4ODhdLFxuICAgIFwiNzMyXCI6IFswLCAwLjY5NDQ0LCAwLjExNDcyLCAwLCAwLjU5MTExXSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMC4xMTQ3MiwgMCwgMC41OTExMV0sXG4gICAgXCI5MTVcIjogWzAsIDAuNjg2MTEsIDAuMTI5MDMsIDAsIDAuNjk3NzddLFxuICAgIFwiOTE2XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjk0NDQ0XSxcbiAgICBcIjkyMFwiOiBbMCwgMC42ODYxMSwgMC4wOTA2MiwgMCwgMC44ODU1NV0sXG4gICAgXCI5MjNcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuODA2NjZdLFxuICAgIFwiOTI2XCI6IFswLCAwLjY4NjExLCAwLjE1MDkyLCAwLCAwLjc2Nzc3XSxcbiAgICBcIjkyOFwiOiBbMCwgMC42ODYxMSwgMC4xNzIwOCwgMCwgMC44OTYxXSxcbiAgICBcIjkzMVwiOiBbMCwgMC42ODYxMSwgMC4xMTQzMSwgMCwgMC44MjY2Nl0sXG4gICAgXCI5MzNcIjogWzAsIDAuNjg2MTEsIDAuMTA3NzgsIDAsIDAuODg1NTVdLFxuICAgIFwiOTM0XCI6IFswLCAwLjY4NjExLCAwLjA1NjMyLCAwLCAwLjgyNjY2XSxcbiAgICBcIjkzNlwiOiBbMCwgMC42ODYxMSwgMC4xMDc3OCwgMCwgMC44ODU1NV0sXG4gICAgXCI5MzdcIjogWzAsIDAuNjg2MTEsIDAuMDk5MiwgMCwgMC44MjY2Nl0sXG4gICAgXCI4MjExXCI6IFswLCAwLjQ0NDQ0LCAwLjA5ODExLCAwLCAwLjU5MTExXSxcbiAgICBcIjgyMTJcIjogWzAsIDAuNDQ0NDQsIDAuMDk4MTEsIDAsIDEuMTgyMjFdLFxuICAgIFwiODIxNlwiOiBbMCwgMC42OTQ0NCwgMC4xMjk0NSwgMCwgMC4zNTU1NV0sXG4gICAgXCI4MjE3XCI6IFswLCAwLjY5NDQ0LCAwLjEyOTQ1LCAwLCAwLjM1NTU1XSxcbiAgICBcIjgyMjBcIjogWzAsIDAuNjk0NDQsIDAuMTY3NzIsIDAsIDAuNjIwNTVdLFxuICAgIFwiODIyMVwiOiBbMCwgMC42OTQ0NCwgMC4wNzkzOSwgMCwgMC42MjA1NV1cbiAgfSxcbiAgXCJNYWluLUl0YWxpY1wiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCIzM1wiOiBbMCwgMC42OTQ0NCwgMC4xMjQxNywgMCwgMC4zMDY2N10sXG4gICAgXCIzNFwiOiBbMCwgMC42OTQ0NCwgMC4wNjk2MSwgMCwgMC41MTQ0NF0sXG4gICAgXCIzNVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMC4wNjYxNiwgMCwgMC44MTc3N10sXG4gICAgXCIzN1wiOiBbMC4wNTU1NiwgMC43NSwgMC4xMzYzOSwgMCwgMC44MTc3N10sXG4gICAgXCIzOFwiOiBbMCwgMC42OTQ0NCwgMC4wOTY5NCwgMCwgMC43NjY2Nl0sXG4gICAgXCIzOVwiOiBbMCwgMC42OTQ0NCwgMC4xMjQxNywgMCwgMC4zMDY2N10sXG4gICAgXCI0MFwiOiBbMC4yNSwgMC43NSwgMC4xNjE5NCwgMCwgMC40MDg4OV0sXG4gICAgXCI0MVwiOiBbMC4yNSwgMC43NSwgMC4wMzY5NCwgMCwgMC40MDg4OV0sXG4gICAgXCI0MlwiOiBbMCwgMC43NSwgMC4xNDkxNywgMCwgMC41MTExMV0sXG4gICAgXCI0M1wiOiBbMC4wNTY2NywgMC41NjE2NywgMC4wMzY5NCwgMCwgMC43NjY2Nl0sXG4gICAgXCI0NFwiOiBbMC4xOTQ0NCwgMC4xMDU1NiwgMCwgMCwgMC4zMDY2N10sXG4gICAgXCI0NVwiOiBbMCwgMC40MzA1NiwgMC4wMjgyNiwgMCwgMC4zNTc3OF0sXG4gICAgXCI0NlwiOiBbMCwgMC4xMDU1NiwgMCwgMCwgMC4zMDY2N10sXG4gICAgXCI0N1wiOiBbMC4yNSwgMC43NSwgMC4xNjE5NCwgMCwgMC41MTExMV0sXG4gICAgXCI0OFwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI0OVwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1MFwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1MVwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1MlwiOiBbMC4xOTQ0NCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1M1wiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1NFwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1NVwiOiBbMC4xOTQ0NCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1NlwiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1N1wiOiBbMCwgMC42NDQ0NCwgMC4xMzU1NiwgMCwgMC41MTExMV0sXG4gICAgXCI1OFwiOiBbMCwgMC40MzA1NiwgMC4wNTgyLCAwLCAwLjMwNjY3XSxcbiAgICBcIjU5XCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLjA1ODIsIDAsIDAuMzA2NjddLFxuICAgIFwiNjFcIjogWy0wLjEzMzEzLCAwLjM2Njg3LCAwLjA2NjE2LCAwLCAwLjc2NjY2XSxcbiAgICBcIjYzXCI6IFswLCAwLjY5NDQ0LCAwLjEyMjUsIDAsIDAuNTExMTFdLFxuICAgIFwiNjRcIjogWzAsIDAuNjk0NDQsIDAuMDk1OTcsIDAsIDAuNzY2NjZdLFxuICAgIFwiNjVcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNzQzMzNdLFxuICAgIFwiNjZcIjogWzAsIDAuNjgzMzMsIDAuMTAyNTcsIDAsIDAuNzAzODldLFxuICAgIFwiNjdcIjogWzAsIDAuNjgzMzMsIDAuMTQ1MjgsIDAsIDAuNzE1NTVdLFxuICAgIFwiNjhcIjogWzAsIDAuNjgzMzMsIDAuMDk0MDMsIDAsIDAuNzU1XSxcbiAgICBcIjY5XCI6IFswLCAwLjY4MzMzLCAwLjEyMDI4LCAwLCAwLjY3ODMzXSxcbiAgICBcIjcwXCI6IFswLCAwLjY4MzMzLCAwLjEzMzA1LCAwLCAwLjY1Mjc3XSxcbiAgICBcIjcxXCI6IFswLCAwLjY4MzMzLCAwLjA4NzIyLCAwLCAwLjc3MzYxXSxcbiAgICBcIjcyXCI6IFswLCAwLjY4MzMzLCAwLjE2Mzg5LCAwLCAwLjc0MzMzXSxcbiAgICBcIjczXCI6IFswLCAwLjY4MzMzLCAwLjE1ODA2LCAwLCAwLjM4NTU1XSxcbiAgICBcIjc0XCI6IFswLCAwLjY4MzMzLCAwLjE0MDI4LCAwLCAwLjUyNV0sXG4gICAgXCI3NVwiOiBbMCwgMC42ODMzMywgMC4xNDUyOCwgMCwgMC43Njg4OF0sXG4gICAgXCI3NlwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC42MjcyMl0sXG4gICAgXCI3N1wiOiBbMCwgMC42ODMzMywgMC4xNjM4OSwgMCwgMC44OTY2Nl0sXG4gICAgXCI3OFwiOiBbMCwgMC42ODMzMywgMC4xNjM4OSwgMCwgMC43NDMzM10sXG4gICAgXCI3OVwiOiBbMCwgMC42ODMzMywgMC4wOTQwMywgMCwgMC43NjY2Nl0sXG4gICAgXCI4MFwiOiBbMCwgMC42ODMzMywgMC4xMDI1NywgMCwgMC42NzgzM10sXG4gICAgXCI4MVwiOiBbMC4xOTQ0NCwgMC42ODMzMywgMC4wOTQwMywgMCwgMC43NjY2Nl0sXG4gICAgXCI4MlwiOiBbMCwgMC42ODMzMywgMC4wMzg2OCwgMCwgMC43Mjk0NF0sXG4gICAgXCI4M1wiOiBbMCwgMC42ODMzMywgMC4xMTk3MiwgMCwgMC41NjIyMl0sXG4gICAgXCI4NFwiOiBbMCwgMC42ODMzMywgMC4xMzMwNSwgMCwgMC43MTU1NV0sXG4gICAgXCI4NVwiOiBbMCwgMC42ODMzMywgMC4xNjM4OSwgMCwgMC43NDMzM10sXG4gICAgXCI4NlwiOiBbMCwgMC42ODMzMywgMC4xODM2MSwgMCwgMC43NDMzM10sXG4gICAgXCI4N1wiOiBbMCwgMC42ODMzMywgMC4xODM2MSwgMCwgMC45OTg4OF0sXG4gICAgXCI4OFwiOiBbMCwgMC42ODMzMywgMC4xNTgwNiwgMCwgMC43NDMzM10sXG4gICAgXCI4OVwiOiBbMCwgMC42ODMzMywgMC4xOTM4MywgMCwgMC43NDMzM10sXG4gICAgXCI5MFwiOiBbMCwgMC42ODMzMywgMC4xNDUyOCwgMCwgMC42MTMzM10sXG4gICAgXCI5MVwiOiBbMC4yNSwgMC43NSwgMC4xODc1LCAwLCAwLjMwNjY3XSxcbiAgICBcIjkzXCI6IFswLjI1LCAwLjc1LCAwLjEwNTI4LCAwLCAwLjMwNjY3XSxcbiAgICBcIjk0XCI6IFswLCAwLjY5NDQ0LCAwLjA2NjQ2LCAwLCAwLjUxMTExXSxcbiAgICBcIjk1XCI6IFswLjMxLCAwLjEyMDU2LCAwLjA5MjA4LCAwLCAwLjUxMTExXSxcbiAgICBcIjk3XCI6IFswLCAwLjQzMDU2LCAwLjA3NjcxLCAwLCAwLjUxMTExXSxcbiAgICBcIjk4XCI6IFswLCAwLjY5NDQ0LCAwLjA2MzEyLCAwLCAwLjQ2XSxcbiAgICBcIjk5XCI6IFswLCAwLjQzMDU2LCAwLjA1NjUzLCAwLCAwLjQ2XSxcbiAgICBcIjEwMFwiOiBbMCwgMC42OTQ0NCwgMC4xMDMzMywgMCwgMC41MTExMV0sXG4gICAgXCIxMDFcIjogWzAsIDAuNDMwNTYsIDAuMDc1MTQsIDAsIDAuNDZdLFxuICAgIFwiMTAyXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjIxMTk0LCAwLCAwLjMwNjY3XSxcbiAgICBcIjEwM1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMC4wODg0NywgMCwgMC40Nl0sXG4gICAgXCIxMDRcIjogWzAsIDAuNjk0NDQsIDAuMDc2NzEsIDAsIDAuNTExMTFdLFxuICAgIFwiMTA1XCI6IFswLCAwLjY1NTM2LCAwLjEwMTksIDAsIDAuMzA2NjddLFxuICAgIFwiMTA2XCI6IFswLjE5NDQ0LCAwLjY1NTM2LCAwLjE0NDY3LCAwLCAwLjMwNjY3XSxcbiAgICBcIjEwN1wiOiBbMCwgMC42OTQ0NCwgMC4xMDc2NCwgMCwgMC40Nl0sXG4gICAgXCIxMDhcIjogWzAsIDAuNjk0NDQsIDAuMTAzMzMsIDAsIDAuMjU1NTVdLFxuICAgIFwiMTA5XCI6IFswLCAwLjQzMDU2LCAwLjA3NjcxLCAwLCAwLjgxNzc3XSxcbiAgICBcIjExMFwiOiBbMCwgMC40MzA1NiwgMC4wNzY3MSwgMCwgMC41NjIyMl0sXG4gICAgXCIxMTFcIjogWzAsIDAuNDMwNTYsIDAuMDYzMTIsIDAsIDAuNTExMTFdLFxuICAgIFwiMTEyXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLjA2MzEyLCAwLCAwLjUxMTExXSxcbiAgICBcIjExM1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMC4wODg0NywgMCwgMC40Nl0sXG4gICAgXCIxMTRcIjogWzAsIDAuNDMwNTYsIDAuMTA3NjQsIDAsIDAuNDIxNjZdLFxuICAgIFwiMTE1XCI6IFswLCAwLjQzMDU2LCAwLjA4MjA4LCAwLCAwLjQwODg5XSxcbiAgICBcIjExNlwiOiBbMCwgMC42MTUwOCwgMC4wOTQ4NiwgMCwgMC4zMzIyMl0sXG4gICAgXCIxMTdcIjogWzAsIDAuNDMwNTYsIDAuMDc2NzEsIDAsIDAuNTM2NjZdLFxuICAgIFwiMTE4XCI6IFswLCAwLjQzMDU2LCAwLjEwNzY0LCAwLCAwLjQ2XSxcbiAgICBcIjExOVwiOiBbMCwgMC40MzA1NiwgMC4xMDc2NCwgMCwgMC42NjQ0NF0sXG4gICAgXCIxMjBcIjogWzAsIDAuNDMwNTYsIDAuMTIwNDIsIDAsIDAuNDYzODldLFxuICAgIFwiMTIxXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLjA4ODQ3LCAwLCAwLjQ4NTU1XSxcbiAgICBcIjEyMlwiOiBbMCwgMC40MzA1NiwgMC4xMjI5MiwgMCwgMC40MDg4OV0sXG4gICAgXCIxMjZcIjogWzAuMzUsIDAuMzE3ODYsIDAuMTE1ODUsIDAsIDAuNTExMTFdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjE2OFwiOiBbMCwgMC42Njc4NiwgMC4xMDQ3NCwgMCwgMC41MTExMV0sXG4gICAgXCIxNzZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODMxMjldLFxuICAgIFwiMTg0XCI6IFswLjE3MDE0LCAwLCAwLCAwLCAwLjQ2XSxcbiAgICBcIjE5OFwiOiBbMCwgMC42ODMzMywgMC4xMjAyOCwgMCwgMC44ODI3N10sXG4gICAgXCIyMTZcIjogWzAuMDQ4NjEsIDAuNzMxOTQsIDAuMDk0MDMsIDAsIDAuNzY2NjZdLFxuICAgIFwiMjIzXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjEwNTE0LCAwLCAwLjUzNjY2XSxcbiAgICBcIjIzMFwiOiBbMCwgMC40MzA1NiwgMC4wNzUxNCwgMCwgMC43MTU1NV0sXG4gICAgXCIyNDhcIjogWzAuMDk3MjIsIDAuNTI3NzgsIDAuMDkxOTQsIDAsIDAuNTExMTFdLFxuICAgIFwiMzM4XCI6IFswLCAwLjY4MzMzLCAwLjEyMDI4LCAwLCAwLjk4NDk5XSxcbiAgICBcIjMzOVwiOiBbMCwgMC40MzA1NiwgMC4wNzUxNCwgMCwgMC43MTU1NV0sXG4gICAgXCI3MTBcIjogWzAsIDAuNjk0NDQsIDAuMDY2NDYsIDAsIDAuNTExMTFdLFxuICAgIFwiNzExXCI6IFswLCAwLjYyODQ3LCAwLjA4Mjk1LCAwLCAwLjUxMTExXSxcbiAgICBcIjcxM1wiOiBbMCwgMC41NjE2NywgMC4xMDMzMywgMCwgMC41MTExMV0sXG4gICAgXCI3MTRcIjogWzAsIDAuNjk0NDQsIDAuMDk2OTQsIDAsIDAuNTExMTFdLFxuICAgIFwiNzE1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjUxMTExXSxcbiAgICBcIjcyOFwiOiBbMCwgMC42OTQ0NCwgMC4xMDgwNiwgMCwgMC41MTExMV0sXG4gICAgXCI3MjlcIjogWzAsIDAuNjY3ODYsIDAuMTE3NTIsIDAsIDAuMzA2NjddLFxuICAgIFwiNzMwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjgzMTI5XSxcbiAgICBcIjczMlwiOiBbMCwgMC42Njc4NiwgMC4xMTU4NSwgMCwgMC41MTExMV0sXG4gICAgXCI3MzNcIjogWzAsIDAuNjk0NDQsIDAuMTIyNSwgMCwgMC41MTExMV0sXG4gICAgXCI5MTVcIjogWzAsIDAuNjgzMzMsIDAuMTMzMDUsIDAsIDAuNjI3MjJdLFxuICAgIFwiOTE2XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjgxNzc3XSxcbiAgICBcIjkyMFwiOiBbMCwgMC42ODMzMywgMC4wOTQwMywgMCwgMC43NjY2Nl0sXG4gICAgXCI5MjNcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNjkyMjJdLFxuICAgIFwiOTI2XCI6IFswLCAwLjY4MzMzLCAwLjE1Mjk0LCAwLCAwLjY2NDQ0XSxcbiAgICBcIjkyOFwiOiBbMCwgMC42ODMzMywgMC4xNjM4OSwgMCwgMC43NDMzM10sXG4gICAgXCI5MzFcIjogWzAsIDAuNjgzMzMsIDAuMTIwMjgsIDAsIDAuNzE1NTVdLFxuICAgIFwiOTMzXCI6IFswLCAwLjY4MzMzLCAwLjExMTExLCAwLCAwLjc2NjY2XSxcbiAgICBcIjkzNFwiOiBbMCwgMC42ODMzMywgMC4wNTk4NiwgMCwgMC43MTU1NV0sXG4gICAgXCI5MzZcIjogWzAsIDAuNjgzMzMsIDAuMTExMTEsIDAsIDAuNzY2NjZdLFxuICAgIFwiOTM3XCI6IFswLCAwLjY4MzMzLCAwLjEwMjU3LCAwLCAwLjcxNTU1XSxcbiAgICBcIjgyMTFcIjogWzAsIDAuNDMwNTYsIDAuMDkyMDgsIDAsIDAuNTExMTFdLFxuICAgIFwiODIxMlwiOiBbMCwgMC40MzA1NiwgMC4wOTIwOCwgMCwgMS4wMjIyMl0sXG4gICAgXCI4MjE2XCI6IFswLCAwLjY5NDQ0LCAwLjEyNDE3LCAwLCAwLjMwNjY3XSxcbiAgICBcIjgyMTdcIjogWzAsIDAuNjk0NDQsIDAuMTI0MTcsIDAsIDAuMzA2NjddLFxuICAgIFwiODIyMFwiOiBbMCwgMC42OTQ0NCwgMC4xNjg1LCAwLCAwLjUxNDQ0XSxcbiAgICBcIjgyMjFcIjogWzAsIDAuNjk0NDQsIDAuMDY5NjEsIDAsIDAuNTE0NDRdLFxuICAgIFwiODQ2M1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC41NDAyOF1cbiAgfSxcbiAgXCJNYWluLVJlZ3VsYXJcIjoge1xuICAgIFwiMzJcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiMzNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiMzRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCIzNVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMC44MzMzNF0sXG4gICAgXCIzNlwiOiBbMC4wNTU1NiwgMC43NSwgMCwgMCwgMC41XSxcbiAgICBcIjM3XCI6IFswLjA1NTU2LCAwLjc1LCAwLCAwLCAwLjgzMzM0XSxcbiAgICBcIjM4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjM5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjQwXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjM4ODg5XSxcbiAgICBcIjQxXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjM4ODg5XSxcbiAgICBcIjQyXCI6IFswLCAwLjc1LCAwLCAwLCAwLjVdLFxuICAgIFwiNDNcIjogWzAuMDgzMzMsIDAuNTgzMzMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNDRcIjogWzAuMTk0NDQsIDAuMTA1NTYsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNDVcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuMzMzMzNdLFxuICAgIFwiNDZcIjogWzAsIDAuMTA1NTYsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNDdcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI0OFwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjQ5XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiNTBcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI1MVwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjUyXCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiNTNcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI1NFwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjU1XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI1N1wiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjU4XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjU5XCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjYwXCI6IFswLjAzOTEsIDAuNTM5MSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI2MVwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNjJcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjYzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjQ3MjIyXSxcbiAgICBcIjY0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjY1XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc1XSxcbiAgICBcIjY2XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjcwODM0XSxcbiAgICBcIjY3XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjY4XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc2Mzg5XSxcbiAgICBcIjY5XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjY4MDU2XSxcbiAgICBcIjcwXCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjY1Mjc4XSxcbiAgICBcIjcxXCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc4NDcyXSxcbiAgICBcIjcyXCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc1XSxcbiAgICBcIjczXCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjM2MTExXSxcbiAgICBcIjc0XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjUxMzg5XSxcbiAgICBcIjc1XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjc2XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjYyNV0sXG4gICAgXCI3N1wiOiBbMCwgMC42ODMzMywgMCwgMCwgMC45MTY2N10sXG4gICAgXCI3OFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43NV0sXG4gICAgXCI3OVwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4MFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC42ODA1Nl0sXG4gICAgXCI4MVwiOiBbMC4xOTQ0NCwgMC42ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4MlwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43MzYxMV0sXG4gICAgXCI4M1wiOiBbMCwgMC42ODMzMywgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI4NVwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43NV0sXG4gICAgXCI4NlwiOiBbMCwgMC42ODMzMywgMC4wMTM4OSwgMCwgMC43NV0sXG4gICAgXCI4N1wiOiBbMCwgMC42ODMzMywgMC4wMTM4OSwgMCwgMS4wMjc3OF0sXG4gICAgXCI4OFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43NV0sXG4gICAgXCI4OVwiOiBbMCwgMC42ODMzMywgMC4wMjUsIDAsIDAuNzVdLFxuICAgIFwiOTBcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiOTFcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiOTJcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI5M1wiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC4yNzc3OF0sXG4gICAgXCI5NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjk1XCI6IFswLjMxLCAwLjEyMDU2LCAwLjAyNzc4LCAwLCAwLjVdLFxuICAgIFwiOTdcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNV0sXG4gICAgXCI5OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI5OVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiMTAxXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjQ0NDQ1XSxcbiAgICBcIjEwMlwiOiBbMCwgMC42OTQ0NCwgMC4wNzc3OCwgMCwgMC4zMDU1Nl0sXG4gICAgXCIxMDNcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAuMDEzODksIDAsIDAuNV0sXG4gICAgXCIxMDRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiMTA1XCI6IFswLCAwLjY2Nzg2LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjEwNlwiOiBbMC4xOTQ0NCwgMC42Njc4NiwgMCwgMCwgMC4zMDU1Nl0sXG4gICAgXCIxMDdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTI3NzhdLFxuICAgIFwiMTA4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjEwOVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC44MzMzNF0sXG4gICAgXCIxMTBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiMTExXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjVdLFxuICAgIFwiMTEyXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjExM1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMCwgMC41Mjc3OF0sXG4gICAgXCIxMTRcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuMzkxNjddLFxuICAgIFwiMTE1XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjM5NDQ1XSxcbiAgICBcIjExNlwiOiBbMCwgMC42MTUwOCwgMCwgMCwgMC4zODg4OV0sXG4gICAgXCIxMTdcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiMTE4XCI6IFswLCAwLjQzMDU2LCAwLjAxMzg5LCAwLCAwLjUyNzc4XSxcbiAgICBcIjExOVwiOiBbMCwgMC40MzA1NiwgMC4wMTM4OSwgMCwgMC43MjIyMl0sXG4gICAgXCIxMjBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTI3NzhdLFxuICAgIFwiMTIxXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLjAxMzg5LCAwLCAwLjUyNzc4XSxcbiAgICBcIjEyMlwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCIxMjNcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCIxMjRcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiMTI1XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjVdLFxuICAgIFwiMTI2XCI6IFswLjM1LCAwLjMxNzg2LCAwLCAwLCAwLjVdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjE2M1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43NjkwOV0sXG4gICAgXCIxNjdcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuNDQ0NDVdLFxuICAgIFwiMTY4XCI6IFswLCAwLjY2Nzg2LCAwLCAwLCAwLjVdLFxuICAgIFwiMTcyXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjE3NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43NV0sXG4gICAgXCIxNzdcIjogWzAuMDgzMzMsIDAuNTgzMzMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTgyXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjYxMTExXSxcbiAgICBcIjE4NFwiOiBbMC4xNzAxNCwgMCwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCIxOThcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuOTAyNzhdLFxuICAgIFwiMjE1XCI6IFswLjA4MzMzLCAwLjU4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjIxNlwiOiBbMC4wNDg2MSwgMC43MzE5NCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCIyMjNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCIyMzBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiMjQ3XCI6IFswLjA4MzMzLCAwLjU4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjI0OFwiOiBbMC4wOTcyMiwgMC41Mjc3OCwgMCwgMCwgMC41XSxcbiAgICBcIjMwNVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC4yNzc3OF0sXG4gICAgXCIzMzhcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDEuMDEzODldLFxuICAgIFwiMzM5XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjU2N1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMCwgMC4zMDU1Nl0sXG4gICAgXCI3MTBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNjI4NDcsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTNcIjogWzAsIDAuNTY3NzgsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MjhcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MjlcIjogWzAsIDAuNjY3ODYsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNzMwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc1XSxcbiAgICBcIjczMlwiOiBbMCwgMC42Njc4NiwgMCwgMCwgMC41XSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjkxNVwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC42MjVdLFxuICAgIFwiOTE2XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjgzMzM0XSxcbiAgICBcIjkyMFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5MjNcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNjk0NDVdLFxuICAgIFwiOTI2XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjkyOFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43NV0sXG4gICAgXCI5MzFcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiOTMzXCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjkzNFwiOiBbMCwgMC42ODMzMywgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI5MzZcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiOTM3XCI6IFswLCAwLjY4MzMzLCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjgyMTFcIjogWzAsIDAuNDMwNTYsIDAuMDI3NzgsIDAsIDAuNV0sXG4gICAgXCI4MjEyXCI6IFswLCAwLjQzMDU2LCAwLjAyNzc4LCAwLCAxLjBdLFxuICAgIFwiODIxNlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4yNzc3OF0sXG4gICAgXCI4MjE3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjgyMjBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI4MjIxXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiODIyNFwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCI4MjI1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjQ0NDQ1XSxcbiAgICBcIjgyMzBcIjogWzAsIDAuMTIzLCAwLCAwLCAxLjE3Ml0sXG4gICAgXCI4MjQyXCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjI3NV0sXG4gICAgXCI4NDA3XCI6IFswLCAwLjcxNDQ0LCAwLjE1MzgyLCAwLCAwLjVdLFxuICAgIFwiODQ2M1wiOiBbMCwgMC42ODg4OSwgMCwgMCwgMC41NDAyOF0sXG4gICAgXCI4NDY1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg0NjdcIjogWzAsIDAuNjk0NDQsIDAsIDAuMTExMTEsIDAuNDE2NjddLFxuICAgIFwiODQ3MlwiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMC4xMTExMSwgMC42MzY0Nl0sXG4gICAgXCI4NDc2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjg1MDFcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiODU5MlwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NTkzXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiODU5NFwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NTk1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjVdLFxuICAgIFwiODU5NlwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NTk3XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjVdLFxuICAgIFwiODU5OFwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMS4wXSxcbiAgICBcIjg1OTlcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjAwXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAxLjBdLFxuICAgIFwiODYwMVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMS4wXSxcbiAgICBcIjg2MTRcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS4wXSxcbiAgICBcIjg2MTdcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS4xMjZdLFxuICAgIFwiODYxOFwiOiBbMC4wMTEsIDAuNTExLCAwLCAwLCAxLjEyNl0sXG4gICAgXCI4NjM2XCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMS4wXSxcbiAgICBcIjg2MzdcIjogWy0wLjEzMzEzLCAwLjM2Njg3LCAwLCAwLCAxLjBdLFxuICAgIFwiODY0MFwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjQxXCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMS4wXSxcbiAgICBcIjg2NTJcIjogWzAuMDExLCAwLjY3MSwgMCwgMCwgMS4wXSxcbiAgICBcIjg2NTZcIjogWy0wLjEzMzEzLCAwLjM2Njg3LCAwLCAwLCAxLjBdLFxuICAgIFwiODY1N1wiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI4NjU4XCI6IFstMC4xMzMxMywgMC4zNjY4NywgMCwgMCwgMS4wXSxcbiAgICBcIjg2NTlcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiODY2MFwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDEuMF0sXG4gICAgXCI4NjYxXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjYxMTExXSxcbiAgICBcIjg3MDRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiODcwNlwiOiBbMCwgMC42OTQ0NCwgMC4wNTU1NiwgMC4wODMzNCwgMC41MzA5XSxcbiAgICBcIjg3MDdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiODcwOVwiOiBbMC4wNTU1NiwgMC43NSwgMCwgMCwgMC41XSxcbiAgICBcIjg3MTFcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiODcxMlwiOiBbMC4wMzkxLCAwLjUzOTEsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODcxNVwiOiBbMC4wMzkxLCAwLjUzOTEsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODcyMlwiOiBbMC4wODMzMywgMC41ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzIzXCI6IFswLjA4MzMzLCAwLjU4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg3MjVcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI4NzI2XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjVdLFxuICAgIFwiODcyN1wiOiBbLTAuMDM0NzIsIDAuNDY1MjgsIDAsIDAsIDAuNV0sXG4gICAgXCI4NzI4XCI6IFstMC4wNTU1NSwgMC40NDQ0NSwgMCwgMCwgMC41XSxcbiAgICBcIjg3MjlcIjogWy0wLjA1NTU1LCAwLjQ0NDQ1LCAwLCAwLCAwLjVdLFxuICAgIFwiODczMFwiOiBbMC4yLCAwLjgsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiODczM1wiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzM0XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAxLjBdLFxuICAgIFwiODczNlwiOiBbMCwgMC42OTIyNCwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI4NzM5XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjg3NDFcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI4NzQzXCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg3NDRcIjogWzAsIDAuNTU1NTYsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODc0NVwiOiBbMCwgMC41NTU1NiwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI4NzQ2XCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg3NDdcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMTExMTEsIDAsIDAuNDE2NjddLFxuICAgIFwiODc2NFwiOiBbLTAuMTMzMTMsIDAuMzY2ODcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODc2OFwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMC4yNzc3OF0sXG4gICAgXCI4NzcxXCI6IFstMC4wMzYyNSwgMC40NjM3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzczXCI6IFstMC4wMjIsIDAuNTg5LCAwLCAwLCAwLjc3OF0sXG4gICAgXCI4Nzc2XCI6IFstMC4wMTY4OCwgMC40ODMxMiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzgxXCI6IFstMC4wMzYyNSwgMC40NjM3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4Nzg0XCI6IFstMC4xMzMsIDAuNjczLCAwLCAwLCAwLjc3OF0sXG4gICAgXCI4ODAxXCI6IFstMC4wMzYyNSwgMC40NjM3NSwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODA0XCI6IFswLjEzNTk3LCAwLjYzNTk3LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MDVcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgxMFwiOiBbMC4wMzkxLCAwLjUzOTEsIDAsIDAsIDEuMF0sXG4gICAgXCI4ODExXCI6IFswLjAzOTEsIDAuNTM5MSwgMCwgMCwgMS4wXSxcbiAgICBcIjg4MjZcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MjdcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MzRcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MzVcIjogWzAuMDM5MSwgMC41MzkxLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4MzhcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODgzOVwiOiBbMC4xMzU5NywgMC42MzU5NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODQ2XCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg4NDlcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg1MFwiOiBbMC4xMzU5NywgMC42MzU5NywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODUxXCI6IFswLCAwLjU1NTU2LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg4NTJcIjogWzAsIDAuNTU1NTYsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiODg1M1wiOiBbMC4wODMzMywgMC41ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODU0XCI6IFswLjA4MzMzLCAwLjU4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NTVcIjogWzAuMDgzMzMsIDAuNTgzMzMsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg1NlwiOiBbMC4wODMzMywgMC41ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4ODU3XCI6IFswLjA4MzMzLCAwLjU4MzMzLCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NjZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjExMTFdLFxuICAgIFwiODg2N1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI4ODY4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjg4NjlcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODg3MlwiOiBbMC4yNDksIDAuNzUsIDAsIDAsIDAuODY3XSxcbiAgICBcIjg5MDBcIjogWy0wLjA1NTU1LCAwLjQ0NDQ1LCAwLCAwLCAwLjVdLFxuICAgIFwiODkwMVwiOiBbLTAuMDU1NTUsIDAuNDQ0NDUsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiODkwMlwiOiBbLTAuMDM0NzIsIDAuNDY1MjgsIDAsIDAsIDAuNV0sXG4gICAgXCI4OTA0XCI6IFswLjAwNSwgMC41MDUsIDAsIDAsIDAuOV0sXG4gICAgXCI4OTQyXCI6IFswLjAzLCAwLjkwMywgMCwgMCwgMC4yNzhdLFxuICAgIFwiODk0M1wiOiBbLTAuMTksIDAuMzEzLCAwLCAwLCAxLjE3Ml0sXG4gICAgXCI4OTQ1XCI6IFstMC4xLCAwLjgyMywgMCwgMCwgMS4yODJdLFxuICAgIFwiODk2OFwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCI4OTY5XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjQ0NDQ1XSxcbiAgICBcIjg5NzBcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNDQ0NDVdLFxuICAgIFwiODk3MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCI4OTk0XCI6IFstMC4xNDIzNiwgMC4zNTc2NCwgMCwgMCwgMS4wXSxcbiAgICBcIjg5OTVcIjogWy0wLjE0MjM2LCAwLjM1NzY0LCAwLCAwLCAxLjBdLFxuICAgIFwiOTEzNlwiOiBbMC4yNDQsIDAuNzQ0LCAwLCAwLCAwLjQxMl0sXG4gICAgXCI5MTM3XCI6IFswLjI0NCwgMC43NDUsIDAsIDAsIDAuNDEyXSxcbiAgICBcIjk2NTFcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuODg4ODldLFxuICAgIFwiOTY1N1wiOiBbLTAuMDM0NzIsIDAuNDY1MjgsIDAsIDAsIDAuNV0sXG4gICAgXCI5NjYxXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjg4ODg5XSxcbiAgICBcIjk2NjdcIjogWy0wLjAzNDcyLCAwLjQ2NTI4LCAwLCAwLCAwLjVdLFxuICAgIFwiOTcxMVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMCwgMCwgMS4wXSxcbiAgICBcIjk4MjRcIjogWzAuMTI5NjMsIDAuNjk0NDQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiOTgyNVwiOiBbMC4xMjk2MywgMC42OTQ0NCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5ODI2XCI6IFswLjEyOTYzLCAwLjY5NDQ0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjk4MjdcIjogWzAuMTI5NjMsIDAuNjk0NDQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiOTgzN1wiOiBbMCwgMC43NSwgMCwgMCwgMC4zODg4OV0sXG4gICAgXCI5ODM4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjM4ODg5XSxcbiAgICBcIjk4MzlcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiMTAyMTZcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiMTAyMTdcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiMTAyMjJcIjogWzAuMjQ0LCAwLjc0NCwgMCwgMCwgMC40MTJdLFxuICAgIFwiMTAyMjNcIjogWzAuMjQ0LCAwLjc0NSwgMCwgMCwgMC40MTJdLFxuICAgIFwiMTAyMjlcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS42MDldLFxuICAgIFwiMTAyMzBcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS42MzhdLFxuICAgIFwiMTAyMzFcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS44NTldLFxuICAgIFwiMTAyMzJcIjogWzAuMDI0LCAwLjUyNSwgMCwgMCwgMS42MDldLFxuICAgIFwiMTAyMzNcIjogWzAuMDI0LCAwLjUyNSwgMCwgMCwgMS42MzhdLFxuICAgIFwiMTAyMzRcIjogWzAuMDI0LCAwLjUyNSwgMCwgMCwgMS44NThdLFxuICAgIFwiMTAyMzZcIjogWzAuMDExLCAwLjUxMSwgMCwgMCwgMS42MzhdLFxuICAgIFwiMTA4MTVcIjogWzAsIDAuNjgzMzMsIDAsIDAsIDAuNzVdLFxuICAgIFwiMTA5MjdcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiMTA5MjhcIjogWzAuMTM1OTcsIDAuNjM1OTcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNTczNzZcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDBdXG4gIH0sXG4gIFwiTWF0aC1Cb2xkSXRhbGljXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjQ4XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI0OVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTBcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjUxXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI1MlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjU0XCI6IFswLCAwLjY0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI1NVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC41NzVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNTc1XSxcbiAgICBcIjU3XCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLCAwLCAwLjU3NV0sXG4gICAgXCI2NVwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC44Njk0NF0sXG4gICAgXCI2NlwiOiBbMCwgMC42ODYxMSwgMC4wNDgzNSwgMCwgMC44NjY0XSxcbiAgICBcIjY3XCI6IFswLCAwLjY4NjExLCAwLjA2OTc5LCAwLCAwLjgxNjk0XSxcbiAgICBcIjY4XCI6IFswLCAwLjY4NjExLCAwLjAzMTk0LCAwLCAwLjkzODEyXSxcbiAgICBcIjY5XCI6IFswLCAwLjY4NjExLCAwLjA1NDUxLCAwLCAwLjgxMDA3XSxcbiAgICBcIjcwXCI6IFswLCAwLjY4NjExLCAwLjE1OTcyLCAwLCAwLjY4ODg5XSxcbiAgICBcIjcxXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjg4NjczXSxcbiAgICBcIjcyXCI6IFswLCAwLjY4NjExLCAwLjA4MjI5LCAwLCAwLjk4MjI5XSxcbiAgICBcIjczXCI6IFswLCAwLjY4NjExLCAwLjA3Nzc4LCAwLCAwLjUxMTExXSxcbiAgICBcIjc0XCI6IFswLCAwLjY4NjExLCAwLjEwMDY5LCAwLCAwLjYzMTI1XSxcbiAgICBcIjc1XCI6IFswLCAwLjY4NjExLCAwLjA2OTc5LCAwLCAwLjk3MTE4XSxcbiAgICBcIjc2XCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjc1NTU1XSxcbiAgICBcIjc3XCI6IFswLCAwLjY4NjExLCAwLjExNDI0LCAwLCAxLjE0MjAxXSxcbiAgICBcIjc4XCI6IFswLCAwLjY4NjExLCAwLjExNDI0LCAwLCAwLjk1MDM0XSxcbiAgICBcIjc5XCI6IFswLCAwLjY4NjExLCAwLjAzMTk0LCAwLCAwLjgzNjY2XSxcbiAgICBcIjgwXCI6IFswLCAwLjY4NjExLCAwLjE1OTcyLCAwLCAwLjcyMzA5XSxcbiAgICBcIjgxXCI6IFswLjE5NDQ0LCAwLjY4NjExLCAwLCAwLCAwLjg2ODYxXSxcbiAgICBcIjgyXCI6IFswLCAwLjY4NjExLCAwLjAwNDIxLCAwLCAwLjg3MjM1XSxcbiAgICBcIjgzXCI6IFswLCAwLjY4NjExLCAwLjA1MzgyLCAwLCAwLjY5MjcxXSxcbiAgICBcIjg0XCI6IFswLCAwLjY4NjExLCAwLjE1OTcyLCAwLCAwLjYzNjYzXSxcbiAgICBcIjg1XCI6IFswLCAwLjY4NjExLCAwLjExNDI0LCAwLCAwLjgwMDI3XSxcbiAgICBcIjg2XCI6IFswLCAwLjY4NjExLCAwLjI1NTU1LCAwLCAwLjY3Nzc4XSxcbiAgICBcIjg3XCI6IFswLCAwLjY4NjExLCAwLjE1OTcyLCAwLCAxLjA5MzA1XSxcbiAgICBcIjg4XCI6IFswLCAwLjY4NjExLCAwLjA3Nzc4LCAwLCAwLjk0NzIyXSxcbiAgICBcIjg5XCI6IFswLCAwLjY4NjExLCAwLjI1NTU1LCAwLCAwLjY3NDU4XSxcbiAgICBcIjkwXCI6IFswLCAwLjY4NjExLCAwLjA2OTc5LCAwLCAwLjc3MjU3XSxcbiAgICBcIjk3XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjYzMjg3XSxcbiAgICBcIjk4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjUyMDgzXSxcbiAgICBcIjk5XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjUxMzQyXSxcbiAgICBcIjEwMFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MDk3Ml0sXG4gICAgXCIxMDFcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNTUzNjFdLFxuICAgIFwiMTAyXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjExMDQyLCAwLCAwLjU2ODA2XSxcbiAgICBcIjEwM1wiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wMzcwNCwgMCwgMC41NDQ5XSxcbiAgICBcIjEwNFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42Njc1OV0sXG4gICAgXCIxMDVcIjogWzAsIDAuNjkzMjYsIDAsIDAsIDAuNDA0OF0sXG4gICAgXCIxMDZcIjogWzAuMTk0NDQsIDAuNjkzMjYsIDAuMDYyMiwgMCwgMC40NzA4M10sXG4gICAgXCIxMDdcIjogWzAsIDAuNjk0NDQsIDAuMDE4NTIsIDAsIDAuNjAzN10sXG4gICAgXCIxMDhcIjogWzAsIDAuNjk0NDQsIDAuMDA4OCwgMCwgMC4zNDgxNV0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDEuMDMyNF0sXG4gICAgXCIxMTBcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNzEyOTZdLFxuICAgIFwiMTExXCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjU4NDcyXSxcbiAgICBcIjExMlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC42MDA5Ml0sXG4gICAgXCIxMTNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDM3MDQsIDAsIDAuNTQyMTNdLFxuICAgIFwiMTE0XCI6IFswLCAwLjQ0NDQ0LCAwLjAzMTk0LCAwLCAwLjUyODddLFxuICAgIFwiMTE1XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjUzMTI1XSxcbiAgICBcIjExNlwiOiBbMCwgMC42MzQ5MiwgMCwgMCwgMC40MTUyOF0sXG4gICAgXCIxMTdcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNjgxMDJdLFxuICAgIFwiMTE4XCI6IFswLCAwLjQ0NDQ0LCAwLjAzNzA0LCAwLCAwLjU2NjY2XSxcbiAgICBcIjExOVwiOiBbMCwgMC40NDQ0NCwgMC4wMjc3OCwgMCwgMC44MzE0OF0sXG4gICAgXCIxMjBcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNjU5MDNdLFxuICAgIFwiMTIxXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLjAzNzA0LCAwLCAwLjU5MDI4XSxcbiAgICBcIjEyMlwiOiBbMCwgMC40NDQ0NCwgMC4wNDIxMywgMCwgMC41NTUwOV0sXG4gICAgXCIxNjBcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiOTE1XCI6IFswLCAwLjY4NjExLCAwLjE1OTcyLCAwLCAwLjY1Njk0XSxcbiAgICBcIjkxNlwiOiBbMCwgMC42ODYxMSwgMCwgMCwgMC45NTgzM10sXG4gICAgXCI5MjBcIjogWzAsIDAuNjg2MTEsIDAuMDMxOTQsIDAsIDAuODY3MjJdLFxuICAgIFwiOTIzXCI6IFswLCAwLjY4NjExLCAwLCAwLCAwLjgwNTU1XSxcbiAgICBcIjkyNlwiOiBbMCwgMC42ODYxMSwgMC4wNzQ1OCwgMCwgMC44NDEyNV0sXG4gICAgXCI5MjhcIjogWzAsIDAuNjg2MTEsIDAuMDgyMjksIDAsIDAuOTgyMjldLFxuICAgIFwiOTMxXCI6IFswLCAwLjY4NjExLCAwLjA1NDUxLCAwLCAwLjg4NTA3XSxcbiAgICBcIjkzM1wiOiBbMCwgMC42ODYxMSwgMC4xNTk3MiwgMCwgMC42NzA4M10sXG4gICAgXCI5MzRcIjogWzAsIDAuNjg2MTEsIDAsIDAsIDAuNzY2NjZdLFxuICAgIFwiOTM2XCI6IFswLCAwLjY4NjExLCAwLjExNjUzLCAwLCAwLjcxNDAyXSxcbiAgICBcIjkzN1wiOiBbMCwgMC42ODYxMSwgMC4wNDgzNSwgMCwgMC44Nzg5XSxcbiAgICBcIjk0NVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC43NjA2NF0sXG4gICAgXCI5NDZcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMDM0MDMsIDAsIDAuNjU5NzJdLFxuICAgIFwiOTQ3XCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLjA2Mzg5LCAwLCAwLjU5MDAzXSxcbiAgICBcIjk0OFwiOiBbMCwgMC42OTQ0NCwgMC4wMzgxOSwgMCwgMC41MjIyMl0sXG4gICAgXCI5NDlcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNTI4ODJdLFxuICAgIFwiOTUwXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjA2MjE1LCAwLCAwLjUwODMzXSxcbiAgICBcIjk1MVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wMzcwNCwgMCwgMC42XSxcbiAgICBcIjk1MlwiOiBbMCwgMC42OTQ0NCwgMC4wMzE5NCwgMCwgMC41NjE4XSxcbiAgICBcIjk1M1wiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC40MTIwNF0sXG4gICAgXCI5NTRcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNjY3NTldLFxuICAgIFwiOTU1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY3MDgzXSxcbiAgICBcIjk1NlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC43MDc4N10sXG4gICAgXCI5NTdcIjogWzAsIDAuNDQ0NDQsIDAuMDY4OTgsIDAsIDAuNTc2ODVdLFxuICAgIFwiOTU4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjAzMDIxLCAwLCAwLjUwODMzXSxcbiAgICBcIjk1OVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC41ODQ3Ml0sXG4gICAgXCI5NjBcIjogWzAsIDAuNDQ0NDQsIDAuMDM3MDQsIDAsIDAuNjgyNDFdLFxuICAgIFwiOTYxXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLCAwLCAwLjYxMThdLFxuICAgIFwiOTYyXCI6IFswLjA5NzIyLCAwLjQ0NDQ0LCAwLjA3OTE3LCAwLCAwLjQyMzYxXSxcbiAgICBcIjk2M1wiOiBbMCwgMC40NDQ0NCwgMC4wMzcwNCwgMCwgMC42ODU4OF0sXG4gICAgXCI5NjRcIjogWzAsIDAuNDQ0NDQsIDAuMTM0NzIsIDAsIDAuNTIwODNdLFxuICAgIFwiOTY1XCI6IFswLCAwLjQ0NDQ0LCAwLjAzNzA0LCAwLCAwLjYzMDU1XSxcbiAgICBcIjk2NlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC43NDcyMl0sXG4gICAgXCI5NjdcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAsIDAsIDAuNzE4MDVdLFxuICAgIFwiOTY4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjAzNzA0LCAwLCAwLjc1ODMzXSxcbiAgICBcIjk2OVwiOiBbMCwgMC40NDQ0NCwgMC4wMzcwNCwgMCwgMC43MTc4Ml0sXG4gICAgXCI5NzdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjkxNTVdLFxuICAgIFwiOTgxXCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjcxMjVdLFxuICAgIFwiOTgyXCI6IFswLCAwLjQ0NDQ0LCAwLjAzMTk0LCAwLCAwLjk3NV0sXG4gICAgXCIxMDA5XCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLCAwLCAwLjYxMThdLFxuICAgIFwiMTAxM1wiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC40ODMzM10sXG4gICAgXCI1NzY0OVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC4zOTM1Ml0sXG4gICAgXCI1NzkxMVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC40Mzg4OV1cbiAgfSxcbiAgXCJNYXRoLUl0YWxpY1wiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI0OFwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41XSxcbiAgICBcIjQ5XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNV0sXG4gICAgXCI1MVwiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMCwgMC41XSxcbiAgICBcIjUyXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTNcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAsIDAsIDAuNV0sXG4gICAgXCI1NFwiOiBbMCwgMC42NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjU1XCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjQ0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI1N1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMCwgMC41XSxcbiAgICBcIjY1XCI6IFswLCAwLjY4MzMzLCAwLCAwLjEzODg5LCAwLjc1XSxcbiAgICBcIjY2XCI6IFswLCAwLjY4MzMzLCAwLjA1MDE3LCAwLjA4MzM0LCAwLjc1ODUxXSxcbiAgICBcIjY3XCI6IFswLCAwLjY4MzMzLCAwLjA3MTUzLCAwLjA4MzM0LCAwLjcxNDcyXSxcbiAgICBcIjY4XCI6IFswLCAwLjY4MzMzLCAwLjAyNzc4LCAwLjA1NTU2LCAwLjgyNzkyXSxcbiAgICBcIjY5XCI6IFswLCAwLjY4MzMzLCAwLjA1NzY0LCAwLjA4MzM0LCAwLjczODJdLFxuICAgIFwiNzBcIjogWzAsIDAuNjgzMzMsIDAuMTM4ODksIDAuMDgzMzQsIDAuNjQzMDZdLFxuICAgIFwiNzFcIjogWzAsIDAuNjgzMzMsIDAsIDAuMDgzMzQsIDAuNzg2MjVdLFxuICAgIFwiNzJcIjogWzAsIDAuNjgzMzMsIDAuMDgxMjUsIDAuMDU1NTYsIDAuODMxMjVdLFxuICAgIFwiNzNcIjogWzAsIDAuNjgzMzMsIDAuMDc4NDcsIDAuMTExMTEsIDAuNDM5NThdLFxuICAgIFwiNzRcIjogWzAsIDAuNjgzMzMsIDAuMDk2MTgsIDAuMTY2NjcsIDAuNTU0NTFdLFxuICAgIFwiNzVcIjogWzAsIDAuNjgzMzMsIDAuMDcxNTMsIDAuMDU1NTYsIDAuODQ5MzFdLFxuICAgIFwiNzZcIjogWzAsIDAuNjgzMzMsIDAsIDAuMDI3NzgsIDAuNjgwNTZdLFxuICAgIFwiNzdcIjogWzAsIDAuNjgzMzMsIDAuMTA5MDMsIDAuMDgzMzQsIDAuOTcwMTRdLFxuICAgIFwiNzhcIjogWzAsIDAuNjgzMzMsIDAuMTA5MDMsIDAuMDgzMzQsIDAuODAzNDddLFxuICAgIFwiNzlcIjogWzAsIDAuNjgzMzMsIDAuMDI3NzgsIDAuMDgzMzQsIDAuNzYyNzhdLFxuICAgIFwiODBcIjogWzAsIDAuNjgzMzMsIDAuMTM4ODksIDAuMDgzMzQsIDAuNjQyMDFdLFxuICAgIFwiODFcIjogWzAuMTk0NDQsIDAuNjgzMzMsIDAsIDAuMDgzMzQsIDAuNzkwNTZdLFxuICAgIFwiODJcIjogWzAsIDAuNjgzMzMsIDAuMDA3NzMsIDAuMDgzMzQsIDAuNzU5MjldLFxuICAgIFwiODNcIjogWzAsIDAuNjgzMzMsIDAuMDU3NjQsIDAuMDgzMzQsIDAuNjEzMl0sXG4gICAgXCI4NFwiOiBbMCwgMC42ODMzMywgMC4xMzg4OSwgMC4wODMzNCwgMC41ODQzOF0sXG4gICAgXCI4NVwiOiBbMCwgMC42ODMzMywgMC4xMDkwMywgMC4wMjc3OCwgMC42ODI3OF0sXG4gICAgXCI4NlwiOiBbMCwgMC42ODMzMywgMC4yMjIyMiwgMCwgMC41ODMzM10sXG4gICAgXCI4N1wiOiBbMCwgMC42ODMzMywgMC4xMzg4OSwgMCwgMC45NDQ0NV0sXG4gICAgXCI4OFwiOiBbMCwgMC42ODMzMywgMC4wNzg0NywgMC4wODMzNCwgMC44Mjg0N10sXG4gICAgXCI4OVwiOiBbMCwgMC42ODMzMywgMC4yMjIyMiwgMCwgMC41ODA1Nl0sXG4gICAgXCI5MFwiOiBbMCwgMC42ODMzMywgMC4wNzE1MywgMC4wODMzNCwgMC42ODI2NF0sXG4gICAgXCI5N1wiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41Mjg1OV0sXG4gICAgXCI5OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC40MjkxN10sXG4gICAgXCI5OVwiOiBbMCwgMC40MzA1NiwgMCwgMC4wNTU1NiwgMC40MzI3Nl0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjk0NDQsIDAsIDAuMTY2NjcsIDAuNTIwNDldLFxuICAgIFwiMTAxXCI6IFswLCAwLjQzMDU2LCAwLCAwLjA1NTU2LCAwLjQ2NTYzXSxcbiAgICBcIjEwMlwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMC4xMDc2NCwgMC4xNjY2NywgMC40ODk1OV0sXG4gICAgXCIxMDNcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAuMDM1ODgsIDAuMDI3NzgsIDAuNDc2OTddLFxuICAgIFwiMTA0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU3NjE2XSxcbiAgICBcIjEwNVwiOiBbMCwgMC42NTk1MiwgMCwgMCwgMC4zNDQ1MV0sXG4gICAgXCIxMDZcIjogWzAuMTk0NDQsIDAuNjU5NTIsIDAuMDU3MjQsIDAsIDAuNDExODFdLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5NDQ0LCAwLjAzMTQ4LCAwLCAwLjUyMDZdLFxuICAgIFwiMTA4XCI6IFswLCAwLjY5NDQ0LCAwLjAxOTY4LCAwLjA4MzM0LCAwLjI5ODM4XSxcbiAgICBcIjEwOVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC44NzgwMV0sXG4gICAgXCIxMTBcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNjAwMjNdLFxuICAgIFwiMTExXCI6IFswLCAwLjQzMDU2LCAwLCAwLjA1NTU2LCAwLjQ4NDcyXSxcbiAgICBcIjExMlwiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMC4wODMzNCwgMC41MDMxM10sXG4gICAgXCIxMTNcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAuMDM1ODgsIDAuMDgzMzQsIDAuNDQ2NDFdLFxuICAgIFwiMTE0XCI6IFswLCAwLjQzMDU2LCAwLjAyNzc4LCAwLjA1NTU2LCAwLjQ1MTE2XSxcbiAgICBcIjExNVwiOiBbMCwgMC40MzA1NiwgMCwgMC4wNTU1NiwgMC40Njg3NV0sXG4gICAgXCIxMTZcIjogWzAsIDAuNjE1MDgsIDAsIDAuMDgzMzQsIDAuMzYxMTFdLFxuICAgIFwiMTE3XCI6IFswLCAwLjQzMDU2LCAwLCAwLjAyNzc4LCAwLjU3MjQ2XSxcbiAgICBcIjExOFwiOiBbMCwgMC40MzA1NiwgMC4wMzU4OCwgMC4wMjc3OCwgMC40ODQ3Ml0sXG4gICAgXCIxMTlcIjogWzAsIDAuNDMwNTYsIDAuMDI2OTEsIDAuMDgzMzQsIDAuNzE1OTJdLFxuICAgIFwiMTIwXCI6IFswLCAwLjQzMDU2LCAwLCAwLjAyNzc4LCAwLjU3MTUzXSxcbiAgICBcIjEyMVwiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMC4wMzU4OCwgMC4wNTU1NiwgMC40OTAyOF0sXG4gICAgXCIxMjJcIjogWzAsIDAuNDMwNTYsIDAuMDQzOTgsIDAuMDU1NTYsIDAuNDY1MDVdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjkxNVwiOiBbMCwgMC42ODMzMywgMC4xMzg4OSwgMC4wODMzNCwgMC42MTUyOF0sXG4gICAgXCI5MTZcIjogWzAsIDAuNjgzMzMsIDAsIDAuMTY2NjcsIDAuODMzMzRdLFxuICAgIFwiOTIwXCI6IFswLCAwLjY4MzMzLCAwLjAyNzc4LCAwLjA4MzM0LCAwLjc2Mjc4XSxcbiAgICBcIjkyM1wiOiBbMCwgMC42ODMzMywgMCwgMC4xNjY2NywgMC42OTQ0NV0sXG4gICAgXCI5MjZcIjogWzAsIDAuNjgzMzMsIDAuMDc1NjksIDAuMDgzMzQsIDAuNzQyMzZdLFxuICAgIFwiOTI4XCI6IFswLCAwLjY4MzMzLCAwLjA4MTI1LCAwLjA1NTU2LCAwLjgzMTI1XSxcbiAgICBcIjkzMVwiOiBbMCwgMC42ODMzMywgMC4wNTc2NCwgMC4wODMzNCwgMC43Nzk4Nl0sXG4gICAgXCI5MzNcIjogWzAsIDAuNjgzMzMsIDAuMTM4ODksIDAuMDU1NTYsIDAuNTgzMzNdLFxuICAgIFwiOTM0XCI6IFswLCAwLjY4MzMzLCAwLCAwLjA4MzM0LCAwLjY2NjY3XSxcbiAgICBcIjkzNlwiOiBbMCwgMC42ODMzMywgMC4xMSwgMC4wNTU1NiwgMC42MTIyMl0sXG4gICAgXCI5MzdcIjogWzAsIDAuNjgzMzMsIDAuMDUwMTcsIDAuMDgzMzQsIDAuNzcyNF0sXG4gICAgXCI5NDVcIjogWzAsIDAuNDMwNTYsIDAuMDAzNywgMC4wMjc3OCwgMC42Mzk3XSxcbiAgICBcIjk0NlwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMC4wNTI3OCwgMC4wODMzNCwgMC41NjU2M10sXG4gICAgXCI5NDdcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAuMDU1NTYsIDAsIDAuNTE3NzNdLFxuICAgIFwiOTQ4XCI6IFswLCAwLjY5NDQ0LCAwLjAzNzg1LCAwLjA1NTU2LCAwLjQ0NDQ0XSxcbiAgICBcIjk0OVwiOiBbMCwgMC40MzA1NiwgMCwgMC4wODMzNCwgMC40NjYzMl0sXG4gICAgXCI5NTBcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMDczNzgsIDAuMDgzMzQsIDAuNDM3NV0sXG4gICAgXCI5NTFcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAuMDM1ODgsIDAuMDU1NTYsIDAuNDk2NTNdLFxuICAgIFwiOTUyXCI6IFswLCAwLjY5NDQ0LCAwLjAyNzc4LCAwLjA4MzM0LCAwLjQ2OTQ0XSxcbiAgICBcIjk1M1wiOiBbMCwgMC40MzA1NiwgMCwgMC4wNTU1NiwgMC4zNTM5NF0sXG4gICAgXCI5NTRcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTc2MTZdLFxuICAgIFwiOTU1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU4MzM0XSxcbiAgICBcIjk1NlwiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMC4wMjc3OCwgMC42MDI1NV0sXG4gICAgXCI5NTdcIjogWzAsIDAuNDMwNTYsIDAuMDYzNjYsIDAuMDI3NzgsIDAuNDkzOThdLFxuICAgIFwiOTU4XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLjA0NjAxLCAwLjExMTExLCAwLjQzNzVdLFxuICAgIFwiOTU5XCI6IFswLCAwLjQzMDU2LCAwLCAwLjA1NTU2LCAwLjQ4NDcyXSxcbiAgICBcIjk2MFwiOiBbMCwgMC40MzA1NiwgMC4wMzU4OCwgMCwgMC41NzAwM10sXG4gICAgXCI5NjFcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAsIDAuMDgzMzQsIDAuNTE3MDJdLFxuICAgIFwiOTYyXCI6IFswLjA5NzIyLCAwLjQzMDU2LCAwLjA3OTg2LCAwLjA4MzM0LCAwLjM2Mjg1XSxcbiAgICBcIjk2M1wiOiBbMCwgMC40MzA1NiwgMC4wMzU4OCwgMCwgMC41NzE0MV0sXG4gICAgXCI5NjRcIjogWzAsIDAuNDMwNTYsIDAuMTEzMiwgMC4wMjc3OCwgMC40MzcxNV0sXG4gICAgXCI5NjVcIjogWzAsIDAuNDMwNTYsIDAuMDM1ODgsIDAuMDI3NzgsIDAuNTQwMjhdLFxuICAgIFwiOTY2XCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLjA4MzM0LCAwLjY1NDE3XSxcbiAgICBcIjk2N1wiOiBbMC4xOTQ0NCwgMC40MzA1NiwgMCwgMC4wNTU1NiwgMC42MjU2OV0sXG4gICAgXCI5NjhcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAuMDM1ODgsIDAuMTExMTEsIDAuNjUxMzldLFxuICAgIFwiOTY5XCI6IFswLCAwLjQzMDU2LCAwLjAzNTg4LCAwLCAwLjYyMjQ1XSxcbiAgICBcIjk3N1wiOiBbMCwgMC42OTQ0NCwgMCwgMC4wODMzNCwgMC41OTE0NF0sXG4gICAgXCI5ODFcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAuMDgzMzQsIDAuNTk1ODNdLFxuICAgIFwiOTgyXCI6IFswLCAwLjQzMDU2LCAwLjAyNzc4LCAwLCAwLjgyODEzXSxcbiAgICBcIjEwMDlcIjogWzAuMTk0NDQsIDAuNDMwNTYsIDAsIDAuMDgzMzQsIDAuNTE3MDJdLFxuICAgIFwiMTAxM1wiOiBbMCwgMC40MzA1NiwgMCwgMC4wNTU1NiwgMC40MDU5XSxcbiAgICBcIjU3NjQ5XCI6IFswLCAwLjQzMDU2LCAwLCAwLjAyNzc4LCAwLjMyMjQ2XSxcbiAgICBcIjU3OTExXCI6IFswLjE5NDQ0LCAwLjQzMDU2LCAwLCAwLjA4MzM0LCAwLjM4NDAzXVxuICB9LFxuICBcIlNhbnNTZXJpZi1Cb2xkXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjMzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjM2NjY3XSxcbiAgICBcIjM0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1ODM0XSxcbiAgICBcIjM1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjkxNjY3XSxcbiAgICBcIjM2XCI6IFswLjA1NTU2LCAwLjc1LCAwLCAwLCAwLjU1XSxcbiAgICBcIjM3XCI6IFswLjA1NTU2LCAwLjc1LCAwLCAwLCAxLjAyOTEyXSxcbiAgICBcIjM4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjgzMDU2XSxcbiAgICBcIjM5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjQwXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjQyNzc4XSxcbiAgICBcIjQxXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjQyNzc4XSxcbiAgICBcIjQyXCI6IFswLCAwLjc1LCAwLCAwLCAwLjU1XSxcbiAgICBcIjQzXCI6IFswLjExNjY3LCAwLjYxNjY3LCAwLCAwLCAwLjg1NTU2XSxcbiAgICBcIjQ0XCI6IFswLjEwNTU2LCAwLjEzMDU2LCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjQ1XCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjM2NjY3XSxcbiAgICBcIjQ2XCI6IFswLCAwLjEzMDU2LCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjQ3XCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjU1XSxcbiAgICBcIjQ4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjQ5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjUwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjUxXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjUyXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjUzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjU0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjU1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjU2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjU3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjU4XCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjU5XCI6IFswLjEwNTU2LCAwLjQ1ODMzLCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjYxXCI6IFstMC4wOTM3NSwgMC40MDYyNSwgMCwgMCwgMC44NTU1Nl0sXG4gICAgXCI2M1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41MTk0NV0sXG4gICAgXCI2NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI2NVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI2NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI2N1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MDI3OF0sXG4gICAgXCI2OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI2OVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42NDE2N10sXG4gICAgXCI3MFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI3MVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI3MlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI3M1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4zMzA1Nl0sXG4gICAgXCI3NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41MTk0NV0sXG4gICAgXCI3NVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43NjM4OV0sXG4gICAgXCI3NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41ODA1Nl0sXG4gICAgXCI3N1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC45Nzc3OF0sXG4gICAgXCI3OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI3OVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI4MFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MDI3OF0sXG4gICAgXCI4MVwiOiBbMC4xMDU1NiwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI4MlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MDI3OF0sXG4gICAgXCI4M1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI4NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI4NVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43NjM4OV0sXG4gICAgXCI4NlwiOiBbMCwgMC42OTQ0NCwgMC4wMTUyOCwgMCwgMC43MzMzNF0sXG4gICAgXCI4N1wiOiBbMCwgMC42OTQ0NCwgMC4wMTUyOCwgMCwgMS4wMzg4OV0sXG4gICAgXCI4OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCI4OVwiOiBbMCwgMC42OTQ0NCwgMC4wMjc1LCAwLCAwLjczMzM0XSxcbiAgICBcIjkwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY3MjIzXSxcbiAgICBcIjkxXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjM0MzA2XSxcbiAgICBcIjkzXCI6IFswLjI1LCAwLjc1LCAwLCAwLCAwLjM0MzA2XSxcbiAgICBcIjk0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjk1XCI6IFswLjM1LCAwLjEwODMzLCAwLjAzMDU2LCAwLCAwLjU1XSxcbiAgICBcIjk3XCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5OFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NjExMV0sXG4gICAgXCI5OVwiOiBbMCwgMC40NTgzMywgMCwgMCwgMC40ODg4OV0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTYxMTFdLFxuICAgIFwiMTAxXCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjUxMTExXSxcbiAgICBcIjEwMlwiOiBbMCwgMC42OTQ0NCwgMC4wNzYzOSwgMCwgMC4zMzYxMV0sXG4gICAgXCIxMDNcIjogWzAuMTk0NDQsIDAuNDU4MzMsIDAuMDE1MjgsIDAsIDAuNTVdLFxuICAgIFwiMTA0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU2MTExXSxcbiAgICBcIjEwNVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4yNTU1Nl0sXG4gICAgXCIxMDZcIjogWzAuMTk0NDQsIDAuNjk0NDQsIDAsIDAsIDAuMjg2MTFdLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjUzMDU2XSxcbiAgICBcIjEwOFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4yNTU1Nl0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDU4MzMsIDAsIDAsIDAuODY2NjddLFxuICAgIFwiMTEwXCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjU2MTExXSxcbiAgICBcIjExMVwiOiBbMCwgMC40NTgzMywgMCwgMCwgMC41NV0sXG4gICAgXCIxMTJcIjogWzAuMTk0NDQsIDAuNDU4MzMsIDAsIDAsIDAuNTYxMTFdLFxuICAgIFwiMTEzXCI6IFswLjE5NDQ0LCAwLjQ1ODMzLCAwLCAwLCAwLjU2MTExXSxcbiAgICBcIjExNFwiOiBbMCwgMC40NTgzMywgMC4wMTUyOCwgMCwgMC4zNzIyMl0sXG4gICAgXCIxMTVcIjogWzAsIDAuNDU4MzMsIDAsIDAsIDAuNDIxNjddLFxuICAgIFwiMTE2XCI6IFswLCAwLjU4OTI5LCAwLCAwLCAwLjQwNDE3XSxcbiAgICBcIjExN1wiOiBbMCwgMC40NTgzMywgMCwgMCwgMC41NjExMV0sXG4gICAgXCIxMThcIjogWzAsIDAuNDU4MzMsIDAuMDE1MjgsIDAsIDAuNV0sXG4gICAgXCIxMTlcIjogWzAsIDAuNDU4MzMsIDAuMDE1MjgsIDAsIDAuNzQ0NDVdLFxuICAgIFwiMTIwXCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjVdLFxuICAgIFwiMTIxXCI6IFswLjE5NDQ0LCAwLjQ1ODMzLCAwLjAxNTI4LCAwLCAwLjVdLFxuICAgIFwiMTIyXCI6IFswLCAwLjQ1ODMzLCAwLCAwLCAwLjQ3NjM5XSxcbiAgICBcIjEyNlwiOiBbMC4zNSwgMC4zNDQ0NCwgMCwgMCwgMC41NV0sXG4gICAgXCIxNjBcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiMTY4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjE3NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MzMzNF0sXG4gICAgXCIxODBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTVdLFxuICAgIFwiMTg0XCI6IFswLjE3MDE0LCAwLCAwLCAwLCAwLjQ4ODg5XSxcbiAgICBcIjMwNVwiOiBbMCwgMC40NTgzMywgMCwgMCwgMC4yNTU1Nl0sXG4gICAgXCI1NjdcIjogWzAuMTk0NDQsIDAuNDU4MzMsIDAsIDAsIDAuMjg2MTFdLFxuICAgIFwiNzEwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjcxMVwiOiBbMCwgMC42MzU0MiwgMCwgMCwgMC41NV0sXG4gICAgXCI3MTNcIjogWzAsIDAuNjM3NzgsIDAsIDAsIDAuNTVdLFxuICAgIFwiNzI4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjcyOVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4zMDU1Nl0sXG4gICAgXCI3MzBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzMzMzRdLFxuICAgIFwiNzMyXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1XSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NV0sXG4gICAgXCI5MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTgwNTZdLFxuICAgIFwiOTE2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjkxNjY3XSxcbiAgICBcIjkyMFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC44NTU1Nl0sXG4gICAgXCI5MjNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjcyMjNdLFxuICAgIFwiOTI2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjczMzM0XSxcbiAgICBcIjkyOFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI5MzFcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzk0NDVdLFxuICAgIFwiOTMzXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjg1NTU2XSxcbiAgICBcIjkzNFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43OTQ0NV0sXG4gICAgXCI5MzZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODU1NTZdLFxuICAgIFwiOTM3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc5NDQ1XSxcbiAgICBcIjgyMTFcIjogWzAsIDAuNDU4MzMsIDAuMDMwNTYsIDAsIDAuNTVdLFxuICAgIFwiODIxMlwiOiBbMCwgMC40NTgzMywgMC4wMzA1NiwgMCwgMS4xMDAwMV0sXG4gICAgXCI4MjE2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjMwNTU2XSxcbiAgICBcIjgyMTdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMzA1NTZdLFxuICAgIFwiODIyMFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NTgzNF0sXG4gICAgXCI4MjIxXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU1ODM0XVxuICB9LFxuICBcIlNhbnNTZXJpZi1JdGFsaWNcIjoge1xuICAgIFwiMzJcIjogWzAsIDAsIDAsIDAsIDAuMjVdLFxuICAgIFwiMzNcIjogWzAsIDAuNjk0NDQsIDAuMDU3MzMsIDAsIDAuMzE5NDVdLFxuICAgIFwiMzRcIjogWzAsIDAuNjk0NDQsIDAuMDAzMTYsIDAsIDAuNV0sXG4gICAgXCIzNVwiOiBbMC4xOTQ0NCwgMC42OTQ0NCwgMC4wNTA4NywgMCwgMC44MzMzNF0sXG4gICAgXCIzNlwiOiBbMC4wNTU1NiwgMC43NSwgMC4xMTE1NiwgMCwgMC41XSxcbiAgICBcIjM3XCI6IFswLjA1NTU2LCAwLjc1LCAwLjAzMTI2LCAwLCAwLjgzMzM0XSxcbiAgICBcIjM4XCI6IFswLCAwLjY5NDQ0LCAwLjAzMDU4LCAwLCAwLjc1ODM0XSxcbiAgICBcIjM5XCI6IFswLCAwLjY5NDQ0LCAwLjA3ODE2LCAwLCAwLjI3Nzc4XSxcbiAgICBcIjQwXCI6IFswLjI1LCAwLjc1LCAwLjEzMTY0LCAwLCAwLjM4ODg5XSxcbiAgICBcIjQxXCI6IFswLjI1LCAwLjc1LCAwLjAyNTM2LCAwLCAwLjM4ODg5XSxcbiAgICBcIjQyXCI6IFswLCAwLjc1LCAwLjExNzc1LCAwLCAwLjVdLFxuICAgIFwiNDNcIjogWzAuMDgzMzMsIDAuNTgzMzMsIDAuMDI1MzYsIDAsIDAuNzc3NzhdLFxuICAgIFwiNDRcIjogWzAuMTI1LCAwLjA4MzMzLCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjQ1XCI6IFswLCAwLjQ0NDQ0LCAwLjAxOTQ2LCAwLCAwLjMzMzMzXSxcbiAgICBcIjQ2XCI6IFswLCAwLjA4MzMzLCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjQ3XCI6IFswLjI1LCAwLjc1LCAwLjEzMTY0LCAwLCAwLjVdLFxuICAgIFwiNDhcIjogWzAsIDAuNjU1NTYsIDAuMTExNTYsIDAsIDAuNV0sXG4gICAgXCI0OVwiOiBbMCwgMC42NTU1NiwgMC4xMTE1NiwgMCwgMC41XSxcbiAgICBcIjUwXCI6IFswLCAwLjY1NTU2LCAwLjExMTU2LCAwLCAwLjVdLFxuICAgIFwiNTFcIjogWzAsIDAuNjU1NTYsIDAuMTExNTYsIDAsIDAuNV0sXG4gICAgXCI1MlwiOiBbMCwgMC42NTU1NiwgMC4xMTE1NiwgMCwgMC41XSxcbiAgICBcIjUzXCI6IFswLCAwLjY1NTU2LCAwLjExMTU2LCAwLCAwLjVdLFxuICAgIFwiNTRcIjogWzAsIDAuNjU1NTYsIDAuMTExNTYsIDAsIDAuNV0sXG4gICAgXCI1NVwiOiBbMCwgMC42NTU1NiwgMC4xMTE1NiwgMCwgMC41XSxcbiAgICBcIjU2XCI6IFswLCAwLjY1NTU2LCAwLjExMTU2LCAwLCAwLjVdLFxuICAgIFwiNTdcIjogWzAsIDAuNjU1NTYsIDAuMTExNTYsIDAsIDAuNV0sXG4gICAgXCI1OFwiOiBbMCwgMC40NDQ0NCwgMC4wMjUwMiwgMCwgMC4yNzc3OF0sXG4gICAgXCI1OVwiOiBbMC4xMjUsIDAuNDQ0NDQsIDAuMDI1MDIsIDAsIDAuMjc3NzhdLFxuICAgIFwiNjFcIjogWy0wLjEzLCAwLjM3LCAwLjA1MDg3LCAwLCAwLjc3Nzc4XSxcbiAgICBcIjYzXCI6IFswLCAwLjY5NDQ0LCAwLjExODA5LCAwLCAwLjQ3MjIyXSxcbiAgICBcIjY0XCI6IFswLCAwLjY5NDQ0LCAwLjA3NTU1LCAwLCAwLjY2NjY3XSxcbiAgICBcIjY1XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjY2XCI6IFswLCAwLjY5NDQ0LCAwLjA4MjkzLCAwLCAwLjY2NjY3XSxcbiAgICBcIjY3XCI6IFswLCAwLjY5NDQ0LCAwLjExOTgzLCAwLCAwLjYzODg5XSxcbiAgICBcIjY4XCI6IFswLCAwLjY5NDQ0LCAwLjA3NTU1LCAwLCAwLjcyMjIzXSxcbiAgICBcIjY5XCI6IFswLCAwLjY5NDQ0LCAwLjExOTgzLCAwLCAwLjU5NzIyXSxcbiAgICBcIjcwXCI6IFswLCAwLjY5NDQ0LCAwLjEzMzcyLCAwLCAwLjU2OTQ1XSxcbiAgICBcIjcxXCI6IFswLCAwLjY5NDQ0LCAwLjExOTgzLCAwLCAwLjY2NjY3XSxcbiAgICBcIjcyXCI6IFswLCAwLjY5NDQ0LCAwLjA4MDk0LCAwLCAwLjcwODM0XSxcbiAgICBcIjczXCI6IFswLCAwLjY5NDQ0LCAwLjEzMzcyLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjc0XCI6IFswLCAwLjY5NDQ0LCAwLjA4MDk0LCAwLCAwLjQ3MjIyXSxcbiAgICBcIjc1XCI6IFswLCAwLjY5NDQ0LCAwLjExOTgzLCAwLCAwLjY5NDQ1XSxcbiAgICBcIjc2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjU0MTY3XSxcbiAgICBcIjc3XCI6IFswLCAwLjY5NDQ0LCAwLjA4MDk0LCAwLCAwLjg3NV0sXG4gICAgXCI3OFwiOiBbMCwgMC42OTQ0NCwgMC4wODA5NCwgMCwgMC43MDgzNF0sXG4gICAgXCI3OVwiOiBbMCwgMC42OTQ0NCwgMC4wNzU1NSwgMCwgMC43MzYxMV0sXG4gICAgXCI4MFwiOiBbMCwgMC42OTQ0NCwgMC4wODI5MywgMCwgMC42Mzg4OV0sXG4gICAgXCI4MVwiOiBbMC4xMjUsIDAuNjk0NDQsIDAuMDc1NTUsIDAsIDAuNzM2MTFdLFxuICAgIFwiODJcIjogWzAsIDAuNjk0NDQsIDAuMDgyOTMsIDAsIDAuNjQ1ODRdLFxuICAgIFwiODNcIjogWzAsIDAuNjk0NDQsIDAuMDkyMDUsIDAsIDAuNTU1NTZdLFxuICAgIFwiODRcIjogWzAsIDAuNjk0NDQsIDAuMTMzNzIsIDAsIDAuNjgwNTZdLFxuICAgIFwiODVcIjogWzAsIDAuNjk0NDQsIDAuMDgwOTQsIDAsIDAuNjg3NV0sXG4gICAgXCI4NlwiOiBbMCwgMC42OTQ0NCwgMC4xNjE1LCAwLCAwLjY2NjY3XSxcbiAgICBcIjg3XCI6IFswLCAwLjY5NDQ0LCAwLjE2MTUsIDAsIDAuOTQ0NDVdLFxuICAgIFwiODhcIjogWzAsIDAuNjk0NDQsIDAuMTMzNzIsIDAsIDAuNjY2NjddLFxuICAgIFwiODlcIjogWzAsIDAuNjk0NDQsIDAuMTcyNjEsIDAsIDAuNjY2NjddLFxuICAgIFwiOTBcIjogWzAsIDAuNjk0NDQsIDAuMTE5ODMsIDAsIDAuNjExMTFdLFxuICAgIFwiOTFcIjogWzAuMjUsIDAuNzUsIDAuMTU5NDIsIDAsIDAuMjg4ODldLFxuICAgIFwiOTNcIjogWzAuMjUsIDAuNzUsIDAuMDg3MTksIDAsIDAuMjg4ODldLFxuICAgIFwiOTRcIjogWzAsIDAuNjk0NDQsIDAuMDc5OSwgMCwgMC41XSxcbiAgICBcIjk1XCI6IFswLjM1LCAwLjA5NDQ0LCAwLjA4NjE2LCAwLCAwLjVdLFxuICAgIFwiOTdcIjogWzAsIDAuNDQ0NDQsIDAuMDA5ODEsIDAsIDAuNDgwNTZdLFxuICAgIFwiOThcIjogWzAsIDAuNjk0NDQsIDAuMDMwNTcsIDAsIDAuNTE2NjddLFxuICAgIFwiOTlcIjogWzAsIDAuNDQ0NDQsIDAuMDgzMzYsIDAsIDAuNDQ0NDVdLFxuICAgIFwiMTAwXCI6IFswLCAwLjY5NDQ0LCAwLjA5NDgzLCAwLCAwLjUxNjY3XSxcbiAgICBcIjEwMVwiOiBbMCwgMC40NDQ0NCwgMC4wNjc3OCwgMCwgMC40NDQ0NV0sXG4gICAgXCIxMDJcIjogWzAsIDAuNjk0NDQsIDAuMjE3MDUsIDAsIDAuMzA1NTZdLFxuICAgIFwiMTAzXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLjEwODM2LCAwLCAwLjVdLFxuICAgIFwiMTA0XCI6IFswLCAwLjY5NDQ0LCAwLjAxNzc4LCAwLCAwLjUxNjY3XSxcbiAgICBcIjEwNVwiOiBbMCwgMC42NzkzNywgMC4wOTcxOCwgMCwgMC4yMzg4OV0sXG4gICAgXCIxMDZcIjogWzAuMTk0NDQsIDAuNjc5MzcsIDAuMDkxNjIsIDAsIDAuMjY2NjddLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5NDQ0LCAwLjA4MzM2LCAwLCAwLjQ4ODg5XSxcbiAgICBcIjEwOFwiOiBbMCwgMC42OTQ0NCwgMC4wOTQ4MywgMCwgMC4yMzg4OV0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDQ0NDQsIDAuMDE3NzgsIDAsIDAuNzk0NDVdLFxuICAgIFwiMTEwXCI6IFswLCAwLjQ0NDQ0LCAwLjAxNzc4LCAwLCAwLjUxNjY3XSxcbiAgICBcIjExMVwiOiBbMCwgMC40NDQ0NCwgMC4wNjYxMywgMCwgMC41XSxcbiAgICBcIjExMlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wMzg5LCAwLCAwLjUxNjY3XSxcbiAgICBcIjExM1wiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wNDE2OSwgMCwgMC41MTY2N10sXG4gICAgXCIxMTRcIjogWzAsIDAuNDQ0NDQsIDAuMTA4MzYsIDAsIDAuMzQxNjddLFxuICAgIFwiMTE1XCI6IFswLCAwLjQ0NDQ0LCAwLjA3NzgsIDAsIDAuMzgzMzNdLFxuICAgIFwiMTE2XCI6IFswLCAwLjU3MTQzLCAwLjA3MjI1LCAwLCAwLjM2MTExXSxcbiAgICBcIjExN1wiOiBbMCwgMC40NDQ0NCwgMC4wNDE2OSwgMCwgMC41MTY2N10sXG4gICAgXCIxMThcIjogWzAsIDAuNDQ0NDQsIDAuMTA4MzYsIDAsIDAuNDYxMTFdLFxuICAgIFwiMTE5XCI6IFswLCAwLjQ0NDQ0LCAwLjEwODM2LCAwLCAwLjY4MzM0XSxcbiAgICBcIjEyMFwiOiBbMCwgMC40NDQ0NCwgMC4wOTE2OSwgMCwgMC40NjExMV0sXG4gICAgXCIxMjFcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMTA4MzYsIDAsIDAuNDYxMTFdLFxuICAgIFwiMTIyXCI6IFswLCAwLjQ0NDQ0LCAwLjA4NzUyLCAwLCAwLjQzNDcyXSxcbiAgICBcIjEyNlwiOiBbMC4zNSwgMC4zMjY1OSwgMC4wODgyNiwgMCwgMC41XSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCIxNjhcIjogWzAsIDAuNjc5MzcsIDAuMDYzODUsIDAsIDAuNV0sXG4gICAgXCIxNzZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzM3NTJdLFxuICAgIFwiMTg0XCI6IFswLjE3MDE0LCAwLCAwLCAwLCAwLjQ0NDQ1XSxcbiAgICBcIjMwNVwiOiBbMCwgMC40NDQ0NCwgMC4wNDE2OSwgMCwgMC4yMzg4OV0sXG4gICAgXCI1NjdcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAuMDQxNjksIDAsIDAuMjY2NjddLFxuICAgIFwiNzEwXCI6IFswLCAwLjY5NDQ0LCAwLjA3OTksIDAsIDAuNV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNjMxOTQsIDAuMDg0MzIsIDAsIDAuNV0sXG4gICAgXCI3MTNcIjogWzAsIDAuNjA4ODksIDAuMDg3NzYsIDAsIDAuNV0sXG4gICAgXCI3MTRcIjogWzAsIDAuNjk0NDQsIDAuMDkyMDUsIDAsIDAuNV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MjhcIjogWzAsIDAuNjk0NDQsIDAuMDk0ODMsIDAsIDAuNV0sXG4gICAgXCI3MjlcIjogWzAsIDAuNjc5MzcsIDAuMDc3NzQsIDAsIDAuMjc3NzhdLFxuICAgIFwiNzMwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjczNzUyXSxcbiAgICBcIjczMlwiOiBbMCwgMC42NzY1OSwgMC4wODgyNiwgMCwgMC41XSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMC4wOTIwNSwgMCwgMC41XSxcbiAgICBcIjkxNVwiOiBbMCwgMC42OTQ0NCwgMC4xMzM3MiwgMCwgMC41NDE2N10sXG4gICAgXCI5MTZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiOTIwXCI6IFswLCAwLjY5NDQ0LCAwLjA3NTU1LCAwLCAwLjc3Nzc4XSxcbiAgICBcIjkyM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI5MjZcIjogWzAsIDAuNjk0NDQsIDAuMTI4MTYsIDAsIDAuNjY2NjddLFxuICAgIFwiOTI4XCI6IFswLCAwLjY5NDQ0LCAwLjA4MDk0LCAwLCAwLjcwODM0XSxcbiAgICBcIjkzMVwiOiBbMCwgMC42OTQ0NCwgMC4xMTk4MywgMCwgMC43MjIyMl0sXG4gICAgXCI5MzNcIjogWzAsIDAuNjk0NDQsIDAuMDkwMzEsIDAsIDAuNzc3NzhdLFxuICAgIFwiOTM0XCI6IFswLCAwLjY5NDQ0LCAwLjA0NjAzLCAwLCAwLjcyMjIyXSxcbiAgICBcIjkzNlwiOiBbMCwgMC42OTQ0NCwgMC4wOTAzMSwgMCwgMC43Nzc3OF0sXG4gICAgXCI5MzdcIjogWzAsIDAuNjk0NDQsIDAuMDgyOTMsIDAsIDAuNzIyMjJdLFxuICAgIFwiODIxMVwiOiBbMCwgMC40NDQ0NCwgMC4wODYxNiwgMCwgMC41XSxcbiAgICBcIjgyMTJcIjogWzAsIDAuNDQ0NDQsIDAuMDg2MTYsIDAsIDEuMF0sXG4gICAgXCI4MjE2XCI6IFswLCAwLjY5NDQ0LCAwLjA3ODE2LCAwLCAwLjI3Nzc4XSxcbiAgICBcIjgyMTdcIjogWzAsIDAuNjk0NDQsIDAuMDc4MTYsIDAsIDAuMjc3NzhdLFxuICAgIFwiODIyMFwiOiBbMCwgMC42OTQ0NCwgMC4xNDIwNSwgMCwgMC41XSxcbiAgICBcIjgyMjFcIjogWzAsIDAuNjk0NDQsIDAuMDAzMTYsIDAsIDAuNV1cbiAgfSxcbiAgXCJTYW5zU2VyaWYtUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCIzM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4zMTk0NV0sXG4gICAgXCIzNFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjM1XCI6IFswLjE5NDQ0LCAwLjY5NDQ0LCAwLCAwLCAwLjgzMzM0XSxcbiAgICBcIjM2XCI6IFswLjA1NTU2LCAwLjc1LCAwLCAwLCAwLjVdLFxuICAgIFwiMzdcIjogWzAuMDU1NTYsIDAuNzUsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiMzhcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzU4MzRdLFxuICAgIFwiMzlcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNDBcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiNDFcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuMzg4ODldLFxuICAgIFwiNDJcIjogWzAsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI0M1wiOiBbMC4wODMzMywgMC41ODMzMywgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI0NFwiOiBbMC4xMjUsIDAuMDgzMzMsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNDVcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuMzMzMzNdLFxuICAgIFwiNDZcIjogWzAsIDAuMDgzMzMsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNDdcIjogWzAuMjUsIDAuNzUsIDAsIDAsIDAuNV0sXG4gICAgXCI0OFwiOiBbMCwgMC42NTU1NiwgMCwgMCwgMC41XSxcbiAgICBcIjQ5XCI6IFswLCAwLjY1NTU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTBcIjogWzAsIDAuNjU1NTYsIDAsIDAsIDAuNV0sXG4gICAgXCI1MVwiOiBbMCwgMC42NTU1NiwgMCwgMCwgMC41XSxcbiAgICBcIjUyXCI6IFswLCAwLjY1NTU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTNcIjogWzAsIDAuNjU1NTYsIDAsIDAsIDAuNV0sXG4gICAgXCI1NFwiOiBbMCwgMC42NTU1NiwgMCwgMCwgMC41XSxcbiAgICBcIjU1XCI6IFswLCAwLjY1NTU2LCAwLCAwLCAwLjVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjU1NTYsIDAsIDAsIDAuNV0sXG4gICAgXCI1N1wiOiBbMCwgMC42NTU1NiwgMCwgMCwgMC41XSxcbiAgICBcIjU4XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjU5XCI6IFswLjEyNSwgMC40NDQ0NCwgMCwgMCwgMC4yNzc3OF0sXG4gICAgXCI2MVwiOiBbLTAuMTMsIDAuMzcsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiNjNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNDcyMjJdLFxuICAgIFwiNjRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiNjVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiNjZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiNjdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjM4ODldLFxuICAgIFwiNjhcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzIyMjNdLFxuICAgIFwiNjlcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTk3MjJdLFxuICAgIFwiNzBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTY5NDVdLFxuICAgIFwiNzFcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiNzJcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzA4MzRdLFxuICAgIFwiNzNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNzRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNDcyMjJdLFxuICAgIFwiNzVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjk0NDVdLFxuICAgIFwiNzZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTQxNjddLFxuICAgIFwiNzdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODc1XSxcbiAgICBcIjc4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcwODM0XSxcbiAgICBcIjc5XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjczNjExXSxcbiAgICBcIjgwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjYzODg5XSxcbiAgICBcIjgxXCI6IFswLjEyNSwgMC42OTQ0NCwgMCwgMCwgMC43MzYxMV0sXG4gICAgXCI4MlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42NDU4NF0sXG4gICAgXCI4M1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42ODA1Nl0sXG4gICAgXCI4NVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42ODc1XSxcbiAgICBcIjg2XCI6IFswLCAwLjY5NDQ0LCAwLjAxMzg5LCAwLCAwLjY2NjY3XSxcbiAgICBcIjg3XCI6IFswLCAwLjY5NDQ0LCAwLjAxMzg5LCAwLCAwLjk0NDQ1XSxcbiAgICBcIjg4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg5XCI6IFswLCAwLjY5NDQ0LCAwLjAyNSwgMCwgMC42NjY2N10sXG4gICAgXCI5MFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI5MVwiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC4yODg4OV0sXG4gICAgXCI5M1wiOiBbMC4yNSwgMC43NSwgMCwgMCwgMC4yODg4OV0sXG4gICAgXCI5NFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjk1XCI6IFswLjM1LCAwLjA5NDQ0LCAwLjAyNzc4LCAwLCAwLjVdLFxuICAgIFwiOTdcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNDgwNTZdLFxuICAgIFwiOThcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNTE2NjddLFxuICAgIFwiOTlcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNDQ0NDVdLFxuICAgIFwiMTAwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjUxNjY3XSxcbiAgICBcIjEwMVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC40NDQ0NV0sXG4gICAgXCIxMDJcIjogWzAsIDAuNjk0NDQsIDAuMDY5NDQsIDAsIDAuMzA1NTZdLFxuICAgIFwiMTAzXCI6IFswLjE5NDQ0LCAwLjQ0NDQ0LCAwLjAxMzg5LCAwLCAwLjVdLFxuICAgIFwiMTA0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjUxNjY3XSxcbiAgICBcIjEwNVwiOiBbMCwgMC42NzkzNywgMCwgMCwgMC4yMzg4OV0sXG4gICAgXCIxMDZcIjogWzAuMTk0NDQsIDAuNjc5MzcsIDAsIDAsIDAuMjY2NjddLFxuICAgIFwiMTA3XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjQ4ODg5XSxcbiAgICBcIjEwOFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC4yMzg4OV0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNzk0NDVdLFxuICAgIFwiMTEwXCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjUxNjY3XSxcbiAgICBcIjExMVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjExMlwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC41MTY2N10sXG4gICAgXCIxMTNcIjogWzAuMTk0NDQsIDAuNDQ0NDQsIDAsIDAsIDAuNTE2NjddLFxuICAgIFwiMTE0XCI6IFswLCAwLjQ0NDQ0LCAwLjAxMzg5LCAwLCAwLjM0MTY3XSxcbiAgICBcIjExNVwiOiBbMCwgMC40NDQ0NCwgMCwgMCwgMC4zODMzM10sXG4gICAgXCIxMTZcIjogWzAsIDAuNTcxNDMsIDAsIDAsIDAuMzYxMTFdLFxuICAgIFwiMTE3XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjUxNjY3XSxcbiAgICBcIjExOFwiOiBbMCwgMC40NDQ0NCwgMC4wMTM4OSwgMCwgMC40NjExMV0sXG4gICAgXCIxMTlcIjogWzAsIDAuNDQ0NDQsIDAuMDEzODksIDAsIDAuNjgzMzRdLFxuICAgIFwiMTIwXCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjQ2MTExXSxcbiAgICBcIjEyMVwiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMC4wMTM4OSwgMCwgMC40NjExMV0sXG4gICAgXCIxMjJcIjogWzAsIDAuNDQ0NDQsIDAsIDAsIDAuNDM0NzJdLFxuICAgIFwiMTI2XCI6IFswLjM1LCAwLjMyNjU5LCAwLCAwLCAwLjVdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjE2OFwiOiBbMCwgMC42NzkzNywgMCwgMCwgMC41XSxcbiAgICBcIjE3NlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42NjY2N10sXG4gICAgXCIxODRcIjogWzAuMTcwMTQsIDAsIDAsIDAsIDAuNDQ0NDVdLFxuICAgIFwiMzA1XCI6IFswLCAwLjQ0NDQ0LCAwLCAwLCAwLjIzODg5XSxcbiAgICBcIjU2N1wiOiBbMC4xOTQ0NCwgMC40NDQ0NCwgMCwgMCwgMC4yNjY2N10sXG4gICAgXCI3MTBcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNjMxOTQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTNcIjogWzAsIDAuNjA4ODksIDAsIDAsIDAuNV0sXG4gICAgXCI3MTRcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MjhcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV0sXG4gICAgXCI3MjlcIjogWzAsIDAuNjc5MzcsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiNzMwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjczMlwiOiBbMCwgMC42NzY1OSwgMCwgMCwgMC41XSxcbiAgICBcIjczM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjkxNVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41NDE2N10sXG4gICAgXCI5MTZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiOTIwXCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjc3Nzc4XSxcbiAgICBcIjkyM1wiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC42MTExMV0sXG4gICAgXCI5MjZcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiOTI4XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcwODM0XSxcbiAgICBcIjkzMVwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43MjIyMl0sXG4gICAgXCI5MzNcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiOTM0XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjcyMjIyXSxcbiAgICBcIjkzNlwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI5MzdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNzIyMjJdLFxuICAgIFwiODIxMVwiOiBbMCwgMC40NDQ0NCwgMC4wMjc3OCwgMCwgMC41XSxcbiAgICBcIjgyMTJcIjogWzAsIDAuNDQ0NDQsIDAuMDI3NzgsIDAsIDEuMF0sXG4gICAgXCI4MjE2XCI6IFswLCAwLjY5NDQ0LCAwLCAwLCAwLjI3Nzc4XSxcbiAgICBcIjgyMTdcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuMjc3NzhdLFxuICAgIFwiODIyMFwiOiBbMCwgMC42OTQ0NCwgMCwgMCwgMC41XSxcbiAgICBcIjgyMjFcIjogWzAsIDAuNjk0NDQsIDAsIDAsIDAuNV1cbiAgfSxcbiAgXCJTY3JpcHQtUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI2NVwiOiBbMCwgMC43LCAwLjIyOTI1LCAwLCAwLjgwMjUzXSxcbiAgICBcIjY2XCI6IFswLCAwLjcsIDAuMDQwODcsIDAsIDAuOTA3NTddLFxuICAgIFwiNjdcIjogWzAsIDAuNywgMC4xNjg5LCAwLCAwLjY2NjE5XSxcbiAgICBcIjY4XCI6IFswLCAwLjcsIDAuMDkzNzEsIDAsIDAuNzc0NDNdLFxuICAgIFwiNjlcIjogWzAsIDAuNywgMC4xODU4MywgMCwgMC41NjE2Ml0sXG4gICAgXCI3MFwiOiBbMCwgMC43LCAwLjEzNjM0LCAwLCAwLjg5NTQ0XSxcbiAgICBcIjcxXCI6IFswLCAwLjcsIDAuMTczMjIsIDAsIDAuNjA5NjFdLFxuICAgIFwiNzJcIjogWzAsIDAuNywgMC4yOTY5NCwgMCwgMC45NjkxOV0sXG4gICAgXCI3M1wiOiBbMCwgMC43LCAwLjE5MTg5LCAwLCAwLjgwOTA3XSxcbiAgICBcIjc0XCI6IFswLjI3Nzc4LCAwLjcsIDAuMTkxODksIDAsIDEuMDUxNTldLFxuICAgIFwiNzVcIjogWzAsIDAuNywgMC4zMTI1OSwgMCwgMC45MTM2NF0sXG4gICAgXCI3NlwiOiBbMCwgMC43LCAwLjE5MTg5LCAwLCAwLjg3MzczXSxcbiAgICBcIjc3XCI6IFswLCAwLjcsIDAuMTU5ODEsIDAsIDEuMDgwMzFdLFxuICAgIFwiNzhcIjogWzAsIDAuNywgMC4zNTI1LCAwLCAwLjkwMTVdLFxuICAgIFwiNzlcIjogWzAsIDAuNywgMC4wODA3OCwgMCwgMC43Mzc4N10sXG4gICAgXCI4MFwiOiBbMCwgMC43LCAwLjA4MDc4LCAwLCAxLjAxMjYyXSxcbiAgICBcIjgxXCI6IFswLCAwLjcsIDAuMDMzMDUsIDAsIDAuODgyODJdLFxuICAgIFwiODJcIjogWzAsIDAuNywgMC4wNjI1OSwgMCwgMC44NV0sXG4gICAgXCI4M1wiOiBbMCwgMC43LCAwLjE5MTg5LCAwLCAwLjg2NzY3XSxcbiAgICBcIjg0XCI6IFswLCAwLjcsIDAuMjkwODcsIDAsIDAuNzQ2OTddLFxuICAgIFwiODVcIjogWzAsIDAuNywgMC4yNTgxNSwgMCwgMC43OTk5Nl0sXG4gICAgXCI4NlwiOiBbMCwgMC43LCAwLjI3NTIzLCAwLCAwLjYyMjA0XSxcbiAgICBcIjg3XCI6IFswLCAwLjcsIDAuMjc1MjMsIDAsIDAuODA1MzJdLFxuICAgIFwiODhcIjogWzAsIDAuNywgMC4yNjAwNiwgMCwgMC45NDQ0NV0sXG4gICAgXCI4OVwiOiBbMCwgMC43LCAwLjI5MzksIDAsIDAuNzA5NjFdLFxuICAgIFwiOTBcIjogWzAsIDAuNywgMC4yNDAzNywgMCwgMC44MjEyXSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC4yNV1cbiAgfSxcbiAgXCJTaXplMS1SZWd1bGFyXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjQwXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjQ1ODM0XSxcbiAgICBcIjQxXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjQ1ODM0XSxcbiAgICBcIjQ3XCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjU3Nzc4XSxcbiAgICBcIjkxXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjQxNjY3XSxcbiAgICBcIjkyXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjU3Nzc4XSxcbiAgICBcIjkzXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjQxNjY3XSxcbiAgICBcIjEyM1wiOiBbMC4zNTAwMSwgMC44NSwgMCwgMCwgMC41ODMzNF0sXG4gICAgXCIxMjVcIjogWzAuMzUwMDEsIDAuODUsIDAsIDAsIDAuNTgzMzRdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjcxMFwiOiBbMCwgMC43MjIyMiwgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI3MzJcIjogWzAsIDAuNzIyMjIsIDAsIDAsIDAuNTU1NTZdLFxuICAgIFwiNzcwXCI6IFswLCAwLjcyMjIyLCAwLCAwLCAwLjU1NTU2XSxcbiAgICBcIjc3MVwiOiBbMCwgMC43MjIyMiwgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI4MjE0XCI6IFstMC4wMDA5OSwgMC42MDEsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODU5M1wiOiBbMWUtMDUsIDAuNiwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI4NTk1XCI6IFsxZS0wNSwgMC42LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjg2NTdcIjogWzFlLTA1LCAwLjYsIDAsIDAsIDAuNzc3NzhdLFxuICAgIFwiODY1OVwiOiBbMWUtMDUsIDAuNiwgMCwgMCwgMC43Nzc3OF0sXG4gICAgXCI4NzE5XCI6IFswLjI1MDAxLCAwLjc1LCAwLCAwLCAwLjk0NDQ1XSxcbiAgICBcIjg3MjBcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDAuOTQ0NDVdLFxuICAgIFwiODcyMVwiOiBbMC4yNTAwMSwgMC43NSwgMCwgMCwgMS4wNTU1Nl0sXG4gICAgXCI4NzMwXCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAxLjBdLFxuICAgIFwiODczOVwiOiBbLTAuMDA1OTksIDAuNjA2LCAwLCAwLCAwLjMzMzMzXSxcbiAgICBcIjg3NDFcIjogWy0wLjAwNTk5LCAwLjYwNiwgMCwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NzQ3XCI6IFswLjMwNjEyLCAwLjgwNSwgMC4xOTQ0NSwgMCwgMC40NzIyMl0sXG4gICAgXCI4NzQ4XCI6IFswLjMwNiwgMC44MDUsIDAuMTk0NDUsIDAsIDAuNDcyMjJdLFxuICAgIFwiODc0OVwiOiBbMC4zMDYsIDAuODA1LCAwLjE5NDQ1LCAwLCAwLjQ3MjIyXSxcbiAgICBcIjg3NTBcIjogWzAuMzA2MTIsIDAuODA1LCAwLjE5NDQ1LCAwLCAwLjQ3MjIyXSxcbiAgICBcIjg4OTZcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiODg5N1wiOiBbMC4yNTAwMSwgMC43NSwgMCwgMCwgMC44MzMzNF0sXG4gICAgXCI4ODk4XCI6IFswLjI1MDAxLCAwLjc1LCAwLCAwLCAwLjgzMzM0XSxcbiAgICBcIjg4OTlcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiODk2OFwiOiBbMC4zNTAwMSwgMC44NSwgMCwgMCwgMC40NzIyMl0sXG4gICAgXCI4OTY5XCI6IFswLjM1MDAxLCAwLjg1LCAwLCAwLCAwLjQ3MjIyXSxcbiAgICBcIjg5NzBcIjogWzAuMzUwMDEsIDAuODUsIDAsIDAsIDAuNDcyMjJdLFxuICAgIFwiODk3MVwiOiBbMC4zNTAwMSwgMC44NSwgMCwgMCwgMC40NzIyMl0sXG4gICAgXCI5MTY4XCI6IFstMC4wMDA5OSwgMC42MDEsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiMTAyMTZcIjogWzAuMzUwMDEsIDAuODUsIDAsIDAsIDAuNDcyMjJdLFxuICAgIFwiMTAyMTdcIjogWzAuMzUwMDEsIDAuODUsIDAsIDAsIDAuNDcyMjJdLFxuICAgIFwiMTA3NTJcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDEuMTExMTFdLFxuICAgIFwiMTA3NTNcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDEuMTExMTFdLFxuICAgIFwiMTA3NTRcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDEuMTExMTFdLFxuICAgIFwiMTA3NTZcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDAuODMzMzRdLFxuICAgIFwiMTA3NThcIjogWzAuMjUwMDEsIDAuNzUsIDAsIDAsIDAuODMzMzRdXG4gIH0sXG4gIFwiU2l6ZTItUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI0MFwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC41OTcyMl0sXG4gICAgXCI0MVwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC41OTcyMl0sXG4gICAgXCI0N1wiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC44MTExMV0sXG4gICAgXCI5MVwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC40NzIyMl0sXG4gICAgXCI5MlwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC44MTExMV0sXG4gICAgXCI5M1wiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC40NzIyMl0sXG4gICAgXCIxMjNcIjogWzAuNjUwMDIsIDEuMTUsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiMTI1XCI6IFswLjY1MDAyLCAxLjE1LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC4yNV0sXG4gICAgXCI3MTBcIjogWzAsIDAuNzUsIDAsIDAsIDEuMF0sXG4gICAgXCI3MzJcIjogWzAsIDAuNzUsIDAsIDAsIDEuMF0sXG4gICAgXCI3NzBcIjogWzAsIDAuNzUsIDAsIDAsIDEuMF0sXG4gICAgXCI3NzFcIjogWzAsIDAuNzUsIDAsIDAsIDEuMF0sXG4gICAgXCI4NzE5XCI6IFswLjU1MDAxLCAxLjA1LCAwLCAwLCAxLjI3Nzc4XSxcbiAgICBcIjg3MjBcIjogWzAuNTUwMDEsIDEuMDUsIDAsIDAsIDEuMjc3NzhdLFxuICAgIFwiODcyMVwiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS40NDQ0NV0sXG4gICAgXCI4NzMwXCI6IFswLjY1MDAyLCAxLjE1LCAwLCAwLCAxLjBdLFxuICAgIFwiODc0N1wiOiBbMC44NjIyNSwgMS4zNiwgMC40NDQ0NSwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NzQ4XCI6IFswLjg2MiwgMS4zNiwgMC40NDQ0NSwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NzQ5XCI6IFswLjg2MiwgMS4zNiwgMC40NDQ0NSwgMCwgMC41NTU1Nl0sXG4gICAgXCI4NzUwXCI6IFswLjg2MjI1LCAxLjM2LCAwLjQ0NDQ1LCAwLCAwLjU1NTU2XSxcbiAgICBcIjg4OTZcIjogWzAuNTUwMDEsIDEuMDUsIDAsIDAsIDEuMTExMTFdLFxuICAgIFwiODg5N1wiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS4xMTExMV0sXG4gICAgXCI4ODk4XCI6IFswLjU1MDAxLCAxLjA1LCAwLCAwLCAxLjExMTExXSxcbiAgICBcIjg4OTlcIjogWzAuNTUwMDEsIDEuMDUsIDAsIDAsIDEuMTExMTFdLFxuICAgIFwiODk2OFwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC41Mjc3OF0sXG4gICAgXCI4OTY5XCI6IFswLjY1MDAyLCAxLjE1LCAwLCAwLCAwLjUyNzc4XSxcbiAgICBcIjg5NzBcIjogWzAuNjUwMDIsIDEuMTUsIDAsIDAsIDAuNTI3NzhdLFxuICAgIFwiODk3MVwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC41Mjc3OF0sXG4gICAgXCIxMDIxNlwiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC42MTExMV0sXG4gICAgXCIxMDIxN1wiOiBbMC42NTAwMiwgMS4xNSwgMCwgMCwgMC42MTExMV0sXG4gICAgXCIxMDc1MlwiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS41MTExMl0sXG4gICAgXCIxMDc1M1wiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS41MTExMl0sXG4gICAgXCIxMDc1NFwiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS41MTExMl0sXG4gICAgXCIxMDc1NlwiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS4xMTExMV0sXG4gICAgXCIxMDc1OFwiOiBbMC41NTAwMSwgMS4wNSwgMCwgMCwgMS4xMTExMV1cbiAgfSxcbiAgXCJTaXplMy1SZWd1bGFyXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjQwXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAwLjczNjExXSxcbiAgICBcIjQxXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAwLjczNjExXSxcbiAgICBcIjQ3XCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAxLjA0NDQ1XSxcbiAgICBcIjkxXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAwLjUyNzc4XSxcbiAgICBcIjkyXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAxLjA0NDQ1XSxcbiAgICBcIjkzXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAwLjUyNzc4XSxcbiAgICBcIjEyM1wiOiBbMC45NTAwMywgMS40NSwgMCwgMCwgMC43NV0sXG4gICAgXCIxMjVcIjogWzAuOTUwMDMsIDEuNDUsIDAsIDAsIDAuNzVdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjcxMFwiOiBbMCwgMC43NSwgMCwgMCwgMS40NDQ0NV0sXG4gICAgXCI3MzJcIjogWzAsIDAuNzUsIDAsIDAsIDEuNDQ0NDVdLFxuICAgIFwiNzcwXCI6IFswLCAwLjc1LCAwLCAwLCAxLjQ0NDQ1XSxcbiAgICBcIjc3MVwiOiBbMCwgMC43NSwgMCwgMCwgMS40NDQ0NV0sXG4gICAgXCI4NzMwXCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAxLjBdLFxuICAgIFwiODk2OFwiOiBbMC45NTAwMywgMS40NSwgMCwgMCwgMC41ODMzNF0sXG4gICAgXCI4OTY5XCI6IFswLjk1MDAzLCAxLjQ1LCAwLCAwLCAwLjU4MzM0XSxcbiAgICBcIjg5NzBcIjogWzAuOTUwMDMsIDEuNDUsIDAsIDAsIDAuNTgzMzRdLFxuICAgIFwiODk3MVwiOiBbMC45NTAwMywgMS40NSwgMCwgMCwgMC41ODMzNF0sXG4gICAgXCIxMDIxNlwiOiBbMC45NTAwMywgMS40NSwgMCwgMCwgMC43NV0sXG4gICAgXCIxMDIxN1wiOiBbMC45NTAwMywgMS40NSwgMCwgMCwgMC43NV1cbiAgfSxcbiAgXCJTaXplNC1SZWd1bGFyXCI6IHtcbiAgICBcIjMyXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjQwXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAwLjc5MTY3XSxcbiAgICBcIjQxXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAwLjc5MTY3XSxcbiAgICBcIjQ3XCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAxLjI3Nzc4XSxcbiAgICBcIjkxXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAwLjU4MzM0XSxcbiAgICBcIjkyXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAxLjI3Nzc4XSxcbiAgICBcIjkzXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAwLjU4MzM0XSxcbiAgICBcIjEyM1wiOiBbMS4yNTAwMywgMS43NSwgMCwgMCwgMC44MDU1Nl0sXG4gICAgXCIxMjVcIjogWzEuMjUwMDMsIDEuNzUsIDAsIDAsIDAuODA1NTZdLFxuICAgIFwiMTYwXCI6IFswLCAwLCAwLCAwLCAwLjI1XSxcbiAgICBcIjcxMFwiOiBbMCwgMC44MjUsIDAsIDAsIDEuODg4OV0sXG4gICAgXCI3MzJcIjogWzAsIDAuODI1LCAwLCAwLCAxLjg4ODldLFxuICAgIFwiNzcwXCI6IFswLCAwLjgyNSwgMCwgMCwgMS44ODg5XSxcbiAgICBcIjc3MVwiOiBbMCwgMC44MjUsIDAsIDAsIDEuODg4OV0sXG4gICAgXCI4NzMwXCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAxLjBdLFxuICAgIFwiODk2OFwiOiBbMS4yNTAwMywgMS43NSwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCI4OTY5XCI6IFsxLjI1MDAzLCAxLjc1LCAwLCAwLCAwLjYzODg5XSxcbiAgICBcIjg5NzBcIjogWzEuMjUwMDMsIDEuNzUsIDAsIDAsIDAuNjM4ODldLFxuICAgIFwiODk3MVwiOiBbMS4yNTAwMywgMS43NSwgMCwgMCwgMC42Mzg4OV0sXG4gICAgXCI5MTE1XCI6IFswLjY0NTAyLCAxLjE1NSwgMCwgMCwgMC44NzVdLFxuICAgIFwiOTExNlwiOiBbMWUtMDUsIDAuNiwgMCwgMCwgMC44NzVdLFxuICAgIFwiOTExN1wiOiBbMC42NDUwMiwgMS4xNTUsIDAsIDAsIDAuODc1XSxcbiAgICBcIjkxMThcIjogWzAuNjQ1MDIsIDEuMTU1LCAwLCAwLCAwLjg3NV0sXG4gICAgXCI5MTE5XCI6IFsxZS0wNSwgMC42LCAwLCAwLCAwLjg3NV0sXG4gICAgXCI5MTIwXCI6IFswLjY0NTAyLCAxLjE1NSwgMCwgMCwgMC44NzVdLFxuICAgIFwiOTEyMVwiOiBbMC42NDUwMiwgMS4xNTUsIDAsIDAsIDAuNjY2NjddLFxuICAgIFwiOTEyMlwiOiBbLTAuMDAwOTksIDAuNjAxLCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjkxMjNcIjogWzAuNjQ1MDIsIDEuMTU1LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjkxMjRcIjogWzAuNjQ1MDIsIDEuMTU1LCAwLCAwLCAwLjY2NjY3XSxcbiAgICBcIjkxMjVcIjogWy0wLjAwMDk5LCAwLjYwMSwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI5MTI2XCI6IFswLjY0NTAyLCAxLjE1NSwgMCwgMCwgMC42NjY2N10sXG4gICAgXCI5MTI3XCI6IFsxZS0wNSwgMC45LCAwLCAwLCAwLjg4ODg5XSxcbiAgICBcIjkxMjhcIjogWzAuNjUwMDIsIDEuMTUsIDAsIDAsIDAuODg4ODldLFxuICAgIFwiOTEyOVwiOiBbMC45MDAwMSwgMCwgMCwgMCwgMC44ODg4OV0sXG4gICAgXCI5MTMwXCI6IFswLCAwLjMsIDAsIDAsIDAuODg4ODldLFxuICAgIFwiOTEzMVwiOiBbMWUtMDUsIDAuOSwgMCwgMCwgMC44ODg4OV0sXG4gICAgXCI5MTMyXCI6IFswLjY1MDAyLCAxLjE1LCAwLCAwLCAwLjg4ODg5XSxcbiAgICBcIjkxMzNcIjogWzAuOTAwMDEsIDAsIDAsIDAsIDAuODg4ODldLFxuICAgIFwiOTE0M1wiOiBbMC44ODUwMiwgMC45MTUsIDAsIDAsIDEuMDU1NTZdLFxuICAgIFwiMTAyMTZcIjogWzEuMjUwMDMsIDEuNzUsIDAsIDAsIDAuODA1NTZdLFxuICAgIFwiMTAyMTdcIjogWzEuMjUwMDMsIDEuNzUsIDAsIDAsIDAuODA1NTZdLFxuICAgIFwiNTczNDRcIjogWy0wLjAwNDk5LCAwLjYwNSwgMCwgMCwgMS4wNTU1Nl0sXG4gICAgXCI1NzM0NVwiOiBbLTAuMDA0OTksIDAuNjA1LCAwLCAwLCAxLjA1NTU2XSxcbiAgICBcIjU3NjgwXCI6IFswLCAwLjEyLCAwLCAwLCAwLjQ1XSxcbiAgICBcIjU3NjgxXCI6IFswLCAwLjEyLCAwLCAwLCAwLjQ1XSxcbiAgICBcIjU3NjgyXCI6IFswLCAwLjEyLCAwLCAwLCAwLjQ1XSxcbiAgICBcIjU3NjgzXCI6IFswLCAwLjEyLCAwLCAwLCAwLjQ1XVxuICB9LFxuICBcIlR5cGV3cml0ZXItUmVndWxhclwiOiB7XG4gICAgXCIzMlwiOiBbMCwgMCwgMCwgMCwgMC41MjVdLFxuICAgIFwiMzNcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjM0XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIzNVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiMzZcIjogWzAuMDgzMzMsIDAuNjk0NDQsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjM3XCI6IFswLjA4MzMzLCAwLjY5NDQ0LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIzOFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiMzlcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjQwXCI6IFswLjA4MzMzLCAwLjY5NDQ0LCAwLCAwLCAwLjUyNV0sXG4gICAgXCI0MVwiOiBbMC4wODMzMywgMC42OTQ0NCwgMCwgMCwgMC41MjVdLFxuICAgIFwiNDJcIjogWzAsIDAuNTIwODMsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjQzXCI6IFstMC4wODA1NiwgMC41MzA1NSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNDRcIjogWzAuMTM4ODksIDAuMTI1LCAwLCAwLCAwLjUyNV0sXG4gICAgXCI0NVwiOiBbLTAuMDgwNTYsIDAuNTMwNTUsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjQ2XCI6IFswLCAwLjEyNSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNDdcIjogWzAuMDgzMzMsIDAuNjk0NDQsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjQ4XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI0OVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNTBcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjUxXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI1MlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNTNcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjU0XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI1NVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNTZcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjU3XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI1OFwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiNTlcIjogWzAuMTM4ODksIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjYwXCI6IFstMC4wNTU1NiwgMC41NTU1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiNjFcIjogWy0wLjE5NTQ5LCAwLjQxNTYyLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI2MlwiOiBbLTAuMDU1NTYsIDAuNTU1NTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjYzXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI2NFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNjVcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjY2XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI2N1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNjhcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjY5XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3MFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzFcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjcyXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3M1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzRcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjc1XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3NlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzdcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjc4XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3OVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODBcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjgxXCI6IFswLjEzODg5LCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI4MlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODNcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjg0XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI4NVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODZcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjg3XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI4OFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODlcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkwXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5MVwiOiBbMC4wODMzMywgMC42OTQ0NCwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTJcIjogWzAuMDgzMzMsIDAuNjk0NDQsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkzXCI6IFswLjA4MzMzLCAwLjY5NDQ0LCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5NFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTVcIjogWzAuMDk1MTQsIDAsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjk2XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5N1wiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiOThcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjk5XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMDBcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjEwMVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTAyXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMDNcIjogWzAuMjIyMjIsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjEwNFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTA1XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMDZcIjogWzAuMjIyMjIsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjEwN1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTA4XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMDlcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjExMFwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTExXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMTJcIjogWzAuMjIyMjIsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjExM1wiOiBbMC4yMjIyMiwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTE0XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMTVcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjExNlwiOiBbMCwgMC41NTM1OCwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTE3XCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMThcIjogWzAsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjExOVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTIwXCI6IFswLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMjFcIjogWzAuMjIyMjIsIDAuNDMwNTYsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjEyMlwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTIzXCI6IFswLjA4MzMzLCAwLjY5NDQ0LCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMjRcIjogWzAuMDgzMzMsIDAuNjk0NDQsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjEyNVwiOiBbMC4wODMzMywgMC42OTQ0NCwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTI2XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxMjdcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjE2MFwiOiBbMCwgMCwgMCwgMCwgMC41MjVdLFxuICAgIFwiMTc2XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCIxODRcIjogWzAuMTk0NDUsIDAsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjMwNVwiOiBbMCwgMC40MzA1NiwgMCwgMCwgMC41MjVdLFxuICAgIFwiNTY3XCI6IFswLjIyMjIyLCAwLjQzMDU2LCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3MTFcIjogWzAsIDAuNTY1OTcsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjcxM1wiOiBbMCwgMC41NjU1NSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzE0XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3MTVcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjcyOFwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzMwXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI3NzBcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjc3MVwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiNzc2XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5MTVcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkxNlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTIwXCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5MjNcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkyNlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTI4XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5MzFcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkzM1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTM0XCI6IFswLCAwLjYxMTExLCAwLCAwLCAwLjUyNV0sXG4gICAgXCI5MzZcIjogWzAsIDAuNjExMTEsIDAsIDAsIDAuNTI1XSxcbiAgICBcIjkzN1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODIxNlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODIxN1wiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiODI0MlwiOiBbMCwgMC42MTExMSwgMCwgMCwgMC41MjVdLFxuICAgIFwiOTI1MVwiOiBbMC4xMTExMSwgMC4yMTk0NCwgMCwgMCwgMC41MjVdXG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2ZvbnRNZXRyaWNzLmpzXG5cblxuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgbWV0cmljcyByZWdhcmRpbmcgZm9udHMgYW5kIGluZGl2aWR1YWwgc3ltYm9scy4gVGhlIHNpZ21hXG4gKiBhbmQgeGkgdmFyaWFibGVzLCBhcyB3ZWxsIGFzIHRoZSBtZXRyaWNNYXAgbWFwIGNvbnRhaW4gZGF0YSBleHRyYWN0ZWQgZnJvbVxuICogVGVYLCBUZVggZm9udCBtZXRyaWNzLCBhbmQgdGhlIFRURiBmaWxlcy4gVGhlc2UgZGF0YSBhcmUgdGhlbiBleHBvc2VkIHZpYSB0aGVcbiAqIGBtZXRyaWNzYCB2YXJpYWJsZSBhbmQgdGhlIGdldENoYXJhY3Rlck1ldHJpY3MgZnVuY3Rpb24uXG4gKi9cbi8vIEluIFRlWCwgdGhlcmUgYXJlIGFjdHVhbGx5IHRocmVlIHNldHMgb2YgZGltZW5zaW9ucywgb25lIGZvciBlYWNoIG9mXG4vLyB0ZXh0c3R5bGUgKHNpemUgaW5kZXggNSBhbmQgaGlnaGVyOiA+PTlwdCksIHNjcmlwdHN0eWxlIChzaXplIGluZGV4IDMgYW5kIDQ6XG4vLyA3LThwdCksIGFuZCBzY3JpcHRzY3JpcHRzdHlsZSAoc2l6ZSBpbmRleCAxIGFuZCAyOiA1LTZwdCkuICBUaGVzZSBhcmVcbi8vIHByb3ZpZGVkIGluIHRoZSB0aGUgYXJyYXlzIGJlbG93LCBpbiB0aGF0IG9yZGVyLlxuLy9cbi8vIFRoZSBmb250IG1ldHJpY3MgYXJlIHN0b3JlZCBpbiBmb250cyBjbXN5MTAsIGNtc3k3LCBhbmQgY21zeTUgcmVzcHNlY3RpdmVseS5cbi8vIFRoaXMgd2FzIGRldGVybWluZWQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIHNjcmlwdDpcbi8vXG4vLyAgICAgbGF0ZXggLWludGVyYWN0aW9uPW5vbnN0b3Btb2RlIFxcXG4vLyAgICAgJ1xcZG9jdW1lbnRjbGFzc3thcnRpY2xlfVxcdXNlcGFja2FnZXthbXNtYXRofVxcYmVnaW57ZG9jdW1lbnR9JyBcXFxuLy8gICAgICckYSQgXFxleHBhbmRhZnRlclxcc2hvd1xcdGhlXFx0ZXh0Zm9udDInIFxcXG4vLyAgICAgJ1xcZXhwYW5kYWZ0ZXJcXHNob3dcXHRoZVxcc2NyaXB0Zm9udDInIFxcXG4vLyAgICAgJ1xcZXhwYW5kYWZ0ZXJcXHNob3dcXHRoZVxcc2NyaXB0c2NyaXB0Zm9udDInIFxcXG4vLyAgICAgJ1xcc3RvcCdcbi8vXG4vLyBUaGUgbWV0cmljcyB0aGVtc2VsdmVzIHdlcmUgcmV0cmVpdmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6XG4vL1xuLy8gICAgIHRmdG9wbCBjbXN5MTBcbi8vICAgICB0ZnRvcGwgY21zeTdcbi8vICAgICB0ZnRvcGwgY21zeTVcbi8vXG4vLyBUaGUgb3V0cHV0IG9mIGVhY2ggb2YgdGhlc2UgY29tbWFuZHMgaXMgcXVpdGUgbGVuZ3RoeS4gIFRoZSBvbmx5IHBhcnQgd2Vcbi8vIGNhcmUgYWJvdXQgaXMgdGhlIEZPTlRESU1FTiBzZWN0aW9uLiBFYWNoIHZhbHVlIGlzIG1lYXN1cmVkIGluIEVNcy5cbnZhciBzaWdtYXNBbmRYaXMgPSB7XG4gIHNsYW50OiBbMC4yNTAsIDAuMjUwLCAwLjI1MF0sXG4gIC8vIHNpZ21hMVxuICBzcGFjZTogWzAuMDAwLCAwLjAwMCwgMC4wMDBdLFxuICAvLyBzaWdtYTJcbiAgc3RyZXRjaDogWzAuMDAwLCAwLjAwMCwgMC4wMDBdLFxuICAvLyBzaWdtYTNcbiAgc2hyaW5rOiBbMC4wMDAsIDAuMDAwLCAwLjAwMF0sXG4gIC8vIHNpZ21hNFxuICB4SGVpZ2h0OiBbMC40MzEsIDAuNDMxLCAwLjQzMV0sXG4gIC8vIHNpZ21hNVxuICBxdWFkOiBbMS4wMDAsIDEuMTcxLCAxLjQ3Ml0sXG4gIC8vIHNpZ21hNlxuICBleHRyYVNwYWNlOiBbMC4wMDAsIDAuMDAwLCAwLjAwMF0sXG4gIC8vIHNpZ21hN1xuICBudW0xOiBbMC42NzcsIDAuNzMyLCAwLjkyNV0sXG4gIC8vIHNpZ21hOFxuICBudW0yOiBbMC4zOTQsIDAuMzg0LCAwLjM4N10sXG4gIC8vIHNpZ21hOVxuICBudW0zOiBbMC40NDQsIDAuNDcxLCAwLjUwNF0sXG4gIC8vIHNpZ21hMTBcbiAgZGVub20xOiBbMC42ODYsIDAuNzUyLCAxLjAyNV0sXG4gIC8vIHNpZ21hMTFcbiAgZGVub20yOiBbMC4zNDUsIDAuMzQ0LCAwLjUzMl0sXG4gIC8vIHNpZ21hMTJcbiAgc3VwMTogWzAuNDEzLCAwLjUwMywgMC41MDRdLFxuICAvLyBzaWdtYTEzXG4gIHN1cDI6IFswLjM2MywgMC40MzEsIDAuNDA0XSxcbiAgLy8gc2lnbWExNFxuICBzdXAzOiBbMC4yODksIDAuMjg2LCAwLjI5NF0sXG4gIC8vIHNpZ21hMTVcbiAgc3ViMTogWzAuMTUwLCAwLjE0MywgMC4yMDBdLFxuICAvLyBzaWdtYTE2XG4gIHN1YjI6IFswLjI0NywgMC4yODYsIDAuNDAwXSxcbiAgLy8gc2lnbWExN1xuICBzdXBEcm9wOiBbMC4zODYsIDAuMzUzLCAwLjQ5NF0sXG4gIC8vIHNpZ21hMThcbiAgc3ViRHJvcDogWzAuMDUwLCAwLjA3MSwgMC4xMDBdLFxuICAvLyBzaWdtYTE5XG4gIGRlbGltMTogWzIuMzkwLCAxLjcwMCwgMS45ODBdLFxuICAvLyBzaWdtYTIwXG4gIGRlbGltMjogWzEuMDEwLCAxLjE1NywgMS40MjBdLFxuICAvLyBzaWdtYTIxXG4gIGF4aXNIZWlnaHQ6IFswLjI1MCwgMC4yNTAsIDAuMjUwXSxcbiAgLy8gc2lnbWEyMlxuICAvLyBUaGVzZSBmb250IG1ldHJpY3MgYXJlIGV4dHJhY3RlZCBmcm9tIFRlWCBieSB1c2luZyB0ZnRvcGwgb24gY21leDEwLnRmbTtcbiAgLy8gdGhleSBjb3JyZXNwb25kIHRvIHRoZSBmb250IHBhcmFtZXRlcnMgb2YgdGhlIGV4dGVuc2lvbiBmb250cyAoZmFtaWx5IDMpLlxuICAvLyBTZWUgdGhlIFRlWGJvb2ssIHBhZ2UgNDQxLiBJbiBBTVNUZVgsIHRoZSBleHRlbnNpb24gZm9udHMgc2NhbGU7IHRvXG4gIC8vIG1hdGNoIGNtZXg3LCB3ZSdkIHVzZSBjbWV4Ny50Zm0gdmFsdWVzIGZvciBzY3JpcHQgYW5kIHNjcmlwdHNjcmlwdFxuICAvLyB2YWx1ZXMuXG4gIGRlZmF1bHRSdWxlVGhpY2tuZXNzOiBbMC4wNCwgMC4wNDksIDAuMDQ5XSxcbiAgLy8geGk4OyBjbWV4NzogMC4wNDlcbiAgYmlnT3BTcGFjaW5nMTogWzAuMTExLCAwLjExMSwgMC4xMTFdLFxuICAvLyB4aTlcbiAgYmlnT3BTcGFjaW5nMjogWzAuMTY2LCAwLjE2NiwgMC4xNjZdLFxuICAvLyB4aTEwXG4gIGJpZ09wU3BhY2luZzM6IFswLjIsIDAuMiwgMC4yXSxcbiAgLy8geGkxMVxuICBiaWdPcFNwYWNpbmc0OiBbMC42LCAwLjYxMSwgMC42MTFdLFxuICAvLyB4aTEyOyBjbWV4NzogMC42MTFcbiAgYmlnT3BTcGFjaW5nNTogWzAuMSwgMC4xNDMsIDAuMTQzXSxcbiAgLy8geGkxMzsgY21leDc6IDAuMTQzXG4gIC8vIFRoZSBcXHNxcnQgcnVsZSB3aWR0aCBpcyB0YWtlbiBmcm9tIHRoZSBoZWlnaHQgb2YgdGhlIHN1cmQgY2hhcmFjdGVyLlxuICAvLyBTaW5jZSB3ZSB1c2UgdGhlIHNhbWUgZm9udCBhdCBhbGwgc2l6ZXMsIHRoaXMgdGhpY2tuZXNzIGRvZXNuJ3Qgc2NhbGUuXG4gIHNxcnRSdWxlVGhpY2tuZXNzOiBbMC4wNCwgMC4wNCwgMC4wNF0sXG4gIC8vIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyBob3cgbGFyZ2UgYSBwdCBpcywgZm9yIG1ldHJpY3Mgd2hpY2ggYXJlIGRlZmluZWRcbiAgLy8gaW4gdGVybXMgb2YgcHRzLlxuICAvLyBUaGlzIHZhbHVlIGlzIGFsc28gdXNlZCBpbiBrYXRleC5sZXNzOyBpZiB5b3UgY2hhbmdlIGl0IG1ha2Ugc3VyZSB0aGVcbiAgLy8gdmFsdWVzIG1hdGNoLlxuICBwdFBlckVtOiBbMTAuMCwgMTAuMCwgMTAuMF0sXG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIGFkamFjZW50IGB8YCBjb2x1bW5zIGluIGFuIGFycmF5IGRlZmluaXRpb24uIEZyb21cbiAgLy8gYFxcc2hvd3RoZVxcZG91YmxlcnVsZXNlcGAgaW4gTGFUZVguIEVxdWFscyAyLjAgLyBwdFBlckVtLlxuICBkb3VibGVSdWxlU2VwOiBbMC4yLCAwLjIsIDAuMl0sXG4gIC8vIFRoZSB3aWR0aCBvZiBzZXBhcmF0b3IgbGluZXMgaW4ge2FycmF5fSBlbnZpcm9ubWVudHMuIEZyb21cbiAgLy8gYFxcc2hvd3RoZVxcYXJyYXlydWxld2lkdGhgIGluIExhVGVYLiBFcXVhbHMgMC40IC8gcHRQZXJFbS5cbiAgYXJyYXlSdWxlV2lkdGg6IFswLjA0LCAwLjA0LCAwLjA0XSxcbiAgLy8gVHdvIHZhbHVlcyBmcm9tIExhVGVYIHNvdXJjZTJlOlxuICBmYm94c2VwOiBbMC4zLCAwLjMsIDAuM10sXG4gIC8vICAgICAgICAzIHB0IC8gcHRQZXJFbVxuICBmYm94cnVsZTogWzAuMDQsIDAuMDQsIDAuMDRdIC8vIDAuNCBwdCAvIHB0UGVyRW1cblxufTsgLy8gVGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gZm9udCBuYW1lIGFuZCBjaGFyYWN0ZXIgY29kZSB0byBjaGFyYWN0ZXJcbi8vIG1ldHJpY3MsIGluY2x1ZGluZyBoZWlnaHQsIGRlcHRoLCBpdGFsaWMgY29ycmVjdGlvbiwgYW5kIHNrZXcgKGtlcm4gZnJvbSB0aGVcbi8vIGNoYXJhY3RlciB0byB0aGUgY29ycmVzcG9uZGluZyBcXHNrZXdjaGFyKVxuLy8gVGhpcyBtYXAgaXMgZ2VuZXJhdGVkIHZpYSBgbWFrZSBtZXRyaWNzYC4gSXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIG1hbnVhbGx5LlxuXG4gLy8gVGhlc2UgYXJlIHZlcnkgcm91Z2ggYXBwcm94aW1hdGlvbnMuICBXZSBkZWZhdWx0IHRvIFRpbWVzIE5ldyBSb21hbiB3aGljaFxuLy8gc2hvdWxkIGhhdmUgTGF0aW4tMSBhbmQgQ3lyaWxsaWMgY2hhcmFjdGVycywgYnV0IG1heSBub3QgZGVwZW5kaW5nIG9uIHRoZVxuLy8gb3BlcmF0aW5nIHN5c3RlbS4gIFRoZSBtZXRyaWNzIGRvIG5vdCBhY2NvdW50IGZvciBleHRyYSBoZWlnaHQgZnJvbSB0aGVcbi8vIGFjY2VudHMuICBJbiB0aGUgY2FzZSBvZiBDeXJpbGxpYyBjaGFyYWN0ZXJzIHdoaWNoIGhhdmUgYm90aCBhc2NlbmRlcnMgYW5kXG4vLyBkZXNjZW5kZXJzIHdlIHByZWZlciBhcHByb3hpbWF0aW9ucyB3aXRoIGFzY2VuZGVycywgcHJpbWFyaWx5IHRvIHByZXZlbnRcbi8vIHRoZSBmcmFjdGlvbiBiYXIgb3Igcm9vdCBsaW5lIGZyb20gaW50ZXJzZWN0aW5nIHRoZSBnbHlwaC5cbi8vIFRPRE8oa2V2aW5iKSBhbGxvdyB1bmlvbiBvZiBtdWx0aXBsZSBnbHlwaCBtZXRyaWNzIGZvciBiZXR0ZXIgYWNjdXJhY3kuXG5cbnZhciBleHRyYUNoYXJhY3Rlck1hcCA9IHtcbiAgLy8gTGF0aW4tMVxuICAnw4UnOiAnQScsXG4gICfDkCc6ICdEJyxcbiAgJ8OeJzogJ28nLFxuICAnw6UnOiAnYScsXG4gICfDsCc6ICdkJyxcbiAgJ8O+JzogJ28nLFxuICAvLyBDeXJpbGxpY1xuICAn0JAnOiAnQScsXG4gICfQkSc6ICdCJyxcbiAgJ9CSJzogJ0InLFxuICAn0JMnOiAnRicsXG4gICfQlCc6ICdBJyxcbiAgJ9CVJzogJ0UnLFxuICAn0JYnOiAnSycsXG4gICfQlyc6ICczJyxcbiAgJ9CYJzogJ04nLFxuICAn0JknOiAnTicsXG4gICfQmic6ICdLJyxcbiAgJ9CbJzogJ04nLFxuICAn0JwnOiAnTScsXG4gICfQnSc6ICdIJyxcbiAgJ9CeJzogJ08nLFxuICAn0J8nOiAnTicsXG4gICfQoCc6ICdQJyxcbiAgJ9ChJzogJ0MnLFxuICAn0KInOiAnVCcsXG4gICfQoyc6ICd5JyxcbiAgJ9CkJzogJ08nLFxuICAn0KUnOiAnWCcsXG4gICfQpic6ICdVJyxcbiAgJ9CnJzogJ2gnLFxuICAn0KgnOiAnVycsXG4gICfQqSc6ICdXJyxcbiAgJ9CqJzogJ0InLFxuICAn0KsnOiAnWCcsXG4gICfQrCc6ICdCJyxcbiAgJ9CtJzogJzMnLFxuICAn0K4nOiAnWCcsXG4gICfQryc6ICdSJyxcbiAgJ9CwJzogJ2EnLFxuICAn0LEnOiAnYicsXG4gICfQsic6ICdhJyxcbiAgJ9CzJzogJ3InLFxuICAn0LQnOiAneScsXG4gICfQtSc6ICdlJyxcbiAgJ9C2JzogJ20nLFxuICAn0LcnOiAnZScsXG4gICfQuCc6ICduJyxcbiAgJ9C5JzogJ24nLFxuICAn0LonOiAnbicsXG4gICfQuyc6ICduJyxcbiAgJ9C8JzogJ20nLFxuICAn0L0nOiAnbicsXG4gICfQvic6ICdvJyxcbiAgJ9C/JzogJ24nLFxuICAn0YAnOiAncCcsXG4gICfRgSc6ICdjJyxcbiAgJ9GCJzogJ28nLFxuICAn0YMnOiAneScsXG4gICfRhCc6ICdiJyxcbiAgJ9GFJzogJ3gnLFxuICAn0YYnOiAnbicsXG4gICfRhyc6ICduJyxcbiAgJ9GIJzogJ3cnLFxuICAn0YknOiAndycsXG4gICfRiic6ICdhJyxcbiAgJ9GLJzogJ20nLFxuICAn0YwnOiAnYScsXG4gICfRjSc6ICdlJyxcbiAgJ9GOJzogJ20nLFxuICAn0Y8nOiAncidcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBhZGRzIG5ldyBmb250IG1ldHJpY3MgdG8gZGVmYXVsdCBtZXRyaWNNYXBcbiAqIEl0IGNhbiBhbHNvIG92ZXJyaWRlIGV4aXN0aW5nIG1ldHJpY3NcbiAqL1xuZnVuY3Rpb24gc2V0Rm9udE1ldHJpY3MoZm9udE5hbWUsIG1ldHJpY3MpIHtcbiAgZm9udE1ldHJpY3NEYXRhW2ZvbnROYW1lXSA9IG1ldHJpY3M7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgbG9va2luZyB1cCBpbmZvcm1hdGlvbiBpbiB0aGVcbiAqIG1ldHJpY01hcCB0YWJsZS4gSXQgdGFrZXMgYSBjaGFyYWN0ZXIgYXMgYSBzdHJpbmcsIGFuZCBhIGZvbnQuXG4gKlxuICogTm90ZTogdGhlIGB3aWR0aGAgcHJvcGVydHkgbWF5IGJlIHVuZGVmaW5lZCBpZiBmb250TWV0cmljc0RhdGEuanMgd2Fzbid0XG4gKiBidWlsdCB1c2luZyBgTWFrZSBleHRlbmRlZF9tZXRyaWNzYC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJNZXRyaWNzKGNoYXJhY3RlciwgZm9udCwgbW9kZSkge1xuICBpZiAoIWZvbnRNZXRyaWNzRGF0YVtmb250XSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZvbnQgbWV0cmljcyBub3QgZm91bmQgZm9yIGZvbnQ6IFwiICsgZm9udCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBjaCA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApO1xuICB2YXIgbWV0cmljcyA9IGZvbnRNZXRyaWNzRGF0YVtmb250XVtjaF07XG5cbiAgaWYgKCFtZXRyaWNzICYmIGNoYXJhY3RlclswXSBpbiBleHRyYUNoYXJhY3Rlck1hcCkge1xuICAgIGNoID0gZXh0cmFDaGFyYWN0ZXJNYXBbY2hhcmFjdGVyWzBdXS5jaGFyQ29kZUF0KDApO1xuICAgIG1ldHJpY3MgPSBmb250TWV0cmljc0RhdGFbZm9udF1bY2hdO1xuICB9XG5cbiAgaWYgKCFtZXRyaWNzICYmIG1vZGUgPT09ICd0ZXh0Jykge1xuICAgIC8vIFdlIGRvbid0IHR5cGljYWxseSBoYXZlIGZvbnQgbWV0cmljcyBmb3IgQXNpYW4gc2NyaXB0cy5cbiAgICAvLyBCdXQgc2luY2Ugd2Ugc3VwcG9ydCB0aGVtIGluIHRleHQgbW9kZSwgd2UgbmVlZCB0byByZXR1cm5cbiAgICAvLyBzb21lIHNvcnQgb2YgbWV0cmljcy5cbiAgICAvLyBTbyBpZiB0aGUgY2hhcmFjdGVyIGlzIGluIGEgc2NyaXB0IHdlIHN1cHBvcnQgYnV0IHdlXG4gICAgLy8gZG9uJ3QgaGF2ZSBtZXRyaWNzIGZvciBpdCwganVzdCB1c2UgdGhlIG1ldHJpY3MgZm9yXG4gICAgLy8gdGhlIExhdGluIGNhcGl0YWwgbGV0dGVyIE0uIFRoaXMgaXMgY2xvc2UgZW5vdWdoIGJlY2F1c2VcbiAgICAvLyB3ZSAoY3VycmVudGx5KSBvbmx5IGNhcmUgYWJvdXQgdGhlIGhlaWdodCBvZiB0aGUgZ2xweWhcbiAgICAvLyBub3QgaXRzIHdpZHRoLlxuICAgIGlmIChzdXBwb3J0ZWRDb2RlcG9pbnQoY2gpKSB7XG4gICAgICBtZXRyaWNzID0gZm9udE1ldHJpY3NEYXRhW2ZvbnRdWzc3XTsgLy8gNzcgaXMgdGhlIGNoYXJjb2RlIGZvciAnTSdcbiAgICB9XG4gIH1cblxuICBpZiAobWV0cmljcykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXB0aDogbWV0cmljc1swXSxcbiAgICAgIGhlaWdodDogbWV0cmljc1sxXSxcbiAgICAgIGl0YWxpYzogbWV0cmljc1syXSxcbiAgICAgIHNrZXc6IG1ldHJpY3NbM10sXG4gICAgICB3aWR0aDogbWV0cmljc1s0XVxuICAgIH07XG4gIH1cbn1cbnZhciBmb250TWV0cmljc0J5U2l6ZUluZGV4ID0ge307XG4vKipcbiAqIEdldCB0aGUgZm9udCBtZXRyaWNzIGZvciBhIGdpdmVuIHNpemUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0R2xvYmFsTWV0cmljcyhzaXplKSB7XG4gIHZhciBzaXplSW5kZXg7XG5cbiAgaWYgKHNpemUgPj0gNSkge1xuICAgIHNpemVJbmRleCA9IDA7XG4gIH0gZWxzZSBpZiAoc2l6ZSA+PSAzKSB7XG4gICAgc2l6ZUluZGV4ID0gMTtcbiAgfSBlbHNlIHtcbiAgICBzaXplSW5kZXggPSAyO1xuICB9XG5cbiAgaWYgKCFmb250TWV0cmljc0J5U2l6ZUluZGV4W3NpemVJbmRleF0pIHtcbiAgICB2YXIgbWV0cmljcyA9IGZvbnRNZXRyaWNzQnlTaXplSW5kZXhbc2l6ZUluZGV4XSA9IHtcbiAgICAgIGNzc0VtUGVyTXU6IHNpZ21hc0FuZFhpcy5xdWFkW3NpemVJbmRleF0gLyAxOFxuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc2lnbWFzQW5kWGlzKSB7XG4gICAgICBpZiAoc2lnbWFzQW5kWGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgbWV0cmljc1trZXldID0gc2lnbWFzQW5kWGlzW2tleV1bc2l6ZUluZGV4XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9udE1ldHJpY3NCeVNpemVJbmRleFtzaXplSW5kZXhdO1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL09wdGlvbnMuanNcbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcHRpb25zIHRoYXQgdGhlIFBhcnNlciBjYXJyaWVzXG4gKiBhcm91bmQgd2l0aCBpdCB3aGlsZSBwYXJzaW5nLiBEYXRhIGlzIGhlbGQgaW4gYW4gYE9wdGlvbnNgIG9iamVjdCwgYW5kIHdoZW5cbiAqIHJlY3Vyc2luZywgYSBuZXcgYE9wdGlvbnNgIG9iamVjdCBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBgLndpdGgqYCBhbmRcbiAqIGAucmVzZXRgIGZ1bmN0aW9ucy5cbiAqL1xuXG52YXIgc2l6ZVN0eWxlTWFwID0gWy8vIEVhY2ggZWxlbWVudCBjb250YWlucyBbdGV4dHNpemUsIHNjcmlwdHNpemUsIHNjcmlwdHNjcmlwdHNpemVdLlxuLy8gVGhlIHNpemUgbWFwcGluZ3MgYXJlIHRha2VuIGZyb20gVGVYIHdpdGggXFxub3JtYWxzaXplPTEwcHQuXG5bMSwgMSwgMV0sIC8vIHNpemUxOiBbNSwgNSwgNV0gICAgICAgICAgICAgIFxcdGlueVxuWzIsIDEsIDFdLCAvLyBzaXplMjogWzYsIDUsIDVdXG5bMywgMSwgMV0sIC8vIHNpemUzOiBbNywgNSwgNV0gICAgICAgICAgICAgIFxcc2NyaXB0c2l6ZVxuWzQsIDIsIDFdLCAvLyBzaXplNDogWzgsIDYsIDVdICAgICAgICAgICAgICBcXGZvb3Rub3Rlc2l6ZVxuWzUsIDIsIDFdLCAvLyBzaXplNTogWzksIDYsIDVdICAgICAgICAgICAgICBcXHNtYWxsXG5bNiwgMywgMV0sIC8vIHNpemU2OiBbMTAsIDcsIDVdICAgICAgICAgICAgIFxcbm9ybWFsc2l6ZVxuWzcsIDQsIDJdLCAvLyBzaXplNzogWzEyLCA4LCA2XSAgICAgICAgICAgICBcXGxhcmdlXG5bOCwgNiwgM10sIC8vIHNpemU4OiBbMTQuNCwgMTAsIDddICAgICAgICAgIFxcTGFyZ2Vcbls5LCA3LCA2XSwgLy8gc2l6ZTk6IFsxNy4yOCwgMTIsIDEwXSAgICAgICAgXFxMQVJHRVxuWzEwLCA4LCA3XSwgLy8gc2l6ZTEwOiBbMjAuNzQsIDE0LjQsIDEyXSAgICAgXFxodWdlXG5bMTEsIDEwLCA5XSAvLyBzaXplMTE6IFsyNC44OCwgMjAuNzQsIDE3LjI4XSBcXEhVR0Vcbl07XG52YXIgc2l6ZU11bHRpcGxpZXJzID0gWy8vIGZvbnRNZXRyaWNzLmpzOmdldEdsb2JhbE1ldHJpY3MgYWxzbyB1c2VzIHNpemUgaW5kZXhlcywgc28gaWZcbi8vIHlvdSBjaGFuZ2Ugc2l6ZSBpbmRleGVzLCBjaGFuZ2UgdGhhdCBmdW5jdGlvbi5cbjAuNSwgMC42LCAwLjcsIDAuOCwgMC45LCAxLjAsIDEuMiwgMS40NCwgMS43MjgsIDIuMDc0LCAyLjQ4OF07XG5cbnZhciBzaXplQXRTdHlsZSA9IGZ1bmN0aW9uIHNpemVBdFN0eWxlKHNpemUsIHN0eWxlKSB7XG4gIHJldHVybiBzdHlsZS5zaXplIDwgMiA/IHNpemUgOiBzaXplU3R5bGVNYXBbc2l6ZSAtIDFdW3N0eWxlLnNpemUgLSAxXTtcbn07IC8vIEluIHRoZXNlIHR5cGVzLCBcIlwiIChlbXB0eSBzdHJpbmcpIG1lYW5zIFwibm8gY2hhbmdlXCIuXG5cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBtYWluIG9wdGlvbnMgY2xhc3MuIEl0IGNvbnRhaW5zIHRoZSBjdXJyZW50IHN0eWxlLCBzaXplLCBjb2xvcixcbiAqIGFuZCBmb250LlxuICpcbiAqIE9wdGlvbnMgb2JqZWN0cyBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiBUbyBjcmVhdGUgYSBuZXcgT3B0aW9ucyB3aXRoXG4gKiBkaWZmZXJlbnQgcHJvcGVydGllcywgY2FsbCBhIGAuaGF2aW5nKmAgbWV0aG9kLlxuICovXG52YXIgT3B0aW9ucyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIEEgZm9udCBmYW1pbHkgYXBwbGllcyB0byBhIGdyb3VwIG9mIGZvbnRzIChpLmUuIFNhbnNTZXJpZiksIHdoaWxlIGEgZm9udFxuICAvLyByZXByZXNlbnRzIGEgc3BlY2lmaWMgZm9udCAoaS5lLiBTYW5zU2VyaWYgQm9sZCkuXG4gIC8vIFNlZTogaHR0cHM6Ly90ZXguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzIyMzUwL2RpZmZlcmVuY2UtYmV0d2Vlbi10ZXh0cm0tYW5kLW1hdGhybVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBzaXplIGluZGV4LlxuICAgKi9cbiAgZnVuY3Rpb24gT3B0aW9ucyhkYXRhKSB7XG4gICAgdGhpcy5zdHlsZSA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbG9yID0gdm9pZCAwO1xuICAgIHRoaXMuc2l6ZSA9IHZvaWQgMDtcbiAgICB0aGlzLnRleHRTaXplID0gdm9pZCAwO1xuICAgIHRoaXMucGhhbnRvbSA9IHZvaWQgMDtcbiAgICB0aGlzLmZvbnQgPSB2b2lkIDA7XG4gICAgdGhpcy5mb250RmFtaWx5ID0gdm9pZCAwO1xuICAgIHRoaXMuZm9udFdlaWdodCA9IHZvaWQgMDtcbiAgICB0aGlzLmZvbnRTaGFwZSA9IHZvaWQgMDtcbiAgICB0aGlzLnNpemVNdWx0aXBsaWVyID0gdm9pZCAwO1xuICAgIHRoaXMubWF4U2l6ZSA9IHZvaWQgMDtcbiAgICB0aGlzLm1pblJ1bGVUaGlja25lc3MgPSB2b2lkIDA7XG4gICAgdGhpcy5fZm9udE1ldHJpY3MgPSB2b2lkIDA7XG4gICAgdGhpcy5zdHlsZSA9IGRhdGEuc3R5bGU7XG4gICAgdGhpcy5jb2xvciA9IGRhdGEuY29sb3I7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplIHx8IE9wdGlvbnMuQkFTRVNJWkU7XG4gICAgdGhpcy50ZXh0U2l6ZSA9IGRhdGEudGV4dFNpemUgfHwgdGhpcy5zaXplO1xuICAgIHRoaXMucGhhbnRvbSA9ICEhZGF0YS5waGFudG9tO1xuICAgIHRoaXMuZm9udCA9IGRhdGEuZm9udCB8fCBcIlwiO1xuICAgIHRoaXMuZm9udEZhbWlseSA9IGRhdGEuZm9udEZhbWlseSB8fCBcIlwiO1xuICAgIHRoaXMuZm9udFdlaWdodCA9IGRhdGEuZm9udFdlaWdodCB8fCAnJztcbiAgICB0aGlzLmZvbnRTaGFwZSA9IGRhdGEuZm9udFNoYXBlIHx8ICcnO1xuICAgIHRoaXMuc2l6ZU11bHRpcGxpZXIgPSBzaXplTXVsdGlwbGllcnNbdGhpcy5zaXplIC0gMV07XG4gICAgdGhpcy5tYXhTaXplID0gZGF0YS5tYXhTaXplO1xuICAgIHRoaXMubWluUnVsZVRoaWNrbmVzcyA9IGRhdGEubWluUnVsZVRoaWNrbmVzcztcbiAgICB0aGlzLl9mb250TWV0cmljcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBvcHRpb25zIG9iamVjdCB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgXCJ0aGlzXCIuICBQcm9wZXJ0aWVzXG4gICAqIGZyb20gXCJleHRlbnNpb25cIiB3aWxsIGJlIGNvcGllZCB0byB0aGUgbmV3IG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBPcHRpb25zLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kKGV4dGVuc2lvbikge1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgc3R5bGU6IHRoaXMuc3R5bGUsXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICB0ZXh0U2l6ZTogdGhpcy50ZXh0U2l6ZSxcbiAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgcGhhbnRvbTogdGhpcy5waGFudG9tLFxuICAgICAgZm9udDogdGhpcy5mb250LFxuICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5LFxuICAgICAgZm9udFdlaWdodDogdGhpcy5mb250V2VpZ2h0LFxuICAgICAgZm9udFNoYXBlOiB0aGlzLmZvbnRTaGFwZSxcbiAgICAgIG1heFNpemU6IHRoaXMubWF4U2l6ZSxcbiAgICAgIG1pblJ1bGVUaGlja25lc3M6IHRoaXMubWluUnVsZVRoaWNrbmVzc1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZXh0ZW5zaW9uLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gZXh0ZW5zaW9uW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPcHRpb25zKGRhdGEpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9ucyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gc3R5bGUuIElmIGB0aGlzLnN0eWxlID09PSBzdHlsZWAsXG4gICAqIHJldHVybnMgYHRoaXNgLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYXZpbmdTdHlsZSA9IGZ1bmN0aW9uIGhhdmluZ1N0eWxlKHN0eWxlKSB7XG4gICAgaWYgKHRoaXMuc3R5bGUgPT09IHN0eWxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBzaXplOiBzaXplQXRTdHlsZSh0aGlzLnRleHRTaXplLCBzdHlsZSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIG9wdGlvbnMgb2JqZWN0IHdpdGggYSBjcmFtcGVkIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgc3R5bGUuIElmXG4gICAqIHRoZSBjdXJyZW50IHN0eWxlIGlzIGNyYW1wZWQsIHJldHVybnMgYHRoaXNgLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYXZpbmdDcmFtcGVkU3R5bGUgPSBmdW5jdGlvbiBoYXZpbmdDcmFtcGVkU3R5bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGF2aW5nU3R5bGUodGhpcy5zdHlsZS5jcmFtcCgpKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGFuIG9wdGlvbnMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNpemUgYW5kIGluIGF0IGxlYXN0IGBcXHRleHRzdHlsZWAuXG4gICAqIFJldHVybnMgYHRoaXNgIGlmIGFwcHJvcHJpYXRlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYXZpbmdTaXplID0gZnVuY3Rpb24gaGF2aW5nU2l6ZShzaXplKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gc2l6ZSAmJiB0aGlzLnRleHRTaXplID09PSBzaXplKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGUudGV4dCgpLFxuICAgICAgICBzaXplOiBzaXplLFxuICAgICAgICB0ZXh0U2l6ZTogc2l6ZSxcbiAgICAgICAgc2l6ZU11bHRpcGxpZXI6IHNpemVNdWx0aXBsaWVyc1tzaXplIC0gMV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTGlrZSBgdGhpcy5oYXZpbmdTaXplKEJBU0VTSVpFKS5oYXZpbmdTdHlsZShzdHlsZSlgLiBJZiBgc3R5bGVgIGlzIG9taXR0ZWQsXG4gICAqIGNoYW5nZXMgdG8gYXQgbGVhc3QgYFxcdGV4dHN0eWxlYC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaGF2aW5nQmFzZVN0eWxlID0gZnVuY3Rpb24gaGF2aW5nQmFzZVN0eWxlKHN0eWxlKSB7XG4gICAgc3R5bGUgPSBzdHlsZSB8fCB0aGlzLnN0eWxlLnRleHQoKTtcbiAgICB2YXIgd2FudFNpemUgPSBzaXplQXRTdHlsZShPcHRpb25zLkJBU0VTSVpFLCBzdHlsZSk7XG5cbiAgICBpZiAodGhpcy5zaXplID09PSB3YW50U2l6ZSAmJiB0aGlzLnRleHRTaXplID09PSBPcHRpb25zLkJBU0VTSVpFICYmIHRoaXMuc3R5bGUgPT09IHN0eWxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBzaXplOiB3YW50U2l6ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBzaXppbmcgY2hhbmdlcyBzdWNoIGFzIFxcSHVnZS5cbiAgICogS2VlcCB0aGUgZWZmZWN0IG9mIHRoZSBjdXJyZW50IHN0eWxlLCBzdWNoIGFzIFxcc2NyaXB0c3R5bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmhhdmluZ0Jhc2VTaXppbmcgPSBmdW5jdGlvbiBoYXZpbmdCYXNlU2l6aW5nKCkge1xuICAgIHZhciBzaXplO1xuXG4gICAgc3dpdGNoICh0aGlzLnN0eWxlLmlkKSB7XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHNpemUgPSAzOyAvLyBub3JtYWxzaXplIGluIHNjcmlwdHN0eWxlXG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgc2l6ZSA9IDE7IC8vIG5vcm1hbHNpemUgaW4gc2NyaXB0c2NyaXB0c3R5bGVcblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2l6ZSA9IDY7XG4gICAgICAvLyBub3JtYWxzaXplIGluIHRleHRzdHlsZSBvciBkaXNwbGF5c3R5bGVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leHRlbmQoe1xuICAgICAgc3R5bGU6IHRoaXMuc3R5bGUudGV4dCgpLFxuICAgICAgc2l6ZTogc2l6ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgb3B0aW9ucyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29sb3IuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLndpdGhDb2xvciA9IGZ1bmN0aW9uIHdpdGhDb2xvcihjb2xvcikge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZCh7XG4gICAgICBjb2xvcjogY29sb3JcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG9wdGlvbnMgb2JqZWN0IHdpdGggXCJwaGFudG9tXCIgc2V0IHRvIHRydWUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLndpdGhQaGFudG9tID0gZnVuY3Rpb24gd2l0aFBoYW50b20oKSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgIHBoYW50b206IHRydWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBvcHRpb25zIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBtYXRoIGZvbnQgb3Igb2xkIHRleHQgZm9udC5cbiAgICogQHR5cGUge1t0eXBlXX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ud2l0aEZvbnQgPSBmdW5jdGlvbiB3aXRoRm9udChmb250KSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgIGZvbnQ6IGZvbnRcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG9wdGlvbnMgb2JqZWN0cyB3aXRoIHRoZSBnaXZlbiBmb250RmFtaWx5LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by53aXRoVGV4dEZvbnRGYW1pbHkgPSBmdW5jdGlvbiB3aXRoVGV4dEZvbnRGYW1pbHkoZm9udEZhbWlseSkge1xuICAgIHJldHVybiB0aGlzLmV4dGVuZCh7XG4gICAgICBmb250RmFtaWx5OiBmb250RmFtaWx5LFxuICAgICAgZm9udDogXCJcIlxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG9wdGlvbnMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGZvbnQgd2VpZ2h0XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLndpdGhUZXh0Rm9udFdlaWdodCA9IGZ1bmN0aW9uIHdpdGhUZXh0Rm9udFdlaWdodChmb250V2VpZ2h0KSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kKHtcbiAgICAgIGZvbnRXZWlnaHQ6IGZvbnRXZWlnaHQsXG4gICAgICBmb250OiBcIlwiXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgb3B0aW9ucyBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gZm9udCB3ZWlnaHRcbiAgICovXG4gIDtcblxuICBfcHJvdG8ud2l0aFRleHRGb250U2hhcGUgPSBmdW5jdGlvbiB3aXRoVGV4dEZvbnRTaGFwZShmb250U2hhcGUpIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbmQoe1xuICAgICAgZm9udFNoYXBlOiBmb250U2hhcGUsXG4gICAgICBmb250OiBcIlwiXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgQ1NTIHNpemluZyBjbGFzc2VzIHJlcXVpcmVkIHRvIHN3aXRjaCBmcm9tIGVuY2xvc2luZyBvcHRpb25zXG4gICAqIGBvbGRPcHRpb25zYCB0byBgdGhpc2AuIFJldHVybnMgYW4gYXJyYXkgb2YgY2xhc3Nlcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2l6aW5nQ2xhc3NlcyA9IGZ1bmN0aW9uIHNpemluZ0NsYXNzZXMob2xkT3B0aW9ucykge1xuICAgIGlmIChvbGRPcHRpb25zLnNpemUgIT09IHRoaXMuc2l6ZSkge1xuICAgICAgcmV0dXJuIFtcInNpemluZ1wiLCBcInJlc2V0LXNpemVcIiArIG9sZE9wdGlvbnMuc2l6ZSwgXCJzaXplXCIgKyB0aGlzLnNpemVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIENTUyBzaXppbmcgY2xhc3NlcyByZXF1aXJlZCB0byBzd2l0Y2ggdG8gdGhlIGJhc2Ugc2l6ZS4gTGlrZVxuICAgKiBgdGhpcy5oYXZpbmdTaXplKEJBU0VTSVpFKS5zaXppbmdDbGFzc2VzKHRoaXMpYC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYmFzZVNpemluZ0NsYXNzZXMgPSBmdW5jdGlvbiBiYXNlU2l6aW5nQ2xhc3NlcygpIHtcbiAgICBpZiAodGhpcy5zaXplICE9PSBPcHRpb25zLkJBU0VTSVpFKSB7XG4gICAgICByZXR1cm4gW1wic2l6aW5nXCIsIFwicmVzZXQtc2l6ZVwiICsgdGhpcy5zaXplLCBcInNpemVcIiArIE9wdGlvbnMuQkFTRVNJWkVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGZvbnQgbWV0cmljcyBmb3IgdGhpcyBzaXplLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5mb250TWV0cmljcyA9IGZ1bmN0aW9uIGZvbnRNZXRyaWNzKCkge1xuICAgIGlmICghdGhpcy5fZm9udE1ldHJpY3MpIHtcbiAgICAgIHRoaXMuX2ZvbnRNZXRyaWNzID0gZ2V0R2xvYmFsTWV0cmljcyh0aGlzLnNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9mb250TWV0cmljcztcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgQ1NTIGNvbG9yIG9mIHRoZSBjdXJyZW50IG9wdGlvbnMgb2JqZWN0XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldENvbG9yID0gZnVuY3Rpb24gZ2V0Q29sb3IoKSB7XG4gICAgaWYgKHRoaXMucGhhbnRvbSkge1xuICAgICAgcmV0dXJuIFwidHJhbnNwYXJlbnRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY29sb3I7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBPcHRpb25zO1xufSgpO1xuXG5PcHRpb25zLkJBU0VTSVpFID0gNjtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19PcHRpb25zID0gKE9wdGlvbnMpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3VuaXRzLmpzXG4vKipcbiAqIFRoaXMgZmlsZSBkb2VzIGNvbnZlcnNpb24gYmV0d2VlbiB1bml0cy4gIEluIHBhcnRpY3VsYXIsIGl0IHByb3ZpZGVzXG4gKiBjYWxjdWxhdGVTaXplIHRvIGNvbnZlcnQgb3RoZXIgdW5pdHMgaW50byBlbXMuXG4gKi9cblxuIC8vIFRoaXMgdGFibGUgZ2l2ZXMgdGhlIG51bWJlciBvZiBUZVggcHRzIGluIG9uZSBvZiBlYWNoICphYnNvbHV0ZSogVGVYIHVuaXQuXG4vLyBUaHVzLCBtdWx0aXBseWluZyBhIGxlbmd0aCBieSB0aGlzIG51bWJlciBjb252ZXJ0cyB0aGUgbGVuZ3RoIGZyb20gdW5pdHNcbi8vIGludG8gcHRzLiAgRGl2aWRpbmcgdGhlIHJlc3VsdCBieSBwdFBlckVtIGdpdmVzIHRoZSBudW1iZXIgb2YgZW1zXG4vLyAqYXNzdW1pbmcqIGEgZm9udCBzaXplIG9mIHB0UGVyRW0gKG5vcm1hbCBzaXplLCBub3JtYWwgc3R5bGUpLlxuXG52YXIgcHRQZXJVbml0ID0ge1xuICAvLyBodHRwczovL2VuLndpa2lib29rcy5vcmcvd2lraS9MYVRlWC9MZW5ndGhzIGFuZFxuICAvLyBodHRwczovL3RleC5zdGFja2V4Y2hhbmdlLmNvbS9hLzgyNjNcbiAgXCJwdFwiOiAxLFxuICAvLyBUZVggcG9pbnRcbiAgXCJtbVwiOiA3MjI3IC8gMjU0MCxcbiAgLy8gbWlsbGltZXRlclxuICBcImNtXCI6IDcyMjcgLyAyNTQsXG4gIC8vIGNlbnRpbWV0ZXJcbiAgXCJpblwiOiA3Mi4yNyxcbiAgLy8gaW5jaFxuICBcImJwXCI6IDgwMyAvIDgwMCxcbiAgLy8gYmlnIChQb3N0U2NyaXB0KSBwb2ludHNcbiAgXCJwY1wiOiAxMixcbiAgLy8gcGljYVxuICBcImRkXCI6IDEyMzggLyAxMTU3LFxuICAvLyBkaWRvdFxuICBcImNjXCI6IDE0ODU2IC8gMTE1NyxcbiAgLy8gY2ljZXJvICgxMiBkaWRvdClcbiAgXCJuZFwiOiA2ODUgLyA2NDIsXG4gIC8vIG5ldyBkaWRvdFxuICBcIm5jXCI6IDEzNzAgLyAxMDcsXG4gIC8vIG5ldyBjaWNlcm8gKDEyIG5ldyBkaWRvdClcbiAgXCJzcFwiOiAxIC8gNjU1MzYsXG4gIC8vIHNjYWxlZCBwb2ludCAoVGVYJ3MgaW50ZXJuYWwgc21hbGxlc3QgdW5pdClcbiAgLy8gaHR0cHM6Ly90ZXguc3RhY2tleGNoYW5nZS5jb20vYS80MTM3MVxuICBcInB4XCI6IDgwMyAvIDgwMCAvLyBcXHBkZnB4ZGltZW4gZGVmYXVsdHMgdG8gMSBicCBpbiBwZGZUZVggYW5kIEx1YVRlWFxuXG59OyAvLyBEaWN0aW9uYXJ5IG9mIHJlbGF0aXZlIHVuaXRzLCBmb3IgZmFzdCB2YWxpZGl0eSB0ZXN0aW5nLlxuXG52YXIgcmVsYXRpdmVVbml0ID0ge1xuICBcImV4XCI6IHRydWUsXG4gIFwiZW1cIjogdHJ1ZSxcbiAgXCJtdVwiOiB0cnVlXG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdW5pdCAoZWl0aGVyIGEgc3RyaW5nIGRlZmluaW5nIHRoZSB1bml0XG4gKiBvciBhIFwic2l6ZVwiIHBhcnNlIG5vZGUgY29udGFpbmluZyBhIHVuaXQgZmllbGQpIGlzIHZhbGlkLlxuICovXG52YXIgdmFsaWRVbml0ID0gZnVuY3Rpb24gdmFsaWRVbml0KHVuaXQpIHtcbiAgaWYgKHR5cGVvZiB1bml0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdW5pdCA9IHVuaXQudW5pdDtcbiAgfVxuXG4gIHJldHVybiB1bml0IGluIHB0UGVyVW5pdCB8fCB1bml0IGluIHJlbGF0aXZlVW5pdCB8fCB1bml0ID09PSBcImV4XCI7XG59O1xuLypcbiAqIENvbnZlcnQgYSBcInNpemVcIiBwYXJzZSBub2RlICh3aXRoIG51bWVyaWMgXCJudW1iZXJcIiBhbmQgc3RyaW5nIFwidW5pdFwiIGZpZWxkcyxcbiAqIGFzIHBhcnNlZCBieSBmdW5jdGlvbnMuanMgYXJnVHlwZSBcInNpemVcIikgaW50byBhIENTUyBlbSB2YWx1ZSBmb3IgdGhlXG4gKiBjdXJyZW50IHN0eWxlL3NjYWxlLiAgYG9wdGlvbnNgIGdpdmVzIHRoZSBjdXJyZW50IG9wdGlvbnMuXG4gKi9cblxudmFyIGNhbGN1bGF0ZVNpemUgPSBmdW5jdGlvbiBjYWxjdWxhdGVTaXplKHNpemVWYWx1ZSwgb3B0aW9ucykge1xuICB2YXIgc2NhbGU7XG5cbiAgaWYgKHNpemVWYWx1ZS51bml0IGluIHB0UGVyVW5pdCkge1xuICAgIC8vIEFic29sdXRlIHVuaXRzXG4gICAgc2NhbGUgPSBwdFBlclVuaXRbc2l6ZVZhbHVlLnVuaXRdIC8vIENvbnZlcnQgdW5pdCB0byBwdFxuICAgIC8gb3B0aW9ucy5mb250TWV0cmljcygpLnB0UGVyRW0gLy8gQ29udmVydCBwdCB0byBDU1MgZW1cbiAgICAvIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXI7IC8vIFVuc2NhbGUgdG8gbWFrZSBhYnNvbHV0ZSB1bml0c1xuICB9IGVsc2UgaWYgKHNpemVWYWx1ZS51bml0ID09PSBcIm11XCIpIHtcbiAgICAvLyBgbXVgIHVuaXRzIHNjYWxlIHdpdGggc2NyaXB0c3R5bGUvc2NyaXB0c2NyaXB0c3R5bGUuXG4gICAgc2NhbGUgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuY3NzRW1QZXJNdTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlciByZWxhdGl2ZSB1bml0cyBhbHdheXMgcmVmZXIgdG8gdGhlICp0ZXh0c3R5bGUqIGZvbnRcbiAgICAvLyBpbiB0aGUgY3VycmVudCBzaXplLlxuICAgIHZhciB1bml0T3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLnN0eWxlLmlzVGlnaHQoKSkge1xuICAgICAgLy8gaXNUaWdodCgpIG1lYW5zIGN1cnJlbnQgc3R5bGUgaXMgc2NyaXB0L3NjcmlwdHNjcmlwdC5cbiAgICAgIHVuaXRPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShvcHRpb25zLnN0eWxlLnRleHQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRPcHRpb25zID0gb3B0aW9ucztcbiAgICB9IC8vIFRPRE86IEluIFRlWCB0aGVzZSB1bml0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHF1YWQgb2YgdGhlIGN1cnJlbnRcbiAgICAvLyAqdGV4dCogZm9udCwgZS5nLiBjbXIxMC4gS2FUZVggaW5zdGVhZCB1c2VzIHZhbHVlcyBmcm9tIHRoZVxuICAgIC8vIGNvbXBhcmFibHktc2l6ZWQgKkNvbXB1dGVyIE1vZGVybiBzeW1ib2wqIGZvbnQuIEF0IDEwcHQsIHRoZXNlXG4gICAgLy8gbWF0Y2guIEF0IDdwdCBhbmQgNXB0LCB0aGV5IGRpZmZlcjogY21yNz0xLjEzODg5NCwgY21zeTc9MS4xNzA2NDE7XG4gICAgLy8gY21yNT0xLjM2MTEzMywgY21zeTU9MS40NzIyNDEuIENvbnNpZGVyICRcXHNjcmlwdHNpemUgYVxca2VybjFlbWIkLlxuICAgIC8vIFRlWCBcXHNob3dsaXN0cyBzaG93cyBhIGtlcm4gb2YgMS4xMzg4OSAqIGZvbnRzaXplO1xuICAgIC8vIEthVGVYIHNob3dzIGEga2VybiBvZiAxLjE3MSAqIGZvbnRzaXplLlxuXG5cbiAgICBpZiAoc2l6ZVZhbHVlLnVuaXQgPT09IFwiZXhcIikge1xuICAgICAgc2NhbGUgPSB1bml0T3B0aW9ucy5mb250TWV0cmljcygpLnhIZWlnaHQ7XG4gICAgfSBlbHNlIGlmIChzaXplVmFsdWUudW5pdCA9PT0gXCJlbVwiKSB7XG4gICAgICBzY2FsZSA9IHVuaXRPcHRpb25zLmZvbnRNZXRyaWNzKCkucXVhZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCB1bml0OiAnXCIgKyBzaXplVmFsdWUudW5pdCArIFwiJ1wiKTtcbiAgICB9XG5cbiAgICBpZiAodW5pdE9wdGlvbnMgIT09IG9wdGlvbnMpIHtcbiAgICAgIHNjYWxlICo9IHVuaXRPcHRpb25zLnNpemVNdWx0aXBsaWVyIC8gb3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTWF0aC5taW4oc2l6ZVZhbHVlLm51bWJlciAqIHNjYWxlLCBvcHRpb25zLm1heFNpemUpO1xufTtcbi8qKlxuICogUm91bmQgYG5gIHRvIDQgZGVjaW1hbCBwbGFjZXMsIG9yIHRvIHRoZSBuZWFyZXN0IDEvMTAsMDAwdGggZW0uIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0thVGVYL0thVGVYL3B1bGwvMjQ2MC5cbiAqL1xuXG52YXIgbWFrZUVtID0gZnVuY3Rpb24gbWFrZUVtKG4pIHtcbiAgcmV0dXJuICtuLnRvRml4ZWQoNCkgKyBcImVtXCI7XG59O1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2RvbVRyZWUuanNcbi8qKlxuICogVGhlc2Ugb2JqZWN0cyBzdG9yZSB0aGUgZGF0YSBhYm91dCB0aGUgRE9NIG5vZGVzIHdlIGNyZWF0ZSwgYXMgd2VsbCBhcyBzb21lXG4gKiBleHRyYSBkYXRhLiBUaGV5IGNhbiB0aGVuIGJlIHRyYW5zZm9ybWVkIGludG8gcmVhbCBET00gbm9kZXMgd2l0aCB0aGVcbiAqIGB0b05vZGVgIGZ1bmN0aW9uIG9yIEhUTUwgbWFya3VwIHVzaW5nIGB0b01hcmt1cGAuIFRoZXkgYXJlIHVzZWZ1bCBmb3IgYm90aFxuICogc3RvcmluZyBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZSBub2RlcywgYXMgd2VsbCBhcyBwcm92aWRpbmcgYSB3YXkgdG8gZWFzaWx5XG4gKiB3b3JrIHdpdGggdGhlIERPTS5cbiAqXG4gKiBTaW1pbGFyIGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIE1hdGhNTCBub2RlcyBleGlzdCBpbiBtYXRoTUxUcmVlLmpzLlxuICpcbiAqIFRPRE86IHJlZmFjdG9yIGBzcGFuYCBhbmQgYGFuY2hvcmAgaW50byBjb21tb24gc3VwZXJjbGFzcyB3aGVuXG4gKiB0YXJnZXQgZW52aXJvbm1lbnRzIHN1cHBvcnQgY2xhc3MgaW5oZXJpdGFuY2VcbiAqL1xuXG5cblxuXG5cblxuLyoqXG4gKiBDcmVhdGUgYW4gSFRNTCBjbGFzc05hbWUgYmFzZWQgb24gYSBsaXN0IG9mIGNsYXNzZXMuIEluIGFkZGl0aW9uIHRvIGpvaW5pbmdcbiAqIHdpdGggc3BhY2VzLCB3ZSBhbHNvIHJlbW92ZSBlbXB0eSBjbGFzc2VzLlxuICovXG52YXIgY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiBjcmVhdGVDbGFzcyhjbGFzc2VzKSB7XG4gIHJldHVybiBjbGFzc2VzLmZpbHRlcihmdW5jdGlvbiAoY2xzKSB7XG4gICAgcmV0dXJuIGNscztcbiAgfSkuam9pbihcIiBcIik7XG59O1xuXG52YXIgaW5pdE5vZGUgPSBmdW5jdGlvbiBpbml0Tm9kZShjbGFzc2VzLCBvcHRpb25zLCBzdHlsZSkge1xuICB0aGlzLmNsYXNzZXMgPSBjbGFzc2VzIHx8IFtdO1xuICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgdGhpcy5oZWlnaHQgPSAwO1xuICB0aGlzLmRlcHRoID0gMDtcbiAgdGhpcy5tYXhGb250U2l6ZSA9IDA7XG4gIHRoaXMuc3R5bGUgPSBzdHlsZSB8fCB7fTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnN0eWxlLmlzVGlnaHQoKSkge1xuICAgICAgdGhpcy5jbGFzc2VzLnB1c2goXCJtdGlnaHRcIik7XG4gICAgfVxuXG4gICAgdmFyIGNvbG9yID0gb3B0aW9ucy5nZXRDb2xvcigpO1xuXG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICB0aGlzLnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgfVxuICB9XG59O1xuLyoqXG4gKiBDb252ZXJ0IGludG8gYW4gSFRNTCBub2RlXG4gKi9cblxuXG52YXIgX3RvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSh0YWdOYW1lKSB7XG4gIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsgLy8gQXBwbHkgdGhlIGNsYXNzXG5cbiAgbm9kZS5jbGFzc05hbWUgPSBjcmVhdGVDbGFzcyh0aGlzLmNsYXNzZXMpOyAvLyBBcHBseSBpbmxpbmUgc3R5bGVzXG5cbiAgZm9yICh2YXIgc3R5bGUgaW4gdGhpcy5zdHlsZSkge1xuICAgIGlmICh0aGlzLnN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlKSkge1xuICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc2VlbSB0byB1bmRlcnN0YW5kIHNwYW4uc3R5bGUncyB0eXBlLlxuICAgICAgbm9kZS5zdHlsZVtzdHlsZV0gPSB0aGlzLnN0eWxlW3N0eWxlXTtcbiAgICB9XG4gIH0gLy8gQXBwbHkgYXR0cmlidXRlc1xuXG5cbiAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmF0dHJpYnV0ZXNbYXR0cl0pO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIGNoaWxkcmVuLCBhbHNvIGFzIEhUTUwgbm9kZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZHJlbltpXS50b05vZGUoKSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn07XG4vKipcbiAqIENvbnZlcnQgaW50byBhbiBIVE1MIG1hcmt1cCBzdHJpbmdcbiAqL1xuXG5cbnZhciBfdG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCh0YWdOYW1lKSB7XG4gIHZhciBtYXJrdXAgPSBcIjxcIiArIHRhZ05hbWU7IC8vIEFkZCB0aGUgY2xhc3NcblxuICBpZiAodGhpcy5jbGFzc2VzLmxlbmd0aCkge1xuICAgIG1hcmt1cCArPSBcIiBjbGFzcz1cXFwiXCIgKyB1dGlscy5lc2NhcGUoY3JlYXRlQ2xhc3ModGhpcy5jbGFzc2VzKSkgKyBcIlxcXCJcIjtcbiAgfVxuXG4gIHZhciBzdHlsZXMgPSBcIlwiOyAvLyBBZGQgdGhlIHN0eWxlcywgYWZ0ZXIgaHlwaGVuYXRpb25cblxuICBmb3IgKHZhciBzdHlsZSBpbiB0aGlzLnN0eWxlKSB7XG4gICAgaWYgKHRoaXMuc3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGUpKSB7XG4gICAgICBzdHlsZXMgKz0gdXRpbHMuaHlwaGVuYXRlKHN0eWxlKSArIFwiOlwiICsgdGhpcy5zdHlsZVtzdHlsZV0gKyBcIjtcIjtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVzKSB7XG4gICAgbWFya3VwICs9IFwiIHN0eWxlPVxcXCJcIiArIHV0aWxzLmVzY2FwZShzdHlsZXMpICsgXCJcXFwiXCI7XG4gIH0gLy8gQWRkIHRoZSBhdHRyaWJ1dGVzXG5cblxuICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cmlidXRlcykge1xuICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgIG1hcmt1cCArPSBcIiBcIiArIGF0dHIgKyBcIj1cXFwiXCIgKyB1dGlscy5lc2NhcGUodGhpcy5hdHRyaWJ1dGVzW2F0dHJdKSArIFwiXFxcIlwiO1xuICAgIH1cbiAgfVxuXG4gIG1hcmt1cCArPSBcIj5cIjsgLy8gQWRkIHRoZSBtYXJrdXAgb2YgdGhlIGNoaWxkcmVuLCBhbHNvIGFzIG1hcmt1cFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIG1hcmt1cCArPSB0aGlzLmNoaWxkcmVuW2ldLnRvTWFya3VwKCk7XG4gIH1cblxuICBtYXJrdXAgKz0gXCI8L1wiICsgdGFnTmFtZSArIFwiPlwiO1xuICByZXR1cm4gbWFya3VwO1xufTsgLy8gTWFraW5nIHRoZSB0eXBlIGJlbG93IGV4YWN0IHdpdGggYWxsIG9wdGlvbmFsIGZpZWxkcyBkb2Vzbid0IHdvcmsgZHVlIHRvXG4vLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80NTgyXG4vLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy81Njg4XG4vLyBIb3dldmVyLCBzaW5jZSAqYWxsKiBmaWVsZHMgYXJlIG9wdGlvbmFsLCAkU2hhcGU8PiB3b3JrcyBhcyBzdWdnZXN0ZWQgaW4gNTY4OFxuLy8gYWJvdmUuXG4vLyBUaGlzIHR5cGUgZG9lcyBub3QgaW5jbHVkZSBhbGwgQ1NTIHByb3BlcnRpZXMuIEFkZGl0aW9uYWwgcHJvcGVydGllcyBzaG91bGRcbi8vIGJlIGFkZGVkIGFzIG5lZWRlZC5cblxuXG4vKipcbiAqIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgc3BhbiBub2RlLCB3aXRoIGEgY2xhc3NOYW1lLCBhIGxpc3Qgb2YgY2hpbGRyZW4sIGFuZFxuICogYW4gaW5saW5lIHN0eWxlLiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGl0cyBoZWlnaHQsIGRlcHRoLCBhbmRcbiAqIG1heEZvbnRTaXplLlxuICpcbiAqIFJlcHJlc2VudHMgdHdvIHR5cGVzIHdpdGggZGlmZmVyZW50IHVzZXM6IFN2Z1NwYW4gdG8gd3JhcCBhbiBTVkcgYW5kIERvbVNwYW5cbiAqIG90aGVyd2lzZS4gVGhpcyB0eXBlc2FmZXR5IGlzIGltcG9ydGFudCB3aGVuIEhUTUwgYnVpbGRlcnMgYWNjZXNzIGEgc3BhbidzXG4gKiBjaGlsZHJlbi5cbiAqL1xudmFyIFNwYW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTcGFuKGNsYXNzZXMsIGNoaWxkcmVuLCBvcHRpb25zLCBzdHlsZSkge1xuICAgIHRoaXMuY2hpbGRyZW4gPSB2b2lkIDA7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gdm9pZCAwO1xuICAgIHRoaXMuY2xhc3NlcyA9IHZvaWQgMDtcbiAgICB0aGlzLmhlaWdodCA9IHZvaWQgMDtcbiAgICB0aGlzLmRlcHRoID0gdm9pZCAwO1xuICAgIHRoaXMud2lkdGggPSB2b2lkIDA7XG4gICAgdGhpcy5tYXhGb250U2l6ZSA9IHZvaWQgMDtcbiAgICB0aGlzLnN0eWxlID0gdm9pZCAwO1xuICAgIGluaXROb2RlLmNhbGwodGhpcywgY2xhc3Nlcywgb3B0aW9ucywgc3R5bGUpO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhbiBhcmJpdHJhcnkgYXR0cmlidXRlIG9uIHRoZSBzcGFuLiBXYXJuaW5nOiB1c2UgdGhpcyB3aXNlbHkuIE5vdFxuICAgKiBhbGwgYnJvd3NlcnMgc3VwcG9ydCBhdHRyaWJ1dGVzIHRoZSBzYW1lLCBhbmQgaGF2aW5nIHRvbyBtYW55IGN1c3RvbVxuICAgKiBhdHRyaWJ1dGVzIGlzIHByb2JhYmx5IGJhZC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU3Bhbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgfTtcblxuICBfcHJvdG8uaGFzQ2xhc3MgPSBmdW5jdGlvbiBoYXNDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdXRpbHMuY29udGFpbnModGhpcy5jbGFzc2VzLCBjbGFzc05hbWUpO1xuICB9O1xuXG4gIF9wcm90by50b05vZGUgPSBmdW5jdGlvbiB0b05vZGUoKSB7XG4gICAgcmV0dXJuIF90b05vZGUuY2FsbCh0aGlzLCBcInNwYW5cIik7XG4gIH07XG5cbiAgX3Byb3RvLnRvTWFya3VwID0gZnVuY3Rpb24gdG9NYXJrdXAoKSB7XG4gICAgcmV0dXJuIF90b01hcmt1cC5jYWxsKHRoaXMsIFwic3BhblwiKTtcbiAgfTtcblxuICByZXR1cm4gU3Bhbjtcbn0oKTtcbi8qKlxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYW4gYW5jaG9yICg8YT4pIGVsZW1lbnQgd2l0aCBhIGh5cGVybGluay4gIFNlZSBgc3BhbmBcbiAqIGZvciBmdXJ0aGVyIGRldGFpbHMuXG4gKi9cblxudmFyIEFuY2hvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuY2hvcihocmVmLCBjbGFzc2VzLCBjaGlsZHJlbiwgb3B0aW9ucykge1xuICAgIHRoaXMuY2hpbGRyZW4gPSB2b2lkIDA7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gdm9pZCAwO1xuICAgIHRoaXMuY2xhc3NlcyA9IHZvaWQgMDtcbiAgICB0aGlzLmhlaWdodCA9IHZvaWQgMDtcbiAgICB0aGlzLmRlcHRoID0gdm9pZCAwO1xuICAgIHRoaXMubWF4Rm9udFNpemUgPSB2b2lkIDA7XG4gICAgdGhpcy5zdHlsZSA9IHZvaWQgMDtcbiAgICBpbml0Tm9kZS5jYWxsKHRoaXMsIGNsYXNzZXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBBbmNob3IucHJvdG90eXBlO1xuXG4gIF9wcm90bzIuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9IHZhbHVlO1xuICB9O1xuXG4gIF9wcm90bzIuaGFzQ2xhc3MgPSBmdW5jdGlvbiBoYXNDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdXRpbHMuY29udGFpbnModGhpcy5jbGFzc2VzLCBjbGFzc05hbWUpO1xuICB9O1xuXG4gIF9wcm90bzIudG9Ob2RlID0gZnVuY3Rpb24gdG9Ob2RlKCkge1xuICAgIHJldHVybiBfdG9Ob2RlLmNhbGwodGhpcywgXCJhXCIpO1xuICB9O1xuXG4gIF9wcm90bzIudG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCgpIHtcbiAgICByZXR1cm4gX3RvTWFya3VwLmNhbGwodGhpcywgXCJhXCIpO1xuICB9O1xuXG4gIHJldHVybiBBbmNob3I7XG59KCk7XG4vKipcbiAqIFRoaXMgbm9kZSByZXByZXNlbnRzIGFuIGltYWdlIGVtYmVkICg8aW1nPikgZWxlbWVudC5cbiAqL1xuXG52YXIgSW1nID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW1nKHNyYywgYWx0LCBzdHlsZSkge1xuICAgIHRoaXMuc3JjID0gdm9pZCAwO1xuICAgIHRoaXMuYWx0ID0gdm9pZCAwO1xuICAgIHRoaXMuY2xhc3NlcyA9IHZvaWQgMDtcbiAgICB0aGlzLmhlaWdodCA9IHZvaWQgMDtcbiAgICB0aGlzLmRlcHRoID0gdm9pZCAwO1xuICAgIHRoaXMubWF4Rm9udFNpemUgPSB2b2lkIDA7XG4gICAgdGhpcy5zdHlsZSA9IHZvaWQgMDtcbiAgICB0aGlzLmFsdCA9IGFsdDtcbiAgICB0aGlzLnNyYyA9IHNyYztcbiAgICB0aGlzLmNsYXNzZXMgPSBbXCJtb3JkXCJdO1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8zID0gSW1nLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLmhhc0NsYXNzID0gZnVuY3Rpb24gaGFzQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHV0aWxzLmNvbnRhaW5zKHRoaXMuY2xhc3NlcywgY2xhc3NOYW1lKTtcbiAgfTtcblxuICBfcHJvdG8zLnRvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSgpIHtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgbm9kZS5zcmMgPSB0aGlzLnNyYztcbiAgICBub2RlLmFsdCA9IHRoaXMuYWx0O1xuICAgIG5vZGUuY2xhc3NOYW1lID0gXCJtb3JkXCI7IC8vIEFwcGx5IGlubGluZSBzdHlsZXNcblxuICAgIGZvciAodmFyIHN0eWxlIGluIHRoaXMuc3R5bGUpIHtcbiAgICAgIGlmICh0aGlzLnN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlKSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIG5vZGUuc3R5bGVbc3R5bGVdID0gdGhpcy5zdHlsZVtzdHlsZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgX3Byb3RvMy50b01hcmt1cCA9IGZ1bmN0aW9uIHRvTWFya3VwKCkge1xuICAgIHZhciBtYXJrdXAgPSBcIjxpbWcgIHNyYz0nXCIgKyB0aGlzLnNyYyArIFwiICdhbHQ9J1wiICsgdGhpcy5hbHQgKyBcIicgXCI7IC8vIEFkZCB0aGUgc3R5bGVzLCBhZnRlciBoeXBoZW5hdGlvblxuXG4gICAgdmFyIHN0eWxlcyA9IFwiXCI7XG5cbiAgICBmb3IgKHZhciBzdHlsZSBpbiB0aGlzLnN0eWxlKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGVzICs9IHV0aWxzLmh5cGhlbmF0ZShzdHlsZSkgKyBcIjpcIiArIHRoaXMuc3R5bGVbc3R5bGVdICsgXCI7XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgbWFya3VwICs9IFwiIHN0eWxlPVxcXCJcIiArIHV0aWxzLmVzY2FwZShzdHlsZXMpICsgXCJcXFwiXCI7XG4gICAgfVxuXG4gICAgbWFya3VwICs9IFwiJy8+XCI7XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfTtcblxuICByZXR1cm4gSW1nO1xufSgpO1xudmFyIGlDb21iaW5hdGlvbnMgPSB7XG4gICfDric6IFwiXFx1MDEzMVxcdTAzMDJcIixcbiAgJ8OvJzogXCJcXHUwMTMxXFx1MDMwOFwiLFxuICAnw60nOiBcIlxcdTAxMzFcXHUwMzAxXCIsXG4gIC8vICfEqyc6ICdcXHUwMTMxXFx1MDMwNCcsIC8vIGVuYWJsZSB3aGVuIHdlIGFkZCBFeHRlbmRlZCBMYXRpblxuICAnw6wnOiBcIlxcdTAxMzFcXHUwMzAwXCJcbn07XG4vKipcbiAqIEEgc3ltYm9sIG5vZGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgc3ltYm9sLiBJdCBlaXRoZXIgcmVuZGVyc1xuICogdG8gYSBzaW5nbGUgdGV4dCBub2RlLCBvciBhIHNwYW4gd2l0aCBhIHNpbmdsZSB0ZXh0IG5vZGUgaW4gaXQsIGRlcGVuZGluZyBvblxuICogd2hldGhlciBpdCBoYXMgQ1NTIGNsYXNzZXMsIHN0eWxlcywgb3IgbmVlZHMgaXRhbGljIGNvcnJlY3Rpb24uXG4gKi9cblxudmFyIFN5bWJvbE5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTeW1ib2xOb2RlKHRleHQsIGhlaWdodCwgZGVwdGgsIGl0YWxpYywgc2tldywgd2lkdGgsIGNsYXNzZXMsIHN0eWxlKSB7XG4gICAgdGhpcy50ZXh0ID0gdm9pZCAwO1xuICAgIHRoaXMuaGVpZ2h0ID0gdm9pZCAwO1xuICAgIHRoaXMuZGVwdGggPSB2b2lkIDA7XG4gICAgdGhpcy5pdGFsaWMgPSB2b2lkIDA7XG4gICAgdGhpcy5za2V3ID0gdm9pZCAwO1xuICAgIHRoaXMud2lkdGggPSB2b2lkIDA7XG4gICAgdGhpcy5tYXhGb250U2l6ZSA9IHZvaWQgMDtcbiAgICB0aGlzLmNsYXNzZXMgPSB2b2lkIDA7XG4gICAgdGhpcy5zdHlsZSA9IHZvaWQgMDtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IHx8IDA7XG4gICAgdGhpcy5kZXB0aCA9IGRlcHRoIHx8IDA7XG4gICAgdGhpcy5pdGFsaWMgPSBpdGFsaWMgfHwgMDtcbiAgICB0aGlzLnNrZXcgPSBza2V3IHx8IDA7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIHx8IDA7XG4gICAgdGhpcy5jbGFzc2VzID0gY2xhc3NlcyB8fCBbXTtcbiAgICB0aGlzLnN0eWxlID0gc3R5bGUgfHwge307XG4gICAgdGhpcy5tYXhGb250U2l6ZSA9IDA7IC8vIE1hcmsgdGV4dCBmcm9tIG5vbi1MYXRpbiBzY3JpcHRzIHdpdGggc3BlY2lmaWMgY2xhc3NlcyBzbyB0aGF0IHdlXG4gICAgLy8gY2FuIHNwZWNpZnkgd2hpY2ggZm9udHMgdG8gdXNlLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVuZGVyIHRoZXNlXG4gICAgLy8gY2hhcmFjdGVycyB3aXRoIGEgc2VyaWYgZm9udCBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBicm93c2VyIHdvdWxkXG4gICAgLy8gZWl0aGVyIGRlZmF1bHQgdG8gYSBzYW5zIHNlcmlmIG9yIHJlbmRlciBhIHBsYWNlaG9sZGVyIGNoYXJhY3Rlci5cbiAgICAvLyBXZSB1c2UgQ1NTIGNsYXNzIG5hbWVzIGxpa2UgY2prX2ZhbGxiYWNrLCBoYW5ndWxfZmFsbGJhY2sgYW5kXG4gICAgLy8gYnJhaG1pY19mYWxsYmFjay4gU2VlIC4vdW5pY29kZVNjcmlwdHMuanMgZm9yIHRoZSBzZXQgb2YgcG9zc2libGVcbiAgICAvLyBzY3JpcHQgbmFtZXNcblxuICAgIHZhciBzY3JpcHQgPSBzY3JpcHRGcm9tQ29kZXBvaW50KHRoaXMudGV4dC5jaGFyQ29kZUF0KDApKTtcblxuICAgIGlmIChzY3JpcHQpIHtcbiAgICAgIHRoaXMuY2xhc3Nlcy5wdXNoKHNjcmlwdCArIFwiX2ZhbGxiYWNrXCIpO1xuICAgIH1cblxuICAgIGlmICgvW8Ouw6/DrcOsXS8udGVzdCh0aGlzLnRleHQpKSB7XG4gICAgICAvLyBhZGQgxKsgd2hlbiB3ZSBhZGQgRXh0ZW5kZWQgTGF0aW5cbiAgICAgIHRoaXMudGV4dCA9IGlDb21iaW5hdGlvbnNbdGhpcy50ZXh0XTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvNCA9IFN5bWJvbE5vZGUucHJvdG90eXBlO1xuXG4gIF9wcm90bzQuaGFzQ2xhc3MgPSBmdW5jdGlvbiBoYXNDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdXRpbHMuY29udGFpbnModGhpcy5jbGFzc2VzLCBjbGFzc05hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGV4dCBub2RlIG9yIHNwYW4gZnJvbSBhIHN5bWJvbCBub2RlLiBOb3RlIHRoYXQgYSBzcGFuIGlzIG9ubHlcbiAgICogY3JlYXRlZCBpZiBpdCBpcyBuZWVkZWQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvNC50b05vZGUgPSBmdW5jdGlvbiB0b05vZGUoKSB7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHQpO1xuICAgIHZhciBzcGFuID0gbnVsbDtcblxuICAgIGlmICh0aGlzLml0YWxpYyA+IDApIHtcbiAgICAgIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHNwYW4uc3R5bGUubWFyZ2luUmlnaHQgPSBtYWtlRW0odGhpcy5pdGFsaWMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3BhbiA9IHNwYW4gfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBzcGFuLmNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzKHRoaXMuY2xhc3Nlcyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgc3R5bGUgaW4gdGhpcy5zdHlsZSkge1xuICAgICAgaWYgKHRoaXMuc3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGUpKSB7XG4gICAgICAgIHNwYW4gPSBzcGFuIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzZWVtIHRvIHVuZGVyc3RhbmQgc3Bhbi5zdHlsZSdzIHR5cGUuXG5cbiAgICAgICAgc3Bhbi5zdHlsZVtzdHlsZV0gPSB0aGlzLnN0eWxlW3N0eWxlXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3Bhbikge1xuICAgICAgc3Bhbi5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIHJldHVybiBzcGFuO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciBhIHN5bWJvbCBub2RlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90bzQudG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCgpIHtcbiAgICAvLyBUT0RPKGFscGVydCk6IE1vcmUgZHVwbGljYXRpb24gdGhhbiBJJ2QgbGlrZSBmcm9tXG4gICAgLy8gc3Bhbi5wcm90b3R5cGUudG9NYXJrdXAgYW5kIHN5bWJvbE5vZGUucHJvdG90eXBlLnRvTm9kZS4uLlxuICAgIHZhciBuZWVkc1NwYW4gPSBmYWxzZTtcbiAgICB2YXIgbWFya3VwID0gXCI8c3BhblwiO1xuXG4gICAgaWYgKHRoaXMuY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIG5lZWRzU3BhbiA9IHRydWU7XG4gICAgICBtYXJrdXAgKz0gXCIgY2xhc3M9XFxcIlwiO1xuICAgICAgbWFya3VwICs9IHV0aWxzLmVzY2FwZShjcmVhdGVDbGFzcyh0aGlzLmNsYXNzZXMpKTtcbiAgICAgIG1hcmt1cCArPSBcIlxcXCJcIjtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGVzID0gXCJcIjtcblxuICAgIGlmICh0aGlzLml0YWxpYyA+IDApIHtcbiAgICAgIHN0eWxlcyArPSBcIm1hcmdpbi1yaWdodDpcIiArIHRoaXMuaXRhbGljICsgXCJlbTtcIjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBzdHlsZSBpbiB0aGlzLnN0eWxlKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGVzICs9IHV0aWxzLmh5cGhlbmF0ZShzdHlsZSkgKyBcIjpcIiArIHRoaXMuc3R5bGVbc3R5bGVdICsgXCI7XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgbmVlZHNTcGFuID0gdHJ1ZTtcbiAgICAgIG1hcmt1cCArPSBcIiBzdHlsZT1cXFwiXCIgKyB1dGlscy5lc2NhcGUoc3R5bGVzKSArIFwiXFxcIlwiO1xuICAgIH1cblxuICAgIHZhciBlc2NhcGVkID0gdXRpbHMuZXNjYXBlKHRoaXMudGV4dCk7XG5cbiAgICBpZiAobmVlZHNTcGFuKSB7XG4gICAgICBtYXJrdXAgKz0gXCI+XCI7XG4gICAgICBtYXJrdXAgKz0gZXNjYXBlZDtcbiAgICAgIG1hcmt1cCArPSBcIjwvc3Bhbj5cIjtcbiAgICAgIHJldHVybiBtYXJrdXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlc2NhcGVkO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU3ltYm9sTm9kZTtcbn0oKTtcbi8qKlxuICogU1ZHIG5vZGVzIGFyZSB1c2VkIHRvIHJlbmRlciBzdHJldGNoeSB3aWRlIGVsZW1lbnRzLlxuICovXG5cbnZhciBTdmdOb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3ZnTm9kZShjaGlsZHJlbiwgYXR0cmlidXRlcykge1xuICAgIHRoaXMuY2hpbGRyZW4gPSB2b2lkIDA7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gdm9pZCAwO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuICB9XG5cbiAgdmFyIF9wcm90bzUgPSBTdmdOb2RlLnByb3RvdHlwZTtcblxuICBfcHJvdG81LnRvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSgpIHtcbiAgICB2YXIgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIFwic3ZnXCIpOyAvLyBBcHBseSBhdHRyaWJ1dGVzXG5cbiAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cmlidXRlcykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmF0dHJpYnV0ZXMsIGF0dHIpKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHIsIHRoaXMuYXR0cmlidXRlc1thdHRyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5baV0udG9Ob2RlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIF9wcm90bzUudG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCgpIHtcbiAgICB2YXIgbWFya3VwID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCJcIjsgLy8gQXBwbHkgYXR0cmlidXRlc1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBhdHRyKSkge1xuICAgICAgICBtYXJrdXAgKz0gXCIgXCIgKyBhdHRyICsgXCI9J1wiICsgdGhpcy5hdHRyaWJ1dGVzW2F0dHJdICsgXCInXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFya3VwICs9IFwiPlwiO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtYXJrdXAgKz0gdGhpcy5jaGlsZHJlbltpXS50b01hcmt1cCgpO1xuICAgIH1cblxuICAgIG1hcmt1cCArPSBcIjwvc3ZnPlwiO1xuICAgIHJldHVybiBtYXJrdXA7XG4gIH07XG5cbiAgcmV0dXJuIFN2Z05vZGU7XG59KCk7XG52YXIgUGF0aE5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQYXRoTm9kZShwYXRoTmFtZSwgYWx0ZXJuYXRlKSB7XG4gICAgdGhpcy5wYXRoTmFtZSA9IHZvaWQgMDtcbiAgICB0aGlzLmFsdGVybmF0ZSA9IHZvaWQgMDtcbiAgICB0aGlzLnBhdGhOYW1lID0gcGF0aE5hbWU7XG4gICAgdGhpcy5hbHRlcm5hdGUgPSBhbHRlcm5hdGU7IC8vIFVzZWQgb25seSBmb3IgXFxzcXJ0LCBcXHBoYXNlLCAmIHRhbGwgZGVsaW1zXG4gIH1cblxuICB2YXIgX3Byb3RvNiA9IFBhdGhOb2RlLnByb3RvdHlwZTtcblxuICBfcHJvdG82LnRvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSgpIHtcbiAgICB2YXIgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIFwicGF0aFwiKTtcblxuICAgIGlmICh0aGlzLmFsdGVybmF0ZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkXCIsIHRoaXMuYWx0ZXJuYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkXCIsIHBhdGhbdGhpcy5wYXRoTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIF9wcm90bzYudG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCgpIHtcbiAgICBpZiAodGhpcy5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBcIjxwYXRoIGQ9J1wiICsgdGhpcy5hbHRlcm5hdGUgKyBcIicvPlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI8cGF0aCBkPSdcIiArIHBhdGhbdGhpcy5wYXRoTmFtZV0gKyBcIicvPlwiO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUGF0aE5vZGU7XG59KCk7XG52YXIgTGluZU5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMaW5lTm9kZShhdHRyaWJ1dGVzKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gdm9pZCAwO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG4gIH1cblxuICB2YXIgX3Byb3RvNyA9IExpbmVOb2RlLnByb3RvdHlwZTtcblxuICBfcHJvdG83LnRvTm9kZSA9IGZ1bmN0aW9uIHRvTm9kZSgpIHtcbiAgICB2YXIgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIFwibGluZVwiKTsgLy8gQXBwbHkgYXR0cmlidXRlc1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBhdHRyKSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmF0dHJpYnV0ZXNbYXR0cl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIF9wcm90bzcudG9NYXJrdXAgPSBmdW5jdGlvbiB0b01hcmt1cCgpIHtcbiAgICB2YXIgbWFya3VwID0gXCI8bGluZVwiO1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBhdHRyKSkge1xuICAgICAgICBtYXJrdXAgKz0gXCIgXCIgKyBhdHRyICsgXCI9J1wiICsgdGhpcy5hdHRyaWJ1dGVzW2F0dHJdICsgXCInXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFya3VwICs9IFwiLz5cIjtcbiAgICByZXR1cm4gbWFya3VwO1xuICB9O1xuXG4gIHJldHVybiBMaW5lTm9kZTtcbn0oKTtcbmZ1bmN0aW9uIGFzc2VydFN5bWJvbERvbU5vZGUoZ3JvdXApIHtcbiAgaWYgKGdyb3VwIGluc3RhbmNlb2YgU3ltYm9sTm9kZSkge1xuICAgIHJldHVybiBncm91cDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzeW1ib2xOb2RlIGJ1dCBnb3QgXCIgKyBTdHJpbmcoZ3JvdXApICsgXCIuXCIpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRTcGFuKGdyb3VwKSB7XG4gIGlmIChncm91cCBpbnN0YW5jZW9mIFNwYW4pIHtcbiAgICByZXR1cm4gZ3JvdXA7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgc3BhbjxIdG1sRG9tTm9kZT4gYnV0IGdvdCBcIiArIFN0cmluZyhncm91cCkgKyBcIi5cIik7XG4gIH1cbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zeW1ib2xzLmpzXG4vKipcbiAqIFRoaXMgZmlsZSBob2xkcyBhIGxpc3Qgb2YgYWxsIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucyBhbmQgc2luZ2xlLWNoYXJhY3RlclxuICogc3ltYm9scyAobGlrZSAnYScgb3IgJzsnKS5cbiAqXG4gKiBGb3IgZWFjaCBvZiB0aGUgc3ltYm9scywgdGhlcmUgYXJlIHRocmVlIHByb3BlcnRpZXMgdGhleSBjYW4gaGF2ZTpcbiAqIC0gZm9udCAocmVxdWlyZWQpOiB0aGUgZm9udCB0byBiZSB1c2VkIGZvciB0aGlzIHN5bWJvbC4gRWl0aGVyIFwibWFpblwiICh0aGVcbiAgICAgbm9ybWFsIGZvbnQpLCBvciBcImFtc1wiICh0aGUgYW1zIGZvbnRzKS5cbiAqIC0gZ3JvdXAgKHJlcXVpcmVkKTogdGhlIFBhcnNlTm9kZSBncm91cCB0eXBlIHRoZSBzeW1ib2wgc2hvdWxkIGhhdmUgKGkuZS5cbiAgICAgXCJ0ZXh0b3JkXCIsIFwibWF0aG9yZFwiLCBldGMpLlxuICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0thVGVYL0thVGVYL3dpa2kvRXhhbWluaW5nLVRlWCNncm91cC10eXBlc1xuICogLSByZXBsYWNlOiB0aGUgY2hhcmFjdGVyIHRoYXQgdGhpcyBzeW1ib2wgb3IgZnVuY3Rpb24gc2hvdWxkIGJlXG4gKiAgIHJlcGxhY2VkIHdpdGggKGkuZS4gXCJcXHBoaVwiIGhhcyBhIHJlcGxhY2UgdmFsdWUgb2YgXCJcXHUwM2Q1XCIsIHRoZSBwaGlcbiAqICAgY2hhcmFjdGVyIGluIHRoZSBtYWluIGZvbnQpLlxuICpcbiAqIFRoZSBvdXRlcm1vc3QgbWFwIGluIHRoZSB0YWJsZSBpbmRpY2F0ZXMgd2hhdCBtb2RlIHRoZSBzeW1ib2xzIHNob3VsZCBiZVxuICogYWNjZXB0ZWQgaW4gKGUuZy4gXCJtYXRoXCIgb3IgXCJ0ZXh0XCIpLlxuICovXG4vLyBTb21lIG9mIHRoZXNlIGhhdmUgYSBcIi10b2tlblwiIHN1ZmZpeCBzaW5jZSB0aGVzZSBhcmUgYWxzbyB1c2VkIGFzIGBQYXJzZU5vZGVgXG4vLyB0eXBlcyBmb3IgcmF3IHRleHQgdG9rZW5zLCBhbmQgd2Ugd2FudCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBoaWdoZXItbGV2ZWxcbi8vIGBQYXJzZU5vZGVgIHR5cGVzLiBUaGVzZSBgUGFyc2VOb2RlYHMgYXJlIGNvbnN0cnVjdGVkIHdpdGhpbiBgUGFyc2VyYCBieVxuLy8gbG9va2luZyB1cCB0aGUgYHN5bWJvbHNgIG1hcC5cbnZhciBBVE9NUyA9IHtcbiAgXCJiaW5cIjogMSxcbiAgXCJjbG9zZVwiOiAxLFxuICBcImlubmVyXCI6IDEsXG4gIFwib3BlblwiOiAxLFxuICBcInB1bmN0XCI6IDEsXG4gIFwicmVsXCI6IDFcbn07XG52YXIgTk9OX0FUT01TID0ge1xuICBcImFjY2VudC10b2tlblwiOiAxLFxuICBcIm1hdGhvcmRcIjogMSxcbiAgXCJvcC10b2tlblwiOiAxLFxuICBcInNwYWNpbmdcIjogMSxcbiAgXCJ0ZXh0b3JkXCI6IDFcbn07XG52YXIgc3ltYm9scyA9IHtcbiAgXCJtYXRoXCI6IHt9LFxuICBcInRleHRcIjoge31cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfc3ltYm9scyA9IChzeW1ib2xzKTtcbi8qKiBgYWNjZXB0VW5pY29kZUNoYXIgPSB0cnVlYCBpcyBvbmx5IGFwcGxpY2FibGUgaWYgYHJlcGxhY2VgIGlzIHNldC4gKi9cblxuZnVuY3Rpb24gZGVmaW5lU3ltYm9sKG1vZGUsIGZvbnQsIGdyb3VwLCByZXBsYWNlLCBuYW1lLCBhY2NlcHRVbmljb2RlQ2hhcikge1xuICBzeW1ib2xzW21vZGVdW25hbWVdID0ge1xuICAgIGZvbnQ6IGZvbnQsXG4gICAgZ3JvdXA6IGdyb3VwLFxuICAgIHJlcGxhY2U6IHJlcGxhY2VcbiAgfTtcblxuICBpZiAoYWNjZXB0VW5pY29kZUNoYXIgJiYgcmVwbGFjZSkge1xuICAgIHN5bWJvbHNbbW9kZV1bcmVwbGFjZV0gPSBzeW1ib2xzW21vZGVdW25hbWVdO1xuICB9XG59IC8vIFNvbWUgYWJicmV2aWF0aW9ucyBmb3IgY29tbW9ubHkgdXNlZCBzdHJpbmdzLlxuLy8gVGhpcyBoZWxwcyBtaW5pZnkgdGhlIGNvZGUsIGFuZCBhbHNvIHNwb3R0aW5nIHR5cG9zIHVzaW5nIGpzaGludC5cbi8vIG1vZGVzOlxuXG52YXIgbWF0aCA9IFwibWF0aFwiO1xudmFyIHN5bWJvbHNfdGV4dCA9IFwidGV4dFwiOyAvLyBmb250czpcblxudmFyIG1haW4gPSBcIm1haW5cIjtcbnZhciBhbXMgPSBcImFtc1wiOyAvLyBncm91cHM6XG5cbnZhciBhY2NlbnQgPSBcImFjY2VudC10b2tlblwiO1xudmFyIGJpbiA9IFwiYmluXCI7XG52YXIgc3ltYm9sc19jbG9zZSA9IFwiY2xvc2VcIjtcbnZhciBpbm5lciA9IFwiaW5uZXJcIjtcbnZhciBtYXRob3JkID0gXCJtYXRob3JkXCI7XG52YXIgb3AgPSBcIm9wLXRva2VuXCI7XG52YXIgc3ltYm9sc19vcGVuID0gXCJvcGVuXCI7XG52YXIgcHVuY3QgPSBcInB1bmN0XCI7XG52YXIgcmVsID0gXCJyZWxcIjtcbnZhciBzcGFjaW5nID0gXCJzcGFjaW5nXCI7XG52YXIgdGV4dG9yZCA9IFwidGV4dG9yZFwiOyAvLyBOb3cgY29tZXMgdGhlIHN5bWJvbCB0YWJsZVxuLy8gUmVsYXRpb24gU3ltYm9sc1xuXG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNjFcIiwgXCJcXFxcZXF1aXZcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyN0FcIiwgXCJcXFxccHJlY1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjI3QlwiLCBcIlxcXFxzdWNjXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjNDXCIsIFwiXFxcXHNpbVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjJBNVwiLCBcIlxcXFxwZXJwXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyQUFGXCIsIFwiXFxcXHByZWNlcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MkFCMFwiLCBcIlxcXFxzdWNjZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNDNcIiwgXCJcXFxcc2ltZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyMjNcIiwgXCJcXFxcbWlkXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjZBXCIsIFwiXFxcXGxsXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjZCXCIsIFwiXFxcXGdnXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjREXCIsIFwiXFxcXGFzeW1wXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjI1XCIsIFwiXFxcXHBhcmFsbGVsXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMkM4XCIsIFwiXFxcXGJvd3RpZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjMyM1wiLCBcIlxcXFxzbWlsZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjI5MVwiLCBcIlxcXFxzcXN1YnNldGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjkyXCIsIFwiXFxcXHNxc3Vwc2V0ZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNTBcIiwgXCJcXFxcZG90ZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIzMjJcIiwgXCJcXFxcZnJvd25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyMEJcIiwgXCJcXFxcbmlcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyMURcIiwgXCJcXFxccHJvcHRvXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMkEyXCIsIFwiXFxcXHZkYXNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMkEzXCIsIFwiXFxcXGRhc2h2XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjBCXCIsIFwiXFxcXG93bnNcIik7IC8vIFB1bmN0dWF0aW9uXG5cbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBwdW5jdCwgXCIuXCIsIFwiXFxcXGxkb3RwXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHB1bmN0LCBcIlxcdTIyQzVcIiwgXCJcXFxcY2RvdHBcIik7IC8vIE1pc2MgU3ltYm9sc1xuXG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCIjXCIsIFwiXFxcXCNcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIiNcIiwgXCJcXFxcI1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIiZcIiwgXCJcXFxcJlwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiJlwiLCBcIlxcXFwmXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjEzNVwiLCBcIlxcXFxhbGVwaFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIyMDBcIiwgXCJcXFxcZm9yYWxsXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjEwRlwiLCBcIlxcXFxoYmFyXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIwM1wiLCBcIlxcXFxleGlzdHNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMjA3XCIsIFwiXFxcXG5hYmxhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjY2RFwiLCBcIlxcXFxmbGF0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjExM1wiLCBcIlxcXFxlbGxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyNjZFXCIsIFwiXFxcXG5hdHVyYWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyNjYzXCIsIFwiXFxcXGNsdWJzdWl0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjExOFwiLCBcIlxcXFx3cFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTI2NkZcIiwgXCJcXFxcc2hhcnBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyNjYyXCIsIFwiXFxcXGRpYW1vbmRzdWl0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjExQ1wiLCBcIlxcXFxSZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTI2NjFcIiwgXCJcXFxcaGVhcnRzdWl0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjExMVwiLCBcIlxcXFxJbVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTI2NjBcIiwgXCJcXFxcc3BhZGVzdWl0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx4QTdcIiwgXCJcXFxcU1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx4QTdcIiwgXCJcXFxcU1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxceEI2XCIsIFwiXFxcXFBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxceEI2XCIsIFwiXFxcXFBcIik7IC8vIE1hdGggYW5kIFRleHRcblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjAyMFwiLCBcIlxcXFxkYWdcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMjBcIiwgXCJcXFxcZGFnXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDIwXCIsIFwiXFxcXHRleHRkYWdnZXJcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDIxXCIsIFwiXFxcXGRkYWdcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMjFcIiwgXCJcXFxcZGRhZ1wiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx1MjAyMVwiLCBcIlxcXFx0ZXh0ZGFnZ2VyZGJsXCIpOyAvLyBMYXJnZSBEZWxpbWl0ZXJzXG5cbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIlxcdTIzQjFcIiwgXCJcXFxccm1vdXN0YWNoZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwiXFx1MjNCMFwiLCBcIlxcXFxsbW91c3RhY2hlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfY2xvc2UsIFwiXFx1MjdFRlwiLCBcIlxcXFxyZ3JvdXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19vcGVuLCBcIlxcdTI3RUVcIiwgXCJcXFxcbGdyb3VwXCIsIHRydWUpOyAvLyBCaW5hcnkgT3BlcmF0b3JzXG5cbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjIxM1wiLCBcIlxcXFxtcFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjI5NlwiLCBcIlxcXFxvbWludXNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyOEVcIiwgXCJcXFxcdXBsdXNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyOTNcIiwgXCJcXFxcc3FjYXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMTdcIiwgXCJcXFxcYXN0XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMjk0XCIsIFwiXFxcXHNxY3VwXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyNUVGXCIsIFwiXFxcXGJpZ2NpcmNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMTlcIiwgXCJcXFxcYnVsbGV0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMDIxXCIsIFwiXFxcXGRkYWdnZXJcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyNDBcIiwgXCJcXFxcd3JcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTJBM0ZcIiwgXCJcXFxcYW1hbGdcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIiZcIiwgXCJcXFxcQW5kXCIpOyAvLyBmcm9tIGFtc21hdGhcbi8vIEFycm93IFN5bWJvbHNcblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyN0Y1XCIsIFwiXFxcXGxvbmdsZWZ0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxRDBcIiwgXCJcXFxcTGVmdGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyN0Y4XCIsIFwiXFxcXExvbmdsZWZ0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTI3RjZcIiwgXCJcXFxcbG9uZ3JpZ2h0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxRDJcIiwgXCJcXFxcUmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjdGOVwiLCBcIlxcXFxMb25ncmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjE5NFwiLCBcIlxcXFxsZWZ0cmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjdGN1wiLCBcIlxcXFxsb25nbGVmdHJpZ2h0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxRDRcIiwgXCJcXFxcTGVmdHJpZ2h0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTI3RkFcIiwgXCJcXFxcTG9uZ2xlZnRyaWdodGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMUE2XCIsIFwiXFxcXG1hcHN0b1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjdGQ1wiLCBcIlxcXFxsb25nbWFwc3RvXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMTk3XCIsIFwiXFxcXG5lYXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxQTlcIiwgXCJcXFxcaG9va2xlZnRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjFBQVwiLCBcIlxcXFxob29rcmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjE5OFwiLCBcIlxcXFxzZWFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMUJDXCIsIFwiXFxcXGxlZnRoYXJwb29udXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxQzBcIiwgXCJcXFxccmlnaHRoYXJwb29udXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxOTlcIiwgXCJcXFxcc3dhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjFCRFwiLCBcIlxcXFxsZWZ0aGFycG9vbmRvd25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxQzFcIiwgXCJcXFxccmlnaHRoYXJwb29uZG93blwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjE5NlwiLCBcIlxcXFxud2Fycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMUNDXCIsIFwiXFxcXHJpZ2h0bGVmdGhhcnBvb25zXCIsIHRydWUpOyAvLyBBTVMgTmVnYXRlZCBCaW5hcnkgUmVsYXRpb25zXG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjZFXCIsIFwiXFxcXG5sZXNzXCIsIHRydWUpOyAvLyBTeW1ib2wgbmFtZXMgcHJlY2VlZGVkIGJ5IFwiQFwiIGVhY2ggaGF2ZSBhIGNvcnJlc3BvbmRpbmcgbWFjcm8uXG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHVFMDEwXCIsIFwiXFxcXEBubGVxc2xhbnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAxMVwiLCBcIlxcXFxAbmxlcXFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4N1wiLCBcIlxcXFxsbmVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNjhcIiwgXCJcXFxcbG5lcXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAwQ1wiLCBcIlxcXFxAbHZlcnRuZXFxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyRTZcIiwgXCJcXFxcbG5zaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4OVwiLCBcIlxcXFxsbmFwcHJveFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjgwXCIsIFwiXFxcXG5wcmVjXCIsIHRydWUpOyAvLyB1bmljb2RlLW1hdGggbWFwcyBcXHUyMmUwIHRvIFxcbnByZWNjdXJseWVxLiBXZSdsbCB1c2UgdGhlIEFNUyBzeW5vbnltLlxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJFMFwiLCBcIlxcXFxucHJlY2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyRThcIiwgXCJcXFxccHJlY25zaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkFCOVwiLCBcIlxcXFxwcmVjbmFwcHJveFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjQxXCIsIFwiXFxcXG5zaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAwNlwiLCBcIlxcXFxAbnNob3J0bWlkXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMjRcIiwgXCJcXFxcbm1pZFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkFDXCIsIFwiXFxcXG52ZGFzaFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkFEXCIsIFwiXFxcXG52RGFzaFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkVBXCIsIFwiXFxcXG50cmlhbmdsZWxlZnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJFQ1wiLCBcIlxcXFxudHJpYW5nbGVsZWZ0ZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI4QVwiLCBcIlxcXFxzdWJzZXRuZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAxQVwiLCBcIlxcXFxAdmFyc3Vic2V0bmVxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBQ0JcIiwgXCJcXFxcc3Vic2V0bmVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHVFMDE3XCIsIFwiXFxcXEB2YXJzdWJzZXRuZXFxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNkZcIiwgXCJcXFxcbmd0clwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHVFMDBGXCIsIFwiXFxcXEBuZ2Vxc2xhbnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAwRVwiLCBcIlxcXFxAbmdlcXFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4OFwiLCBcIlxcXFxnbmVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNjlcIiwgXCJcXFxcZ25lcXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAwRFwiLCBcIlxcXFxAZ3ZlcnRuZXFxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyRTdcIiwgXCJcXFxcZ25zaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4QVwiLCBcIlxcXFxnbmFwcHJveFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjgxXCIsIFwiXFxcXG5zdWNjXCIsIHRydWUpOyAvLyB1bmljb2RlLW1hdGggbWFwcyBcXHUyMmUxIHRvIFxcbnN1Y2NjdXJseWVxLiBXZSdsbCB1c2UgdGhlIEFNUyBzeW5vbnltLlxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJFMVwiLCBcIlxcXFxuc3VjY2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyRTlcIiwgXCJcXFxcc3VjY25zaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkFCQVwiLCBcIlxcXFxzdWNjbmFwcHJveFwiLCB0cnVlKTsgLy8gdW5pY29kZS1tYXRoIG1hcHMgXFx1MjI0NiB0byBcXHNpbW5lcXEuIFdlJ2xsIHVzZSB0aGUgQU1TIHN5bm9ueW0uXG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjQ2XCIsIFwiXFxcXG5jb25nXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdUUwMDdcIiwgXCJcXFxcQG5zaG9ydHBhcmFsbGVsXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMjZcIiwgXCJcXFxcbnBhcmFsbGVsXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQUZcIiwgXCJcXFxcblZEYXNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyRUJcIiwgXCJcXFxcbnRyaWFuZ2xlcmlnaHRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJFRFwiLCBcIlxcXFxudHJpYW5nbGVyaWdodGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdUUwMThcIiwgXCJcXFxcQG5zdXBzZXRlcXFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI4QlwiLCBcIlxcXFxzdXBzZXRuZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1RTAxQlwiLCBcIlxcXFxAdmFyc3Vwc2V0bmVxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBQ0NcIiwgXCJcXFxcc3Vwc2V0bmVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHVFMDE5XCIsIFwiXFxcXEB2YXJzdXBzZXRuZXFxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQUVcIiwgXCJcXFxcblZkYXNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBQjVcIiwgXCJcXFxccHJlY25lcXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkFCNlwiLCBcIlxcXFxzdWNjbmVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHVFMDE2XCIsIFwiXFxcXEBuc3Vic2V0ZXFxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQjRcIiwgXCJcXFxcdW5saGRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJCNVwiLCBcIlxcXFx1bnJoZFwiKTsgLy8gQU1TIE5lZ2F0ZWQgQXJyb3dzXG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMTlBXCIsIFwiXFxcXG5sZWZ0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjE5QlwiLCBcIlxcXFxucmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUNEXCIsIFwiXFxcXG5MZWZ0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFDRlwiLCBcIlxcXFxuUmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUFFXCIsIFwiXFxcXG5sZWZ0cmlnaHRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUNFXCIsIFwiXFxcXG5MZWZ0cmlnaHRhcnJvd1wiLCB0cnVlKTsgLy8gQU1TIE1pc2NcblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTI1QjNcIiwgXCJcXFxcdmFydHJpYW5nbGVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTIxMEZcIiwgXCJcXFxcaHNsYXNoXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyNUJEXCIsIFwiXFxcXHRyaWFuZ2xlZG93blwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjVDQVwiLCBcIlxcXFxsb3plbmdlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyNEM4XCIsIFwiXFxcXGNpcmNsZWRTXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHhBRVwiLCBcIlxcXFxjaXJjbGVkUlwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJcXHhBRVwiLCBcIlxcXFxjaXJjbGVkUlwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjIyMVwiLCBcIlxcXFxtZWFzdXJlZGFuZ2xlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyMjA0XCIsIFwiXFxcXG5leGlzdHNcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTIxMjdcIiwgXCJcXFxcbWhvXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyMTMyXCIsIFwiXFxcXEZpbnZcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTIxNDFcIiwgXCJcXFxcR2FtZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjAzNVwiLCBcIlxcXFxiYWNrcHJpbWVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI1QjJcIiwgXCJcXFxcYmxhY2t0cmlhbmdsZVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjVCQ1wiLCBcIlxcXFxibGFja3RyaWFuZ2xlZG93blwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjVBMFwiLCBcIlxcXFxibGFja3NxdWFyZVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjlFQlwiLCBcIlxcXFxibGFja2xvemVuZ2VcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI2MDVcIiwgXCJcXFxcYmlnc3RhclwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjIyMlwiLCBcIlxcXFxzcGhlcmljYWxhbmdsZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjIwMVwiLCBcIlxcXFxjb21wbGVtZW50XCIsIHRydWUpOyAvLyB1bmljb2RlLW1hdGggbWFwcyBVK0YwIHRvIFxcbWF0aGV0aC4gV2UgbWFwIHRvIEFNUyBmdW5jdGlvbiBcXGV0aFxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxceEYwXCIsIFwiXFxcXGV0aFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx4RjBcIiwgXCJcXHhGMFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjU3MVwiLCBcIlxcXFxkaWFndXBcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI1NzJcIiwgXCJcXFxcZGlhZ2Rvd25cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI1QTFcIiwgXCJcXFxcc3F1YXJlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyNUExXCIsIFwiXFxcXEJveFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjVDQVwiLCBcIlxcXFxEaWFtb25kXCIpOyAvLyB1bmljb2RlLW1hdGggbWFwcyBVK0E1IHRvIFxcbWF0aHllbi4gV2UgbWFwIHRvIEFNUyBmdW5jdGlvbiBcXHllblxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxceEE1XCIsIFwiXFxcXHllblwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJcXHhBNVwiLCBcIlxcXFx5ZW5cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI3MTNcIiwgXCJcXFxcY2hlY2ttYXJrXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI3MTNcIiwgXCJcXFxcY2hlY2ttYXJrXCIpOyAvLyBBTVMgSGVicmV3XG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjEzNlwiLCBcIlxcXFxiZXRoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyMTM4XCIsIFwiXFxcXGRhbGV0aFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MjEzN1wiLCBcIlxcXFxnaW1lbFwiLCB0cnVlKTsgLy8gQU1TIEdyZWVrXG5cbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiXFx1MDNERFwiLCBcIlxcXFxkaWdhbW1hXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUwM0YwXCIsIFwiXFxcXHZhcmthcHBhXCIpOyAvLyBBTVMgRGVsaW1pdGVyc1xuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBzeW1ib2xzX29wZW4sIFwiXFx1MjUwQ1wiLCBcIlxcXFxAdWxjb3JuZXJcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBzeW1ib2xzX2Nsb3NlLCBcIlxcdTI1MTBcIiwgXCJcXFxcQHVyY29ybmVyXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgc3ltYm9sc19vcGVuLCBcIlxcdTI1MTRcIiwgXCJcXFxcQGxsY29ybmVyXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgc3ltYm9sc19jbG9zZSwgXCJcXHUyNTE4XCIsIFwiXFxcXEBscmNvcm5lclwiLCB0cnVlKTsgLy8gQU1TIEJpbmFyeSBSZWxhdGlvbnNcblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNjZcIiwgXCJcXFxcbGVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyQTdEXCIsIFwiXFxcXGxlcXNsYW50XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBOTVcIiwgXCJcXFxcZXFzbGFudGxlc3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI3MlwiLCBcIlxcXFxsZXNzc2ltXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBODVcIiwgXCJcXFxcbGVzc2FwcHJveFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjRBXCIsIFwiXFxcXGFwcHJveGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyRDZcIiwgXCJcXFxcbGVzc2RvdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQ4XCIsIFwiXFxcXGxsbFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjc2XCIsIFwiXFxcXGxlc3NndHJcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJEQVwiLCBcIlxcXFxsZXNzZXFndHJcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4QlwiLCBcIlxcXFxsZXNzZXFxZ3RyXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNTFcIiwgXCJcXFxcZG90ZXFkb3RcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI1M1wiLCBcIlxcXFxyaXNpbmdkb3RzZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI1MlwiLCBcIlxcXFxmYWxsaW5nZG90c2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyM0RcIiwgXCJcXFxcYmFja3NpbVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkNEXCIsIFwiXFxcXGJhY2tzaW1lcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyQUM1XCIsIFwiXFxcXHN1YnNldGVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQwXCIsIFwiXFxcXFN1YnNldFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjhGXCIsIFwiXFxcXHNxc3Vic2V0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyN0NcIiwgXCJcXFxccHJlY2N1cmx5ZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJERVwiLCBcIlxcXFxjdXJseWVxcHJlY1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjdFXCIsIFwiXFxcXHByZWNzaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkFCN1wiLCBcIlxcXFxwcmVjYXBwcm94XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQjJcIiwgXCJcXFxcdmFydHJpYW5nbGVsZWZ0XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQjRcIiwgXCJcXFxcdHJpYW5nbGVsZWZ0ZXFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJBOFwiLCBcIlxcXFx2RGFzaFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkFBXCIsIFwiXFxcXFZ2ZGFzaFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMzIzXCIsIFwiXFxcXHNtYWxsc21pbGVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjMyMlwiLCBcIlxcXFxzbWFsbGZyb3duXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNEZcIiwgXCJcXFxcYnVtcGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNEVcIiwgXCJcXFxcQnVtcGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNjdcIiwgXCJcXFxcZ2VxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyQTdFXCIsIFwiXFxcXGdlcXNsYW50XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTJBOTZcIiwgXCJcXFxcZXFzbGFudGd0clwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjczXCIsIFwiXFxcXGd0cnNpbVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyQTg2XCIsIFwiXFxcXGd0cmFwcHJveFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkQ3XCIsIFwiXFxcXGd0cmRvdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQ5XCIsIFwiXFxcXGdnZ1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjc3XCIsIFwiXFxcXGd0cmxlc3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJEQlwiLCBcIlxcXFxndHJlcWxlc3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkE4Q1wiLCBcIlxcXFxndHJlcXFsZXNzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNTZcIiwgXCJcXFxcZXFjaXJjXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNTdcIiwgXCJcXFxcY2lyY2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNUNcIiwgXCJcXFxcdHJpYW5nbGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyM0NcIiwgXCJcXFxcdGhpY2tzaW1cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI0OFwiLCBcIlxcXFx0aGlja2FwcHJveFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyQUM2XCIsIFwiXFxcXHN1cHNldGVxcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQxXCIsIFwiXFxcXFN1cHNldFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjkwXCIsIFwiXFxcXHNxc3Vwc2V0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyN0RcIiwgXCJcXFxcc3VjY2N1cmx5ZXFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjJERlwiLCBcIlxcXFxjdXJseWVxc3VjY1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjdGXCIsIFwiXFxcXHN1Y2NzaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MkFCOFwiLCBcIlxcXFxzdWNjYXBwcm94XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQjNcIiwgXCJcXFxcdmFydHJpYW5nbGVyaWdodFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkI1XCIsIFwiXFxcXHRyaWFuZ2xlcmlnaHRlcVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkE5XCIsIFwiXFxcXFZkYXNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMjNcIiwgXCJcXFxcc2hvcnRtaWRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjIyNVwiLCBcIlxcXFxzaG9ydHBhcmFsbGVsXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNkNcIiwgXCJcXFxcYmV0d2VlblwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQ0XCIsIFwiXFxcXHBpdGNoZm9ya1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjFEXCIsIFwiXFxcXHZhcnByb3B0b1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyNUMwXCIsIFwiXFxcXGJsYWNrdHJpYW5nbGVsZWZ0XCIpOyAvLyB1bmljb2RlLW1hdGggc2F5cyB0aGF0IFxcdGhlcmVmb3JlIGlzIGEgbWF0aG9yZCBhdG9tLlxuLy8gV2Uga2VwdCB0aGUgYW1zc3ltYiBhdG9tIHR5cGUsIHdoaWNoIGlzIHJlbC5cblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMzRcIiwgXCJcXFxcdGhlcmVmb3JlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMERcIiwgXCJcXFxcYmFja2Vwc2lsb25cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjVCNlwiLCBcIlxcXFxibGFja3RyaWFuZ2xlcmlnaHRcIik7IC8vIHVuaWNvZGUtbWF0aCBzYXlzIHRoYXQgXFxiZWNhdXNlIGlzIGEgbWF0aG9yZCBhdG9tLlxuLy8gV2Uga2VwdCB0aGUgYW1zc3ltYiBhdG9tIHR5cGUsIHdoaWNoIGlzIHJlbC5cblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyMzVcIiwgXCJcXFxcYmVjYXVzZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQ4XCIsIFwiXFxcXGxsbGVzc1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMkQ5XCIsIFwiXFxcXGdnZ3RyXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQjJcIiwgXCJcXFxcbGhkXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQjNcIiwgXCJcXFxccmhkXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNDJcIiwgXCJcXFxcZXFzaW1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyQzhcIiwgXCJcXFxcSm9pblwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMjUxXCIsIFwiXFxcXERvdGVxXCIsIHRydWUpOyAvLyBBTVMgQmluYXJ5IE9wZXJhdG9yc1xuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjIxNFwiLCBcIlxcXFxkb3RwbHVzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyMTZcIiwgXCJcXFxcc21hbGxzZXRtaW51c1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkQyXCIsIFwiXFxcXENhcFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkQzXCIsIFwiXFxcXEN1cFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyQTVFXCIsIFwiXFxcXGRvdWJsZWJhcndlZGdlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyOUZcIiwgXCJcXFxcYm94bWludXNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjI5RVwiLCBcIlxcXFxib3hwbHVzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQzdcIiwgXCJcXFxcZGl2aWRlb250aW1lc1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkM5XCIsIFwiXFxcXGx0aW1lc1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkNBXCIsIFwiXFxcXHJ0aW1lc1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkNCXCIsIFwiXFxcXGxlZnR0aHJlZXRpbWVzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQ0NcIiwgXCJcXFxccmlnaHR0aHJlZXRpbWVzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQ0ZcIiwgXCJcXFxcY3VybHl3ZWRnZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIGJpbiwgXCJcXHUyMkNFXCIsIFwiXFxcXGN1cmx5dmVlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyOURcIiwgXCJcXFxcY2lyY2xlZGRhc2hcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjI5QlwiLCBcIlxcXFxjaXJjbGVkYXN0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQzVcIiwgXCJcXFxcY2VudGVyZG90XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQkFcIiwgXCJcXFxcaW50ZXJjYWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJEMlwiLCBcIlxcXFxkb3VibGVjYXBcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJEM1wiLCBcIlxcXFxkb3VibGVjdXBcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJBMFwiLCBcIlxcXFxib3h0aW1lc1wiLCB0cnVlKTsgLy8gQU1TIEFycm93c1xuLy8gTm90ZTogdW5pY29kZS1tYXRoIG1hcHMgXFx1MjFlMiB0byB0aGVpciBvd24gZnVuY3Rpb24gXFxyaWdodGRhc2hhcnJvdy5cbi8vIFdlJ2xsIG1hcCBpdCB0byBBTVMgZnVuY3Rpb24gXFxkYXNocmlnaHRhcnJvdy4gSXQgcHJvZHVjZXMgdGhlIHNhbWUgYXRvbS5cblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxRTJcIiwgXCJcXFxcZGFzaHJpZ2h0YXJyb3dcIiwgdHJ1ZSk7IC8vIHVuaWNvZGUtbWF0aCBtYXBzIFxcdTIxZTAgdG8gXFxsZWZ0ZGFzaGFycm93LiBXZSdsbCB1c2UgdGhlIEFNUyBzeW5vbnltLlxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFFMFwiLCBcIlxcXFxkYXNobGVmdGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQzdcIiwgXCJcXFxcbGVmdGxlZnRhcnJvd3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFDNlwiLCBcIlxcXFxsZWZ0cmlnaHRhcnJvd3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFEQVwiLCBcIlxcXFxMbGVmdGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxOUVcIiwgXCJcXFxcdHdvaGVhZGxlZnRhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUEyXCIsIFwiXFxcXGxlZnRhcnJvd3RhaWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFBQlwiLCBcIlxcXFxsb29wYXJyb3dsZWZ0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQ0JcIiwgXCJcXFxcbGVmdHJpZ2h0aGFycG9vbnNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFCNlwiLCBcIlxcXFxjdXJ2ZWFycm93bGVmdFwiLCB0cnVlKTsgLy8gdW5pY29kZS1tYXRoIG1hcHMgXFx1MjFiYSB0byBcXGFjd29wZW5jaXJjbGVhcnJvdy4gV2UnbGwgdXNlIHRoZSBBTVMgc3lub255bS5cblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQkFcIiwgXCJcXFxcY2lyY2xlYXJyb3dsZWZ0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQjBcIiwgXCJcXFxcTHNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQzhcIiwgXCJcXFxcdXB1cGFycm93c1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUJGXCIsIFwiXFxcXHVwaGFycG9vbmxlZnRcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFDM1wiLCBcIlxcXFxkb3duaGFycG9vbmxlZnRcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyQjZcIiwgXCJcXFxcb3JpZ29mXCIsIHRydWUpOyAvLyBub3QgaW4gZm9udFxuXG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyQjdcIiwgXCJcXFxcaW1hZ2VvZlwiLCB0cnVlKTsgLy8gbm90IGluIGZvbnRcblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyQjhcIiwgXCJcXFxcbXVsdGltYXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFBRFwiLCBcIlxcXFxsZWZ0cmlnaHRzcXVpZ2Fycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQzlcIiwgXCJcXFxccmlnaHRyaWdodGFycm93c1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUM0XCIsIFwiXFxcXHJpZ2h0bGVmdGFycm93c1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUEwXCIsIFwiXFxcXHR3b2hlYWRyaWdodGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQTNcIiwgXCJcXFxccmlnaHRhcnJvd3RhaWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFBQ1wiLCBcIlxcXFxsb29wYXJyb3dyaWdodFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUI3XCIsIFwiXFxcXGN1cnZlYXJyb3dyaWdodFwiLCB0cnVlKTsgLy8gdW5pY29kZS1tYXRoIG1hcHMgXFx1MjFiYiB0byBcXGN3b3BlbmNpcmNsZWFycm93LiBXZSdsbCB1c2UgdGhlIEFNUyBzeW5vbnltLlxuXG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFCQlwiLCBcIlxcXFxjaXJjbGVhcnJvd3JpZ2h0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQjFcIiwgXCJcXFxcUnNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxQ0FcIiwgXCJcXFxcZG93bmRvd25hcnJvd3NcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFCRVwiLCBcIlxcXFx1cGhhcnBvb25yaWdodFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHJlbCwgXCJcXHUyMUMyXCIsIFwiXFxcXGRvd25oYXJwb29ucmlnaHRcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFERFwiLCBcIlxcXFxyaWdodHNxdWlnYXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFERFwiLCBcIlxcXFxsZWFkc3RvXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIxREJcIiwgXCJcXFxcUnJpZ2h0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjFCRVwiLCBcIlxcXFxyZXN0cmljdGlvblwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMThcIiwgXCJgXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiJFwiLCBcIlxcXFwkXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCIkXCIsIFwiXFxcXCRcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIiRcIiwgXCJcXFxcdGV4dGRvbGxhclwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIiVcIiwgXCJcXFxcJVwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiJVwiLCBcIlxcXFwlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiX1wiLCBcIlxcXFxfXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJfXCIsIFwiXFxcXF9cIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIl9cIiwgXCJcXFxcdGV4dHVuZGVyc2NvcmVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMjIwXCIsIFwiXFxcXGFuZ2xlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIxRVwiLCBcIlxcXFxpbmZ0eVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMzJcIiwgXCJcXFxccHJpbWVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyNUIzXCIsIFwiXFxcXHRyaWFuZ2xlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MDM5M1wiLCBcIlxcXFxHYW1tYVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTAzOTRcIiwgXCJcXFxcRGVsdGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwMzk4XCIsIFwiXFxcXFRoZXRhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MDM5QlwiLCBcIlxcXFxMYW1iZGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwMzlFXCIsIFwiXFxcXFhpXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MDNBMFwiLCBcIlxcXFxQaVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTAzQTNcIiwgXCJcXFxcU2lnbWFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwM0E1XCIsIFwiXFxcXFVwc2lsb25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwM0E2XCIsIFwiXFxcXFBoaVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTAzQThcIiwgXCJcXFxcUHNpXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MDNBOVwiLCBcIlxcXFxPbWVnYVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIkFcIiwgXCJcXHUwMzkxXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiQlwiLCBcIlxcdTAzOTJcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJFXCIsIFwiXFx1MDM5NVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlpcIiwgXCJcXHUwMzk2XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiSFwiLCBcIlxcdTAzOTdcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJJXCIsIFwiXFx1MDM5OVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIktcIiwgXCJcXHUwMzlBXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiTVwiLCBcIlxcdTAzOUNcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJOXCIsIFwiXFx1MDM5RFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIk9cIiwgXCJcXHUwMzlGXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiUFwiLCBcIlxcdTAzQTFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJUXCIsIFwiXFx1MDNBNFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlhcIiwgXCJcXHUwM0E3XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx4QUNcIiwgXCJcXFxcbmVnXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx4QUNcIiwgXCJcXFxcbG5vdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIyQTRcIiwgXCJcXFxcdG9wXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjJBNVwiLCBcIlxcXFxib3RcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMjA1XCIsIFwiXFxcXGVtcHR5c2V0XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJcXHUyMjA1XCIsIFwiXFxcXHZhcm5vdGhpbmdcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0IxXCIsIFwiXFxcXGFscGhhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNCMlwiLCBcIlxcXFxiZXRhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNCM1wiLCBcIlxcXFxnYW1tYVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzQjRcIiwgXCJcXFxcZGVsdGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0Y1XCIsIFwiXFxcXGVwc2lsb25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0I2XCIsIFwiXFxcXHpldGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0I3XCIsIFwiXFxcXGV0YVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzQjhcIiwgXCJcXFxcdGhldGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0I5XCIsIFwiXFxcXGlvdGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0JBXCIsIFwiXFxcXGthcHBhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNCQlwiLCBcIlxcXFxsYW1iZGFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0JDXCIsIFwiXFxcXG11XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNCRFwiLCBcIlxcXFxudVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzQkVcIiwgXCJcXFxceGlcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0JGXCIsIFwiXFxcXG9taWNyb25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0MwXCIsIFwiXFxcXHBpXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNDMVwiLCBcIlxcXFxyaG9cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0MzXCIsIFwiXFxcXHNpZ21hXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNDNFwiLCBcIlxcXFx0YXVcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0M1XCIsIFwiXFxcXHVwc2lsb25cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0Q1XCIsIFwiXFxcXHBoaVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzQzdcIiwgXCJcXFxcY2hpXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNDOFwiLCBcIlxcXFxwc2lcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0M5XCIsIFwiXFxcXG9tZWdhXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNCNVwiLCBcIlxcXFx2YXJlcHNpbG9uXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIFwiXFx1MDNEMVwiLCBcIlxcXFx2YXJ0aGV0YVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzRDZcIiwgXCJcXFxcdmFycGlcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0YxXCIsIFwiXFxcXHZhcnJob1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdTAzQzJcIiwgXCJcXFxcdmFyc2lnbWFcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHUwM0M2XCIsIFwiXFxcXHZhcnBoaVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjIxN1wiLCBcIipcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIitcIiwgXCIrXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMjEyXCIsIFwiLVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjJDNVwiLCBcIlxcXFxjZG90XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMjE4XCIsIFwiXFxcXGNpcmNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxceEY3XCIsIFwiXFxcXGRpdlwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx4QjFcIiwgXCJcXFxccG1cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxceEQ3XCIsIFwiXFxcXHRpbWVzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMjI5XCIsIFwiXFxcXGNhcFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjIyQVwiLCBcIlxcXFxjdXBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMTZcIiwgXCJcXFxcc2V0bWludXNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMjdcIiwgXCJcXFxcbGFuZFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjIyOFwiLCBcIlxcXFxsb3JcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMjdcIiwgXCJcXFxcd2VkZ2VcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyMjhcIiwgXCJcXFxcdmVlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIxQVwiLCBcIlxcXFxzdXJkXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfb3BlbiwgXCJcXHUyN0U4XCIsIFwiXFxcXGxhbmdsZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwiXFx1MjIyM1wiLCBcIlxcXFxsdmVydFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwiXFx1MjIyNVwiLCBcIlxcXFxsVmVydFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIj9cIiwgXCI/XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfY2xvc2UsIFwiIVwiLCBcIiFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19jbG9zZSwgXCJcXHUyN0U5XCIsIFwiXFxcXHJhbmdsZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIlxcdTIyMjNcIiwgXCJcXFxccnZlcnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19jbG9zZSwgXCJcXHUyMjI1XCIsIFwiXFxcXHJWZXJ0XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCI9XCIsIFwiPVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiOlwiLCBcIjpcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNDhcIiwgXCJcXFxcYXBwcm94XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjQ1XCIsIFwiXFxcXGNvbmdcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNjVcIiwgXCJcXFxcZ2VcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNjVcIiwgXCJcXFxcZ2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMTkwXCIsIFwiXFxcXGdldHNcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIj5cIiwgXCJcXFxcZ3RcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyMDhcIiwgXCJcXFxcaW5cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdUUwMjBcIiwgXCJcXFxcQG5vdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjI4MlwiLCBcIlxcXFxzdWJzZXRcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyODNcIiwgXCJcXFxcc3Vwc2V0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjg2XCIsIFwiXFxcXHN1YnNldGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMjg3XCIsIFwiXFxcXHN1cHNldGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyODhcIiwgXCJcXFxcbnN1YnNldGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyODlcIiwgXCJcXFxcbnN1cHNldGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMkE4XCIsIFwiXFxcXG1vZGVsc1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjE5MFwiLCBcIlxcXFxsZWZ0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNjRcIiwgXCJcXFxcbGVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIyNjRcIiwgXCJcXFxcbGVxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCI8XCIsIFwiXFxcXGx0XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMTkyXCIsIFwiXFxcXHJpZ2h0YXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxOTJcIiwgXCJcXFxcdG9cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCByZWwsIFwiXFx1MjI3MVwiLCBcIlxcXFxuZ2VxXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgcmVsLCBcIlxcdTIyNzBcIiwgXCJcXFxcbmxlcVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzcGFjaW5nLCBcIlxceEEwXCIsIFwiXFxcXCBcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3BhY2luZywgXCJcXHhBMFwiLCBcIlxcXFxzcGFjZVwiKTsgLy8gUmVmOiBMYVRlWCBTb3VyY2UgMmU6IFxcRGVjbGFyZVJvYnVzdENvbW1hbmR7XFxub2JyZWFrc3BhY2V9eyVcblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHNwYWNpbmcsIFwiXFx4QTBcIiwgXCJcXFxcbm9icmVha3NwYWNlXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgc3BhY2luZywgXCJcXHhBMFwiLCBcIlxcXFwgXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgc3BhY2luZywgXCJcXHhBMFwiLCBcIiBcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBzcGFjaW5nLCBcIlxceEEwXCIsIFwiXFxcXHNwYWNlXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgc3BhY2luZywgXCJcXHhBMFwiLCBcIlxcXFxub2JyZWFrc3BhY2VcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3BhY2luZywgbnVsbCwgXCJcXFxcbm9icmVha1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzcGFjaW5nLCBudWxsLCBcIlxcXFxhbGxvd2JyZWFrXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHB1bmN0LCBcIixcIiwgXCIsXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHB1bmN0LCBcIjtcIiwgXCI7XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyQkNcIiwgXCJcXFxcYmFyd2VkZ2VcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJCQlwiLCBcIlxcXFx2ZWViYXJcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyOTlcIiwgXCJcXFxcb2RvdFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjI5NVwiLCBcIlxcXFxvcGx1c1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjI5N1wiLCBcIlxcXFxvdGltZXNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMjAyXCIsIFwiXFxcXHBhcnRpYWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyOThcIiwgXCJcXFxcb3NsYXNoXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgYmluLCBcIlxcdTIyOUFcIiwgXCJcXFxcY2lyY2xlZGNpcmNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCBiaW4sIFwiXFx1MjJBMVwiLCBcIlxcXFxib3hkb3RcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTI1QjNcIiwgXCJcXFxcYmlndHJpYW5nbGV1cFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjVCRFwiLCBcIlxcXFxiaWd0cmlhbmdsZWRvd25cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIwMjBcIiwgXCJcXFxcZGFnZ2VyXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGJpbiwgXCJcXHUyMkM0XCIsIFwiXFxcXGRpYW1vbmRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTIyQzZcIiwgXCJcXFxcc3RhclwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBiaW4sIFwiXFx1MjVDM1wiLCBcIlxcXFx0cmlhbmdsZWxlZnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYmluLCBcIlxcdTI1QjlcIiwgXCJcXFxcdHJpYW5nbGVyaWdodFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwie1wiLCBcIlxcXFx7XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJ7XCIsIFwiXFxcXHtcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIntcIiwgXCJcXFxcdGV4dGJyYWNlbGVmdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIn1cIiwgXCJcXFxcfVwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwifVwiLCBcIlxcXFx9XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJ9XCIsIFwiXFxcXHRleHRicmFjZXJpZ2h0XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfb3BlbiwgXCJ7XCIsIFwiXFxcXGxicmFjZVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIn1cIiwgXCJcXFxccmJyYWNlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfb3BlbiwgXCJbXCIsIFwiXFxcXGxicmFja1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiW1wiLCBcIlxcXFxsYnJhY2tcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19jbG9zZSwgXCJdXCIsIFwiXFxcXHJicmFja1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXVwiLCBcIlxcXFxyYnJhY2tcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19vcGVuLCBcIihcIiwgXCJcXFxcbHBhcmVuXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHN5bWJvbHNfY2xvc2UsIFwiKVwiLCBcIlxcXFxycGFyZW5cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIjxcIiwgXCJcXFxcdGV4dGxlc3NcIiwgdHJ1ZSk7IC8vIGluIFQxIGZvbnRlbmNcblxuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCI+XCIsIFwiXFxcXHRleHRncmVhdGVyXCIsIHRydWUpOyAvLyBpbiBUMSBmb250ZW5jXG5cbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwiXFx1MjMwQVwiLCBcIlxcXFxsZmxvb3JcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgc3ltYm9sc19jbG9zZSwgXCJcXHUyMzBCXCIsIFwiXFxcXHJmbG9vclwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX29wZW4sIFwiXFx1MjMwOFwiLCBcIlxcXFxsY2VpbFwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBzeW1ib2xzX2Nsb3NlLCBcIlxcdTIzMDlcIiwgXCJcXFxccmNlaWxcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXFxcXCIsIFwiXFxcXGJhY2tzbGFzaFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIyMjNcIiwgXCJ8XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIyM1wiLCBcIlxcXFx2ZXJ0XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJ8XCIsIFwiXFxcXHRleHRiYXJcIiwgdHJ1ZSk7IC8vIGluIFQxIGZvbnRlbmNcblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIyNVwiLCBcIlxcXFx8XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MjIyNVwiLCBcIlxcXFxWZXJ0XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMjI1XCIsIFwiXFxcXHRleHRiYXJkYmxcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIn5cIiwgXCJcXFxcdGV4dGFzY2lpdGlsZGVcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcXFxcIiwgXCJcXFxcdGV4dGJhY2tzbGFzaFwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXlwiLCBcIlxcXFx0ZXh0YXNjaWljaXJjdW1cIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxOTFcIiwgXCJcXFxcdXBhcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjFEMVwiLCBcIlxcXFxVcGFycm93XCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHJlbCwgXCJcXHUyMTkzXCIsIFwiXFxcXGRvd25hcnJvd1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCByZWwsIFwiXFx1MjFEM1wiLCBcIlxcXFxEb3duYXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxOTVcIiwgXCJcXFxcdXBkb3duYXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgcmVsLCBcIlxcdTIxRDVcIiwgXCJcXFxcVXBkb3duYXJyb3dcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjIxMFwiLCBcIlxcXFxjb3Byb2RcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjJDMVwiLCBcIlxcXFxiaWd2ZWVcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjJDMFwiLCBcIlxcXFxiaWd3ZWRnZVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBvcCwgXCJcXHUyQTA0XCIsIFwiXFxcXGJpZ3VwbHVzXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyQzJcIiwgXCJcXFxcYmlnY2FwXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyQzNcIiwgXCJcXFxcYmlnY3VwXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMkJcIiwgXCJcXFxcaW50XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMkJcIiwgXCJcXFxcaW50b3BcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjIyQ1wiLCBcIlxcXFxpaW50XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMkRcIiwgXCJcXFxcaWlpbnRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjIwRlwiLCBcIlxcXFxwcm9kXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMTFcIiwgXCJcXFxcc3VtXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTJBMDJcIiwgXCJcXFxcYmlnb3RpbWVzXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTJBMDFcIiwgXCJcXFxcYmlnb3BsdXNcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MkEwMFwiLCBcIlxcXFxiaWdvZG90XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMkVcIiwgXCJcXFxcb2ludFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBvcCwgXCJcXHUyMjJGXCIsIFwiXFxcXG9paW50XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTIyMzBcIiwgXCJcXFxcb2lpaW50XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG9wLCBcIlxcdTJBMDZcIiwgXCJcXFxcYmlnc3FjdXBcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgb3AsIFwiXFx1MjIyQlwiLCBcIlxcXFxzbWFsbGludFwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIGlubmVyLCBcIlxcdTIwMjZcIiwgXCJcXFxcdGV4dGVsbGlwc2lzXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGlubmVyLCBcIlxcdTIwMjZcIiwgXCJcXFxcbWF0aGVsbGlwc2lzXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgaW5uZXIsIFwiXFx1MjAyNlwiLCBcIlxcXFxsZG90c1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBpbm5lciwgXCJcXHUyMDI2XCIsIFwiXFxcXGxkb3RzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGlubmVyLCBcIlxcdTIyRUZcIiwgXCJcXFxcQGNkb3RzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGlubmVyLCBcIlxcdTIyRjFcIiwgXCJcXFxcZGRvdHNcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMkVFXCIsIFwiXFxcXHZhcnZkb3RzXCIpOyAvLyBcXHZkb3RzIGlzIGEgbWFjcm9cblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJcXHUwMkNBXCIsIFwiXFxcXGFjdXRlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJcXHUwMkNCXCIsIFwiXFxcXGdyYXZlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJcXHhBOFwiLCBcIlxcXFxkZG90XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJ+XCIsIFwiXFxcXHRpbGRlXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJcXHUwMkM5XCIsIFwiXFxcXGJhclwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBhY2NlbnQsIFwiXFx1MDJEOFwiLCBcIlxcXFxicmV2ZVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBhY2NlbnQsIFwiXFx1MDJDN1wiLCBcIlxcXFxjaGVja1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBhY2NlbnQsIFwiXlwiLCBcIlxcXFxoYXRcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgYWNjZW50LCBcIlxcdTIwRDdcIiwgXCJcXFxcdmVjXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIGFjY2VudCwgXCJcXHUwMkQ5XCIsIFwiXFxcXGRvdFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBhY2NlbnQsIFwiXFx1MDJEQVwiLCBcIlxcXFxtYXRocmluZ1wiKTsgLy8gXFxpbWF0aCBhbmQgXFxqbWF0aCBzaG91bGQgYmUgaW52YXJpYW50IHRvIFxcbWF0aHJtLCBcXG1hdGhiZiwgZXRjLiwgc28gdXNlIFBVQVxuXG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJcXHVFMTMxXCIsIFwiXFxcXEBpbWF0aFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcIlxcdUUyMzdcIiwgXCJcXFxcQGptYXRoXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx1MDEzMVwiLCBcIlxcdTAxMzFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwMjM3XCIsIFwiXFx1MDIzN1wiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx1MDEzMVwiLCBcIlxcXFxpXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUwMjM3XCIsIFwiXFxcXGpcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxceERGXCIsIFwiXFxcXHNzXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHhFNlwiLCBcIlxcXFxhZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx1MDE1M1wiLCBcIlxcXFxvZVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx4RjhcIiwgXCJcXFxcb1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx4QzZcIiwgXCJcXFxcQUVcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTAxNTJcIiwgXCJcXFxcT0VcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxceEQ4XCIsIFwiXFxcXE9cIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJDQVwiLCBcIlxcXFwnXCIpOyAvLyBhY3V0ZVxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJDQlwiLCBcIlxcXFxgXCIpOyAvLyBncmF2ZVxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJDNlwiLCBcIlxcXFxeXCIpOyAvLyBjaXJjdW1mbGV4XG5cbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIGFjY2VudCwgXCJcXHUwMkRDXCIsIFwiXFxcXH5cIik7IC8vIHRpbGRlXG5cbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIGFjY2VudCwgXCJcXHUwMkM5XCIsIFwiXFxcXD1cIik7IC8vIG1hY3JvblxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJEOFwiLCBcIlxcXFx1XCIpOyAvLyBicmV2ZVxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJEOVwiLCBcIlxcXFwuXCIpOyAvLyBkb3QgYWJvdmVcblxuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgYWNjZW50LCBcIlxceEI4XCIsIFwiXFxcXGNcIik7IC8vIGNlZGlsbGFcblxuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgYWNjZW50LCBcIlxcdTAyREFcIiwgXCJcXFxcclwiKTsgLy8gcmluZyBhYm92ZVxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJDN1wiLCBcIlxcXFx2XCIpOyAvLyBjYXJvblxuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx4QThcIiwgJ1xcXFxcIicpOyAvLyBkaWFyZXNpc1xuXG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCBhY2NlbnQsIFwiXFx1MDJERFwiLCBcIlxcXFxIXCIpOyAvLyBkb3VibGUgYWN1dGVcblxuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgYWNjZW50LCBcIlxcdTI1RUZcIiwgXCJcXFxcdGV4dGNpcmNsZWRcIik7IC8vIFxcYmlnY2lyYyBnbHlwaFxuLy8gVGhlc2UgbGlnYXR1cmVzIGFyZSBkZXRlY3RlZCBhbmQgY3JlYXRlZCBpbiBQYXJzZXIuanMncyBgZm9ybUxpZ2F0dXJlc2AuXG5cbnZhciBsaWdhdHVyZXMgPSB7XG4gIFwiLS1cIjogdHJ1ZSxcbiAgXCItLS1cIjogdHJ1ZSxcbiAgXCJgYFwiOiB0cnVlLFxuICBcIicnXCI6IHRydWVcbn07XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMTNcIiwgXCItLVwiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx1MjAxM1wiLCBcIlxcXFx0ZXh0ZW5kYXNoXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDE0XCIsIFwiLS0tXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDE0XCIsIFwiXFxcXHRleHRlbWRhc2hcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMThcIiwgXCJgXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDE4XCIsIFwiXFxcXHRleHRxdW90ZWxlZnRcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMTlcIiwgXCInXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDE5XCIsIFwiXFxcXHRleHRxdW90ZXJpZ2h0XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDFDXCIsIFwiYGBcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBcIlxcdTIwMUNcIiwgXCJcXFxcdGV4dHF1b3RlZGJsbGVmdFwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx1MjAxRFwiLCBcIicnXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHUyMDFEXCIsIFwiXFxcXHRleHRxdW90ZWRibHJpZ2h0XCIpOyAvLyAgXFxkZWdyZWUgZnJvbSBnZW5zeW1iIHBhY2thZ2VcblxuZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIFwiXFx4QjBcIiwgXCJcXFxcZGVncmVlXCIsIHRydWUpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHhCMFwiLCBcIlxcXFxkZWdyZWVcIik7IC8vIFxcdGV4dGRlZ3JlZSBmcm9tIGlucHV0ZW5jIHBhY2thZ2VcblxuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHhCMFwiLCBcIlxcXFx0ZXh0ZGVncmVlXCIsIHRydWUpOyAvLyBUT0RPOiBJbiBMYVRlWCwgXFxwb3VuZHMgY2FuIGdlbmVyYXRlIGEgZGlmZmVyZW50IGNoYXJhY3RlciBpbiB0ZXh0IGFuZCBtYXRoXG4vLyBtb2RlLCBidXQgYW1vbmcgb3VyIGZvbnRzLCBvbmx5IE1haW4tUmVndWxhciBkZWZpbmVzIHRoaXMgY2hhcmFjdGVyIFwiMTYzXCIuXG5cbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxceEEzXCIsIFwiXFxcXHBvdW5kc1wiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCB0ZXh0b3JkLCBcIlxceEEzXCIsIFwiXFxcXG1hdGhzdGVybGluZ1wiLCB0cnVlKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwiXFx4QTNcIiwgXCJcXFxccG91bmRzXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgXCJcXHhBM1wiLCBcIlxcXFx0ZXh0c3RlcmxpbmdcIiwgdHJ1ZSk7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlxcdTI3MjBcIiwgXCJcXFxcbWFsdGVzZVwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJcXHUyNzIwXCIsIFwiXFxcXG1hbHRlc2VcIik7IC8vIFRoZXJlIGFyZSBsb3RzIG9mIHN5bWJvbHMgd2hpY2ggYXJlIHRoZSBzYW1lLCBzbyB3ZSBhZGQgdGhlbSBpbiBhZnRlcndhcmRzLlxuLy8gQWxsIG9mIHRoZXNlIGFyZSB0ZXh0b3JkcyBpbiBtYXRoIG1vZGVcblxudmFyIG1hdGhUZXh0U3ltYm9scyA9IFwiMDEyMzQ1Njc4OS9ALlxcXCJcIjtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRoVGV4dFN5bWJvbHMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIGNoID0gbWF0aFRleHRTeW1ib2xzLmNoYXJBdChpKTtcbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIHRleHRvcmQsIGNoLCBjaCk7XG59IC8vIEFsbCBvZiB0aGVzZSBhcmUgdGV4dG9yZHMgaW4gdGV4dCBtb2RlXG5cblxudmFyIHRleHRTeW1ib2xzID0gXCIwMTIzNDU2Nzg5IUAqKCktPStcXFwiOzo/Ly4sXCI7XG5cbmZvciAodmFyIF9pID0gMDsgX2kgPCB0ZXh0U3ltYm9scy5sZW5ndGg7IF9pKyspIHtcbiAgdmFyIF9jaCA9IHRleHRTeW1ib2xzLmNoYXJBdChfaSk7XG5cbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoLCBfY2gpO1xufSAvLyBBbGwgb2YgdGhlc2UgYXJlIHRleHRvcmRzIGluIHRleHQgbW9kZSwgYW5kIG1hdGhvcmRzIGluIG1hdGggbW9kZVxuXG5cbnZhciBsZXR0ZXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG5cbmZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGxldHRlcnMubGVuZ3RoOyBfaTIrKykge1xuICB2YXIgX2NoMiA9IGxldHRlcnMuY2hhckF0KF9pMik7XG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDIsIF9jaDIpO1xuICBkZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBfY2gyLCBfY2gyKTtcbn0gLy8gQmxhY2tib2FyZCBib2xkIGFuZCBzY3JpcHQgbGV0dGVycyBpbiBVbmljb2RlIHJhbmdlXG5cblxuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJDXCIsIFwiXFx1MjEwMlwiKTsgLy8gYmxhY2tib2FyZCBib2xkXG5cbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJDXCIsIFwiXFx1MjEwMlwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiSFwiLCBcIlxcdTIxMERcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBhbXMsIHRleHRvcmQsIFwiSFwiLCBcIlxcdTIxMERcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIk5cIiwgXCJcXHUyMTE1XCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgYW1zLCB0ZXh0b3JkLCBcIk5cIiwgXCJcXHUyMTE1XCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJQXCIsIFwiXFx1MjExOVwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJQXCIsIFwiXFx1MjExOVwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBhbXMsIHRleHRvcmQsIFwiUVwiLCBcIlxcdTIxMUFcIik7XG5kZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBhbXMsIHRleHRvcmQsIFwiUVwiLCBcIlxcdTIxMUFcIik7XG5kZWZpbmVTeW1ib2wobWF0aCwgYW1zLCB0ZXh0b3JkLCBcIlJcIiwgXCJcXHUyMTFEXCIpO1xuZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgYW1zLCB0ZXh0b3JkLCBcIlJcIiwgXCJcXHUyMTFEXCIpO1xuZGVmaW5lU3ltYm9sKG1hdGgsIGFtcywgdGV4dG9yZCwgXCJaXCIsIFwiXFx1MjEyNFwiKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIGFtcywgdGV4dG9yZCwgXCJaXCIsIFwiXFx1MjEyNFwiKTtcbmRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBcImhcIiwgXCJcXHUyMTBFXCIpOyAvLyBpdGFsaWMgaCwgUGxhbmNrIGNvbnN0YW50XG5cbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIG1hdGhvcmQsIFwiaFwiLCBcIlxcdTIxMEVcIik7IC8vIFRoZSBuZXh0IGxvb3AgbG9hZHMgd2lkZSAoc3Vycm9nYXRlIHBhaXIpIGNoYXJhY3RlcnMuXG4vLyBXZSBzdXBwb3J0IHNvbWUgbGV0dGVycyBpbiB0aGUgVW5pY29kZSByYW5nZSBVKzFENDAwIHRvIFUrMUQ3RkYsXG4vLyBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMuXG4vLyBTb21lIGVkaXRvcnMgZG8gbm90IGRlYWwgd2VsbCB3aXRoIHdpZGUgY2hhcmFjdGVycy4gU28gZG9uJ3Qgd3JpdGUgdGhlXG4vLyBzdHJpbmcgaW50byB0aGlzIGZpbGUuIEluc3RlYWQsIGNyZWF0ZSB0aGUgc3RyaW5nIGZyb20gdGhlIHN1cnJvZ2F0ZSBwYWlyLlxuXG52YXIgd2lkZUNoYXIgPSBcIlwiO1xuXG5mb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBsZXR0ZXJzLmxlbmd0aDsgX2kzKyspIHtcbiAgdmFyIF9jaDMgPSBsZXR0ZXJzLmNoYXJBdChfaTMpOyAvLyBUaGUgaGV4IG51bWJlcnMgaW4gdGhlIG5leHQgbGluZSBhcmUgYSBzdXJyb2dhdGUgcGFpci5cbiAgLy8gMHhEODM1IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBmb3IgYWxsIGxldHRlcnMgaW4gdGhlIHJhbmdlIHdlIHN1cHBvcnQuXG4gIC8vIDB4REMwMCBpcyB0aGUgbG93IHN1cnJvZ2F0ZSBmb3IgYm9sZCBBLlxuXG5cbiAgd2lkZUNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgzNSwgMHhEQzAwICsgX2kzKTsgLy8gQS1aIGEteiBib2xkXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERDMzQgKyBfaTMpOyAvLyBBLVogYS16IGl0YWxpY1xuXG4gIGRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBfY2gzLCB3aWRlQ2hhcik7XG4gIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgd2lkZUNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgzNSwgMHhEQzY4ICsgX2kzKTsgLy8gQS1aIGEteiBib2xkIGl0YWxpY1xuXG4gIGRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBfY2gzLCB3aWRlQ2hhcik7XG4gIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgd2lkZUNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgzNSwgMHhERDA0ICsgX2kzKTsgLy8gQS1aIGEteiBGcmFjdHVyXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweEREQTAgKyBfaTMpOyAvLyBBLVogYS16IHNhbnMtc2VyaWZcblxuICBkZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICBkZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBfY2gzLCB3aWRlQ2hhcik7XG4gIHdpZGVDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MzUsIDB4RERENCArIF9pMyk7IC8vIEEtWiBhLXogc2FucyBib2xkXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERFMDggKyBfaTMpOyAvLyBBLVogYS16IHNhbnMgaXRhbGljXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERFNzAgKyBfaTMpOyAvLyBBLVogYS16IG1vbm9zcGFjZVxuXG4gIGRlZmluZVN5bWJvbChtYXRoLCBtYWluLCBtYXRob3JkLCBfY2gzLCB3aWRlQ2hhcik7XG4gIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDMsIHdpZGVDaGFyKTtcblxuICBpZiAoX2kzIDwgMjYpIHtcbiAgICAvLyBLYVRlWCBmb250cyBoYXZlIG9ubHkgY2FwaXRhbCBsZXR0ZXJzIGZvciBibGFja2JvYXJkIGJvbGQgYW5kIHNjcmlwdC5cbiAgICAvLyBTZWUgZXhjZXB0aW9uIGZvciBrIGJlbG93LlxuICAgIHdpZGVDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MzUsIDB4REQzOCArIF9pMyk7IC8vIEEtWiBkb3VibGUgc3RydWNrXG5cbiAgICBkZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICAgIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERDOUMgKyBfaTMpOyAvLyBBLVogc2NyaXB0XG5cbiAgICBkZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgX2NoMywgd2lkZUNoYXIpO1xuICAgIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDMsIHdpZGVDaGFyKTtcbiAgfSAvLyBUT0RPOiBBZGQgYm9sZCBzY3JpcHQgd2hlbiBpdCBpcyBzdXBwb3J0ZWQgYnkgYSBLYVRlWCBmb250LlxuXG59IC8vIFwia1wiIGlzIHRoZSBvbmx5IGRvdWJsZSBzdHJ1Y2sgbG93ZXIgY2FzZSBsZXR0ZXIgaW4gdGhlIEthVGVYIGZvbnRzLlxuXG5cbndpZGVDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MzUsIDB4REQ1Qyk7IC8vIGsgZG91YmxlIHN0cnVja1xuXG5kZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgXCJrXCIsIHdpZGVDaGFyKTtcbmRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIFwia1wiLCB3aWRlQ2hhcik7IC8vIE5leHQsIHNvbWUgd2lkZSBjaGFyYWN0ZXIgbnVtZXJhbHNcblxuZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgMTA7IF9pNCsrKSB7XG4gIHZhciBfY2g0ID0gX2k0LnRvU3RyaW5nKCk7XG5cbiAgd2lkZUNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgzNSwgMHhERkNFICsgX2k0KTsgLy8gMC05IGJvbGRcblxuICBkZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgX2NoNCwgd2lkZUNoYXIpO1xuICBkZWZpbmVTeW1ib2woc3ltYm9sc190ZXh0LCBtYWluLCB0ZXh0b3JkLCBfY2g0LCB3aWRlQ2hhcik7XG4gIHdpZGVDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MzUsIDB4REZFMiArIF9pNCk7IC8vIDAtOSBzYW5zIHNlcmlmXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDQsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoNCwgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERGRUMgKyBfaTQpOyAvLyAwLTkgYm9sZCBzYW5zXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDQsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoNCwgd2lkZUNoYXIpO1xuICB3aWRlQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODM1LCAweERGRjYgKyBfaTQpOyAvLyAwLTkgbW9ub3NwYWNlXG5cbiAgZGVmaW5lU3ltYm9sKG1hdGgsIG1haW4sIG1hdGhvcmQsIF9jaDQsIHdpZGVDaGFyKTtcbiAgZGVmaW5lU3ltYm9sKHN5bWJvbHNfdGV4dCwgbWFpbiwgdGV4dG9yZCwgX2NoNCwgd2lkZUNoYXIpO1xufSAvLyBXZSBhZGQgdGhlc2UgTGF0aW4tMSBsZXR0ZXJzIGFzIHN5bWJvbHMgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LFxuLy8gYnV0IHRoZXkgYXJlIG5vdCBhY3R1YWxseSBpbiB0aGUgZm9udCwgbm9yIGFyZSB0aGV5IHN1cHBvcnRlZCBieSB0aGVcbi8vIFVuaWNvZGUgYWNjZW50IG1lY2hhbmlzbSwgc28gdGhleSBmYWxsIGJhY2sgdG8gVGltZXMgZm9udCBhbmQgbG9vayB1Z2x5LlxuLy8gVE9ETyhlZGVtYWluZSk6IEZpeCB0aGlzLlxuXG5cbnZhciBleHRyYUxhdGluID0gXCJcXHhEMFxceERFXFx4RkVcIjtcblxuZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgZXh0cmFMYXRpbi5sZW5ndGg7IF9pNSsrKSB7XG4gIHZhciBfY2g1ID0gZXh0cmFMYXRpbi5jaGFyQXQoX2k1KTtcblxuICBkZWZpbmVTeW1ib2wobWF0aCwgbWFpbiwgbWF0aG9yZCwgX2NoNSwgX2NoNSk7XG4gIGRlZmluZVN5bWJvbChzeW1ib2xzX3RleHQsIG1haW4sIHRleHRvcmQsIF9jaDUsIF9jaDUpO1xufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3dpZGUtY2hhcmFjdGVyLmpzXG4vKipcbiAqIFRoaXMgZmlsZSBwcm92aWRlcyBzdXBwb3J0IGZvciBVbmljb2RlIHJhbmdlIFUrMUQ0MDAgdG8gVSsxRDdGRixcbiAqIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scy5cbiAqXG4gKiBGdW5jdGlvbiB3aWRlQ2hhcmFjdGVyRm9udCB0YWtlcyBhIHdpZGUgY2hhcmFjdGVyIGFzIGlucHV0IGFuZCByZXR1cm5zXG4gKiB0aGUgZm9udCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcmVuZGVyIGl0IHByb3Blcmx5LlxuICovXG5cbi8qKlxuICogRGF0YSBiZWxvdyBpcyBmcm9tIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9QREYvVTFENDAwLnBkZlxuICogVGhhdCBkb2N1bWVudCBzb3J0cyBjaGFyYWN0ZXJzIGludG8gZ3JvdXBzIGJ5IGZvbnQgdHlwZSwgc2F5IGJvbGQgb3IgaXRhbGljLlxuICpcbiAqIEluIHRoZSBhcnJheXMgYmVsb3csIGVhY2ggc3ViYXJyYXkgY29uc2lzdHMgdGhyZWUgZWxlbWVudHM6XG4gKiAgICAgICogVGhlIENTUyBjbGFzcyBvZiB0aGF0IGdyb3VwIHdoZW4gaW4gbWF0aCBtb2RlLlxuICogICAgICAqIFRoZSBDU1MgY2xhc3Mgb2YgdGhhdCBncm91cCB3aGVuIGluIHRleHQgbW9kZS5cbiAqICAgICAgKiBUaGUgZm9udCBuYW1lLCBzbyB0aGF0IEthVGVYIGNhbiBnZXQgZm9udCBtZXRyaWNzLlxuICovXG5cbnZhciB3aWRlTGF0aW5MZXR0ZXJEYXRhID0gW1tcIm1hdGhiZlwiLCBcInRleHRiZlwiLCBcIk1haW4tQm9sZFwiXSwgLy8gQS1aIGJvbGQgdXByaWdodFxuW1wibWF0aGJmXCIsIFwidGV4dGJmXCIsIFwiTWFpbi1Cb2xkXCJdLCAvLyBhLXogYm9sZCB1cHJpZ2h0XG5bXCJtYXRobm9ybWFsXCIsIFwidGV4dGl0XCIsIFwiTWF0aC1JdGFsaWNcIl0sIC8vIEEtWiBpdGFsaWNcbltcIm1hdGhub3JtYWxcIiwgXCJ0ZXh0aXRcIiwgXCJNYXRoLUl0YWxpY1wiXSwgLy8gYS16IGl0YWxpY1xuW1wiYm9sZHN5bWJvbFwiLCBcImJvbGRzeW1ib2xcIiwgXCJNYWluLUJvbGRJdGFsaWNcIl0sIC8vIEEtWiBib2xkIGl0YWxpY1xuW1wiYm9sZHN5bWJvbFwiLCBcImJvbGRzeW1ib2xcIiwgXCJNYWluLUJvbGRJdGFsaWNcIl0sIC8vIGEteiBib2xkIGl0YWxpY1xuLy8gTWFwIGZhbmN5IEEtWiBsZXR0ZXJzIHRvIHNjcmlwdCwgbm90IGNhbGxpZ3JhcGhpYy5cbi8vIFRoaXMgYWxpZ25zIHdpdGggdW5pY29kZS1tYXRoIGFuZCBtYXRoIGZvbnRzIChleGNlcHQgQ2FtYnJpYSBNYXRoKS5cbltcIm1hdGhzY3JcIiwgXCJ0ZXh0c2NyXCIsIFwiU2NyaXB0LVJlZ3VsYXJcIl0sIC8vIEEtWiBzY3JpcHRcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gYS16IHNjcmlwdC4gIE5vIGZvbnRcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gQS1aIGJvbGQgc2NyaXB0LiBObyBmb250XG5bXCJcIiwgXCJcIiwgXCJcIl0sIC8vIGEteiBib2xkIHNjcmlwdC4gTm8gZm9udFxuW1wibWF0aGZyYWtcIiwgXCJ0ZXh0ZnJha1wiLCBcIkZyYWt0dXItUmVndWxhclwiXSwgLy8gQS1aIEZyYWt0dXJcbltcIm1hdGhmcmFrXCIsIFwidGV4dGZyYWtcIiwgXCJGcmFrdHVyLVJlZ3VsYXJcIl0sIC8vIGEteiBGcmFrdHVyXG5bXCJtYXRoYmJcIiwgXCJ0ZXh0YmJcIiwgXCJBTVMtUmVndWxhclwiXSwgLy8gQS1aIGRvdWJsZS1zdHJ1Y2tcbltcIm1hdGhiYlwiLCBcInRleHRiYlwiLCBcIkFNUy1SZWd1bGFyXCJdLCAvLyBrIGRvdWJsZS1zdHJ1Y2tcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gQS1aIGJvbGQgRnJha3R1ciBObyBmb250IG1ldHJpY3NcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gYS16IGJvbGQgRnJha3R1ci4gICBObyBmb250LlxuW1wibWF0aHNmXCIsIFwidGV4dHNmXCIsIFwiU2Fuc1NlcmlmLVJlZ3VsYXJcIl0sIC8vIEEtWiBzYW5zLXNlcmlmXG5bXCJtYXRoc2ZcIiwgXCJ0ZXh0c2ZcIiwgXCJTYW5zU2VyaWYtUmVndWxhclwiXSwgLy8gYS16IHNhbnMtc2VyaWZcbltcIm1hdGhib2xkc2ZcIiwgXCJ0ZXh0Ym9sZHNmXCIsIFwiU2Fuc1NlcmlmLUJvbGRcIl0sIC8vIEEtWiBib2xkIHNhbnMtc2VyaWZcbltcIm1hdGhib2xkc2ZcIiwgXCJ0ZXh0Ym9sZHNmXCIsIFwiU2Fuc1NlcmlmLUJvbGRcIl0sIC8vIGEteiBib2xkIHNhbnMtc2VyaWZcbltcIm1hdGhpdHNmXCIsIFwidGV4dGl0c2ZcIiwgXCJTYW5zU2VyaWYtSXRhbGljXCJdLCAvLyBBLVogaXRhbGljIHNhbnMtc2VyaWZcbltcIm1hdGhpdHNmXCIsIFwidGV4dGl0c2ZcIiwgXCJTYW5zU2VyaWYtSXRhbGljXCJdLCAvLyBhLXogaXRhbGljIHNhbnMtc2VyaWZcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gQS1aIGJvbGQgaXRhbGljIHNhbnMuIE5vIGZvbnRcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gYS16IGJvbGQgaXRhbGljIHNhbnMuIE5vIGZvbnRcbltcIm1hdGh0dFwiLCBcInRleHR0dFwiLCBcIlR5cGV3cml0ZXItUmVndWxhclwiXSwgLy8gQS1aIG1vbm9zcGFjZVxuW1wibWF0aHR0XCIsIFwidGV4dHR0XCIsIFwiVHlwZXdyaXRlci1SZWd1bGFyXCJdIC8vIGEteiBtb25vc3BhY2Vcbl07XG52YXIgd2lkZU51bWVyYWxEYXRhID0gW1tcIm1hdGhiZlwiLCBcInRleHRiZlwiLCBcIk1haW4tQm9sZFwiXSwgLy8gMC05IGJvbGRcbltcIlwiLCBcIlwiLCBcIlwiXSwgLy8gMC05IGRvdWJsZS1zdHJ1Y2suIE5vIEthVGVYIGZvbnQuXG5bXCJtYXRoc2ZcIiwgXCJ0ZXh0c2ZcIiwgXCJTYW5zU2VyaWYtUmVndWxhclwiXSwgLy8gMC05IHNhbnMtc2VyaWZcbltcIm1hdGhib2xkc2ZcIiwgXCJ0ZXh0Ym9sZHNmXCIsIFwiU2Fuc1NlcmlmLUJvbGRcIl0sIC8vIDAtOSBib2xkIHNhbnMtc2VyaWZcbltcIm1hdGh0dFwiLCBcInRleHR0dFwiLCBcIlR5cGV3cml0ZXItUmVndWxhclwiXSAvLyAwLTkgbW9ub3NwYWNlXG5dO1xudmFyIHdpZGVDaGFyYWN0ZXJGb250ID0gZnVuY3Rpb24gd2lkZUNoYXJhY3RlckZvbnQod2lkZUNoYXIsIG1vZGUpIHtcbiAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGNvZGVQb2ludEF0KCkuIFNvIHdvcmsgd2l0aCB0aGUgc3Vycm9nYXRlIHBhaXIuXG4gIHZhciBIID0gd2lkZUNoYXIuY2hhckNvZGVBdCgwKTsgLy8gaGlnaCBzdXJyb2dhdGVcblxuICB2YXIgTCA9IHdpZGVDaGFyLmNoYXJDb2RlQXQoMSk7IC8vIGxvdyBzdXJyb2dhdGVcblxuICB2YXIgY29kZVBvaW50ID0gKEggLSAweEQ4MDApICogMHg0MDAgKyAoTCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICB2YXIgaiA9IG1vZGUgPT09IFwibWF0aFwiID8gMCA6IDE7IC8vIGNvbHVtbiBpbmRleCBmb3IgQ1NTIGNsYXNzLlxuXG4gIGlmICgweDFENDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPCAweDFENkE0KSB7XG4gICAgLy8gd2lkZUxhdGluTGV0dGVyRGF0YSBjb250YWlucyBleGFjdGx5IDI2IGNoYXJzIG9uIGVhY2ggcm93LlxuICAgIC8vIFNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHJlbGV2YW50IHJvdy4gTm8gdHJhdmVyc2UgbmVjZXNzYXJ5LlxuICAgIHZhciBpID0gTWF0aC5mbG9vcigoY29kZVBvaW50IC0gMHgxRDQwMCkgLyAyNik7XG4gICAgcmV0dXJuIFt3aWRlTGF0aW5MZXR0ZXJEYXRhW2ldWzJdLCB3aWRlTGF0aW5MZXR0ZXJEYXRhW2ldW2pdXTtcbiAgfSBlbHNlIGlmICgweDFEN0NFIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRDdGRikge1xuICAgIC8vIE51bWVyYWxzLCB0ZW4gcGVyIHJvdy5cbiAgICB2YXIgX2kgPSBNYXRoLmZsb29yKChjb2RlUG9pbnQgLSAweDFEN0NFKSAvIDEwKTtcblxuICAgIHJldHVybiBbd2lkZU51bWVyYWxEYXRhW19pXVsyXSwgd2lkZU51bWVyYWxEYXRhW19pXVtqXV07XG4gIH0gZWxzZSBpZiAoY29kZVBvaW50ID09PSAweDFENkE1IHx8IGNvZGVQb2ludCA9PT0gMHgxRDZBNikge1xuICAgIC8vIGRvdGxlc3MgaSBvciBqXG4gICAgcmV0dXJuIFt3aWRlTGF0aW5MZXR0ZXJEYXRhWzBdWzJdLCB3aWRlTGF0aW5MZXR0ZXJEYXRhWzBdW2pdXTtcbiAgfSBlbHNlIGlmICgweDFENkE2IDwgY29kZVBvaW50ICYmIGNvZGVQb2ludCA8IDB4MUQ3Q0UpIHtcbiAgICAvLyBHcmVlayBsZXR0ZXJzLiBOb3Qgc3VwcG9ydGVkLCB5ZXQuXG4gICAgcmV0dXJuIFtcIlwiLCBcIlwiXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGFueSB3aWRlIGNoYXJhY3RlcnMgb3V0c2lkZSAxRDQwMOKAkzFEN0ZGLlxuICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVuc3VwcG9ydGVkIGNoYXJhY3RlcjogXCIgKyB3aWRlQ2hhcik7XG4gIH1cbn07XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYnVpbGRDb21tb24uanNcbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyBnZW5lcmFsIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGZvciBidWlsZGluZ1xuICogZGlmZmVyZW50IGtpbmRzIG9mIGRvbVRyZWUgbm9kZXMgaW4gYSBjb25zaXN0ZW50IG1hbm5lci5cbiAqL1xuXG5cblxuXG5cblxuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBnaXZlbiBzeW1ib2wgaW4gZm9udE1ldHJpY3MsIGFmdGVyIGFwcGx5aW5nIGFueSBzeW1ib2xcbiAqIHJlcGxhY2VtZW50cyBkZWZpbmVkIGluIHN5bWJvbC5qc1xuICovXG52YXIgbG9va3VwU3ltYm9sID0gZnVuY3Rpb24gbG9va3VwU3ltYm9sKHZhbHVlLCAvLyBUT0RPKCM5NjMpOiBVc2UgYSB1bmlvbiB0eXBlIGZvciB0aGlzLlxuZm9udE5hbWUsIG1vZGUpIHtcbiAgLy8gUmVwbGFjZSB0aGUgdmFsdWUgd2l0aCBpdHMgcmVwbGFjZWQgdmFsdWUgZnJvbSBzeW1ib2wuanNcbiAgaWYgKHNyY19zeW1ib2xzW21vZGVdW3ZhbHVlXSAmJiBzcmNfc3ltYm9sc1ttb2RlXVt2YWx1ZV0ucmVwbGFjZSkge1xuICAgIHZhbHVlID0gc3JjX3N5bWJvbHNbbW9kZV1bdmFsdWVdLnJlcGxhY2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBtZXRyaWNzOiBnZXRDaGFyYWN0ZXJNZXRyaWNzKHZhbHVlLCBmb250TmFtZSwgbW9kZSlcbiAgfTtcbn07XG4vKipcbiAqIE1ha2VzIGEgc3ltYm9sTm9kZSBhZnRlciB0cmFuc2xhdGlvbiB2aWEgdGhlIGxpc3Qgb2Ygc3ltYm9scyBpbiBzeW1ib2xzLmpzLlxuICogQ29ycmVjdGx5IHB1bGxzIG91dCBtZXRyaWNzIGZvciB0aGUgY2hhcmFjdGVyLCBhbmQgb3B0aW9uYWxseSB0YWtlcyBhIGxpc3Qgb2ZcbiAqIGNsYXNzZXMgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIG5vZGUuXG4gKlxuICogVE9ETzogbWFrZSBhcmd1bWVudCBvcmRlciBjbG9zZXIgdG8gbWFrZVNwYW5cbiAqIFRPRE86IGFkZCBhIHNlcGFyYXRlIGFyZ3VtZW50IGZvciBtYXRoIGNsYXNzIChlLmcuIGBtb3BgLCBgbWJpbmApLCB3aGljaFxuICogc2hvdWxkIGlmIHByZXNlbnQgY29tZSBmaXJzdCBpbiBgY2xhc3Nlc2AuXG4gKiBUT0RPKCM5NTMpOiBNYWtlIGBvcHRpb25zYCBtYW5kYXRvcnkgYW5kIGFsd2F5cyBwYXNzIGl0IGluLlxuICovXG5cblxudmFyIG1ha2VTeW1ib2wgPSBmdW5jdGlvbiBtYWtlU3ltYm9sKHZhbHVlLCBmb250TmFtZSwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcykge1xuICB2YXIgbG9va3VwID0gbG9va3VwU3ltYm9sKHZhbHVlLCBmb250TmFtZSwgbW9kZSk7XG4gIHZhciBtZXRyaWNzID0gbG9va3VwLm1ldHJpY3M7XG4gIHZhbHVlID0gbG9va3VwLnZhbHVlO1xuICB2YXIgc3ltYm9sTm9kZTtcblxuICBpZiAobWV0cmljcykge1xuICAgIHZhciBpdGFsaWMgPSBtZXRyaWNzLml0YWxpYztcblxuICAgIGlmIChtb2RlID09PSBcInRleHRcIiB8fCBvcHRpb25zICYmIG9wdGlvbnMuZm9udCA9PT0gXCJtYXRoaXRcIikge1xuICAgICAgaXRhbGljID0gMDtcbiAgICB9XG5cbiAgICBzeW1ib2xOb2RlID0gbmV3IFN5bWJvbE5vZGUodmFsdWUsIG1ldHJpY3MuaGVpZ2h0LCBtZXRyaWNzLmRlcHRoLCBpdGFsaWMsIG1ldHJpY3Muc2tldywgbWV0cmljcy53aWR0aCwgY2xhc3Nlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyhlbWlseSk6IEZpZ3VyZSBvdXQgYSBnb29kIHdheSB0byBvbmx5IHByaW50IHRoaXMgaW4gZGV2ZWxvcG1lbnRcbiAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4oXCJObyBjaGFyYWN0ZXIgbWV0cmljcyBcIiArIChcImZvciAnXCIgKyB2YWx1ZSArIFwiJyBpbiBzdHlsZSAnXCIgKyBmb250TmFtZSArIFwiJyBhbmQgbW9kZSAnXCIgKyBtb2RlICsgXCInXCIpKTtcbiAgICBzeW1ib2xOb2RlID0gbmV3IFN5bWJvbE5vZGUodmFsdWUsIDAsIDAsIDAsIDAsIDAsIGNsYXNzZXMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBzeW1ib2xOb2RlLm1heEZvbnRTaXplID0gb3B0aW9ucy5zaXplTXVsdGlwbGllcjtcblxuICAgIGlmIChvcHRpb25zLnN0eWxlLmlzVGlnaHQoKSkge1xuICAgICAgc3ltYm9sTm9kZS5jbGFzc2VzLnB1c2goXCJtdGlnaHRcIik7XG4gICAgfVxuXG4gICAgdmFyIGNvbG9yID0gb3B0aW9ucy5nZXRDb2xvcigpO1xuXG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBzeW1ib2xOb2RlLnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bWJvbE5vZGU7XG59O1xuLyoqXG4gKiBNYWtlcyBhIHN5bWJvbCBpbiBNYWluLVJlZ3VsYXIgb3IgQU1TLVJlZ3VsYXIuXG4gKiBVc2VkIGZvciByZWwsIGJpbiwgb3BlbiwgY2xvc2UsIGlubmVyLCBhbmQgcHVuY3QuXG4gKi9cblxuXG52YXIgbWF0aHN5bSA9IGZ1bmN0aW9uIG1hdGhzeW0odmFsdWUsIG1vZGUsIG9wdGlvbnMsIGNsYXNzZXMpIHtcbiAgaWYgKGNsYXNzZXMgPT09IHZvaWQgMCkge1xuICAgIGNsYXNzZXMgPSBbXTtcbiAgfVxuXG4gIC8vIERlY2lkZSB3aGF0IGZvbnQgdG8gcmVuZGVyIHRoZSBzeW1ib2wgaW4gYnkgaXRzIGVudHJ5IGluIHRoZSBzeW1ib2xzXG4gIC8vIHRhYmxlLlxuICAvLyBIYXZlIGEgc3BlY2lhbCBjYXNlIGZvciB3aGVuIHRoZSB2YWx1ZSA9IFxcIGJlY2F1c2UgdGhlIFxcIGlzIHVzZWQgYXMgYVxuICAvLyB0ZXh0b3JkIGluIHVuc3VwcG9ydGVkIGNvbW1hbmQgZXJyb3JzIGJ1dCBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgcmVndWxhclxuICAvLyB0ZXh0IG9yZGluYWwgYW5kIGlzIHRoZXJlZm9yZSBub3QgcHJlc2VudCBhcyBhIHN5bWJvbCBpbiB0aGUgc3ltYm9sc1xuICAvLyB0YWJsZSBmb3IgdGV4dCwgYXMgd2VsbCBhcyBhIHNwZWNpYWwgY2FzZSBmb3IgYm9sZHN5bWJvbCBiZWNhdXNlIGl0XG4gIC8vIGNhbiBiZSB1c2VkIGZvciBib2xkICsgYW5kIC1cbiAgaWYgKG9wdGlvbnMuZm9udCA9PT0gXCJib2xkc3ltYm9sXCIgJiYgbG9va3VwU3ltYm9sKHZhbHVlLCBcIk1haW4tQm9sZFwiLCBtb2RlKS5tZXRyaWNzKSB7XG4gICAgcmV0dXJuIG1ha2VTeW1ib2wodmFsdWUsIFwiTWFpbi1Cb2xkXCIsIG1vZGUsIG9wdGlvbnMsIGNsYXNzZXMuY29uY2F0KFtcIm1hdGhiZlwiXSkpO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBcIlxcXFxcIiB8fCBzcmNfc3ltYm9sc1ttb2RlXVt2YWx1ZV0uZm9udCA9PT0gXCJtYWluXCIpIHtcbiAgICByZXR1cm4gbWFrZVN5bWJvbCh2YWx1ZSwgXCJNYWluLVJlZ3VsYXJcIiwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1ha2VTeW1ib2wodmFsdWUsIFwiQU1TLVJlZ3VsYXJcIiwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcy5jb25jYXQoW1wiYW1zcm1cIl0pKTtcbiAgfVxufTtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgdHdvIGZvbnQgbmFtZXMgKE1haW4tQm9sZCBhbmQgTWF0aC1Cb2xkSXRhbGljKSBhbmRcbiAqIGNvcnJlc3BvbmRpbmcgc3R5bGUgdGFncyAobWF0aGJmIG9yIGJvbGRzeW1ib2wpIHRvIHVzZSBmb3IgZm9udCBcImJvbGRzeW1ib2xcIixcbiAqIGRlcGVuZGluZyBvbiB0aGUgc3ltYm9sLiAgVXNlIHRoaXMgZnVuY3Rpb24gaW5zdGVhZCBvZiBmb250TWFwIGZvciBmb250XG4gKiBcImJvbGRzeW1ib2xcIi5cbiAqL1xuXG5cbnZhciBib2xkc3ltYm9sID0gZnVuY3Rpb24gYm9sZHN5bWJvbCh2YWx1ZSwgbW9kZSwgb3B0aW9ucywgY2xhc3NlcywgdHlwZSkge1xuICBpZiAodHlwZSAhPT0gXCJ0ZXh0b3JkXCIgJiYgbG9va3VwU3ltYm9sKHZhbHVlLCBcIk1hdGgtQm9sZEl0YWxpY1wiLCBtb2RlKS5tZXRyaWNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvbnROYW1lOiBcIk1hdGgtQm9sZEl0YWxpY1wiLFxuICAgICAgZm9udENsYXNzOiBcImJvbGRzeW1ib2xcIlxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gU29tZSBnbHlwaHMgZG8gbm90IGV4aXN0IGluIE1hdGgtQm9sZEl0YWxpYyBzbyB3ZSBuZWVkIHRvIHVzZVxuICAgIC8vIE1haW4tQm9sZCBpbnN0ZWFkLlxuICAgIHJldHVybiB7XG4gICAgICBmb250TmFtZTogXCJNYWluLUJvbGRcIixcbiAgICAgIGZvbnRDbGFzczogXCJtYXRoYmZcIlxuICAgIH07XG4gIH1cbn07XG4vKipcbiAqIE1ha2VzIGVpdGhlciBhIG1hdGhvcmQgb3IgdGV4dG9yZCBpbiB0aGUgY29ycmVjdCBmb250IGFuZCBjb2xvci5cbiAqL1xuXG5cbnZhciBtYWtlT3JkID0gZnVuY3Rpb24gbWFrZU9yZChncm91cCwgb3B0aW9ucywgdHlwZSkge1xuICB2YXIgbW9kZSA9IGdyb3VwLm1vZGU7XG4gIHZhciB0ZXh0ID0gZ3JvdXAudGV4dDtcbiAgdmFyIGNsYXNzZXMgPSBbXCJtb3JkXCJdOyAvLyBNYXRoIG1vZGUgb3IgT2xkIGZvbnQgKGkuZS4gXFxybSlcblxuICB2YXIgaXNGb250ID0gbW9kZSA9PT0gXCJtYXRoXCIgfHwgbW9kZSA9PT0gXCJ0ZXh0XCIgJiYgb3B0aW9ucy5mb250O1xuICB2YXIgZm9udE9yRmFtaWx5ID0gaXNGb250ID8gb3B0aW9ucy5mb250IDogb3B0aW9ucy5mb250RmFtaWx5O1xuXG4gIGlmICh0ZXh0LmNoYXJDb2RlQXQoMCkgPT09IDB4RDgzNSkge1xuICAgIC8vIHN1cnJvZ2F0ZSBwYWlycyBnZXQgc3BlY2lhbCB0cmVhdG1lbnRcbiAgICB2YXIgX3dpZGVDaGFyYWN0ZXJGb250ID0gd2lkZUNoYXJhY3RlckZvbnQodGV4dCwgbW9kZSksXG4gICAgICAgIHdpZGVGb250TmFtZSA9IF93aWRlQ2hhcmFjdGVyRm9udFswXSxcbiAgICAgICAgd2lkZUZvbnRDbGFzcyA9IF93aWRlQ2hhcmFjdGVyRm9udFsxXTtcblxuICAgIHJldHVybiBtYWtlU3ltYm9sKHRleHQsIHdpZGVGb250TmFtZSwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcy5jb25jYXQod2lkZUZvbnRDbGFzcykpO1xuICB9IGVsc2UgaWYgKGZvbnRPckZhbWlseSkge1xuICAgIHZhciBmb250TmFtZTtcbiAgICB2YXIgZm9udENsYXNzZXM7XG5cbiAgICBpZiAoZm9udE9yRmFtaWx5ID09PSBcImJvbGRzeW1ib2xcIikge1xuICAgICAgdmFyIGZvbnREYXRhID0gYm9sZHN5bWJvbCh0ZXh0LCBtb2RlLCBvcHRpb25zLCBjbGFzc2VzLCB0eXBlKTtcbiAgICAgIGZvbnROYW1lID0gZm9udERhdGEuZm9udE5hbWU7XG4gICAgICBmb250Q2xhc3NlcyA9IFtmb250RGF0YS5mb250Q2xhc3NdO1xuICAgIH0gZWxzZSBpZiAoaXNGb250KSB7XG4gICAgICBmb250TmFtZSA9IGZvbnRNYXBbZm9udE9yRmFtaWx5XS5mb250TmFtZTtcbiAgICAgIGZvbnRDbGFzc2VzID0gW2ZvbnRPckZhbWlseV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvbnROYW1lID0gcmV0cmlldmVUZXh0Rm9udE5hbWUoZm9udE9yRmFtaWx5LCBvcHRpb25zLmZvbnRXZWlnaHQsIG9wdGlvbnMuZm9udFNoYXBlKTtcbiAgICAgIGZvbnRDbGFzc2VzID0gW2ZvbnRPckZhbWlseSwgb3B0aW9ucy5mb250V2VpZ2h0LCBvcHRpb25zLmZvbnRTaGFwZV07XG4gICAgfVxuXG4gICAgaWYgKGxvb2t1cFN5bWJvbCh0ZXh0LCBmb250TmFtZSwgbW9kZSkubWV0cmljcykge1xuICAgICAgcmV0dXJuIG1ha2VTeW1ib2wodGV4dCwgZm9udE5hbWUsIG1vZGUsIG9wdGlvbnMsIGNsYXNzZXMuY29uY2F0KGZvbnRDbGFzc2VzKSk7XG4gICAgfSBlbHNlIGlmIChsaWdhdHVyZXMuaGFzT3duUHJvcGVydHkodGV4dCkgJiYgZm9udE5hbWUuc2xpY2UoMCwgMTApID09PSBcIlR5cGV3cml0ZXJcIikge1xuICAgICAgLy8gRGVjb25zdHJ1Y3QgbGlnYXR1cmVzIGluIG1vbm9zcGFjZSBmb250cyAoXFx0ZXh0dHQsIFxcdHQpLlxuICAgICAgdmFyIHBhcnRzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXJ0cy5wdXNoKG1ha2VTeW1ib2wodGV4dFtpXSwgZm9udE5hbWUsIG1vZGUsIG9wdGlvbnMsIGNsYXNzZXMuY29uY2F0KGZvbnRDbGFzc2VzKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFrZUZyYWdtZW50KHBhcnRzKTtcbiAgICB9XG4gIH0gLy8gTWFrZXMgYSBzeW1ib2wgaW4gdGhlIGRlZmF1bHQgZm9udCBmb3IgbWF0aG9yZHMgYW5kIHRleHRvcmRzLlxuXG5cbiAgaWYgKHR5cGUgPT09IFwibWF0aG9yZFwiKSB7XG4gICAgcmV0dXJuIG1ha2VTeW1ib2wodGV4dCwgXCJNYXRoLUl0YWxpY1wiLCBtb2RlLCBvcHRpb25zLCBjbGFzc2VzLmNvbmNhdChbXCJtYXRobm9ybWFsXCJdKSk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJ0ZXh0b3JkXCIpIHtcbiAgICB2YXIgZm9udCA9IHNyY19zeW1ib2xzW21vZGVdW3RleHRdICYmIHNyY19zeW1ib2xzW21vZGVdW3RleHRdLmZvbnQ7XG5cbiAgICBpZiAoZm9udCA9PT0gXCJhbXNcIikge1xuICAgICAgdmFyIF9mb250TmFtZSA9IHJldHJpZXZlVGV4dEZvbnROYW1lKFwiYW1zcm1cIiwgb3B0aW9ucy5mb250V2VpZ2h0LCBvcHRpb25zLmZvbnRTaGFwZSk7XG5cbiAgICAgIHJldHVybiBtYWtlU3ltYm9sKHRleHQsIF9mb250TmFtZSwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcy5jb25jYXQoXCJhbXNybVwiLCBvcHRpb25zLmZvbnRXZWlnaHQsIG9wdGlvbnMuZm9udFNoYXBlKSk7XG4gICAgfSBlbHNlIGlmIChmb250ID09PSBcIm1haW5cIiB8fCAhZm9udCkge1xuICAgICAgdmFyIF9mb250TmFtZTIgPSByZXRyaWV2ZVRleHRGb250TmFtZShcInRleHRybVwiLCBvcHRpb25zLmZvbnRXZWlnaHQsIG9wdGlvbnMuZm9udFNoYXBlKTtcblxuICAgICAgcmV0dXJuIG1ha2VTeW1ib2wodGV4dCwgX2ZvbnROYW1lMiwgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcy5jb25jYXQob3B0aW9ucy5mb250V2VpZ2h0LCBvcHRpb25zLmZvbnRTaGFwZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb250cyBhZGRlZCBieSBwbHVnaW5zXG4gICAgICB2YXIgX2ZvbnROYW1lMyA9IHJldHJpZXZlVGV4dEZvbnROYW1lKGZvbnQsIG9wdGlvbnMuZm9udFdlaWdodCwgb3B0aW9ucy5mb250U2hhcGUpOyAvLyBXZSBhZGQgZm9udCBuYW1lIGFzIGEgY3NzIGNsYXNzXG5cblxuICAgICAgcmV0dXJuIG1ha2VTeW1ib2wodGV4dCwgX2ZvbnROYW1lMywgbW9kZSwgb3B0aW9ucywgY2xhc3Nlcy5jb25jYXQoX2ZvbnROYW1lMywgb3B0aW9ucy5mb250V2VpZ2h0LCBvcHRpb25zLmZvbnRTaGFwZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIHR5cGU6IFwiICsgdHlwZSArIFwiIGluIG1ha2VPcmRcIik7XG4gIH1cbn07XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBzdWJzZXF1ZW50IHN5bWJvbE5vZGVzIGhhdmUgdGhlIHNhbWUgY2xhc3Nlcywgc2tldywgbWF4Rm9udCxcbiAqIGFuZCBzdHlsZXMuXG4gKi9cblxuXG52YXIgY2FuQ29tYmluZSA9IGZ1bmN0aW9uIGNhbkNvbWJpbmUocHJldiwgbmV4dCkge1xuICBpZiAoY3JlYXRlQ2xhc3MocHJldi5jbGFzc2VzKSAhPT0gY3JlYXRlQ2xhc3MobmV4dC5jbGFzc2VzKSB8fCBwcmV2LnNrZXcgIT09IG5leHQuc2tldyB8fCBwcmV2Lm1heEZvbnRTaXplICE9PSBuZXh0Lm1heEZvbnRTaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHByZXYgYW5kIG5leHQgYm90aCBhcmUganVzdCBcIm1iaW5cInMgb3IgXCJtb3JkXCJzIHdlIGRvbid0IGNvbWJpbmUgdGhlbVxuICAvLyBzbyB0aGF0IHRoZSBwcm9wZXIgc3BhY2luZyBjYW4gYmUgcHJlc2VydmVkLlxuXG5cbiAgaWYgKHByZXYuY2xhc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgY2xzID0gcHJldi5jbGFzc2VzWzBdO1xuXG4gICAgaWYgKGNscyA9PT0gXCJtYmluXCIgfHwgY2xzID09PSBcIm1vcmRcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIHN0eWxlIGluIHByZXYuc3R5bGUpIHtcbiAgICBpZiAocHJldi5zdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZSkgJiYgcHJldi5zdHlsZVtzdHlsZV0gIT09IG5leHQuc3R5bGVbc3R5bGVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX3N0eWxlIGluIG5leHQuc3R5bGUpIHtcbiAgICBpZiAobmV4dC5zdHlsZS5oYXNPd25Qcm9wZXJ0eShfc3R5bGUpICYmIHByZXYuc3R5bGVbX3N0eWxlXSAhPT0gbmV4dC5zdHlsZVtfc3R5bGVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBDb21iaW5lIGNvbnNlY3V0aXZlIGRvbVRyZWUuc3ltYm9sTm9kZXMgaW50byBhIHNpbmdsZSBzeW1ib2xOb2RlLlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiBtdXRhdGVzIHRoZSBhcmd1bWVudC5cbiAqL1xuXG5cbnZhciB0cnlDb21iaW5lQ2hhcnMgPSBmdW5jdGlvbiB0cnlDb21iaW5lQ2hhcnMoY2hhcnMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICB2YXIgcHJldiA9IGNoYXJzW2ldO1xuICAgIHZhciBuZXh0ID0gY2hhcnNbaSArIDFdO1xuXG4gICAgaWYgKHByZXYgaW5zdGFuY2VvZiBTeW1ib2xOb2RlICYmIG5leHQgaW5zdGFuY2VvZiBTeW1ib2xOb2RlICYmIGNhbkNvbWJpbmUocHJldiwgbmV4dCkpIHtcbiAgICAgIHByZXYudGV4dCArPSBuZXh0LnRleHQ7XG4gICAgICBwcmV2LmhlaWdodCA9IE1hdGgubWF4KHByZXYuaGVpZ2h0LCBuZXh0LmhlaWdodCk7XG4gICAgICBwcmV2LmRlcHRoID0gTWF0aC5tYXgocHJldi5kZXB0aCwgbmV4dC5kZXB0aCk7IC8vIFVzZSB0aGUgbGFzdCBjaGFyYWN0ZXIncyBpdGFsaWMgY29ycmVjdGlvbiBzaW5jZSB3ZSB1c2VcbiAgICAgIC8vIGl0IHRvIGFkZCBwYWRkaW5nIHRvIHRoZSByaWdodCBvZiB0aGUgc3BhbiBjcmVhdGVkIGZyb21cbiAgICAgIC8vIHRoZSBjb21iaW5lZCBjaGFyYWN0ZXJzLlxuXG4gICAgICBwcmV2Lml0YWxpYyA9IG5leHQuaXRhbGljO1xuICAgICAgY2hhcnMuc3BsaWNlKGkgKyAxLCAxKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhcnM7XG59O1xuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGhlaWdodCwgZGVwdGgsIGFuZCBtYXhGb250U2l6ZSBvZiBhbiBlbGVtZW50IGJhc2VkIG9uIGl0c1xuICogY2hpbGRyZW4uXG4gKi9cblxuXG52YXIgc2l6ZUVsZW1lbnRGcm9tQ2hpbGRyZW4gPSBmdW5jdGlvbiBzaXplRWxlbWVudEZyb21DaGlsZHJlbihlbGVtKSB7XG4gIHZhciBoZWlnaHQgPSAwO1xuICB2YXIgZGVwdGggPSAwO1xuICB2YXIgbWF4Rm9udFNpemUgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGVsZW0uY2hpbGRyZW5baV07XG5cbiAgICBpZiAoY2hpbGQuaGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBjaGlsZC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkLmRlcHRoID4gZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gY2hpbGQuZGVwdGg7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkLm1heEZvbnRTaXplID4gbWF4Rm9udFNpemUpIHtcbiAgICAgIG1heEZvbnRTaXplID0gY2hpbGQubWF4Rm9udFNpemU7XG4gICAgfVxuICB9XG5cbiAgZWxlbS5oZWlnaHQgPSBoZWlnaHQ7XG4gIGVsZW0uZGVwdGggPSBkZXB0aDtcbiAgZWxlbS5tYXhGb250U2l6ZSA9IG1heEZvbnRTaXplO1xufTtcbi8qKlxuICogTWFrZXMgYSBzcGFuIHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgY2xhc3NlcywgbGlzdCBvZiBjaGlsZHJlbiwgYW5kIG9wdGlvbnMuXG4gKlxuICogVE9ETygjOTUzKTogRW5zdXJlIHRoYXQgYG9wdGlvbnNgIGlzIGFsd2F5cyBwcm92aWRlZCAoY3VycmVudGx5IHNvbWUgY2FsbFxuICogc2l0ZXMgZG9uJ3QgcGFzcyBpdCkgYW5kIG1ha2UgdGhlIHR5cGUgYmVsb3cgbWFuZGF0b3J5LlxuICogVE9ETzogYWRkIGEgc2VwYXJhdGUgYXJndW1lbnQgZm9yIG1hdGggY2xhc3MgKGUuZy4gYG1vcGAsIGBtYmluYCksIHdoaWNoXG4gKiBzaG91bGQgaWYgcHJlc2VudCBjb21lIGZpcnN0IGluIGBjbGFzc2VzYC5cbiAqL1xuXG5cbnZhciBtYWtlU3BhbiA9IGZ1bmN0aW9uIG1ha2VTcGFuKGNsYXNzZXMsIGNoaWxkcmVuLCBvcHRpb25zLCBzdHlsZSkge1xuICB2YXIgc3BhbiA9IG5ldyBTcGFuKGNsYXNzZXMsIGNoaWxkcmVuLCBvcHRpb25zLCBzdHlsZSk7XG4gIHNpemVFbGVtZW50RnJvbUNoaWxkcmVuKHNwYW4pO1xuICByZXR1cm4gc3Bhbjtcbn07IC8vIFNWRyBvbmUgaXMgc2ltcGxlciAtLSBkb2Vzbid0IHJlcXVpcmUgaGVpZ2h0LCBkZXB0aCwgbWF4LWZvbnQgc2V0dGluZy5cbi8vIFRoaXMgaXMgYWxzbyBhIHNlcGFyYXRlIG1ldGhvZCBmb3IgdHlwZXNhZmV0eS5cblxuXG52YXIgbWFrZVN2Z1NwYW4gPSBmdW5jdGlvbiBtYWtlU3ZnU3BhbihjbGFzc2VzLCBjaGlsZHJlbiwgb3B0aW9ucywgc3R5bGUpIHtcbiAgcmV0dXJuIG5ldyBTcGFuKGNsYXNzZXMsIGNoaWxkcmVuLCBvcHRpb25zLCBzdHlsZSk7XG59O1xuXG52YXIgbWFrZUxpbmVTcGFuID0gZnVuY3Rpb24gbWFrZUxpbmVTcGFuKGNsYXNzTmFtZSwgb3B0aW9ucywgdGhpY2tuZXNzKSB7XG4gIHZhciBsaW5lID0gbWFrZVNwYW4oW2NsYXNzTmFtZV0sIFtdLCBvcHRpb25zKTtcbiAgbGluZS5oZWlnaHQgPSBNYXRoLm1heCh0aGlja25lc3MgfHwgb3B0aW9ucy5mb250TWV0cmljcygpLmRlZmF1bHRSdWxlVGhpY2tuZXNzLCBvcHRpb25zLm1pblJ1bGVUaGlja25lc3MpO1xuICBsaW5lLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoID0gbWFrZUVtKGxpbmUuaGVpZ2h0KTtcbiAgbGluZS5tYXhGb250U2l6ZSA9IDEuMDtcbiAgcmV0dXJuIGxpbmU7XG59O1xuLyoqXG4gKiBNYWtlcyBhbiBhbmNob3Igd2l0aCB0aGUgZ2l2ZW4gaHJlZiwgbGlzdCBvZiBjbGFzc2VzLCBsaXN0IG9mIGNoaWxkcmVuLFxuICogYW5kIG9wdGlvbnMuXG4gKi9cblxuXG52YXIgbWFrZUFuY2hvciA9IGZ1bmN0aW9uIG1ha2VBbmNob3IoaHJlZiwgY2xhc3NlcywgY2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgdmFyIGFuY2hvciA9IG5ldyBBbmNob3IoaHJlZiwgY2xhc3NlcywgY2hpbGRyZW4sIG9wdGlvbnMpO1xuICBzaXplRWxlbWVudEZyb21DaGlsZHJlbihhbmNob3IpO1xuICByZXR1cm4gYW5jaG9yO1xufTtcbi8qKlxuICogTWFrZXMgYSBkb2N1bWVudCBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIGNoaWxkcmVuLlxuICovXG5cblxudmFyIG1ha2VGcmFnbWVudCA9IGZ1bmN0aW9uIG1ha2VGcmFnbWVudChjaGlsZHJlbikge1xuICB2YXIgZnJhZ21lbnQgPSBuZXcgRG9jdW1lbnRGcmFnbWVudChjaGlsZHJlbik7XG4gIHNpemVFbGVtZW50RnJvbUNoaWxkcmVuKGZyYWdtZW50KTtcbiAgcmV0dXJuIGZyYWdtZW50O1xufTtcbi8qKlxuICogV3JhcHMgZ3JvdXAgaW4gYSBzcGFuIGlmIGl0J3MgYSBkb2N1bWVudCBmcmFnbWVudCwgYWxsb3dpbmcgdG8gYXBwbHkgY2xhc3Nlc1xuICogYW5kIHN0eWxlc1xuICovXG5cblxudmFyIHdyYXBGcmFnbWVudCA9IGZ1bmN0aW9uIHdyYXBGcmFnbWVudChncm91cCwgb3B0aW9ucykge1xuICBpZiAoZ3JvdXAgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgcmV0dXJuIG1ha2VTcGFuKFtdLCBbZ3JvdXBdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBncm91cDtcbn07IC8vIFRoZXNlIGFyZSBleGFjdCBvYmplY3QgdHlwZXMgdG8gY2F0Y2ggdHlwb3MgaW4gdGhlIG5hbWVzIG9mIHRoZSBvcHRpb25hbCBmaWVsZHMuXG5cblxuLy8gQ29tcHV0ZXMgdGhlIHVwZGF0ZWQgYGNoaWxkcmVuYCBsaXN0IGFuZCB0aGUgb3ZlcmFsbCBkZXB0aC5cbi8vXG4vLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBmb3IgbWFrZVZMaXN0IG1ha2VzIGl0IGVhc2llciB0byBlbmZvcmNlIHR5cGUgc2FmZXR5IGJ5XG4vLyBhbGxvd2luZyBlYXJseSBleGl0cyAocmV0dXJucykgaW4gdGhlIGxvZ2ljLlxudmFyIGdldFZMaXN0Q2hpbGRyZW5BbmREZXB0aCA9IGZ1bmN0aW9uIGdldFZMaXN0Q2hpbGRyZW5BbmREZXB0aChwYXJhbXMpIHtcbiAgaWYgKHBhcmFtcy5wb3NpdGlvblR5cGUgPT09IFwiaW5kaXZpZHVhbFNoaWZ0XCIpIHtcbiAgICB2YXIgb2xkQ2hpbGRyZW4gPSBwYXJhbXMuY2hpbGRyZW47XG4gICAgdmFyIGNoaWxkcmVuID0gW29sZENoaWxkcmVuWzBdXTsgLy8gQWRkIGluIGtlcm5zIHRvIHRoZSBsaXN0IG9mIHBhcmFtcy5jaGlsZHJlbiB0byBnZXQgZWFjaCBlbGVtZW50IHRvIGJlXG4gICAgLy8gc2hpZnRlZCB0byB0aGUgY29ycmVjdCBzcGVjaWZpZWQgc2hpZnRcblxuICAgIHZhciBfZGVwdGggPSAtb2xkQ2hpbGRyZW5bMF0uc2hpZnQgLSBvbGRDaGlsZHJlblswXS5lbGVtLmRlcHRoO1xuXG4gICAgdmFyIGN1cnJQb3MgPSBfZGVwdGg7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IG9sZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGlmZiA9IC1vbGRDaGlsZHJlbltpXS5zaGlmdCAtIGN1cnJQb3MgLSBvbGRDaGlsZHJlbltpXS5lbGVtLmRlcHRoO1xuICAgICAgdmFyIHNpemUgPSBkaWZmIC0gKG9sZENoaWxkcmVuW2kgLSAxXS5lbGVtLmhlaWdodCArIG9sZENoaWxkcmVuW2kgLSAxXS5lbGVtLmRlcHRoKTtcbiAgICAgIGN1cnJQb3MgPSBjdXJyUG9zICsgZGlmZjtcbiAgICAgIGNoaWxkcmVuLnB1c2goe1xuICAgICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgICAgc2l6ZTogc2l6ZVxuICAgICAgfSk7XG4gICAgICBjaGlsZHJlbi5wdXNoKG9sZENoaWxkcmVuW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgZGVwdGg6IF9kZXB0aFxuICAgIH07XG4gIH1cblxuICB2YXIgZGVwdGg7XG5cbiAgaWYgKHBhcmFtcy5wb3NpdGlvblR5cGUgPT09IFwidG9wXCIpIHtcbiAgICAvLyBXZSBhbHdheXMgc3RhcnQgYXQgdGhlIGJvdHRvbSwgc28gY2FsY3VsYXRlIHRoZSBib3R0b20gYnkgYWRkaW5nIHVwXG4gICAgLy8gYWxsIHRoZSBzaXplc1xuICAgIHZhciBib3R0b20gPSBwYXJhbXMucG9zaXRpb25EYXRhO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBhcmFtcy5jaGlsZHJlbi5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmFtcy5jaGlsZHJlbltfaV07XG4gICAgICBib3R0b20gLT0gY2hpbGQudHlwZSA9PT0gXCJrZXJuXCIgPyBjaGlsZC5zaXplIDogY2hpbGQuZWxlbS5oZWlnaHQgKyBjaGlsZC5lbGVtLmRlcHRoO1xuICAgIH1cblxuICAgIGRlcHRoID0gYm90dG9tO1xuICB9IGVsc2UgaWYgKHBhcmFtcy5wb3NpdGlvblR5cGUgPT09IFwiYm90dG9tXCIpIHtcbiAgICBkZXB0aCA9IC1wYXJhbXMucG9zaXRpb25EYXRhO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdENoaWxkID0gcGFyYW1zLmNoaWxkcmVuWzBdO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQudHlwZSAhPT0gXCJlbGVtXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgY2hpbGQgbXVzdCBoYXZlIHR5cGUgXCJlbGVtXCIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wb3NpdGlvblR5cGUgPT09IFwic2hpZnRcIikge1xuICAgICAgZGVwdGggPSAtZmlyc3RDaGlsZC5lbGVtLmRlcHRoIC0gcGFyYW1zLnBvc2l0aW9uRGF0YTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wb3NpdGlvblR5cGUgPT09IFwiZmlyc3RCYXNlbGluZVwiKSB7XG4gICAgICBkZXB0aCA9IC1maXJzdENoaWxkLmVsZW0uZGVwdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcG9zaXRpb25UeXBlIFwiICsgcGFyYW1zLnBvc2l0aW9uVHlwZSArIFwiLlwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoaWxkcmVuOiBwYXJhbXMuY2hpbGRyZW4sXG4gICAgZGVwdGg6IGRlcHRoXG4gIH07XG59O1xuLyoqXG4gKiBNYWtlcyBhIHZlcnRpY2FsIGxpc3QgYnkgc3RhY2tpbmcgZWxlbWVudHMgYW5kIGtlcm5zIG9uIHRvcCBvZiBlYWNoIG90aGVyLlxuICogQWxsb3dzIGZvciBtYW55IGRpZmZlcmVudCB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIHBvc2l0aW9uaW5nIG1ldGhvZC5cbiAqXG4gKiBTZWUgVkxpc3RQYXJhbSBkb2N1bWVudGF0aW9uIGFib3ZlLlxuICovXG5cblxudmFyIG1ha2VWTGlzdCA9IGZ1bmN0aW9uIG1ha2VWTGlzdChwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdmFyIF9nZXRWTGlzdENoaWxkcmVuQW5kRCA9IGdldFZMaXN0Q2hpbGRyZW5BbmREZXB0aChwYXJhbXMpLFxuICAgICAgY2hpbGRyZW4gPSBfZ2V0Vkxpc3RDaGlsZHJlbkFuZEQuY2hpbGRyZW4sXG4gICAgICBkZXB0aCA9IF9nZXRWTGlzdENoaWxkcmVuQW5kRC5kZXB0aDsgLy8gQ3JlYXRlIGEgc3RydXQgdGhhdCBpcyB0YWxsZXIgdGhhbiBhbnkgbGlzdCBpdGVtLiBUaGUgc3RydXQgaXMgYWRkZWQgdG9cbiAgLy8gZWFjaCBpdGVtLCB3aGVyZSBpdCB3aWxsIGRldGVybWluZSB0aGUgaXRlbSdzIGJhc2VsaW5lLiBTaW5jZSBpdCBoYXNcbiAgLy8gYG92ZXJmbG93OmhpZGRlbmAsIHRoZSBzdHJ1dCdzIHRvcCBlZGdlIHdpbGwgc2l0IG9uIHRoZSBpdGVtJ3MgbGluZSBib3gnc1xuICAvLyB0b3AgZWRnZSBhbmQgdGhlIHN0cnV0J3MgYm90dG9tIGVkZ2Ugd2lsbCBzaXQgb24gdGhlIGl0ZW0ncyBiYXNlbGluZSxcbiAgLy8gd2l0aCBubyBhZGRpdGlvbmFsIGxpbmUtaGVpZ2h0IHNwYWNpbmcuIFRoaXMgYWxsb3dzIHRoZSBpdGVtIGJhc2VsaW5lIHRvXG4gIC8vIGJlIHBvc2l0aW9uZWQgcHJlY2lzZWx5IHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZm9udCBhc2NlbnQgYW5kXG4gIC8vIGxpbmUtaGVpZ2h0LlxuXG5cbiAgdmFyIHBzdHJ1dFNpemUgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgIGlmIChjaGlsZC50eXBlID09PSBcImVsZW1cIikge1xuICAgICAgdmFyIGVsZW0gPSBjaGlsZC5lbGVtO1xuICAgICAgcHN0cnV0U2l6ZSA9IE1hdGgubWF4KHBzdHJ1dFNpemUsIGVsZW0ubWF4Rm9udFNpemUsIGVsZW0uaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwc3RydXRTaXplICs9IDI7XG4gIHZhciBwc3RydXQgPSBtYWtlU3BhbihbXCJwc3RydXRcIl0sIFtdKTtcbiAgcHN0cnV0LnN0eWxlLmhlaWdodCA9IG1ha2VFbShwc3RydXRTaXplKTsgLy8gQ3JlYXRlIGEgbmV3IGxpc3Qgb2YgYWN0dWFsIGNoaWxkcmVuIGF0IHRoZSBjb3JyZWN0IG9mZnNldHNcblxuICB2YXIgcmVhbENoaWxkcmVuID0gW107XG4gIHZhciBtaW5Qb3MgPSBkZXB0aDtcbiAgdmFyIG1heFBvcyA9IGRlcHRoO1xuICB2YXIgY3VyclBvcyA9IGRlcHRoO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGNoaWxkcmVuLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW5bX2kyXTtcblxuICAgIGlmIChfY2hpbGQudHlwZSA9PT0gXCJrZXJuXCIpIHtcbiAgICAgIGN1cnJQb3MgKz0gX2NoaWxkLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfZWxlbSA9IF9jaGlsZC5lbGVtO1xuICAgICAgdmFyIGNsYXNzZXMgPSBfY2hpbGQud3JhcHBlckNsYXNzZXMgfHwgW107XG4gICAgICB2YXIgc3R5bGUgPSBfY2hpbGQud3JhcHBlclN0eWxlIHx8IHt9O1xuICAgICAgdmFyIGNoaWxkV3JhcCA9IG1ha2VTcGFuKGNsYXNzZXMsIFtwc3RydXQsIF9lbGVtXSwgdW5kZWZpbmVkLCBzdHlsZSk7XG4gICAgICBjaGlsZFdyYXAuc3R5bGUudG9wID0gbWFrZUVtKC1wc3RydXRTaXplIC0gY3VyclBvcyAtIF9lbGVtLmRlcHRoKTtcblxuICAgICAgaWYgKF9jaGlsZC5tYXJnaW5MZWZ0KSB7XG4gICAgICAgIGNoaWxkV3JhcC5zdHlsZS5tYXJnaW5MZWZ0ID0gX2NoaWxkLm1hcmdpbkxlZnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChfY2hpbGQubWFyZ2luUmlnaHQpIHtcbiAgICAgICAgY2hpbGRXcmFwLnN0eWxlLm1hcmdpblJpZ2h0ID0gX2NoaWxkLm1hcmdpblJpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZWFsQ2hpbGRyZW4ucHVzaChjaGlsZFdyYXApO1xuICAgICAgY3VyclBvcyArPSBfZWxlbS5oZWlnaHQgKyBfZWxlbS5kZXB0aDtcbiAgICB9XG5cbiAgICBtaW5Qb3MgPSBNYXRoLm1pbihtaW5Qb3MsIGN1cnJQb3MpO1xuICAgIG1heFBvcyA9IE1hdGgubWF4KG1heFBvcywgY3VyclBvcyk7XG4gIH0gLy8gVGhlIHZsaXN0IGNvbnRlbnRzIGdvIGluIGEgdGFibGUtY2VsbCB3aXRoIGB2ZXJ0aWNhbC1hbGlnbjpib3R0b21gLlxuICAvLyBUaGlzIGNlbGwncyBib3R0b20gZWRnZSB3aWxsIGRldGVybWluZSB0aGUgY29udGFpbmluZyB0YWJsZSdzIGJhc2VsaW5lXG4gIC8vIHdpdGhvdXQgb3Zlcmx5IGV4cGFuZGluZyB0aGUgY29udGFpbmluZyBsaW5lLWJveC5cblxuXG4gIHZhciB2bGlzdCA9IG1ha2VTcGFuKFtcInZsaXN0XCJdLCByZWFsQ2hpbGRyZW4pO1xuICB2bGlzdC5zdHlsZS5oZWlnaHQgPSBtYWtlRW0obWF4UG9zKTsgLy8gQSBzZWNvbmQgcm93IGlzIHVzZWQgaWYgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgdmxpc3QncyBkZXB0aC5cblxuICB2YXIgcm93cztcblxuICBpZiAobWluUG9zIDwgMCkge1xuICAgIC8vIFdlIHdpbGwgZGVmaW5lIGRlcHRoIGluIGFuIGVtcHR5IHNwYW4gd2l0aCBkaXNwbGF5OiB0YWJsZS1jZWxsLlxuICAgIC8vIEl0IHNob3VsZCByZW5kZXIgd2l0aCB0aGUgaGVpZ2h0IHRoYXQgd2UgZGVmaW5lLiBCdXQgQ2hyb21lLCBpblxuICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBtb2RlIG9ubHksIHRyZWF0cyB0aGF0IHNwYW4gYXMgaWYgaXQgY29udGFpbnMgc29tZVxuICAgIC8vIHRleHQgY29udGVudC4gQW5kIHRoYXQgbWluLWhlaWdodCBvdmVyLXJpZGVzIG91ciBkZXNpcmVkIGhlaWdodC5cbiAgICAvLyBTbyB3ZSBwdXQgYW5vdGhlciBlbXB0eSBzcGFuIGluc2lkZSB0aGUgZGVwdGggc3RydXQgc3Bhbi5cbiAgICB2YXIgZW1wdHlTcGFuID0gbWFrZVNwYW4oW10sIFtdKTtcbiAgICB2YXIgZGVwdGhTdHJ1dCA9IG1ha2VTcGFuKFtcInZsaXN0XCJdLCBbZW1wdHlTcGFuXSk7XG4gICAgZGVwdGhTdHJ1dC5zdHlsZS5oZWlnaHQgPSBtYWtlRW0oLW1pblBvcyk7IC8vIFNhZmFyaSB3YW50cyB0aGUgZmlyc3Qgcm93IHRvIGhhdmUgaW5saW5lIGNvbnRlbnQ7IG90aGVyd2lzZSBpdFxuICAgIC8vIHB1dHMgdGhlIGJvdHRvbSBvZiB0aGUgKnNlY29uZCogcm93IG9uIHRoZSBiYXNlbGluZS5cblxuICAgIHZhciB0b3BTdHJ1dCA9IG1ha2VTcGFuKFtcInZsaXN0LXNcIl0sIFtuZXcgU3ltYm9sTm9kZShcIlxcdTIwMEJcIildKTtcbiAgICByb3dzID0gW21ha2VTcGFuKFtcInZsaXN0LXJcIl0sIFt2bGlzdCwgdG9wU3RydXRdKSwgbWFrZVNwYW4oW1widmxpc3QtclwiXSwgW2RlcHRoU3RydXRdKV07XG4gIH0gZWxzZSB7XG4gICAgcm93cyA9IFttYWtlU3BhbihbXCJ2bGlzdC1yXCJdLCBbdmxpc3RdKV07XG4gIH1cblxuICB2YXIgdnRhYmxlID0gbWFrZVNwYW4oW1widmxpc3QtdFwiXSwgcm93cyk7XG5cbiAgaWYgKHJvd3MubGVuZ3RoID09PSAyKSB7XG4gICAgdnRhYmxlLmNsYXNzZXMucHVzaChcInZsaXN0LXQyXCIpO1xuICB9XG5cbiAgdnRhYmxlLmhlaWdodCA9IG1heFBvcztcbiAgdnRhYmxlLmRlcHRoID0gLW1pblBvcztcbiAgcmV0dXJuIHZ0YWJsZTtcbn07IC8vIEdsdWUgaXMgYSBjb25jZXB0IGZyb20gVGVYIHdoaWNoIGlzIGEgZmxleGlibGUgc3BhY2UgYmV0d2VlbiBlbGVtZW50cyBpblxuLy8gZWl0aGVyIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBsaXN0LiBJbiBLYVRlWCwgYXQgbGVhc3QgZm9yIG5vdywgaXQnc1xuLy8gc3RhdGljIHNwYWNlIGJldHdlZW4gZWxlbWVudHMgaW4gYSBob3Jpem9udGFsIGxheW91dC5cblxuXG52YXIgbWFrZUdsdWUgPSBmdW5jdGlvbiBtYWtlR2x1ZShtZWFzdXJlbWVudCwgb3B0aW9ucykge1xuICAvLyBNYWtlIGFuIGVtcHR5IHNwYW4gZm9yIHRoZSBzcGFjZVxuICB2YXIgcnVsZSA9IG1ha2VTcGFuKFtcIm1zcGFjZVwiXSwgW10sIG9wdGlvbnMpO1xuICB2YXIgc2l6ZSA9IGNhbGN1bGF0ZVNpemUobWVhc3VyZW1lbnQsIG9wdGlvbnMpO1xuICBydWxlLnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFrZUVtKHNpemUpO1xuICByZXR1cm4gcnVsZTtcbn07IC8vIFRha2VzIGZvbnQgb3B0aW9ucywgYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGZvbnRMb29rdXAgbmFtZVxuXG5cbnZhciByZXRyaWV2ZVRleHRGb250TmFtZSA9IGZ1bmN0aW9uIHJldHJpZXZlVGV4dEZvbnROYW1lKGZvbnRGYW1pbHksIGZvbnRXZWlnaHQsIGZvbnRTaGFwZSkge1xuICB2YXIgYmFzZUZvbnROYW1lID0gXCJcIjtcblxuICBzd2l0Y2ggKGZvbnRGYW1pbHkpIHtcbiAgICBjYXNlIFwiYW1zcm1cIjpcbiAgICAgIGJhc2VGb250TmFtZSA9IFwiQU1TXCI7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJ0ZXh0cm1cIjpcbiAgICAgIGJhc2VGb250TmFtZSA9IFwiTWFpblwiO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwidGV4dHNmXCI6XG4gICAgICBiYXNlRm9udE5hbWUgPSBcIlNhbnNTZXJpZlwiO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwidGV4dHR0XCI6XG4gICAgICBiYXNlRm9udE5hbWUgPSBcIlR5cGV3cml0ZXJcIjtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJhc2VGb250TmFtZSA9IGZvbnRGYW1pbHk7XG4gICAgLy8gdXNlIGZvbnRzIGFkZGVkIGJ5IGEgcGx1Z2luXG4gIH1cblxuICB2YXIgZm9udFN0eWxlc05hbWU7XG5cbiAgaWYgKGZvbnRXZWlnaHQgPT09IFwidGV4dGJmXCIgJiYgZm9udFNoYXBlID09PSBcInRleHRpdFwiKSB7XG4gICAgZm9udFN0eWxlc05hbWUgPSBcIkJvbGRJdGFsaWNcIjtcbiAgfSBlbHNlIGlmIChmb250V2VpZ2h0ID09PSBcInRleHRiZlwiKSB7XG4gICAgZm9udFN0eWxlc05hbWUgPSBcIkJvbGRcIjtcbiAgfSBlbHNlIGlmIChmb250V2VpZ2h0ID09PSBcInRleHRpdFwiKSB7XG4gICAgZm9udFN0eWxlc05hbWUgPSBcIkl0YWxpY1wiO1xuICB9IGVsc2Uge1xuICAgIGZvbnRTdHlsZXNOYW1lID0gXCJSZWd1bGFyXCI7XG4gIH1cblxuICByZXR1cm4gYmFzZUZvbnROYW1lICsgXCItXCIgKyBmb250U3R5bGVzTmFtZTtcbn07XG4vKipcbiAqIE1hcHMgVGVYIGZvbnQgY29tbWFuZHMgdG8gb2JqZWN0cyBjb250YWluaW5nOlxuICogLSB2YXJpYW50OiBzdHJpbmcgdXNlZCBmb3IgXCJtYXRodmFyaWFudFwiIGF0dHJpYnV0ZSBpbiBidWlsZE1hdGhNTC5qc1xuICogLSBmb250TmFtZTogdGhlIFwic3R5bGVcIiBwYXJhbWV0ZXIgdG8gZm9udE1ldHJpY3MuZ2V0Q2hhcmFjdGVyTWV0cmljc1xuICovXG4vLyBBIG1hcCBiZXR3ZWVuIHRleCBmb250IGNvbW1hbmRzIGFuIE1hdGhNTCBtYXRodmFyaWFudCBhdHRyaWJ1dGUgdmFsdWVzXG5cblxudmFyIGZvbnRNYXAgPSB7XG4gIC8vIHN0eWxlc1xuICBcIm1hdGhiZlwiOiB7XG4gICAgdmFyaWFudDogXCJib2xkXCIsXG4gICAgZm9udE5hbWU6IFwiTWFpbi1Cb2xkXCJcbiAgfSxcbiAgXCJtYXRocm1cIjoge1xuICAgIHZhcmlhbnQ6IFwibm9ybWFsXCIsXG4gICAgZm9udE5hbWU6IFwiTWFpbi1SZWd1bGFyXCJcbiAgfSxcbiAgXCJ0ZXh0aXRcIjoge1xuICAgIHZhcmlhbnQ6IFwiaXRhbGljXCIsXG4gICAgZm9udE5hbWU6IFwiTWFpbi1JdGFsaWNcIlxuICB9LFxuICBcIm1hdGhpdFwiOiB7XG4gICAgdmFyaWFudDogXCJpdGFsaWNcIixcbiAgICBmb250TmFtZTogXCJNYWluLUl0YWxpY1wiXG4gIH0sXG4gIFwibWF0aG5vcm1hbFwiOiB7XG4gICAgdmFyaWFudDogXCJpdGFsaWNcIixcbiAgICBmb250TmFtZTogXCJNYXRoLUl0YWxpY1wiXG4gIH0sXG4gIC8vIFwiYm9sZHN5bWJvbFwiIGlzIG1pc3NpbmcgYmVjYXVzZSB0aGV5IHJlcXVpcmUgdGhlIHVzZSBvZiBtdWx0aXBsZSBmb250czpcbiAgLy8gTWF0aC1Cb2xkSXRhbGljIGFuZCBNYWluLUJvbGQuICBUaGlzIGlzIGhhbmRsZWQgYnkgYSBzcGVjaWFsIGNhc2UgaW5cbiAgLy8gbWFrZU9yZCB3aGljaCBlbmRzIHVwIGNhbGxpbmcgYm9sZHN5bWJvbC5cbiAgLy8gZmFtaWxpZXNcbiAgXCJtYXRoYmJcIjoge1xuICAgIHZhcmlhbnQ6IFwiZG91YmxlLXN0cnVja1wiLFxuICAgIGZvbnROYW1lOiBcIkFNUy1SZWd1bGFyXCJcbiAgfSxcbiAgXCJtYXRoY2FsXCI6IHtcbiAgICB2YXJpYW50OiBcInNjcmlwdFwiLFxuICAgIGZvbnROYW1lOiBcIkNhbGlncmFwaGljLVJlZ3VsYXJcIlxuICB9LFxuICBcIm1hdGhmcmFrXCI6IHtcbiAgICB2YXJpYW50OiBcImZyYWt0dXJcIixcbiAgICBmb250TmFtZTogXCJGcmFrdHVyLVJlZ3VsYXJcIlxuICB9LFxuICBcIm1hdGhzY3JcIjoge1xuICAgIHZhcmlhbnQ6IFwic2NyaXB0XCIsXG4gICAgZm9udE5hbWU6IFwiU2NyaXB0LVJlZ3VsYXJcIlxuICB9LFxuICBcIm1hdGhzZlwiOiB7XG4gICAgdmFyaWFudDogXCJzYW5zLXNlcmlmXCIsXG4gICAgZm9udE5hbWU6IFwiU2Fuc1NlcmlmLVJlZ3VsYXJcIlxuICB9LFxuICBcIm1hdGh0dFwiOiB7XG4gICAgdmFyaWFudDogXCJtb25vc3BhY2VcIixcbiAgICBmb250TmFtZTogXCJUeXBld3JpdGVyLVJlZ3VsYXJcIlxuICB9XG59O1xudmFyIHN2Z0RhdGEgPSB7XG4gIC8vICAgcGF0aCwgd2lkdGgsIGhlaWdodFxuICB2ZWM6IFtcInZlY1wiLCAwLjQ3MSwgMC43MTRdLFxuICAvLyB2YWx1ZXMgZnJvbSB0aGUgZm9udCBnbHlwaFxuICBvaWludFNpemUxOiBbXCJvaWludFNpemUxXCIsIDAuOTU3LCAwLjQ5OV0sXG4gIC8vIG92YWwgdG8gb3ZlcmxheSB0aGUgaW50ZWdyYW5kXG4gIG9paW50U2l6ZTI6IFtcIm9paW50U2l6ZTJcIiwgMS40NzIsIDAuNjU5XSxcbiAgb2lpaW50U2l6ZTE6IFtcIm9paWludFNpemUxXCIsIDEuMzA0LCAwLjQ5OV0sXG4gIG9paWludFNpemUyOiBbXCJvaWlpbnRTaXplMlwiLCAxLjk4LCAwLjY1OV1cbn07XG5cbnZhciBzdGF0aWNTdmcgPSBmdW5jdGlvbiBzdGF0aWNTdmcodmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gQ3JlYXRlIGEgc3BhbiB3aXRoIGlubGluZSBTVkcgZm9yIHRoZSBlbGVtZW50LlxuICB2YXIgX3N2Z0RhdGEkdmFsdWUgPSBzdmdEYXRhW3ZhbHVlXSxcbiAgICAgIHBhdGhOYW1lID0gX3N2Z0RhdGEkdmFsdWVbMF0sXG4gICAgICB3aWR0aCA9IF9zdmdEYXRhJHZhbHVlWzFdLFxuICAgICAgaGVpZ2h0ID0gX3N2Z0RhdGEkdmFsdWVbMl07XG4gIHZhciBwYXRoID0gbmV3IFBhdGhOb2RlKHBhdGhOYW1lKTtcbiAgdmFyIHN2Z05vZGUgPSBuZXcgU3ZnTm9kZShbcGF0aF0sIHtcbiAgICBcIndpZHRoXCI6IG1ha2VFbSh3aWR0aCksXG4gICAgXCJoZWlnaHRcIjogbWFrZUVtKGhlaWdodCksXG4gICAgLy8gT3ZlcnJpZGUgQ1NTIHJ1bGUgYC5rYXRleCBzdmcgeyB3aWR0aDogMTAwJSB9YFxuICAgIFwic3R5bGVcIjogXCJ3aWR0aDpcIiArIG1ha2VFbSh3aWR0aCksXG4gICAgXCJ2aWV3Qm94XCI6IFwiMCAwIFwiICsgMTAwMCAqIHdpZHRoICsgXCIgXCIgKyAxMDAwICogaGVpZ2h0LFxuICAgIFwicHJlc2VydmVBc3BlY3RSYXRpb1wiOiBcInhNaW5ZTWluXCJcbiAgfSk7XG4gIHZhciBzcGFuID0gbWFrZVN2Z1NwYW4oW1wib3ZlcmxheVwiXSwgW3N2Z05vZGVdLCBvcHRpb25zKTtcbiAgc3Bhbi5oZWlnaHQgPSBoZWlnaHQ7XG4gIHNwYW4uc3R5bGUuaGVpZ2h0ID0gbWFrZUVtKGhlaWdodCk7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBtYWtlRW0od2lkdGgpO1xuICByZXR1cm4gc3Bhbjtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIGJ1aWxkQ29tbW9uID0gKHtcbiAgZm9udE1hcDogZm9udE1hcCxcbiAgbWFrZVN5bWJvbDogbWFrZVN5bWJvbCxcbiAgbWF0aHN5bTogbWF0aHN5bSxcbiAgbWFrZVNwYW46IG1ha2VTcGFuLFxuICBtYWtlU3ZnU3BhbjogbWFrZVN2Z1NwYW4sXG4gIG1ha2VMaW5lU3BhbjogbWFrZUxpbmVTcGFuLFxuICBtYWtlQW5jaG9yOiBtYWtlQW5jaG9yLFxuICBtYWtlRnJhZ21lbnQ6IG1ha2VGcmFnbWVudCxcbiAgd3JhcEZyYWdtZW50OiB3cmFwRnJhZ21lbnQsXG4gIG1ha2VWTGlzdDogbWFrZVZMaXN0LFxuICBtYWtlT3JkOiBtYWtlT3JkLFxuICBtYWtlR2x1ZTogbWFrZUdsdWUsXG4gIHN0YXRpY1N2Zzogc3RhdGljU3ZnLFxuICBzdmdEYXRhOiBzdmdEYXRhLFxuICB0cnlDb21iaW5lQ2hhcnM6IHRyeUNvbWJpbmVDaGFyc1xufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc3BhY2luZ0RhdGEuanNcbi8qKlxuICogRGVzY3JpYmVzIHNwYWNlcyBiZXR3ZWVuIGRpZmZlcmVudCBjbGFzc2VzIG9mIGF0b21zLlxuICovXG52YXIgdGhpbnNwYWNlID0ge1xuICBudW1iZXI6IDMsXG4gIHVuaXQ6IFwibXVcIlxufTtcbnZhciBtZWRpdW1zcGFjZSA9IHtcbiAgbnVtYmVyOiA0LFxuICB1bml0OiBcIm11XCJcbn07XG52YXIgdGhpY2tzcGFjZSA9IHtcbiAgbnVtYmVyOiA1LFxuICB1bml0OiBcIm11XCJcbn07IC8vIE1ha2luZyB0aGUgdHlwZSBiZWxvdyBleGFjdCB3aXRoIGFsbCBvcHRpb25hbCBmaWVsZHMgZG9lc24ndCB3b3JrIGR1ZSB0b1xuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDU4MlxuLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNTY4OFxuLy8gSG93ZXZlciwgc2luY2UgKmFsbCogZmllbGRzIGFyZSBvcHRpb25hbCwgJFNoYXBlPD4gd29ya3MgYXMgc3VnZ2VzdGVkIGluIDU2ODhcbi8vIGFib3ZlLlxuXG4vLyBTcGFjaW5nIHJlbGF0aW9uc2hpcHMgZm9yIGRpc3BsYXkgYW5kIHRleHQgc3R5bGVzXG52YXIgc3BhY2luZ3MgPSB7XG4gIG1vcmQ6IHtcbiAgICBtb3A6IHRoaW5zcGFjZSxcbiAgICBtYmluOiBtZWRpdW1zcGFjZSxcbiAgICBtcmVsOiB0aGlja3NwYWNlLFxuICAgIG1pbm5lcjogdGhpbnNwYWNlXG4gIH0sXG4gIG1vcDoge1xuICAgIG1vcmQ6IHRoaW5zcGFjZSxcbiAgICBtb3A6IHRoaW5zcGFjZSxcbiAgICBtcmVsOiB0aGlja3NwYWNlLFxuICAgIG1pbm5lcjogdGhpbnNwYWNlXG4gIH0sXG4gIG1iaW46IHtcbiAgICBtb3JkOiBtZWRpdW1zcGFjZSxcbiAgICBtb3A6IG1lZGl1bXNwYWNlLFxuICAgIG1vcGVuOiBtZWRpdW1zcGFjZSxcbiAgICBtaW5uZXI6IG1lZGl1bXNwYWNlXG4gIH0sXG4gIG1yZWw6IHtcbiAgICBtb3JkOiB0aGlja3NwYWNlLFxuICAgIG1vcDogdGhpY2tzcGFjZSxcbiAgICBtb3BlbjogdGhpY2tzcGFjZSxcbiAgICBtaW5uZXI6IHRoaWNrc3BhY2VcbiAgfSxcbiAgbW9wZW46IHt9LFxuICBtY2xvc2U6IHtcbiAgICBtb3A6IHRoaW5zcGFjZSxcbiAgICBtYmluOiBtZWRpdW1zcGFjZSxcbiAgICBtcmVsOiB0aGlja3NwYWNlLFxuICAgIG1pbm5lcjogdGhpbnNwYWNlXG4gIH0sXG4gIG1wdW5jdDoge1xuICAgIG1vcmQ6IHRoaW5zcGFjZSxcbiAgICBtb3A6IHRoaW5zcGFjZSxcbiAgICBtcmVsOiB0aGlja3NwYWNlLFxuICAgIG1vcGVuOiB0aGluc3BhY2UsXG4gICAgbWNsb3NlOiB0aGluc3BhY2UsXG4gICAgbXB1bmN0OiB0aGluc3BhY2UsXG4gICAgbWlubmVyOiB0aGluc3BhY2VcbiAgfSxcbiAgbWlubmVyOiB7XG4gICAgbW9yZDogdGhpbnNwYWNlLFxuICAgIG1vcDogdGhpbnNwYWNlLFxuICAgIG1iaW46IG1lZGl1bXNwYWNlLFxuICAgIG1yZWw6IHRoaWNrc3BhY2UsXG4gICAgbW9wZW46IHRoaW5zcGFjZSxcbiAgICBtcHVuY3Q6IHRoaW5zcGFjZSxcbiAgICBtaW5uZXI6IHRoaW5zcGFjZVxuICB9XG59OyAvLyBTcGFjaW5nIHJlbGF0aW9uc2hpcHMgZm9yIHNjcmlwdCBhbmQgc2NyaXB0c2NyaXB0IHN0eWxlc1xuXG52YXIgdGlnaHRTcGFjaW5ncyA9IHtcbiAgbW9yZDoge1xuICAgIG1vcDogdGhpbnNwYWNlXG4gIH0sXG4gIG1vcDoge1xuICAgIG1vcmQ6IHRoaW5zcGFjZSxcbiAgICBtb3A6IHRoaW5zcGFjZVxuICB9LFxuICBtYmluOiB7fSxcbiAgbXJlbDoge30sXG4gIG1vcGVuOiB7fSxcbiAgbWNsb3NlOiB7XG4gICAgbW9wOiB0aGluc3BhY2VcbiAgfSxcbiAgbXB1bmN0OiB7fSxcbiAgbWlubmVyOiB7XG4gICAgbW9wOiB0aGluc3BhY2VcbiAgfVxufTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kZWZpbmVGdW5jdGlvbi5qc1xuLyoqIENvbnRleHQgcHJvdmlkZWQgdG8gZnVuY3Rpb24gaGFuZGxlcnMgZm9yIGVycm9yIG1lc3NhZ2VzLiAqL1xuLy8gTm90ZTogcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHJldHVybiB0eXBlIHVuaW9uIHdpbGwgY2F1c2UgYSBmbG93IGVycm9yLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8zNjYzLlxuLy8gTW9yZSBnZW5lcmFsIHZlcnNpb24gb2YgYEh0bWxCdWlsZGVyYCBmb3Igbm9kZXMgKGUuZy4gXFxzdW0sIGFjY2VudCB0eXBlcylcbi8vIHdob3NlIHByZXNlbmNlIGltcGFjdHMgc3VwZXIvc3Vic2NyaXB0aW5nLiBJbiB0aGlzIGNhc2UsIFBhcnNlTm9kZTxcInN1cHN1YlwiPlxuLy8gZGVsZWdhdGVzIGl0cyBIVE1MIGJ1aWxkaW5nIHRvIHRoZSBIdG1sQnVpbGRlciBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIG5vZGVzLlxuXG4vKipcbiAqIEZpbmFsIGZ1bmN0aW9uIHNwZWMgZm9yIHVzZSBhdCBwYXJzZSB0aW1lLlxuICogVGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGBGdW5jdGlvblByb3BTcGVjYCwgZXhjZXB0IGl0XG4gKiAxLiBpbmNsdWRlcyB0aGUgZnVuY3Rpb24gaGFuZGxlciwgYW5kXG4gKiAyLiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGV4Y2VwdCBhcmdUeXBlcy5cbiAqIEl0IGlzIGdlbmVyYXRlZCBieSBgZGVmaW5lRnVuY3Rpb24oKWAgYmVsb3cuXG4gKi9cblxuLyoqXG4gKiBBbGwgcmVnaXN0ZXJlZCBmdW5jdGlvbnMuXG4gKiBgZnVuY3Rpb25zLmpzYCBqdXN0IGV4cG9ydHMgdGhpcyBzYW1lIGRpY3Rpb25hcnkgYWdhaW4gYW5kIG1ha2VzIGl0IHB1YmxpYy5cbiAqIGBQYXJzZXIuanNgIHJlcXVpcmVzIHRoaXMgZGljdGlvbmFyeS5cbiAqL1xudmFyIF9mdW5jdGlvbnMgPSB7fTtcbi8qKlxuICogQWxsIEhUTUwgYnVpbGRlcnMuIFNob3VsZCBiZSBvbmx5IHVzZWQgaW4gdGhlIGBkZWZpbmUqYCBhbmQgdGhlIGBidWlsZCpNTGBcbiAqIGZ1bmN0aW9ucy5cbiAqL1xuXG52YXIgX2h0bWxHcm91cEJ1aWxkZXJzID0ge307XG4vKipcbiAqIEFsbCBNYXRoTUwgYnVpbGRlcnMuIFNob3VsZCBiZSBvbmx5IHVzZWQgaW4gdGhlIGBkZWZpbmUqYCBhbmQgdGhlIGBidWlsZCpNTGBcbiAqIGZ1bmN0aW9ucy5cbiAqL1xuXG52YXIgX21hdGhtbEdyb3VwQnVpbGRlcnMgPSB7fTtcbmZ1bmN0aW9uIGRlZmluZUZ1bmN0aW9uKF9yZWYpIHtcbiAgdmFyIHR5cGUgPSBfcmVmLnR5cGUsXG4gICAgICBuYW1lcyA9IF9yZWYubmFtZXMsXG4gICAgICBwcm9wcyA9IF9yZWYucHJvcHMsXG4gICAgICBoYW5kbGVyID0gX3JlZi5oYW5kbGVyLFxuICAgICAgaHRtbEJ1aWxkZXIgPSBfcmVmLmh0bWxCdWlsZGVyLFxuICAgICAgbWF0aG1sQnVpbGRlciA9IF9yZWYubWF0aG1sQnVpbGRlcjtcbiAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIG9mIGZ1bmN0aW9uc1xuICB2YXIgZGF0YSA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIG51bUFyZ3M6IHByb3BzLm51bUFyZ3MsXG4gICAgYXJnVHlwZXM6IHByb3BzLmFyZ1R5cGVzLFxuICAgIGFsbG93ZWRJbkFyZ3VtZW50OiAhIXByb3BzLmFsbG93ZWRJbkFyZ3VtZW50LFxuICAgIGFsbG93ZWRJblRleHQ6ICEhcHJvcHMuYWxsb3dlZEluVGV4dCxcbiAgICBhbGxvd2VkSW5NYXRoOiBwcm9wcy5hbGxvd2VkSW5NYXRoID09PSB1bmRlZmluZWQgPyB0cnVlIDogcHJvcHMuYWxsb3dlZEluTWF0aCxcbiAgICBudW1PcHRpb25hbEFyZ3M6IHByb3BzLm51bU9wdGlvbmFsQXJncyB8fCAwLFxuICAgIGluZml4OiAhIXByb3BzLmluZml4LFxuICAgIHByaW1pdGl2ZTogISFwcm9wcy5wcmltaXRpdmUsXG4gICAgaGFuZGxlcjogaGFuZGxlclxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICBfZnVuY3Rpb25zW25hbWVzW2ldXSA9IGRhdGE7XG4gIH1cblxuICBpZiAodHlwZSkge1xuICAgIGlmIChodG1sQnVpbGRlcikge1xuICAgICAgX2h0bWxHcm91cEJ1aWxkZXJzW3R5cGVdID0gaHRtbEJ1aWxkZXI7XG4gICAgfVxuXG4gICAgaWYgKG1hdGhtbEJ1aWxkZXIpIHtcbiAgICAgIF9tYXRobWxHcm91cEJ1aWxkZXJzW3R5cGVdID0gbWF0aG1sQnVpbGRlcjtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogVXNlIHRoaXMgdG8gcmVnaXN0ZXIgb25seSB0aGUgSFRNTCBhbmQgTWF0aE1MIGJ1aWxkZXJzIGZvciBhIGZ1bmN0aW9uIChlLmcuXG4gKiBpZiB0aGUgZnVuY3Rpb24ncyBQYXJzZU5vZGUgaXMgZ2VuZXJhdGVkIGluIFBhcnNlci5qcyByYXRoZXIgdGhhbiB2aWEgYVxuICogc3RhbmQtYWxvbmUgaGFuZGxlciBwcm92aWRlZCB0byBgZGVmaW5lRnVuY3Rpb25gKS5cbiAqL1xuXG5mdW5jdGlvbiBkZWZpbmVGdW5jdGlvbkJ1aWxkZXJzKF9yZWYyKSB7XG4gIHZhciB0eXBlID0gX3JlZjIudHlwZSxcbiAgICAgIGh0bWxCdWlsZGVyID0gX3JlZjIuaHRtbEJ1aWxkZXIsXG4gICAgICBtYXRobWxCdWlsZGVyID0gX3JlZjIubWF0aG1sQnVpbGRlcjtcbiAgZGVmaW5lRnVuY3Rpb24oe1xuICAgIHR5cGU6IHR5cGUsXG4gICAgbmFtZXM6IFtdLFxuICAgIHByb3BzOiB7XG4gICAgICBudW1BcmdzOiAwXG4gICAgfSxcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgYmUgY2FsbGVkLicpO1xuICAgIH0sXG4gICAgaHRtbEJ1aWxkZXI6IGh0bWxCdWlsZGVyLFxuICAgIG1hdGhtbEJ1aWxkZXI6IG1hdGhtbEJ1aWxkZXJcbiAgfSk7XG59XG52YXIgbm9ybWFsaXplQXJndW1lbnQgPSBmdW5jdGlvbiBub3JtYWxpemVBcmd1bWVudChhcmcpIHtcbiAgcmV0dXJuIGFyZy50eXBlID09PSBcIm9yZGdyb3VwXCIgJiYgYXJnLmJvZHkubGVuZ3RoID09PSAxID8gYXJnLmJvZHlbMF0gOiBhcmc7XG59OyAvLyBTaW5jZSB0aGUgY29ycmVzcG9uZGluZyBidWlsZEhUTUwvYnVpbGRNYXRoTUwgZnVuY3Rpb24gZXhwZWN0cyBhXG4vLyBsaXN0IG9mIGVsZW1lbnRzLCB3ZSBub3JtYWxpemUgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBhcmd1bWVudHNcblxudmFyIG9yZGFyZ3VtZW50ID0gZnVuY3Rpb24gb3JkYXJndW1lbnQoYXJnKSB7XG4gIHJldHVybiBhcmcudHlwZSA9PT0gXCJvcmRncm91cFwiID8gYXJnLmJvZHkgOiBbYXJnXTtcbn07XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYnVpbGRIVE1MLmpzXG4vKipcbiAqIFRoaXMgZmlsZSBkb2VzIHRoZSBtYWluIHdvcmsgb2YgYnVpbGRpbmcgYSBkb21UcmVlIHN0cnVjdHVyZSBmcm9tIGEgcGFyc2VcbiAqIHRyZWUuIFRoZSBlbnRyeSBwb2ludCBpcyB0aGUgYGJ1aWxkSFRNTGAgZnVuY3Rpb24sIHdoaWNoIHRha2VzIGEgcGFyc2UgdHJlZS5cbiAqIFRoZW4sIHRoZSBidWlsZEV4cHJlc3Npb24sIGJ1aWxkR3JvdXAsIGFuZCB2YXJpb3VzIGdyb3VwQnVpbGRlcnMgZnVuY3Rpb25zXG4gKiBhcmUgY2FsbGVkLCB0byBwcm9kdWNlIGEgZmluYWwgSFRNTCB0cmVlLlxuICovXG5cblxuXG5cblxuXG5cblxuXG52YXIgYnVpbGRIVE1MX21ha2VTcGFuID0gYnVpbGRDb21tb24ubWFrZVNwYW47IC8vIEJpbmFyeSBhdG9tcyAoZmlyc3QgY2xhc3MgYG1iaW5gKSBjaGFuZ2UgaW50byBvcmRpbmFyeSBhdG9tcyAoYG1vcmRgKVxuLy8gZGVwZW5kaW5nIG9uIHRoZWlyIHN1cnJvdW5kaW5ncy4gU2VlIFRlWGJvb2sgcGcuIDQ0Mi00NDYsIFJ1bGVzIDUgYW5kIDYsXG4vLyBhbmQgdGhlIHRleHQgYmVmb3JlIFJ1bGUgMTkuXG5cbnZhciBiaW5MZWZ0Q2FuY2VsbGVyID0gW1wibGVmdG1vc3RcIiwgXCJtYmluXCIsIFwibW9wZW5cIiwgXCJtcmVsXCIsIFwibW9wXCIsIFwibXB1bmN0XCJdO1xudmFyIGJpblJpZ2h0Q2FuY2VsbGVyID0gW1wicmlnaHRtb3N0XCIsIFwibXJlbFwiLCBcIm1jbG9zZVwiLCBcIm1wdW5jdFwiXTtcbnZhciBzdHlsZU1hcCA9IHtcbiAgXCJkaXNwbGF5XCI6IHNyY19TdHlsZS5ESVNQTEFZLFxuICBcInRleHRcIjogc3JjX1N0eWxlLlRFWFQsXG4gIFwic2NyaXB0XCI6IHNyY19TdHlsZS5TQ1JJUFQsXG4gIFwic2NyaXB0c2NyaXB0XCI6IHNyY19TdHlsZS5TQ1JJUFRTQ1JJUFRcbn07XG52YXIgRG9tRW51bSA9IHtcbiAgbW9yZDogXCJtb3JkXCIsXG4gIG1vcDogXCJtb3BcIixcbiAgbWJpbjogXCJtYmluXCIsXG4gIG1yZWw6IFwibXJlbFwiLFxuICBtb3BlbjogXCJtb3BlblwiLFxuICBtY2xvc2U6IFwibWNsb3NlXCIsXG4gIG1wdW5jdDogXCJtcHVuY3RcIixcbiAgbWlubmVyOiBcIm1pbm5lclwiXG59O1xuXG4vKipcbiAqIFRha2UgYSBsaXN0IG9mIG5vZGVzLCBidWlsZCB0aGVtIGluIG9yZGVyLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGUgYnVpbHRcbiAqIG5vZGVzLiBkb2N1bWVudEZyYWdtZW50cyBhcmUgZmxhdHRlbmVkIGludG8gdGhlaXIgY29udGVudHMsIHNvIHRoZVxuICogcmV0dXJuZWQgbGlzdCBjb250YWlucyBubyBmcmFnbWVudHMuIGBpc1JlYWxHcm91cGAgaXMgdHJ1ZSBpZiBgZXhwcmVzc2lvbmBcbiAqIGlzIGEgcmVhbCBncm91cCAobm8gYXRvbXMgd2lsbCBiZSBhZGRlZCBvbiBlaXRoZXIgc2lkZSksIGFzIG9wcG9zZWQgdG9cbiAqIGEgcGFydGlhbCBncm91cCAoZS5nLiBvbmUgY3JlYXRlZCBieSBcXGNvbG9yKS4gYHN1cnJvdW5kaW5nYCBpcyBhbiBhcnJheVxuICogY29uc2lzdGluZyB0eXBlIG9mIG5vZGVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbGVmdCBhbmQgcmlnaHQuXG4gKi9cbnZhciBidWlsZEV4cHJlc3Npb24gPSBmdW5jdGlvbiBidWlsZEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgb3B0aW9ucywgaXNSZWFsR3JvdXAsIHN1cnJvdW5kaW5nKSB7XG4gIGlmIChzdXJyb3VuZGluZyA9PT0gdm9pZCAwKSB7XG4gICAgc3Vycm91bmRpbmcgPSBbbnVsbCwgbnVsbF07XG4gIH1cblxuICAvLyBQYXJzZSBleHByZXNzaW9ucyBpbnRvIGBncm91cHNgLlxuICB2YXIgZ3JvdXBzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG91dHB1dCA9IGJ1aWxkR3JvdXAoZXhwcmVzc2lvbltpXSwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3V0cHV0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gb3V0cHV0LmNoaWxkcmVuO1xuICAgICAgZ3JvdXBzLnB1c2guYXBwbHkoZ3JvdXBzLCBjaGlsZHJlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3Vwcy5wdXNoKG91dHB1dCk7XG4gICAgfVxuICB9IC8vIENvbWJpbmUgY29uc2VjdXRpdmUgZG9tVHJlZS5zeW1ib2xOb2RlcyBpbnRvIGEgc2luZ2xlIHN5bWJvbE5vZGUuXG5cblxuICBidWlsZENvbW1vbi50cnlDb21iaW5lQ2hhcnMoZ3JvdXBzKTsgLy8gSWYgYGV4cHJlc3Npb25gIGlzIGEgcGFydGlhbCBncm91cCwgbGV0IHRoZSBwYXJlbnQgaGFuZGxlIHNwYWNpbmdzXG4gIC8vIHRvIGF2b2lkIHByb2Nlc3NpbmcgZ3JvdXBzIG11bHRpcGxlIHRpbWVzLlxuXG4gIGlmICghaXNSZWFsR3JvdXApIHtcbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG5cbiAgdmFyIGdsdWVPcHRpb25zID0gb3B0aW9ucztcblxuICBpZiAoZXhwcmVzc2lvbi5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgbm9kZSA9IGV4cHJlc3Npb25bMF07XG5cbiAgICBpZiAobm9kZS50eXBlID09PSBcInNpemluZ1wiKSB7XG4gICAgICBnbHVlT3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nU2l6ZShub2RlLnNpemUpO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBcInN0eWxpbmdcIikge1xuICAgICAgZ2x1ZU9wdGlvbnMgPSBvcHRpb25zLmhhdmluZ1N0eWxlKHN0eWxlTWFwW25vZGUuc3R5bGVdKTtcbiAgICB9XG4gIH0gLy8gRHVtbXkgc3BhbnMgZm9yIGRldGVybWluaW5nIHNwYWNpbmdzIGJldHdlZW4gc3Vycm91bmRpbmcgYXRvbXMuXG4gIC8vIElmIGBleHByZXNzaW9uYCBoYXMgbm8gYXRvbXMgb24gdGhlIGxlZnQgb3IgcmlnaHQsIGNsYXNzIFwibGVmdG1vc3RcIlxuICAvLyBvciBcInJpZ2h0bW9zdFwiLCByZXNwZWN0aXZlbHksIGlzIHVzZWQgdG8gaW5kaWNhdGUgaXQuXG5cblxuICB2YXIgZHVtbXlQcmV2ID0gYnVpbGRIVE1MX21ha2VTcGFuKFtzdXJyb3VuZGluZ1swXSB8fCBcImxlZnRtb3N0XCJdLCBbXSwgb3B0aW9ucyk7XG4gIHZhciBkdW1teU5leHQgPSBidWlsZEhUTUxfbWFrZVNwYW4oW3N1cnJvdW5kaW5nWzFdIHx8IFwicmlnaHRtb3N0XCJdLCBbXSwgb3B0aW9ucyk7IC8vIFRPRE86IFRoZXNlIGNvZGUgYXNzdW1lcyB0aGF0IGEgbm9kZSdzIG1hdGggY2xhc3MgaXMgdGhlIGZpcnN0IGVsZW1lbnRcbiAgLy8gb2YgaXRzIGBjbGFzc2VzYCBhcnJheS4gQSBsYXRlciBjbGVhbnVwIHNob3VsZCBlbnN1cmUgdGhpcywgZm9yXG4gIC8vIGluc3RhbmNlIGJ5IGNoYW5naW5nIHRoZSBzaWduYXR1cmUgb2YgYG1ha2VTcGFuYC5cbiAgLy8gQmVmb3JlIGRldGVybWluaW5nIHdoYXQgc3BhY2VzIHRvIGluc2VydCwgcGVyZm9ybSBiaW4gY2FuY2VsbGF0aW9uLlxuICAvLyBCaW5hcnkgb3BlcmF0b3JzIGNoYW5nZSB0byBvcmRpbmFyeSBzeW1ib2xzIGluIHNvbWUgY29udGV4dHMuXG5cbiAgdmFyIGlzUm9vdCA9IGlzUmVhbEdyb3VwID09PSBcInJvb3RcIjtcbiAgdHJhdmVyc2VOb25TcGFjZU5vZGVzKGdyb3VwcywgZnVuY3Rpb24gKG5vZGUsIHByZXYpIHtcbiAgICB2YXIgcHJldlR5cGUgPSBwcmV2LmNsYXNzZXNbMF07XG4gICAgdmFyIHR5cGUgPSBub2RlLmNsYXNzZXNbMF07XG5cbiAgICBpZiAocHJldlR5cGUgPT09IFwibWJpblwiICYmIHV0aWxzLmNvbnRhaW5zKGJpblJpZ2h0Q2FuY2VsbGVyLCB0eXBlKSkge1xuICAgICAgcHJldi5jbGFzc2VzWzBdID0gXCJtb3JkXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcIm1iaW5cIiAmJiB1dGlscy5jb250YWlucyhiaW5MZWZ0Q2FuY2VsbGVyLCBwcmV2VHlwZSkpIHtcbiAgICAgIG5vZGUuY2xhc3Nlc1swXSA9IFwibW9yZFwiO1xuICAgIH1cbiAgfSwge1xuICAgIG5vZGU6IGR1bW15UHJldlxuICB9LCBkdW1teU5leHQsIGlzUm9vdCk7XG4gIHRyYXZlcnNlTm9uU3BhY2VOb2Rlcyhncm91cHMsIGZ1bmN0aW9uIChub2RlLCBwcmV2KSB7XG4gICAgdmFyIHByZXZUeXBlID0gZ2V0VHlwZU9mRG9tVHJlZShwcmV2KTtcbiAgICB2YXIgdHlwZSA9IGdldFR5cGVPZkRvbVRyZWUobm9kZSk7IC8vICdtdGlnaHQnIGluZGljYXRlcyB0aGF0IHRoZSBub2RlIGlzIHNjcmlwdCBvciBzY3JpcHRzY3JpcHQgc3R5bGUuXG5cbiAgICB2YXIgc3BhY2UgPSBwcmV2VHlwZSAmJiB0eXBlID8gbm9kZS5oYXNDbGFzcyhcIm10aWdodFwiKSA/IHRpZ2h0U3BhY2luZ3NbcHJldlR5cGVdW3R5cGVdIDogc3BhY2luZ3NbcHJldlR5cGVdW3R5cGVdIDogbnVsbDtcblxuICAgIGlmIChzcGFjZSkge1xuICAgICAgLy8gSW5zZXJ0IGdsdWUgKHNwYWNpbmcpIGFmdGVyIHRoZSBgcHJldmAuXG4gICAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZUdsdWUoc3BhY2UsIGdsdWVPcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBub2RlOiBkdW1teVByZXZcbiAgfSwgZHVtbXlOZXh0LCBpc1Jvb3QpO1xuICByZXR1cm4gZ3JvdXBzO1xufTsgLy8gRGVwdGgtZmlyc3QgdHJhdmVyc2Ugbm9uLXNwYWNlIGBub2Rlc2AsIGNhbGxpbmcgYGNhbGxiYWNrYCB3aXRoIHRoZSBjdXJyZW50IGFuZFxuLy8gcHJldmlvdXMgbm9kZSBhcyBhcmd1bWVudHMsIG9wdGlvbmFsbHkgcmV0dXJuaW5nIGEgbm9kZSB0byBpbnNlcnQgYWZ0ZXIgdGhlXG4vLyBwcmV2aW91cyBub2RlLiBgcHJldmAgaXMgYW4gb2JqZWN0IHdpdGggdGhlIHByZXZpb3VzIG5vZGUgYW5kIGBpbnNlcnRBZnRlcmBcbi8vIGZ1bmN0aW9uIHRvIGluc2VydCBhZnRlciBpdC4gYG5leHRgIGlzIGEgbm9kZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJpZ2h0LlxuLy8gVXNlZCBmb3IgYmluIGNhbmNlbGxhdGlvbiBhbmQgaW5zZXJ0aW5nIHNwYWNpbmdzLlxuXG52YXIgdHJhdmVyc2VOb25TcGFjZU5vZGVzID0gZnVuY3Rpb24gdHJhdmVyc2VOb25TcGFjZU5vZGVzKG5vZGVzLCBjYWxsYmFjaywgcHJldiwgbmV4dCwgaXNSb290KSB7XG4gIGlmIChuZXh0KSB7XG4gICAgLy8gdGVtcG9yYXJpbHkgYXBwZW5kIHRoZSByaWdodCBub2RlLCBpZiBleGlzdHNcbiAgICBub2Rlcy5wdXNoKG5leHQpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBwYXJ0aWFsR3JvdXAgPSBjaGVja1BhcnRpYWxHcm91cChub2RlKTtcblxuICAgIGlmIChwYXJ0aWFsR3JvdXApIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZSBERlNcbiAgICAgIC8vICRGbG93Rml4TWU6IG1ha2Ugbm9kZXMgYSAkUmVhZE9ubHlBcnJheSBieSByZXR1cm5pbmcgYSBuZXcgYXJyYXlcbiAgICAgIHRyYXZlcnNlTm9uU3BhY2VOb2RlcyhwYXJ0aWFsR3JvdXAuY2hpbGRyZW4sIGNhbGxiYWNrLCBwcmV2LCBudWxsLCBpc1Jvb3QpO1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBJZ25vcmUgZXhwbGljaXQgc3BhY2VzIChlLmcuLCBcXDssIFxcLCkgd2hlbiBkZXRlcm1pbmluZyB3aGF0IGltcGxpY2l0XG4gICAgLy8gc3BhY2luZyBzaG91bGQgZ28gYmV0d2VlbiBhdG9tcyBvZiBkaWZmZXJlbnQgY2xhc3Nlc1xuXG5cbiAgICB2YXIgbm9uc3BhY2UgPSAhbm9kZS5oYXNDbGFzcyhcIm1zcGFjZVwiKTtcblxuICAgIGlmIChub25zcGFjZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKG5vZGUsIHByZXYubm9kZSk7XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHByZXYuaW5zZXJ0QWZ0ZXIpIHtcbiAgICAgICAgICBwcmV2Lmluc2VydEFmdGVyKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaW5zZXJ0IGF0IGZyb250XG4gICAgICAgICAgbm9kZXMudW5zaGlmdChyZXN1bHQpO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub25zcGFjZSkge1xuICAgICAgcHJldi5ub2RlID0gbm9kZTtcbiAgICB9IGVsc2UgaWYgKGlzUm9vdCAmJiBub2RlLmhhc0NsYXNzKFwibmV3bGluZVwiKSkge1xuICAgICAgcHJldi5ub2RlID0gYnVpbGRIVE1MX21ha2VTcGFuKFtcImxlZnRtb3N0XCJdKTsgLy8gdHJlYXQgbGlrZSBiZWdpbm5pbmcgb2YgbGluZVxuICAgIH1cblxuICAgIHByZXYuaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAobikge1xuICAgICAgICBub2Rlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBuKTtcbiAgICAgICAgaSsrO1xuICAgICAgfTtcbiAgICB9KGkpO1xuICB9XG5cbiAgaWYgKG5leHQpIHtcbiAgICBub2Rlcy5wb3AoKTtcbiAgfVxufTsgLy8gQ2hlY2sgaWYgZ2l2ZW4gbm9kZSBpcyBhIHBhcnRpYWwgZ3JvdXAsIGkuZS4sIGRvZXMgbm90IGFmZmVjdCBzcGFjaW5nIGFyb3VuZC5cblxuXG52YXIgY2hlY2tQYXJ0aWFsR3JvdXAgPSBmdW5jdGlvbiBjaGVja1BhcnRpYWxHcm91cChub2RlKSB7XG4gIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCB8fCBub2RlIGluc3RhbmNlb2YgQW5jaG9yIHx8IG5vZGUgaW5zdGFuY2VvZiBTcGFuICYmIG5vZGUuaGFzQ2xhc3MoXCJlbmNsb3NpbmdcIikpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTsgLy8gUmV0dXJuIHRoZSBvdXRlcm1vc3Qgbm9kZSBvZiBhIGRvbVRyZWUuXG5cblxudmFyIGdldE91dGVybW9zdE5vZGUgPSBmdW5jdGlvbiBnZXRPdXRlcm1vc3ROb2RlKG5vZGUsIHNpZGUpIHtcbiAgdmFyIHBhcnRpYWxHcm91cCA9IGNoZWNrUGFydGlhbEdyb3VwKG5vZGUpO1xuXG4gIGlmIChwYXJ0aWFsR3JvdXApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwYXJ0aWFsR3JvdXAuY2hpbGRyZW47XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBpZiAoc2lkZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIHJldHVybiBnZXRPdXRlcm1vc3ROb2RlKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLCBcInJpZ2h0XCIpO1xuICAgICAgfSBlbHNlIGlmIChzaWRlID09PSBcImxlZnRcIikge1xuICAgICAgICByZXR1cm4gZ2V0T3V0ZXJtb3N0Tm9kZShjaGlsZHJlblswXSwgXCJsZWZ0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufTsgLy8gUmV0dXJuIG1hdGggYXRvbSBjbGFzcyAobWNsYXNzKSBvZiBhIGRvbVRyZWUuXG4vLyBJZiBgc2lkZWAgaXMgZ2l2ZW4sIGl0IHdpbGwgZ2V0IHRoZSB0eXBlIG9mIHRoZSBvdXRlcm1vc3Qgbm9kZSBhdCBnaXZlbiBzaWRlLlxuXG5cbnZhciBnZXRUeXBlT2ZEb21UcmVlID0gZnVuY3Rpb24gZ2V0VHlwZU9mRG9tVHJlZShub2RlLCBzaWRlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHNpZGUpIHtcbiAgICBub2RlID0gZ2V0T3V0ZXJtb3N0Tm9kZShub2RlLCBzaWRlKTtcbiAgfSAvLyBUaGlzIG1ha2VzIGEgbG90IG9mIGFzc3VtcHRpb25zIGFzIHRvIHdoZXJlIHRoZSB0eXBlIG9mIGF0b21cbiAgLy8gYXBwZWFycy4gIFdlIHNob3VsZCBkbyBhIGJldHRlciBqb2Igb2YgZW5mb3JjaW5nIHRoaXMuXG5cblxuICByZXR1cm4gRG9tRW51bVtub2RlLmNsYXNzZXNbMF1dIHx8IG51bGw7XG59O1xudmFyIG1ha2VOdWxsRGVsaW1pdGVyID0gZnVuY3Rpb24gbWFrZU51bGxEZWxpbWl0ZXIob3B0aW9ucywgY2xhc3Nlcykge1xuICB2YXIgbW9yZUNsYXNzZXMgPSBbXCJudWxsZGVsaW1pdGVyXCJdLmNvbmNhdChvcHRpb25zLmJhc2VTaXppbmdDbGFzc2VzKCkpO1xuICByZXR1cm4gYnVpbGRIVE1MX21ha2VTcGFuKGNsYXNzZXMuY29uY2F0KG1vcmVDbGFzc2VzKSk7XG59O1xuLyoqXG4gKiBidWlsZEdyb3VwIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgZ3JvdXAgYW5kIGNhbGxzIHRoZSBjb3JyZWN0IGdyb3VwVHlwZVxuICogZnVuY3Rpb24gZm9yIGl0LiBJdCBhbHNvIGhhbmRsZXMgdGhlIGludGVyYWN0aW9uIG9mIHNpemUgYW5kIHN0eWxlIGNoYW5nZXNcbiAqIGJldHdlZW4gcGFyZW50cyBhbmQgY2hpbGRyZW4uXG4gKi9cblxudmFyIGJ1aWxkR3JvdXAgPSBmdW5jdGlvbiBidWlsZEdyb3VwKGdyb3VwLCBvcHRpb25zLCBiYXNlT3B0aW9ucykge1xuICBpZiAoIWdyb3VwKSB7XG4gICAgcmV0dXJuIGJ1aWxkSFRNTF9tYWtlU3BhbigpO1xuICB9XG5cbiAgaWYgKF9odG1sR3JvdXBCdWlsZGVyc1tncm91cC50eXBlXSkge1xuICAgIC8vIENhbGwgdGhlIGdyb3VwQnVpbGRlcnMgZnVuY3Rpb25cbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgdmFyIGdyb3VwTm9kZSA9IF9odG1sR3JvdXBCdWlsZGVyc1tncm91cC50eXBlXShncm91cCwgb3B0aW9ucyk7IC8vIElmIHRoZSBzaXplIGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCB0aGUgY3VycmVudCBncm91cCwgYWNjb3VudFxuICAgIC8vIGZvciB0aGF0IHNpemUgZGlmZmVyZW5jZS5cblxuICAgIGlmIChiYXNlT3B0aW9ucyAmJiBvcHRpb25zLnNpemUgIT09IGJhc2VPcHRpb25zLnNpemUpIHtcbiAgICAgIGdyb3VwTm9kZSA9IGJ1aWxkSFRNTF9tYWtlU3BhbihvcHRpb25zLnNpemluZ0NsYXNzZXMoYmFzZU9wdGlvbnMpLCBbZ3JvdXBOb2RlXSwgb3B0aW9ucyk7XG4gICAgICB2YXIgbXVsdGlwbGllciA9IG9wdGlvbnMuc2l6ZU11bHRpcGxpZXIgLyBiYXNlT3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgICAgIGdyb3VwTm9kZS5oZWlnaHQgKj0gbXVsdGlwbGllcjtcbiAgICAgIGdyb3VwTm9kZS5kZXB0aCAqPSBtdWx0aXBsaWVyO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cE5vZGU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiR290IGdyb3VwIG9mIHVua25vd24gdHlwZTogJ1wiICsgZ3JvdXAudHlwZSArIFwiJ1wiKTtcbiAgfVxufTtcbi8qKlxuICogQ29tYmluZSBhbiBhcnJheSBvZiBIVE1MIERPTSBub2RlcyAoZS5nLiwgdGhlIG91dHB1dCBvZiBgYnVpbGRFeHByZXNzaW9uYClcbiAqIGludG8gYW4gdW5icmVha2FibGUgSFRNTCBub2RlIG9mIGNsYXNzIC5iYXNlLCB3aXRoIHByb3BlciBzdHJ1dHMgdG9cbiAqIGd1YXJhbnRlZSBjb3JyZWN0IHZlcnRpY2FsIGV4dGVudC4gIGBidWlsZEhUTUxgIGNhbGxzIHRoaXMgcmVwZWF0ZWRseSB0b1xuICogbWFrZSB1cCB0aGUgZW50aXJlIGV4cHJlc3Npb24gYXMgYSBzZXF1ZW5jZSBvZiB1bmJyZWFrYWJsZSB1bml0cy5cbiAqL1xuXG5mdW5jdGlvbiBidWlsZEhUTUxVbmJyZWFrYWJsZShjaGlsZHJlbiwgb3B0aW9ucykge1xuICAvLyBDb21wdXRlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhpcyBjaHVuay5cbiAgdmFyIGJvZHkgPSBidWlsZEhUTUxfbWFrZVNwYW4oW1wiYmFzZVwiXSwgY2hpbGRyZW4sIG9wdGlvbnMpOyAvLyBBZGQgc3RydXQsIHdoaWNoIGVuc3VyZXMgdGhhdCB0aGUgdG9wIG9mIHRoZSBIVE1MIGVsZW1lbnQgZmFsbHMgYXRcbiAgLy8gdGhlIGhlaWdodCBvZiB0aGUgZXhwcmVzc2lvbiwgYW5kIHRoZSBib3R0b20gb2YgdGhlIEhUTUwgZWxlbWVudFxuICAvLyBmYWxscyBhdCB0aGUgZGVwdGggb2YgdGhlIGV4cHJlc3Npb24uXG5cbiAgdmFyIHN0cnV0ID0gYnVpbGRIVE1MX21ha2VTcGFuKFtcInN0cnV0XCJdKTtcbiAgc3RydXQuc3R5bGUuaGVpZ2h0ID0gbWFrZUVtKGJvZHkuaGVpZ2h0ICsgYm9keS5kZXB0aCk7XG5cbiAgaWYgKGJvZHkuZGVwdGgpIHtcbiAgICBzdHJ1dC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gbWFrZUVtKC1ib2R5LmRlcHRoKTtcbiAgfVxuXG4gIGJvZHkuY2hpbGRyZW4udW5zaGlmdChzdHJ1dCk7XG4gIHJldHVybiBib2R5O1xufVxuLyoqXG4gKiBUYWtlIGFuIGVudGlyZSBwYXJzZSB0cmVlLCBhbmQgYnVpbGQgaXQgaW50byBhbiBhcHByb3ByaWF0ZSBzZXQgb2YgSFRNTFxuICogbm9kZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBidWlsZEhUTUwodHJlZSwgb3B0aW9ucykge1xuICAvLyBTdHJpcCBvZmYgb3V0ZXIgdGFnIHdyYXBwZXIgZm9yIHByb2Nlc3NpbmcgYmVsb3cuXG4gIHZhciB0YWcgPSBudWxsO1xuXG4gIGlmICh0cmVlLmxlbmd0aCA9PT0gMSAmJiB0cmVlWzBdLnR5cGUgPT09IFwidGFnXCIpIHtcbiAgICB0YWcgPSB0cmVlWzBdLnRhZztcbiAgICB0cmVlID0gdHJlZVswXS5ib2R5O1xuICB9IC8vIEJ1aWxkIHRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBpbiB0aGUgdHJlZVxuXG5cbiAgdmFyIGV4cHJlc3Npb24gPSBidWlsZEV4cHJlc3Npb24odHJlZSwgb3B0aW9ucywgXCJyb290XCIpO1xuICB2YXIgZXFuTnVtO1xuXG4gIGlmIChleHByZXNzaW9uLmxlbmd0aCA9PT0gMiAmJiBleHByZXNzaW9uWzFdLmhhc0NsYXNzKFwidGFnXCIpKSB7XG4gICAgLy8gQW4gZW52aXJvbm1lbnQgd2l0aCBhdXRvbWF0aWMgZXF1YXRpb24gbnVtYmVycywgZS5nLiB7Z2F0aGVyfS5cbiAgICBlcW5OdW0gPSBleHByZXNzaW9uLnBvcCgpO1xuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gW107IC8vIENyZWF0ZSBvbmUgYmFzZSBub2RlIGZvciBlYWNoIGNodW5rIGJldHdlZW4gcG90ZW50aWFsIGxpbmUgYnJlYWtzLlxuICAvLyBUaGUgVGVYQm9vayBbcC4xNzNdIHNheXMgXCJBIGZvcm11bGEgd2lsbCBiZSBicm9rZW4gb25seSBhZnRlciBhXG4gIC8vIHJlbGF0aW9uIHN5bWJvbCBsaWtlICQ9JCBvciAkPCQgb3IgJFxccmlnaHRhcnJvdyQsIG9yIGFmdGVyIGEgYmluYXJ5XG4gIC8vIG9wZXJhdGlvbiBzeW1ib2wgbGlrZSAkKyQgb3IgJC0kIG9yICRcXHRpbWVzJCwgd2hlcmUgdGhlIHJlbGF0aW9uIG9yXG4gIC8vIGJpbmFyeSBvcGVyYXRpb24gaXMgb24gdGhlIGBgb3V0ZXIgbGV2ZWwnJyBvZiB0aGUgZm9ybXVsYSAoaS5lLiwgbm90XG4gIC8vIGVuY2xvc2VkIGluIHsuLi59IGFuZCBub3QgcGFydCBvZiBhbiBcXG92ZXIgY29uc3RydWN0aW9uKS5cIlxuXG4gIHZhciBwYXJ0cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwcmVzc2lvbi5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2goZXhwcmVzc2lvbltpXSk7XG5cbiAgICBpZiAoZXhwcmVzc2lvbltpXS5oYXNDbGFzcyhcIm1iaW5cIikgfHwgZXhwcmVzc2lvbltpXS5oYXNDbGFzcyhcIm1yZWxcIikgfHwgZXhwcmVzc2lvbltpXS5oYXNDbGFzcyhcImFsbG93YnJlYWtcIikpIHtcbiAgICAgIC8vIFB1dCBhbnkgcG9zdC1vcGVyYXRvciBnbHVlIG9uIHNhbWUgbGluZSBhcyBvcGVyYXRvci5cbiAgICAgIC8vIFdhdGNoIGZvciBcXG5vYnJlYWsgYWxvbmcgdGhlIHdheSwgYW5kIHN0b3AgYXQgXFxuZXdsaW5lLlxuICAgICAgdmFyIG5vYnJlYWsgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKGkgPCBleHByZXNzaW9uLmxlbmd0aCAtIDEgJiYgZXhwcmVzc2lvbltpICsgMV0uaGFzQ2xhc3MoXCJtc3BhY2VcIikgJiYgIWV4cHJlc3Npb25baSArIDFdLmhhc0NsYXNzKFwibmV3bGluZVwiKSkge1xuICAgICAgICBpKys7XG4gICAgICAgIHBhcnRzLnB1c2goZXhwcmVzc2lvbltpXSk7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb25baV0uaGFzQ2xhc3MoXCJub2JyZWFrXCIpKSB7XG4gICAgICAgICAgbm9icmVhayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRG9uJ3QgYWxsb3cgYnJlYWsgaWYgXFxub2JyZWFrIGFtb25nIHRoZSBwb3N0LW9wZXJhdG9yIGdsdWUuXG5cblxuICAgICAgaWYgKCFub2JyZWFrKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYnVpbGRIVE1MVW5icmVha2FibGUocGFydHMsIG9wdGlvbnMpKTtcbiAgICAgICAgcGFydHMgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb25baV0uaGFzQ2xhc3MoXCJuZXdsaW5lXCIpKSB7XG4gICAgICAvLyBXcml0ZSB0aGUgbGluZSBleGNlcHQgdGhlIG5ld2xpbmVcbiAgICAgIHBhcnRzLnBvcCgpO1xuXG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGJ1aWxkSFRNTFVuYnJlYWthYmxlKHBhcnRzLCBvcHRpb25zKSk7XG4gICAgICAgIHBhcnRzID0gW107XG4gICAgICB9IC8vIFB1dCB0aGUgbmV3bGluZSBhdCB0aGUgdG9wIGxldmVsXG5cblxuICAgICAgY2hpbGRyZW4ucHVzaChleHByZXNzaW9uW2ldKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgIGNoaWxkcmVuLnB1c2goYnVpbGRIVE1MVW5icmVha2FibGUocGFydHMsIG9wdGlvbnMpKTtcbiAgfSAvLyBOb3csIGlmIHRoZXJlIHdhcyBhIHRhZywgYnVpbGQgaXQgdG9vIGFuZCBhcHBlbmQgaXQgYXMgYSBmaW5hbCBjaGlsZC5cblxuXG4gIHZhciB0YWdDaGlsZDtcblxuICBpZiAodGFnKSB7XG4gICAgdGFnQ2hpbGQgPSBidWlsZEhUTUxVbmJyZWFrYWJsZShidWlsZEV4cHJlc3Npb24odGFnLCBvcHRpb25zLCB0cnVlKSk7XG4gICAgdGFnQ2hpbGQuY2xhc3NlcyA9IFtcInRhZ1wiXTtcbiAgICBjaGlsZHJlbi5wdXNoKHRhZ0NoaWxkKTtcbiAgfSBlbHNlIGlmIChlcW5OdW0pIHtcbiAgICBjaGlsZHJlbi5wdXNoKGVxbk51bSk7XG4gIH1cblxuICB2YXIgaHRtbE5vZGUgPSBidWlsZEhUTUxfbWFrZVNwYW4oW1wia2F0ZXgtaHRtbFwiXSwgY2hpbGRyZW4pO1xuICBodG1sTm9kZS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7IC8vIEFkanVzdCB0aGUgc3RydXQgb2YgdGhlIHRhZyB0byBiZSB0aGUgbWF4aW11bSBoZWlnaHQgb2YgYWxsIGNoaWxkcmVuXG4gIC8vICh0aGUgaGVpZ2h0IG9mIHRoZSBlbmNsb3NpbmcgaHRtbE5vZGUpIGZvciBwcm9wZXIgdmVydGljYWwgYWxpZ25tZW50LlxuXG4gIGlmICh0YWdDaGlsZCkge1xuICAgIHZhciBzdHJ1dCA9IHRhZ0NoaWxkLmNoaWxkcmVuWzBdO1xuICAgIHN0cnV0LnN0eWxlLmhlaWdodCA9IG1ha2VFbShodG1sTm9kZS5oZWlnaHQgKyBodG1sTm9kZS5kZXB0aCk7XG5cbiAgICBpZiAoaHRtbE5vZGUuZGVwdGgpIHtcbiAgICAgIHN0cnV0LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtYWtlRW0oLWh0bWxOb2RlLmRlcHRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHRtbE5vZGU7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvbWF0aE1MVHJlZS5qc1xuLyoqXG4gKiBUaGVzZSBvYmplY3RzIHN0b3JlIGRhdGEgYWJvdXQgTWF0aE1MIG5vZGVzLiBUaGlzIGlzIHRoZSBNYXRoTUwgZXF1aXZhbGVudFxuICogb2YgdGhlIHR5cGVzIGluIGRvbVRyZWUuanMuIFNpbmNlIE1hdGhNTCBoYW5kbGVzIGl0cyBvd24gcmVuZGVyaW5nLCBhbmRcbiAqIHNpbmNlIHdlJ3JlIG1haW5seSB1c2luZyBNYXRoTUwgdG8gaW1wcm92ZSBhY2Nlc3NpYmlsaXR5LCB3ZSBkb24ndCBtYW5hZ2VcbiAqIGFueSBvZiB0aGUgc3R5bGluZyBzdGF0ZSB0aGF0IHRoZSBwbGFpbiBET00gbm9kZXMgZG8uXG4gKlxuICogVGhlIGB0b05vZGVgIGFuZCBgdG9NYXJrdXBgIGZ1bmN0aW9ucyB3b3JrIHNpbWxhcmx5IHRvIGhvdyB0aGV5IGRvIGluXG4gKiBkb21UcmVlLmpzLCBjcmVhdGluZyBuYW1lc3BhY2VkIERPTSBub2RlcyBhbmQgSFRNTCB0ZXh0IG1hcmt1cCByZXNwZWN0aXZlbHkuXG4gKi9cblxuXG5cblxuZnVuY3Rpb24gbmV3RG9jdW1lbnRGcmFnbWVudChjaGlsZHJlbikge1xuICByZXR1cm4gbmV3IERvY3VtZW50RnJhZ21lbnQoY2hpbGRyZW4pO1xufVxuLyoqXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIGdlbmVyYWwgcHVycG9zZSBNYXRoTUwgbm9kZSBvZiBhbnkgdHlwZS4gVGhlXG4gKiBjb25zdHJ1Y3RvciByZXF1aXJlcyB0aGUgdHlwZSBvZiBub2RlIHRvIGNyZWF0ZSAoZm9yIGV4YW1wbGUsIGBcIm1vXCJgIG9yXG4gKiBgXCJtc3BhY2VcImAsIGNvcnJlc3BvbmRpbmcgdG8gYDxtbz5gIGFuZCBgPG1zcGFjZT5gIHRhZ3MpLlxuICovXG5cbnZhciBNYXRoTm9kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hdGhOb2RlKHR5cGUsIGNoaWxkcmVuLCBjbGFzc2VzKSB7XG4gICAgdGhpcy50eXBlID0gdm9pZCAwO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IHZvaWQgMDtcbiAgICB0aGlzLmNoaWxkcmVuID0gdm9pZCAwO1xuICAgIHRoaXMuY2xhc3NlcyA9IHZvaWQgMDtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc2VzIHx8IFtdO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhIE1hdGhNTCBub2RlLiBNYXRoTUwgZGVwZW5kcyBvbiBhdHRyaWJ1dGVzIHRvIGNvbnZleSBhXG4gICAqIHNlbWFudGljIGNvbnRlbnQsIHNvIHRoaXMgaXMgdXNlZCBoZWF2aWx5LlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBNYXRoTm9kZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGFuIGF0dHJpYnV0ZSBvbiBhIE1hdGhNTCBub2RlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUobmFtZSkge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYXRoIG5vZGUgaW50byBhIE1hdGhNTC1uYW1lc3BhY2VkIERPTSBlbGVtZW50LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b05vZGUgPSBmdW5jdGlvbiB0b05vZGUoKSB7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsIHRoaXMudHlwZSk7XG5cbiAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cmlidXRlcykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmF0dHJpYnV0ZXMsIGF0dHIpKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHIsIHRoaXMuYXR0cmlidXRlc1thdHRyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICBub2RlLmNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzKHRoaXMuY2xhc3Nlcyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5baV0udG9Ob2RlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgbWF0aCBub2RlIGludG8gYW4gSFRNTCBtYXJrdXAgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b01hcmt1cCA9IGZ1bmN0aW9uIHRvTWFya3VwKCkge1xuICAgIHZhciBtYXJrdXAgPSBcIjxcIiArIHRoaXMudHlwZTsgLy8gQWRkIHRoZSBhdHRyaWJ1dGVzXG5cbiAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cmlidXRlcykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmF0dHJpYnV0ZXMsIGF0dHIpKSB7XG4gICAgICAgIG1hcmt1cCArPSBcIiBcIiArIGF0dHIgKyBcIj1cXFwiXCI7XG4gICAgICAgIG1hcmt1cCArPSB1dGlscy5lc2NhcGUodGhpcy5hdHRyaWJ1dGVzW2F0dHJdKTtcbiAgICAgICAgbWFya3VwICs9IFwiXFxcIlwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgbWFya3VwICs9IFwiIGNsYXNzID1cXFwiXCIgKyB1dGlscy5lc2NhcGUoY3JlYXRlQ2xhc3ModGhpcy5jbGFzc2VzKSkgKyBcIlxcXCJcIjtcbiAgICB9XG5cbiAgICBtYXJrdXAgKz0gXCI+XCI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hcmt1cCArPSB0aGlzLmNoaWxkcmVuW2ldLnRvTWFya3VwKCk7XG4gICAgfVxuXG4gICAgbWFya3VwICs9IFwiPC9cIiArIHRoaXMudHlwZSArIFwiPlwiO1xuICAgIHJldHVybiBtYXJrdXA7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYXRoIG5vZGUgaW50byBhIHN0cmluZywgc2ltaWxhciB0byBpbm5lclRleHQsIGJ1dCBlc2NhcGVkLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1RleHQgPSBmdW5jdGlvbiB0b1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLnRvVGV4dCgpO1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgcmV0dXJuIE1hdGhOb2RlO1xufSgpO1xuLyoqXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHBpZWNlIG9mIHRleHQuXG4gKi9cblxudmFyIFRleHROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGV4dE5vZGUodGV4dCkge1xuICAgIHRoaXMudGV4dCA9IHZvaWQgMDtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgdGV4dCBub2RlIGludG8gYSBET00gdGV4dCBub2RlLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8yID0gVGV4dE5vZGUucHJvdG90eXBlO1xuXG4gIF9wcm90bzIudG9Ob2RlID0gZnVuY3Rpb24gdG9Ob2RlKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgdGV4dCBub2RlIGludG8gZXNjYXBlZCBIVE1MIG1hcmt1cFxuICAgKiAocmVwcmVzZW50aW5nIHRoZSB0ZXh0IGl0c2VsZikuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvMi50b01hcmt1cCA9IGZ1bmN0aW9uIHRvTWFya3VwKCkge1xuICAgIHJldHVybiB1dGlscy5lc2NhcGUodGhpcy50b1RleHQoKSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSB0ZXh0IG5vZGUgaW50byBhIHN0cmluZ1xuICAgKiAocmVwcmVzZW50aW5nIHRoZSB0ZXh0IGl0ZXNlbGYpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90bzIudG9UZXh0ID0gZnVuY3Rpb24gdG9UZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIFRleHROb2RlO1xufSgpO1xuLyoqXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHNwYWNlLCBidXQgbWF5IHJlbmRlciBhcyA8bXNwYWNlLi4uLz4gb3IgYXMgdGV4dCxcbiAqIGRlcGVuZGluZyBvbiB0aGUgd2lkdGguXG4gKi9cblxudmFyIFNwYWNlTm9kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBTcGFjZSBub2RlIHdpdGggd2lkdGggZ2l2ZW4gaW4gQ1NTIGVtcy5cbiAgICovXG4gIGZ1bmN0aW9uIFNwYWNlTm9kZSh3aWR0aCkge1xuICAgIHRoaXMud2lkdGggPSB2b2lkIDA7XG4gICAgdGhpcy5jaGFyYWN0ZXIgPSB2b2lkIDA7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoOyAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDAvV0QtTWF0aE1MMi0yMDAwMDMyOC9jaGFwdGVyNi5odG1sXG4gICAgLy8gZm9yIGEgdGFibGUgb2Ygc3BhY2UtbGlrZSBjaGFyYWN0ZXJzLiAgV2UgdXNlIFVuaWNvZGVcbiAgICAvLyByZXByZXNlbnRhdGlvbnMgaW5zdGVhZCBvZiAmTG9uZ05hbWVzOyBhcyBpdCdzIG5vdCBjbGVhciBob3cgdG9cbiAgICAvLyBtYWtlIHRoZSBsYXR0ZXIgdmlhIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlLlxuXG4gICAgaWYgKHdpZHRoID49IDAuMDU1NTUgJiYgd2lkdGggPD0gMC4wNTU1Nikge1xuICAgICAgdGhpcy5jaGFyYWN0ZXIgPSBcIlxcdTIwMEFcIjsgLy8gJlZlcnlUaGluU3BhY2U7XG4gICAgfSBlbHNlIGlmICh3aWR0aCA+PSAwLjE2NjYgJiYgd2lkdGggPD0gMC4xNjY3KSB7XG4gICAgICB0aGlzLmNoYXJhY3RlciA9IFwiXFx1MjAwOVwiOyAvLyAmVGhpblNwYWNlO1xuICAgIH0gZWxzZSBpZiAod2lkdGggPj0gMC4yMjIyICYmIHdpZHRoIDw9IDAuMjIyMykge1xuICAgICAgdGhpcy5jaGFyYWN0ZXIgPSBcIlxcdTIwMDVcIjsgLy8gJk1lZGl1bVNwYWNlO1xuICAgIH0gZWxzZSBpZiAod2lkdGggPj0gMC4yNzc3ICYmIHdpZHRoIDw9IDAuMjc3OCkge1xuICAgICAgdGhpcy5jaGFyYWN0ZXIgPSBcIlxcdTIwMDVcXHUyMDBBXCI7IC8vICZUaGlja1NwYWNlO1xuICAgIH0gZWxzZSBpZiAod2lkdGggPj0gLTAuMDU1NTYgJiYgd2lkdGggPD0gLTAuMDU1NTUpIHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyID0gXCJcXHUyMDBBXFx1MjA2M1wiOyAvLyAmTmVnYXRpdmVWZXJ5VGhpblNwYWNlO1xuICAgIH0gZWxzZSBpZiAod2lkdGggPj0gLTAuMTY2NyAmJiB3aWR0aCA8PSAtMC4xNjY2KSB7XG4gICAgICB0aGlzLmNoYXJhY3RlciA9IFwiXFx1MjAwOVxcdTIwNjNcIjsgLy8gJk5lZ2F0aXZlVGhpblNwYWNlO1xuICAgIH0gZWxzZSBpZiAod2lkdGggPj0gLTAuMjIyMyAmJiB3aWR0aCA8PSAtMC4yMjIyKSB7XG4gICAgICB0aGlzLmNoYXJhY3RlciA9IFwiXFx1MjA1RlxcdTIwNjNcIjsgLy8gJk5lZ2F0aXZlTWVkaXVtU3BhY2U7XG4gICAgfSBlbHNlIGlmICh3aWR0aCA+PSAtMC4yNzc4ICYmIHdpZHRoIDw9IC0wLjI3NzcpIHtcbiAgICAgIHRoaXMuY2hhcmFjdGVyID0gXCJcXHUyMDA1XFx1MjA2M1wiOyAvLyAmTmVnYXRpdmVUaGlja1NwYWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXJhY3RlciA9IG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgbWF0aCBub2RlIGludG8gYSBNYXRoTUwtbmFtZXNwYWNlZCBET00gZWxlbWVudC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvMyA9IFNwYWNlTm9kZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMy50b05vZGUgPSBmdW5jdGlvbiB0b05vZGUoKSB7XG4gICAgaWYgKHRoaXMuY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jaGFyYWN0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIiwgXCJtc3BhY2VcIik7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIG1ha2VFbSh0aGlzLndpZHRoKSk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYXRoIG5vZGUgaW50byBhbiBIVE1MIG1hcmt1cCBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvMy50b01hcmt1cCA9IGZ1bmN0aW9uIHRvTWFya3VwKCkge1xuICAgIGlmICh0aGlzLmNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIFwiPG10ZXh0PlwiICsgdGhpcy5jaGFyYWN0ZXIgKyBcIjwvbXRleHQ+XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIjxtc3BhY2Ugd2lkdGg9XFxcIlwiICsgbWFrZUVtKHRoaXMud2lkdGgpICsgXCJcXFwiLz5cIjtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBtYXRoIG5vZGUgaW50byBhIHN0cmluZywgc2ltaWxhciB0byBpbm5lclRleHQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvMy50b1RleHQgPSBmdW5jdGlvbiB0b1RleHQoKSB7XG4gICAgaWYgKHRoaXMuY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIiBcIjtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNwYWNlTm9kZTtcbn0oKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgbWF0aE1MVHJlZSA9ICh7XG4gIE1hdGhOb2RlOiBNYXRoTm9kZSxcbiAgVGV4dE5vZGU6IFRleHROb2RlLFxuICBTcGFjZU5vZGU6IFNwYWNlTm9kZSxcbiAgbmV3RG9jdW1lbnRGcmFnbWVudDogbmV3RG9jdW1lbnRGcmFnbWVudFxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYnVpbGRNYXRoTUwuanNcbi8qKlxuICogVGhpcyBmaWxlIGNvbnZlcnRzIGEgcGFyc2UgdHJlZSBpbnRvIGEgY29vcmVzcG9uZGluZyBNYXRoTUwgdHJlZS4gVGhlIG1haW5cbiAqIGVudHJ5IHBvaW50IGlzIHRoZSBgYnVpbGRNYXRoTUxgIGZ1bmN0aW9uLCB3aGljaCB0YWtlcyBhIHBhcnNlIHRyZWUgZnJvbSB0aGVcbiAqIHBhcnNlci5cbiAqL1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBUYWtlcyBhIHN5bWJvbCBhbmQgY29udmVydHMgaXQgaW50byBhIE1hdGhNTCB0ZXh0IG5vZGUgYWZ0ZXIgcGVyZm9ybWluZ1xuICogb3B0aW9uYWwgcmVwbGFjZW1lbnQgZnJvbSBzeW1ib2xzLmpzLlxuICovXG52YXIgbWFrZVRleHQgPSBmdW5jdGlvbiBtYWtlVGV4dCh0ZXh0LCBtb2RlLCBvcHRpb25zKSB7XG4gIGlmIChzcmNfc3ltYm9sc1ttb2RlXVt0ZXh0XSAmJiBzcmNfc3ltYm9sc1ttb2RlXVt0ZXh0XS5yZXBsYWNlICYmIHRleHQuY2hhckNvZGVBdCgwKSAhPT0gMHhEODM1ICYmICEobGlnYXR1cmVzLmhhc093blByb3BlcnR5KHRleHQpICYmIG9wdGlvbnMgJiYgKG9wdGlvbnMuZm9udEZhbWlseSAmJiBvcHRpb25zLmZvbnRGYW1pbHkuc2xpY2UoNCwgNikgPT09IFwidHRcIiB8fCBvcHRpb25zLmZvbnQgJiYgb3B0aW9ucy5mb250LnNsaWNlKDQsIDYpID09PSBcInR0XCIpKSkge1xuICAgIHRleHQgPSBzcmNfc3ltYm9sc1ttb2RlXVt0ZXh0XS5yZXBsYWNlO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLlRleHROb2RlKHRleHQpO1xufTtcbi8qKlxuICogV3JhcCB0aGUgZ2l2ZW4gYXJyYXkgb2Ygbm9kZXMgaW4gYW4gPG1yb3c+IG5vZGUgaWYgbmVlZGVkLCBpLmUuLFxuICogdW5sZXNzIHRoZSBhcnJheSBoYXMgbGVuZ3RoIDEuICBBbHdheXMgcmV0dXJucyBhIHNpbmdsZSBub2RlLlxuICovXG5cbnZhciBtYWtlUm93ID0gZnVuY3Rpb24gbWFrZVJvdyhib2R5KSB7XG4gIGlmIChib2R5Lmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBib2R5WzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1yb3dcIiwgYm9keSk7XG4gIH1cbn07XG4vKipcbiAqIFJldHVybnMgdGhlIG1hdGggdmFyaWFudCBhcyBhIHN0cmluZyBvciBudWxsIGlmIG5vbmUgaXMgcmVxdWlyZWQuXG4gKi9cblxudmFyIGdldFZhcmlhbnQgPSBmdW5jdGlvbiBnZXRWYXJpYW50KGdyb3VwLCBvcHRpb25zKSB7XG4gIC8vIEhhbmRsZSBcXHRleHQuLi4gZm9udCBzcGVjaWZpZXJzIGFzIGJlc3Qgd2UgY2FuLlxuICAvLyBNYXRoTUwgaGFzIGEgbGltaXRlZCBsaXN0IG9mIGFsbG93YWJsZSBtYXRodmFyaWFudCBzcGVjaWZpZXJzOyBzZWVcbiAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL01hdGhNTDMvY2hhcHRlcjMuaHRtbCNwcmVzbS5jb21tYXR0XG4gIGlmIChvcHRpb25zLmZvbnRGYW1pbHkgPT09IFwidGV4dHR0XCIpIHtcbiAgICByZXR1cm4gXCJtb25vc3BhY2VcIjtcbiAgfSBlbHNlIGlmIChvcHRpb25zLmZvbnRGYW1pbHkgPT09IFwidGV4dHNmXCIpIHtcbiAgICBpZiAob3B0aW9ucy5mb250U2hhcGUgPT09IFwidGV4dGl0XCIgJiYgb3B0aW9ucy5mb250V2VpZ2h0ID09PSBcInRleHRiZlwiKSB7XG4gICAgICByZXR1cm4gXCJzYW5zLXNlcmlmLWJvbGQtaXRhbGljXCI7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmZvbnRTaGFwZSA9PT0gXCJ0ZXh0aXRcIikge1xuICAgICAgcmV0dXJuIFwic2Fucy1zZXJpZi1pdGFsaWNcIjtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZm9udFdlaWdodCA9PT0gXCJ0ZXh0YmZcIikge1xuICAgICAgcmV0dXJuIFwiYm9sZC1zYW5zLXNlcmlmXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInNhbnMtc2VyaWZcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5mb250U2hhcGUgPT09IFwidGV4dGl0XCIgJiYgb3B0aW9ucy5mb250V2VpZ2h0ID09PSBcInRleHRiZlwiKSB7XG4gICAgcmV0dXJuIFwiYm9sZC1pdGFsaWNcIjtcbiAgfSBlbHNlIGlmIChvcHRpb25zLmZvbnRTaGFwZSA9PT0gXCJ0ZXh0aXRcIikge1xuICAgIHJldHVybiBcIml0YWxpY1wiO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMuZm9udFdlaWdodCA9PT0gXCJ0ZXh0YmZcIikge1xuICAgIHJldHVybiBcImJvbGRcIjtcbiAgfVxuXG4gIHZhciBmb250ID0gb3B0aW9ucy5mb250O1xuXG4gIGlmICghZm9udCB8fCBmb250ID09PSBcIm1hdGhub3JtYWxcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1vZGUgPSBncm91cC5tb2RlO1xuXG4gIGlmIChmb250ID09PSBcIm1hdGhpdFwiKSB7XG4gICAgcmV0dXJuIFwiaXRhbGljXCI7XG4gIH0gZWxzZSBpZiAoZm9udCA9PT0gXCJib2xkc3ltYm9sXCIpIHtcbiAgICByZXR1cm4gZ3JvdXAudHlwZSA9PT0gXCJ0ZXh0b3JkXCIgPyBcImJvbGRcIiA6IFwiYm9sZC1pdGFsaWNcIjtcbiAgfSBlbHNlIGlmIChmb250ID09PSBcIm1hdGhiZlwiKSB7XG4gICAgcmV0dXJuIFwiYm9sZFwiO1xuICB9IGVsc2UgaWYgKGZvbnQgPT09IFwibWF0aGJiXCIpIHtcbiAgICByZXR1cm4gXCJkb3VibGUtc3RydWNrXCI7XG4gIH0gZWxzZSBpZiAoZm9udCA9PT0gXCJtYXRoZnJha1wiKSB7XG4gICAgcmV0dXJuIFwiZnJha3R1clwiO1xuICB9IGVsc2UgaWYgKGZvbnQgPT09IFwibWF0aHNjclwiIHx8IGZvbnQgPT09IFwibWF0aGNhbFwiKSB7XG4gICAgLy8gTWF0aE1MIG1ha2VzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gc2NyaXB0IGFuZCBjYWxpZ3JhaHBpY1xuICAgIHJldHVybiBcInNjcmlwdFwiO1xuICB9IGVsc2UgaWYgKGZvbnQgPT09IFwibWF0aHNmXCIpIHtcbiAgICByZXR1cm4gXCJzYW5zLXNlcmlmXCI7XG4gIH0gZWxzZSBpZiAoZm9udCA9PT0gXCJtYXRodHRcIikge1xuICAgIHJldHVybiBcIm1vbm9zcGFjZVwiO1xuICB9XG5cbiAgdmFyIHRleHQgPSBncm91cC50ZXh0O1xuXG4gIGlmICh1dGlscy5jb250YWlucyhbXCJcXFxcaW1hdGhcIiwgXCJcXFxcam1hdGhcIl0sIHRleHQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoc3JjX3N5bWJvbHNbbW9kZV1bdGV4dF0gJiYgc3JjX3N5bWJvbHNbbW9kZV1bdGV4dF0ucmVwbGFjZSkge1xuICAgIHRleHQgPSBzcmNfc3ltYm9sc1ttb2RlXVt0ZXh0XS5yZXBsYWNlO1xuICB9XG5cbiAgdmFyIGZvbnROYW1lID0gYnVpbGRDb21tb24uZm9udE1hcFtmb250XS5mb250TmFtZTtcblxuICBpZiAoZ2V0Q2hhcmFjdGVyTWV0cmljcyh0ZXh0LCBmb250TmFtZSwgbW9kZSkpIHtcbiAgICByZXR1cm4gYnVpbGRDb21tb24uZm9udE1hcFtmb250XS52YXJpYW50O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuLyoqXG4gKiBUYWtlcyBhIGxpc3Qgb2Ygbm9kZXMsIGJ1aWxkcyB0aGVtLCBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGdlbmVyYXRlZFxuICogTWF0aE1MIG5vZGVzLiAgQWxzbyBjb21iaW5lIGNvbnNlY3V0aXZlIDxtdGV4dD4gb3V0cHV0cyBpbnRvIGEgc2luZ2xlXG4gKiA8bXRleHQ+IHRhZy5cbiAqL1xuXG52YXIgYnVpbGRNYXRoTUxfYnVpbGRFeHByZXNzaW9uID0gZnVuY3Rpb24gYnVpbGRFeHByZXNzaW9uKGV4cHJlc3Npb24sIG9wdGlvbnMsIGlzT3JkZ3JvdXApIHtcbiAgaWYgKGV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIGdyb3VwID0gYnVpbGRNYXRoTUxfYnVpbGRHcm91cChleHByZXNzaW9uWzBdLCBvcHRpb25zKTtcblxuICAgIGlmIChpc09yZGdyb3VwICYmIGdyb3VwIGluc3RhbmNlb2YgTWF0aE5vZGUgJiYgZ3JvdXAudHlwZSA9PT0gXCJtb1wiKSB7XG4gICAgICAvLyBXaGVuIFRlWCB3cml0ZXJzIHdhbnQgdG8gc3VwcHJlc3Mgc3BhY2luZyBvbiBhbiBvcGVyYXRvcixcbiAgICAgIC8vIHRoZXkgb2Z0ZW4gcHV0IHRoZSBvcGVyYXRvciBieSBpdHNlbGYgaW5zaWRlIGJyYWNlcy5cbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcImxzcGFjZVwiLCBcIjBlbVwiKTtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInJzcGFjZVwiLCBcIjBlbVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW2dyb3VwXTtcbiAgfVxuXG4gIHZhciBncm91cHMgPSBbXTtcbiAgdmFyIGxhc3RHcm91cDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb24ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX2dyb3VwID0gYnVpbGRNYXRoTUxfYnVpbGRHcm91cChleHByZXNzaW9uW2ldLCBvcHRpb25zKTtcblxuICAgIGlmIChfZ3JvdXAgaW5zdGFuY2VvZiBNYXRoTm9kZSAmJiBsYXN0R3JvdXAgaW5zdGFuY2VvZiBNYXRoTm9kZSkge1xuICAgICAgLy8gQ29uY2F0ZW5hdGUgYWRqYWNlbnQgPG10ZXh0PnNcbiAgICAgIGlmIChfZ3JvdXAudHlwZSA9PT0gJ210ZXh0JyAmJiBsYXN0R3JvdXAudHlwZSA9PT0gJ210ZXh0JyAmJiBfZ3JvdXAuZ2V0QXR0cmlidXRlKCdtYXRodmFyaWFudCcpID09PSBsYXN0R3JvdXAuZ2V0QXR0cmlidXRlKCdtYXRodmFyaWFudCcpKSB7XG4gICAgICAgIHZhciBfbGFzdEdyb3VwJGNoaWxkcmVuO1xuXG4gICAgICAgIChfbGFzdEdyb3VwJGNoaWxkcmVuID0gbGFzdEdyb3VwLmNoaWxkcmVuKS5wdXNoLmFwcGx5KF9sYXN0R3JvdXAkY2hpbGRyZW4sIF9ncm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgY29udGludWU7IC8vIENvbmNhdGVuYXRlIGFkamFjZW50IDxtbj5zXG4gICAgICB9IGVsc2UgaWYgKF9ncm91cC50eXBlID09PSAnbW4nICYmIGxhc3RHcm91cC50eXBlID09PSAnbW4nKSB7XG4gICAgICAgIHZhciBfbGFzdEdyb3VwJGNoaWxkcmVuMjtcblxuICAgICAgICAoX2xhc3RHcm91cCRjaGlsZHJlbjIgPSBsYXN0R3JvdXAuY2hpbGRyZW4pLnB1c2guYXBwbHkoX2xhc3RHcm91cCRjaGlsZHJlbjIsIF9ncm91cC5jaGlsZHJlbik7XG5cbiAgICAgICAgY29udGludWU7IC8vIENvbmNhdGVuYXRlIDxtbj4uLi48L21uPiBmb2xsb3dlZCBieSA8bWk+LjwvbWk+XG4gICAgICB9IGVsc2UgaWYgKF9ncm91cC50eXBlID09PSAnbWknICYmIF9ncm91cC5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbGFzdEdyb3VwLnR5cGUgPT09ICdtbicpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gX2dyb3VwLmNoaWxkcmVuWzBdO1xuXG4gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHROb2RlICYmIGNoaWxkLnRleHQgPT09ICcuJykge1xuICAgICAgICAgIHZhciBfbGFzdEdyb3VwJGNoaWxkcmVuMztcblxuICAgICAgICAgIChfbGFzdEdyb3VwJGNoaWxkcmVuMyA9IGxhc3RHcm91cC5jaGlsZHJlbikucHVzaC5hcHBseShfbGFzdEdyb3VwJGNoaWxkcmVuMywgX2dyb3VwLmNoaWxkcmVuKTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxhc3RHcm91cC50eXBlID09PSAnbWknICYmIGxhc3RHcm91cC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFyIGxhc3RDaGlsZCA9IGxhc3RHcm91cC5jaGlsZHJlblswXTtcblxuICAgICAgICBpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgVGV4dE5vZGUgJiYgbGFzdENoaWxkLnRleHQgPT09IFwiXFx1MDMzOFwiICYmIChfZ3JvdXAudHlwZSA9PT0gJ21vJyB8fCBfZ3JvdXAudHlwZSA9PT0gJ21pJyB8fCBfZ3JvdXAudHlwZSA9PT0gJ21uJykpIHtcbiAgICAgICAgICB2YXIgX2NoaWxkID0gX2dyb3VwLmNoaWxkcmVuWzBdO1xuXG4gICAgICAgICAgaWYgKF9jaGlsZCBpbnN0YW5jZW9mIFRleHROb2RlICYmIF9jaGlsZC50ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIE92ZXJsYXkgd2l0aCBjb21iaW5pbmcgY2hhcmFjdGVyIGxvbmcgc29saWR1c1xuICAgICAgICAgICAgX2NoaWxkLnRleHQgPSBfY2hpbGQudGV4dC5zbGljZSgwLCAxKSArIFwiXFx1MDMzOFwiICsgX2NoaWxkLnRleHQuc2xpY2UoMSk7XG4gICAgICAgICAgICBncm91cHMucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ3JvdXBzLnB1c2goX2dyb3VwKTtcbiAgICBsYXN0R3JvdXAgPSBfZ3JvdXA7XG4gIH1cblxuICByZXR1cm4gZ3JvdXBzO1xufTtcbi8qKlxuICogRXF1aXZhbGVudCB0byBidWlsZEV4cHJlc3Npb24sIGJ1dCB3cmFwcyB0aGUgZWxlbWVudHMgaW4gYW4gPG1yb3c+XG4gKiBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUuICBSZXR1cm5zIGEgc2luZ2xlIG5vZGUgaW5zdGVhZCBvZiBhbiBhcnJheS5cbiAqL1xuXG52YXIgYnVpbGRFeHByZXNzaW9uUm93ID0gZnVuY3Rpb24gYnVpbGRFeHByZXNzaW9uUm93KGV4cHJlc3Npb24sIG9wdGlvbnMsIGlzT3JkZ3JvdXApIHtcbiAgcmV0dXJuIG1ha2VSb3coYnVpbGRNYXRoTUxfYnVpbGRFeHByZXNzaW9uKGV4cHJlc3Npb24sIG9wdGlvbnMsIGlzT3JkZ3JvdXApKTtcbn07XG4vKipcbiAqIFRha2VzIGEgZ3JvdXAgZnJvbSB0aGUgcGFyc2VyIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgZ3JvdXBCdWlsZGVycyBmdW5jdGlvblxuICogb24gaXQgdG8gcHJvZHVjZSBhIE1hdGhNTCBub2RlLlxuICovXG5cbnZhciBidWlsZE1hdGhNTF9idWlsZEdyb3VwID0gZnVuY3Rpb24gYnVpbGRHcm91cChncm91cCwgb3B0aW9ucykge1xuICBpZiAoIWdyb3VwKSB7XG4gICAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXJvd1wiKTtcbiAgfVxuXG4gIGlmIChfbWF0aG1sR3JvdXBCdWlsZGVyc1tncm91cC50eXBlXSkge1xuICAgIC8vIENhbGwgdGhlIGdyb3VwQnVpbGRlcnMgZnVuY3Rpb25cbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgdmFyIHJlc3VsdCA9IF9tYXRobWxHcm91cEJ1aWxkZXJzW2dyb3VwLnR5cGVdKGdyb3VwLCBvcHRpb25zKTsgLy8gJEZsb3dGaXhNZVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJHb3QgZ3JvdXAgb2YgdW5rbm93biB0eXBlOiAnXCIgKyBncm91cC50eXBlICsgXCInXCIpO1xuICB9XG59O1xuLyoqXG4gKiBUYWtlcyBhIGZ1bGwgcGFyc2UgdHJlZSBhbmQgc2V0dGluZ3MgYW5kIGJ1aWxkcyBhIE1hdGhNTCByZXByZXNlbnRhdGlvbiBvZlxuICogaXQuIEluIHBhcnRpY3VsYXIsIHdlIHB1dCB0aGUgZWxlbWVudHMgZnJvbSBidWlsZGluZyB0aGUgcGFyc2UgdHJlZSBpbnRvIGFcbiAqIDxzZW1hbnRpY3M+IHRhZyBzbyB3ZSBjYW4gYWxzbyBpbmNsdWRlIHRoYXQgVGVYIHNvdXJjZSBhcyBhbiBhbm5vdGF0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSByZXR1cm4gYSBkb21UcmVlIGVsZW1lbnQgd2l0aCBhIGA8bWF0aD5gIGluc2lkZSBpdCBzb1xuICogd2UgY2FuIGRvIGFwcHJvcHJpYXRlIHN0eWxpbmcuXG4gKi9cblxuZnVuY3Rpb24gYnVpbGRNYXRoTUwodHJlZSwgdGV4RXhwcmVzc2lvbiwgb3B0aW9ucywgaXNEaXNwbGF5TW9kZSwgZm9yTWF0aG1sT25seSkge1xuICB2YXIgZXhwcmVzc2lvbiA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbih0cmVlLCBvcHRpb25zKTsgLy8gVE9ETzogTWFrZSBhIHBhc3MgdGhydSB0aGUgTWF0aE1MIHNpbWlsYXIgdG8gYnVpbGRIVE1MLnRyYXZlcnNlTm9uU3BhY2VOb2Rlc1xuICAvLyBhbmQgYWRkIHNwYWNpbmcgbm9kZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgYWRqYWNlbnQgdG8gbWF0aCBvcGVyYXRvcnNcbiAgLy8gbGlrZSBcXHNpbiBvciBcXGxpbSBvciB0byBzdWJzdXAgZWxlbWVudHMgdGhhdCBjb250YWluIG1hdGggb3BlcmF0b3JzLlxuICAvLyBNYXRoTUwgdGFrZXMgY2FyZSBvZiB0aGUgb3RoZXIgc3BhY2luZyBpc3N1ZXMuXG4gIC8vIFdyYXAgdXAgdGhlIGV4cHJlc3Npb24gaW4gYW4gbXJvdyBzbyBpdCBpcyBwcmVzZW50ZWQgaW4gdGhlIHNlbWFudGljc1xuICAvLyB0YWcgY29ycmVjdGx5LCB1bmxlc3MgaXQncyBhIHNpbmdsZSA8bXJvdz4gb3IgPG10YWJsZT4uXG5cbiAgdmFyIHdyYXBwZXI7XG5cbiAgaWYgKGV4cHJlc3Npb24ubGVuZ3RoID09PSAxICYmIGV4cHJlc3Npb25bMF0gaW5zdGFuY2VvZiBNYXRoTm9kZSAmJiB1dGlscy5jb250YWlucyhbXCJtcm93XCIsIFwibXRhYmxlXCJdLCBleHByZXNzaW9uWzBdLnR5cGUpKSB7XG4gICAgd3JhcHBlciA9IGV4cHJlc3Npb25bMF07XG4gIH0gZWxzZSB7XG4gICAgd3JhcHBlciA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXJvd1wiLCBleHByZXNzaW9uKTtcbiAgfSAvLyBCdWlsZCBhIFRlWCBhbm5vdGF0aW9uIG9mIHRoZSBzb3VyY2VcblxuXG4gIHZhciBhbm5vdGF0aW9uID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJhbm5vdGF0aW9uXCIsIFtuZXcgbWF0aE1MVHJlZS5UZXh0Tm9kZSh0ZXhFeHByZXNzaW9uKV0pO1xuICBhbm5vdGF0aW9uLnNldEF0dHJpYnV0ZShcImVuY29kaW5nXCIsIFwiYXBwbGljYXRpb24veC10ZXhcIik7XG4gIHZhciBzZW1hbnRpY3MgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcInNlbWFudGljc1wiLCBbd3JhcHBlciwgYW5ub3RhdGlvbl0pO1xuICB2YXIgbWF0aCA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibWF0aFwiLCBbc2VtYW50aWNzXSk7XG4gIG1hdGguc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIpO1xuXG4gIGlmIChpc0Rpc3BsYXlNb2RlKSB7XG4gICAgbWF0aC5zZXRBdHRyaWJ1dGUoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gIH0gLy8gWW91IGNhbid0IHN0eWxlIDxtYXRoPiBub2Rlcywgc28gd2Ugd3JhcCB0aGUgbm9kZSBpbiBhIHNwYW4uXG4gIC8vIE5PVEU6IFRoZSBzcGFuIGNsYXNzIGlzIG5vdCB0eXBlZCB0byBoYXZlIDxtYXRoPiBub2RlcyBhcyBjaGlsZHJlbiwgYW5kXG4gIC8vIHdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGUgY2hpbGRyZW4gdHlwZSBtb3JlIGdlbmVyaWMgc2luY2UgdGhlIGNoaWxkcmVuXG4gIC8vIG9mIHNwYW4gYXJlIGV4cGVjdGVkIHRvIGhhdmUgbW9yZSBmaWVsZHMgaW4gYGJ1aWxkSHRtbGAgY29udGV4dHMuXG5cblxuICB2YXIgd3JhcHBlckNsYXNzID0gZm9yTWF0aG1sT25seSA/IFwia2F0ZXhcIiA6IFwia2F0ZXgtbWF0aG1sXCI7IC8vICRGbG93Rml4TWVcblxuICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW3dyYXBwZXJDbGFzc10sIFttYXRoXSk7XG59XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYnVpbGRUcmVlLmpzXG5cblxuXG5cblxuXG5cbnZhciBvcHRpb25zRnJvbVNldHRpbmdzID0gZnVuY3Rpb24gb3B0aW9uc0Zyb21TZXR0aW5ncyhzZXR0aW5ncykge1xuICByZXR1cm4gbmV3IHNyY19PcHRpb25zKHtcbiAgICBzdHlsZTogc2V0dGluZ3MuZGlzcGxheU1vZGUgPyBzcmNfU3R5bGUuRElTUExBWSA6IHNyY19TdHlsZS5URVhULFxuICAgIG1heFNpemU6IHNldHRpbmdzLm1heFNpemUsXG4gICAgbWluUnVsZVRoaWNrbmVzczogc2V0dGluZ3MubWluUnVsZVRoaWNrbmVzc1xuICB9KTtcbn07XG5cbnZhciBkaXNwbGF5V3JhcCA9IGZ1bmN0aW9uIGRpc3BsYXlXcmFwKG5vZGUsIHNldHRpbmdzKSB7XG4gIGlmIChzZXR0aW5ncy5kaXNwbGF5TW9kZSkge1xuICAgIHZhciBjbGFzc2VzID0gW1wia2F0ZXgtZGlzcGxheVwiXTtcblxuICAgIGlmIChzZXR0aW5ncy5sZXFubykge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGVxbm9cIik7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmZsZXFuKSB7XG4gICAgICBjbGFzc2VzLnB1c2goXCJmbGVxblwiKTtcbiAgICB9XG5cbiAgICBub2RlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oY2xhc3NlcywgW25vZGVdKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufTtcblxudmFyIGJ1aWxkVHJlZSA9IGZ1bmN0aW9uIGJ1aWxkVHJlZSh0cmVlLCBleHByZXNzaW9uLCBzZXR0aW5ncykge1xuICB2YXIgb3B0aW9ucyA9IG9wdGlvbnNGcm9tU2V0dGluZ3Moc2V0dGluZ3MpO1xuICB2YXIga2F0ZXhOb2RlO1xuXG4gIGlmIChzZXR0aW5ncy5vdXRwdXQgPT09IFwibWF0aG1sXCIpIHtcbiAgICByZXR1cm4gYnVpbGRNYXRoTUwodHJlZSwgZXhwcmVzc2lvbiwgb3B0aW9ucywgc2V0dGluZ3MuZGlzcGxheU1vZGUsIHRydWUpO1xuICB9IGVsc2UgaWYgKHNldHRpbmdzLm91dHB1dCA9PT0gXCJodG1sXCIpIHtcbiAgICB2YXIgaHRtbE5vZGUgPSBidWlsZEhUTUwodHJlZSwgb3B0aW9ucyk7XG4gICAga2F0ZXhOb2RlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wia2F0ZXhcIl0sIFtodG1sTm9kZV0pO1xuICB9IGVsc2Uge1xuICAgIHZhciBtYXRoTUxOb2RlID0gYnVpbGRNYXRoTUwodHJlZSwgZXhwcmVzc2lvbiwgb3B0aW9ucywgc2V0dGluZ3MuZGlzcGxheU1vZGUsIGZhbHNlKTtcblxuICAgIHZhciBfaHRtbE5vZGUgPSBidWlsZEhUTUwodHJlZSwgb3B0aW9ucyk7XG5cbiAgICBrYXRleE5vZGUgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJrYXRleFwiXSwgW21hdGhNTE5vZGUsIF9odG1sTm9kZV0pO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlXcmFwKGthdGV4Tm9kZSwgc2V0dGluZ3MpO1xufTtcbnZhciBidWlsZEhUTUxUcmVlID0gZnVuY3Rpb24gYnVpbGRIVE1MVHJlZSh0cmVlLCBleHByZXNzaW9uLCBzZXR0aW5ncykge1xuICB2YXIgb3B0aW9ucyA9IG9wdGlvbnNGcm9tU2V0dGluZ3Moc2V0dGluZ3MpO1xuICB2YXIgaHRtbE5vZGUgPSBidWlsZEhUTUwodHJlZSwgb3B0aW9ucyk7XG4gIHZhciBrYXRleE5vZGUgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJrYXRleFwiXSwgW2h0bWxOb2RlXSk7XG4gIHJldHVybiBkaXNwbGF5V3JhcChrYXRleE5vZGUsIHNldHRpbmdzKTtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfYnVpbGRUcmVlID0gKCgvKiB1bnVzZWQgcHVyZSBleHByZXNzaW9uIG9yIHN1cGVyICovIG51bGwgJiYgKGJ1aWxkVHJlZSkpKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zdHJldGNoeS5qc1xuLyoqXG4gKiBUaGlzIGZpbGUgcHJvdmlkZXMgc3VwcG9ydCB0byBidWlsZE1hdGhNTC5qcyBhbmQgYnVpbGRIVE1MLmpzXG4gKiBmb3Igc3RyZXRjaHkgd2lkZSBlbGVtZW50cyByZW5kZXJlZCBmcm9tIFNWRyBmaWxlc1xuICogYW5kIG90aGVyIENTUyB0cmlja2VyeS5cbiAqL1xuXG5cblxuXG5cbnZhciBzdHJldGNoeUNvZGVQb2ludCA9IHtcbiAgd2lkZWhhdDogXCJeXCIsXG4gIHdpZGVjaGVjazogXCLLh1wiLFxuICB3aWRldGlsZGU6IFwiflwiLFxuICB1dGlsZGU6IFwiflwiLFxuICBvdmVybGVmdGFycm93OiBcIlxcdTIxOTBcIixcbiAgdW5kZXJsZWZ0YXJyb3c6IFwiXFx1MjE5MFwiLFxuICB4bGVmdGFycm93OiBcIlxcdTIxOTBcIixcbiAgb3ZlcnJpZ2h0YXJyb3c6IFwiXFx1MjE5MlwiLFxuICB1bmRlcnJpZ2h0YXJyb3c6IFwiXFx1MjE5MlwiLFxuICB4cmlnaHRhcnJvdzogXCJcXHUyMTkyXCIsXG4gIHVuZGVyYnJhY2U6IFwiXFx1MjNERlwiLFxuICBvdmVyYnJhY2U6IFwiXFx1MjNERVwiLFxuICBvdmVyZ3JvdXA6IFwiXFx1MjNFMFwiLFxuICB1bmRlcmdyb3VwOiBcIlxcdTIzRTFcIixcbiAgb3ZlcmxlZnRyaWdodGFycm93OiBcIlxcdTIxOTRcIixcbiAgdW5kZXJsZWZ0cmlnaHRhcnJvdzogXCJcXHUyMTk0XCIsXG4gIHhsZWZ0cmlnaHRhcnJvdzogXCJcXHUyMTk0XCIsXG4gIE92ZXJyaWdodGFycm93OiBcIlxcdTIxRDJcIixcbiAgeFJpZ2h0YXJyb3c6IFwiXFx1MjFEMlwiLFxuICBvdmVybGVmdGhhcnBvb246IFwiXFx1MjFCQ1wiLFxuICB4bGVmdGhhcnBvb251cDogXCJcXHUyMUJDXCIsXG4gIG92ZXJyaWdodGhhcnBvb246IFwiXFx1MjFDMFwiLFxuICB4cmlnaHRoYXJwb29udXA6IFwiXFx1MjFDMFwiLFxuICB4TGVmdGFycm93OiBcIlxcdTIxRDBcIixcbiAgeExlZnRyaWdodGFycm93OiBcIlxcdTIxRDRcIixcbiAgeGhvb2tsZWZ0YXJyb3c6IFwiXFx1MjFBOVwiLFxuICB4aG9va3JpZ2h0YXJyb3c6IFwiXFx1MjFBQVwiLFxuICB4bWFwc3RvOiBcIlxcdTIxQTZcIixcbiAgeHJpZ2h0aGFycG9vbmRvd246IFwiXFx1MjFDMVwiLFxuICB4bGVmdGhhcnBvb25kb3duOiBcIlxcdTIxQkRcIixcbiAgeHJpZ2h0bGVmdGhhcnBvb25zOiBcIlxcdTIxQ0NcIixcbiAgeGxlZnRyaWdodGhhcnBvb25zOiBcIlxcdTIxQ0JcIixcbiAgeHR3b2hlYWRsZWZ0YXJyb3c6IFwiXFx1MjE5RVwiLFxuICB4dHdvaGVhZHJpZ2h0YXJyb3c6IFwiXFx1MjFBMFwiLFxuICB4bG9uZ2VxdWFsOiBcIj1cIixcbiAgeHRvZnJvbTogXCJcXHUyMUM0XCIsXG4gIHhyaWdodGxlZnRhcnJvd3M6IFwiXFx1MjFDNFwiLFxuICB4cmlnaHRlcXVpbGlicml1bTogXCJcXHUyMUNDXCIsXG4gIC8vIE5vdCBhIHBlcmZlY3QgbWF0Y2guXG4gIHhsZWZ0ZXF1aWxpYnJpdW06IFwiXFx1MjFDQlwiLFxuICAvLyBOb25lIGJldHRlciBhdmFpbGFibGUuXG4gIFwiXFxcXGNkcmlnaHRhcnJvd1wiOiBcIlxcdTIxOTJcIixcbiAgXCJcXFxcY2RsZWZ0YXJyb3dcIjogXCJcXHUyMTkwXCIsXG4gIFwiXFxcXGNkbG9uZ2VxdWFsXCI6IFwiPVwiXG59O1xuXG52YXIgbWF0aE1Mbm9kZSA9IGZ1bmN0aW9uIG1hdGhNTG5vZGUobGFiZWwpIHtcbiAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFtuZXcgbWF0aE1MVHJlZS5UZXh0Tm9kZShzdHJldGNoeUNvZGVQb2ludFtsYWJlbC5yZXBsYWNlKC9eXFxcXC8sICcnKV0pXSk7XG4gIG5vZGUuc2V0QXR0cmlidXRlKFwic3RyZXRjaHlcIiwgXCJ0cnVlXCIpO1xuICByZXR1cm4gbm9kZTtcbn07IC8vIE1hbnkgb2YgdGhlIEthVGVYIFNWRyBpbWFnZXMgaGF2ZSBiZWVuIGFkYXB0ZWQgZnJvbSBnbHlwaHMgaW4gS2FUZVggZm9udHMuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgRGVzaWduIFNjaWVuY2UsIEluYy4gKDx3d3cubWF0aGpheC5vcmc+KVxuLy8gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcgS2hhbiBBY2FkZW15ICg8d3d3LmtoYW5hY2FkZW15Lm9yZz4pXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgU0lMIE9wZW4gRm9udCBMaWNlbnNlLCBWZXJzaW9uIDEuMS5cbi8vIFNlZSBcXG5odHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTFxuLy8gVmVyeSBMb25nIFNWR3Ncbi8vICAgIE1hbnkgb2YgdGhlIEthVGVYIHN0cmV0Y2h5IHdpZGUgZWxlbWVudHMgdXNlIGEgbG9uZyBTVkcgaW1hZ2UgYW5kIGFuXG4vLyAgICBvdmVyZmxvdzogaGlkZGVuIHRhY3RpYyB0byBhY2hpZXZlIGEgc3RyZXRjaHkgaW1hZ2Ugd2hpbGUgYXZvaWRpbmdcbi8vICAgIGRpc3RvcnRpb24gb2YgYXJyb3doZWFkcyBvciBicmFjZSBjb3JuZXJzLlxuLy8gICAgVGhlIFNWRyB0eXBpY2FsbHkgY29udGFpbnMgYSB2ZXJ5IGxvbmcgKDQwMCBlbSkgYXJyb3cuXG4vLyAgICBUaGUgU1ZHIGlzIGluIGEgY29udGFpbmVyIHNwYW4gdGhhdCBoYXMgb3ZlcmZsb3c6IGhpZGRlbiwgc28gdGhlIHNwYW5cbi8vICAgIGFjdHMgbGlrZSBhIHdpbmRvdyB0aGF0IGV4cG9zZXMgb25seSBwYXJ0IG9mIHRoZSAgU1ZHLlxuLy8gICAgVGhlIFNWRyBhbHdheXMgaGFzIGEgbG9uZ2VyLCB0aGlubmVyIGFzcGVjdCByYXRpbyB0aGFuIHRoZSBjb250YWluZXIgc3Bhbi5cbi8vICAgIEFmdGVyIHRoZSBTVkcgZmlsbHMgMTAwJSBvZiB0aGUgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIgc3Bhbixcbi8vICAgIHRoZXJlIGlzIGEgbG9uZyBhcnJvdyBzaGFmdCBsZWZ0IG92ZXIuIFRoYXQgbGVmdC1vdmVyIHNoYWZ0IGlzIG5vdCBzaG93bi5cbi8vICAgIEluc3RlYWQsIGl0IGlzIHNsaWNlZCBvZmYgYmVjYXVzZSB0aGUgc3BhbidzIENTUyBoYXMgb3ZlcmZsb3c6IGhpZGRlbi5cbi8vICAgIFRodXMsIHRoZSByZWFkZXIgc2VlcyBhbiBhcnJvdyB0aGF0IG1hdGNoZXMgdGhlIHN1YmplY3QgbWF0dGVyIHdpZHRoXG4vLyAgICB3aXRob3V0IGRpc3RvcnRpb24uXG4vLyAgICBTb21lIGZ1bmN0aW9ucywgc3VjaCBhcyBcXGNhbmNlbCwgbmVlZCB0byB2YXJ5IHRoZWlyIGFzcGVjdCByYXRpby4gVGhlc2Vcbi8vICAgIGZ1bmN0aW9ucyBkbyBub3QgZ2V0IHRoZSBvdmVyZmxvdyBTVkcgdHJlYXRtZW50LlxuLy8gU2Vjb25kIEJydXNoIFN0cm9rZVxuLy8gICAgTG93IHJlc29sdXRpb24gbW9uaXRvcnMgc3RydWdnbGUgdG8gZGlzcGxheSBpbWFnZXMgaW4gZmluZSBkZXRhaWwuXG4vLyAgICBTbyBicm93c2VycyBhcHBseSBhbnRpLWFsaWFzaW5nLiBBIGxvbmcgc3RyYWlnaHQgYXJyb3cgc2hhZnQgdGhlcmVmb3JlXG4vLyAgICB3aWxsIHNvbWV0aW1lcyBhcHBlYXIgYXMgaWYgaXQgaGFzIGEgYmx1cnJlZCBlZGdlLlxuLy8gICAgVG8gbWl0aWdhdGUgdGhpcywgdGhlc2UgU1ZHIGZpbGVzIGNvbnRhaW4gYSBzZWNvbmQgXCJicnVzaC1zdHJva2VcIiBvbiB0aGVcbi8vICAgIGFycm93IHNoYWZ0cy4gVGhhdCBpcywgYSBzZWNvbmQgbG9uZyB0aGluIHJlY3Rhbmd1bGFyIFNWRyBwYXRoIGhhcyBiZWVuXG4vLyAgICB3cml0dGVuIGRpcmVjdGx5IG9uIHRvcCBvZiBlYWNoIGFycm93IHNoYWZ0LiBUaGlzIHJlaW5mb3JjZW1lbnQgY2F1c2VzXG4vLyAgICBzb21lIG9mIHRoZSBzY3JlZW4gcGl4ZWxzIHRvIGRpc3BsYXkgYXMgYmxhY2sgaW5zdGVhZCBvZiB0aGUgYW50aS1hbGlhc2VkXG4vLyAgICBncmF5IHBpeGVsIHRoYXQgYSAgc2luZ2xlIHBhdGggd291bGQgZ2VuZXJhdGUuIFNvIHdlIGdldCBhcnJvdyBzaGFmdHNcbi8vICAgIHdob3NlIGVkZ2VzIGFwcGVhciB0byBiZSBzaGFycGVyLlxuLy8gSW4gdGhlIGthdGV4SW1hZ2VzRGF0YSBvYmplY3QganVzdCBiZWxvdywgdGhlIGRpbWVuc2lvbnMgYWxsXG4vLyBjb3JyZXNwb25kIHRvIHBhdGggZ2VvbWV0cnkgaW5zaWRlIHRoZSByZWxldmFudCBTVkcuXG4vLyBGb3IgZXhhbXBsZSwgXFxvdmVycmlnaHRhcnJvdyB1c2VzIHRoZSBzYW1lIGFycm93aGVhZCBhcyBnbHlwaCBVKzIxOTJcbi8vIGZyb20gdGhlIEthVGVYIE1haW4gZm9udC4gVGhlIHNjYWxpbmcgZmFjdG9yIGlzIDEwMDAuXG4vLyBUaGF0IGlzLCBpbnNpZGUgdGhlIGZvbnQsIHRoYXQgYXJyb3doZWFkIGlzIDUyMiB1bml0cyB0YWxsLCB3aGljaFxuLy8gY29ycmVzcG9uZHMgdG8gMC41MjIgZW0gaW5zaWRlIHRoZSBkb2N1bWVudC5cblxuXG52YXIga2F0ZXhJbWFnZXNEYXRhID0ge1xuICAvLyAgIHBhdGgocyksIG1pbldpZHRoLCBoZWlnaHQsIGFsaWduXG4gIG92ZXJyaWdodGFycm93OiBbW1wicmlnaHRhcnJvd1wiXSwgMC44ODgsIDUyMiwgXCJ4TWF4WU1pblwiXSxcbiAgb3ZlcmxlZnRhcnJvdzogW1tcImxlZnRhcnJvd1wiXSwgMC44ODgsIDUyMiwgXCJ4TWluWU1pblwiXSxcbiAgdW5kZXJyaWdodGFycm93OiBbW1wicmlnaHRhcnJvd1wiXSwgMC44ODgsIDUyMiwgXCJ4TWF4WU1pblwiXSxcbiAgdW5kZXJsZWZ0YXJyb3c6IFtbXCJsZWZ0YXJyb3dcIl0sIDAuODg4LCA1MjIsIFwieE1pbllNaW5cIl0sXG4gIHhyaWdodGFycm93OiBbW1wicmlnaHRhcnJvd1wiXSwgMS40NjksIDUyMiwgXCJ4TWF4WU1pblwiXSxcbiAgXCJcXFxcY2RyaWdodGFycm93XCI6IFtbXCJyaWdodGFycm93XCJdLCAzLjAsIDUyMiwgXCJ4TWF4WU1pblwiXSxcbiAgLy8gQ0QgbWlud3dpZHRoMi41cGNcbiAgeGxlZnRhcnJvdzogW1tcImxlZnRhcnJvd1wiXSwgMS40NjksIDUyMiwgXCJ4TWluWU1pblwiXSxcbiAgXCJcXFxcY2RsZWZ0YXJyb3dcIjogW1tcImxlZnRhcnJvd1wiXSwgMy4wLCA1MjIsIFwieE1pbllNaW5cIl0sXG4gIE92ZXJyaWdodGFycm93OiBbW1wiZG91YmxlcmlnaHRhcnJvd1wiXSwgMC44ODgsIDU2MCwgXCJ4TWF4WU1pblwiXSxcbiAgeFJpZ2h0YXJyb3c6IFtbXCJkb3VibGVyaWdodGFycm93XCJdLCAxLjUyNiwgNTYwLCBcInhNYXhZTWluXCJdLFxuICB4TGVmdGFycm93OiBbW1wiZG91YmxlbGVmdGFycm93XCJdLCAxLjUyNiwgNTYwLCBcInhNaW5ZTWluXCJdLFxuICBvdmVybGVmdGhhcnBvb246IFtbXCJsZWZ0aGFycG9vblwiXSwgMC44ODgsIDUyMiwgXCJ4TWluWU1pblwiXSxcbiAgeGxlZnRoYXJwb29udXA6IFtbXCJsZWZ0aGFycG9vblwiXSwgMC44ODgsIDUyMiwgXCJ4TWluWU1pblwiXSxcbiAgeGxlZnRoYXJwb29uZG93bjogW1tcImxlZnRoYXJwb29uZG93blwiXSwgMC44ODgsIDUyMiwgXCJ4TWluWU1pblwiXSxcbiAgb3ZlcnJpZ2h0aGFycG9vbjogW1tcInJpZ2h0aGFycG9vblwiXSwgMC44ODgsIDUyMiwgXCJ4TWF4WU1pblwiXSxcbiAgeHJpZ2h0aGFycG9vbnVwOiBbW1wicmlnaHRoYXJwb29uXCJdLCAwLjg4OCwgNTIyLCBcInhNYXhZTWluXCJdLFxuICB4cmlnaHRoYXJwb29uZG93bjogW1tcInJpZ2h0aGFycG9vbmRvd25cIl0sIDAuODg4LCA1MjIsIFwieE1heFlNaW5cIl0sXG4gIHhsb25nZXF1YWw6IFtbXCJsb25nZXF1YWxcIl0sIDAuODg4LCAzMzQsIFwieE1pbllNaW5cIl0sXG4gIFwiXFxcXGNkbG9uZ2VxdWFsXCI6IFtbXCJsb25nZXF1YWxcIl0sIDMuMCwgMzM0LCBcInhNaW5ZTWluXCJdLFxuICB4dHdvaGVhZGxlZnRhcnJvdzogW1tcInR3b2hlYWRsZWZ0YXJyb3dcIl0sIDAuODg4LCAzMzQsIFwieE1pbllNaW5cIl0sXG4gIHh0d29oZWFkcmlnaHRhcnJvdzogW1tcInR3b2hlYWRyaWdodGFycm93XCJdLCAwLjg4OCwgMzM0LCBcInhNYXhZTWluXCJdLFxuICBvdmVybGVmdHJpZ2h0YXJyb3c6IFtbXCJsZWZ0YXJyb3dcIiwgXCJyaWdodGFycm93XCJdLCAwLjg4OCwgNTIyXSxcbiAgb3ZlcmJyYWNlOiBbW1wibGVmdGJyYWNlXCIsIFwibWlkYnJhY2VcIiwgXCJyaWdodGJyYWNlXCJdLCAxLjYsIDU0OF0sXG4gIHVuZGVyYnJhY2U6IFtbXCJsZWZ0YnJhY2V1bmRlclwiLCBcIm1pZGJyYWNldW5kZXJcIiwgXCJyaWdodGJyYWNldW5kZXJcIl0sIDEuNiwgNTQ4XSxcbiAgdW5kZXJsZWZ0cmlnaHRhcnJvdzogW1tcImxlZnRhcnJvd1wiLCBcInJpZ2h0YXJyb3dcIl0sIDAuODg4LCA1MjJdLFxuICB4bGVmdHJpZ2h0YXJyb3c6IFtbXCJsZWZ0YXJyb3dcIiwgXCJyaWdodGFycm93XCJdLCAxLjc1LCA1MjJdLFxuICB4TGVmdHJpZ2h0YXJyb3c6IFtbXCJkb3VibGVsZWZ0YXJyb3dcIiwgXCJkb3VibGVyaWdodGFycm93XCJdLCAxLjc1LCA1NjBdLFxuICB4cmlnaHRsZWZ0aGFycG9vbnM6IFtbXCJsZWZ0aGFycG9vbmRvd25wbHVzXCIsIFwicmlnaHRoYXJwb29ucGx1c1wiXSwgMS43NSwgNzE2XSxcbiAgeGxlZnRyaWdodGhhcnBvb25zOiBbW1wibGVmdGhhcnBvb25wbHVzXCIsIFwicmlnaHRoYXJwb29uZG93bnBsdXNcIl0sIDEuNzUsIDcxNl0sXG4gIHhob29rbGVmdGFycm93OiBbW1wibGVmdGFycm93XCIsIFwicmlnaHRob29rXCJdLCAxLjA4LCA1MjJdLFxuICB4aG9va3JpZ2h0YXJyb3c6IFtbXCJsZWZ0aG9va1wiLCBcInJpZ2h0YXJyb3dcIl0sIDEuMDgsIDUyMl0sXG4gIG92ZXJsaW5lc2VnbWVudDogW1tcImxlZnRsaW5lc2VnbWVudFwiLCBcInJpZ2h0bGluZXNlZ21lbnRcIl0sIDAuODg4LCA1MjJdLFxuICB1bmRlcmxpbmVzZWdtZW50OiBbW1wibGVmdGxpbmVzZWdtZW50XCIsIFwicmlnaHRsaW5lc2VnbWVudFwiXSwgMC44ODgsIDUyMl0sXG4gIG92ZXJncm91cDogW1tcImxlZnRncm91cFwiLCBcInJpZ2h0Z3JvdXBcIl0sIDAuODg4LCAzNDJdLFxuICB1bmRlcmdyb3VwOiBbW1wibGVmdGdyb3VwdW5kZXJcIiwgXCJyaWdodGdyb3VwdW5kZXJcIl0sIDAuODg4LCAzNDJdLFxuICB4bWFwc3RvOiBbW1wibGVmdG1hcHN0b1wiLCBcInJpZ2h0YXJyb3dcIl0sIDEuNSwgNTIyXSxcbiAgeHRvZnJvbTogW1tcImxlZnRUb0Zyb21cIiwgXCJyaWdodFRvRnJvbVwiXSwgMS43NSwgNTI4XSxcbiAgLy8gVGhlIG5leHQgdGhyZWUgYXJyb3dzIGFyZSBmcm9tIHRoZSBtaGNoZW0gcGFja2FnZS5cbiAgLy8gSW4gbWhjaGVtLnN0eSwgbWluLWxlbmd0aCBpcyAyLjBlbS4gQnV0IHRoZXNlIGFycm93cyBtaWdodCBhcHBlYXIgaW4gdGhlXG4gIC8vIGRvY3VtZW50IGFzIFxceHJpZ2h0YXJyb3cgb3IgXFx4cmlnaHRsZWZ0aGFycG9vbnMuIFRob3NlIGhhdmVcbiAgLy8gbWluLWxlbmd0aCA9IDEuNzVlbSwgc28gd2Ugc2V0IG1pbi1sZW5ndGggb24gdGhlc2UgbmV4dCB0aHJlZSB0byBtYXRjaC5cbiAgeHJpZ2h0bGVmdGFycm93czogW1tcImJhcmFib3ZlbGVmdGFycm93XCIsIFwicmlnaHRhcnJvd2Fib3ZlYmFyXCJdLCAxLjc1LCA5MDFdLFxuICB4cmlnaHRlcXVpbGlicml1bTogW1tcImJhcmFib3Zlc2hvcnRsZWZ0aGFycG9vblwiLCBcInJpZ2h0aGFycG9vbmFib3Zlc2hvcnRiYXJcIl0sIDEuNzUsIDcxNl0sXG4gIHhsZWZ0ZXF1aWxpYnJpdW06IFtbXCJzaG9ydGJhcmFib3ZlbGVmdGhhcnBvb25cIiwgXCJzaG9ydHJpZ2h0aGFycG9vbmFib3ZlYmFyXCJdLCAxLjc1LCA3MTZdXG59O1xuXG52YXIgZ3JvdXBMZW5ndGggPSBmdW5jdGlvbiBncm91cExlbmd0aChhcmcpIHtcbiAgaWYgKGFyZy50eXBlID09PSBcIm9yZGdyb3VwXCIpIHtcbiAgICByZXR1cm4gYXJnLmJvZHkubGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG52YXIgc3ZnU3BhbiA9IGZ1bmN0aW9uIHN2Z1NwYW4oZ3JvdXAsIG9wdGlvbnMpIHtcbiAgLy8gQ3JlYXRlIGEgc3BhbiB3aXRoIGlubGluZSBTVkcgZm9yIHRoZSBlbGVtZW50LlxuICBmdW5jdGlvbiBidWlsZFN2Z1NwYW5fKCkge1xuICAgIHZhciB2aWV3Qm94V2lkdGggPSA0MDAwMDA7IC8vIGRlZmF1bHRcblxuICAgIHZhciBsYWJlbCA9IGdyb3VwLmxhYmVsLnNsaWNlKDEpO1xuXG4gICAgaWYgKHV0aWxzLmNvbnRhaW5zKFtcIndpZGVoYXRcIiwgXCJ3aWRlY2hlY2tcIiwgXCJ3aWRldGlsZGVcIiwgXCJ1dGlsZGVcIl0sIGxhYmVsKSkge1xuICAgICAgLy8gRWFjaCB0eXBlIGluIHRoZSBgaWZgIHN0YXRlbWVudCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlIFBhcnNlTm9kZVxuICAgICAgLy8gdHlwZXMgYmVsb3cuIFRoaXMgbmFycm93aW5nIGlzIHJlcXVpcmVkIHRvIGFjY2VzcyBgZ3JwLmJhc2VgLlxuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgdmFyIGdycCA9IGdyb3VwOyAvLyBUaGVyZSBhcmUgZm91ciBTVkcgaW1hZ2VzIGF2YWlsYWJsZSBmb3IgZWFjaCBmdW5jdGlvbi5cbiAgICAgIC8vIENob29zZSBhIHRhbGxlciBpbWFnZSB3aGVuIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMuXG5cbiAgICAgIHZhciBudW1DaGFycyA9IGdyb3VwTGVuZ3RoKGdycC5iYXNlKTtcbiAgICAgIHZhciB2aWV3Qm94SGVpZ2h0O1xuICAgICAgdmFyIHBhdGhOYW1lO1xuXG4gICAgICB2YXIgX2hlaWdodDtcblxuICAgICAgaWYgKG51bUNoYXJzID4gNSkge1xuICAgICAgICBpZiAobGFiZWwgPT09IFwid2lkZWhhdFwiIHx8IGxhYmVsID09PSBcIndpZGVjaGVja1wiKSB7XG4gICAgICAgICAgdmlld0JveEhlaWdodCA9IDQyMDtcbiAgICAgICAgICB2aWV3Qm94V2lkdGggPSAyMzY0O1xuICAgICAgICAgIF9oZWlnaHQgPSAwLjQyO1xuICAgICAgICAgIHBhdGhOYW1lID0gbGFiZWwgKyBcIjRcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3Qm94SGVpZ2h0ID0gMzEyO1xuICAgICAgICAgIHZpZXdCb3hXaWR0aCA9IDIzNDA7XG4gICAgICAgICAgX2hlaWdodCA9IDAuMzQ7XG4gICAgICAgICAgcGF0aE5hbWUgPSBcInRpbGRlNFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW1nSW5kZXggPSBbMSwgMSwgMiwgMiwgMywgM11bbnVtQ2hhcnNdO1xuXG4gICAgICAgIGlmIChsYWJlbCA9PT0gXCJ3aWRlaGF0XCIgfHwgbGFiZWwgPT09IFwid2lkZWNoZWNrXCIpIHtcbiAgICAgICAgICB2aWV3Qm94V2lkdGggPSBbMCwgMTA2MiwgMjM2NCwgMjM2NCwgMjM2NF1baW1nSW5kZXhdO1xuICAgICAgICAgIHZpZXdCb3hIZWlnaHQgPSBbMCwgMjM5LCAzMDAsIDM2MCwgNDIwXVtpbWdJbmRleF07XG4gICAgICAgICAgX2hlaWdodCA9IFswLCAwLjI0LCAwLjMsIDAuMywgMC4zNiwgMC40Ml1baW1nSW5kZXhdO1xuICAgICAgICAgIHBhdGhOYW1lID0gbGFiZWwgKyBpbWdJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3Qm94V2lkdGggPSBbMCwgNjAwLCAxMDMzLCAyMzM5LCAyMzQwXVtpbWdJbmRleF07XG4gICAgICAgICAgdmlld0JveEhlaWdodCA9IFswLCAyNjAsIDI4NiwgMzA2LCAzMTJdW2ltZ0luZGV4XTtcbiAgICAgICAgICBfaGVpZ2h0ID0gWzAsIDAuMjYsIDAuMjg2LCAwLjMsIDAuMzA2LCAwLjM0XVtpbWdJbmRleF07XG4gICAgICAgICAgcGF0aE5hbWUgPSBcInRpbGRlXCIgKyBpbWdJbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcGF0aCA9IG5ldyBQYXRoTm9kZShwYXRoTmFtZSk7XG4gICAgICB2YXIgc3ZnTm9kZSA9IG5ldyBTdmdOb2RlKFtwYXRoXSwge1xuICAgICAgICBcIndpZHRoXCI6IFwiMTAwJVwiLFxuICAgICAgICBcImhlaWdodFwiOiBtYWtlRW0oX2hlaWdodCksXG4gICAgICAgIFwidmlld0JveFwiOiBcIjAgMCBcIiArIHZpZXdCb3hXaWR0aCArIFwiIFwiICsgdmlld0JveEhlaWdodCxcbiAgICAgICAgXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCI6IFwibm9uZVwiXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNwYW46IGJ1aWxkQ29tbW9uLm1ha2VTdmdTcGFuKFtdLCBbc3ZnTm9kZV0sIG9wdGlvbnMpLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3BhbnMgPSBbXTtcbiAgICAgIHZhciBkYXRhID0ga2F0ZXhJbWFnZXNEYXRhW2xhYmVsXTtcbiAgICAgIHZhciBwYXRocyA9IGRhdGFbMF0sXG4gICAgICAgICAgX21pbldpZHRoID0gZGF0YVsxXSxcbiAgICAgICAgICBfdmlld0JveEhlaWdodCA9IGRhdGFbMl07XG5cbiAgICAgIHZhciBfaGVpZ2h0MiA9IF92aWV3Qm94SGVpZ2h0IC8gMTAwMDtcblxuICAgICAgdmFyIG51bVN2Z0NoaWxkcmVuID0gcGF0aHMubGVuZ3RoO1xuICAgICAgdmFyIHdpZHRoQ2xhc3NlcztcbiAgICAgIHZhciBhbGlnbnM7XG5cbiAgICAgIGlmIChudW1TdmdDaGlsZHJlbiA9PT0gMSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lOiBBbGwgdGhlc2UgY2FzZXMgbXVzdCBiZSBvZiB0aGUgNC10dXBsZSB0eXBlLlxuICAgICAgICB2YXIgYWxpZ24xID0gZGF0YVszXTtcbiAgICAgICAgd2lkdGhDbGFzc2VzID0gW1wiaGlkZS10YWlsXCJdO1xuICAgICAgICBhbGlnbnMgPSBbYWxpZ24xXTtcbiAgICAgIH0gZWxzZSBpZiAobnVtU3ZnQ2hpbGRyZW4gPT09IDIpIHtcbiAgICAgICAgd2lkdGhDbGFzc2VzID0gW1wiaGFsZmFycm93LWxlZnRcIiwgXCJoYWxmYXJyb3ctcmlnaHRcIl07XG4gICAgICAgIGFsaWducyA9IFtcInhNaW5ZTWluXCIsIFwieE1heFlNaW5cIl07XG4gICAgICB9IGVsc2UgaWYgKG51bVN2Z0NoaWxkcmVuID09PSAzKSB7XG4gICAgICAgIHdpZHRoQ2xhc3NlcyA9IFtcImJyYWNlLWxlZnRcIiwgXCJicmFjZS1jZW50ZXJcIiwgXCJicmFjZS1yaWdodFwiXTtcbiAgICAgICAgYWxpZ25zID0gW1wieE1pbllNaW5cIiwgXCJ4TWlkWU1pblwiLCBcInhNYXhZTWluXCJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycmVjdCBrYXRleEltYWdlc0RhdGEgb3IgdXBkYXRlIGNvZGUgaGVyZSB0byBzdXBwb3J0XFxuICAgICAgICAgICAgICAgICAgICBcIiArIG51bVN2Z0NoaWxkcmVuICsgXCIgY2hpbGRyZW4uXCIpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVN2Z0NoaWxkcmVuOyBpKyspIHtcbiAgICAgICAgdmFyIF9wYXRoID0gbmV3IFBhdGhOb2RlKHBhdGhzW2ldKTtcblxuICAgICAgICB2YXIgX3N2Z05vZGUgPSBuZXcgU3ZnTm9kZShbX3BhdGhdLCB7XG4gICAgICAgICAgXCJ3aWR0aFwiOiBcIjQwMGVtXCIsXG4gICAgICAgICAgXCJoZWlnaHRcIjogbWFrZUVtKF9oZWlnaHQyKSxcbiAgICAgICAgICBcInZpZXdCb3hcIjogXCIwIDAgXCIgKyB2aWV3Qm94V2lkdGggKyBcIiBcIiArIF92aWV3Qm94SGVpZ2h0LFxuICAgICAgICAgIFwicHJlc2VydmVBc3BlY3RSYXRpb1wiOiBhbGlnbnNbaV0gKyBcIiBzbGljZVwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfc3BhbiA9IGJ1aWxkQ29tbW9uLm1ha2VTdmdTcGFuKFt3aWR0aENsYXNzZXNbaV1dLCBbX3N2Z05vZGVdLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAobnVtU3ZnQ2hpbGRyZW4gPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3BhbjogX3NwYW4sXG4gICAgICAgICAgICBtaW5XaWR0aDogX21pbldpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0MlxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3NwYW4uc3R5bGUuaGVpZ2h0ID0gbWFrZUVtKF9oZWlnaHQyKTtcbiAgICAgICAgICBzcGFucy5wdXNoKF9zcGFuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzcGFuOiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJzdHJldGNoeVwiXSwgc3BhbnMsIG9wdGlvbnMpLFxuICAgICAgICBtaW5XaWR0aDogX21pbldpZHRoLFxuICAgICAgICBoZWlnaHQ6IF9oZWlnaHQyXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBidWlsZFN2Z1NwYW5fKClcblxuXG4gIHZhciBfYnVpbGRTdmdTcGFuXyA9IGJ1aWxkU3ZnU3Bhbl8oKSxcbiAgICAgIHNwYW4gPSBfYnVpbGRTdmdTcGFuXy5zcGFuLFxuICAgICAgbWluV2lkdGggPSBfYnVpbGRTdmdTcGFuXy5taW5XaWR0aCxcbiAgICAgIGhlaWdodCA9IF9idWlsZFN2Z1NwYW5fLmhlaWdodDsgLy8gTm90ZSB0aGF0IHdlIGFyZSByZXR1cm5pbmcgc3Bhbi5kZXB0aCA9IDAuXG4gIC8vIEFueSBhZGp1c3RtZW50cyByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmUgbXVzdCBiZSBkb25lIGluIGJ1aWxkSFRNTC5cblxuXG4gIHNwYW4uaGVpZ2h0ID0gaGVpZ2h0O1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IG1ha2VFbShoZWlnaHQpO1xuXG4gIGlmIChtaW5XaWR0aCA+IDApIHtcbiAgICBzcGFuLnN0eWxlLm1pbldpZHRoID0gbWFrZUVtKG1pbldpZHRoKTtcbiAgfVxuXG4gIHJldHVybiBzcGFuO1xufTtcblxudmFyIGVuY2xvc2VTcGFuID0gZnVuY3Rpb24gZW5jbG9zZVNwYW4oaW5uZXIsIGxhYmVsLCB0b3BQYWQsIGJvdHRvbVBhZCwgb3B0aW9ucykge1xuICAvLyBSZXR1cm4gYW4gaW1hZ2Ugc3BhbiBmb3IgXFxjYW5jZWwsIFxcYmNhbmNlbCwgXFx4Y2FuY2VsLCBcXGZib3gsIG9yIFxcYW5nbFxuICB2YXIgaW1nO1xuICB2YXIgdG90YWxIZWlnaHQgPSBpbm5lci5oZWlnaHQgKyBpbm5lci5kZXB0aCArIHRvcFBhZCArIGJvdHRvbVBhZDtcblxuICBpZiAoL2Zib3h8Y29sb3J8YW5nbC8udGVzdChsYWJlbCkpIHtcbiAgICBpbWcgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJzdHJldGNoeVwiLCBsYWJlbF0sIFtdLCBvcHRpb25zKTtcblxuICAgIGlmIChsYWJlbCA9PT0gXCJmYm94XCIpIHtcbiAgICAgIHZhciBjb2xvciA9IG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5nZXRDb2xvcigpO1xuXG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgaW1nLnN0eWxlLmJvcmRlckNvbG9yID0gY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFxcY2FuY2VsLCBcXGJjYW5jZWwsIG9yIFxceGNhbmNlbFxuICAgIC8vIFNpbmNlIFxcY2FuY2VsJ3MgU1ZHIGlzIGlubGluZSBhbmQgaXQgb21pdHMgdGhlIHZpZXdCb3ggYXR0cmlidXRlLFxuICAgIC8vIGl0cyBzdHJva2Utd2lkdGggd2lsbCBub3QgdmFyeSB3aXRoIHNwYW4gYXJlYS5cbiAgICB2YXIgbGluZXMgPSBbXTtcblxuICAgIGlmICgvXltieF1jYW5jZWwkLy50ZXN0KGxhYmVsKSkge1xuICAgICAgbGluZXMucHVzaChuZXcgTGluZU5vZGUoe1xuICAgICAgICBcIngxXCI6IFwiMFwiLFxuICAgICAgICBcInkxXCI6IFwiMFwiLFxuICAgICAgICBcIngyXCI6IFwiMTAwJVwiLFxuICAgICAgICBcInkyXCI6IFwiMTAwJVwiLFxuICAgICAgICBcInN0cm9rZS13aWR0aFwiOiBcIjAuMDQ2ZW1cIlxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmICgvXng/Y2FuY2VsJC8udGVzdChsYWJlbCkpIHtcbiAgICAgIGxpbmVzLnB1c2gobmV3IExpbmVOb2RlKHtcbiAgICAgICAgXCJ4MVwiOiBcIjBcIixcbiAgICAgICAgXCJ5MVwiOiBcIjEwMCVcIixcbiAgICAgICAgXCJ4MlwiOiBcIjEwMCVcIixcbiAgICAgICAgXCJ5MlwiOiBcIjBcIixcbiAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogXCIwLjA0NmVtXCJcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB2YXIgc3ZnTm9kZSA9IG5ldyBTdmdOb2RlKGxpbmVzLCB7XG4gICAgICBcIndpZHRoXCI6IFwiMTAwJVwiLFxuICAgICAgXCJoZWlnaHRcIjogbWFrZUVtKHRvdGFsSGVpZ2h0KVxuICAgIH0pO1xuICAgIGltZyA9IGJ1aWxkQ29tbW9uLm1ha2VTdmdTcGFuKFtdLCBbc3ZnTm9kZV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgaW1nLmhlaWdodCA9IHRvdGFsSGVpZ2h0O1xuICBpbWcuc3R5bGUuaGVpZ2h0ID0gbWFrZUVtKHRvdGFsSGVpZ2h0KTtcbiAgcmV0dXJuIGltZztcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHN0cmV0Y2h5ID0gKHtcbiAgZW5jbG9zZVNwYW46IGVuY2xvc2VTcGFuLFxuICBtYXRoTUxub2RlOiBtYXRoTUxub2RlLFxuICBzdmdTcGFuOiBzdmdTcGFuXG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9wYXJzZU5vZGUuanNcblxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgbm9kZSBpcyBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJucyBpdCB3aXRoIHN0cmljdGVyXG4gKiB0eXBpbmcuIFRocm93cyBpZiB0aGUgbm9kZSdzIHR5cGUgZG9lcyBub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vZGVUeXBlKG5vZGUsIHR5cGUpIHtcbiAgaWYgKCFub2RlIHx8IG5vZGUudHlwZSAhPT0gdHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG5vZGUgb2YgdHlwZSBcIiArIHR5cGUgKyBcIiwgYnV0IGdvdCBcIiArIChub2RlID8gXCJub2RlIG9mIHR5cGUgXCIgKyBub2RlLnR5cGUgOiBTdHJpbmcobm9kZSkpKTtcbiAgfSAvLyAkRmxvd0ZpeE1lLCA+PTAuMTI1XG5cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbm9kZSBtb3JlIHN0cmljdGx5IHR5cGVkIGlmZiBpdCBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4gT3RoZXJ3aXNlLFxuICogcmV0dXJucyBudWxsLlxuICovXG5cbmZ1bmN0aW9uIGFzc2VydFN5bWJvbE5vZGVUeXBlKG5vZGUpIHtcbiAgdmFyIHR5cGVkTm9kZSA9IGNoZWNrU3ltYm9sTm9kZVR5cGUobm9kZSk7XG5cbiAgaWYgKCF0eXBlZE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub2RlIG9mIHN5bWJvbCBncm91cCB0eXBlLCBidXQgZ290IFwiICsgKG5vZGUgPyBcIm5vZGUgb2YgdHlwZSBcIiArIG5vZGUudHlwZSA6IFN0cmluZyhub2RlKSkpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVkTm9kZTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbm9kZSBtb3JlIHN0cmljdGx5IHR5cGVkIGlmZiBpdCBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4gT3RoZXJ3aXNlLFxuICogcmV0dXJucyBudWxsLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU3ltYm9sTm9kZVR5cGUobm9kZSkge1xuICBpZiAobm9kZSAmJiAobm9kZS50eXBlID09PSBcImF0b21cIiB8fCBOT05fQVRPTVMuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKSkpIHtcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvYWNjZW50LmpzXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIE5PVEU6IFVubGlrZSBtb3N0IGBodG1sQnVpbGRlcmBzLCB0aGlzIG9uZSBoYW5kbGVzIG5vdCBvbmx5IFwiYWNjZW50XCIsIGJ1dFxuLy8gYWxzbyBcInN1cHN1YlwiIHNpbmNlIGFuIGFjY2VudCBjYW4gYWZmZWN0IHN1cGVyL3N1YnNjcmlwdGluZy5cbnZhciBodG1sQnVpbGRlciA9IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdycCwgb3B0aW9ucykge1xuICAvLyBBY2NlbnRzIGFyZSBoYW5kbGVkIGluIHRoZSBUZVhib29rIHBnLiA0NDMsIHJ1bGUgMTIuXG4gIHZhciBiYXNlO1xuICB2YXIgZ3JvdXA7XG4gIHZhciBzdXBTdWJHcm91cDtcblxuICBpZiAoZ3JwICYmIGdycC50eXBlID09PSBcInN1cHN1YlwiKSB7XG4gICAgLy8gSWYgb3VyIGJhc2UgaXMgYSBjaGFyYWN0ZXIgYm94LCBhbmQgd2UgaGF2ZSBzdXBlcnNjcmlwdHMgYW5kXG4gICAgLy8gc3Vic2NyaXB0cywgdGhlIHN1cHN1YiB3aWxsIGRlZmVyIHRvIHVzLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50XG4gICAgLy8gdG8gYXR0YWNoIHRoZSBzdXBlcnNjcmlwdHMgYW5kIHN1YnNjcmlwdHMgdG8gdGhlIGlubmVyIGJvZHkgKHNvXG4gICAgLy8gdGhhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHN1cGVyc2NyaXB0cyBhbmQgc3Vic2NyaXB0cyB3b24ndCBiZVxuICAgIC8vIGFmZmVjdGVkIGJ5IHRoZSBoZWlnaHQgb2YgdGhlIGFjY2VudCkuIFdlIGFjY29tcGxpc2ggdGhpcyBieVxuICAgIC8vIHN0aWNraW5nIHRoZSBiYXNlIG9mIHRoZSBhY2NlbnQgaW50byB0aGUgYmFzZSBvZiB0aGUgc3Vwc3ViLCBhbmRcbiAgICAvLyByZW5kZXJpbmcgdGhhdCwgd2hpbGUga2VlcGluZyB0cmFjayBvZiB3aGVyZSB0aGUgYWNjZW50IGlzLlxuICAgIC8vIFRoZSByZWFsIGFjY2VudCBncm91cCBpcyB0aGUgYmFzZSBvZiB0aGUgc3Vwc3ViIGdyb3VwXG4gICAgZ3JvdXAgPSBhc3NlcnROb2RlVHlwZShncnAuYmFzZSwgXCJhY2NlbnRcIik7IC8vIFRoZSBjaGFyYWN0ZXIgYm94IGlzIHRoZSBiYXNlIG9mIHRoZSBhY2NlbnQgZ3JvdXBcblxuICAgIGJhc2UgPSBncm91cC5iYXNlOyAvLyBTdGljayB0aGUgY2hhcmFjdGVyIGJveCBpbnRvIHRoZSBiYXNlIG9mIHRoZSBzdXBzdWIgZ3JvdXBcblxuICAgIGdycC5iYXNlID0gYmFzZTsgLy8gUmVyZW5kZXIgdGhlIHN1cHN1YiBncm91cCB3aXRoIGl0cyBuZXcgYmFzZSwgYW5kIHN0b3JlIHRoYXRcbiAgICAvLyByZXN1bHQuXG5cbiAgICBzdXBTdWJHcm91cCA9IGFzc2VydFNwYW4oYnVpbGRHcm91cChncnAsIG9wdGlvbnMpKTsgLy8gcmVzZXQgb3JpZ2luYWwgYmFzZVxuXG4gICAgZ3JwLmJhc2UgPSBncm91cDtcbiAgfSBlbHNlIHtcbiAgICBncm91cCA9IGFzc2VydE5vZGVUeXBlKGdycCwgXCJhY2NlbnRcIik7XG4gICAgYmFzZSA9IGdyb3VwLmJhc2U7XG4gIH0gLy8gQnVpbGQgdGhlIGJhc2UgZ3JvdXBcblxuXG4gIHZhciBib2R5ID0gYnVpbGRHcm91cChiYXNlLCBvcHRpb25zLmhhdmluZ0NyYW1wZWRTdHlsZSgpKTsgLy8gRG9lcyB0aGUgYWNjZW50IG5lZWQgdG8gc2hpZnQgZm9yIHRoZSBza2V3IG9mIGEgY2hhcmFjdGVyP1xuXG4gIHZhciBtdXN0U2hpZnQgPSBncm91cC5pc1NoaWZ0eSAmJiB1dGlscy5pc0NoYXJhY3RlckJveChiYXNlKTsgLy8gQ2FsY3VsYXRlIHRoZSBza2V3IG9mIHRoZSBhY2NlbnQuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGxpbmUgXCJJZiB0aGVcbiAgLy8gbnVjbGV1cyBpcyBub3QgYSBzaW5nbGUgY2hhcmFjdGVyLCBsZXQgcyA9IDA7IG90aGVyd2lzZSBzZXQgcyB0byB0aGVcbiAgLy8ga2VybiBhbW91bnQgZm9yIHRoZSBudWNsZXVzIGZvbGxvd2VkIGJ5IHRoZSBcXHNrZXdjaGFyIG9mIGl0cyBmb250LlwiXG4gIC8vIE5vdGUgdGhhdCBvdXIgc2tldyBtZXRyaWNzIGFyZSBqdXN0IHRoZSBrZXJuIGJldHdlZW4gZWFjaCBjaGFyYWN0ZXJcbiAgLy8gYW5kIHRoZSBza2V3Y2hhci5cblxuICB2YXIgc2tldyA9IDA7XG5cbiAgaWYgKG11c3RTaGlmdCkge1xuICAgIC8vIElmIHRoZSBiYXNlIGlzIGEgY2hhcmFjdGVyIGJveCwgdGhlbiB3ZSB3YW50IHRoZSBza2V3IG9mIHRoZVxuICAgIC8vIGlubmVybW9zdCBjaGFyYWN0ZXIuIFRvIGRvIHRoYXQsIHdlIGZpbmQgdGhlIGlubmVybW9zdCBjaGFyYWN0ZXI6XG4gICAgdmFyIGJhc2VDaGFyID0gdXRpbHMuZ2V0QmFzZUVsZW0oYmFzZSk7IC8vIFRoZW4sIHdlIHJlbmRlciBpdHMgZ3JvdXAgdG8gZ2V0IHRoZSBzeW1ib2wgaW5zaWRlIGl0XG5cbiAgICB2YXIgYmFzZUdyb3VwID0gYnVpbGRHcm91cChiYXNlQ2hhciwgb3B0aW9ucy5oYXZpbmdDcmFtcGVkU3R5bGUoKSk7IC8vIEZpbmFsbHksIHdlIHB1bGwgdGhlIHNrZXcgb2ZmIG9mIHRoZSBzeW1ib2wuXG5cbiAgICBza2V3ID0gYXNzZXJ0U3ltYm9sRG9tTm9kZShiYXNlR3JvdXApLnNrZXc7IC8vIE5vdGUgdGhhdCB3ZSBub3cgdGhyb3cgYXdheSBiYXNlR3JvdXAsIGJlY2F1c2UgdGhlIGxheWVycyB3ZVxuICAgIC8vIHJlbW92ZWQgd2l0aCBnZXRCYXNlRWxlbSBtaWdodCBjb250YWluIHRoaW5ncyBsaWtlIFxcY29sb3Igd2hpY2hcbiAgICAvLyB3ZSBjYW4ndCBnZXQgcmlkIG9mLlxuICAgIC8vIFRPRE8oZW1pbHkpOiBGaW5kIGEgYmV0dGVyIHdheSB0byBnZXQgdGhlIHNrZXdcbiAgfVxuXG4gIHZhciBhY2NlbnRCZWxvdyA9IGdyb3VwLmxhYmVsID09PSBcIlxcXFxjXCI7IC8vIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlIGJldHdlZW4gdGhlIGJvZHkgYW5kIHRoZSBhY2NlbnRcblxuICB2YXIgY2xlYXJhbmNlID0gYWNjZW50QmVsb3cgPyBib2R5LmhlaWdodCArIGJvZHkuZGVwdGggOiBNYXRoLm1pbihib2R5LmhlaWdodCwgb3B0aW9ucy5mb250TWV0cmljcygpLnhIZWlnaHQpOyAvLyBCdWlsZCB0aGUgYWNjZW50XG5cbiAgdmFyIGFjY2VudEJvZHk7XG5cbiAgaWYgKCFncm91cC5pc1N0cmV0Y2h5KSB7XG4gICAgdmFyIGFjY2VudDtcbiAgICB2YXIgd2lkdGg7XG5cbiAgICBpZiAoZ3JvdXAubGFiZWwgPT09IFwiXFxcXHZlY1wiKSB7XG4gICAgICAvLyBCZWZvcmUgdmVyc2lvbiAwLjksIFxcdmVjIHVzZWQgdGhlIGNvbWJpbmluZyBmb250IGdseXBoIFUrMjBENy5cbiAgICAgIC8vIEJ1dCBicm93c2VycywgZXNwZWNpYWxseSBTYWZhcmksIGFyZSBub3QgY29uc2lzdGVudCBpbiBob3cgdGhleVxuICAgICAgLy8gcmVuZGVyIGNvbWJpbmluZyBjaGFyYWN0ZXJzIHdoZW4gbm90IHByZWNlZGVkIGJ5IGEgY2hhcmFjdGVyLlxuICAgICAgLy8gU28gbm93IHdlIHVzZSBhbiBTVkcuXG4gICAgICAvLyBJZiBTYWZhcmkgcmVmb3Jtcywgd2Ugc2hvdWxkIGNvbnNpZGVyIHJldmVydGluZyB0byB0aGUgZ2x5cGguXG4gICAgICBhY2NlbnQgPSBidWlsZENvbW1vbi5zdGF0aWNTdmcoXCJ2ZWNcIiwgb3B0aW9ucyk7XG4gICAgICB3aWR0aCA9IGJ1aWxkQ29tbW9uLnN2Z0RhdGEudmVjWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NlbnQgPSBidWlsZENvbW1vbi5tYWtlT3JkKHtcbiAgICAgICAgbW9kZTogZ3JvdXAubW9kZSxcbiAgICAgICAgdGV4dDogZ3JvdXAubGFiZWxcbiAgICAgIH0sIG9wdGlvbnMsIFwidGV4dG9yZFwiKTtcbiAgICAgIGFjY2VudCA9IGFzc2VydFN5bWJvbERvbU5vZGUoYWNjZW50KTsgLy8gUmVtb3ZlIHRoZSBpdGFsaWMgY29ycmVjdGlvbiBvZiB0aGUgYWNjZW50LCBiZWNhdXNlIGl0IG9ubHkgc2VydmVzIHRvXG4gICAgICAvLyBzaGlmdCB0aGUgYWNjZW50IG92ZXIgdG8gYSBwbGFjZSB3ZSBkb24ndCB3YW50LlxuXG4gICAgICBhY2NlbnQuaXRhbGljID0gMDtcbiAgICAgIHdpZHRoID0gYWNjZW50LndpZHRoO1xuXG4gICAgICBpZiAoYWNjZW50QmVsb3cpIHtcbiAgICAgICAgY2xlYXJhbmNlICs9IGFjY2VudC5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhY2NlbnRCb2R5ID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiYWNjZW50LWJvZHlcIl0sIFthY2NlbnRdKTsgLy8gXCJGdWxsXCIgYWNjZW50cyBleHBhbmQgdGhlIHdpZHRoIG9mIHRoZSByZXN1bHRpbmcgc3ltYm9sIHRvIGJlXG4gICAgLy8gYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZSBhY2NlbnQsIGFuZCBvdmVybGFwIGRpcmVjdGx5IG9udG8gdGhlXG4gICAgLy8gY2hhcmFjdGVyIHdpdGhvdXQgYW55IHZlcnRpY2FsIG9mZnNldC5cblxuICAgIHZhciBhY2NlbnRGdWxsID0gZ3JvdXAubGFiZWwgPT09IFwiXFxcXHRleHRjaXJjbGVkXCI7XG5cbiAgICBpZiAoYWNjZW50RnVsbCkge1xuICAgICAgYWNjZW50Qm9keS5jbGFzc2VzLnB1c2goJ2FjY2VudC1mdWxsJyk7XG4gICAgICBjbGVhcmFuY2UgPSBib2R5LmhlaWdodDtcbiAgICB9IC8vIFNoaWZ0IHRoZSBhY2NlbnQgb3ZlciBieSB0aGUgc2tldy5cblxuXG4gICAgdmFyIGxlZnQgPSBza2V3OyAvLyBDU1MgZGVmaW5lcyBgLmthdGV4IC5hY2NlbnQgLmFjY2VudC1ib2R5Om5vdCguYWNjZW50LWZ1bGwpIHsgd2lkdGg6IDAgfWBcbiAgICAvLyBzbyB0aGF0IHRoZSBhY2NlbnQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSBib3VuZGluZyBib3guXG4gICAgLy8gV2UgbmVlZCB0byBzaGlmdCB0aGUgY2hhcmFjdGVyIGJ5IGl0cyB3aWR0aCAoZWZmZWN0aXZlbHkgaGFsZlxuICAgIC8vIGl0cyB3aWR0aCkgdG8gY29tcGVuc2F0ZS5cblxuICAgIGlmICghYWNjZW50RnVsbCkge1xuICAgICAgbGVmdCAtPSB3aWR0aCAvIDI7XG4gICAgfVxuXG4gICAgYWNjZW50Qm9keS5zdHlsZS5sZWZ0ID0gbWFrZUVtKGxlZnQpOyAvLyBcXHRleHRjaXJjbGVkIHVzZXMgdGhlIFxcYmlnY2lyYyBnbHlwaCwgc28gaXQgbmVlZHMgc29tZVxuICAgIC8vIHZlcnRpY2FsIGFkanVzdG1lbnQgdG8gbWF0Y2ggTGFUZVguXG5cbiAgICBpZiAoZ3JvdXAubGFiZWwgPT09IFwiXFxcXHRleHRjaXJjbGVkXCIpIHtcbiAgICAgIGFjY2VudEJvZHkuc3R5bGUudG9wID0gXCIuMmVtXCI7XG4gICAgfVxuXG4gICAgYWNjZW50Qm9keSA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiZmlyc3RCYXNlbGluZVwiLFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBib2R5XG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwia2VyblwiLFxuICAgICAgICBzaXplOiAtY2xlYXJhbmNlXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBhY2NlbnRCb2R5XG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGFjY2VudEJvZHkgPSBzdHJldGNoeS5zdmdTcGFuKGdyb3VwLCBvcHRpb25zKTtcbiAgICBhY2NlbnRCb2R5ID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJmaXJzdEJhc2VsaW5lXCIsXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGJvZHlcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGFjY2VudEJvZHksXG4gICAgICAgIHdyYXBwZXJDbGFzc2VzOiBbXCJzdmctYWxpZ25cIl0sXG4gICAgICAgIHdyYXBwZXJTdHlsZTogc2tldyA+IDAgPyB7XG4gICAgICAgICAgd2lkdGg6IFwiY2FsYygxMDAlIC0gXCIgKyBtYWtlRW0oMiAqIHNrZXcpICsgXCIpXCIsXG4gICAgICAgICAgbWFyZ2luTGVmdDogbWFrZUVtKDIgKiBza2V3KVxuICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIGFjY2VudFdyYXAgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIFwiYWNjZW50XCJdLCBbYWNjZW50Qm9keV0sIG9wdGlvbnMpO1xuXG4gIGlmIChzdXBTdWJHcm91cCkge1xuICAgIC8vIEhlcmUsIHdlIHJlcGxhY2UgdGhlIFwiYmFzZVwiIGNoaWxkIG9mIHRoZSBzdXBzdWIgd2l0aCBvdXIgbmV3bHlcbiAgICAvLyBnZW5lcmF0ZWQgYWNjZW50LlxuICAgIHN1cFN1Ykdyb3VwLmNoaWxkcmVuWzBdID0gYWNjZW50V3JhcDsgLy8gU2luY2Ugd2UgZG9uJ3QgcmVydW4gdGhlIGhlaWdodCBjYWxjdWxhdGlvbiBhZnRlciByZXBsYWNpbmcgdGhlXG4gICAgLy8gYWNjZW50LCB3ZSBtYW51YWxseSByZWNhbGN1bGF0ZSBoZWlnaHQuXG5cbiAgICBzdXBTdWJHcm91cC5oZWlnaHQgPSBNYXRoLm1heChhY2NlbnRXcmFwLmhlaWdodCwgc3VwU3ViR3JvdXAuaGVpZ2h0KTsgLy8gQWNjZW50cyBzaG91bGQgYWx3YXlzIGJlIG9yZHMsIGV2ZW4gd2hlbiB0aGVpciBpbm5hcmRzIGFyZSBub3QuXG5cbiAgICBzdXBTdWJHcm91cC5jbGFzc2VzWzBdID0gXCJtb3JkXCI7XG4gICAgcmV0dXJuIHN1cFN1Ykdyb3VwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhY2NlbnRXcmFwO1xuICB9XG59O1xuXG52YXIgbWF0aG1sQnVpbGRlciA9IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIGFjY2VudE5vZGUgPSBncm91cC5pc1N0cmV0Y2h5ID8gc3RyZXRjaHkubWF0aE1Mbm9kZShncm91cC5sYWJlbCkgOiBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFttYWtlVGV4dChncm91cC5sYWJlbCwgZ3JvdXAubW9kZSldKTtcbiAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vdmVyXCIsIFtidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJhc2UsIG9wdGlvbnMpLCBhY2NlbnROb2RlXSk7XG4gIG5vZGUuc2V0QXR0cmlidXRlKFwiYWNjZW50XCIsIFwidHJ1ZVwiKTtcbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTk9OX1NUUkVUQ0hZX0FDQ0VOVF9SRUdFWCA9IG5ldyBSZWdFeHAoW1wiXFxcXGFjdXRlXCIsIFwiXFxcXGdyYXZlXCIsIFwiXFxcXGRkb3RcIiwgXCJcXFxcdGlsZGVcIiwgXCJcXFxcYmFyXCIsIFwiXFxcXGJyZXZlXCIsIFwiXFxcXGNoZWNrXCIsIFwiXFxcXGhhdFwiLCBcIlxcXFx2ZWNcIiwgXCJcXFxcZG90XCIsIFwiXFxcXG1hdGhyaW5nXCJdLm1hcChmdW5jdGlvbiAoYWNjZW50KSB7XG4gIHJldHVybiBcIlxcXFxcIiArIGFjY2VudDtcbn0pLmpvaW4oXCJ8XCIpKTsgLy8gQWNjZW50c1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiYWNjZW50XCIsXG4gIG5hbWVzOiBbXCJcXFxcYWN1dGVcIiwgXCJcXFxcZ3JhdmVcIiwgXCJcXFxcZGRvdFwiLCBcIlxcXFx0aWxkZVwiLCBcIlxcXFxiYXJcIiwgXCJcXFxcYnJldmVcIiwgXCJcXFxcY2hlY2tcIiwgXCJcXFxcaGF0XCIsIFwiXFxcXHZlY1wiLCBcIlxcXFxkb3RcIiwgXCJcXFxcbWF0aHJpbmdcIiwgXCJcXFxcd2lkZWNoZWNrXCIsIFwiXFxcXHdpZGVoYXRcIiwgXCJcXFxcd2lkZXRpbGRlXCIsIFwiXFxcXG92ZXJyaWdodGFycm93XCIsIFwiXFxcXG92ZXJsZWZ0YXJyb3dcIiwgXCJcXFxcT3ZlcnJpZ2h0YXJyb3dcIiwgXCJcXFxcb3ZlcmxlZnRyaWdodGFycm93XCIsIFwiXFxcXG92ZXJncm91cFwiLCBcIlxcXFxvdmVybGluZXNlZ21lbnRcIiwgXCJcXFxcb3ZlcmxlZnRoYXJwb29uXCIsIFwiXFxcXG92ZXJyaWdodGhhcnBvb25cIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICB2YXIgYmFzZSA9IG5vcm1hbGl6ZUFyZ3VtZW50KGFyZ3NbMF0pO1xuICAgIHZhciBpc1N0cmV0Y2h5ID0gIU5PTl9TVFJFVENIWV9BQ0NFTlRfUkVHRVgudGVzdChjb250ZXh0LmZ1bmNOYW1lKTtcbiAgICB2YXIgaXNTaGlmdHkgPSAhaXNTdHJldGNoeSB8fCBjb250ZXh0LmZ1bmNOYW1lID09PSBcIlxcXFx3aWRlaGF0XCIgfHwgY29udGV4dC5mdW5jTmFtZSA9PT0gXCJcXFxcd2lkZXRpbGRlXCIgfHwgY29udGV4dC5mdW5jTmFtZSA9PT0gXCJcXFxcd2lkZWNoZWNrXCI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiYWNjZW50XCIsXG4gICAgICBtb2RlOiBjb250ZXh0LnBhcnNlci5tb2RlLFxuICAgICAgbGFiZWw6IGNvbnRleHQuZnVuY05hbWUsXG4gICAgICBpc1N0cmV0Y2h5OiBpc1N0cmV0Y2h5LFxuICAgICAgaXNTaGlmdHk6IGlzU2hpZnR5LFxuICAgICAgYmFzZTogYmFzZVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBodG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogbWF0aG1sQnVpbGRlclxufSk7IC8vIFRleHQtbW9kZSBhY2NlbnRzXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJhY2NlbnRcIixcbiAgbmFtZXM6IFtcIlxcXFwnXCIsIFwiXFxcXGBcIiwgXCJcXFxcXlwiLCBcIlxcXFx+XCIsIFwiXFxcXD1cIiwgXCJcXFxcdVwiLCBcIlxcXFwuXCIsICdcXFxcXCInLCBcIlxcXFxjXCIsIFwiXFxcXHJcIiwgXCJcXFxcSFwiLCBcIlxcXFx2XCIsIFwiXFxcXHRleHRjaXJjbGVkXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBhbGxvd2VkSW5NYXRoOiB0cnVlLFxuICAgIC8vIHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgIGFyZ1R5cGVzOiBbXCJwcmltaXRpdmVcIl1cbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihjb250ZXh0LCBhcmdzKSB7XG4gICAgdmFyIGJhc2UgPSBhcmdzWzBdO1xuICAgIHZhciBtb2RlID0gY29udGV4dC5wYXJzZXIubW9kZTtcblxuICAgIGlmIChtb2RlID09PSBcIm1hdGhcIikge1xuICAgICAgY29udGV4dC5wYXJzZXIuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwibWF0aFZzVGV4dEFjY2VudHNcIiwgXCJMYVRlWCdzIGFjY2VudCBcIiArIGNvbnRleHQuZnVuY05hbWUgKyBcIiB3b3JrcyBvbmx5IGluIHRleHQgbW9kZVwiKTtcbiAgICAgIG1vZGUgPSBcInRleHRcIjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJhY2NlbnRcIixcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBsYWJlbDogY29udGV4dC5mdW5jTmFtZSxcbiAgICAgIGlzU3RyZXRjaHk6IGZhbHNlLFxuICAgICAgaXNTaGlmdHk6IHRydWUsXG4gICAgICBiYXNlOiBiYXNlXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGh0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBtYXRobWxCdWlsZGVyXG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvYWNjZW50dW5kZXIuanNcbi8vIEhvcml6b250YWwgb3ZlcmxhcCBmdW5jdGlvbnNcblxuXG5cblxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJhY2NlbnRVbmRlclwiLFxuICBuYW1lczogW1wiXFxcXHVuZGVybGVmdGFycm93XCIsIFwiXFxcXHVuZGVycmlnaHRhcnJvd1wiLCBcIlxcXFx1bmRlcmxlZnRyaWdodGFycm93XCIsIFwiXFxcXHVuZGVyZ3JvdXBcIiwgXCJcXFxcdW5kZXJsaW5lc2VnbWVudFwiLCBcIlxcXFx1dGlsZGVcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgYmFzZSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiYWNjZW50VW5kZXJcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgbGFiZWw6IGZ1bmNOYW1lLFxuICAgICAgYmFzZTogYmFzZVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIC8vIFRyZWF0IHVuZGVyIGFjY2VudHMgbXVjaCBsaWtlIHVuZGVybGluZXMuXG4gICAgdmFyIGlubmVyR3JvdXAgPSBidWlsZEdyb3VwKGdyb3VwLmJhc2UsIG9wdGlvbnMpO1xuICAgIHZhciBhY2NlbnRCb2R5ID0gc3RyZXRjaHkuc3ZnU3Bhbihncm91cCwgb3B0aW9ucyk7XG4gICAgdmFyIGtlcm4gPSBncm91cC5sYWJlbCA9PT0gXCJcXFxcdXRpbGRlXCIgPyAwLjEyIDogMDsgLy8gR2VuZXJhdGUgdGhlIHZsaXN0LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBrZXJuc1xuXG4gICAgdmFyIHZsaXN0ID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJ0b3BcIixcbiAgICAgIHBvc2l0aW9uRGF0YTogaW5uZXJHcm91cC5oZWlnaHQsXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGFjY2VudEJvZHksXG4gICAgICAgIHdyYXBwZXJDbGFzc2VzOiBbXCJzdmctYWxpZ25cIl1cbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IGtlcm5cbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGlubmVyR3JvdXBcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIiwgXCJhY2NlbnR1bmRlclwiXSwgW3ZsaXN0XSwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgYWNjZW50Tm9kZSA9IHN0cmV0Y2h5Lm1hdGhNTG5vZGUoZ3JvdXAubGFiZWwpO1xuICAgIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdW5kZXJcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuYmFzZSwgb3B0aW9ucyksIGFjY2VudE5vZGVdKTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcImFjY2VudHVuZGVyXCIsIFwidHJ1ZVwiKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL2Fycm93LmpzXG5cblxuXG5cblxuXG5cbi8vIEhlbHBlciBmdW5jdGlvblxudmFyIHBhZGRlZE5vZGUgPSBmdW5jdGlvbiBwYWRkZWROb2RlKGdyb3VwKSB7XG4gIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtcGFkZGVkXCIsIGdyb3VwID8gW2dyb3VwXSA6IFtdKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIiswLjZlbVwiKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsc3BhY2VcIiwgXCIwLjNlbVwiKTtcbiAgcmV0dXJuIG5vZGU7XG59OyAvLyBTdHJldGNoeSBhcnJvd3Mgd2l0aCBhbiBvcHRpb25hbCBhcmd1bWVudFxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJ4QXJyb3dcIixcbiAgbmFtZXM6IFtcIlxcXFx4bGVmdGFycm93XCIsIFwiXFxcXHhyaWdodGFycm93XCIsIFwiXFxcXHhMZWZ0YXJyb3dcIiwgXCJcXFxceFJpZ2h0YXJyb3dcIiwgXCJcXFxceGxlZnRyaWdodGFycm93XCIsIFwiXFxcXHhMZWZ0cmlnaHRhcnJvd1wiLCBcIlxcXFx4aG9va2xlZnRhcnJvd1wiLCBcIlxcXFx4aG9va3JpZ2h0YXJyb3dcIiwgXCJcXFxceG1hcHN0b1wiLCBcIlxcXFx4cmlnaHRoYXJwb29uZG93blwiLCBcIlxcXFx4cmlnaHRoYXJwb29udXBcIiwgXCJcXFxceGxlZnRoYXJwb29uZG93blwiLCBcIlxcXFx4bGVmdGhhcnBvb251cFwiLCBcIlxcXFx4cmlnaHRsZWZ0aGFycG9vbnNcIiwgXCJcXFxceGxlZnRyaWdodGhhcnBvb25zXCIsIFwiXFxcXHhsb25nZXF1YWxcIiwgXCJcXFxceHR3b2hlYWRyaWdodGFycm93XCIsIFwiXFxcXHh0d29oZWFkbGVmdGFycm93XCIsIFwiXFxcXHh0b2Zyb21cIiwgLy8gVGhlIG5leHQgMyBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gc3VwcG9ydCB0aGUgbWhjaGVtIGV4dGVuc2lvbi5cbiAgLy8gRGlyZWN0IHVzZSBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgZGlzY291cmFnZWQgYW5kIG1heSBicmVhayBzb21lZGF5LlxuICBcIlxcXFx4cmlnaHRsZWZ0YXJyb3dzXCIsIFwiXFxcXHhyaWdodGVxdWlsaWJyaXVtXCIsIFwiXFxcXHhsZWZ0ZXF1aWxpYnJpdW1cIiwgLy8gVGhlIG5leHQgMyBmdW5jdGlvbnMgYXJlIGhlcmUgb25seSB0byBzdXBwb3J0IHRoZSB7Q0R9IGVudmlyb25tZW50LlxuICBcIlxcXFxcXFxcY2RyaWdodGFycm93XCIsIFwiXFxcXFxcXFxjZGxlZnRhcnJvd1wiLCBcIlxcXFxcXFxcY2Rsb25nZXF1YWxcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBudW1PcHRpb25hbEFyZ3M6IDFcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzLCBvcHRBcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwieEFycm93XCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGxhYmVsOiBmdW5jTmFtZSxcbiAgICAgIGJvZHk6IGFyZ3NbMF0sXG4gICAgICBiZWxvdzogb3B0QXJnc1swXVxuICAgIH07XG4gIH0sXG4gIC8vIEZsb3cgaXMgdW5hYmxlIHRvIGNvcnJlY3RseSBpbmZlciB0aGUgdHlwZSBvZiBgZ3JvdXBgLCBldmVuIHRob3VnaCBpdCdzXG4gIC8vIHVuYW1pYmlndW91c2x5IGRldGVybWluZWQgZnJvbSB0aGUgcGFzc2VkLWluIGB0eXBlYCBhYm92ZS5cbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHN0eWxlID0gb3B0aW9ucy5zdHlsZTsgLy8gQnVpbGQgdGhlIGFyZ3VtZW50IGdyb3VwcyBpbiB0aGUgYXBwcm9wcmlhdGUgc3R5bGUuXG4gICAgLy8gUmVmOiBhbXNtYXRoLmR0eDogICBcXGhib3h7JFxcc2NyaXB0c3R5bGVcXG1rZXJuIzNtdXsjNn1cXG1rZXJuIzRtdSR9JVxuICAgIC8vIFNvbWUgZ3JvdXBzIGNhbiByZXR1cm4gZG9jdW1lbnQgZnJhZ21lbnRzLiAgSGFuZGxlIHRob3NlIGJ5IHdyYXBwaW5nXG4gICAgLy8gdGhlbSBpbiBhIHNwYW4uXG5cbiAgICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nU3R5bGUoc3R5bGUuc3VwKCkpO1xuICAgIHZhciB1cHBlckdyb3VwID0gYnVpbGRDb21tb24ud3JhcEZyYWdtZW50KGJ1aWxkR3JvdXAoZ3JvdXAuYm9keSwgbmV3T3B0aW9ucywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIHZhciBhcnJvd1ByZWZpeCA9IGdyb3VwLmxhYmVsLnNsaWNlKDAsIDIpID09PSBcIlxcXFx4XCIgPyBcInhcIiA6IFwiY2RcIjtcbiAgICB1cHBlckdyb3VwLmNsYXNzZXMucHVzaChhcnJvd1ByZWZpeCArIFwiLWFycm93LXBhZFwiKTtcbiAgICB2YXIgbG93ZXJHcm91cDtcblxuICAgIGlmIChncm91cC5iZWxvdykge1xuICAgICAgLy8gQnVpbGQgdGhlIGxvd2VyIGdyb3VwXG4gICAgICBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShzdHlsZS5zdWIoKSk7XG4gICAgICBsb3dlckdyb3VwID0gYnVpbGRDb21tb24ud3JhcEZyYWdtZW50KGJ1aWxkR3JvdXAoZ3JvdXAuYmVsb3csIG5ld09wdGlvbnMsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgIGxvd2VyR3JvdXAuY2xhc3Nlcy5wdXNoKGFycm93UHJlZml4ICsgXCItYXJyb3ctcGFkXCIpO1xuICAgIH1cblxuICAgIHZhciBhcnJvd0JvZHkgPSBzdHJldGNoeS5zdmdTcGFuKGdyb3VwLCBvcHRpb25zKTsgLy8gUmUgc2hpZnQ6IE5vdGUgdGhhdCBzdHJldGNoeS5zdmdTcGFuIHJldHVybmVkIGFycm93Qm9keS5kZXB0aCA9IDAuXG4gICAgLy8gVGhlIHBvaW50IHdlIHdhbnQgb24gdGhlIG1hdGggYXhpcyBpcyBhdCAwLjUgKiBhcnJvd0JvZHkuaGVpZ2h0LlxuXG4gICAgdmFyIGFycm93U2hpZnQgPSAtb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQgKyAwLjUgKiBhcnJvd0JvZHkuaGVpZ2h0OyAvLyAyIG11IGtlcm4uIFJlZjogYW1zbWF0aC5kdHg6ICM3XFxpZjAjMlxcZWxzZVxcbWtlcm4jMm11XFxmaVxuXG4gICAgdmFyIHVwcGVyU2hpZnQgPSAtb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQgLSAwLjUgKiBhcnJvd0JvZHkuaGVpZ2h0IC0gMC4xMTE7IC8vIDAuMTExIGVtID0gMiBtdVxuXG4gICAgaWYgKHVwcGVyR3JvdXAuZGVwdGggPiAwLjI1IHx8IGdyb3VwLmxhYmVsID09PSBcIlxcXFx4bGVmdGVxdWlsaWJyaXVtXCIpIHtcbiAgICAgIHVwcGVyU2hpZnQgLT0gdXBwZXJHcm91cC5kZXB0aDsgLy8gc2hpZnQgdXAgaWYgZGVwdGggZW5jcm9hY2hlc1xuICAgIH0gLy8gR2VuZXJhdGUgdGhlIHZsaXN0XG5cblxuICAgIHZhciB2bGlzdDtcblxuICAgIGlmIChsb3dlckdyb3VwKSB7XG4gICAgICB2YXIgbG93ZXJTaGlmdCA9IC1vcHRpb25zLmZvbnRNZXRyaWNzKCkuYXhpc0hlaWdodCArIGxvd2VyR3JvdXAuaGVpZ2h0ICsgMC41ICogYXJyb3dCb2R5LmhlaWdodCArIDAuMTExO1xuICAgICAgdmxpc3QgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IHVwcGVyR3JvdXAsXG4gICAgICAgICAgc2hpZnQ6IHVwcGVyU2hpZnRcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IGFycm93Qm9keSxcbiAgICAgICAgICBzaGlmdDogYXJyb3dTaGlmdFxuICAgICAgICB9LCB7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogbG93ZXJHcm91cCxcbiAgICAgICAgICBzaGlmdDogbG93ZXJTaGlmdFxuICAgICAgICB9XVxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZsaXN0ID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgICAgcG9zaXRpb25UeXBlOiBcImluZGl2aWR1YWxTaGlmdFwiLFxuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgICBlbGVtOiB1cHBlckdyb3VwLFxuICAgICAgICAgIHNoaWZ0OiB1cHBlclNoaWZ0XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgICBlbGVtOiBhcnJvd0JvZHksXG4gICAgICAgICAgc2hpZnQ6IGFycm93U2hpZnRcbiAgICAgICAgfV1cbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH0gLy8gJEZsb3dGaXhNZTogUmVwbGFjZSB0aGlzIHdpdGggcGFzc2luZyBcInN2Zy1hbGlnblwiIGludG8gbWFrZVZMaXN0LlxuXG5cbiAgICB2bGlzdC5jaGlsZHJlblswXS5jaGlsZHJlblswXS5jaGlsZHJlblsxXS5jbGFzc2VzLnB1c2goXCJzdmctYWxpZ25cIik7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1yZWxcIiwgXCJ4LWFycm93XCJdLCBbdmxpc3RdLCBvcHRpb25zKTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBhcnJvd05vZGUgPSBzdHJldGNoeS5tYXRoTUxub2RlKGdyb3VwLmxhYmVsKTtcbiAgICBhcnJvd05vZGUuc2V0QXR0cmlidXRlKFwibWluc2l6ZVwiLCBncm91cC5sYWJlbC5jaGFyQXQoMCkgPT09IFwieFwiID8gXCIxLjc1ZW1cIiA6IFwiMy4wZW1cIik7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBpZiAoZ3JvdXAuYm9keSkge1xuICAgICAgdmFyIHVwcGVyTm9kZSA9IHBhZGRlZE5vZGUoYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5ib2R5LCBvcHRpb25zKSk7XG5cbiAgICAgIGlmIChncm91cC5iZWxvdykge1xuICAgICAgICB2YXIgbG93ZXJOb2RlID0gcGFkZGVkTm9kZShidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJlbG93LCBvcHRpb25zKSk7XG4gICAgICAgIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm11bmRlcm92ZXJcIiwgW2Fycm93Tm9kZSwgbG93ZXJOb2RlLCB1cHBlck5vZGVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vdmVyXCIsIFthcnJvd05vZGUsIHVwcGVyTm9kZV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3JvdXAuYmVsb3cpIHtcbiAgICAgIHZhciBfbG93ZXJOb2RlID0gcGFkZGVkTm9kZShidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJlbG93LCBvcHRpb25zKSk7XG5cbiAgICAgIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm11bmRlclwiLCBbYXJyb3dOb2RlLCBfbG93ZXJOb2RlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgICAgIC8vIFBhcnNlci5qcyB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gYXJndW1lbnQuXG4gICAgICBub2RlID0gcGFkZGVkTm9kZSgpO1xuICAgICAgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibW92ZXJcIiwgW2Fycm93Tm9kZSwgbm9kZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvbWNsYXNzLmpzXG5cblxuXG5cblxuXG52YXIgbWNsYXNzX21ha2VTcGFuID0gYnVpbGRDb21tb24ubWFrZVNwYW47XG5cbmZ1bmN0aW9uIG1jbGFzc19odG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucywgdHJ1ZSk7XG4gIHJldHVybiBtY2xhc3NfbWFrZVNwYW4oW2dyb3VwLm1jbGFzc10sIGVsZW1lbnRzLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gbWNsYXNzX21hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zKTtcblxuICBpZiAoZ3JvdXAubWNsYXNzID09PSBcIm1pbm5lclwiKSB7XG4gICAgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBhZGRlZFwiLCBpbm5lcik7XG4gIH0gZWxzZSBpZiAoZ3JvdXAubWNsYXNzID09PSBcIm1vcmRcIikge1xuICAgIGlmIChncm91cC5pc0NoYXJhY3RlckJveCkge1xuICAgICAgbm9kZSA9IGlubmVyWzBdO1xuICAgICAgbm9kZS50eXBlID0gXCJtaVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtaVwiLCBpbm5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChncm91cC5pc0NoYXJhY3RlckJveCkge1xuICAgICAgbm9kZSA9IGlubmVyWzBdO1xuICAgICAgbm9kZS50eXBlID0gXCJtb1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtb1wiLCBpbm5lcik7XG4gICAgfSAvLyBTZXQgc3BhY2luZyBiYXNlZCBvbiB3aGF0IGlzIHRoZSBtb3N0IGxpa2VseSBhZGphY2VudCBhdG9tIHR5cGUuXG4gICAgLy8gU2VlIFRlWGJvb2sgcDE3MC5cblxuXG4gICAgaWYgKGdyb3VwLm1jbGFzcyA9PT0gXCJtYmluXCIpIHtcbiAgICAgIG5vZGUuYXR0cmlidXRlcy5sc3BhY2UgPSBcIjAuMjJlbVwiOyAvLyBtZWRpdW0gc3BhY2VcblxuICAgICAgbm9kZS5hdHRyaWJ1dGVzLnJzcGFjZSA9IFwiMC4yMmVtXCI7XG4gICAgfSBlbHNlIGlmIChncm91cC5tY2xhc3MgPT09IFwibXB1bmN0XCIpIHtcbiAgICAgIG5vZGUuYXR0cmlidXRlcy5sc3BhY2UgPSBcIjBlbVwiO1xuICAgICAgbm9kZS5hdHRyaWJ1dGVzLnJzcGFjZSA9IFwiMC4xN2VtXCI7IC8vIHRoaW5zcGFjZVxuICAgIH0gZWxzZSBpZiAoZ3JvdXAubWNsYXNzID09PSBcIm1vcGVuXCIgfHwgZ3JvdXAubWNsYXNzID09PSBcIm1jbG9zZVwiKSB7XG4gICAgICBub2RlLmF0dHJpYnV0ZXMubHNwYWNlID0gXCIwZW1cIjtcbiAgICAgIG5vZGUuYXR0cmlidXRlcy5yc3BhY2UgPSBcIjBlbVwiO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXAubWNsYXNzID09PSBcIm1pbm5lclwiKSB7XG4gICAgICBub2RlLmF0dHJpYnV0ZXMubHNwYWNlID0gXCIwLjA1NTZlbVwiOyAvLyAxIG11IGlzIHRoZSBtb3N0IGxpa2VseSBvcHRpb25cblxuICAgICAgbm9kZS5hdHRyaWJ1dGVzLndpZHRoID0gXCIrMC4xMTExZW1cIjtcbiAgICB9IC8vIE1hdGhNTCA8bW8+IGRlZmF1bHQgc3BhY2UgaXMgNS8xOCBlbSwgc28gPG1yZWw+IG5lZWRzIG5vIGFjdGlvbi5cbiAgICAvLyBSZWY6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL01hdGhNTC9FbGVtZW50L21vXG5cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSAvLyBNYXRoIGNsYXNzIGNvbW1hbmRzIGV4Y2VwdCBcXG1hdGhvcFxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJtY2xhc3NcIixcbiAgbmFtZXM6IFtcIlxcXFxtYXRob3JkXCIsIFwiXFxcXG1hdGhiaW5cIiwgXCJcXFxcbWF0aHJlbFwiLCBcIlxcXFxtYXRob3BlblwiLCBcIlxcXFxtYXRoY2xvc2VcIiwgXCJcXFxcbWF0aHB1bmN0XCIsIFwiXFxcXG1hdGhpbm5lclwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIHByaW1pdGl2ZTogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwibWNsYXNzXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIG1jbGFzczogXCJtXCIgKyBmdW5jTmFtZS5zbGljZSg1KSxcbiAgICAgIC8vIFRPRE8oa2V2aW5iKTogZG9uJ3QgcHJlZml4IHdpdGggJ20nXG4gICAgICBib2R5OiBvcmRhcmd1bWVudChib2R5KSxcbiAgICAgIGlzQ2hhcmFjdGVyQm94OiB1dGlscy5pc0NoYXJhY3RlckJveChib2R5KVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBtY2xhc3NfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IG1jbGFzc19tYXRobWxCdWlsZGVyXG59KTtcbnZhciBiaW5yZWxDbGFzcyA9IGZ1bmN0aW9uIGJpbnJlbENsYXNzKGFyZykge1xuICAvLyBcXGJpbnJlbEAgc3BhY2luZyB2YXJpZXMgd2l0aCAoYmlufHJlbHxvcmQpIG9mIHRoZSBhdG9tIGluIHRoZSBhcmd1bWVudC5cbiAgLy8gKGJ5IHJlbmRlcmluZyBzZXBhcmF0ZWx5IGFuZCB3aXRoIHt9cyBiZWZvcmUgYW5kIGFmdGVyLCBhbmQgbWVhc3VyaW5nXG4gIC8vIHRoZSBjaGFuZ2UgaW4gc3BhY2luZykuICBXZSdsbCBkbyByb3VnaGx5IHRoZSBzYW1lIGJ5IGRldGVjdGluZyB0aGVcbiAgLy8gYXRvbSB0eXBlIGRpcmVjdGx5LlxuICB2YXIgYXRvbSA9IGFyZy50eXBlID09PSBcIm9yZGdyb3VwXCIgJiYgYXJnLmJvZHkubGVuZ3RoID8gYXJnLmJvZHlbMF0gOiBhcmc7XG5cbiAgaWYgKGF0b20udHlwZSA9PT0gXCJhdG9tXCIgJiYgKGF0b20uZmFtaWx5ID09PSBcImJpblwiIHx8IGF0b20uZmFtaWx5ID09PSBcInJlbFwiKSkge1xuICAgIHJldHVybiBcIm1cIiArIGF0b20uZmFtaWx5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIm1vcmRcIjtcbiAgfVxufTsgLy8gXFxAYmlucmVse3h9e3l9IHJlbmRlcnMgbGlrZSB5IGJ1dCBhcyBtYmluL21yZWwvbW9yZCBpZiB4IGlzIG1iaW4vbXJlbC9tb3JkLlxuLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIFxcYmlucmVsQHt4fVxcYmlucmVsQEB7eX0gaW4gQU1TVGVYLlxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwibWNsYXNzXCIsXG4gIG5hbWVzOiBbXCJcXFxcQGJpbnJlbFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAyXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjIsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjIucGFyc2VyO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIm1jbGFzc1wiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBtY2xhc3M6IGJpbnJlbENsYXNzKGFyZ3NbMF0pLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYXJnc1sxXSksXG4gICAgICBpc0NoYXJhY3RlckJveDogdXRpbHMuaXNDaGFyYWN0ZXJCb3goYXJnc1sxXSlcbiAgICB9O1xuICB9XG59KTsgLy8gQnVpbGQgYSByZWxhdGlvbiBvciBzdGFja2VkIG9wIGJ5IHBsYWNpbmcgb25lIHN5bWJvbCBvbiB0b3Agb2YgYW5vdGhlclxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwibWNsYXNzXCIsXG4gIG5hbWVzOiBbXCJcXFxcc3RhY2tyZWxcIiwgXCJcXFxcb3ZlcnNldFwiLCBcIlxcXFx1bmRlcnNldFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAyXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjMsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjMucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYzLmZ1bmNOYW1lO1xuICAgIHZhciBiYXNlQXJnID0gYXJnc1sxXTtcbiAgICB2YXIgc2hpZnRlZEFyZyA9IGFyZ3NbMF07XG4gICAgdmFyIG1jbGFzcztcblxuICAgIGlmIChmdW5jTmFtZSAhPT0gXCJcXFxcc3RhY2tyZWxcIikge1xuICAgICAgLy8gTGFUZVggYXBwbGllcyBcXGJpbnJlbCBzcGFjaW5nIHRvIFxcb3ZlcnNldCBhbmQgXFx1bmRlcnNldC5cbiAgICAgIG1jbGFzcyA9IGJpbnJlbENsYXNzKGJhc2VBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtY2xhc3MgPSBcIm1yZWxcIjsgLy8gZm9yIFxcc3RhY2tyZWxcbiAgICB9XG5cbiAgICB2YXIgYmFzZU9wID0ge1xuICAgICAgdHlwZTogXCJvcFwiLFxuICAgICAgbW9kZTogYmFzZUFyZy5tb2RlLFxuICAgICAgbGltaXRzOiB0cnVlLFxuICAgICAgYWx3YXlzSGFuZGxlU3VwU3ViOiB0cnVlLFxuICAgICAgcGFyZW50SXNTdXBTdWI6IGZhbHNlLFxuICAgICAgc3ltYm9sOiBmYWxzZSxcbiAgICAgIHN1cHByZXNzQmFzZVNoaWZ0OiBmdW5jTmFtZSAhPT0gXCJcXFxcc3RhY2tyZWxcIixcbiAgICAgIGJvZHk6IG9yZGFyZ3VtZW50KGJhc2VBcmcpXG4gICAgfTtcbiAgICB2YXIgc3Vwc3ViID0ge1xuICAgICAgdHlwZTogXCJzdXBzdWJcIixcbiAgICAgIG1vZGU6IHNoaWZ0ZWRBcmcubW9kZSxcbiAgICAgIGJhc2U6IGJhc2VPcCxcbiAgICAgIHN1cDogZnVuY05hbWUgPT09IFwiXFxcXHVuZGVyc2V0XCIgPyBudWxsIDogc2hpZnRlZEFyZyxcbiAgICAgIHN1YjogZnVuY05hbWUgPT09IFwiXFxcXHVuZGVyc2V0XCIgPyBzaGlmdGVkQXJnIDogbnVsbFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwibWNsYXNzXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIG1jbGFzczogbWNsYXNzLFxuICAgICAgYm9keTogW3N1cHN1Yl0sXG4gICAgICBpc0NoYXJhY3RlckJveDogdXRpbHMuaXNDaGFyYWN0ZXJCb3goc3Vwc3ViKVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBtY2xhc3NfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IG1jbGFzc19tYXRobWxCdWlsZGVyXG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvcG1iLmpzXG5cblxuXG5cblxuXG4vLyBcXHBtYiBpcyBhIHNpbXVsYXRpb24gb2YgYm9sZCBmb250LlxuLy8gVGhlIHZlcnNpb24gb2YgXFxwbWIgaW4gYW1ic3kuc3R5IHdvcmtzIGJ5IHR5cGVzZXR0aW5nIHRocmVlIGNvcGllc1xuLy8gd2l0aCBzbWFsbCBvZmZzZXRzLiBXZSB1c2UgQ1NTIHRleHQtc2hhZG93LlxuLy8gSXQncyBhIGhhY2suIE5vdCBhcyBnb29kIGFzIGEgcmVhbCBib2xkIGZvbnQuIEJldHRlciB0aGFuIG5vdGhpbmcuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwicG1iXCIsXG4gIG5hbWVzOiBbXCJcXFxccG1iXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwicG1iXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIG1jbGFzczogYmlucmVsQ2xhc3MoYXJnc1swXSksXG4gICAgICBib2R5OiBvcmRhcmd1bWVudChhcmdzWzBdKVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBlbGVtZW50cyA9IGJ1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLCB0cnVlKTtcbiAgICB2YXIgbm9kZSA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtncm91cC5tY2xhc3NdLCBlbGVtZW50cywgb3B0aW9ucyk7XG4gICAgbm9kZS5zdHlsZS50ZXh0U2hhZG93ID0gXCIwLjAyZW0gMC4wMWVtIDAuMDRweFwiO1xuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBzdHlsZSkge1xuICAgIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBzdHlsZSk7IC8vIFdyYXAgd2l0aCBhbiA8bXN0eWxlPiBlbGVtZW50LlxuXG4gICAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1zdHlsZVwiLCBpbm5lcik7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcInRleHQtc2hhZG93OiAwLjAyZW0gMC4wMWVtIDAuMDRweFwiKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZW52aXJvbm1lbnRzL2NkLmpzXG5cblxuXG5cblxuXG5cblxudmFyIGNkQXJyb3dGdW5jdGlvbk5hbWUgPSB7XG4gIFwiPlwiOiBcIlxcXFxcXFxcY2RyaWdodGFycm93XCIsXG4gIFwiPFwiOiBcIlxcXFxcXFxcY2RsZWZ0YXJyb3dcIixcbiAgXCI9XCI6IFwiXFxcXFxcXFxjZGxvbmdlcXVhbFwiLFxuICBcIkFcIjogXCJcXFxcdXBhcnJvd1wiLFxuICBcIlZcIjogXCJcXFxcZG93bmFycm93XCIsXG4gIFwifFwiOiBcIlxcXFxWZXJ0XCIsXG4gIFwiLlwiOiBcIm5vIGFycm93XCJcbn07XG5cbnZhciBuZXdDZWxsID0gZnVuY3Rpb24gbmV3Q2VsbCgpIHtcbiAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNlbGwsIHRvIGJlIGZpbGxlZCBiZWxvdyB3aXRoIHBhcnNlIG5vZGVzLlxuICAvLyBUaGUgcGFyc2VUcmVlIGZyb20gdGhpcyBtb2R1bGUgbXVzdCBiZSBjb25zdHJ1Y3RlZCBsaWtlIHRoZVxuICAvLyBvbmUgY3JlYXRlZCBieSBwYXJzZUFycmF5KCksIHNvIGFuIGVtcHR5IENEIGNlbGwgbXVzdFxuICAvLyBiZSBhIFBhcnNlTm9kZTxcInN0eWxpbmdcIj4uIEFuZCBDRCBpcyBhbHdheXMgZGlzcGxheXN0eWxlLlxuICAvLyBTbyB0aGVzZSB2YWx1ZXMgYXJlIGZpeGVkIGFuZCBmbG93IGNhbiBkbyBpbXBsaWNpdCB0eXBpbmcuXG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJzdHlsaW5nXCIsXG4gICAgYm9keTogW10sXG4gICAgbW9kZTogXCJtYXRoXCIsXG4gICAgc3R5bGU6IFwiZGlzcGxheVwiXG4gIH07XG59O1xuXG52YXIgaXNTdGFydE9mQXJyb3cgPSBmdW5jdGlvbiBpc1N0YXJ0T2ZBcnJvdyhub2RlKSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IFwidGV4dG9yZFwiICYmIG5vZGUudGV4dCA9PT0gXCJAXCI7XG59O1xuXG52YXIgaXNMYWJlbEVuZCA9IGZ1bmN0aW9uIGlzTGFiZWxFbmQobm9kZSwgZW5kQ2hhcikge1xuICByZXR1cm4gKG5vZGUudHlwZSA9PT0gXCJtYXRob3JkXCIgfHwgbm9kZS50eXBlID09PSBcImF0b21cIikgJiYgbm9kZS50ZXh0ID09PSBlbmRDaGFyO1xufTtcblxuZnVuY3Rpb24gY2RBcnJvdyhhcnJvd0NoYXIsIGxhYmVscywgcGFyc2VyKSB7XG4gIC8vIFJldHVybiBhIHBhcnNlIHRyZWUgb2YgYW4gYXJyb3cgYW5kIGl0cyBsYWJlbHMuXG4gIC8vIFRoaXMgYWN0cyBpbiBhIHdheSBzaW1pbGFyIHRvIGEgbWFjcm8gZXhwYW5zaW9uLlxuICB2YXIgZnVuY05hbWUgPSBjZEFycm93RnVuY3Rpb25OYW1lW2Fycm93Q2hhcl07XG5cbiAgc3dpdGNoIChmdW5jTmFtZSkge1xuICAgIGNhc2UgXCJcXFxcXFxcXGNkcmlnaHRhcnJvd1wiOlxuICAgIGNhc2UgXCJcXFxcXFxcXGNkbGVmdGFycm93XCI6XG4gICAgICByZXR1cm4gcGFyc2VyLmNhbGxGdW5jdGlvbihmdW5jTmFtZSwgW2xhYmVsc1swXV0sIFtsYWJlbHNbMV1dKTtcblxuICAgIGNhc2UgXCJcXFxcdXBhcnJvd1wiOlxuICAgIGNhc2UgXCJcXFxcZG93bmFycm93XCI6XG4gICAgICB7XG4gICAgICAgIHZhciBsZWZ0TGFiZWwgPSBwYXJzZXIuY2FsbEZ1bmN0aW9uKFwiXFxcXFxcXFxjZGxlZnRcIiwgW2xhYmVsc1swXV0sIFtdKTtcbiAgICAgICAgdmFyIGJhcmVBcnJvdyA9IHtcbiAgICAgICAgICB0eXBlOiBcImF0b21cIixcbiAgICAgICAgICB0ZXh0OiBmdW5jTmFtZSxcbiAgICAgICAgICBtb2RlOiBcIm1hdGhcIixcbiAgICAgICAgICBmYW1pbHk6IFwicmVsXCJcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNpemVkQXJyb3cgPSBwYXJzZXIuY2FsbEZ1bmN0aW9uKFwiXFxcXEJpZ1wiLCBbYmFyZUFycm93XSwgW10pO1xuICAgICAgICB2YXIgcmlnaHRMYWJlbCA9IHBhcnNlci5jYWxsRnVuY3Rpb24oXCJcXFxcXFxcXGNkcmlnaHRcIiwgW2xhYmVsc1sxXV0sIFtdKTtcbiAgICAgICAgdmFyIGFycm93R3JvdXAgPSB7XG4gICAgICAgICAgdHlwZTogXCJvcmRncm91cFwiLFxuICAgICAgICAgIG1vZGU6IFwibWF0aFwiLFxuICAgICAgICAgIGJvZHk6IFtsZWZ0TGFiZWwsIHNpemVkQXJyb3csIHJpZ2h0TGFiZWxdXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBwYXJzZXIuY2FsbEZ1bmN0aW9uKFwiXFxcXFxcXFxjZHBhcmVudFwiLCBbYXJyb3dHcm91cF0sIFtdKTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJcXFxcXFxcXGNkbG9uZ2VxdWFsXCI6XG4gICAgICByZXR1cm4gcGFyc2VyLmNhbGxGdW5jdGlvbihcIlxcXFxcXFxcY2Rsb25nZXF1YWxcIiwgW10sIFtdKTtcblxuICAgIGNhc2UgXCJcXFxcVmVydFwiOlxuICAgICAge1xuICAgICAgICB2YXIgYXJyb3cgPSB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0b3JkXCIsXG4gICAgICAgICAgdGV4dDogXCJcXFxcVmVydFwiLFxuICAgICAgICAgIG1vZGU6IFwibWF0aFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBwYXJzZXIuY2FsbEZ1bmN0aW9uKFwiXFxcXEJpZ1wiLCBbYXJyb3ddLCBbXSk7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0b3JkXCIsXG4gICAgICAgIHRleHQ6IFwiIFwiLFxuICAgICAgICBtb2RlOiBcIm1hdGhcIlxuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNEKHBhcnNlcikge1xuICAvLyBHZXQgdGhlIGFycmF5J3MgcGFyc2Ugbm9kZXMgd2l0aCBcXFxcIHRlbXBvcmFyaWx5IG1hcHBlZCB0byBcXGNyLlxuICB2YXIgcGFyc2VkUm93cyA9IFtdO1xuICBwYXJzZXIuZ3VsbGV0LmJlZ2luR3JvdXAoKTtcbiAgcGFyc2VyLmd1bGxldC5tYWNyb3Muc2V0KFwiXFxcXGNyXCIsIFwiXFxcXFxcXFxcXFxccmVsYXhcIik7XG4gIHBhcnNlci5ndWxsZXQuYmVnaW5Hcm91cCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAvLyBHZXQgdGhlIHBhcnNlIG5vZGVzIGZvciB0aGUgbmV4dCByb3cuXG4gICAgcGFyc2VkUm93cy5wdXNoKHBhcnNlci5wYXJzZUV4cHJlc3Npb24oZmFsc2UsIFwiXFxcXFxcXFxcIikpO1xuICAgIHBhcnNlci5ndWxsZXQuZW5kR3JvdXAoKTtcbiAgICBwYXJzZXIuZ3VsbGV0LmJlZ2luR3JvdXAoKTtcbiAgICB2YXIgbmV4dCA9IHBhcnNlci5mZXRjaCgpLnRleHQ7XG5cbiAgICBpZiAobmV4dCA9PT0gXCImXCIgfHwgbmV4dCA9PT0gXCJcXFxcXFxcXFwiKSB7XG4gICAgICBwYXJzZXIuY29uc3VtZSgpO1xuICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gXCJcXFxcZW5kXCIpIHtcbiAgICAgIGlmIChwYXJzZWRSb3dzW3BhcnNlZFJvd3MubGVuZ3RoIC0gMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBhcnNlZFJvd3MucG9wKCk7IC8vIGZpbmFsIHJvdyBlbmRlZCBpbiBcXFxcXG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCBcXFxcXFxcXCBvciBcXFxcY3Igb3IgXFxcXGVuZFwiLCBwYXJzZXIubmV4dFRva2VuKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm93ID0gW107XG4gIHZhciBib2R5ID0gW3Jvd107IC8vIExvb3AgdGhydSB0aGUgcGFyc2Ugbm9kZXMuIENvbGxlY3QgdGhlbSBpbnRvIGNlbGxzIGFuZCBhcnJvd3MuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJzZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RhcnQgYSBuZXcgcm93LlxuICAgIHZhciByb3dOb2RlcyA9IHBhcnNlZFJvd3NbaV07IC8vIENyZWF0ZSB0aGUgZmlyc3QgY2VsbC5cblxuICAgIHZhciBjZWxsID0gbmV3Q2VsbCgpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3dOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKCFpc1N0YXJ0T2ZBcnJvdyhyb3dOb2Rlc1tqXSkpIHtcbiAgICAgICAgLy8gSWYgYSBwYXJzZU5vZGUgaXMgbm90IGFuIGFycm93LCBpdCBnb2VzIGludG8gYSBjZWxsLlxuICAgICAgICBjZWxsLmJvZHkucHVzaChyb3dOb2Rlc1tqXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQYXJzZSBub2RlIGogaXMgYW4gXCJAXCIsIHRoZSBzdGFydCBvZiBhbiBhcnJvdy5cbiAgICAgICAgLy8gQmVmb3JlIHN0YXJ0aW5nIG9uIHRoZSBhcnJvdywgcHVzaCB0aGUgY2VsbCBpbnRvIGByb3dgLlxuICAgICAgICByb3cucHVzaChjZWxsKTsgLy8gTm93IGNvbGxlY3QgcGFyc2VOb2RlcyBpbnRvIGFuIGFycm93LlxuICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGFmdGVyIFwiQFwiIGRlZmluZXMgdGhlIGFycm93IHR5cGUuXG5cbiAgICAgICAgaiArPSAxO1xuICAgICAgICB2YXIgYXJyb3dDaGFyID0gYXNzZXJ0U3ltYm9sTm9kZVR5cGUocm93Tm9kZXNbal0pLnRleHQ7IC8vIENyZWF0ZSB0d28gZW1wdHkgbGFiZWwgbm9kZXMuIFdlIG1heSBvciBtYXkgbm90IHVzZSB0aGVtLlxuXG4gICAgICAgIHZhciBsYWJlbHMgPSBuZXcgQXJyYXkoMik7XG4gICAgICAgIGxhYmVsc1swXSA9IHtcbiAgICAgICAgICB0eXBlOiBcIm9yZGdyb3VwXCIsXG4gICAgICAgICAgbW9kZTogXCJtYXRoXCIsXG4gICAgICAgICAgYm9keTogW11cbiAgICAgICAgfTtcbiAgICAgICAgbGFiZWxzWzFdID0ge1xuICAgICAgICAgIHR5cGU6IFwib3JkZ3JvdXBcIixcbiAgICAgICAgICBtb2RlOiBcIm1hdGhcIixcbiAgICAgICAgICBib2R5OiBbXVxuICAgICAgICB9OyAvLyBQcm9jZXNzIHRoZSBhcnJvdy5cblxuICAgICAgICBpZiAoXCI9fC5cIi5pbmRleE9mKGFycm93Q2hhcikgPiAtMSkgey8vIFRocmVlIFwiYXJyb3dzXCIsIGBgQD1gLCBgQHxgLCBhbmQgYEAuYCwgZG8gbm90IHRha2UgbGFiZWxzLlxuICAgICAgICAgIC8vIERvIG5vdGhpbmcgaGVyZS5cbiAgICAgICAgfSBlbHNlIGlmIChcIjw+QVZcIi5pbmRleE9mKGFycm93Q2hhcikgPiAtMSkge1xuICAgICAgICAgIC8vIEZvdXIgYXJyb3dzLCBgQD4+PmAsIGBAPDw8YCwgYEBBQUFgLCBhbmQgYEBWVlZgLCBlYWNoIHRha2VcbiAgICAgICAgICAvLyB0d28gb3B0aW9uYWwgbGFiZWxzLiBFLmcuIHRoZSByaWdodC1wb2ludCBhcnJvdyBzeW50YXggaXNcbiAgICAgICAgICAvLyByZWFsbHk6ICBAPntvcHRpb25hbCBsYWJlbH0+e29wdGlvbmFsIGxhYmVsfT5cbiAgICAgICAgICAvLyBDb2xsZWN0IHBhcnNlTm9kZXMgaW50byBsYWJlbHMuXG4gICAgICAgICAgZm9yICh2YXIgbGFiZWxOdW0gPSAwOyBsYWJlbE51bSA8IDI7IGxhYmVsTnVtKyspIHtcbiAgICAgICAgICAgIHZhciBpbkxhYmVsID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgcm93Tm9kZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgaWYgKGlzTGFiZWxFbmQocm93Tm9kZXNba10sIGFycm93Q2hhcikpIHtcbiAgICAgICAgICAgICAgICBpbkxhYmVsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaiA9IGs7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoaXNTdGFydE9mQXJyb3cocm93Tm9kZXNba10pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiTWlzc2luZyBhIFwiICsgYXJyb3dDaGFyICsgXCIgY2hhcmFjdGVyIHRvIGNvbXBsZXRlIGEgQ0QgYXJyb3cuXCIsIHJvd05vZGVzW2tdKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxhYmVsc1tsYWJlbE51bV0uYm9keS5wdXNoKHJvd05vZGVzW2tdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGluTGFiZWwpIHtcbiAgICAgICAgICAgICAgLy8gaXNMYWJlbEVuZCBuZXZlciByZXR1cm5lZCBhIHRydWUuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIk1pc3NpbmcgYSBcIiArIGFycm93Q2hhciArIFwiIGNoYXJhY3RlciB0byBjb21wbGV0ZSBhIENEIGFycm93LlwiLCByb3dOb2Rlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkV4cGVjdGVkIG9uZSBvZiBcXFwiPD5BVj18LlxcXCIgYWZ0ZXIgQFwiLCByb3dOb2Rlc1tqXSk7XG4gICAgICAgIH0gLy8gTm93IGpvaW4gdGhlIGFycm93IHRvIGl0cyBsYWJlbHMuXG5cblxuICAgICAgICB2YXIgYXJyb3cgPSBjZEFycm93KGFycm93Q2hhciwgbGFiZWxzLCBwYXJzZXIpOyAvLyBXcmFwIHRoZSBhcnJvdyBpbiAgUGFyc2VOb2RlPFwic3R5bGluZ1wiPi5cbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIG1hdGNoIHBhcnNlQXJyYXkoKSBiZWhhdmlvci5cblxuICAgICAgICB2YXIgd3JhcHBlZEFycm93ID0ge1xuICAgICAgICAgIHR5cGU6IFwic3R5bGluZ1wiLFxuICAgICAgICAgIGJvZHk6IFthcnJvd10sXG4gICAgICAgICAgbW9kZTogXCJtYXRoXCIsXG4gICAgICAgICAgc3R5bGU6IFwiZGlzcGxheVwiIC8vIENEIGlzIGFsd2F5cyBkaXNwbGF5c3R5bGUuXG5cbiAgICAgICAgfTtcbiAgICAgICAgcm93LnB1c2god3JhcHBlZEFycm93KTsgLy8gSW4gQ0QncyBzeW50YXgsIGNlbGxzIGFyZSBpbXBsaWNpdC4gVGhhdCBpcywgZXZlcnl0aGluZyB0aGF0XG4gICAgICAgIC8vIGlzIG5vdCBhbiBhcnJvdyBnZXRzIGNvbGxlY3RlZCBpbnRvIGEgY2VsbC4gU28gY3JlYXRlIGFuIGVtcHR5XG4gICAgICAgIC8vIGNlbGwgbm93LiBJdCB3aWxsIGNvbGxlY3QgdXBjb21pbmcgcGFyc2VOb2Rlcy5cblxuICAgICAgICBjZWxsID0gbmV3Q2VsbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgLy8gRXZlbi1udW1iZXJlZCByb3dzIGNvbnNpc3Qgb2Y6IGNlbGwsIGFycm93LCBjZWxsLCBhcnJvdywgLi4uIGNlbGxcbiAgICAgIC8vIFRoZSBsYXN0IGNlbGwgaXMgbm90IHlldCBwdXNoZWQgaW50byBgcm93YCwgc286XG4gICAgICByb3cucHVzaChjZWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT2RkLW51bWJlcmVkIHJvd3MgY29uc2lzdCBvZjogdmVydCBhcnJvdywgZW1wdHkgY2VsbCwgLi4uIHZlcnQgYXJyb3dcbiAgICAgIC8vIFJlbW92ZSB0aGUgZW1wdHkgY2VsbCB0aGF0IHdhcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBgcm93YC5cbiAgICAgIHJvdy5zaGlmdCgpO1xuICAgIH1cblxuICAgIHJvdyA9IFtdO1xuICAgIGJvZHkucHVzaChyb3cpO1xuICB9IC8vIEVuZCByb3cgZ3JvdXBcblxuXG4gIHBhcnNlci5ndWxsZXQuZW5kR3JvdXAoKTsgLy8gRW5kIGFycmF5IGdyb3VwIGRlZmluaW5nIFxcXFxcblxuICBwYXJzZXIuZ3VsbGV0LmVuZEdyb3VwKCk7IC8vIGRlZmluZSBjb2x1bW4gc2VwYXJhdGlvbi5cblxuICB2YXIgY29scyA9IG5ldyBBcnJheShib2R5WzBdLmxlbmd0aCkuZmlsbCh7XG4gICAgdHlwZTogXCJhbGlnblwiLFxuICAgIGFsaWduOiBcImNcIixcbiAgICBwcmVnYXA6IDAuMjUsXG4gICAgLy8gQ0QgcGFja2FnZSBzZXRzIFxcZW5za2lwIGJldHdlZW4gY29sdW1ucy5cbiAgICBwb3N0Z2FwOiAwLjI1IC8vIFNvIHByZSBhbmQgcG9zdCBlYWNoIGdldCBoYWxmIGFuIFxcZW5za2lwLCBpLmUuIDAuMjVlbS5cblxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgbW9kZTogXCJtYXRoXCIsXG4gICAgYm9keTogYm9keSxcbiAgICBhcnJheXN0cmV0Y2g6IDEsXG4gICAgYWRkSm90OiB0cnVlLFxuICAgIHJvd0dhcHM6IFtudWxsXSxcbiAgICBjb2xzOiBjb2xzLFxuICAgIGNvbFNlcGFyYXRpb25UeXBlOiBcIkNEXCIsXG4gICAgaExpbmVzQmVmb3JlUm93OiBuZXcgQXJyYXkoYm9keS5sZW5ndGggKyAxKS5maWxsKFtdKVxuICB9O1xufSAvLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBub3QgYXZhaWxhYmxlIGZvciBnZW5lcmFsIHVzZS5cbi8vIFRoZXkgYXJlIGhlcmUgb25seSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSB7Q0R9IGVudmlyb25tZW50IGluIHBsYWNpbmcgbGFiZWxzXG4vLyBuZXh0IHRvIHZlcnRpY2FsIGFycm93cy5cbi8vIFdlIGRvbid0IG5lZWQgYW55IHN1Y2ggZnVuY3Rpb25zIGZvciBob3Jpem9udGFsIGFycm93cyBiZWNhdXNlIHdlIGNhbiByZXVzZVxuLy8gdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbHJlYWR5IGV4aXN0cyBmb3IgZXh0ZW5zaWJsZSBhcnJvd3MuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJjZGxhYmVsXCIsXG4gIG5hbWVzOiBbXCJcXFxcXFxcXGNkbGVmdFwiLCBcIlxcXFxcXFxcY2RyaWdodFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmLmZ1bmNOYW1lO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNkbGFiZWxcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgc2lkZTogZnVuY05hbWUuc2xpY2UoNCksXG4gICAgICBsYWJlbDogYXJnc1swXVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShvcHRpb25zLnN0eWxlLnN1cCgpKTtcbiAgICB2YXIgbGFiZWwgPSBidWlsZENvbW1vbi53cmFwRnJhZ21lbnQoYnVpbGRHcm91cChncm91cC5sYWJlbCwgbmV3T3B0aW9ucywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIGxhYmVsLmNsYXNzZXMucHVzaChcImNkLWxhYmVsLVwiICsgZ3JvdXAuc2lkZSk7XG4gICAgbGFiZWwuc3R5bGUuYm90dG9tID0gbWFrZUVtKDAuOCAtIGxhYmVsLmRlcHRoKTsgLy8gWmVybyBvdXQgbGFiZWwgaGVpZ2h0ICYgZGVwdGgsIHNvIHZlcnRpY2FsIGFsaWduIG9mIGFycm93IGlzIHNldFxuICAgIC8vIGJ5IHRoZSBhcnJvdyBoZWlnaHQsIG5vdCBieSB0aGUgbGFiZWwuXG5cbiAgICBsYWJlbC5oZWlnaHQgPSAwO1xuICAgIGxhYmVsLmRlcHRoID0gMDtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGFiZWwgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1yb3dcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAubGFiZWwsIG9wdGlvbnMpXSk7XG4gICAgbGFiZWwgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1wYWRkZWRcIiwgW2xhYmVsXSk7XG4gICAgbGFiZWwuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIwXCIpO1xuXG4gICAgaWYgKGdyb3VwLnNpZGUgPT09IFwibGVmdFwiKSB7XG4gICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoXCJsc3BhY2VcIiwgXCItMXdpZHRoXCIpO1xuICAgIH0gLy8gV2UgaGF2ZSB0byBndWVzcyBhdCB2ZXJ0aWNhbCBhbGlnbm1lbnQuIFdlIGtub3cgdGhlIGFycm93IGlzIDEuOGVtIHRhbGwsXG4gICAgLy8gQnV0IHdlIGRvbid0IGtub3cgdGhlIGhlaWdodCBvciBkZXB0aCBvZiB0aGUgbGFiZWwuXG5cblxuICAgIGxhYmVsLnNldEF0dHJpYnV0ZShcInZvZmZzZXRcIiwgXCIwLjdlbVwiKTtcbiAgICBsYWJlbCA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXN0eWxlXCIsIFtsYWJlbF0pO1xuICAgIGxhYmVsLnNldEF0dHJpYnV0ZShcImRpc3BsYXlzdHlsZVwiLCBcImZhbHNlXCIpO1xuICAgIGxhYmVsLnNldEF0dHJpYnV0ZShcInNjcmlwdGxldmVsXCIsIFwiMVwiKTtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImNkbGFiZWxwYXJlbnRcIixcbiAgbmFtZXM6IFtcIlxcXFxcXFxcY2RwYXJlbnRcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYyLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYyLnBhcnNlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjZGxhYmVscGFyZW50XCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGZyYWdtZW50OiBhcmdzWzBdXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gV3JhcCB0aGUgdmVydGljYWwgYXJyb3cgYW5kIGl0cyBsYWJlbHMuXG4gICAgLy8gVGhlIHBhcmVudCBnZXRzIHBvc2l0aW9uOiByZWxhdGl2ZS4gVGhlIGNoaWxkIGdldHMgcG9zaXRpb246IGFic29sdXRlLlxuICAgIC8vIFNvIENTUyBjYW4gbG9jYXRlIHRoZSBsYWJlbCBjb3JyZWN0bHkuXG4gICAgdmFyIHBhcmVudCA9IGJ1aWxkQ29tbW9uLndyYXBGcmFnbWVudChidWlsZEdyb3VwKGdyb3VwLmZyYWdtZW50LCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gICAgcGFyZW50LmNsYXNzZXMucHVzaChcImNkLXZlcnQtYXJyb3dcIik7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1yb3dcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuZnJhZ21lbnQsIG9wdGlvbnMpXSk7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9jaGFyLmpzXG5cblxuIC8vIFxcQGNoYXIgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGdyb3VwZWQgZGVjaW1hbCBhcmd1bWVudCBsaWtlXG4vLyB7MTIzfSBhbmQgY29udmVydHMgaW50byBzeW1ib2wgd2l0aCBjb2RlIDEyMy4gIEl0IGlzIHVzZWQgYnkgdGhlICptYWNybypcbi8vIFxcY2hhciBkZWZpbmVkIGluIG1hY3Jvcy5qcy5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcInRleHRvcmRcIixcbiAgbmFtZXM6IFtcIlxcXFxAY2hhclwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBhcmcgPSBhc3NlcnROb2RlVHlwZShhcmdzWzBdLCBcIm9yZGdyb3VwXCIpO1xuICAgIHZhciBncm91cCA9IGFyZy5ib2R5O1xuICAgIHZhciBudW1iZXIgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBhc3NlcnROb2RlVHlwZShncm91cFtpXSwgXCJ0ZXh0b3JkXCIpO1xuICAgICAgbnVtYmVyICs9IG5vZGUudGV4dDtcbiAgICB9XG5cbiAgICB2YXIgY29kZSA9IHBhcnNlSW50KG51bWJlcik7XG4gICAgdmFyIHRleHQ7XG5cbiAgICBpZiAoaXNOYU4oY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFxAY2hhciBoYXMgbm9uLW51bWVyaWMgYXJndW1lbnQgXCIgKyBudW1iZXIpOyAvLyBJZiB3ZSBkcm9wIElFIHN1cHBvcnQsIHRoZSBmb2xsb3dpbmcgY29kZSBjb3VsZCBiZSByZXBsYWNlZCB3aXRoXG4gICAgICAvLyB0ZXh0ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSlcbiAgICB9IGVsc2UgaWYgKGNvZGUgPCAwIHx8IGNvZGUgPj0gMHgxMGZmZmYpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFxAY2hhciB3aXRoIGludmFsaWQgY29kZSBwb2ludCBcIiArIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChjb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdGV4dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFzdHJhbCBjb2RlIHBvaW50OyBzcGxpdCBpbnRvIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgIGNvZGUgLT0gMHgxMDAwMDtcbiAgICAgIHRleHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4ZDgwMCwgKGNvZGUgJiAweDNmZikgKyAweGRjMDApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInRleHRvcmRcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgdGV4dDogdGV4dFxuICAgIH07XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9jb2xvci5qc1xuXG5cblxuXG5cblxuXG52YXIgY29sb3JfaHRtbEJ1aWxkZXIgPSBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucy53aXRoQ29sb3IoZ3JvdXAuY29sb3IpLCBmYWxzZSk7IC8vIFxcY29sb3IgaXNuJ3Qgc3VwcG9zZWQgdG8gYWZmZWN0IHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpdCBjb250YWlucy5cbiAgLy8gVG8gYWNjb21wbGlzaCB0aGlzLCB3ZSB3cmFwIHRoZSByZXN1bHRzIGluIGEgZnJhZ21lbnQsIHNvIHRoZSBpbm5lclxuICAvLyBlbGVtZW50cyB3aWxsIGJlIGFibGUgdG8gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGVpciBuZWlnaGJvcnMuIEZvclxuICAvLyBleGFtcGxlLCBgXFxjb2xvcntyZWR9ezIgK30gM2AgaGFzIHRoZSBzYW1lIHNwYWNpbmcgYXMgYDIgKyAzYFxuXG4gIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoZWxlbWVudHMpO1xufTtcblxudmFyIGNvbG9yX21hdGhtbEJ1aWxkZXIgPSBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLndpdGhDb2xvcihncm91cC5jb2xvcikpO1xuICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXN0eWxlXCIsIGlubmVyKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXRoY29sb3JcIiwgZ3JvdXAuY29sb3IpO1xuICByZXR1cm4gbm9kZTtcbn07XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJjb2xvclwiLFxuICBuYW1lczogW1wiXFxcXHRleHRjb2xvclwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAyLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWUsXG4gICAgYXJnVHlwZXM6IFtcImNvbG9yXCIsIFwib3JpZ2luYWxcIl1cbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBjb2xvciA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMF0sIFwiY29sb3ItdG9rZW5cIikuY29sb3I7XG4gICAgdmFyIGJvZHkgPSBhcmdzWzFdO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIGJvZHk6IG9yZGFyZ3VtZW50KGJvZHkpXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGNvbG9yX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBjb2xvcl9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJjb2xvclwiLFxuICBuYW1lczogW1wiXFxcXGNvbG9yXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBhcmdUeXBlczogW1wiY29sb3JcIl1cbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMi5wYXJzZXIsXG4gICAgICAgIGJyZWFrT25Ub2tlblRleHQgPSBfcmVmMi5icmVha09uVG9rZW5UZXh0O1xuICAgIHZhciBjb2xvciA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMF0sIFwiY29sb3ItdG9rZW5cIikuY29sb3I7IC8vIFNldCBtYWNybyBcXGN1cnJlbnRAY29sb3IgaW4gY3VycmVudCBuYW1lc3BhY2UgdG8gc3RvcmUgdGhlIGN1cnJlbnRcbiAgICAvLyBjb2xvciwgbWltaWNraW5nIHRoZSBiZWhhdmlvciBvZiBjb2xvci5zdHkuXG4gICAgLy8gVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBqdXN0IHRvIGNvcnJlY3RseSBjb2xvciBhIFxccmlnaHRcbiAgICAvLyB0aGF0IGZvbGxvd3MgYSBcXGNvbG9yIGNvbW1hbmQuXG5cbiAgICBwYXJzZXIuZ3VsbGV0Lm1hY3Jvcy5zZXQoXCJcXFxcY3VycmVudEBjb2xvclwiLCBjb2xvcik7IC8vIFBhcnNlIG91dCB0aGUgaW1wbGljaXQgYm9keSB0aGF0IHNob3VsZCBiZSBjb2xvcmVkLlxuXG4gICAgdmFyIGJvZHkgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHRydWUsIGJyZWFrT25Ub2tlblRleHQpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbG9yXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIGJvZHk6IGJvZHlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogY29sb3JfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGNvbG9yX21hdGhtbEJ1aWxkZXJcbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9jci5qc1xuLy8gUm93IGJyZWFrcyB3aXRoaW4gdGFidWxhciBlbnZpcm9ubWVudHMsIGFuZCBsaW5lIGJyZWFrcyBhdCB0b3AgbGV2ZWxcblxuXG5cblxuIC8vIFxcRGVjbGFyZVJvYnVzdENvbW1hbmRcXFxcey4uLlxcQHhuZXdsaW5lfVxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiY3JcIixcbiAgbmFtZXM6IFtcIlxcXFxcXFxcXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDAsXG4gICAgbnVtT3B0aW9uYWxBcmdzOiAwLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzLCBvcHRBcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBzaXplID0gcGFyc2VyLmd1bGxldC5mdXR1cmUoKS50ZXh0ID09PSBcIltcIiA/IHBhcnNlci5wYXJzZVNpemVHcm91cCh0cnVlKSA6IG51bGw7XG4gICAgdmFyIG5ld0xpbmUgPSAhcGFyc2VyLnNldHRpbmdzLmRpc3BsYXlNb2RlIHx8ICFwYXJzZXIuc2V0dGluZ3MudXNlU3RyaWN0QmVoYXZpb3IoXCJuZXdMaW5lSW5EaXNwbGF5TW9kZVwiLCBcIkluIExhVGVYLCBcXFxcXFxcXCBvciBcXFxcbmV3bGluZSBcIiArIFwiZG9lcyBub3RoaW5nIGluIGRpc3BsYXkgbW9kZVwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjclwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBuZXdMaW5lOiBuZXdMaW5lLFxuICAgICAgc2l6ZTogc2l6ZSAmJiBhc3NlcnROb2RlVHlwZShzaXplLCBcInNpemVcIikudmFsdWVcbiAgICB9O1xuICB9LFxuICAvLyBUaGUgZm9sbG93aW5nIGJ1aWxkZXJzIGFyZSBjYWxsZWQgb25seSBhdCB0aGUgdG9wIGxldmVsLFxuICAvLyBub3Qgd2l0aGluIHRhYnVsYXIvYXJyYXkgZW52aXJvbm1lbnRzLlxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgc3BhbiA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1zcGFjZVwiXSwgW10sIG9wdGlvbnMpO1xuXG4gICAgaWYgKGdyb3VwLm5ld0xpbmUpIHtcbiAgICAgIHNwYW4uY2xhc3Nlcy5wdXNoKFwibmV3bGluZVwiKTtcblxuICAgICAgaWYgKGdyb3VwLnNpemUpIHtcbiAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5Ub3AgPSBtYWtlRW0oY2FsY3VsYXRlU2l6ZShncm91cC5zaXplLCBvcHRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW47XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXNwYWNlXCIpO1xuXG4gICAgaWYgKGdyb3VwLm5ld0xpbmUpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGluZWJyZWFrXCIsIFwibmV3bGluZVwiKTtcblxuICAgICAgaWYgKGdyb3VwLnNpemUpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgbWFrZUVtKGNhbGN1bGF0ZVNpemUoZ3JvdXAuc2l6ZSwgb3B0aW9ucykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL2RlZi5qc1xuXG5cblxudmFyIGdsb2JhbE1hcCA9IHtcbiAgXCJcXFxcZ2xvYmFsXCI6IFwiXFxcXGdsb2JhbFwiLFxuICBcIlxcXFxsb25nXCI6IFwiXFxcXFxcXFxnbG9iYWxsb25nXCIsXG4gIFwiXFxcXFxcXFxnbG9iYWxsb25nXCI6IFwiXFxcXFxcXFxnbG9iYWxsb25nXCIsXG4gIFwiXFxcXGRlZlwiOiBcIlxcXFxnZGVmXCIsXG4gIFwiXFxcXGdkZWZcIjogXCJcXFxcZ2RlZlwiLFxuICBcIlxcXFxlZGVmXCI6IFwiXFxcXHhkZWZcIixcbiAgXCJcXFxceGRlZlwiOiBcIlxcXFx4ZGVmXCIsXG4gIFwiXFxcXGxldFwiOiBcIlxcXFxcXFxcZ2xvYmFsbGV0XCIsXG4gIFwiXFxcXGZ1dHVyZWxldFwiOiBcIlxcXFxcXFxcZ2xvYmFsZnV0dXJlXCJcbn07XG5cbnZhciBjaGVja0NvbnRyb2xTZXF1ZW5jZSA9IGZ1bmN0aW9uIGNoZWNrQ29udHJvbFNlcXVlbmNlKHRvaykge1xuICB2YXIgbmFtZSA9IHRvay50ZXh0O1xuXG4gIGlmICgvXig/OltcXFxce30kJiNeX118RU9GKSQvLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCBhIGNvbnRyb2wgc2VxdWVuY2VcIiwgdG9rKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lO1xufTtcblxudmFyIGdldFJIUyA9IGZ1bmN0aW9uIGdldFJIUyhwYXJzZXIpIHtcbiAgdmFyIHRvayA9IHBhcnNlci5ndWxsZXQucG9wVG9rZW4oKTtcblxuICBpZiAodG9rLnRleHQgPT09IFwiPVwiKSB7XG4gICAgLy8gY29uc3VtZSBvcHRpb25hbCBlcXVhbHNcbiAgICB0b2sgPSBwYXJzZXIuZ3VsbGV0LnBvcFRva2VuKCk7XG5cbiAgICBpZiAodG9rLnRleHQgPT09IFwiIFwiKSB7XG4gICAgICAvLyBjb25zdW1lIG9uZSBvcHRpb25hbCBzcGFjZVxuICAgICAgdG9rID0gcGFyc2VyLmd1bGxldC5wb3BUb2tlbigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b2s7XG59O1xuXG52YXIgbGV0Q29tbWFuZCA9IGZ1bmN0aW9uIGxldENvbW1hbmQocGFyc2VyLCBuYW1lLCB0b2ssIGdsb2JhbCkge1xuICB2YXIgbWFjcm8gPSBwYXJzZXIuZ3VsbGV0Lm1hY3Jvcy5nZXQodG9rLnRleHQpO1xuXG4gIGlmIChtYWNybyA9PSBudWxsKSB7XG4gICAgLy8gZG9uJ3QgZXhwYW5kIGl0IGxhdGVyIGV2ZW4gaWYgYSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZGVmaW5lZFxuICAgIC8vIGUuZy4sIFxcbGV0XFxmb289XFxmcmFjIFxcZGVmXFxmcmFje1xccmVsYXh9IFxcZnJhYzEyXG4gICAgdG9rLm5vZXhwYW5kID0gdHJ1ZTtcbiAgICBtYWNybyA9IHtcbiAgICAgIHRva2VuczogW3Rva10sXG4gICAgICBudW1BcmdzOiAwLFxuICAgICAgLy8gcmVwcm9kdWNlIHRoZSBzYW1lIGJlaGF2aW9yIGluIGV4cGFuc2lvblxuICAgICAgdW5leHBhbmRhYmxlOiAhcGFyc2VyLmd1bGxldC5pc0V4cGFuZGFibGUodG9rLnRleHQpXG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlci5ndWxsZXQubWFjcm9zLnNldChuYW1lLCBtYWNybywgZ2xvYmFsKTtcbn07IC8vIDxhc3NpZ25tZW50PiAtPiA8bm9uLW1hY3JvIGFzc2lnbm1lbnQ+fDxtYWNybyBhc3NpZ25tZW50PlxuLy8gPG5vbi1tYWNybyBhc3NpZ25tZW50PiAtPiA8c2ltcGxlIGFzc2lnbm1lbnQ+fFxcZ2xvYmFsPG5vbi1tYWNybyBhc3NpZ25tZW50PlxuLy8gPG1hY3JvIGFzc2lnbm1lbnQ+IC0+IDxkZWZpbml0aW9uPnw8cHJlZml4PjxtYWNybyBhc3NpZ25tZW50PlxuLy8gPHByZWZpeD4gLT4gXFxnbG9iYWx8XFxsb25nfFxcb3V0ZXJcblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaW50ZXJuYWxcIixcbiAgbmFtZXM6IFtcIlxcXFxnbG9iYWxcIiwgXCJcXFxcbG9uZ1wiLCBcIlxcXFxcXFxcZ2xvYmFsbG9uZ1wiIC8vIGNhbuKAmXQgYmUgZW50ZXJlZCBkaXJlY3RseVxuICBdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDAsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICBwYXJzZXIuY29uc3VtZVNwYWNlcygpO1xuICAgIHZhciB0b2tlbiA9IHBhcnNlci5mZXRjaCgpO1xuXG4gICAgaWYgKGdsb2JhbE1hcFt0b2tlbi50ZXh0XSkge1xuICAgICAgLy8gS2FUZVggZG9lc24ndCBoYXZlIFxccGFyLCBzbyBpZ25vcmUgXFxsb25nXG4gICAgICBpZiAoZnVuY05hbWUgPT09IFwiXFxcXGdsb2JhbFwiIHx8IGZ1bmNOYW1lID09PSBcIlxcXFxcXFxcZ2xvYmFsbG9uZ1wiKSB7XG4gICAgICAgIHRva2VuLnRleHQgPSBnbG9iYWxNYXBbdG9rZW4udGV4dF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhc3NlcnROb2RlVHlwZShwYXJzZXIucGFyc2VGdW5jdGlvbigpLCBcImludGVybmFsXCIpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkludmFsaWQgdG9rZW4gYWZ0ZXIgbWFjcm8gcHJlZml4XCIsIHRva2VuKTtcbiAgfVxufSk7IC8vIEJhc2ljIHN1cHBvcnQgZm9yIG1hY3JvIGRlZmluaXRpb25zOiBcXGRlZiwgXFxnZGVmLCBcXGVkZWYsIFxceGRlZlxuLy8gPGRlZmluaXRpb24+IC0+IDxkZWY+PGNvbnRyb2wgc2VxdWVuY2U+PGRlZmluaXRpb24gdGV4dD5cbi8vIDxkZWY+IC0+IFxcZGVmfFxcZ2RlZnxcXGVkZWZ8XFx4ZGVmXG4vLyA8ZGVmaW5pdGlvbiB0ZXh0PiAtPiA8cGFyYW1ldGVyIHRleHQ+PGxlZnQgYnJhY2U+PGJhbGFuY2VkIHRleHQ+PHJpZ2h0IGJyYWNlPlxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaW50ZXJuYWxcIixcbiAgbmFtZXM6IFtcIlxcXFxkZWZcIiwgXCJcXFxcZ2RlZlwiLCBcIlxcXFxlZGVmXCIsIFwiXFxcXHhkZWZcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlLFxuICAgIHByaW1pdGl2ZTogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYyKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYyLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmMi5mdW5jTmFtZTtcbiAgICB2YXIgdG9rID0gcGFyc2VyLmd1bGxldC5wb3BUb2tlbigpO1xuICAgIHZhciBuYW1lID0gdG9rLnRleHQ7XG5cbiAgICBpZiAoL14oPzpbXFxcXHt9JCYjXl9dfEVPRikkLy50ZXN0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCBhIGNvbnRyb2wgc2VxdWVuY2VcIiwgdG9rKTtcbiAgICB9XG5cbiAgICB2YXIgbnVtQXJncyA9IDA7XG4gICAgdmFyIGluc2VydDtcbiAgICB2YXIgZGVsaW1pdGVycyA9IFtbXV07IC8vIDxwYXJhbWV0ZXIgdGV4dD4gY29udGFpbnMgbm8gYnJhY2VzXG5cbiAgICB3aGlsZSAocGFyc2VyLmd1bGxldC5mdXR1cmUoKS50ZXh0ICE9PSBcIntcIikge1xuICAgICAgdG9rID0gcGFyc2VyLmd1bGxldC5wb3BUb2tlbigpO1xuXG4gICAgICBpZiAodG9rLnRleHQgPT09IFwiI1wiKSB7XG4gICAgICAgIC8vIElmIHRoZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIG9mIHRoZSA8cGFyYW1ldGVyIHRleHQ+IGlzICMsIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHssIFRlWCB3aWxsIGJlaGF2ZSBhcyBpZiB0aGUge1xuICAgICAgICAvLyBoYWQgYmVlbiBpbnNlcnRlZCBhdCB0aGUgcmlnaHQgZW5kIG9mIGJvdGggdGhlIHBhcmFtZXRlciB0ZXh0XG4gICAgICAgIC8vIGFuZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC5cbiAgICAgICAgaWYgKHBhcnNlci5ndWxsZXQuZnV0dXJlKCkudGV4dCA9PT0gXCJ7XCIpIHtcbiAgICAgICAgICBpbnNlcnQgPSBwYXJzZXIuZ3VsbGV0LmZ1dHVyZSgpO1xuICAgICAgICAgIGRlbGltaXRlcnNbbnVtQXJnc10ucHVzaChcIntcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gQSBwYXJhbWV0ZXIsIHRoZSBmaXJzdCBhcHBlYXJhbmNlIG9mICMgbXVzdCBiZSBmb2xsb3dlZCBieSAxLFxuICAgICAgICAvLyB0aGUgbmV4dCBieSAyLCBhbmQgc28gb247IHVwIHRvIG5pbmUgI+KAmXMgYXJlIGFsbG93ZWRcblxuXG4gICAgICAgIHRvayA9IHBhcnNlci5ndWxsZXQucG9wVG9rZW4oKTtcblxuICAgICAgICBpZiAoIS9eWzEtOV0kLy50ZXN0KHRvay50ZXh0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkludmFsaWQgYXJndW1lbnQgbnVtYmVyIFxcXCJcIiArIHRvay50ZXh0ICsgXCJcXFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlSW50KHRvay50ZXh0KSAhPT0gbnVtQXJncyArIDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJBcmd1bWVudCBudW1iZXIgXFxcIlwiICsgdG9rLnRleHQgKyBcIlxcXCIgb3V0IG9mIG9yZGVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbnVtQXJncysrO1xuICAgICAgICBkZWxpbWl0ZXJzLnB1c2goW10pO1xuICAgICAgfSBlbHNlIGlmICh0b2sudGV4dCA9PT0gXCJFT0ZcIikge1xuICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCBhIG1hY3JvIGRlZmluaXRpb25cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxpbWl0ZXJzW251bUFyZ3NdLnB1c2godG9rLnRleHQpO1xuICAgICAgfVxuICAgIH0gLy8gcmVwbGFjZW1lbnQgdGV4dCwgZW5jbG9zZWQgaW4gJ3snIGFuZCAnfScgYW5kIHByb3Blcmx5IG5lc3RlZFxuXG5cbiAgICB2YXIgX3BhcnNlciRndWxsZXQkY29uc3VtID0gcGFyc2VyLmd1bGxldC5jb25zdW1lQXJnKCksXG4gICAgICAgIHRva2VucyA9IF9wYXJzZXIkZ3VsbGV0JGNvbnN1bS50b2tlbnM7XG5cbiAgICBpZiAoaW5zZXJ0KSB7XG4gICAgICB0b2tlbnMudW5zaGlmdChpbnNlcnQpO1xuICAgIH1cblxuICAgIGlmIChmdW5jTmFtZSA9PT0gXCJcXFxcZWRlZlwiIHx8IGZ1bmNOYW1lID09PSBcIlxcXFx4ZGVmXCIpIHtcbiAgICAgIHRva2VucyA9IHBhcnNlci5ndWxsZXQuZXhwYW5kVG9rZW5zKHRva2Vucyk7XG4gICAgICB0b2tlbnMucmV2ZXJzZSgpOyAvLyB0byBmaXQgaW4gd2l0aCBzdGFjayBvcmRlclxuICAgIH0gLy8gRmluYWwgYXJnIGlzIHRoZSBleHBhbnNpb24gb2YgdGhlIG1hY3JvXG5cblxuICAgIHBhcnNlci5ndWxsZXQubWFjcm9zLnNldChuYW1lLCB7XG4gICAgICB0b2tlbnM6IHRva2VucyxcbiAgICAgIG51bUFyZ3M6IG51bUFyZ3MsXG4gICAgICBkZWxpbWl0ZXJzOiBkZWxpbWl0ZXJzXG4gICAgfSwgZnVuY05hbWUgPT09IGdsb2JhbE1hcFtmdW5jTmFtZV0pO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImludGVybmFsXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZVxuICAgIH07XG4gIH1cbn0pOyAvLyA8c2ltcGxlIGFzc2lnbm1lbnQ+IC0+IDxsZXQgYXNzaWdubWVudD5cbi8vIDxsZXQgYXNzaWdubWVudD4gLT4gXFxmdXR1cmVsZXQ8Y29udHJvbCBzZXF1ZW5jZT48dG9rZW4+PHRva2VuPlxuLy8gICAgIHwgXFxsZXQ8Y29udHJvbCBzZXF1ZW5jZT48ZXF1YWxzPjxvbmUgb3B0aW9uYWwgc3BhY2U+PHRva2VuPlxuLy8gPGVxdWFscz4gLT4gPG9wdGlvbmFsIHNwYWNlcz58PG9wdGlvbmFsIHNwYWNlcz49XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJpbnRlcm5hbFwiLFxuICBuYW1lczogW1wiXFxcXGxldFwiLCBcIlxcXFxcXFxcZ2xvYmFsbGV0XCIgLy8gY2Fu4oCZdCBiZSBlbnRlcmVkIGRpcmVjdGx5XG4gIF0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlLFxuICAgIHByaW1pdGl2ZTogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYzLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmMy5mdW5jTmFtZTtcbiAgICB2YXIgbmFtZSA9IGNoZWNrQ29udHJvbFNlcXVlbmNlKHBhcnNlci5ndWxsZXQucG9wVG9rZW4oKSk7XG4gICAgcGFyc2VyLmd1bGxldC5jb25zdW1lU3BhY2VzKCk7XG4gICAgdmFyIHRvayA9IGdldFJIUyhwYXJzZXIpO1xuICAgIGxldENvbW1hbmQocGFyc2VyLCBuYW1lLCB0b2ssIGZ1bmNOYW1lID09PSBcIlxcXFxcXFxcZ2xvYmFsbGV0XCIpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImludGVybmFsXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZVxuICAgIH07XG4gIH1cbn0pOyAvLyByZWY6IGh0dHBzOi8vd3d3LnR1Zy5vcmcvVFVHYm9hdC90YjA5LTMvdGIyMmJlY2h0b2xzaGVpbS5wZGZcblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImludGVybmFsXCIsXG4gIG5hbWVzOiBbXCJcXFxcZnV0dXJlbGV0XCIsIFwiXFxcXFxcXFxnbG9iYWxmdXR1cmVcIiAvLyBjYW7igJl0IGJlIGVudGVyZWQgZGlyZWN0bHlcbiAgXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAwLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWUsXG4gICAgcHJpbWl0aXZlOiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjQpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjQucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWY0LmZ1bmNOYW1lO1xuICAgIHZhciBuYW1lID0gY2hlY2tDb250cm9sU2VxdWVuY2UocGFyc2VyLmd1bGxldC5wb3BUb2tlbigpKTtcbiAgICB2YXIgbWlkZGxlID0gcGFyc2VyLmd1bGxldC5wb3BUb2tlbigpO1xuICAgIHZhciB0b2sgPSBwYXJzZXIuZ3VsbGV0LnBvcFRva2VuKCk7XG4gICAgbGV0Q29tbWFuZChwYXJzZXIsIG5hbWUsIHRvaywgZnVuY05hbWUgPT09IFwiXFxcXFxcXFxnbG9iYWxmdXR1cmVcIik7XG4gICAgcGFyc2VyLmd1bGxldC5wdXNoVG9rZW4odG9rKTtcbiAgICBwYXJzZXIuZ3VsbGV0LnB1c2hUb2tlbihtaWRkbGUpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImludGVybmFsXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZVxuICAgIH07XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2RlbGltaXRlci5qc1xuLyoqXG4gKiBUaGlzIGZpbGUgZGVhbHMgd2l0aCBjcmVhdGluZyBkZWxpbWl0ZXJzIG9mIHZhcmlvdXMgc2l6ZXMuIFRoZSBUZVhib29rXG4gKiBkaXNjdXNzZXMgdGhlc2Ugcm91dGluZXMgb24gcGFnZSA0NDEtNDQyLCBpbiB0aGUgXCJBbm90aGVyIHN1YnJvdXRpbmUgc2V0cyBib3hcbiAqIHggdG8gYSBzcGVjaWZpZWQgdmFyaWFibGUgZGVsaW1pdGVyXCIgcGFyYWdyYXBoLlxuICpcbiAqIFRoZXJlIGFyZSB0aHJlZSBtYWluIHJvdXRpbmVzIGhlcmUuIGBtYWtlU21hbGxEZWxpbWAgbWFrZXMgYSBkZWxpbWl0ZXIgaW4gdGhlXG4gKiBub3JtYWwgZm9udCwgYnV0IGluIGVpdGhlciB0ZXh0LCBzY3JpcHQsIG9yIHNjcmlwdHNjcmlwdCBzdHlsZS5cbiAqIGBtYWtlTGFyZ2VEZWxpbWAgbWFrZXMgYSBkZWxpbWl0ZXIgaW4gdGV4dHN0eWxlLCBidXQgaW4gb25lIG9mIHRoZSBTaXplMSxcbiAqIFNpemUyLCBTaXplMywgb3IgU2l6ZTQgZm9udHMuIGBtYWtlU3RhY2tlZERlbGltYCBtYWtlcyBhIGRlbGltaXRlciBvdXQgb2ZcbiAqIHNtYWxsZXIgcGllY2VzIHRoYXQgYXJlIHN0YWNrZWQgb24gdG9wIG9mIG9uZSBhbm90aGVyLlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgdGFrZSBhIHBhcmFtZXRlciBgY2VudGVyYCwgd2hpY2ggZGV0ZXJtaW5lcyBpZiB0aGUgZGVsaW1pdGVyXG4gKiBzaG91bGQgYmUgY2VudGVyZWQgYXJvdW5kIHRoZSBheGlzLlxuICpcbiAqIFRoZW4sIHRoZXJlIGFyZSB0aHJlZSBleHBvc2VkIGZ1bmN0aW9ucy4gYHNpemVkRGVsaW1gIG1ha2VzIGEgZGVsaW1pdGVyIGluXG4gKiBvbmUgb2YgdGhlIGdpdmVuIHNpemVzLiBUaGlzIGlzIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGBcXGJpZ2xgLlxuICogYGN1c3RvbVNpemVkRGVsaW1gIG1ha2VzIGEgZGVsaW1pdGVyIHdpdGggYSBnaXZlbiB0b3RhbCBoZWlnaHQrZGVwdGguIEl0IGlzXG4gKiBjYWxsZWQgaW4gcGxhY2VzIGxpa2UgYFxcc3FydGAuIGBsZWZ0UmlnaHREZWxpbWAgbWFrZXMgYW4gYXBwcm9wcmlhdGVcbiAqIGRlbGltaXRlciB3aGljaCBzdXJyb3VuZHMgYW4gZXhwcmVzc2lvbiBvZiBhIGdpdmVuIGhlaWdodCBhbiBkZXB0aC4gSXQgaXNcbiAqIHVzZWQgaW4gYFxcbGVmdGAgYW5kIGBcXHJpZ2h0YC5cbiAqL1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogR2V0IHRoZSBtZXRyaWNzIGZvciBhIGdpdmVuIHN5bWJvbCBhbmQgZm9udCwgYWZ0ZXIgdHJhbnNmb3JtYXRpb24gKGkuZS5cbiAqIGFmdGVyIGZvbGxvd2luZyByZXBsYWNlbWVudCBmcm9tIHN5bWJvbHMuanMpXG4gKi9cbnZhciBnZXRNZXRyaWNzID0gZnVuY3Rpb24gZ2V0TWV0cmljcyhzeW1ib2wsIGZvbnQsIG1vZGUpIHtcbiAgdmFyIHJlcGxhY2UgPSBzcmNfc3ltYm9scy5tYXRoW3N5bWJvbF0gJiYgc3JjX3N5bWJvbHMubWF0aFtzeW1ib2xdLnJlcGxhY2U7XG4gIHZhciBtZXRyaWNzID0gZ2V0Q2hhcmFjdGVyTWV0cmljcyhyZXBsYWNlIHx8IHN5bWJvbCwgZm9udCwgbW9kZSk7XG5cbiAgaWYgKCFtZXRyaWNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgc3ltYm9sIFwiICsgc3ltYm9sICsgXCIgYW5kIGZvbnQgc2l6ZSBcIiArIGZvbnQgKyBcIi5cIik7XG4gIH1cblxuICByZXR1cm4gbWV0cmljcztcbn07XG4vKipcbiAqIFB1dHMgYSBkZWxpbWl0ZXIgc3BhbiBpbiBhIGdpdmVuIHN0eWxlLCBhbmQgYWRkcyBhcHByb3ByaWF0ZSBoZWlnaHQsIGRlcHRoLFxuICogYW5kIG1heEZvbnRTaXplcy5cbiAqL1xuXG5cbnZhciBzdHlsZVdyYXAgPSBmdW5jdGlvbiBzdHlsZVdyYXAoZGVsaW0sIHRvU3R5bGUsIG9wdGlvbnMsIGNsYXNzZXMpIHtcbiAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ0Jhc2VTdHlsZSh0b1N0eWxlKTtcbiAgdmFyIHNwYW4gPSBidWlsZENvbW1vbi5tYWtlU3BhbihjbGFzc2VzLmNvbmNhdChuZXdPcHRpb25zLnNpemluZ0NsYXNzZXMob3B0aW9ucykpLCBbZGVsaW1dLCBvcHRpb25zKTtcbiAgdmFyIGRlbGltU2l6ZU11bHRpcGxpZXIgPSBuZXdPcHRpb25zLnNpemVNdWx0aXBsaWVyIC8gb3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgc3Bhbi5oZWlnaHQgKj0gZGVsaW1TaXplTXVsdGlwbGllcjtcbiAgc3Bhbi5kZXB0aCAqPSBkZWxpbVNpemVNdWx0aXBsaWVyO1xuICBzcGFuLm1heEZvbnRTaXplID0gbmV3T3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgcmV0dXJuIHNwYW47XG59O1xuXG52YXIgY2VudGVyU3BhbiA9IGZ1bmN0aW9uIGNlbnRlclNwYW4oc3Bhbiwgb3B0aW9ucywgc3R5bGUpIHtcbiAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ0Jhc2VTdHlsZShzdHlsZSk7XG4gIHZhciBzaGlmdCA9ICgxIC0gb3B0aW9ucy5zaXplTXVsdGlwbGllciAvIG5ld09wdGlvbnMuc2l6ZU11bHRpcGxpZXIpICogb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQ7XG4gIHNwYW4uY2xhc3Nlcy5wdXNoKFwiZGVsaW1jZW50ZXJcIik7XG4gIHNwYW4uc3R5bGUudG9wID0gbWFrZUVtKHNoaWZ0KTtcbiAgc3Bhbi5oZWlnaHQgLT0gc2hpZnQ7XG4gIHNwYW4uZGVwdGggKz0gc2hpZnQ7XG59O1xuLyoqXG4gKiBNYWtlcyBhIHNtYWxsIGRlbGltaXRlci4gVGhpcyBpcyBhIGRlbGltaXRlciB0aGF0IGNvbWVzIGluIHRoZSBNYWluLVJlZ3VsYXJcbiAqIGZvbnQsIGJ1dCBpcyByZXN0eWxlZCB0byBlaXRoZXIgYmUgaW4gdGV4dHN0eWxlLCBzY3JpcHRzdHlsZSwgb3JcbiAqIHNjcmlwdHNjcmlwdHN0eWxlLlxuICovXG5cblxudmFyIG1ha2VTbWFsbERlbGltID0gZnVuY3Rpb24gbWFrZVNtYWxsRGVsaW0oZGVsaW0sIHN0eWxlLCBjZW50ZXIsIG9wdGlvbnMsIG1vZGUsIGNsYXNzZXMpIHtcbiAgdmFyIHRleHQgPSBidWlsZENvbW1vbi5tYWtlU3ltYm9sKGRlbGltLCBcIk1haW4tUmVndWxhclwiLCBtb2RlLCBvcHRpb25zKTtcbiAgdmFyIHNwYW4gPSBzdHlsZVdyYXAodGV4dCwgc3R5bGUsIG9wdGlvbnMsIGNsYXNzZXMpO1xuXG4gIGlmIChjZW50ZXIpIHtcbiAgICBjZW50ZXJTcGFuKHNwYW4sIG9wdGlvbnMsIHN0eWxlKTtcbiAgfVxuXG4gIHJldHVybiBzcGFuO1xufTtcbi8qKlxuICogQnVpbGRzIGEgc3ltYm9sIGluIHRoZSBnaXZlbiBmb250IHNpemUgKG5vdGUgc2l6ZSBpcyBhbiBpbnRlZ2VyKVxuICovXG5cblxudmFyIG1hdGhybVNpemUgPSBmdW5jdGlvbiBtYXRocm1TaXplKHZhbHVlLCBzaXplLCBtb2RlLCBvcHRpb25zKSB7XG4gIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3ltYm9sKHZhbHVlLCBcIlNpemVcIiArIHNpemUgKyBcIi1SZWd1bGFyXCIsIG1vZGUsIG9wdGlvbnMpO1xufTtcbi8qKlxuICogTWFrZXMgYSBsYXJnZSBkZWxpbWl0ZXIuIFRoaXMgaXMgYSBkZWxpbWl0ZXIgdGhhdCBjb21lcyBpbiB0aGUgU2l6ZTEsIFNpemUyLFxuICogU2l6ZTMsIG9yIFNpemU0IGZvbnRzLiBJdCBpcyBhbHdheXMgcmVuZGVyZWQgaW4gdGV4dHN0eWxlLlxuICovXG5cblxudmFyIG1ha2VMYXJnZURlbGltID0gZnVuY3Rpb24gbWFrZUxhcmdlRGVsaW0oZGVsaW0sIHNpemUsIGNlbnRlciwgb3B0aW9ucywgbW9kZSwgY2xhc3Nlcykge1xuICB2YXIgaW5uZXIgPSBtYXRocm1TaXplKGRlbGltLCBzaXplLCBtb2RlLCBvcHRpb25zKTtcbiAgdmFyIHNwYW4gPSBzdHlsZVdyYXAoYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiZGVsaW1zaXppbmdcIiwgXCJzaXplXCIgKyBzaXplXSwgW2lubmVyXSwgb3B0aW9ucyksIHNyY19TdHlsZS5URVhULCBvcHRpb25zLCBjbGFzc2VzKTtcblxuICBpZiAoY2VudGVyKSB7XG4gICAgY2VudGVyU3BhbihzcGFuLCBvcHRpb25zLCBzcmNfU3R5bGUuVEVYVCk7XG4gIH1cblxuICByZXR1cm4gc3Bhbjtcbn07XG4vKipcbiAqIE1ha2UgYSBzcGFuIGZyb20gYSBmb250IGdseXBoIHdpdGggdGhlIGdpdmVuIG9mZnNldCBhbmQgaW4gdGhlIGdpdmVuIGZvbnQuXG4gKiBUaGlzIGlzIHVzZWQgaW4gbWFrZVN0YWNrZWREZWxpbSB0byBtYWtlIHRoZSBzdGFja2luZyBwaWVjZXMgZm9yIHRoZSBkZWxpbWl0ZXIuXG4gKi9cblxuXG52YXIgbWFrZUdseXBoU3BhbiA9IGZ1bmN0aW9uIG1ha2VHbHlwaFNwYW4oc3ltYm9sLCBmb250LCBtb2RlKSB7XG4gIHZhciBzaXplQ2xhc3M7IC8vIEFwcGx5IHRoZSBjb3JyZWN0IENTUyBjbGFzcyB0byBjaG9vc2UgdGhlIHJpZ2h0IGZvbnQuXG5cbiAgaWYgKGZvbnQgPT09IFwiU2l6ZTEtUmVndWxhclwiKSB7XG4gICAgc2l6ZUNsYXNzID0gXCJkZWxpbS1zaXplMVwiO1xuICB9IGVsc2VcbiAgICAvKiBpZiAoZm9udCA9PT0gXCJTaXplNC1SZWd1bGFyXCIpICovXG4gICAge1xuICAgICAgc2l6ZUNsYXNzID0gXCJkZWxpbS1zaXplNFwiO1xuICAgIH1cblxuICB2YXIgY29ybmVyID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiZGVsaW1zaXppbmdpbm5lclwiLCBzaXplQ2xhc3NdLCBbYnVpbGRDb21tb24ubWFrZVNwYW4oW10sIFtidWlsZENvbW1vbi5tYWtlU3ltYm9sKHN5bWJvbCwgZm9udCwgbW9kZSldKV0pOyAvLyBTaW5jZSB0aGlzIHdpbGwgYmUgcGFzc2VkIGludG8gYG1ha2VWTGlzdGAgaW4gdGhlIGVuZCwgd3JhcCB0aGUgZWxlbWVudFxuICAvLyBpbiB0aGUgYXBwcm9wcmlhdGUgdGFnIHRoYXQgVkxpc3QgdXNlcy5cblxuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgIGVsZW06IGNvcm5lclxuICB9O1xufTtcblxudmFyIG1ha2VJbm5lciA9IGZ1bmN0aW9uIG1ha2VJbm5lcihjaCwgaGVpZ2h0LCBvcHRpb25zKSB7XG4gIC8vIENyZWF0ZSBhIHNwYW4gd2l0aCBpbmxpbmUgU1ZHIGZvciB0aGUgaW5uZXIgcGFydCBvZiBhIHRhbGwgc3RhY2tlZCBkZWxpbWl0ZXIuXG4gIHZhciB3aWR0aCA9IGZvbnRNZXRyaWNzRGF0YVtcIlNpemU0LVJlZ3VsYXJcIl1bY2guY2hhckNvZGVBdCgwKV0gPyBmb250TWV0cmljc0RhdGFbXCJTaXplNC1SZWd1bGFyXCJdW2NoLmNoYXJDb2RlQXQoMCldWzRdIDogZm9udE1ldHJpY3NEYXRhW1wiU2l6ZTEtUmVndWxhclwiXVtjaC5jaGFyQ29kZUF0KDApXVs0XTtcbiAgdmFyIHBhdGggPSBuZXcgUGF0aE5vZGUoXCJpbm5lclwiLCBpbm5lclBhdGgoY2gsIE1hdGgucm91bmQoMTAwMCAqIGhlaWdodCkpKTtcbiAgdmFyIHN2Z05vZGUgPSBuZXcgU3ZnTm9kZShbcGF0aF0sIHtcbiAgICBcIndpZHRoXCI6IG1ha2VFbSh3aWR0aCksXG4gICAgXCJoZWlnaHRcIjogbWFrZUVtKGhlaWdodCksXG4gICAgLy8gT3ZlcnJpZGUgQ1NTIHJ1bGUgYC5rYXRleCBzdmcgeyB3aWR0aDogMTAwJSB9YFxuICAgIFwic3R5bGVcIjogXCJ3aWR0aDpcIiArIG1ha2VFbSh3aWR0aCksXG4gICAgXCJ2aWV3Qm94XCI6IFwiMCAwIFwiICsgMTAwMCAqIHdpZHRoICsgXCIgXCIgKyBNYXRoLnJvdW5kKDEwMDAgKiBoZWlnaHQpLFxuICAgIFwicHJlc2VydmVBc3BlY3RSYXRpb1wiOiBcInhNaW5ZTWluXCJcbiAgfSk7XG4gIHZhciBzcGFuID0gYnVpbGRDb21tb24ubWFrZVN2Z1NwYW4oW10sIFtzdmdOb2RlXSwgb3B0aW9ucyk7XG4gIHNwYW4uaGVpZ2h0ID0gaGVpZ2h0O1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IG1ha2VFbShoZWlnaHQpO1xuICBzcGFuLnN0eWxlLndpZHRoID0gbWFrZUVtKHdpZHRoKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImVsZW1cIixcbiAgICBlbGVtOiBzcGFuXG4gIH07XG59OyAvLyBIZWxwZXJzIGZvciBtYWtlU3RhY2tlZERlbGltXG5cblxudmFyIGxhcEluRW1zID0gMC4wMDg7XG52YXIgbGFwID0ge1xuICB0eXBlOiBcImtlcm5cIixcbiAgc2l6ZTogLTEgKiBsYXBJbkVtc1xufTtcbnZhciB2ZXJ0cyA9IFtcInxcIiwgXCJcXFxcbHZlcnRcIiwgXCJcXFxccnZlcnRcIiwgXCJcXFxcdmVydFwiXTtcbnZhciBkb3VibGVWZXJ0cyA9IFtcIlxcXFx8XCIsIFwiXFxcXGxWZXJ0XCIsIFwiXFxcXHJWZXJ0XCIsIFwiXFxcXFZlcnRcIl07XG4vKipcbiAqIE1ha2UgYSBzdGFja2VkIGRlbGltaXRlciBvdXQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIsIHdpdGggdGhlIHRvdGFsIGhlaWdodCBhdFxuICogbGVhc3QgYGhlaWdodFRvdGFsYC4gVGhpcyByb3V0aW5lIGlzIG1lbnRpb25lZCBvbiBwYWdlIDQ0MiBvZiB0aGUgVGVYYm9vay5cbiAqL1xuXG52YXIgbWFrZVN0YWNrZWREZWxpbSA9IGZ1bmN0aW9uIG1ha2VTdGFja2VkRGVsaW0oZGVsaW0sIGhlaWdodFRvdGFsLCBjZW50ZXIsIG9wdGlvbnMsIG1vZGUsIGNsYXNzZXMpIHtcbiAgLy8gVGhlcmUgYXJlIGZvdXIgcGFydHMsIHRoZSB0b3AsIGFuIG9wdGlvbmFsIG1pZGRsZSwgYSByZXBlYXRlZCBwYXJ0LCBhbmQgYVxuICAvLyBib3R0b20uXG4gIHZhciB0b3A7XG4gIHZhciBtaWRkbGU7XG4gIHZhciByZXBlYXQ7XG4gIHZhciBib3R0b207XG4gIHZhciBzdmdMYWJlbCA9IFwiXCI7XG4gIHZhciB2aWV3Qm94V2lkdGggPSAwO1xuICB0b3AgPSByZXBlYXQgPSBib3R0b20gPSBkZWxpbTtcbiAgbWlkZGxlID0gbnVsbDsgLy8gQWxzbyBrZWVwIHRyYWNrIG9mIHdoYXQgZm9udCB0aGUgZGVsaW1pdGVycyBhcmUgaW5cblxuICB2YXIgZm9udCA9IFwiU2l6ZTEtUmVndWxhclwiOyAvLyBXZSBzZXQgdGhlIHBhcnRzIGFuZCBmb250IGJhc2VkIG9uIHRoZSBzeW1ib2wuIE5vdGUgdGhhdCB3ZSB1c2VcbiAgLy8gJ1xcdTIzZDAnIGluc3RlYWQgb2YgJ3wnIGFuZCAnXFx1MjAxNicgaW5zdGVhZCBvZiAnXFxcXHwnIGZvciB0aGVcbiAgLy8gcmVwZWF0cyBvZiB0aGUgYXJyb3dzXG5cbiAgaWYgKGRlbGltID09PSBcIlxcXFx1cGFycm93XCIpIHtcbiAgICByZXBlYXQgPSBib3R0b20gPSBcIlxcdTIzRDBcIjtcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCJcXFxcVXBhcnJvd1wiKSB7XG4gICAgcmVwZWF0ID0gYm90dG9tID0gXCJcXHUyMDE2XCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXGRvd25hcnJvd1wiKSB7XG4gICAgdG9wID0gcmVwZWF0ID0gXCJcXHUyM0QwXCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXERvd25hcnJvd1wiKSB7XG4gICAgdG9wID0gcmVwZWF0ID0gXCJcXHUyMDE2XCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXHVwZG93bmFycm93XCIpIHtcbiAgICB0b3AgPSBcIlxcXFx1cGFycm93XCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyM0QwXCI7XG4gICAgYm90dG9tID0gXCJcXFxcZG93bmFycm93XCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXFVwZG93bmFycm93XCIpIHtcbiAgICB0b3AgPSBcIlxcXFxVcGFycm93XCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyMDE2XCI7XG4gICAgYm90dG9tID0gXCJcXFxcRG93bmFycm93XCI7XG4gIH0gZWxzZSBpZiAodXRpbHMuY29udGFpbnModmVydHMsIGRlbGltKSkge1xuICAgIHJlcGVhdCA9IFwiXFx1MjIyM1wiO1xuICAgIHN2Z0xhYmVsID0gXCJ2ZXJ0XCI7XG4gICAgdmlld0JveFdpZHRoID0gMzMzO1xuICB9IGVsc2UgaWYgKHV0aWxzLmNvbnRhaW5zKGRvdWJsZVZlcnRzLCBkZWxpbSkpIHtcbiAgICByZXBlYXQgPSBcIlxcdTIyMjVcIjtcbiAgICBzdmdMYWJlbCA9IFwiZG91YmxldmVydFwiO1xuICAgIHZpZXdCb3hXaWR0aCA9IDU1NjtcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCJbXCIgfHwgZGVsaW0gPT09IFwiXFxcXGxicmFja1wiKSB7XG4gICAgdG9wID0gXCJcXHUyM0ExXCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyM0EyXCI7XG4gICAgYm90dG9tID0gXCJcXHUyM0EzXCI7XG4gICAgZm9udCA9IFwiU2l6ZTQtUmVndWxhclwiO1xuICAgIHN2Z0xhYmVsID0gXCJsYnJhY2tcIjtcbiAgICB2aWV3Qm94V2lkdGggPSA2Njc7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXVwiIHx8IGRlbGltID09PSBcIlxcXFxyYnJhY2tcIikge1xuICAgIHRvcCA9IFwiXFx1MjNBNFwiO1xuICAgIHJlcGVhdCA9IFwiXFx1MjNBNVwiO1xuICAgIGJvdHRvbSA9IFwiXFx1MjNBNlwiO1xuICAgIGZvbnQgPSBcIlNpemU0LVJlZ3VsYXJcIjtcbiAgICBzdmdMYWJlbCA9IFwicmJyYWNrXCI7XG4gICAgdmlld0JveFdpZHRoID0gNjY3O1xuICB9IGVsc2UgaWYgKGRlbGltID09PSBcIlxcXFxsZmxvb3JcIiB8fCBkZWxpbSA9PT0gXCJcXHUyMzBBXCIpIHtcbiAgICByZXBlYXQgPSB0b3AgPSBcIlxcdTIzQTJcIjtcbiAgICBib3R0b20gPSBcIlxcdTIzQTNcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gICAgc3ZnTGFiZWwgPSBcImxmbG9vclwiO1xuICAgIHZpZXdCb3hXaWR0aCA9IDY2NztcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCJcXFxcbGNlaWxcIiB8fCBkZWxpbSA9PT0gXCJcXHUyMzA4XCIpIHtcbiAgICB0b3AgPSBcIlxcdTIzQTFcIjtcbiAgICByZXBlYXQgPSBib3R0b20gPSBcIlxcdTIzQTJcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gICAgc3ZnTGFiZWwgPSBcImxjZWlsXCI7XG4gICAgdmlld0JveFdpZHRoID0gNjY3O1xuICB9IGVsc2UgaWYgKGRlbGltID09PSBcIlxcXFxyZmxvb3JcIiB8fCBkZWxpbSA9PT0gXCJcXHUyMzBCXCIpIHtcbiAgICByZXBlYXQgPSB0b3AgPSBcIlxcdTIzQTVcIjtcbiAgICBib3R0b20gPSBcIlxcdTIzQTZcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gICAgc3ZnTGFiZWwgPSBcInJmbG9vclwiO1xuICAgIHZpZXdCb3hXaWR0aCA9IDY2NztcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCJcXFxccmNlaWxcIiB8fCBkZWxpbSA9PT0gXCJcXHUyMzA5XCIpIHtcbiAgICB0b3AgPSBcIlxcdTIzQTRcIjtcbiAgICByZXBlYXQgPSBib3R0b20gPSBcIlxcdTIzQTVcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gICAgc3ZnTGFiZWwgPSBcInJjZWlsXCI7XG4gICAgdmlld0JveFdpZHRoID0gNjY3O1xuICB9IGVsc2UgaWYgKGRlbGltID09PSBcIihcIiB8fCBkZWxpbSA9PT0gXCJcXFxcbHBhcmVuXCIpIHtcbiAgICB0b3AgPSBcIlxcdTIzOUJcIjtcbiAgICByZXBlYXQgPSBcIlxcdTIzOUNcIjtcbiAgICBib3R0b20gPSBcIlxcdTIzOURcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gICAgc3ZnTGFiZWwgPSBcImxwYXJlblwiO1xuICAgIHZpZXdCb3hXaWR0aCA9IDg3NTtcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCIpXCIgfHwgZGVsaW0gPT09IFwiXFxcXHJwYXJlblwiKSB7XG4gICAgdG9wID0gXCJcXHUyMzlFXCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyMzlGXCI7XG4gICAgYm90dG9tID0gXCJcXHUyM0EwXCI7XG4gICAgZm9udCA9IFwiU2l6ZTQtUmVndWxhclwiO1xuICAgIHN2Z0xhYmVsID0gXCJycGFyZW5cIjtcbiAgICB2aWV3Qm94V2lkdGggPSA4NzU7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXHtcIiB8fCBkZWxpbSA9PT0gXCJcXFxcbGJyYWNlXCIpIHtcbiAgICB0b3AgPSBcIlxcdTIzQTdcIjtcbiAgICBtaWRkbGUgPSBcIlxcdTIzQThcIjtcbiAgICBib3R0b20gPSBcIlxcdTIzQTlcIjtcbiAgICByZXBlYXQgPSBcIlxcdTIzQUFcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXH1cIiB8fCBkZWxpbSA9PT0gXCJcXFxccmJyYWNlXCIpIHtcbiAgICB0b3AgPSBcIlxcdTIzQUJcIjtcbiAgICBtaWRkbGUgPSBcIlxcdTIzQUNcIjtcbiAgICBib3R0b20gPSBcIlxcdTIzQURcIjtcbiAgICByZXBlYXQgPSBcIlxcdTIzQUFcIjtcbiAgICBmb250ID0gXCJTaXplNC1SZWd1bGFyXCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiXFxcXGxncm91cFwiIHx8IGRlbGltID09PSBcIlxcdTI3RUVcIikge1xuICAgIHRvcCA9IFwiXFx1MjNBN1wiO1xuICAgIGJvdHRvbSA9IFwiXFx1MjNBOVwiO1xuICAgIHJlcGVhdCA9IFwiXFx1MjNBQVwiO1xuICAgIGZvbnQgPSBcIlNpemU0LVJlZ3VsYXJcIjtcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCJcXFxccmdyb3VwXCIgfHwgZGVsaW0gPT09IFwiXFx1MjdFRlwiKSB7XG4gICAgdG9wID0gXCJcXHUyM0FCXCI7XG4gICAgYm90dG9tID0gXCJcXHUyM0FEXCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyM0FBXCI7XG4gICAgZm9udCA9IFwiU2l6ZTQtUmVndWxhclwiO1xuICB9IGVsc2UgaWYgKGRlbGltID09PSBcIlxcXFxsbW91c3RhY2hlXCIgfHwgZGVsaW0gPT09IFwiXFx1MjNCMFwiKSB7XG4gICAgdG9wID0gXCJcXHUyM0E3XCI7XG4gICAgYm90dG9tID0gXCJcXHUyM0FEXCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyM0FBXCI7XG4gICAgZm9udCA9IFwiU2l6ZTQtUmVndWxhclwiO1xuICB9IGVsc2UgaWYgKGRlbGltID09PSBcIlxcXFxybW91c3RhY2hlXCIgfHwgZGVsaW0gPT09IFwiXFx1MjNCMVwiKSB7XG4gICAgdG9wID0gXCJcXHUyM0FCXCI7XG4gICAgYm90dG9tID0gXCJcXHUyM0E5XCI7XG4gICAgcmVwZWF0ID0gXCJcXHUyM0FBXCI7XG4gICAgZm9udCA9IFwiU2l6ZTQtUmVndWxhclwiO1xuICB9IC8vIEdldCB0aGUgbWV0cmljcyBvZiB0aGUgZm91ciBzZWN0aW9uc1xuXG5cbiAgdmFyIHRvcE1ldHJpY3MgPSBnZXRNZXRyaWNzKHRvcCwgZm9udCwgbW9kZSk7XG4gIHZhciB0b3BIZWlnaHRUb3RhbCA9IHRvcE1ldHJpY3MuaGVpZ2h0ICsgdG9wTWV0cmljcy5kZXB0aDtcbiAgdmFyIHJlcGVhdE1ldHJpY3MgPSBnZXRNZXRyaWNzKHJlcGVhdCwgZm9udCwgbW9kZSk7XG4gIHZhciByZXBlYXRIZWlnaHRUb3RhbCA9IHJlcGVhdE1ldHJpY3MuaGVpZ2h0ICsgcmVwZWF0TWV0cmljcy5kZXB0aDtcbiAgdmFyIGJvdHRvbU1ldHJpY3MgPSBnZXRNZXRyaWNzKGJvdHRvbSwgZm9udCwgbW9kZSk7XG4gIHZhciBib3R0b21IZWlnaHRUb3RhbCA9IGJvdHRvbU1ldHJpY3MuaGVpZ2h0ICsgYm90dG9tTWV0cmljcy5kZXB0aDtcbiAgdmFyIG1pZGRsZUhlaWdodFRvdGFsID0gMDtcbiAgdmFyIG1pZGRsZUZhY3RvciA9IDE7XG5cbiAgaWYgKG1pZGRsZSAhPT0gbnVsbCkge1xuICAgIHZhciBtaWRkbGVNZXRyaWNzID0gZ2V0TWV0cmljcyhtaWRkbGUsIGZvbnQsIG1vZGUpO1xuICAgIG1pZGRsZUhlaWdodFRvdGFsID0gbWlkZGxlTWV0cmljcy5oZWlnaHQgKyBtaWRkbGVNZXRyaWNzLmRlcHRoO1xuICAgIG1pZGRsZUZhY3RvciA9IDI7IC8vIHJlcGVhdCBzeW1tZXRyaWNhbGx5IGFib3ZlIGFuZCBiZWxvdyBtaWRkbGVcbiAgfSAvLyBDYWxjdWF0ZSB0aGUgbWluaW1hbCBoZWlnaHQgdGhhdCB0aGUgZGVsaW1pdGVyIGNhbiBoYXZlLlxuICAvLyBJdCBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgdG9wLCBib3R0b20sIGFuZCBvcHRpb25hbCBtaWRkbGUgY29tYmluZWQuXG5cblxuICB2YXIgbWluSGVpZ2h0ID0gdG9wSGVpZ2h0VG90YWwgKyBib3R0b21IZWlnaHRUb3RhbCArIG1pZGRsZUhlaWdodFRvdGFsOyAvLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSByZXBlYXQgc3ltYm9sIHdlIHdpbGwgbmVlZFxuXG4gIHZhciByZXBlYXRDb3VudCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoaGVpZ2h0VG90YWwgLSBtaW5IZWlnaHQpIC8gKG1pZGRsZUZhY3RvciAqIHJlcGVhdEhlaWdodFRvdGFsKSkpOyAvLyBDb21wdXRlIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIGRlbGltaXRlciBpbmNsdWRpbmcgYWxsIHRoZSBzeW1ib2xzXG5cbiAgdmFyIHJlYWxIZWlnaHRUb3RhbCA9IG1pbkhlaWdodCArIHJlcGVhdENvdW50ICogbWlkZGxlRmFjdG9yICogcmVwZWF0SGVpZ2h0VG90YWw7IC8vIFRoZSBjZW50ZXIgb2YgdGhlIGRlbGltaXRlciBpcyBwbGFjZWQgYXQgdGhlIGNlbnRlciBvZiB0aGUgYXhpcy4gTm90ZVxuICAvLyB0aGF0IGluIHRoaXMgY29udGV4dCwgXCJjZW50ZXJcIiBtZWFucyB0aGF0IHRoZSBkZWxpbWl0ZXIgc2hvdWxkIGJlXG4gIC8vIGNlbnRlcmVkIGFyb3VuZCB0aGUgYXhpcyBpbiB0aGUgY3VycmVudCBzdHlsZSwgd2hpbGUgbm9ybWFsbHkgaXQgaXNcbiAgLy8gY2VudGVyZWQgYXJvdW5kIHRoZSBheGlzIGluIHRleHRzdHlsZS5cblxuICB2YXIgYXhpc0hlaWdodCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5heGlzSGVpZ2h0O1xuXG4gIGlmIChjZW50ZXIpIHtcbiAgICBheGlzSGVpZ2h0ICo9IG9wdGlvbnMuc2l6ZU11bHRpcGxpZXI7XG4gIH0gLy8gQ2FsY3VsYXRlIHRoZSBkZXB0aFxuXG5cbiAgdmFyIGRlcHRoID0gcmVhbEhlaWdodFRvdGFsIC8gMiAtIGF4aXNIZWlnaHQ7IC8vIE5vdywgd2Ugc3RhcnQgYnVpbGRpbmcgdGhlIHBpZWNlcyB0aGF0IHdpbGwgZ28gaW50byB0aGUgdmxpc3RcbiAgLy8gS2VlcCBhIGxpc3Qgb2YgdGhlIHBpZWNlcyBvZiB0aGUgc3RhY2tlZCBkZWxpbWl0ZXJcblxuICB2YXIgc3RhY2sgPSBbXTtcblxuICBpZiAoc3ZnTGFiZWwubGVuZ3RoID4gMCkge1xuICAgIC8vIEluc3RlYWQgb2Ygc3RhY2tpbmcgZ2x5cGhzLCBjcmVhdGUgYSBzaW5nbGUgU1ZHLlxuICAgIC8vIFRoaXMgZXZhZGVzIGJyb3dzZXIgcHJvYmxlbXMgd2l0aCBpbXByZWNpc2UgcG9zaXRpb25pbmcgb2Ygc3BhbnMuXG4gICAgdmFyIG1pZEhlaWdodCA9IHJlYWxIZWlnaHRUb3RhbCAtIHRvcEhlaWdodFRvdGFsIC0gYm90dG9tSGVpZ2h0VG90YWw7XG4gICAgdmFyIHZpZXdCb3hIZWlnaHQgPSBNYXRoLnJvdW5kKHJlYWxIZWlnaHRUb3RhbCAqIDEwMDApO1xuICAgIHZhciBwYXRoU3RyID0gdGFsbERlbGltKHN2Z0xhYmVsLCBNYXRoLnJvdW5kKG1pZEhlaWdodCAqIDEwMDApKTtcbiAgICB2YXIgcGF0aCA9IG5ldyBQYXRoTm9kZShzdmdMYWJlbCwgcGF0aFN0cik7XG4gICAgdmFyIHdpZHRoID0gKHZpZXdCb3hXaWR0aCAvIDEwMDApLnRvRml4ZWQoMykgKyBcImVtXCI7XG4gICAgdmFyIGhlaWdodCA9ICh2aWV3Qm94SGVpZ2h0IC8gMTAwMCkudG9GaXhlZCgzKSArIFwiZW1cIjtcbiAgICB2YXIgc3ZnID0gbmV3IFN2Z05vZGUoW3BhdGhdLCB7XG4gICAgICBcIndpZHRoXCI6IHdpZHRoLFxuICAgICAgXCJoZWlnaHRcIjogaGVpZ2h0LFxuICAgICAgXCJ2aWV3Qm94XCI6IFwiMCAwIFwiICsgdmlld0JveFdpZHRoICsgXCIgXCIgKyB2aWV3Qm94SGVpZ2h0XG4gICAgfSk7XG4gICAgdmFyIHdyYXBwZXIgPSBidWlsZENvbW1vbi5tYWtlU3ZnU3BhbihbXSwgW3N2Z10sIG9wdGlvbnMpO1xuICAgIHdyYXBwZXIuaGVpZ2h0ID0gdmlld0JveEhlaWdodCAvIDEwMDA7XG4gICAgd3JhcHBlci5zdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHN0YWNrLnB1c2goe1xuICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICBlbGVtOiB3cmFwcGVyXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3RhY2sgZ2x5cGhzXG4gICAgLy8gU3RhcnQgYnkgYWRkaW5nIHRoZSBib3R0b20gc3ltYm9sXG4gICAgc3RhY2sucHVzaChtYWtlR2x5cGhTcGFuKGJvdHRvbSwgZm9udCwgbW9kZSkpO1xuICAgIHN0YWNrLnB1c2gobGFwKTsgLy8gb3ZlcmxhcFxuXG4gICAgaWYgKG1pZGRsZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlIG1pZGRsZSBzZWN0aW9uIHdpbGwgYmUgYW4gU1ZHLiBNYWtlIGl0IGFuIGV4dHJhIDAuMDE2ZW0gdGFsbC5cbiAgICAgIC8vIFdlJ2xsIG92ZXJsYXAgYnkgMC4wMDhlbSBhdCB0b3AgYW5kIGJvdHRvbS5cbiAgICAgIHZhciBpbm5lckhlaWdodCA9IHJlYWxIZWlnaHRUb3RhbCAtIHRvcEhlaWdodFRvdGFsIC0gYm90dG9tSGVpZ2h0VG90YWwgKyAyICogbGFwSW5FbXM7XG4gICAgICBzdGFjay5wdXNoKG1ha2VJbm5lcihyZXBlYXQsIGlubmVySGVpZ2h0LCBvcHRpb25zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdoZW4gdGhlcmUgaXMgYSBtaWRkbGUgYml0LCB3ZSBuZWVkIHRoZSBtaWRkbGUgcGFydCBhbmQgdHdvIHJlcGVhdGVkXG4gICAgICAvLyBzZWN0aW9uc1xuICAgICAgdmFyIF9pbm5lckhlaWdodCA9IChyZWFsSGVpZ2h0VG90YWwgLSB0b3BIZWlnaHRUb3RhbCAtIGJvdHRvbUhlaWdodFRvdGFsIC0gbWlkZGxlSGVpZ2h0VG90YWwpIC8gMiArIDIgKiBsYXBJbkVtcztcblxuICAgICAgc3RhY2sucHVzaChtYWtlSW5uZXIocmVwZWF0LCBfaW5uZXJIZWlnaHQsIG9wdGlvbnMpKTsgLy8gTm93IGluc2VydCB0aGUgbWlkZGxlIG9mIHRoZSBicmFjZS5cblxuICAgICAgc3RhY2sucHVzaChsYXApO1xuICAgICAgc3RhY2sucHVzaChtYWtlR2x5cGhTcGFuKG1pZGRsZSwgZm9udCwgbW9kZSkpO1xuICAgICAgc3RhY2sucHVzaChsYXApO1xuICAgICAgc3RhY2sucHVzaChtYWtlSW5uZXIocmVwZWF0LCBfaW5uZXJIZWlnaHQsIG9wdGlvbnMpKTtcbiAgICB9IC8vIEFkZCB0aGUgdG9wIHN5bWJvbFxuXG5cbiAgICBzdGFjay5wdXNoKGxhcCk7XG4gICAgc3RhY2sucHVzaChtYWtlR2x5cGhTcGFuKHRvcCwgZm9udCwgbW9kZSkpO1xuICB9IC8vIEZpbmFsbHksIGJ1aWxkIHRoZSB2bGlzdFxuXG5cbiAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ0Jhc2VTdHlsZShzcmNfU3R5bGUuVEVYVCk7XG4gIHZhciBpbm5lciA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgcG9zaXRpb25UeXBlOiBcImJvdHRvbVwiLFxuICAgIHBvc2l0aW9uRGF0YTogZGVwdGgsXG4gICAgY2hpbGRyZW46IHN0YWNrXG4gIH0sIG5ld09wdGlvbnMpO1xuICByZXR1cm4gc3R5bGVXcmFwKGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImRlbGltc2l6aW5nXCIsIFwibXVsdFwiXSwgW2lubmVyXSwgbmV3T3B0aW9ucyksIHNyY19TdHlsZS5URVhULCBvcHRpb25zLCBjbGFzc2VzKTtcbn07IC8vIEFsbCBzdXJkcyBoYXZlIDAuMDhlbSBwYWRkaW5nIGFib3ZlIHRoZSB2aW5pY3VsdW0gaW5zaWRlIHRoZSBTVkcuXG4vLyBUaGF0IGtlZXBzIGJyb3dzZXIgc3BhbiBoZWlnaHQgcm91bmRpbmcgZXJyb3IgZnJvbSBwaW5jaGluZyB0aGUgbGluZS5cblxuXG52YXIgdmJQYWQgPSA4MDsgLy8gcGFkZGluZyBhYm92ZSB0aGUgc3VyZCwgbWVhc3VyZWQgaW5zaWRlIHRoZSB2aWV3Qm94LlxuXG52YXIgZW1QYWQgPSAwLjA4OyAvLyBwYWRkaW5nLCBpbiBlbXMsIG1lYXN1cmVkIGluIHRoZSBkb2N1bWVudC5cblxudmFyIHNxcnRTdmcgPSBmdW5jdGlvbiBzcXJ0U3ZnKHNxcnROYW1lLCBoZWlnaHQsIHZpZXdCb3hIZWlnaHQsIGV4dHJhVmluaWN1bHVtLCBvcHRpb25zKSB7XG4gIHZhciBwYXRoID0gc3FydFBhdGgoc3FydE5hbWUsIGV4dHJhVmluaWN1bHVtLCB2aWV3Qm94SGVpZ2h0KTtcbiAgdmFyIHBhdGhOb2RlID0gbmV3IFBhdGhOb2RlKHNxcnROYW1lLCBwYXRoKTtcbiAgdmFyIHN2ZyA9IG5ldyBTdmdOb2RlKFtwYXRoTm9kZV0sIHtcbiAgICAvLyBOb3RlOiAxMDAwOjEgcmF0aW8gb2Ygdmlld0JveCB0byBkb2N1bWVudCBlbSB3aWR0aC5cbiAgICBcIndpZHRoXCI6IFwiNDAwZW1cIixcbiAgICBcImhlaWdodFwiOiBtYWtlRW0oaGVpZ2h0KSxcbiAgICBcInZpZXdCb3hcIjogXCIwIDAgNDAwMDAwIFwiICsgdmlld0JveEhlaWdodCxcbiAgICBcInByZXNlcnZlQXNwZWN0UmF0aW9cIjogXCJ4TWluWU1pbiBzbGljZVwiXG4gIH0pO1xuICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVN2Z1NwYW4oW1wiaGlkZS10YWlsXCJdLCBbc3ZnXSwgb3B0aW9ucyk7XG59O1xuLyoqXG4gKiBNYWtlIGEgc3FydCBpbWFnZSBvZiB0aGUgZ2l2ZW4gaGVpZ2h0LFxuICovXG5cblxudmFyIG1ha2VTcXJ0SW1hZ2UgPSBmdW5jdGlvbiBtYWtlU3FydEltYWdlKGhlaWdodCwgb3B0aW9ucykge1xuICAvLyBEZWZpbmUgYSBuZXdPcHRpb25zIHRoYXQgcmVtb3ZlcyB0aGUgZWZmZWN0IG9mIHNpemUgY2hhbmdlcyBzdWNoIGFzIFxcSHVnZS5cbiAgLy8gV2UgZG9uJ3QgcGljayBkaWZmZXJlbnQgYSBoZWlnaHQgc3VyZCBmb3IgXFxIdWdlLiBGb3IgaXQsIHdlIHNjYWxlIHVwLlxuICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nQmFzZVNpemluZygpOyAvLyBQaWNrIHRoZSBkZXNpcmVkIHN1cmQgZ2x5cGggZnJvbSBhIHNlcXVlbmNlIG9mIHN1cmRzLlxuXG4gIHZhciBkZWxpbSA9IHRyYXZlcnNlU2VxdWVuY2UoXCJcXFxcc3VyZFwiLCBoZWlnaHQgKiBuZXdPcHRpb25zLnNpemVNdWx0aXBsaWVyLCBzdGFja0xhcmdlRGVsaW1pdGVyU2VxdWVuY2UsIG5ld09wdGlvbnMpO1xuICB2YXIgc2l6ZU11bHRpcGxpZXIgPSBuZXdPcHRpb25zLnNpemVNdWx0aXBsaWVyOyAvLyBkZWZhdWx0XG4gIC8vIFRoZSBzdGFuZGFyZCBzcXJ0IFNWR3MgZWFjaCBoYXZlIGEgMC4wNGVtIHRoaWNrIHZpbmljdWx1bS5cbiAgLy8gSWYgU2V0dGluZ3MubWluUnVsZVRoaWNrbmVzcyBpcyBsYXJnZXIgdGhhbiB0aGF0LCB3ZSBhZGQgZXh0cmFWaW5pY3VsdW0uXG5cbiAgdmFyIGV4dHJhVmluaWN1bHVtID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5taW5SdWxlVGhpY2tuZXNzIC0gb3B0aW9ucy5mb250TWV0cmljcygpLnNxcnRSdWxlVGhpY2tuZXNzKTsgLy8gQ3JlYXRlIGEgc3BhbiBjb250YWluaW5nIGFuIFNWRyBpbWFnZSBvZiBhIHNxcnQgc3ltYm9sLlxuXG4gIHZhciBzcGFuO1xuICB2YXIgc3BhbkhlaWdodCA9IDA7XG4gIHZhciB0ZXhIZWlnaHQgPSAwO1xuICB2YXIgdmlld0JveEhlaWdodCA9IDA7XG4gIHZhciBhZHZhbmNlV2lkdGg7IC8vIFdlIGNyZWF0ZSB2aWV3Qm94ZXMgd2l0aCA4MCB1bml0cyBvZiBcInBhZGRpbmdcIiBhYm92ZSBlYWNoIHN1cmQuXG4gIC8vIFRoZW4gYnJvd3NlciByb3VuZGluZyBlcnJvciBvbiB0aGUgcGFyZW50IHNwYW4gaGVpZ2h0IHdpbGwgbm90XG4gIC8vIGVuY3JvYWNoIG9uIHRoZSBpbmsgb2YgdGhlIHZpbmljdWx1bS4gQnV0IHRoYXQgcGFkZGluZyBpcyBub3RcbiAgLy8gaW5jbHVkZWQgaW4gdGhlIFRlWC1saWtlIGBoZWlnaHRgIHVzZWQgZm9yIGNhbGN1bGF0aW9uIG9mXG4gIC8vIHZlcnRpY2FsIGFsaWdubWVudC4gU28gdGV4SGVpZ2h0ID0gc3Bhbi5oZWlnaHQgPCBzcGFuLnN0eWxlLmhlaWdodC5cblxuICBpZiAoZGVsaW0udHlwZSA9PT0gXCJzbWFsbFwiKSB7XG4gICAgLy8gR2V0IGFuIFNWRyB0aGF0IGlzIGRlcml2ZWQgZnJvbSBnbHlwaCBVKzIyMUEgaW4gZm9udCBLYVRlWC1NYWluLlxuICAgIC8vIDEwMDAgdW5pdCBub3JtYWwgZ2x5cGggaGVpZ2h0LlxuICAgIHZpZXdCb3hIZWlnaHQgPSAxMDAwICsgMTAwMCAqIGV4dHJhVmluaWN1bHVtICsgdmJQYWQ7XG5cbiAgICBpZiAoaGVpZ2h0IDwgMS4wKSB7XG4gICAgICBzaXplTXVsdGlwbGllciA9IDEuMDsgLy8gbWltaWMgYSBcXHRleHRmb250IHJhZGljYWxcbiAgICB9IGVsc2UgaWYgKGhlaWdodCA8IDEuNCkge1xuICAgICAgc2l6ZU11bHRpcGxpZXIgPSAwLjc7IC8vIG1pbWljIGEgXFxzY3JpcHRmb250IHJhZGljYWxcbiAgICB9XG5cbiAgICBzcGFuSGVpZ2h0ID0gKDEuMCArIGV4dHJhVmluaWN1bHVtICsgZW1QYWQpIC8gc2l6ZU11bHRpcGxpZXI7XG4gICAgdGV4SGVpZ2h0ID0gKDEuMDAgKyBleHRyYVZpbmljdWx1bSkgLyBzaXplTXVsdGlwbGllcjtcbiAgICBzcGFuID0gc3FydFN2ZyhcInNxcnRNYWluXCIsIHNwYW5IZWlnaHQsIHZpZXdCb3hIZWlnaHQsIGV4dHJhVmluaWN1bHVtLCBvcHRpb25zKTtcbiAgICBzcGFuLnN0eWxlLm1pbldpZHRoID0gXCIwLjg1M2VtXCI7XG4gICAgYWR2YW5jZVdpZHRoID0gMC44MzMgLyBzaXplTXVsdGlwbGllcjsgLy8gZnJvbSB0aGUgZm9udC5cbiAgfSBlbHNlIGlmIChkZWxpbS50eXBlID09PSBcImxhcmdlXCIpIHtcbiAgICAvLyBUaGVzZSBTVkdzIGNvbWUgZnJvbSBmb250czogS2FUZVhfU2l6ZTEsIF9TaXplMiwgZXRjLlxuICAgIHZpZXdCb3hIZWlnaHQgPSAoMTAwMCArIHZiUGFkKSAqIHNpemVUb01heEhlaWdodFtkZWxpbS5zaXplXTtcbiAgICB0ZXhIZWlnaHQgPSAoc2l6ZVRvTWF4SGVpZ2h0W2RlbGltLnNpemVdICsgZXh0cmFWaW5pY3VsdW0pIC8gc2l6ZU11bHRpcGxpZXI7XG4gICAgc3BhbkhlaWdodCA9IChzaXplVG9NYXhIZWlnaHRbZGVsaW0uc2l6ZV0gKyBleHRyYVZpbmljdWx1bSArIGVtUGFkKSAvIHNpemVNdWx0aXBsaWVyO1xuICAgIHNwYW4gPSBzcXJ0U3ZnKFwic3FydFNpemVcIiArIGRlbGltLnNpemUsIHNwYW5IZWlnaHQsIHZpZXdCb3hIZWlnaHQsIGV4dHJhVmluaWN1bHVtLCBvcHRpb25zKTtcbiAgICBzcGFuLnN0eWxlLm1pbldpZHRoID0gXCIxLjAyZW1cIjtcbiAgICBhZHZhbmNlV2lkdGggPSAxLjAgLyBzaXplTXVsdGlwbGllcjsgLy8gMS4wIGZyb20gdGhlIGZvbnQuXG4gIH0gZWxzZSB7XG4gICAgLy8gVGFsbCBzcXJ0LiBJbiBUZVgsIHRoaXMgd291bGQgYmUgc3RhY2tlZCB1c2luZyBtdWx0aXBsZSBnbHlwaHMuXG4gICAgLy8gV2UnbGwgdXNlIGEgc2luZ2xlIFNWRyB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLlxuICAgIHNwYW5IZWlnaHQgPSBoZWlnaHQgKyBleHRyYVZpbmljdWx1bSArIGVtUGFkO1xuICAgIHRleEhlaWdodCA9IGhlaWdodCArIGV4dHJhVmluaWN1bHVtO1xuICAgIHZpZXdCb3hIZWlnaHQgPSBNYXRoLmZsb29yKDEwMDAgKiBoZWlnaHQgKyBleHRyYVZpbmljdWx1bSkgKyB2YlBhZDtcbiAgICBzcGFuID0gc3FydFN2ZyhcInNxcnRUYWxsXCIsIHNwYW5IZWlnaHQsIHZpZXdCb3hIZWlnaHQsIGV4dHJhVmluaWN1bHVtLCBvcHRpb25zKTtcbiAgICBzcGFuLnN0eWxlLm1pbldpZHRoID0gXCIwLjc0MmVtXCI7XG4gICAgYWR2YW5jZVdpZHRoID0gMS4wNTY7XG4gIH1cblxuICBzcGFuLmhlaWdodCA9IHRleEhlaWdodDtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBtYWtlRW0oc3BhbkhlaWdodCk7XG4gIHJldHVybiB7XG4gICAgc3Bhbjogc3BhbixcbiAgICBhZHZhbmNlV2lkdGg6IGFkdmFuY2VXaWR0aCxcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFjdHVhbCBsaW5lIHdpZHRoLlxuICAgIC8vIFRoaXMgYWN0dWFsbHkgc2hvdWxkIGRlcGVuZCBvbiB0aGUgY2hvc2VuIGZvbnQgLS0gZS5nLiBcXGJvbGRtYXRoXG4gICAgLy8gc2hvdWxkIHVzZSB0aGUgdGhpY2tlciBzdXJkIHN5bWJvbHMgZnJvbSBlLmcuIEthVGVYX01haW4tQm9sZCwgYW5kXG4gICAgLy8gaGF2ZSB0aGlja2VyIHJ1bGVzLlxuICAgIHJ1bGVXaWR0aDogKG9wdGlvbnMuZm9udE1ldHJpY3MoKS5zcXJ0UnVsZVRoaWNrbmVzcyArIGV4dHJhVmluaWN1bHVtKSAqIHNpemVNdWx0aXBsaWVyXG4gIH07XG59OyAvLyBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZGVsaW1pdGVycywgZGVsaW1pdGVycyB0aGF0IHN0YWNrIHdoZW4gdGhleSBiZWNvbWVcbi8vIHRvbyBsYXJnZVxuXG5cbnZhciBzdGFja0xhcmdlRGVsaW1pdGVycyA9IFtcIihcIiwgXCJcXFxcbHBhcmVuXCIsIFwiKVwiLCBcIlxcXFxycGFyZW5cIiwgXCJbXCIsIFwiXFxcXGxicmFja1wiLCBcIl1cIiwgXCJcXFxccmJyYWNrXCIsIFwiXFxcXHtcIiwgXCJcXFxcbGJyYWNlXCIsIFwiXFxcXH1cIiwgXCJcXFxccmJyYWNlXCIsIFwiXFxcXGxmbG9vclwiLCBcIlxcXFxyZmxvb3JcIiwgXCJcXHUyMzBBXCIsIFwiXFx1MjMwQlwiLCBcIlxcXFxsY2VpbFwiLCBcIlxcXFxyY2VpbFwiLCBcIlxcdTIzMDhcIiwgXCJcXHUyMzA5XCIsIFwiXFxcXHN1cmRcIl07IC8vIGRlbGltaXRlcnMgdGhhdCBhbHdheXMgc3RhY2tcblxudmFyIHN0YWNrQWx3YXlzRGVsaW1pdGVycyA9IFtcIlxcXFx1cGFycm93XCIsIFwiXFxcXGRvd25hcnJvd1wiLCBcIlxcXFx1cGRvd25hcnJvd1wiLCBcIlxcXFxVcGFycm93XCIsIFwiXFxcXERvd25hcnJvd1wiLCBcIlxcXFxVcGRvd25hcnJvd1wiLCBcInxcIiwgXCJcXFxcfFwiLCBcIlxcXFx2ZXJ0XCIsIFwiXFxcXFZlcnRcIiwgXCJcXFxcbHZlcnRcIiwgXCJcXFxccnZlcnRcIiwgXCJcXFxcbFZlcnRcIiwgXCJcXFxcclZlcnRcIiwgXCJcXFxcbGdyb3VwXCIsIFwiXFxcXHJncm91cFwiLCBcIlxcdTI3RUVcIiwgXCJcXHUyN0VGXCIsIFwiXFxcXGxtb3VzdGFjaGVcIiwgXCJcXFxccm1vdXN0YWNoZVwiLCBcIlxcdTIzQjBcIiwgXCJcXHUyM0IxXCJdOyAvLyBhbmQgZGVsaW1pdGVycyB0aGF0IG5ldmVyIHN0YWNrXG5cbnZhciBzdGFja05ldmVyRGVsaW1pdGVycyA9IFtcIjxcIiwgXCI+XCIsIFwiXFxcXGxhbmdsZVwiLCBcIlxcXFxyYW5nbGVcIiwgXCIvXCIsIFwiXFxcXGJhY2tzbGFzaFwiLCBcIlxcXFxsdFwiLCBcIlxcXFxndFwiXTsgLy8gTWV0cmljcyBvZiB0aGUgZGlmZmVyZW50IHNpemVzLiBGb3VuZCBieSBsb29raW5nIGF0IFRlWCdzIG91dHB1dCBvZlxuLy8gJFxcYmlnbHwgLy8gXFxCaWdsfCBcXGJpZ2dsfCBcXEJpZ2dsfCBcXHNob3dsaXN0cyRcbi8vIFVzZWQgdG8gY3JlYXRlIHN0YWNrZWQgZGVsaW1pdGVycyBvZiBhcHByb3ByaWF0ZSBzaXplcyBpbiBtYWtlU2l6ZWREZWxpbS5cblxudmFyIHNpemVUb01heEhlaWdodCA9IFswLCAxLjIsIDEuOCwgMi40LCAzLjBdO1xuLyoqXG4gKiBVc2VkIHRvIGNyZWF0ZSBhIGRlbGltaXRlciBvZiBhIHNwZWNpZmljIHNpemUsIHdoZXJlIGBzaXplYCBpcyAxLCAyLCAzLCBvciA0LlxuICovXG5cbnZhciBtYWtlU2l6ZWREZWxpbSA9IGZ1bmN0aW9uIG1ha2VTaXplZERlbGltKGRlbGltLCBzaXplLCBvcHRpb25zLCBtb2RlLCBjbGFzc2VzKSB7XG4gIC8vIDwgYW5kID4gdHVybiBpbnRvIFxcbGFuZ2xlIGFuZCBcXHJhbmdsZSBpbiBkZWxpbWl0ZXJzXG4gIGlmIChkZWxpbSA9PT0gXCI8XCIgfHwgZGVsaW0gPT09IFwiXFxcXGx0XCIgfHwgZGVsaW0gPT09IFwiXFx1MjdFOFwiKSB7XG4gICAgZGVsaW0gPSBcIlxcXFxsYW5nbGVcIjtcbiAgfSBlbHNlIGlmIChkZWxpbSA9PT0gXCI+XCIgfHwgZGVsaW0gPT09IFwiXFxcXGd0XCIgfHwgZGVsaW0gPT09IFwiXFx1MjdFOVwiKSB7XG4gICAgZGVsaW0gPSBcIlxcXFxyYW5nbGVcIjtcbiAgfSAvLyBTaXplZCBkZWxpbWl0ZXJzIGFyZSBuZXZlciBjZW50ZXJlZC5cblxuXG4gIGlmICh1dGlscy5jb250YWlucyhzdGFja0xhcmdlRGVsaW1pdGVycywgZGVsaW0pIHx8IHV0aWxzLmNvbnRhaW5zKHN0YWNrTmV2ZXJEZWxpbWl0ZXJzLCBkZWxpbSkpIHtcbiAgICByZXR1cm4gbWFrZUxhcmdlRGVsaW0oZGVsaW0sIHNpemUsIGZhbHNlLCBvcHRpb25zLCBtb2RlLCBjbGFzc2VzKTtcbiAgfSBlbHNlIGlmICh1dGlscy5jb250YWlucyhzdGFja0Fsd2F5c0RlbGltaXRlcnMsIGRlbGltKSkge1xuICAgIHJldHVybiBtYWtlU3RhY2tlZERlbGltKGRlbGltLCBzaXplVG9NYXhIZWlnaHRbc2l6ZV0sIGZhbHNlLCBvcHRpb25zLCBtb2RlLCBjbGFzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJJbGxlZ2FsIGRlbGltaXRlcjogJ1wiICsgZGVsaW0gKyBcIidcIik7XG4gIH1cbn07XG4vKipcbiAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgc2VxdWVuY2VzIG9mIGRlbGltaXRlciBzaXplcyB0aGF0IHRoZSBkZWxpbWl0ZXJzXG4gKiBmb2xsb3cgZGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIGRlbGltaXRlci4gVGhpcyBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgY3VzdG9tXG4gKiBzaXplZCBkZWxpbWl0ZXJzIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGNyZWF0ZSBhIHNtYWxsLCBsYXJnZSwgb3Igc3RhY2tlZFxuICogZGVsaW1pdGVyLlxuICpcbiAqIEluIHJlYWwgVGVYLCB0aGVzZSBzZXF1ZW5jZXMgYXJlbid0IGV4cGxpY2l0bHkgZGVmaW5lZCwgYnV0IGFyZSBpbnN0ZWFkXG4gKiBkZWZpbmVkIGluc2lkZSB0aGUgZm9udCBtZXRyaWNzLiBTaW5jZSB0aGVyZSBhcmUgb25seSB0aHJlZSBzZXF1ZW5jZXMgdGhhdFxuICogYXJlIHBvc3NpYmxlIGZvciB0aGUgZGVsaW1pdGVycyB0aGF0IFRlWCBkZWZpbmVzLCBpdCBpcyBlYXNpZXIgdG8ganVzdCBlbmNvZGVcbiAqIHRoZW0gZXhwbGljaXRseSBoZXJlLlxuICovXG5cblxuLy8gRGVsaW1pdGVycyB0aGF0IG5ldmVyIHN0YWNrIHRyeSBzbWFsbCBkZWxpbWl0ZXJzIGFuZCBsYXJnZSBkZWxpbWl0ZXJzIG9ubHlcbnZhciBzdGFja05ldmVyRGVsaW1pdGVyU2VxdWVuY2UgPSBbe1xuICB0eXBlOiBcInNtYWxsXCIsXG4gIHN0eWxlOiBzcmNfU3R5bGUuU0NSSVBUU0NSSVBUXG59LCB7XG4gIHR5cGU6IFwic21hbGxcIixcbiAgc3R5bGU6IHNyY19TdHlsZS5TQ1JJUFRcbn0sIHtcbiAgdHlwZTogXCJzbWFsbFwiLFxuICBzdHlsZTogc3JjX1N0eWxlLlRFWFRcbn0sIHtcbiAgdHlwZTogXCJsYXJnZVwiLFxuICBzaXplOiAxXG59LCB7XG4gIHR5cGU6IFwibGFyZ2VcIixcbiAgc2l6ZTogMlxufSwge1xuICB0eXBlOiBcImxhcmdlXCIsXG4gIHNpemU6IDNcbn0sIHtcbiAgdHlwZTogXCJsYXJnZVwiLFxuICBzaXplOiA0XG59XTsgLy8gRGVsaW1pdGVycyB0aGF0IGFsd2F5cyBzdGFjayB0cnkgdGhlIHNtYWxsIGRlbGltaXRlcnMgZmlyc3QsIHRoZW4gc3RhY2tcblxudmFyIHN0YWNrQWx3YXlzRGVsaW1pdGVyU2VxdWVuY2UgPSBbe1xuICB0eXBlOiBcInNtYWxsXCIsXG4gIHN0eWxlOiBzcmNfU3R5bGUuU0NSSVBUU0NSSVBUXG59LCB7XG4gIHR5cGU6IFwic21hbGxcIixcbiAgc3R5bGU6IHNyY19TdHlsZS5TQ1JJUFRcbn0sIHtcbiAgdHlwZTogXCJzbWFsbFwiLFxuICBzdHlsZTogc3JjX1N0eWxlLlRFWFRcbn0sIHtcbiAgdHlwZTogXCJzdGFja1wiXG59XTsgLy8gRGVsaW1pdGVycyB0aGF0IHN0YWNrIHdoZW4gbGFyZ2UgdHJ5IHRoZSBzbWFsbCBhbmQgdGhlbiBsYXJnZSBkZWxpbWl0ZXJzLCBhbmRcbi8vIHN0YWNrIGFmdGVyd2FyZHNcblxudmFyIHN0YWNrTGFyZ2VEZWxpbWl0ZXJTZXF1ZW5jZSA9IFt7XG4gIHR5cGU6IFwic21hbGxcIixcbiAgc3R5bGU6IHNyY19TdHlsZS5TQ1JJUFRTQ1JJUFRcbn0sIHtcbiAgdHlwZTogXCJzbWFsbFwiLFxuICBzdHlsZTogc3JjX1N0eWxlLlNDUklQVFxufSwge1xuICB0eXBlOiBcInNtYWxsXCIsXG4gIHN0eWxlOiBzcmNfU3R5bGUuVEVYVFxufSwge1xuICB0eXBlOiBcImxhcmdlXCIsXG4gIHNpemU6IDFcbn0sIHtcbiAgdHlwZTogXCJsYXJnZVwiLFxuICBzaXplOiAyXG59LCB7XG4gIHR5cGU6IFwibGFyZ2VcIixcbiAgc2l6ZTogM1xufSwge1xuICB0eXBlOiBcImxhcmdlXCIsXG4gIHNpemU6IDRcbn0sIHtcbiAgdHlwZTogXCJzdGFja1wiXG59XTtcbi8qKlxuICogR2V0IHRoZSBmb250IHVzZWQgaW4gYSBkZWxpbWl0ZXIgYmFzZWQgb24gd2hhdCBraW5kIG9mIGRlbGltaXRlciBpdCBpcy5cbiAqIFRPRE8oIzk2MykgVXNlIG1vcmUgc3BlY2lmaWMgZm9udCBmYW1pbHkgcmV0dXJuIHR5cGUgb25jZSB0aGF0IGlzIGludHJvZHVjZWQuXG4gKi9cblxudmFyIGRlbGltVHlwZVRvRm9udCA9IGZ1bmN0aW9uIGRlbGltVHlwZVRvRm9udCh0eXBlKSB7XG4gIGlmICh0eXBlLnR5cGUgPT09IFwic21hbGxcIikge1xuICAgIHJldHVybiBcIk1haW4tUmVndWxhclwiO1xuICB9IGVsc2UgaWYgKHR5cGUudHlwZSA9PT0gXCJsYXJnZVwiKSB7XG4gICAgcmV0dXJuIFwiU2l6ZVwiICsgdHlwZS5zaXplICsgXCItUmVndWxhclwiO1xuICB9IGVsc2UgaWYgKHR5cGUudHlwZSA9PT0gXCJzdGFja1wiKSB7XG4gICAgcmV0dXJuIFwiU2l6ZTQtUmVndWxhclwiO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBzdXBwb3J0IGZvciBkZWxpbSB0eXBlICdcIiArIHR5cGUudHlwZSArIFwiJyBoZXJlLlwiKTtcbiAgfVxufTtcbi8qKlxuICogVHJhdmVyc2UgYSBzZXF1ZW5jZSBvZiB0eXBlcyBvZiBkZWxpbWl0ZXJzIHRvIGRlY2lkZSB3aGF0IGtpbmQgb2YgZGVsaW1pdGVyXG4gKiBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBkZWxpbWl0ZXIgb2YgdGhlIGdpdmVuIGhlaWdodCtkZXB0aC5cbiAqL1xuXG5cbnZhciB0cmF2ZXJzZVNlcXVlbmNlID0gZnVuY3Rpb24gdHJhdmVyc2VTZXF1ZW5jZShkZWxpbSwgaGVpZ2h0LCBzZXF1ZW5jZSwgb3B0aW9ucykge1xuICAvLyBIZXJlLCB3ZSBjaG9vc2UgdGhlIGluZGV4IHdlIHNob3VsZCBzdGFydCBhdCBpbiB0aGUgc2VxdWVuY2VzLiBJbiBzbWFsbGVyXG4gIC8vIHNpemVzICh3aGljaCBjb3JyZXNwb25kIHRvIGxhcmdlciBudW1iZXJzIGluIHN0eWxlLnNpemUpIHdlIHN0YXJ0IGVhcmxpZXJcbiAgLy8gaW4gdGhlIHNlcXVlbmNlLiBUaHVzLCBzY3JpcHRzY3JpcHQgc3RhcnRzIGF0IGluZGV4IDMtMz0wLCBzY3JpcHQgc3RhcnRzXG4gIC8vIGF0IGluZGV4IDMtMj0xLCB0ZXh0IHN0YXJ0cyBhdCAzLTE9MiwgYW5kIGRpc3BsYXkgc3RhcnRzIGF0IG1pbigyLDMtMCk9MlxuICB2YXIgc3RhcnQgPSBNYXRoLm1pbigyLCAzIC0gb3B0aW9ucy5zdHlsZS5zaXplKTtcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzZXF1ZW5jZVtpXS50eXBlID09PSBcInN0YWNrXCIpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIHRoZSBsYXN0IGRlbGltaXRlciwgc28gd2UganVzdCBicmVhayB0aGUgbG9vcCBub3cuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgbWV0cmljcyA9IGdldE1ldHJpY3MoZGVsaW0sIGRlbGltVHlwZVRvRm9udChzZXF1ZW5jZVtpXSksIFwibWF0aFwiKTtcbiAgICB2YXIgaGVpZ2h0RGVwdGggPSBtZXRyaWNzLmhlaWdodCArIG1ldHJpY3MuZGVwdGg7IC8vIFNtYWxsIGRlbGltaXRlcnMgYXJlIHNjYWxlZCBkb3duIHZlcnNpb25zIG9mIHRoZSBzYW1lIGZvbnQsIHNvIHdlXG4gICAgLy8gYWNjb3VudCBmb3IgdGhlIHN0eWxlIGNoYW5nZSBzaXplLlxuXG4gICAgaWYgKHNlcXVlbmNlW2ldLnR5cGUgPT09IFwic21hbGxcIikge1xuICAgICAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ0Jhc2VTdHlsZShzZXF1ZW5jZVtpXS5zdHlsZSk7XG4gICAgICBoZWlnaHREZXB0aCAqPSBuZXdPcHRpb25zLnNpemVNdWx0aXBsaWVyO1xuICAgIH0gLy8gQ2hlY2sgaWYgdGhlIGRlbGltaXRlciBhdCB0aGlzIHNpemUgd29ya3MgZm9yIHRoZSBnaXZlbiBoZWlnaHQuXG5cblxuICAgIGlmIChoZWlnaHREZXB0aCA+IGhlaWdodCkge1xuICAgICAgcmV0dXJuIHNlcXVlbmNlW2ldO1xuICAgIH1cbiAgfSAvLyBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCByZXR1cm4gdGhlIGxhc3Qgc2VxdWVuY2UgZWxlbWVudC5cblxuXG4gIHJldHVybiBzZXF1ZW5jZVtzZXF1ZW5jZS5sZW5ndGggLSAxXTtcbn07XG4vKipcbiAqIE1ha2UgYSBkZWxpbWl0ZXIgb2YgYSBnaXZlbiBoZWlnaHQrZGVwdGgsIHdpdGggb3B0aW9uYWwgY2VudGVyaW5nLiBIZXJlLCB3ZVxuICogdHJhdmVyc2UgdGhlIHNlcXVlbmNlcywgYW5kIGNyZWF0ZSBhIGRlbGltaXRlciB0aGF0IHRoZSBzZXF1ZW5jZSB0ZWxscyB1cyB0by5cbiAqL1xuXG5cbnZhciBtYWtlQ3VzdG9tU2l6ZWREZWxpbSA9IGZ1bmN0aW9uIG1ha2VDdXN0b21TaXplZERlbGltKGRlbGltLCBoZWlnaHQsIGNlbnRlciwgb3B0aW9ucywgbW9kZSwgY2xhc3Nlcykge1xuICBpZiAoZGVsaW0gPT09IFwiPFwiIHx8IGRlbGltID09PSBcIlxcXFxsdFwiIHx8IGRlbGltID09PSBcIlxcdTI3RThcIikge1xuICAgIGRlbGltID0gXCJcXFxcbGFuZ2xlXCI7XG4gIH0gZWxzZSBpZiAoZGVsaW0gPT09IFwiPlwiIHx8IGRlbGltID09PSBcIlxcXFxndFwiIHx8IGRlbGltID09PSBcIlxcdTI3RTlcIikge1xuICAgIGRlbGltID0gXCJcXFxccmFuZ2xlXCI7XG4gIH0gLy8gRGVjaWRlIHdoYXQgc2VxdWVuY2UgdG8gdXNlXG5cblxuICB2YXIgc2VxdWVuY2U7XG5cbiAgaWYgKHV0aWxzLmNvbnRhaW5zKHN0YWNrTmV2ZXJEZWxpbWl0ZXJzLCBkZWxpbSkpIHtcbiAgICBzZXF1ZW5jZSA9IHN0YWNrTmV2ZXJEZWxpbWl0ZXJTZXF1ZW5jZTtcbiAgfSBlbHNlIGlmICh1dGlscy5jb250YWlucyhzdGFja0xhcmdlRGVsaW1pdGVycywgZGVsaW0pKSB7XG4gICAgc2VxdWVuY2UgPSBzdGFja0xhcmdlRGVsaW1pdGVyU2VxdWVuY2U7XG4gIH0gZWxzZSB7XG4gICAgc2VxdWVuY2UgPSBzdGFja0Fsd2F5c0RlbGltaXRlclNlcXVlbmNlO1xuICB9IC8vIExvb2sgdGhyb3VnaCB0aGUgc2VxdWVuY2VcblxuXG4gIHZhciBkZWxpbVR5cGUgPSB0cmF2ZXJzZVNlcXVlbmNlKGRlbGltLCBoZWlnaHQsIHNlcXVlbmNlLCBvcHRpb25zKTsgLy8gR2V0IHRoZSBkZWxpbWl0ZXIgZnJvbSBmb250IGdseXBocy5cbiAgLy8gRGVwZW5kaW5nIG9uIHRoZSBzZXF1ZW5jZSBlbGVtZW50IHdlIGRlY2lkZWQgb24sIGNhbGwgdGhlXG4gIC8vIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLlxuXG4gIGlmIChkZWxpbVR5cGUudHlwZSA9PT0gXCJzbWFsbFwiKSB7XG4gICAgcmV0dXJuIG1ha2VTbWFsbERlbGltKGRlbGltLCBkZWxpbVR5cGUuc3R5bGUsIGNlbnRlciwgb3B0aW9ucywgbW9kZSwgY2xhc3Nlcyk7XG4gIH0gZWxzZSBpZiAoZGVsaW1UeXBlLnR5cGUgPT09IFwibGFyZ2VcIikge1xuICAgIHJldHVybiBtYWtlTGFyZ2VEZWxpbShkZWxpbSwgZGVsaW1UeXBlLnNpemUsIGNlbnRlciwgb3B0aW9ucywgbW9kZSwgY2xhc3Nlcyk7XG4gIH0gZWxzZVxuICAgIC8qIGlmIChkZWxpbVR5cGUudHlwZSA9PT0gXCJzdGFja1wiKSAqL1xuICAgIHtcbiAgICAgIHJldHVybiBtYWtlU3RhY2tlZERlbGltKGRlbGltLCBoZWlnaHQsIGNlbnRlciwgb3B0aW9ucywgbW9kZSwgY2xhc3Nlcyk7XG4gICAgfVxufTtcbi8qKlxuICogTWFrZSBhIGRlbGltaXRlciBmb3IgdXNlIHdpdGggYFxcbGVmdGAgYW5kIGBcXHJpZ2h0YCwgZ2l2ZW4gYSBoZWlnaHQgYW5kIGRlcHRoXG4gKiBvZiBhbiBleHByZXNzaW9uIHRoYXQgdGhlIGRlbGltaXRlcnMgc3Vycm91bmQuXG4gKi9cblxuXG52YXIgbWFrZUxlZnRSaWdodERlbGltID0gZnVuY3Rpb24gbWFrZUxlZnRSaWdodERlbGltKGRlbGltLCBoZWlnaHQsIGRlcHRoLCBvcHRpb25zLCBtb2RlLCBjbGFzc2VzKSB7XG4gIC8vIFdlIGFsd2F5cyBjZW50ZXIgXFxsZWZ0L1xccmlnaHQgZGVsaW1pdGVycywgc28gdGhlIGF4aXMgaXMgYWx3YXlzIHNoaWZ0ZWRcbiAgdmFyIGF4aXNIZWlnaHQgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuYXhpc0hlaWdodCAqIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXI7IC8vIFRha2VuIGZyb20gVGVYIHNvdXJjZSwgdGV4LndlYiwgZnVuY3Rpb24gbWFrZV9sZWZ0X3JpZ2h0XG5cbiAgdmFyIGRlbGltaXRlckZhY3RvciA9IDkwMTtcbiAgdmFyIGRlbGltaXRlckV4dGVuZCA9IDUuMCAvIG9wdGlvbnMuZm9udE1ldHJpY3MoKS5wdFBlckVtO1xuICB2YXIgbWF4RGlzdEZyb21BeGlzID0gTWF0aC5tYXgoaGVpZ2h0IC0gYXhpc0hlaWdodCwgZGVwdGggKyBheGlzSGVpZ2h0KTtcbiAgdmFyIHRvdGFsSGVpZ2h0ID0gTWF0aC5tYXgoIC8vIEluIHJlYWwgVGVYLCBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgdXNpbmcgaW50ZWdyYWwgdmFsdWVzIHdoaWNoIGFyZVxuICAvLyA2NTUzNiBwZXIgcHQsIG9yIDY1NTM2MCBwZXIgZW0uIFNvLCB0aGUgZGl2aXNpb24gaGVyZSB0cnVuY2F0ZXMgaW5cbiAgLy8gVGVYIGJ1dCBkb2Vzbid0IGhlcmUsIHByb2R1Y2luZyBkaWZmZXJlbnQgcmVzdWx0cy4gSWYgd2Ugd2FudGVkIHRvXG4gIC8vIGV4YWN0bHkgbWF0Y2ggVGVYJ3MgY2FsY3VsYXRpb24sIHdlIGNvdWxkIGRvXG4gIC8vICAgTWF0aC5mbG9vcig2NTUzNjAgKiBtYXhEaXN0RnJvbUF4aXMgLyA1MDApICpcbiAgLy8gICAgZGVsaW1pdGVyRmFjdG9yIC8gNjU1MzYwXG4gIC8vIChUbyBzZWUgdGhlIGRpZmZlcmVuY2UsIGNvbXBhcmVcbiAgLy8gICAgeF57eF57XFxsZWZ0KFxccnVsZXswLjFlbX17MC42OGVtfVxccmlnaHQpfX1cbiAgLy8gaW4gVGVYIGFuZCBLYVRlWClcbiAgbWF4RGlzdEZyb21BeGlzIC8gNTAwICogZGVsaW1pdGVyRmFjdG9yLCAyICogbWF4RGlzdEZyb21BeGlzIC0gZGVsaW1pdGVyRXh0ZW5kKTsgLy8gRmluYWxseSwgd2UgZGVmZXIgdG8gYG1ha2VDdXN0b21TaXplZERlbGltYCB3aXRoIG91ciBjYWxjdWxhdGVkIHRvdGFsXG4gIC8vIGhlaWdodFxuXG4gIHJldHVybiBtYWtlQ3VzdG9tU2l6ZWREZWxpbShkZWxpbSwgdG90YWxIZWlnaHQsIHRydWUsIG9wdGlvbnMsIG1vZGUsIGNsYXNzZXMpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgZGVsaW1pdGVyID0gKHtcbiAgc3FydEltYWdlOiBtYWtlU3FydEltYWdlLFxuICBzaXplZERlbGltOiBtYWtlU2l6ZWREZWxpbSxcbiAgc2l6ZVRvTWF4SGVpZ2h0OiBzaXplVG9NYXhIZWlnaHQsXG4gIGN1c3RvbVNpemVkRGVsaW06IG1ha2VDdXN0b21TaXplZERlbGltLFxuICBsZWZ0UmlnaHREZWxpbTogbWFrZUxlZnRSaWdodERlbGltXG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvZGVsaW1zaXppbmcuanNcblxuXG5cblxuXG5cblxuXG5cblxuLy8gRXh0cmEgZGF0YSBuZWVkZWQgZm9yIHRoZSBkZWxpbWl0ZXIgaGFuZGxlciBkb3duIGJlbG93XG52YXIgZGVsaW1pdGVyU2l6ZXMgPSB7XG4gIFwiXFxcXGJpZ2xcIjoge1xuICAgIG1jbGFzczogXCJtb3BlblwiLFxuICAgIHNpemU6IDFcbiAgfSxcbiAgXCJcXFxcQmlnbFwiOiB7XG4gICAgbWNsYXNzOiBcIm1vcGVuXCIsXG4gICAgc2l6ZTogMlxuICB9LFxuICBcIlxcXFxiaWdnbFwiOiB7XG4gICAgbWNsYXNzOiBcIm1vcGVuXCIsXG4gICAgc2l6ZTogM1xuICB9LFxuICBcIlxcXFxCaWdnbFwiOiB7XG4gICAgbWNsYXNzOiBcIm1vcGVuXCIsXG4gICAgc2l6ZTogNFxuICB9LFxuICBcIlxcXFxiaWdyXCI6IHtcbiAgICBtY2xhc3M6IFwibWNsb3NlXCIsXG4gICAgc2l6ZTogMVxuICB9LFxuICBcIlxcXFxCaWdyXCI6IHtcbiAgICBtY2xhc3M6IFwibWNsb3NlXCIsXG4gICAgc2l6ZTogMlxuICB9LFxuICBcIlxcXFxiaWdnclwiOiB7XG4gICAgbWNsYXNzOiBcIm1jbG9zZVwiLFxuICAgIHNpemU6IDNcbiAgfSxcbiAgXCJcXFxcQmlnZ3JcIjoge1xuICAgIG1jbGFzczogXCJtY2xvc2VcIixcbiAgICBzaXplOiA0XG4gIH0sXG4gIFwiXFxcXGJpZ21cIjoge1xuICAgIG1jbGFzczogXCJtcmVsXCIsXG4gICAgc2l6ZTogMVxuICB9LFxuICBcIlxcXFxCaWdtXCI6IHtcbiAgICBtY2xhc3M6IFwibXJlbFwiLFxuICAgIHNpemU6IDJcbiAgfSxcbiAgXCJcXFxcYmlnZ21cIjoge1xuICAgIG1jbGFzczogXCJtcmVsXCIsXG4gICAgc2l6ZTogM1xuICB9LFxuICBcIlxcXFxCaWdnbVwiOiB7XG4gICAgbWNsYXNzOiBcIm1yZWxcIixcbiAgICBzaXplOiA0XG4gIH0sXG4gIFwiXFxcXGJpZ1wiOiB7XG4gICAgbWNsYXNzOiBcIm1vcmRcIixcbiAgICBzaXplOiAxXG4gIH0sXG4gIFwiXFxcXEJpZ1wiOiB7XG4gICAgbWNsYXNzOiBcIm1vcmRcIixcbiAgICBzaXplOiAyXG4gIH0sXG4gIFwiXFxcXGJpZ2dcIjoge1xuICAgIG1jbGFzczogXCJtb3JkXCIsXG4gICAgc2l6ZTogM1xuICB9LFxuICBcIlxcXFxCaWdnXCI6IHtcbiAgICBtY2xhc3M6IFwibW9yZFwiLFxuICAgIHNpemU6IDRcbiAgfVxufTtcbnZhciBkZWxpbWl0ZXJzID0gW1wiKFwiLCBcIlxcXFxscGFyZW5cIiwgXCIpXCIsIFwiXFxcXHJwYXJlblwiLCBcIltcIiwgXCJcXFxcbGJyYWNrXCIsIFwiXVwiLCBcIlxcXFxyYnJhY2tcIiwgXCJcXFxce1wiLCBcIlxcXFxsYnJhY2VcIiwgXCJcXFxcfVwiLCBcIlxcXFxyYnJhY2VcIiwgXCJcXFxcbGZsb29yXCIsIFwiXFxcXHJmbG9vclwiLCBcIlxcdTIzMEFcIiwgXCJcXHUyMzBCXCIsIFwiXFxcXGxjZWlsXCIsIFwiXFxcXHJjZWlsXCIsIFwiXFx1MjMwOFwiLCBcIlxcdTIzMDlcIiwgXCI8XCIsIFwiPlwiLCBcIlxcXFxsYW5nbGVcIiwgXCJcXHUyN0U4XCIsIFwiXFxcXHJhbmdsZVwiLCBcIlxcdTI3RTlcIiwgXCJcXFxcbHRcIiwgXCJcXFxcZ3RcIiwgXCJcXFxcbHZlcnRcIiwgXCJcXFxccnZlcnRcIiwgXCJcXFxcbFZlcnRcIiwgXCJcXFxcclZlcnRcIiwgXCJcXFxcbGdyb3VwXCIsIFwiXFxcXHJncm91cFwiLCBcIlxcdTI3RUVcIiwgXCJcXHUyN0VGXCIsIFwiXFxcXGxtb3VzdGFjaGVcIiwgXCJcXFxccm1vdXN0YWNoZVwiLCBcIlxcdTIzQjBcIiwgXCJcXHUyM0IxXCIsIFwiL1wiLCBcIlxcXFxiYWNrc2xhc2hcIiwgXCJ8XCIsIFwiXFxcXHZlcnRcIiwgXCJcXFxcfFwiLCBcIlxcXFxWZXJ0XCIsIFwiXFxcXHVwYXJyb3dcIiwgXCJcXFxcVXBhcnJvd1wiLCBcIlxcXFxkb3duYXJyb3dcIiwgXCJcXFxcRG93bmFycm93XCIsIFwiXFxcXHVwZG93bmFycm93XCIsIFwiXFxcXFVwZG93bmFycm93XCIsIFwiLlwiXTtcblxuLy8gRGVsaW1pdGVyIGZ1bmN0aW9uc1xuZnVuY3Rpb24gY2hlY2tEZWxpbWl0ZXIoZGVsaW0sIGNvbnRleHQpIHtcbiAgdmFyIHN5bURlbGltID0gY2hlY2tTeW1ib2xOb2RlVHlwZShkZWxpbSk7XG5cbiAgaWYgKHN5bURlbGltICYmIHV0aWxzLmNvbnRhaW5zKGRlbGltaXRlcnMsIHN5bURlbGltLnRleHQpKSB7XG4gICAgcmV0dXJuIHN5bURlbGltO1xuICB9IGVsc2UgaWYgKHN5bURlbGltKSB7XG4gICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBkZWxpbWl0ZXIgJ1wiICsgc3ltRGVsaW0udGV4dCArIFwiJyBhZnRlciAnXCIgKyBjb250ZXh0LmZ1bmNOYW1lICsgXCInXCIsIGRlbGltKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJJbnZhbGlkIGRlbGltaXRlciB0eXBlICdcIiArIGRlbGltLnR5cGUgKyBcIidcIiwgZGVsaW0pO1xuICB9XG59XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJkZWxpbXNpemluZ1wiLFxuICBuYW1lczogW1wiXFxcXGJpZ2xcIiwgXCJcXFxcQmlnbFwiLCBcIlxcXFxiaWdnbFwiLCBcIlxcXFxCaWdnbFwiLCBcIlxcXFxiaWdyXCIsIFwiXFxcXEJpZ3JcIiwgXCJcXFxcYmlnZ3JcIiwgXCJcXFxcQmlnZ3JcIiwgXCJcXFxcYmlnbVwiLCBcIlxcXFxCaWdtXCIsIFwiXFxcXGJpZ2dtXCIsIFwiXFxcXEJpZ2dtXCIsIFwiXFxcXGJpZ1wiLCBcIlxcXFxCaWdcIiwgXCJcXFxcYmlnZ1wiLCBcIlxcXFxCaWdnXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInByaW1pdGl2ZVwiXVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICB2YXIgZGVsaW0gPSBjaGVja0RlbGltaXRlcihhcmdzWzBdLCBjb250ZXh0KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJkZWxpbXNpemluZ1wiLFxuICAgICAgbW9kZTogY29udGV4dC5wYXJzZXIubW9kZSxcbiAgICAgIHNpemU6IGRlbGltaXRlclNpemVzW2NvbnRleHQuZnVuY05hbWVdLnNpemUsXG4gICAgICBtY2xhc3M6IGRlbGltaXRlclNpemVzW2NvbnRleHQuZnVuY05hbWVdLm1jbGFzcyxcbiAgICAgIGRlbGltOiBkZWxpbS50ZXh0XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgaWYgKGdyb3VwLmRlbGltID09PSBcIi5cIikge1xuICAgICAgLy8gRW1wdHkgZGVsaW1pdGVycyBzdGlsbCBjb3VudCBhcyBlbGVtZW50cywgZXZlbiB0aG91Z2ggdGhleSBkb24ndFxuICAgICAgLy8gc2hvdyBhbnl0aGluZy5cbiAgICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbZ3JvdXAubWNsYXNzXSk7XG4gICAgfSAvLyBVc2UgZGVsaW1pdGVyLnNpemVkRGVsaW0gdG8gZ2VuZXJhdGUgdGhlIGRlbGltaXRlci5cblxuXG4gICAgcmV0dXJuIGRlbGltaXRlci5zaXplZERlbGltKGdyb3VwLmRlbGltLCBncm91cC5zaXplLCBvcHRpb25zLCBncm91cC5tb2RlLCBbZ3JvdXAubWNsYXNzXSk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblxuICAgIGlmIChncm91cC5kZWxpbSAhPT0gXCIuXCIpIHtcbiAgICAgIGNoaWxkcmVuLnB1c2gobWFrZVRleHQoZ3JvdXAuZGVsaW0sIGdyb3VwLm1vZGUpKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibW9cIiwgY2hpbGRyZW4pO1xuXG4gICAgaWYgKGdyb3VwLm1jbGFzcyA9PT0gXCJtb3BlblwiIHx8IGdyb3VwLm1jbGFzcyA9PT0gXCJtY2xvc2VcIikge1xuICAgICAgLy8gT25seSBzb21lIG9mIHRoZSBkZWxpbXNpemluZyBmdW5jdGlvbnMgYWN0IGFzIGZlbmNlcywgYW5kIHRoZXlcbiAgICAgIC8vIHJldHVybiBcIm1vcGVuXCIgb3IgXCJtY2xvc2VcIiBtY2xhc3MuXG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZlbmNlXCIsIFwidHJ1ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXhwbGljaXRseSBkaXNhYmxlIGZlbmNpbmcgaWYgaXQncyBub3QgYSBmZW5jZSwgdG8gb3ZlcnJpZGUgdGhlXG4gICAgICAvLyBkZWZhdWx0cy5cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmVuY2VcIiwgXCJmYWxzZVwiKTtcbiAgICB9XG5cbiAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cmV0Y2h5XCIsIFwidHJ1ZVwiKTtcbiAgICB2YXIgc2l6ZSA9IG1ha2VFbShkZWxpbWl0ZXIuc2l6ZVRvTWF4SGVpZ2h0W2dyb3VwLnNpemVdKTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcIm1pbnNpemVcIiwgc2l6ZSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXhzaXplXCIsIHNpemUpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG59KTtcblxuZnVuY3Rpb24gYXNzZXJ0UGFyc2VkKGdyb3VwKSB7XG4gIGlmICghZ3JvdXAuYm9keSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZzogVGhlIGxlZnRyaWdodCBQYXJzZU5vZGUgd2Fzbid0IGZ1bGx5IHBhcnNlZC5cIik7XG4gIH1cbn1cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImxlZnRyaWdodC1yaWdodFwiLFxuICBuYW1lczogW1wiXFxcXHJpZ2h0XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgcHJpbWl0aXZlOiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoY29udGV4dCwgYXJncykge1xuICAgIC8vIFxcbGVmdCBjYXNlIGJlbG93IHRyaWdnZXJzIHBhcnNpbmcgb2YgXFxyaWdodCBpblxuICAgIC8vICAgYGNvbnN0IHJpZ2h0ID0gcGFyc2VyLnBhcnNlRnVuY3Rpb24oKTtgXG4gICAgLy8gdXNlcyB0aGlzIHJldHVybiB2YWx1ZS5cbiAgICB2YXIgY29sb3IgPSBjb250ZXh0LnBhcnNlci5ndWxsZXQubWFjcm9zLmdldChcIlxcXFxjdXJyZW50QGNvbG9yXCIpO1xuXG4gICAgaWYgKGNvbG9yICYmIHR5cGVvZiBjb2xvciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiXFxcXGN1cnJlbnRAY29sb3Igc2V0IHRvIG5vbi1zdHJpbmcgaW4gXFxcXHJpZ2h0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImxlZnRyaWdodC1yaWdodFwiLFxuICAgICAgbW9kZTogY29udGV4dC5wYXJzZXIubW9kZSxcbiAgICAgIGRlbGltOiBjaGVja0RlbGltaXRlcihhcmdzWzBdLCBjb250ZXh0KS50ZXh0LFxuICAgICAgY29sb3I6IGNvbG9yIC8vIHVuZGVmaW5lZCBpZiBub3Qgc2V0IHZpYSBcXGNvbG9yXG5cbiAgICB9O1xuICB9XG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJsZWZ0cmlnaHRcIixcbiAgbmFtZXM6IFtcIlxcXFxsZWZ0XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgcHJpbWl0aXZlOiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoY29udGV4dCwgYXJncykge1xuICAgIHZhciBkZWxpbSA9IGNoZWNrRGVsaW1pdGVyKGFyZ3NbMF0sIGNvbnRleHQpO1xuICAgIHZhciBwYXJzZXIgPSBjb250ZXh0LnBhcnNlcjsgLy8gUGFyc2Ugb3V0IHRoZSBpbXBsaWNpdCBib2R5XG5cbiAgICArK3BhcnNlci5sZWZ0cmlnaHREZXB0aDsgLy8gcGFyc2VFeHByZXNzaW9uIHN0b3BzIGJlZm9yZSAnXFxcXHJpZ2h0J1xuXG4gICAgdmFyIGJvZHkgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKGZhbHNlKTtcbiAgICAtLXBhcnNlci5sZWZ0cmlnaHREZXB0aDsgLy8gQ2hlY2sgdGhlIG5leHQgdG9rZW5cblxuICAgIHBhcnNlci5leHBlY3QoXCJcXFxccmlnaHRcIiwgZmFsc2UpO1xuICAgIHZhciByaWdodCA9IGFzc2VydE5vZGVUeXBlKHBhcnNlci5wYXJzZUZ1bmN0aW9uKCksIFwibGVmdHJpZ2h0LXJpZ2h0XCIpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImxlZnRyaWdodFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBib2R5LFxuICAgICAgbGVmdDogZGVsaW0udGV4dCxcbiAgICAgIHJpZ2h0OiByaWdodC5kZWxpbSxcbiAgICAgIHJpZ2h0Q29sb3I6IHJpZ2h0LmNvbG9yXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgYXNzZXJ0UGFyc2VkKGdyb3VwKTsgLy8gQnVpbGQgdGhlIGlubmVyIGV4cHJlc3Npb25cblxuICAgIHZhciBpbm5lciA9IGJ1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLCB0cnVlLCBbXCJtb3BlblwiLCBcIm1jbG9zZVwiXSk7XG4gICAgdmFyIGlubmVySGVpZ2h0ID0gMDtcbiAgICB2YXIgaW5uZXJEZXB0aCA9IDA7XG4gICAgdmFyIGhhZE1pZGRsZSA9IGZhbHNlOyAvLyBDYWxjdWxhdGUgaXRzIGhlaWdodCBhbmQgZGVwdGhcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFByb3BlcnR5IGBpc01pZGRsZWAgbm90IGRlZmluZWQgb24gYHNwYW5gLiBTZWUgY29tbWVudCBpblxuICAgICAgLy8gXCJtaWRkbGVcIidzIGh0bWxCdWlsZGVyLlxuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgaWYgKGlubmVyW2ldLmlzTWlkZGxlKSB7XG4gICAgICAgIGhhZE1pZGRsZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbm5lckhlaWdodCA9IE1hdGgubWF4KGlubmVyW2ldLmhlaWdodCwgaW5uZXJIZWlnaHQpO1xuICAgICAgICBpbm5lckRlcHRoID0gTWF0aC5tYXgoaW5uZXJbaV0uZGVwdGgsIGlubmVyRGVwdGgpO1xuICAgICAgfVxuICAgIH0gLy8gVGhlIHNpemUgb2YgZGVsaW1pdGVycyBpcyB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHN0eWxlIHdlIGFyZVxuICAgIC8vIGluLiBUaHVzLCB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIHRoZSBzaXplIG9mIGRlbGltaXRlciB3ZSBuZWVkIGFyb3VuZFxuICAgIC8vIGEgZ3JvdXAsIHdlIHNjYWxlIGRvd24gdGhlIGlubmVyIHNpemUgYmFzZWQgb24gdGhlIHNpemUuXG5cblxuICAgIGlubmVySGVpZ2h0ICo9IG9wdGlvbnMuc2l6ZU11bHRpcGxpZXI7XG4gICAgaW5uZXJEZXB0aCAqPSBvcHRpb25zLnNpemVNdWx0aXBsaWVyO1xuICAgIHZhciBsZWZ0RGVsaW07XG5cbiAgICBpZiAoZ3JvdXAubGVmdCA9PT0gXCIuXCIpIHtcbiAgICAgIC8vIEVtcHR5IGRlbGltaXRlcnMgaW4gXFxsZWZ0IGFuZCBcXHJpZ2h0IG1ha2UgbnVsbCBkZWxpbWl0ZXIgc3BhY2VzLlxuICAgICAgbGVmdERlbGltID0gbWFrZU51bGxEZWxpbWl0ZXIob3B0aW9ucywgW1wibW9wZW5cIl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHVzZSBsZWZ0UmlnaHREZWxpbSB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBzaXplZFxuICAgICAgLy8gZGVsaW1pdGVyLlxuICAgICAgbGVmdERlbGltID0gZGVsaW1pdGVyLmxlZnRSaWdodERlbGltKGdyb3VwLmxlZnQsIGlubmVySGVpZ2h0LCBpbm5lckRlcHRoLCBvcHRpb25zLCBncm91cC5tb2RlLCBbXCJtb3BlblwiXSk7XG4gICAgfSAvLyBBZGQgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwcmVzc2lvblxuXG5cbiAgICBpbm5lci51bnNoaWZ0KGxlZnREZWxpbSk7IC8vIEhhbmRsZSBtaWRkbGUgZGVsaW1pdGVyc1xuXG4gICAgaWYgKGhhZE1pZGRsZSkge1xuICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGlubmVyLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgbWlkZGxlRGVsaW0gPSBpbm5lcltfaV07IC8vIFByb3BlcnR5IGBpc01pZGRsZWAgbm90IGRlZmluZWQgb24gYHNwYW5gLiBTZWUgY29tbWVudCBpblxuICAgICAgICAvLyBcIm1pZGRsZVwiJ3MgaHRtbEJ1aWxkZXIuXG4gICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICB2YXIgaXNNaWRkbGUgPSBtaWRkbGVEZWxpbS5pc01pZGRsZTtcblxuICAgICAgICBpZiAoaXNNaWRkbGUpIHtcbiAgICAgICAgICAvLyBBcHBseSB0aGUgb3B0aW9ucyB0aGF0IHdlcmUgYWN0aXZlIHdoZW4gXFxtaWRkbGUgd2FzIGNhbGxlZFxuICAgICAgICAgIGlubmVyW19pXSA9IGRlbGltaXRlci5sZWZ0UmlnaHREZWxpbShpc01pZGRsZS5kZWxpbSwgaW5uZXJIZWlnaHQsIGlubmVyRGVwdGgsIGlzTWlkZGxlLm9wdGlvbnMsIGdyb3VwLm1vZGUsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByaWdodERlbGltOyAvLyBTYW1lIGZvciB0aGUgcmlnaHQgZGVsaW1pdGVyLCBidXQgdXNpbmcgY29sb3Igc3BlY2lmaWVkIGJ5IFxcY29sb3JcblxuICAgIGlmIChncm91cC5yaWdodCA9PT0gXCIuXCIpIHtcbiAgICAgIHJpZ2h0RGVsaW0gPSBtYWtlTnVsbERlbGltaXRlcihvcHRpb25zLCBbXCJtY2xvc2VcIl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29sb3JPcHRpb25zID0gZ3JvdXAucmlnaHRDb2xvciA/IG9wdGlvbnMud2l0aENvbG9yKGdyb3VwLnJpZ2h0Q29sb3IpIDogb3B0aW9ucztcbiAgICAgIHJpZ2h0RGVsaW0gPSBkZWxpbWl0ZXIubGVmdFJpZ2h0RGVsaW0oZ3JvdXAucmlnaHQsIGlubmVySGVpZ2h0LCBpbm5lckRlcHRoLCBjb2xvck9wdGlvbnMsIGdyb3VwLm1vZGUsIFtcIm1jbG9zZVwiXSk7XG4gICAgfSAvLyBBZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZXhwcmVzc2lvbi5cblxuXG4gICAgaW5uZXIucHVzaChyaWdodERlbGltKTtcbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibWlubmVyXCJdLCBpbm5lciwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRQYXJzZWQoZ3JvdXApO1xuICAgIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zKTtcblxuICAgIGlmIChncm91cC5sZWZ0ICE9PSBcIi5cIikge1xuICAgICAgdmFyIGxlZnROb2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtb1wiLCBbbWFrZVRleHQoZ3JvdXAubGVmdCwgZ3JvdXAubW9kZSldKTtcbiAgICAgIGxlZnROb2RlLnNldEF0dHJpYnV0ZShcImZlbmNlXCIsIFwidHJ1ZVwiKTtcbiAgICAgIGlubmVyLnVuc2hpZnQobGVmdE5vZGUpO1xuICAgIH1cblxuICAgIGlmIChncm91cC5yaWdodCAhPT0gXCIuXCIpIHtcbiAgICAgIHZhciByaWdodE5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFttYWtlVGV4dChncm91cC5yaWdodCwgZ3JvdXAubW9kZSldKTtcbiAgICAgIHJpZ2h0Tm9kZS5zZXRBdHRyaWJ1dGUoXCJmZW5jZVwiLCBcInRydWVcIik7XG5cbiAgICAgIGlmIChncm91cC5yaWdodENvbG9yKSB7XG4gICAgICAgIHJpZ2h0Tm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXRoY29sb3JcIiwgZ3JvdXAucmlnaHRDb2xvcik7XG4gICAgICB9XG5cbiAgICAgIGlubmVyLnB1c2gocmlnaHROb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVJvdyhpbm5lcik7XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm1pZGRsZVwiLFxuICBuYW1lczogW1wiXFxcXG1pZGRsZVwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIHByaW1pdGl2ZTogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICB2YXIgZGVsaW0gPSBjaGVja0RlbGltaXRlcihhcmdzWzBdLCBjb250ZXh0KTtcblxuICAgIGlmICghY29udGV4dC5wYXJzZXIubGVmdHJpZ2h0RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFxtaWRkbGUgd2l0aG91dCBwcmVjZWRpbmcgXFxcXGxlZnRcIiwgZGVsaW0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIm1pZGRsZVwiLFxuICAgICAgbW9kZTogY29udGV4dC5wYXJzZXIubW9kZSxcbiAgICAgIGRlbGltOiBkZWxpbS50ZXh0XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIG1pZGRsZURlbGltO1xuXG4gICAgaWYgKGdyb3VwLmRlbGltID09PSBcIi5cIikge1xuICAgICAgbWlkZGxlRGVsaW0gPSBtYWtlTnVsbERlbGltaXRlcihvcHRpb25zLCBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pZGRsZURlbGltID0gZGVsaW1pdGVyLnNpemVkRGVsaW0oZ3JvdXAuZGVsaW0sIDEsIG9wdGlvbnMsIGdyb3VwLm1vZGUsIFtdKTtcbiAgICAgIHZhciBpc01pZGRsZSA9IHtcbiAgICAgICAgZGVsaW06IGdyb3VwLmRlbGltLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICB9OyAvLyBQcm9wZXJ0eSBgaXNNaWRkbGVgIG5vdCBkZWZpbmVkIG9uIGBzcGFuYC4gSXQgaXMgb25seSB1c2VkIGluXG4gICAgICAvLyB0aGlzIGZpbGUgYWJvdmUuXG4gICAgICAvLyBUT0RPOiBGaXggdGhpcyB2aW9sYXRpb24gb2YgdGhlIGBzcGFuYCB0eXBlIGFuZCBwb3NzaWJseSByZW5hbWVcbiAgICAgIC8vIHRoaW5ncyBzaW5jZSBgaXNNaWRkbGVgIHNvdW5kcyBsaWtlIGEgYm9vbGVhbiwgYnV0IGlzIGEgc3RydWN0LlxuICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICBtaWRkbGVEZWxpbS5pc01pZGRsZSA9IGlzTWlkZGxlO1xuICAgIH1cblxuICAgIHJldHVybiBtaWRkbGVEZWxpbTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIC8vIEEgRmlyZWZveCBcXG1pZGRsZSB3aWxsIHN0cmVjaCBhIGNoYXJhY3RlciB2ZXJ0aWNhbGx5IG9ubHkgaWYgaXRcbiAgICAvLyBpcyBpbiB0aGUgZmVuY2UgcGFydCBvZiB0aGUgb3BlcmF0b3IgZGljdGlvbmFyeSBhdDpcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvTWF0aE1MMy9hcHBlbmRpeGMuaHRtbC5cbiAgICAvLyBTbyB3ZSBuZWVkIHRvIGF2b2lkIFUrMjIyMyBhbmQgdXNlIHBsYWluIFwifFwiIGluc3RlYWQuXG4gICAgdmFyIHRleHROb2RlID0gZ3JvdXAuZGVsaW0gPT09IFwiXFxcXHZlcnRcIiB8fCBncm91cC5kZWxpbSA9PT0gXCJ8XCIgPyBtYWtlVGV4dChcInxcIiwgXCJ0ZXh0XCIpIDogbWFrZVRleHQoZ3JvdXAuZGVsaW0sIGdyb3VwLm1vZGUpO1xuICAgIHZhciBtaWRkbGVOb2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtb1wiLCBbdGV4dE5vZGVdKTtcbiAgICBtaWRkbGVOb2RlLnNldEF0dHJpYnV0ZShcImZlbmNlXCIsIFwidHJ1ZVwiKTsgLy8gTWF0aE1MIGdpdmVzIDUvMThlbSBzcGFjaW5nIHRvIGVhY2ggPG1vPiBlbGVtZW50LlxuICAgIC8vIFxcbWlkZGxlIHNob3VsZCBnZXQgZGVsaW1pdGVyIHNwYWNpbmcgaW5zdGVhZC5cblxuICAgIG1pZGRsZU5vZGUuc2V0QXR0cmlidXRlKFwibHNwYWNlXCIsIFwiMC4wNWVtXCIpO1xuICAgIG1pZGRsZU5vZGUuc2V0QXR0cmlidXRlKFwicnNwYWNlXCIsIFwiMC4wNWVtXCIpO1xuICAgIHJldHVybiBtaWRkbGVOb2RlO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvZW5jbG9zZS5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGVuY2xvc2VfaHRtbEJ1aWxkZXIgPSBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAvLyBcXGNhbmNlbCwgXFxiY2FuY2VsLCBcXHhjYW5jZWwsIFxcc291dCwgXFxmYm94LCBcXGNvbG9yYm94LCBcXGZjb2xvcmJveCwgXFxwaGFzZVxuICAvLyBTb21lIGdyb3VwcyBjYW4gcmV0dXJuIGRvY3VtZW50IGZyYWdtZW50cy4gIEhhbmRsZSB0aG9zZSBieSB3cmFwcGluZ1xuICAvLyB0aGVtIGluIGEgc3Bhbi5cbiAgdmFyIGlubmVyID0gYnVpbGRDb21tb24ud3JhcEZyYWdtZW50KGJ1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB2YXIgbGFiZWwgPSBncm91cC5sYWJlbC5zbGljZSgxKTtcbiAgdmFyIHNjYWxlID0gb3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgdmFyIGltZztcbiAgdmFyIGltZ1NoaWZ0ID0gMDsgLy8gSW4gdGhlIExhVGVYIGNhbmNlbCBwYWNrYWdlLCBsaW5lIGdlb21ldHJ5IGlzIHNsaWdodGx5IGRpZmZlcmVudFxuICAvLyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3ViamVjdCBpcyB3aWRlciB0aGFuIGl0IGlzIHRhbGwsIG9yIHZpY2UgdmVyc2EuXG4gIC8vIFdlIGRvbid0IGtub3cgdGhlIHdpZHRoIG9mIGEgZ3JvdXAsIHNvIGFzIGEgcHJveHksIHdlIHRlc3QgaWZcbiAgLy8gdGhlIHN1YmplY3QgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiBUaGlzIGNhcHR1cmVzIG1vc3Qgb2YgdGhlXG4gIC8vIHN1YmplY3RzIHRoYXQgc2hvdWxkIGdldCB0aGUgXCJ0YWxsXCIgdHJlYXRtZW50LlxuXG4gIHZhciBpc1NpbmdsZUNoYXIgPSB1dGlscy5pc0NoYXJhY3RlckJveChncm91cC5ib2R5KTtcblxuICBpZiAobGFiZWwgPT09IFwic291dFwiKSB7XG4gICAgaW1nID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wic3RyZXRjaHlcIiwgXCJzb3V0XCJdKTtcbiAgICBpbWcuaGVpZ2h0ID0gb3B0aW9ucy5mb250TWV0cmljcygpLmRlZmF1bHRSdWxlVGhpY2tuZXNzIC8gc2NhbGU7XG4gICAgaW1nU2hpZnQgPSAtMC41ICogb3B0aW9ucy5mb250TWV0cmljcygpLnhIZWlnaHQ7XG4gIH0gZWxzZSBpZiAobGFiZWwgPT09IFwicGhhc2VcIikge1xuICAgIC8vIFNldCBhIGNvdXBsZSBvZiBkaW1lbnNpb25zIGZyb20gdGhlIHN0ZWlubWV0eiBwYWNrYWdlLlxuICAgIHZhciBsaW5lV2VpZ2h0ID0gY2FsY3VsYXRlU2l6ZSh7XG4gICAgICBudW1iZXI6IDAuNixcbiAgICAgIHVuaXQ6IFwicHRcIlxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHZhciBjbGVhcmFuY2UgPSBjYWxjdWxhdGVTaXplKHtcbiAgICAgIG51bWJlcjogMC4zNSxcbiAgICAgIHVuaXQ6IFwiZXhcIlxuICAgIH0sIG9wdGlvbnMpOyAvLyBQcmV2ZW50IHNpemUgY2hhbmdlcyBsaWtlIFxcSHVnZSBmcm9tIGFmZmVjdGluZyBsaW5lIHRoaWNrbmVzc1xuXG4gICAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ0Jhc2VTaXppbmcoKTtcbiAgICBzY2FsZSA9IHNjYWxlIC8gbmV3T3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgICB2YXIgYW5nbGVIZWlnaHQgPSBpbm5lci5oZWlnaHQgKyBpbm5lci5kZXB0aCArIGxpbmVXZWlnaHQgKyBjbGVhcmFuY2U7IC8vIFJlc2VydmUgYSBsZWZ0IHBhZCBmb3IgdGhlIGFuZ2xlLlxuXG4gICAgaW5uZXIuc3R5bGUucGFkZGluZ0xlZnQgPSBtYWtlRW0oYW5nbGVIZWlnaHQgLyAyICsgbGluZVdlaWdodCk7IC8vIENyZWF0ZSBhbiBTVkdcblxuICAgIHZhciB2aWV3Qm94SGVpZ2h0ID0gTWF0aC5mbG9vcigxMDAwICogYW5nbGVIZWlnaHQgKiBzY2FsZSk7XG4gICAgdmFyIHBhdGggPSBwaGFzZVBhdGgodmlld0JveEhlaWdodCk7XG4gICAgdmFyIHN2Z05vZGUgPSBuZXcgU3ZnTm9kZShbbmV3IFBhdGhOb2RlKFwicGhhc2VcIiwgcGF0aCldLCB7XG4gICAgICBcIndpZHRoXCI6IFwiNDAwZW1cIixcbiAgICAgIFwiaGVpZ2h0XCI6IG1ha2VFbSh2aWV3Qm94SGVpZ2h0IC8gMTAwMCksXG4gICAgICBcInZpZXdCb3hcIjogXCIwIDAgNDAwMDAwIFwiICsgdmlld0JveEhlaWdodCxcbiAgICAgIFwicHJlc2VydmVBc3BlY3RSYXRpb1wiOiBcInhNaW5ZTWluIHNsaWNlXCJcbiAgICB9KTsgLy8gV3JhcCBpdCBpbiBhIHNwYW4gd2l0aCBvdmVyZmxvdzogaGlkZGVuLlxuXG4gICAgaW1nID0gYnVpbGRDb21tb24ubWFrZVN2Z1NwYW4oW1wiaGlkZS10YWlsXCJdLCBbc3ZnTm9kZV0sIG9wdGlvbnMpO1xuICAgIGltZy5zdHlsZS5oZWlnaHQgPSBtYWtlRW0oYW5nbGVIZWlnaHQpO1xuICAgIGltZ1NoaWZ0ID0gaW5uZXIuZGVwdGggKyBsaW5lV2VpZ2h0ICsgY2xlYXJhbmNlO1xuICB9IGVsc2Uge1xuICAgIC8vIEFkZCBob3Jpem9udGFsIHBhZGRpbmdcbiAgICBpZiAoL2NhbmNlbC8udGVzdChsYWJlbCkpIHtcbiAgICAgIGlmICghaXNTaW5nbGVDaGFyKSB7XG4gICAgICAgIGlubmVyLmNsYXNzZXMucHVzaChcImNhbmNlbC1wYWRcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsYWJlbCA9PT0gXCJhbmdsXCIpIHtcbiAgICAgIGlubmVyLmNsYXNzZXMucHVzaChcImFuZ2xwYWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyLmNsYXNzZXMucHVzaChcImJveHBhZFwiKTtcbiAgICB9IC8vIEFkZCB2ZXJ0aWNhbCBwYWRkaW5nXG5cblxuICAgIHZhciB0b3BQYWQgPSAwO1xuICAgIHZhciBib3R0b21QYWQgPSAwO1xuICAgIHZhciBydWxlVGhpY2tuZXNzID0gMDsgLy8gcmVmOiBjYW5jZWwgcGFja2FnZTogXFxhZHZhbmNlXFx0b3RhbGhlaWdodDJcXHBAICUgXCIrMlwiXG5cbiAgICBpZiAoL2JveC8udGVzdChsYWJlbCkpIHtcbiAgICAgIHJ1bGVUaGlja25lc3MgPSBNYXRoLm1heChvcHRpb25zLmZvbnRNZXRyaWNzKCkuZmJveHJ1bGUsIC8vIGRlZmF1bHRcbiAgICAgIG9wdGlvbnMubWluUnVsZVRoaWNrbmVzcyAvLyBVc2VyIG92ZXJyaWRlLlxuICAgICAgKTtcbiAgICAgIHRvcFBhZCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5mYm94c2VwICsgKGxhYmVsID09PSBcImNvbG9yYm94XCIgPyAwIDogcnVsZVRoaWNrbmVzcyk7XG4gICAgICBib3R0b21QYWQgPSB0b3BQYWQ7XG4gICAgfSBlbHNlIGlmIChsYWJlbCA9PT0gXCJhbmdsXCIpIHtcbiAgICAgIHJ1bGVUaGlja25lc3MgPSBNYXRoLm1heChvcHRpb25zLmZvbnRNZXRyaWNzKCkuZGVmYXVsdFJ1bGVUaGlja25lc3MsIG9wdGlvbnMubWluUnVsZVRoaWNrbmVzcyk7XG4gICAgICB0b3BQYWQgPSA0ICogcnVsZVRoaWNrbmVzczsgLy8gZ2FwID0gMyDDlyBsaW5lLCBwbHVzIHRoZSBsaW5lIGl0c2VsZi5cblxuICAgICAgYm90dG9tUGFkID0gTWF0aC5tYXgoMCwgMC4yNSAtIGlubmVyLmRlcHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9wUGFkID0gaXNTaW5nbGVDaGFyID8gMC4yIDogMDtcbiAgICAgIGJvdHRvbVBhZCA9IHRvcFBhZDtcbiAgICB9XG5cbiAgICBpbWcgPSBzdHJldGNoeS5lbmNsb3NlU3Bhbihpbm5lciwgbGFiZWwsIHRvcFBhZCwgYm90dG9tUGFkLCBvcHRpb25zKTtcblxuICAgIGlmICgvZmJveHxib3hlZHxmY29sb3Jib3gvLnRlc3QobGFiZWwpKSB7XG4gICAgICBpbWcuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICBpbWcuc3R5bGUuYm9yZGVyV2lkdGggPSBtYWtlRW0ocnVsZVRoaWNrbmVzcyk7XG4gICAgfSBlbHNlIGlmIChsYWJlbCA9PT0gXCJhbmdsXCIgJiYgcnVsZVRoaWNrbmVzcyAhPT0gMC4wNDkpIHtcbiAgICAgIGltZy5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9IG1ha2VFbShydWxlVGhpY2tuZXNzKTtcbiAgICAgIGltZy5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gbWFrZUVtKHJ1bGVUaGlja25lc3MpO1xuICAgIH1cblxuICAgIGltZ1NoaWZ0ID0gaW5uZXIuZGVwdGggKyBib3R0b21QYWQ7XG5cbiAgICBpZiAoZ3JvdXAuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZ3JvdXAuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgICBpZiAoZ3JvdXAuYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgaW1nLnN0eWxlLmJvcmRlckNvbG9yID0gZ3JvdXAuYm9yZGVyQ29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHZsaXN0O1xuXG4gIGlmIChncm91cC5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICB2bGlzdCA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICBjaGlsZHJlbjogWy8vIFB1dCB0aGUgY29sb3IgYmFja2dyb3VuZCBiZWhpbmQgaW5uZXI7XG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBpbWcsXG4gICAgICAgIHNoaWZ0OiBpbWdTaGlmdFxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogaW5uZXIsXG4gICAgICAgIHNoaWZ0OiAwXG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHZhciBjbGFzc2VzID0gL2NhbmNlbHxwaGFzZS8udGVzdChsYWJlbCkgPyBbXCJzdmctYWxpZ25cIl0gOiBbXTtcbiAgICB2bGlzdCA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICBjaGlsZHJlbjogWy8vIFdyaXRlIHRoZSBcXGNhbmNlbCBzdHJva2Ugb24gdG9wIG9mIGlubmVyLlxuICAgICAge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogaW5uZXIsXG4gICAgICAgIHNoaWZ0OiAwXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBpbWcsXG4gICAgICAgIHNoaWZ0OiBpbWdTaGlmdCxcbiAgICAgICAgd3JhcHBlckNsYXNzZXM6IGNsYXNzZXNcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAoL2NhbmNlbC8udGVzdChsYWJlbCkpIHtcbiAgICAvLyBUaGUgY2FuY2VsIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgY2FuY2VsIGxpbmVzIGFkZCB0aGVpciBoZWlnaHRcbiAgICAvLyB0byB0aGUgZXhwcmVzc2lvbiwgYnV0IHRlc3RzIHNob3cgdGhhdCBpc24ndCBob3cgaXQgYWN0dWFsbHkgd29ya3MuXG4gICAgdmxpc3QuaGVpZ2h0ID0gaW5uZXIuaGVpZ2h0O1xuICAgIHZsaXN0LmRlcHRoID0gaW5uZXIuZGVwdGg7XG4gIH1cblxuICBpZiAoL2NhbmNlbC8udGVzdChsYWJlbCkgJiYgIWlzU2luZ2xlQ2hhcikge1xuICAgIC8vIGNhbmNlbCBkb2VzIG5vdCBjcmVhdGUgaG9yaXogc3BhY2UgZm9yIGl0cyBsaW5lIGV4dGVuc2lvbi5cbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiLCBcImNhbmNlbC1sYXBcIl0sIFt2bGlzdF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCJdLCBbdmxpc3RdLCBvcHRpb25zKTtcbiAgfVxufTtcblxudmFyIGVuY2xvc2VfbWF0aG1sQnVpbGRlciA9IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIGZib3hzZXAgPSAwO1xuICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKGdyb3VwLmxhYmVsLmluZGV4T2YoXCJjb2xvcmJveFwiKSA+IC0xID8gXCJtcGFkZGVkXCIgOiBcIm1lbmNsb3NlXCIsIFtidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMpXSk7XG5cbiAgc3dpdGNoIChncm91cC5sYWJlbCkge1xuICAgIGNhc2UgXCJcXFxcY2FuY2VsXCI6XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIm5vdGF0aW9uXCIsIFwidXBkaWFnb25hbHN0cmlrZVwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlxcXFxiY2FuY2VsXCI6XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIm5vdGF0aW9uXCIsIFwiZG93bmRpYWdvbmFsc3RyaWtlXCIpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiXFxcXHBoYXNlXCI6XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIm5vdGF0aW9uXCIsIFwicGhhc29yYW5nbGVcIik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJcXFxcc291dFwiOlxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJub3RhdGlvblwiLCBcImhvcml6b250YWxzdHJpa2VcIik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJcXFxcZmJveFwiOlxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJub3RhdGlvblwiLCBcImJveFwiKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlxcXFxhbmdsXCI6XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIm5vdGF0aW9uXCIsIFwiYWN0dWFyaWFsXCIpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiXFxcXGZjb2xvcmJveFwiOlxuICAgIGNhc2UgXCJcXFxcY29sb3Jib3hcIjpcbiAgICAgIC8vIDxtZW5jbG9zZT4gZG9lc24ndCBoYXZlIGEgZ29vZCBub3RhdGlvbiBvcHRpb24uIFNvIHVzZSA8bXBhZGRlZD5cbiAgICAgIC8vIGluc3RlYWQuIFNldCBzb21lIGF0dHJpYnV0ZXMgdGhhdCBjb21lIGluY2x1ZGVkIHdpdGggPG1lbmNsb3NlPi5cbiAgICAgIGZib3hzZXAgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuZmJveHNlcCAqIG9wdGlvbnMuZm9udE1ldHJpY3MoKS5wdFBlckVtO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIitcIiArIDIgKiBmYm94c2VwICsgXCJwdFwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiK1wiICsgMiAqIGZib3hzZXAgKyBcInB0XCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsc3BhY2VcIiwgZmJveHNlcCArIFwicHRcIik7IC8vXG5cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwidm9mZnNldFwiLCBmYm94c2VwICsgXCJwdFwiKTtcblxuICAgICAgaWYgKGdyb3VwLmxhYmVsID09PSBcIlxcXFxmY29sb3Jib3hcIikge1xuICAgICAgICB2YXIgdGhrID0gTWF0aC5tYXgob3B0aW9ucy5mb250TWV0cmljcygpLmZib3hydWxlLCAvLyBkZWZhdWx0XG4gICAgICAgIG9wdGlvbnMubWluUnVsZVRoaWNrbmVzcyAvLyB1c2VyIG92ZXJyaWRlXG4gICAgICAgICk7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJib3JkZXI6IFwiICsgdGhrICsgXCJlbSBzb2xpZCBcIiArIFN0cmluZyhncm91cC5ib3JkZXJDb2xvcikpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJcXFxceGNhbmNlbFwiOlxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJub3RhdGlvblwiLCBcInVwZGlhZ29uYWxzdHJpa2UgZG93bmRpYWdvbmFsc3RyaWtlXCIpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAoZ3JvdXAuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXRoYmFja2dyb3VuZFwiLCBncm91cC5iYWNrZ3JvdW5kQ29sb3IpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiZW5jbG9zZVwiLFxuICBuYW1lczogW1wiXFxcXGNvbG9yYm94XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDIsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBhcmdUeXBlczogW1wiY29sb3JcIiwgXCJ0ZXh0XCJdXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncywgb3B0QXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmLmZ1bmNOYW1lO1xuICAgIHZhciBjb2xvciA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMF0sIFwiY29sb3ItdG9rZW5cIikuY29sb3I7XG4gICAgdmFyIGJvZHkgPSBhcmdzWzFdO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImVuY2xvc2VcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgbGFiZWw6IGZ1bmNOYW1lLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvcixcbiAgICAgIGJvZHk6IGJvZHlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZW5jbG9zZV9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogZW5jbG9zZV9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJlbmNsb3NlXCIsXG4gIG5hbWVzOiBbXCJcXFxcZmNvbG9yYm94XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDMsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBhcmdUeXBlczogW1wiY29sb3JcIiwgXCJjb2xvclwiLCBcInRleHRcIl1cbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMiwgYXJncywgb3B0QXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZjIuZnVuY05hbWU7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJjb2xvci10b2tlblwiKS5jb2xvcjtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1sxXSwgXCJjb2xvci10b2tlblwiKS5jb2xvcjtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMl07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZW5jbG9zZVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsYWJlbDogZnVuY05hbWUsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgIGJvZHk6IGJvZHlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZW5jbG9zZV9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogZW5jbG9zZV9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJlbmNsb3NlXCIsXG4gIG5hbWVzOiBbXCJcXFxcZmJveFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIGFyZ1R5cGVzOiBbXCJoYm94XCJdLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMywgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMy5wYXJzZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZW5jbG9zZVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsYWJlbDogXCJcXFxcZmJveFwiLFxuICAgICAgYm9keTogYXJnc1swXVxuICAgIH07XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImVuY2xvc2VcIixcbiAgbmFtZXM6IFtcIlxcXFxjYW5jZWxcIiwgXCJcXFxcYmNhbmNlbFwiLCBcIlxcXFx4Y2FuY2VsXCIsIFwiXFxcXHNvdXRcIiwgXCJcXFxccGhhc2VcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY0LCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY0LnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmNC5mdW5jTmFtZTtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZW5jbG9zZVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsYWJlbDogZnVuY05hbWUsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGVuY2xvc2VfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGVuY2xvc2VfbWF0aG1sQnVpbGRlclxufSk7XG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiZW5jbG9zZVwiLFxuICBuYW1lczogW1wiXFxcXGFuZ2xcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhcmdUeXBlczogW1wiaGJveFwiXSxcbiAgICBhbGxvd2VkSW5UZXh0OiBmYWxzZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY1LCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY1LnBhcnNlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlbmNsb3NlXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGxhYmVsOiBcIlxcXFxhbmdsXCIsXG4gICAgICBib2R5OiBhcmdzWzBdXG4gICAgfTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGVmaW5lRW52aXJvbm1lbnQuanNcblxuXG4vKipcbiAqIEFsbCByZWdpc3RlcmVkIGVudmlyb25tZW50cy5cbiAqIGBlbnZpcm9ubWVudHMuanNgIGV4cG9ydHMgdGhpcyBzYW1lIGRpY3Rpb25hcnkgYWdhaW4gYW5kIG1ha2VzIGl0IHB1YmxpYy5cbiAqIGBQYXJzZXIuanNgIHJlcXVpcmVzIHRoaXMgZGljdGlvbmFyeSB2aWEgYGVudmlyb25tZW50cy5qc2AuXG4gKi9cbnZhciBfZW52aXJvbm1lbnRzID0ge307XG5mdW5jdGlvbiBkZWZpbmVFbnZpcm9ubWVudChfcmVmKSB7XG4gIHZhciB0eXBlID0gX3JlZi50eXBlLFxuICAgICAgbmFtZXMgPSBfcmVmLm5hbWVzLFxuICAgICAgcHJvcHMgPSBfcmVmLnByb3BzLFxuICAgICAgaGFuZGxlciA9IF9yZWYuaGFuZGxlcixcbiAgICAgIGh0bWxCdWlsZGVyID0gX3JlZi5odG1sQnVpbGRlcixcbiAgICAgIG1hdGhtbEJ1aWxkZXIgPSBfcmVmLm1hdGhtbEJ1aWxkZXI7XG4gIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBvZiBlbnZpcm9ubWVudHMuXG4gIHZhciBkYXRhID0ge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgbnVtQXJnczogcHJvcHMubnVtQXJncyB8fCAwLFxuICAgIGFsbG93ZWRJblRleHQ6IGZhbHNlLFxuICAgIG51bU9wdGlvbmFsQXJnczogMCxcbiAgICBoYW5kbGVyOiBoYW5kbGVyXG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgIC8vIFRPRE86IFRoZSB2YWx1ZSB0eXBlIG9mIF9lbnZpcm9ubWVudHMgc2hvdWxkIGJlIGEgdHlwZSB1bmlvbiBvZiBhbGxcbiAgICAvLyBwb3NzaWJsZSBgRW52U3BlYzw+YCBwb3NzaWJpbGl0aWVzIGluc3RlYWQgb2YgYEVudlNwZWM8Kj5gLCB3aGljaCBpc1xuICAgIC8vIGFuIGV4aXN0ZW50aWFsIHR5cGUuXG4gICAgX2Vudmlyb25tZW50c1tuYW1lc1tpXV0gPSBkYXRhO1xuICB9XG5cbiAgaWYgKGh0bWxCdWlsZGVyKSB7XG4gICAgX2h0bWxHcm91cEJ1aWxkZXJzW3R5cGVdID0gaHRtbEJ1aWxkZXI7XG4gIH1cblxuICBpZiAobWF0aG1sQnVpbGRlcikge1xuICAgIF9tYXRobWxHcm91cEJ1aWxkZXJzW3R5cGVdID0gbWF0aG1sQnVpbGRlcjtcbiAgfVxufVxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2RlZmluZU1hY3JvLmpzXG5cblxuLyoqXG4gKiBBbGwgcmVnaXN0ZXJlZCBnbG9iYWwvYnVpbHQtaW4gbWFjcm9zLlxuICogYG1hY3Jvcy5qc2AgZXhwb3J0cyB0aGlzIHNhbWUgZGljdGlvbmFyeSBhZ2FpbiBhbmQgbWFrZXMgaXQgcHVibGljLlxuICogYFBhcnNlci5qc2AgcmVxdWlyZXMgdGhpcyBkaWN0aW9uYXJ5IHZpYSBgbWFjcm9zLmpzYC5cbiAqL1xudmFyIF9tYWNyb3MgPSB7fTsgLy8gVGhpcyBmdW5jdGlvbiBtaWdodCBvbmUgZGF5IGFjY2VwdCBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IGFuZCBkbyBtb3JlIHRoaW5ncy5cblxuZnVuY3Rpb24gZGVmaW5lTWFjcm8obmFtZSwgYm9keSkge1xuICBfbWFjcm9zW25hbWVdID0gYm9keTtcbn1cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9Tb3VyY2VMb2NhdGlvbi5qc1xuLyoqXG4gKiBMZXhpbmcgb3IgcGFyc2luZyBwb3NpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBlcnJvciByZXBvcnRpbmcuXG4gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUuXG4gKi9cbnZhciBTb3VyY2VMb2NhdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIFRoZSArIHByZWZpeCBpbmRpY2F0ZXMgdGhhdCB0aGVzZSBmaWVsZHMgYXJlbid0IHdyaXRlYWJsZVxuICAvLyBMZXhlciBob2xkaW5nIHRoZSBpbnB1dCBzdHJpbmcuXG4gIC8vIFN0YXJ0IG9mZnNldCwgemVyby1iYXNlZCBpbmNsdXNpdmUuXG4gIC8vIEVuZCBvZmZzZXQsIHplcm8tYmFzZWQgZXhjbHVzaXZlLlxuICBmdW5jdGlvbiBTb3VyY2VMb2NhdGlvbihsZXhlciwgc3RhcnQsIGVuZCkge1xuICAgIHRoaXMubGV4ZXIgPSB2b2lkIDA7XG4gICAgdGhpcy5zdGFydCA9IHZvaWQgMDtcbiAgICB0aGlzLmVuZCA9IHZvaWQgMDtcbiAgICB0aGlzLmxleGVyID0gbGV4ZXI7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG4gIC8qKlxuICAgKiBNZXJnZXMgdHdvIGBTb3VyY2VMb2NhdGlvbmBzIGZyb20gbG9jYXRpb24gcHJvdmlkZXJzLCBnaXZlbiB0aGV5IGFyZVxuICAgKiBwcm92aWRlZCBpbiBvcmRlciBvZiBhcHBlYXJhbmNlLlxuICAgKiAtIFJldHVybnMgdGhlIGZpcnN0IG9uZSdzIGxvY2F0aW9uIGlmIG9ubHkgdGhlIGZpcnN0IGlzIHByb3ZpZGVkLlxuICAgKiAtIFJldHVybnMgYSBtZXJnZWQgcmFuZ2Ugb2YgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBpZiBib3RoIGFyZSBwcm92aWRlZFxuICAgKiAgIGFuZCB0aGVpciBsZXhlcnMgbWF0Y2guXG4gICAqIC0gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuXG4gICAqL1xuXG5cbiAgU291cmNlTG9jYXRpb24ucmFuZ2UgPSBmdW5jdGlvbiByYW5nZShmaXJzdCwgc2Vjb25kKSB7XG4gICAgaWYgKCFzZWNvbmQpIHtcbiAgICAgIHJldHVybiBmaXJzdCAmJiBmaXJzdC5sb2M7XG4gICAgfSBlbHNlIGlmICghZmlyc3QgfHwgIWZpcnN0LmxvYyB8fCAhc2Vjb25kLmxvYyB8fCBmaXJzdC5sb2MubGV4ZXIgIT09IHNlY29uZC5sb2MubGV4ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFNvdXJjZUxvY2F0aW9uKGZpcnN0LmxvYy5sZXhlciwgZmlyc3QubG9jLnN0YXJ0LCBzZWNvbmQubG9jLmVuZCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTb3VyY2VMb2NhdGlvbjtcbn0oKTtcblxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvVG9rZW4uanNcblxuLyoqXG4gKiBJbnRlcmZhY2UgcmVxdWlyZWQgdG8gYnJlYWsgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFRva2VuLCBMZXhlciwgYW5kXG4gKiBQYXJzZUVycm9yLlxuICovXG5cbi8qKlxuICogVGhlIHJlc3VsdGluZyB0b2tlbiByZXR1cm5lZCBmcm9tIGBsZXhgLlxuICpcbiAqIEl0IGNvbnNpc3RzIG9mIHRoZSB0b2tlbiB0ZXh0IHBsdXMgc29tZSBwb3NpdGlvbiBpbmZvcm1hdGlvbi5cbiAqIFRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBpcyBlc3NlbnRpYWxseSBhIHJhbmdlIGluIGFuIGlucHV0IHN0cmluZyxcbiAqIGJ1dCBpbnN0ZWFkIG9mIHJlZmVyZW5jaW5nIHRoZSBiYXJlIGlucHV0IHN0cmluZywgd2UgcmVmZXIgdG8gdGhlIGxleGVyLlxuICogVGhhdCB3YXkgaXQgaXMgcG9zc2libGUgdG8gYXR0YWNoIGV4dHJhIG1ldGFkYXRhIHRvIHRoZSBpbnB1dCBzdHJpbmcsXG4gKiBsaWtlIGZvciBleGFtcGxlIGEgZmlsZSBuYW1lIG9yIHNpbWlsYXIuXG4gKlxuICogVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBzbyBpdCBpcyBPSyB0byBjb25zdHJ1Y3Qgc3ludGhldGljXG4gKiB0b2tlbnMgaWYgYXBwcm9wcmlhdGUuIE5vdCBwcm92aWRpbmcgYXZhaWxhYmxlIHBvc2l0aW9uIGluZm9ybWF0aW9uIG1heVxuICogbGVhZCB0byBkZWdyYWRlZCBlcnJvciByZXBvcnRpbmcsIHRob3VnaC5cbiAqL1xudmFyIFRva2VuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLy8gZG9uJ3QgZXhwYW5kIHRoZSB0b2tlblxuICAvLyB1c2VkIGluIFxcbm9leHBhbmRcbiAgZnVuY3Rpb24gVG9rZW4odGV4dCwgLy8gdGhlIHRleHQgb2YgdGhpcyB0b2tlblxuICBsb2MpIHtcbiAgICB0aGlzLnRleHQgPSB2b2lkIDA7XG4gICAgdGhpcy5sb2MgPSB2b2lkIDA7XG4gICAgdGhpcy5ub2V4cGFuZCA9IHZvaWQgMDtcbiAgICB0aGlzLnRyZWF0QXNSZWxheCA9IHZvaWQgMDtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMubG9jID0gbG9jO1xuICB9XG4gIC8qKlxuICAgKiBHaXZlbiBhIHBhaXIgb2YgdG9rZW5zICh0aGlzIGFuZCBlbmRUb2tlbiksIGNvbXB1dGUgYSBgVG9rZW5gIGVuY29tcGFzc2luZ1xuICAgKiB0aGUgd2hvbGUgaW5wdXQgcmFuZ2UgZW5jbG9zZWQgYnkgdGhlc2UgdHdvLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBUb2tlbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJhbmdlID0gZnVuY3Rpb24gcmFuZ2UoZW5kVG9rZW4sIC8vIGxhc3QgdG9rZW4gb2YgdGhlIHJhbmdlLCBpbmNsdXNpdmVcbiAgdGV4dCAvLyB0aGUgdGV4dCBvZiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgdG9rZW5cbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlbih0ZXh0LCBTb3VyY2VMb2NhdGlvbi5yYW5nZSh0aGlzLCBlbmRUb2tlbikpO1xuICB9O1xuXG4gIHJldHVybiBUb2tlbjtcbn0oKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9lbnZpcm9ubWVudHMvYXJyYXkuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gSGVscGVyIGZ1bmN0aW9uc1xuZnVuY3Rpb24gZ2V0SExpbmVzKHBhcnNlcikge1xuICAvLyBSZXR1cm4gYW4gYXJyYXkuIFRoZSBhcnJheSBsZW5ndGggPSBudW1iZXIgb2YgaGxpbmVzLlxuICAvLyBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRlbGxzIGlmIHRoZSBsaW5lIGlzIGRhc2hlZC5cbiAgdmFyIGhsaW5lSW5mbyA9IFtdO1xuICBwYXJzZXIuY29uc3VtZVNwYWNlcygpO1xuICB2YXIgbnh0ID0gcGFyc2VyLmZldGNoKCkudGV4dDtcblxuICBpZiAobnh0ID09PSBcIlxcXFxyZWxheFwiKSB7XG4gICAgLy8gXFxyZWxheCBpcyBhbiBhcnRpZmFjdCBvZiB0aGUgXFxjciBtYWNybyBiZWxvd1xuICAgIHBhcnNlci5jb25zdW1lKCk7XG4gICAgcGFyc2VyLmNvbnN1bWVTcGFjZXMoKTtcbiAgICBueHQgPSBwYXJzZXIuZmV0Y2goKS50ZXh0O1xuICB9XG5cbiAgd2hpbGUgKG54dCA9PT0gXCJcXFxcaGxpbmVcIiB8fCBueHQgPT09IFwiXFxcXGhkYXNobGluZVwiKSB7XG4gICAgcGFyc2VyLmNvbnN1bWUoKTtcbiAgICBobGluZUluZm8ucHVzaChueHQgPT09IFwiXFxcXGhkYXNobGluZVwiKTtcbiAgICBwYXJzZXIuY29uc3VtZVNwYWNlcygpO1xuICAgIG54dCA9IHBhcnNlci5mZXRjaCgpLnRleHQ7XG4gIH1cblxuICByZXR1cm4gaGxpbmVJbmZvO1xufVxuXG52YXIgdmFsaWRhdGVBbXNFbnZpcm9ubWVudENvbnRleHQgPSBmdW5jdGlvbiB2YWxpZGF0ZUFtc0Vudmlyb25tZW50Q29udGV4dChjb250ZXh0KSB7XG4gIHZhciBzZXR0aW5ncyA9IGNvbnRleHQucGFyc2VyLnNldHRpbmdzO1xuXG4gIGlmICghc2V0dGluZ3MuZGlzcGxheU1vZGUpIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJ7XCIgKyBjb250ZXh0LmVudk5hbWUgKyBcIn0gY2FuIGJlIHVzZWQgb25seSBpblwiICsgXCIgZGlzcGxheSBtb2RlLlwiKTtcbiAgfVxufTsgLy8gYXV0b1RhZyAoYW4gYXJndW1lbnQgdG8gcGFyc2VBcnJheSkgY2FuIGJlIG9uZSBvZiB0aHJlZSB2YWx1ZXM6XG4vLyAqIHVuZGVmaW5lZDogUmVndWxhciAobm90LXRvcC1sZXZlbCkgYXJyYXk7IG5vIHRhZ3Mgb24gZWFjaCByb3dcbi8vICogdHJ1ZTogQXV0b21hdGljIGVxdWF0aW9uIG51bWJlcmluZywgb3ZlcnJpZGFibGUgYnkgXFx0YWdcbi8vICogZmFsc2U6IFRhZ3MgYWxsb3dlZCBvbiBlYWNoIHJvdywgYnV0IG5vIGF1dG9tYXRpYyBudW1iZXJpbmdcbi8vIFRoaXMgZnVuY3Rpb24gKmRvZXNuJ3QqIHdvcmsgd2l0aCB0aGUgXCJzcGxpdFwiIGVudmlyb25tZW50IG5hbWUuXG5cblxuZnVuY3Rpb24gZ2V0QXV0b1RhZyhuYW1lKSB7XG4gIGlmIChuYW1lLmluZGV4T2YoXCJlZFwiKSA9PT0gLTEpIHtcbiAgICByZXR1cm4gbmFtZS5pbmRleE9mKFwiKlwiKSA9PT0gLTE7XG4gIH0gLy8gcmV0dXJuIHVuZGVmaW5lZDtcblxufVxuLyoqXG4gKiBQYXJzZSB0aGUgYm9keSBvZiB0aGUgZW52aXJvbm1lbnQsIHdpdGggcm93cyBkZWxpbWl0ZWQgYnkgXFxcXCBhbmRcbiAqIGNvbHVtbnMgZGVsaW1pdGVkIGJ5ICYsIGFuZCBjcmVhdGUgYSBuZXN0ZWQgbGlzdCBpbiByb3ctbWFqb3Igb3JkZXJcbiAqIHdpdGggb25lIGdyb3VwIHBlciBjZWxsLiAgSWYgZ2l2ZW4gYW4gb3B0aW9uYWwgYXJndW1lbnQgc3R5bGVcbiAqIChcInRleHRcIiwgXCJkaXNwbGF5XCIsIGV0Yy4pLCB0aGVuIGVhY2ggY2VsbCBpcyBjYXN0IGludG8gdGhhdCBzdHlsZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlQXJyYXkocGFyc2VyLCBfcmVmLCBzdHlsZSkge1xuICB2YXIgaHNraXBCZWZvcmVBbmRBZnRlciA9IF9yZWYuaHNraXBCZWZvcmVBbmRBZnRlcixcbiAgICAgIGFkZEpvdCA9IF9yZWYuYWRkSm90LFxuICAgICAgY29scyA9IF9yZWYuY29scyxcbiAgICAgIGFycmF5c3RyZXRjaCA9IF9yZWYuYXJyYXlzdHJldGNoLFxuICAgICAgY29sU2VwYXJhdGlvblR5cGUgPSBfcmVmLmNvbFNlcGFyYXRpb25UeXBlLFxuICAgICAgYXV0b1RhZyA9IF9yZWYuYXV0b1RhZyxcbiAgICAgIHNpbmdsZVJvdyA9IF9yZWYuc2luZ2xlUm93LFxuICAgICAgZW1wdHlTaW5nbGVSb3cgPSBfcmVmLmVtcHR5U2luZ2xlUm93LFxuICAgICAgbWF4TnVtQ29scyA9IF9yZWYubWF4TnVtQ29scyxcbiAgICAgIGxlcW5vID0gX3JlZi5sZXFubztcbiAgcGFyc2VyLmd1bGxldC5iZWdpbkdyb3VwKCk7XG5cbiAgaWYgKCFzaW5nbGVSb3cpIHtcbiAgICAvLyBcXGNyIGlzIGVxdWl2YWxlbnQgdG8gXFxcXCB3aXRob3V0IHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IChzZWUgYmVsb3cpXG4gICAgLy8gVE9ETzogcHJvdmlkZSBoZWxwZnVsIGVycm9yIHdoZW4gXFxjciBpcyB1c2VkIG91dHNpZGUgYXJyYXkgZW52aXJvbm1lbnRcbiAgICBwYXJzZXIuZ3VsbGV0Lm1hY3Jvcy5zZXQoXCJcXFxcY3JcIiwgXCJcXFxcXFxcXFxcXFxyZWxheFwiKTtcbiAgfSAvLyBHZXQgY3VycmVudCBhcnJheXN0cmV0Y2ggaWYgaXQncyBub3Qgc2V0IGJ5IHRoZSBlbnZpcm9ubWVudFxuXG5cbiAgaWYgKCFhcnJheXN0cmV0Y2gpIHtcbiAgICB2YXIgc3RyZXRjaCA9IHBhcnNlci5ndWxsZXQuZXhwYW5kTWFjcm9Bc1RleHQoXCJcXFxcYXJyYXlzdHJldGNoXCIpO1xuXG4gICAgaWYgKHN0cmV0Y2ggPT0gbnVsbCkge1xuICAgICAgLy8gRGVmYXVsdCBcXGFycmF5c3RyZXRjaCBmcm9tIGx0dGFiLmR0eFxuICAgICAgYXJyYXlzdHJldGNoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyYXlzdHJldGNoID0gcGFyc2VGbG9hdChzdHJldGNoKTtcblxuICAgICAgaWYgKCFhcnJheXN0cmV0Y2ggfHwgYXJyYXlzdHJldGNoIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJJbnZhbGlkIFxcXFxhcnJheXN0cmV0Y2g6IFwiICsgc3RyZXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFN0YXJ0IGdyb3VwIGZvciBmaXJzdCBjZWxsXG5cblxuICBwYXJzZXIuZ3VsbGV0LmJlZ2luR3JvdXAoKTtcbiAgdmFyIHJvdyA9IFtdO1xuICB2YXIgYm9keSA9IFtyb3ddO1xuICB2YXIgcm93R2FwcyA9IFtdO1xuICB2YXIgaExpbmVzQmVmb3JlUm93ID0gW107XG4gIHZhciB0YWdzID0gYXV0b1RhZyAhPSBudWxsID8gW10gOiB1bmRlZmluZWQ7IC8vIGFtc21hdGggdXNlcyBcXGdsb2JhbFxcQGVxbnN3dHJ1ZSBhbmQgXFxnbG9iYWxcXEBlcW5zd2ZhbHNlIHRvIHJlcHJlc2VudFxuICAvLyB3aGV0aGVyIHRoaXMgcm93IHNob3VsZCBoYXZlIGFuIGVxdWF0aW9uIG51bWJlci4gIFNpbXVsYXRlIHRoaXMgd2l0aFxuICAvLyBhIFxcQGVxbnN3IG1hY3JvIHNldCB0byAxIG9yIDAuXG5cbiAgZnVuY3Rpb24gYmVnaW5Sb3coKSB7XG4gICAgaWYgKGF1dG9UYWcpIHtcbiAgICAgIHBhcnNlci5ndWxsZXQubWFjcm9zLnNldChcIlxcXFxAZXFuc3dcIiwgXCIxXCIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZFJvdygpIHtcbiAgICBpZiAodGFncykge1xuICAgICAgaWYgKHBhcnNlci5ndWxsZXQubWFjcm9zLmdldChcIlxcXFxkZkB0YWdcIikpIHtcbiAgICAgICAgdGFncy5wdXNoKHBhcnNlci5zdWJwYXJzZShbbmV3IFRva2VuKFwiXFxcXGRmQHRhZ1wiKV0pKTtcbiAgICAgICAgcGFyc2VyLmd1bGxldC5tYWNyb3Muc2V0KFwiXFxcXGRmQHRhZ1wiLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFncy5wdXNoKEJvb2xlYW4oYXV0b1RhZykgJiYgcGFyc2VyLmd1bGxldC5tYWNyb3MuZ2V0KFwiXFxcXEBlcW5zd1wiKSA9PT0gXCIxXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJlZ2luUm93KCk7IC8vIFRlc3QgZm9yIFxcaGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgYXJyYXkuXG5cbiAgaExpbmVzQmVmb3JlUm93LnB1c2goZ2V0SExpbmVzKHBhcnNlcikpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAvLyBQYXJzZSBlYWNoIGNlbGwgaW4gaXRzIG93biBncm91cCAobmFtZXNwYWNlKVxuICAgIHZhciBjZWxsID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihmYWxzZSwgc2luZ2xlUm93ID8gXCJcXFxcZW5kXCIgOiBcIlxcXFxcXFxcXCIpO1xuICAgIHBhcnNlci5ndWxsZXQuZW5kR3JvdXAoKTtcbiAgICBwYXJzZXIuZ3VsbGV0LmJlZ2luR3JvdXAoKTtcbiAgICBjZWxsID0ge1xuICAgICAgdHlwZTogXCJvcmRncm91cFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBjZWxsXG4gICAgfTtcblxuICAgIGlmIChzdHlsZSkge1xuICAgICAgY2VsbCA9IHtcbiAgICAgICAgdHlwZTogXCJzdHlsaW5nXCIsXG4gICAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGJvZHk6IFtjZWxsXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByb3cucHVzaChjZWxsKTtcbiAgICB2YXIgbmV4dCA9IHBhcnNlci5mZXRjaCgpLnRleHQ7XG5cbiAgICBpZiAobmV4dCA9PT0gXCImXCIpIHtcbiAgICAgIGlmIChtYXhOdW1Db2xzICYmIHJvdy5sZW5ndGggPT09IG1heE51bUNvbHMpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvdyB8fCBjb2xTZXBhcmF0aW9uVHlwZSkge1xuICAgICAgICAgIC8vIHtlcXVhdGlvbn0gb3Ige3NwbGl0fVxuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlRvbyBtYW55IHRhYiBjaGFyYWN0ZXJzOiAmXCIsIHBhcnNlci5uZXh0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHthcnJheX0gZW52aXJvbm1lbnRcbiAgICAgICAgICBwYXJzZXIuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwidGV4dEVudlwiLCBcIlRvbyBmZXcgY29sdW1ucyBcIiArIFwic3BlY2lmaWVkIGluIHRoZSB7YXJyYXl9IGNvbHVtbiBhcmd1bWVudC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyc2VyLmNvbnN1bWUoKTtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiXFxcXGVuZFwiKSB7XG4gICAgICBlbmRSb3coKTsgLy8gQXJyYXlzIHRlcm1pbmF0ZSBuZXdsaW5lcyB3aXRoIGBcXGNyY3JgIHdoaWNoIGNvbnN1bWVzIGEgYFxcY3JgIGlmXG4gICAgICAvLyB0aGUgbGFzdCBsaW5lIGlzIGVtcHR5LiAgSG93ZXZlciwgQU1TIGVudmlyb25tZW50cyBrZWVwIHRoZVxuICAgICAgLy8gZW1wdHkgcm93IGlmIGl0J3MgdGhlIG9ubHkgb25lLlxuICAgICAgLy8gTk9URTogQ3VycmVudGx5LCBgY2VsbGAgaXMgdGhlIGxhc3QgaXRlbSBhZGRlZCBpbnRvIGByb3dgLlxuXG4gICAgICBpZiAocm93Lmxlbmd0aCA9PT0gMSAmJiBjZWxsLnR5cGUgPT09IFwic3R5bGluZ1wiICYmIGNlbGwuYm9keVswXS5ib2R5Lmxlbmd0aCA9PT0gMCAmJiAoYm9keS5sZW5ndGggPiAxIHx8ICFlbXB0eVNpbmdsZVJvdykpIHtcbiAgICAgICAgYm9keS5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhMaW5lc0JlZm9yZVJvdy5sZW5ndGggPCBib2R5Lmxlbmd0aCArIDEpIHtcbiAgICAgICAgaExpbmVzQmVmb3JlUm93LnB1c2goW10pO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiXFxcXFxcXFxcIikge1xuICAgICAgcGFyc2VyLmNvbnN1bWUoKTtcbiAgICAgIHZhciBzaXplID0gdm9pZCAwOyAvLyBcXGRlZlxcTGV0QHtcXGxldFxcXFxcXG1hdGhAY3J9XG4gICAgICAvLyBcXGRlZlxcbWF0aEBjcnsuLi5cXG1hdGhAY3JAfVxuICAgICAgLy8gXFxkZWZcXG1hdGhAY3JAe1xcbmV3QGlmbmV4dGNoYXJbXFxtYXRoQGNyQEB7XFxtYXRoQGNyQEBbXFx6QF19fVxuICAgICAgLy8gXFxkZWZcXG1hdGhAY3JAQFsjMV17Li4uXFxtYXRoQGNyQEBALi4ufVxuICAgICAgLy8gXFxkZWZcXG1hdGhAY3JAQEB7XFxjcn1cblxuICAgICAgaWYgKHBhcnNlci5ndWxsZXQuZnV0dXJlKCkudGV4dCAhPT0gXCIgXCIpIHtcbiAgICAgICAgc2l6ZSA9IHBhcnNlci5wYXJzZVNpemVHcm91cCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcm93R2Fwcy5wdXNoKHNpemUgPyBzaXplLnZhbHVlIDogbnVsbCk7XG4gICAgICBlbmRSb3coKTsgLy8gY2hlY2sgZm9yIFxcaGxpbmUocykgZm9sbG93aW5nIHRoZSByb3cgc2VwYXJhdG9yXG5cbiAgICAgIGhMaW5lc0JlZm9yZVJvdy5wdXNoKGdldEhMaW5lcyhwYXJzZXIpKTtcbiAgICAgIHJvdyA9IFtdO1xuICAgICAgYm9keS5wdXNoKHJvdyk7XG4gICAgICBiZWdpblJvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCAmIG9yIFxcXFxcXFxcIG9yIFxcXFxjciBvciBcXFxcZW5kXCIsIHBhcnNlci5uZXh0VG9rZW4pO1xuICAgIH1cbiAgfSAvLyBFbmQgY2VsbCBncm91cFxuXG5cbiAgcGFyc2VyLmd1bGxldC5lbmRHcm91cCgpOyAvLyBFbmQgYXJyYXkgZ3JvdXAgZGVmaW5pbmcgXFxjclxuXG4gIHBhcnNlci5ndWxsZXQuZW5kR3JvdXAoKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgYWRkSm90OiBhZGRKb3QsXG4gICAgYXJyYXlzdHJldGNoOiBhcnJheXN0cmV0Y2gsXG4gICAgYm9keTogYm9keSxcbiAgICBjb2xzOiBjb2xzLFxuICAgIHJvd0dhcHM6IHJvd0dhcHMsXG4gICAgaHNraXBCZWZvcmVBbmRBZnRlcjogaHNraXBCZWZvcmVBbmRBZnRlcixcbiAgICBoTGluZXNCZWZvcmVSb3c6IGhMaW5lc0JlZm9yZVJvdyxcbiAgICBjb2xTZXBhcmF0aW9uVHlwZTogY29sU2VwYXJhdGlvblR5cGUsXG4gICAgdGFnczogdGFncyxcbiAgICBsZXFubzogbGVxbm9cbiAgfTtcbn0gLy8gRGVjaWRlcyBvbiBhIHN0eWxlIGZvciBjZWxscyBpbiBhbiBhcnJheSBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgZ2l2ZW5cbi8vIGVudmlyb25tZW50IG5hbWUgc3RhcnRzIHdpdGggdGhlIGxldHRlciAnZCcuXG5cblxuZnVuY3Rpb24gZENlbGxTdHlsZShlbnZOYW1lKSB7XG4gIGlmIChlbnZOYW1lLnNsaWNlKDAsIDEpID09PSBcImRcIikge1xuICAgIHJldHVybiBcImRpc3BsYXlcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbn1cblxudmFyIGFycmF5X2h0bWxCdWlsZGVyID0gZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIHI7XG4gIHZhciBjO1xuICB2YXIgbnIgPSBncm91cC5ib2R5Lmxlbmd0aDtcbiAgdmFyIGhMaW5lc0JlZm9yZVJvdyA9IGdyb3VwLmhMaW5lc0JlZm9yZVJvdztcbiAgdmFyIG5jID0gMDtcbiAgdmFyIGJvZHkgPSBuZXcgQXJyYXkobnIpO1xuICB2YXIgaGxpbmVzID0gW107XG4gIHZhciBydWxlVGhpY2tuZXNzID0gTWF0aC5tYXgoIC8vIEZyb20gTGFUZVggXFxzaG93dGhlXFxhcnJheXJ1bGV3aWR0aC4gRXF1YWxzIDAuMDQgZW0uXG4gIG9wdGlvbnMuZm9udE1ldHJpY3MoKS5hcnJheVJ1bGVXaWR0aCwgb3B0aW9ucy5taW5SdWxlVGhpY2tuZXNzIC8vIFVzZXIgb3ZlcnJpZGUuXG4gICk7IC8vIEhvcml6b250YWwgc3BhY2luZ1xuXG4gIHZhciBwdCA9IDEgLyBvcHRpb25zLmZvbnRNZXRyaWNzKCkucHRQZXJFbTtcbiAgdmFyIGFycmF5Y29sc2VwID0gNSAqIHB0OyAvLyBkZWZhdWx0IHZhbHVlLCBpLmUuIFxcYXJyYXljb2xzZXAgaW4gYXJ0aWNsZS5jbHNcblxuICBpZiAoZ3JvdXAuY29sU2VwYXJhdGlvblR5cGUgJiYgZ3JvdXAuY29sU2VwYXJhdGlvblR5cGUgPT09IFwic21hbGxcIikge1xuICAgIC8vIFdlJ3JlIGluIGEge3NtYWxsbWF0cml4fS4gRGVmYXVsdCBjb2x1bW4gc3BhY2UgaXMgXFx0aGlja3NwYWNlLFxuICAgIC8vIGkuZS4gNS8xOGVtID0gMC4yNzc4ZW0sIHBlciBhbXNtYXRoLmR0eCBmb3Ige3NtYWxsbWF0cml4fS5cbiAgICAvLyBCdXQgdGhhdCBuZWVkcyBhZGp1c3RtZW50IGJlY2F1c2UgTGFUZVggYXBwbGllcyBcXHNjcmlwdHN0eWxlIHRvIHRoZVxuICAgIC8vIGVudGlyZSBhcnJheSwgaW5jbHVkaW5nIHRoZSBjb2xzcGFjZSwgYnV0IHRoaXMgZnVuY3Rpb24gYXBwbGllc1xuICAgIC8vIFxcc2NyaXB0c3R5bGUgb25seSBpbnNpZGUgZWFjaCBlbGVtZW50LlxuICAgIHZhciBsb2NhbE11bHRpcGxpZXIgPSBvcHRpb25zLmhhdmluZ1N0eWxlKHNyY19TdHlsZS5TQ1JJUFQpLnNpemVNdWx0aXBsaWVyO1xuICAgIGFycmF5Y29sc2VwID0gMC4yNzc4ICogKGxvY2FsTXVsdGlwbGllciAvIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXIpO1xuICB9IC8vIFZlcnRpY2FsIHNwYWNpbmdcblxuXG4gIHZhciBiYXNlbGluZXNraXAgPSBncm91cC5jb2xTZXBhcmF0aW9uVHlwZSA9PT0gXCJDRFwiID8gY2FsY3VsYXRlU2l6ZSh7XG4gICAgbnVtYmVyOiAzLFxuICAgIHVuaXQ6IFwiZXhcIlxuICB9LCBvcHRpb25zKSA6IDEyICogcHQ7IC8vIHNlZSBzaXplMTAuY2xvXG4gIC8vIERlZmF1bHQgXFxqb3QgZnJvbSBsdG1hdGguZHR4XG4gIC8vIFRPRE8oZWRlbWFpbmUpOiBhbGxvdyBvdmVycmlkaW5nIFxcam90IHZpYSBcXHNldGxlbmd0aCAoIzY4NylcblxuICB2YXIgam90ID0gMyAqIHB0O1xuICB2YXIgYXJyYXlza2lwID0gZ3JvdXAuYXJyYXlzdHJldGNoICogYmFzZWxpbmVza2lwO1xuICB2YXIgYXJzdHJ1dEhlaWdodCA9IDAuNyAqIGFycmF5c2tpcDsgLy8gXFxzdHJ1dGJveCBpbiBsdGZzc3RyYy5kdHggYW5kXG5cbiAgdmFyIGFyc3RydXREZXB0aCA9IDAuMyAqIGFycmF5c2tpcDsgLy8gXFxAYXJzdHJ1dGJveCBpbiBsdHRhYi5kdHhcblxuICB2YXIgdG90YWxIZWlnaHQgPSAwOyAvLyBTZXQgYSBwb3NpdGlvbiBmb3IgXFxobGluZShzKSBhdCB0aGUgdG9wIG9mIHRoZSBhcnJheSwgaWYgYW55LlxuXG4gIGZ1bmN0aW9uIHNldEhMaW5lUG9zKGhsaW5lc0luR2FwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBobGluZXNJbkdhcC5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHRvdGFsSGVpZ2h0ICs9IDAuMjU7XG4gICAgICB9XG5cbiAgICAgIGhsaW5lcy5wdXNoKHtcbiAgICAgICAgcG9zOiB0b3RhbEhlaWdodCxcbiAgICAgICAgaXNEYXNoZWQ6IGhsaW5lc0luR2FwW2ldXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRITGluZVBvcyhoTGluZXNCZWZvcmVSb3dbMF0pO1xuXG4gIGZvciAociA9IDA7IHIgPCBncm91cC5ib2R5Lmxlbmd0aDsgKytyKSB7XG4gICAgdmFyIGlucm93ID0gZ3JvdXAuYm9keVtyXTtcbiAgICB2YXIgaGVpZ2h0ID0gYXJzdHJ1dEhlaWdodDsgLy8gXFxAYXJyYXkgYWRkcyBhbiBcXEBhcnN0cnV0XG5cbiAgICB2YXIgZGVwdGggPSBhcnN0cnV0RGVwdGg7IC8vIHRvIGVhY2ggdG93ICh2aWEgdGhlIHRlbXBsYXRlKVxuXG4gICAgaWYgKG5jIDwgaW5yb3cubGVuZ3RoKSB7XG4gICAgICBuYyA9IGlucm93Lmxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgb3V0cm93ID0gbmV3IEFycmF5KGlucm93Lmxlbmd0aCk7XG5cbiAgICBmb3IgKGMgPSAwOyBjIDwgaW5yb3cubGVuZ3RoOyArK2MpIHtcbiAgICAgIHZhciBlbHQgPSBidWlsZEdyb3VwKGlucm93W2NdLCBvcHRpb25zKTtcblxuICAgICAgaWYgKGRlcHRoIDwgZWx0LmRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gZWx0LmRlcHRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGVpZ2h0IDwgZWx0LmhlaWdodCkge1xuICAgICAgICBoZWlnaHQgPSBlbHQuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBvdXRyb3dbY10gPSBlbHQ7XG4gICAgfVxuXG4gICAgdmFyIHJvd0dhcCA9IGdyb3VwLnJvd0dhcHNbcl07XG4gICAgdmFyIGdhcCA9IDA7XG5cbiAgICBpZiAocm93R2FwKSB7XG4gICAgICBnYXAgPSBjYWxjdWxhdGVTaXplKHJvd0dhcCwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChnYXAgPiAwKSB7XG4gICAgICAgIC8vIFxcQGFyZ2FycmF5Y3JcbiAgICAgICAgZ2FwICs9IGFyc3RydXREZXB0aDtcblxuICAgICAgICBpZiAoZGVwdGggPCBnYXApIHtcbiAgICAgICAgICBkZXB0aCA9IGdhcDsgLy8gXFxAeGFyZ2FycmF5Y3JcbiAgICAgICAgfVxuXG4gICAgICAgIGdhcCA9IDA7XG4gICAgICB9XG4gICAgfSAvLyBJbiBBTVMgbXVsdGlsaW5lIGVudmlyb25tZW50cyBzdWNoIGFzIGFsaWduZWQgYW5kIGdhdGhlcmVkLCByb3dzXG4gICAgLy8gY29ycmVzcG9uZCB0byBsaW5lcyB0aGF0IGhhdmUgYWRkaXRpb25hbCBcXGpvdCBhZGRlZCB0byB0aGVcbiAgICAvLyBcXGJhc2VsaW5lc2tpcCB2aWEgXFxvcGVudXAuXG5cblxuICAgIGlmIChncm91cC5hZGRKb3QpIHtcbiAgICAgIGRlcHRoICs9IGpvdDtcbiAgICB9XG5cbiAgICBvdXRyb3cuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIG91dHJvdy5kZXB0aCA9IGRlcHRoO1xuICAgIHRvdGFsSGVpZ2h0ICs9IGhlaWdodDtcbiAgICBvdXRyb3cucG9zID0gdG90YWxIZWlnaHQ7XG4gICAgdG90YWxIZWlnaHQgKz0gZGVwdGggKyBnYXA7IC8vIFxcQHlhcmdhcnJheWNyXG5cbiAgICBib2R5W3JdID0gb3V0cm93OyAvLyBTZXQgYSBwb3NpdGlvbiBmb3IgXFxobGluZShzKSwgaWYgYW55LlxuXG4gICAgc2V0SExpbmVQb3MoaExpbmVzQmVmb3JlUm93W3IgKyAxXSk7XG4gIH1cblxuICB2YXIgb2Zmc2V0ID0gdG90YWxIZWlnaHQgLyAyICsgb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQ7XG4gIHZhciBjb2xEZXNjcmlwdGlvbnMgPSBncm91cC5jb2xzIHx8IFtdO1xuICB2YXIgY29scyA9IFtdO1xuICB2YXIgY29sU2VwO1xuICB2YXIgY29sRGVzY3JOdW07XG4gIHZhciB0YWdTcGFucyA9IFtdO1xuXG4gIGlmIChncm91cC50YWdzICYmIGdyb3VwLnRhZ3Muc29tZShmdW5jdGlvbiAodGFnKSB7XG4gICAgcmV0dXJuIHRhZztcbiAgfSkpIHtcbiAgICAvLyBBbiBlbnZpcm9ubWVudCB3aXRoIG1hbnVhbCB0YWdzIGFuZC9vciBhdXRvbWF0aWMgZXF1YXRpb24gbnVtYmVycy5cbiAgICAvLyBDcmVhdGUgbm9kZShzKSwgdGhlIGxhdHRlciBvZiB3aGljaCB0cmlnZ2VyIENTUyBjb3VudGVyIGluY3JlbWVudC5cbiAgICBmb3IgKHIgPSAwOyByIDwgbnI7ICsrcikge1xuICAgICAgdmFyIHJ3ID0gYm9keVtyXTtcbiAgICAgIHZhciBzaGlmdCA9IHJ3LnBvcyAtIG9mZnNldDtcbiAgICAgIHZhciB0YWcgPSBncm91cC50YWdzW3JdO1xuICAgICAgdmFyIHRhZ1NwYW4gPSB2b2lkIDA7XG5cbiAgICAgIGlmICh0YWcgPT09IHRydWUpIHtcbiAgICAgICAgLy8gYXV0b21hdGljIG51bWJlcmluZ1xuICAgICAgICB0YWdTcGFuID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiZXFuLW51bVwiXSwgW10sIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIFxcbm9udW1iZXIvXFxub3RhZyBvciBzdGFycmVkIGVudmlyb25tZW50XG4gICAgICAgIHRhZ1NwYW4gPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXSwgW10sIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWFudWFsIFxcdGFnXG4gICAgICAgIHRhZ1NwYW4gPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXSwgYnVpbGRFeHByZXNzaW9uKHRhZywgb3B0aW9ucywgdHJ1ZSksIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICB0YWdTcGFuLmRlcHRoID0gcncuZGVwdGg7XG4gICAgICB0YWdTcGFuLmhlaWdodCA9IHJ3LmhlaWdodDtcbiAgICAgIHRhZ1NwYW5zLnB1c2goe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogdGFnU3BhbixcbiAgICAgICAgc2hpZnQ6IHNoaWZ0XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGMgPSAwLCBjb2xEZXNjck51bSA9IDA7IC8vIENvbnRpbnVlIHdoaWxlIGVpdGhlciB0aGVyZSBhcmUgbW9yZSBjb2x1bW5zIG9yIG1vcmUgY29sdW1uXG4gIC8vIGRlc2NyaXB0aW9ucywgc28gdHJhaWxpbmcgc2VwYXJhdG9ycyBkb24ndCBnZXQgbG9zdC5cbiAgYyA8IG5jIHx8IGNvbERlc2NyTnVtIDwgY29sRGVzY3JpcHRpb25zLmxlbmd0aDsgKytjLCArK2NvbERlc2NyTnVtKSB7XG4gICAgdmFyIGNvbERlc2NyID0gY29sRGVzY3JpcHRpb25zW2NvbERlc2NyTnVtXSB8fCB7fTtcbiAgICB2YXIgZmlyc3RTZXBhcmF0b3IgPSB0cnVlO1xuXG4gICAgd2hpbGUgKGNvbERlc2NyLnR5cGUgPT09IFwic2VwYXJhdG9yXCIpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2VwYXJhdG9yIGluIGEgcm93LCBhZGQgYSBzcGFjZVxuICAgICAgLy8gYmV0d2VlbiB0aGVtLlxuICAgICAgaWYgKCFmaXJzdFNlcGFyYXRvcikge1xuICAgICAgICBjb2xTZXAgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJhcnJheWNvbHNlcFwiXSwgW10pO1xuICAgICAgICBjb2xTZXAuc3R5bGUud2lkdGggPSBtYWtlRW0ob3B0aW9ucy5mb250TWV0cmljcygpLmRvdWJsZVJ1bGVTZXApO1xuICAgICAgICBjb2xzLnB1c2goY29sU2VwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbERlc2NyLnNlcGFyYXRvciA9PT0gXCJ8XCIgfHwgY29sRGVzY3Iuc2VwYXJhdG9yID09PSBcIjpcIikge1xuICAgICAgICB2YXIgbGluZVR5cGUgPSBjb2xEZXNjci5zZXBhcmF0b3IgPT09IFwifFwiID8gXCJzb2xpZFwiIDogXCJkYXNoZWRcIjtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcInZlcnRpY2FsLXNlcGFyYXRvclwiXSwgW10sIG9wdGlvbnMpO1xuICAgICAgICBzZXBhcmF0b3Iuc3R5bGUuaGVpZ2h0ID0gbWFrZUVtKHRvdGFsSGVpZ2h0KTtcbiAgICAgICAgc2VwYXJhdG9yLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSBtYWtlRW0ocnVsZVRoaWNrbmVzcyk7XG4gICAgICAgIHNlcGFyYXRvci5zdHlsZS5ib3JkZXJSaWdodFN0eWxlID0gbGluZVR5cGU7XG4gICAgICAgIHNlcGFyYXRvci5zdHlsZS5tYXJnaW4gPSBcIjAgXCIgKyBtYWtlRW0oLXJ1bGVUaGlja25lc3MgLyAyKTtcblxuICAgICAgICB2YXIgX3NoaWZ0ID0gdG90YWxIZWlnaHQgLSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKF9zaGlmdCkge1xuICAgICAgICAgIHNlcGFyYXRvci5zdHlsZS52ZXJ0aWNhbEFsaWduID0gbWFrZUVtKC1fc2hpZnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29scy5wdXNoKHNlcGFyYXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJJbnZhbGlkIHNlcGFyYXRvciB0eXBlOiBcIiArIGNvbERlc2NyLnNlcGFyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbERlc2NyTnVtKys7XG4gICAgICBjb2xEZXNjciA9IGNvbERlc2NyaXB0aW9uc1tjb2xEZXNjck51bV0gfHwge307XG4gICAgICBmaXJzdFNlcGFyYXRvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjID49IG5jKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Vwd2lkdGggPSB2b2lkIDA7XG5cbiAgICBpZiAoYyA+IDAgfHwgZ3JvdXAuaHNraXBCZWZvcmVBbmRBZnRlcikge1xuICAgICAgc2Vwd2lkdGggPSB1dGlscy5kZWZsdChjb2xEZXNjci5wcmVnYXAsIGFycmF5Y29sc2VwKTtcblxuICAgICAgaWYgKHNlcHdpZHRoICE9PSAwKSB7XG4gICAgICAgIGNvbFNlcCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImFycmF5Y29sc2VwXCJdLCBbXSk7XG4gICAgICAgIGNvbFNlcC5zdHlsZS53aWR0aCA9IG1ha2VFbShzZXB3aWR0aCk7XG4gICAgICAgIGNvbHMucHVzaChjb2xTZXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb2wgPSBbXTtcblxuICAgIGZvciAociA9IDA7IHIgPCBucjsgKytyKSB7XG4gICAgICB2YXIgcm93ID0gYm9keVtyXTtcbiAgICAgIHZhciBlbGVtID0gcm93W2NdO1xuXG4gICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBfc2hpZnQyID0gcm93LnBvcyAtIG9mZnNldDtcblxuICAgICAgZWxlbS5kZXB0aCA9IHJvdy5kZXB0aDtcbiAgICAgIGVsZW0uaGVpZ2h0ID0gcm93LmhlaWdodDtcbiAgICAgIGNvbC5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGVsZW0sXG4gICAgICAgIHNoaWZ0OiBfc2hpZnQyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb2wgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImluZGl2aWR1YWxTaGlmdFwiLFxuICAgICAgY2hpbGRyZW46IGNvbFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIGNvbCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImNvbC1hbGlnbi1cIiArIChjb2xEZXNjci5hbGlnbiB8fCBcImNcIildLCBbY29sXSk7XG4gICAgY29scy5wdXNoKGNvbCk7XG5cbiAgICBpZiAoYyA8IG5jIC0gMSB8fCBncm91cC5oc2tpcEJlZm9yZUFuZEFmdGVyKSB7XG4gICAgICBzZXB3aWR0aCA9IHV0aWxzLmRlZmx0KGNvbERlc2NyLnBvc3RnYXAsIGFycmF5Y29sc2VwKTtcblxuICAgICAgaWYgKHNlcHdpZHRoICE9PSAwKSB7XG4gICAgICAgIGNvbFNlcCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImFycmF5Y29sc2VwXCJdLCBbXSk7XG4gICAgICAgIGNvbFNlcC5zdHlsZS53aWR0aCA9IG1ha2VFbShzZXB3aWR0aCk7XG4gICAgICAgIGNvbHMucHVzaChjb2xTZXApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJvZHkgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtdGFibGVcIl0sIGNvbHMpOyAvLyBBZGQgXFxobGluZShzKSwgaWYgYW55LlxuXG4gIGlmIChobGluZXMubGVuZ3RoID4gMCkge1xuICAgIHZhciBsaW5lID0gYnVpbGRDb21tb24ubWFrZUxpbmVTcGFuKFwiaGxpbmVcIiwgb3B0aW9ucywgcnVsZVRoaWNrbmVzcyk7XG4gICAgdmFyIGRhc2hlcyA9IGJ1aWxkQ29tbW9uLm1ha2VMaW5lU3BhbihcImhkYXNobGluZVwiLCBvcHRpb25zLCBydWxlVGhpY2tuZXNzKTtcbiAgICB2YXIgdkxpc3RFbGVtcyA9IFt7XG4gICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgIGVsZW06IGJvZHksXG4gICAgICBzaGlmdDogMFxuICAgIH1dO1xuXG4gICAgd2hpbGUgKGhsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaGxpbmUgPSBobGluZXMucG9wKCk7XG4gICAgICB2YXIgbGluZVNoaWZ0ID0gaGxpbmUucG9zIC0gb2Zmc2V0O1xuXG4gICAgICBpZiAoaGxpbmUuaXNEYXNoZWQpIHtcbiAgICAgICAgdkxpc3RFbGVtcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgICBlbGVtOiBkYXNoZXMsXG4gICAgICAgICAgc2hpZnQ6IGxpbmVTaGlmdFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZMaXN0RWxlbXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogbGluZSxcbiAgICAgICAgICBzaGlmdDogbGluZVNoaWZ0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJvZHkgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImluZGl2aWR1YWxTaGlmdFwiLFxuICAgICAgY2hpbGRyZW46IHZMaXN0RWxlbXNcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0YWdTcGFucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiXSwgW2JvZHldLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXFuTnVtQ29sID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJpbmRpdmlkdWFsU2hpZnRcIixcbiAgICAgIGNoaWxkcmVuOiB0YWdTcGFuc1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIGVxbk51bUNvbCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcInRhZ1wiXSwgW2Vxbk51bUNvbF0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoW2JvZHksIGVxbk51bUNvbF0pO1xuICB9XG59O1xuXG52YXIgYWxpZ25NYXAgPSB7XG4gIGM6IFwiY2VudGVyIFwiLFxuICBsOiBcImxlZnQgXCIsXG4gIHI6IFwicmlnaHQgXCJcbn07XG5cbnZhciBhcnJheV9tYXRobWxCdWlsZGVyID0gZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICB2YXIgdGJsID0gW107XG4gIHZhciBnbHVlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGRcIiwgW10sIFtcIm10ci1nbHVlXCJdKTtcbiAgdmFyIHRhZyA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXRkXCIsIFtdLCBbXCJtbWwtZXFuLW51bVwiXSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5ib2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJ3ID0gZ3JvdXAuYm9keVtpXTtcbiAgICB2YXIgcm93ID0gW107XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ3Lmxlbmd0aDsgaisrKSB7XG4gICAgICByb3cucHVzaChuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm10ZFwiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChyd1tqXSwgb3B0aW9ucyldKSk7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwLnRhZ3MgJiYgZ3JvdXAudGFnc1tpXSkge1xuICAgICAgcm93LnVuc2hpZnQoZ2x1ZSk7XG4gICAgICByb3cucHVzaChnbHVlKTtcblxuICAgICAgaWYgKGdyb3VwLmxlcW5vKSB7XG4gICAgICAgIHJvdy51bnNoaWZ0KHRhZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3cucHVzaCh0YWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRibC5wdXNoKG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXRyXCIsIHJvdykpO1xuICB9XG5cbiAgdmFyIHRhYmxlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGFibGVcIiwgdGJsKTsgLy8gU2V0IGNvbHVtbiBhbGlnbm1lbnQsIHJvdyBzcGFjaW5nLCBjb2x1bW4gc3BhY2luZywgYW5kXG4gIC8vIGFycmF5IGxpbmVzIGJ5IHNldHRpbmcgYXR0cmlidXRlcyBvbiB0aGUgdGFibGUgZWxlbWVudC5cbiAgLy8gU2V0IHRoZSByb3cgc3BhY2luZy4gSW4gTWF0aE1MLCB3ZSBzcGVjaWZ5IGEgZ2FwIGRpc3RhbmNlLlxuICAvLyBXZSBkbyBub3QgdXNlIHJvd0dhcFtdIGJlY2F1c2UgTWF0aE1MIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2VzXG4gIC8vIGNlbGwgaGVpZ2h0IHdpdGggdGhlIGhlaWdodC9kZXB0aCBvZiB0aGUgZWxlbWVudCBjb250ZW50LlxuICAvLyBMYVRlWCBcXGFycmF5c3RyZXRjaCBtdWx0aXBsaWVzIHRoZSByb3cgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UuXG4gIC8vIFdlIHNpbXVsYXRlIHRoaXMgYnkgYWRkaW5nIChhcnJheXN0cmV0Y2ggLSAxKWVtIHRvIHRoZSBnYXAuIFRoaXNcbiAgLy8gZG9lcyBhIHJlYXNvbmFibGUgam9iIG9mIGFkanVzdGluZyBhcnJheXMgY29udGFpbmluZyAxIGVtIHRhbGwgY29udGVudC5cbiAgLy8gVGhlIDAuMTYgYW5kIDAuMDkgdmFsdWVzIGFyZSBmb3VuZCBlbXByaWNhbGx5LiBUaGV5IHByb2R1Y2UgYW4gYXJyYXlcbiAgLy8gc2ltaWxhciB0byBMYVRlWCBhbmQgaW4gd2hpY2ggY29udGVudCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBcXGhpbmVzLlxuXG4gIHZhciBnYXAgPSBncm91cC5hcnJheXN0cmV0Y2ggPT09IDAuNSA/IDAuMSAvLyB7c21hbGxtYXRyaXh9LCB7c3ViYXJyYXl9XG4gIDogMC4xNiArIGdyb3VwLmFycmF5c3RyZXRjaCAtIDEgKyAoZ3JvdXAuYWRkSm90ID8gMC4wOSA6IDApO1xuICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJyb3dzcGFjaW5nXCIsIG1ha2VFbShnYXApKTsgLy8gTWF0aE1MIHRhYmxlIGxpbmVzIGdvIG9ubHkgYmV0d2VlbiBjZWxscy5cbiAgLy8gVG8gcGxhY2UgYSBsaW5lIG9uIGFuIGVkZ2Ugd2UnbGwgdXNlIDxtZW5jbG9zZT4sIGlmIG5lY2Vzc2FyeS5cblxuICB2YXIgbWVuY2xvc2UgPSBcIlwiO1xuICB2YXIgYWxpZ24gPSBcIlwiO1xuXG4gIGlmIChncm91cC5jb2xzICYmIGdyb3VwLmNvbHMubGVuZ3RoID4gMCkge1xuICAgIC8vIEZpbmQgY29sdW1uIGFsaWdubWVudCwgY29sdW1uIHNwYWNpbmcsIGFuZCAgdmVydGljYWwgbGluZXMuXG4gICAgdmFyIGNvbHMgPSBncm91cC5jb2xzO1xuICAgIHZhciBjb2x1bW5MaW5lcyA9IFwiXCI7XG4gICAgdmFyIHByZXZUeXBlV2FzQWxpZ24gPSBmYWxzZTtcbiAgICB2YXIgaVN0YXJ0ID0gMDtcbiAgICB2YXIgaUVuZCA9IGNvbHMubGVuZ3RoO1xuXG4gICAgaWYgKGNvbHNbMF0udHlwZSA9PT0gXCJzZXBhcmF0b3JcIikge1xuICAgICAgbWVuY2xvc2UgKz0gXCJ0b3AgXCI7XG4gICAgICBpU3RhcnQgPSAxO1xuICAgIH1cblxuICAgIGlmIChjb2xzW2NvbHMubGVuZ3RoIC0gMV0udHlwZSA9PT0gXCJzZXBhcmF0b3JcIikge1xuICAgICAgbWVuY2xvc2UgKz0gXCJib3R0b20gXCI7XG4gICAgICBpRW5kIC09IDE7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSBpU3RhcnQ7IF9pIDwgaUVuZDsgX2krKykge1xuICAgICAgaWYgKGNvbHNbX2ldLnR5cGUgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBhbGlnbiArPSBhbGlnbk1hcFtjb2xzW19pXS5hbGlnbl07XG5cbiAgICAgICAgaWYgKHByZXZUeXBlV2FzQWxpZ24pIHtcbiAgICAgICAgICBjb2x1bW5MaW5lcyArPSBcIm5vbmUgXCI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2VHlwZVdhc0FsaWduID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29sc1tfaV0udHlwZSA9PT0gXCJzZXBhcmF0b3JcIikge1xuICAgICAgICAvLyBNYXRoTUwgYWNjZXB0cyBvbmx5IHNpbmdsZSBsaW5lcyBiZXR3ZWVuIGNlbGxzLlxuICAgICAgICAvLyBTbyB3ZSByZWFkIG9ubHkgdGhlIGZpcnN0IG9mIGNvbnNlY3V0aXZlIHNlcGFyYXRvcnMuXG4gICAgICAgIGlmIChwcmV2VHlwZVdhc0FsaWduKSB7XG4gICAgICAgICAgY29sdW1uTGluZXMgKz0gY29sc1tfaV0uc2VwYXJhdG9yID09PSBcInxcIiA/IFwic29saWQgXCIgOiBcImRhc2hlZCBcIjtcbiAgICAgICAgICBwcmV2VHlwZVdhc0FsaWduID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJjb2x1bW5hbGlnblwiLCBhbGlnbi50cmltKCkpO1xuXG4gICAgaWYgKC9bc2RdLy50ZXN0KGNvbHVtbkxpbmVzKSkge1xuICAgICAgdGFibGUuc2V0QXR0cmlidXRlKFwiY29sdW1ubGluZXNcIiwgY29sdW1uTGluZXMudHJpbSgpKTtcbiAgICB9XG4gIH0gLy8gU2V0IGNvbHVtbiBzcGFjaW5nLlxuXG5cbiAgaWYgKGdyb3VwLmNvbFNlcGFyYXRpb25UeXBlID09PSBcImFsaWduXCIpIHtcbiAgICB2YXIgX2NvbHMgPSBncm91cC5jb2xzIHx8IFtdO1xuXG4gICAgdmFyIHNwYWNpbmcgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMTsgX2kyIDwgX2NvbHMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgc3BhY2luZyArPSBfaTIgJSAyID8gXCIwZW0gXCIgOiBcIjFlbSBcIjtcbiAgICB9XG5cbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJjb2x1bW5zcGFjaW5nXCIsIHNwYWNpbmcudHJpbSgpKTtcbiAgfSBlbHNlIGlmIChncm91cC5jb2xTZXBhcmF0aW9uVHlwZSA9PT0gXCJhbGlnbmF0XCIgfHwgZ3JvdXAuY29sU2VwYXJhdGlvblR5cGUgPT09IFwiZ2F0aGVyXCIpIHtcbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJjb2x1bW5zcGFjaW5nXCIsIFwiMGVtXCIpO1xuICB9IGVsc2UgaWYgKGdyb3VwLmNvbFNlcGFyYXRpb25UeXBlID09PSBcInNtYWxsXCIpIHtcbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJjb2x1bW5zcGFjaW5nXCIsIFwiMC4yNzc4ZW1cIik7XG4gIH0gZWxzZSBpZiAoZ3JvdXAuY29sU2VwYXJhdGlvblR5cGUgPT09IFwiQ0RcIikge1xuICAgIHRhYmxlLnNldEF0dHJpYnV0ZShcImNvbHVtbnNwYWNpbmdcIiwgXCIwLjVlbVwiKTtcbiAgfSBlbHNlIHtcbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJjb2x1bW5zcGFjaW5nXCIsIFwiMWVtXCIpO1xuICB9IC8vIEFkZHJlc3MgXFxobGluZSBhbmQgXFxoZGFzaGxpbmVcblxuXG4gIHZhciByb3dMaW5lcyA9IFwiXCI7XG4gIHZhciBobGluZXMgPSBncm91cC5oTGluZXNCZWZvcmVSb3c7XG4gIG1lbmNsb3NlICs9IGhsaW5lc1swXS5sZW5ndGggPiAwID8gXCJsZWZ0IFwiIDogXCJcIjtcbiAgbWVuY2xvc2UgKz0gaGxpbmVzW2hsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggPiAwID8gXCJyaWdodCBcIiA6IFwiXCI7XG5cbiAgZm9yICh2YXIgX2kzID0gMTsgX2kzIDwgaGxpbmVzLmxlbmd0aCAtIDE7IF9pMysrKSB7XG4gICAgcm93TGluZXMgKz0gaGxpbmVzW19pM10ubGVuZ3RoID09PSAwID8gXCJub25lIFwiIC8vIE1hdGhNTCBhY2NlcHRzIG9ubHkgYSBzaW5nbGUgbGluZSBiZXR3ZWVuIHJvd3MuIFJlYWQgb25lIGVsZW1lbnQuXG4gICAgOiBobGluZXNbX2kzXVswXSA/IFwiZGFzaGVkIFwiIDogXCJzb2xpZCBcIjtcbiAgfVxuXG4gIGlmICgvW3NkXS8udGVzdChyb3dMaW5lcykpIHtcbiAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJyb3dsaW5lc1wiLCByb3dMaW5lcy50cmltKCkpO1xuICB9XG5cbiAgaWYgKG1lbmNsb3NlICE9PSBcIlwiKSB7XG4gICAgdGFibGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1lbmNsb3NlXCIsIFt0YWJsZV0pO1xuICAgIHRhYmxlLnNldEF0dHJpYnV0ZShcIm5vdGF0aW9uXCIsIG1lbmNsb3NlLnRyaW0oKSk7XG4gIH1cblxuICBpZiAoZ3JvdXAuYXJyYXlzdHJldGNoICYmIGdyb3VwLmFycmF5c3RyZXRjaCA8IDEpIHtcbiAgICAvLyBBIHNtYWxsIGFycmF5LiBXcmFwIGluIHNjcmlwdHN0eWxlIHNvIHJvdyBnYXAgaXMgbm90IHRvbyBsYXJnZS5cbiAgICB0YWJsZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXN0eWxlXCIsIFt0YWJsZV0pO1xuICAgIHRhYmxlLnNldEF0dHJpYnV0ZShcInNjcmlwdGxldmVsXCIsIFwiMVwiKTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn07IC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhbGlnbiwgYWxpZ24qLCBhbGlnbmVkLCBhbGlnbmF0LCBhbGlnbmF0KiwgYWxpZ25lZGF0LlxuXG5cbnZhciBhbGlnbmVkSGFuZGxlciA9IGZ1bmN0aW9uIGFsaWduZWRIYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgaWYgKGNvbnRleHQuZW52TmFtZS5pbmRleE9mKFwiZWRcIikgPT09IC0xKSB7XG4gICAgdmFsaWRhdGVBbXNFbnZpcm9ubWVudENvbnRleHQoY29udGV4dCk7XG4gIH1cblxuICB2YXIgY29scyA9IFtdO1xuICB2YXIgc2VwYXJhdGlvblR5cGUgPSBjb250ZXh0LmVudk5hbWUuaW5kZXhPZihcImF0XCIpID4gLTEgPyBcImFsaWduYXRcIiA6IFwiYWxpZ25cIjtcbiAgdmFyIGlzU3BsaXQgPSBjb250ZXh0LmVudk5hbWUgPT09IFwic3BsaXRcIjtcbiAgdmFyIHJlcyA9IHBhcnNlQXJyYXkoY29udGV4dC5wYXJzZXIsIHtcbiAgICBjb2xzOiBjb2xzLFxuICAgIGFkZEpvdDogdHJ1ZSxcbiAgICBhdXRvVGFnOiBpc1NwbGl0ID8gdW5kZWZpbmVkIDogZ2V0QXV0b1RhZyhjb250ZXh0LmVudk5hbWUpLFxuICAgIGVtcHR5U2luZ2xlUm93OiB0cnVlLFxuICAgIGNvbFNlcGFyYXRpb25UeXBlOiBzZXBhcmF0aW9uVHlwZSxcbiAgICBtYXhOdW1Db2xzOiBpc1NwbGl0ID8gMiA6IHVuZGVmaW5lZCxcbiAgICBsZXFubzogY29udGV4dC5wYXJzZXIuc2V0dGluZ3MubGVxbm9cbiAgfSwgXCJkaXNwbGF5XCIpOyAvLyBEZXRlcm1pbmluZyBudW1iZXIgb2YgY29sdW1ucy5cbiAgLy8gMS4gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGdpdmVuLCB3ZSB1c2UgaXQgYXMgYSBudW1iZXIgb2YgY29sdW1ucyxcbiAgLy8gICAgYW5kIG1ha2VzIHN1cmUgdGhhdCBlYWNoIHJvdyBkb2Vzbid0IGV4Y2VlZCB0aGF0IG51bWJlci5cbiAgLy8gMi4gT3RoZXJ3aXNlLCBqdXN0IGNvdW50IG51bWJlciBvZiBjb2x1bW5zID0gbWF4aW11bSBudW1iZXJcbiAgLy8gICAgb2YgY2VsbHMgaW4gZWFjaCByb3cgKFwiYWxpZ25lZFwiIG1vZGUgLS0gaXNBbGlnbmVkIHdpbGwgYmUgdHJ1ZSkuXG4gIC8vXG4gIC8vIEF0IHRoZSBzYW1lIHRpbWUsIHByZXBlbmQgZW1wdHkgZ3JvdXAge30gYXQgYmVnaW5uaW5nIG9mIGV2ZXJ5IHNlY29uZFxuICAvLyBjZWxsIGluIGVhY2ggcm93IChzdGFydGluZyB3aXRoIHNlY29uZCBjZWxsKSBzbyB0aGF0IG9wZXJhdG9ycyBiZWNvbWVcbiAgLy8gYmluYXJ5LiAgVGhpcyBiZWhhdmlvciBpcyBpbXBsZW1lbnRlZCBpbiBhbXNtYXRoJ3MgXFxzdGFydEBhbGlnbmVkLlxuXG4gIHZhciBudW1NYXRocztcbiAgdmFyIG51bUNvbHMgPSAwO1xuICB2YXIgZW1wdHlHcm91cCA9IHtcbiAgICB0eXBlOiBcIm9yZGdyb3VwXCIsXG4gICAgbW9kZTogY29udGV4dC5tb2RlLFxuICAgIGJvZHk6IFtdXG4gIH07XG5cbiAgaWYgKGFyZ3NbMF0gJiYgYXJnc1swXS50eXBlID09PSBcIm9yZGdyb3VwXCIpIHtcbiAgICB2YXIgYXJnMCA9IFwiXCI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NbMF0uYm9keS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRleHRvcmQgPSBhc3NlcnROb2RlVHlwZShhcmdzWzBdLmJvZHlbaV0sIFwidGV4dG9yZFwiKTtcbiAgICAgIGFyZzAgKz0gdGV4dG9yZC50ZXh0O1xuICAgIH1cblxuICAgIG51bU1hdGhzID0gTnVtYmVyKGFyZzApO1xuICAgIG51bUNvbHMgPSBudW1NYXRocyAqIDI7XG4gIH1cblxuICB2YXIgaXNBbGlnbmVkID0gIW51bUNvbHM7XG4gIHJlcy5ib2R5LmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgIGZvciAodmFyIF9pNCA9IDE7IF9pNCA8IHJvdy5sZW5ndGg7IF9pNCArPSAyKSB7XG4gICAgICAvLyBNb2RpZnkgb3JkZ3JvdXAgbm9kZSB3aXRoaW4gc3R5bGluZyBub2RlXG4gICAgICB2YXIgc3R5bGluZyA9IGFzc2VydE5vZGVUeXBlKHJvd1tfaTRdLCBcInN0eWxpbmdcIik7XG4gICAgICB2YXIgb3JkZ3JvdXAgPSBhc3NlcnROb2RlVHlwZShzdHlsaW5nLmJvZHlbMF0sIFwib3JkZ3JvdXBcIik7XG4gICAgICBvcmRncm91cC5ib2R5LnVuc2hpZnQoZW1wdHlHcm91cCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FsaWduZWQpIHtcbiAgICAgIC8vIENhc2UgMVxuICAgICAgdmFyIGN1ck1hdGhzID0gcm93Lmxlbmd0aCAvIDI7XG5cbiAgICAgIGlmIChudW1NYXRocyA8IGN1ck1hdGhzKSB7XG4gICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlRvbyBtYW55IG1hdGggaW4gYSByb3c6IFwiICsgKFwiZXhwZWN0ZWQgXCIgKyBudW1NYXRocyArIFwiLCBidXQgZ290IFwiICsgY3VyTWF0aHMpLCByb3dbMF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobnVtQ29scyA8IHJvdy5sZW5ndGgpIHtcbiAgICAgIC8vIENhc2UgMlxuICAgICAgbnVtQ29scyA9IHJvdy5sZW5ndGg7XG4gICAgfVxuICB9KTsgLy8gQWRqdXN0aW5nIGFsaWdubWVudC5cbiAgLy8gSW4gYWxpZ25lZCBtb2RlLCB3ZSBhZGQgb25lIFxccXF1YWQgYmV0d2VlbiBjb2x1bW5zO1xuICAvLyBvdGhlcndpc2Ugd2UgYWRkIG5vdGhpbmcuXG5cbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbnVtQ29sczsgKytfaTUpIHtcbiAgICB2YXIgYWxpZ24gPSBcInJcIjtcbiAgICB2YXIgcHJlZ2FwID0gMDtcblxuICAgIGlmIChfaTUgJSAyID09PSAxKSB7XG4gICAgICBhbGlnbiA9IFwibFwiO1xuICAgIH0gZWxzZSBpZiAoX2k1ID4gMCAmJiBpc0FsaWduZWQpIHtcbiAgICAgIC8vIFwiYWxpZ25lZFwiIG1vZGUuXG4gICAgICBwcmVnYXAgPSAxOyAvLyBhZGQgb25lIFxccXVhZFxuICAgIH1cblxuICAgIGNvbHNbX2k1XSA9IHtcbiAgICAgIHR5cGU6IFwiYWxpZ25cIixcbiAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgIHByZWdhcDogcHJlZ2FwLFxuICAgICAgcG9zdGdhcDogMFxuICAgIH07XG4gIH1cblxuICByZXMuY29sU2VwYXJhdGlvblR5cGUgPSBpc0FsaWduZWQgPyBcImFsaWduXCIgOiBcImFsaWduYXRcIjtcbiAgcmV0dXJuIHJlcztcbn07IC8vIEFycmF5cyBhcmUgcGFydCBvZiBMYVRlWCwgZGVmaW5lZCBpbiBsdHRhYi5kdHggc28gaXRzIGRvY3VtZW50YXRpb25cbi8vIGlzIHBhcnQgb2YgdGhlIHNvdXJjZTJlLnBkZiBmaWxlIG9mIExhVGVYMmUgc291cmNlIGRvY3VtZW50YXRpb24uXG4vLyB7ZGFycmF5fSBpcyBhbiB7YXJyYXl9IGVudmlyb25tZW50IHdoZXJlIGNlbGxzIGFyZSBzZXQgaW4gXFxkaXNwbGF5c3R5bGUsXG4vLyBhcyBkZWZpbmVkIGluIG5jY21hdGguc3R5LlxuXG5cbmRlZmluZUVudmlyb25tZW50KHtcbiAgdHlwZTogXCJhcnJheVwiLFxuICBuYW1lczogW1wiYXJyYXlcIiwgXCJkYXJyYXlcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICAvLyBTaW5jZSBubyB0eXBlcyBhcmUgc3BlY2lmaWVkIGFib3ZlLCB0aGUgdHdvIHBvc3NpYmlsaXRpZXMgYXJlXG4gICAgLy8gLSBUaGUgYXJndW1lbnQgaXMgd3JhcHBlZCBpbiB7fSBvciBbXSwgaW4gd2hpY2ggY2FzZSBQYXJzZXInc1xuICAgIC8vICAgcGFyc2VHcm91cCgpIHJldHVybnMgYW4gXCJvcmRncm91cFwiIHdyYXBwaW5nIHNvbWUgc3ltYm9sIG5vZGUuXG4gICAgLy8gLSBUaGUgYXJndW1lbnQgaXMgYSBiYXJlIHN5bWJvbCBub2RlLlxuICAgIHZhciBzeW1Ob2RlID0gY2hlY2tTeW1ib2xOb2RlVHlwZShhcmdzWzBdKTtcbiAgICB2YXIgY29sYWxpZ24gPSBzeW1Ob2RlID8gW2FyZ3NbMF1dIDogYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJvcmRncm91cFwiKS5ib2R5O1xuICAgIHZhciBjb2xzID0gY29sYWxpZ24ubWFwKGZ1bmN0aW9uIChuZGUpIHtcbiAgICAgIHZhciBub2RlID0gYXNzZXJ0U3ltYm9sTm9kZVR5cGUobmRlKTtcbiAgICAgIHZhciBjYSA9IG5vZGUudGV4dDtcblxuICAgICAgaWYgKFwibGNyXCIuaW5kZXhPZihjYSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJhbGlnblwiLFxuICAgICAgICAgIGFsaWduOiBjYVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChjYSA9PT0gXCJ8XCIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcInNlcGFyYXRvclwiLFxuICAgICAgICAgIHNlcGFyYXRvcjogXCJ8XCJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoY2EgPT09IFwiOlwiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJzZXBhcmF0b3JcIixcbiAgICAgICAgICBzZXBhcmF0b3I6IFwiOlwiXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVua25vd24gY29sdW1uIGFsaWdubWVudDogXCIgKyBjYSwgbmRlKTtcbiAgICB9KTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgY29sczogY29scyxcbiAgICAgIGhza2lwQmVmb3JlQW5kQWZ0ZXI6IHRydWUsXG4gICAgICAvLyBcXEBwcmVhbWJsZSBpbiBsdHRhYi5kdHhcbiAgICAgIG1heE51bUNvbHM6IGNvbHMubGVuZ3RoXG4gICAgfTtcbiAgICByZXR1cm4gcGFyc2VBcnJheShjb250ZXh0LnBhcnNlciwgcmVzLCBkQ2VsbFN0eWxlKGNvbnRleHQuZW52TmFtZSkpO1xuICB9LFxuICBodG1sQnVpbGRlcjogYXJyYXlfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGFycmF5X21hdGhtbEJ1aWxkZXJcbn0pOyAvLyBUaGUgbWF0cml4IGVudmlyb25tZW50cyBvZiBhbXNtYXRoIGJ1aWxkcyBvbiB0aGUgYXJyYXkgZW52aXJvbm1lbnRcbi8vIG9mIExhVGVYLCB3aGljaCBpcyBkaXNjdXNzZWQgYWJvdmUuXG4vLyBUaGUgbWF0aHRvb2xzIHBhY2thZ2UgYWRkcyBzdGFycmVkIHZlcnNpb25zIG9mIHRoZSBzYW1lIGVudmlyb25tZW50cy5cbi8vIFRoZXNlIGhhdmUgYW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gY2hvb3NlIGxlZnR8Y2VudGVyfHJpZ2h0IGp1c3RpZmljYXRpb24uXG5cbmRlZmluZUVudmlyb25tZW50KHtcbiAgdHlwZTogXCJhcnJheVwiLFxuICBuYW1lczogW1wibWF0cml4XCIsIFwicG1hdHJpeFwiLCBcImJtYXRyaXhcIiwgXCJCbWF0cml4XCIsIFwidm1hdHJpeFwiLCBcIlZtYXRyaXhcIiwgXCJtYXRyaXgqXCIsIFwicG1hdHJpeCpcIiwgXCJibWF0cml4KlwiLCBcIkJtYXRyaXgqXCIsIFwidm1hdHJpeCpcIiwgXCJWbWF0cml4KlwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAwXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoY29udGV4dCkge1xuICAgIHZhciBkZWxpbWl0ZXJzID0ge1xuICAgICAgXCJtYXRyaXhcIjogbnVsbCxcbiAgICAgIFwicG1hdHJpeFwiOiBbXCIoXCIsIFwiKVwiXSxcbiAgICAgIFwiYm1hdHJpeFwiOiBbXCJbXCIsIFwiXVwiXSxcbiAgICAgIFwiQm1hdHJpeFwiOiBbXCJcXFxce1wiLCBcIlxcXFx9XCJdLFxuICAgICAgXCJ2bWF0cml4XCI6IFtcInxcIiwgXCJ8XCJdLFxuICAgICAgXCJWbWF0cml4XCI6IFtcIlxcXFxWZXJ0XCIsIFwiXFxcXFZlcnRcIl1cbiAgICB9W2NvbnRleHQuZW52TmFtZS5yZXBsYWNlKFwiKlwiLCBcIlwiKV07IC8vIFxcaHNraXAgLVxcYXJyYXljb2xzZXAgaW4gYW1zbWF0aFxuXG4gICAgdmFyIGNvbEFsaWduID0gXCJjXCI7XG4gICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICBoc2tpcEJlZm9yZUFuZEFmdGVyOiBmYWxzZSxcbiAgICAgIGNvbHM6IFt7XG4gICAgICAgIHR5cGU6IFwiYWxpZ25cIixcbiAgICAgICAgYWxpZ246IGNvbEFsaWduXG4gICAgICB9XVxuICAgIH07XG5cbiAgICBpZiAoY29udGV4dC5lbnZOYW1lLmNoYXJBdChjb250ZXh0LmVudk5hbWUubGVuZ3RoIC0gMSkgPT09IFwiKlwiKSB7XG4gICAgICAvLyBJdCdzIG9uZSBvZiB0aGUgbWF0aHRvb2xzIHN0YXJyZWQgZnVuY3Rpb25zLlxuICAgICAgLy8gUGFyc2UgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBhcmd1bWVudC5cbiAgICAgIHZhciBwYXJzZXIgPSBjb250ZXh0LnBhcnNlcjtcbiAgICAgIHBhcnNlci5jb25zdW1lU3BhY2VzKCk7XG5cbiAgICAgIGlmIChwYXJzZXIuZmV0Y2goKS50ZXh0ID09PSBcIltcIikge1xuICAgICAgICBwYXJzZXIuY29uc3VtZSgpO1xuICAgICAgICBwYXJzZXIuY29uc3VtZVNwYWNlcygpO1xuICAgICAgICBjb2xBbGlnbiA9IHBhcnNlci5mZXRjaCgpLnRleHQ7XG5cbiAgICAgICAgaWYgKFwibGNyXCIuaW5kZXhPZihjb2xBbGlnbikgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiRXhwZWN0ZWQgbCBvciBjIG9yIHJcIiwgcGFyc2VyLm5leHRUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJzZXIuY29uc3VtZSgpO1xuICAgICAgICBwYXJzZXIuY29uc3VtZVNwYWNlcygpO1xuICAgICAgICBwYXJzZXIuZXhwZWN0KFwiXVwiKTtcbiAgICAgICAgcGFyc2VyLmNvbnN1bWUoKTtcbiAgICAgICAgcGF5bG9hZC5jb2xzID0gW3tcbiAgICAgICAgICB0eXBlOiBcImFsaWduXCIsXG4gICAgICAgICAgYWxpZ246IGNvbEFsaWduXG4gICAgICAgIH1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXMgPSBwYXJzZUFycmF5KGNvbnRleHQucGFyc2VyLCBwYXlsb2FkLCBkQ2VsbFN0eWxlKGNvbnRleHQuZW52TmFtZSkpOyAvLyBQb3B1bGF0ZSBjb2xzIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbiBhbGlnbm1lbnQgc3BlY3MuXG5cbiAgICB2YXIgbnVtQ29scyA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIFswXS5jb25jYXQocmVzLmJvZHkubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiByb3cubGVuZ3RoO1xuICAgIH0pKSk7XG4gICAgcmVzLmNvbHMgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCh7XG4gICAgICB0eXBlOiBcImFsaWduXCIsXG4gICAgICBhbGlnbjogY29sQWxpZ25cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsaW1pdGVycyA/IHtcbiAgICAgIHR5cGU6IFwibGVmdHJpZ2h0XCIsXG4gICAgICBtb2RlOiBjb250ZXh0Lm1vZGUsXG4gICAgICBib2R5OiBbcmVzXSxcbiAgICAgIGxlZnQ6IGRlbGltaXRlcnNbMF0sXG4gICAgICByaWdodDogZGVsaW1pdGVyc1sxXSxcbiAgICAgIHJpZ2h0Q29sb3I6IHVuZGVmaW5lZCAvLyBcXHJpZ2h0IHVuaW5mbHVlbmNlZCBieSBcXGNvbG9yIGluIGFycmF5XG5cbiAgICB9IDogcmVzO1xuICB9LFxuICBodG1sQnVpbGRlcjogYXJyYXlfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGFycmF5X21hdGhtbEJ1aWxkZXJcbn0pO1xuZGVmaW5lRW52aXJvbm1lbnQoe1xuICB0eXBlOiBcImFycmF5XCIsXG4gIG5hbWVzOiBbXCJzbWFsbG1hdHJpeFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAwXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoY29udGV4dCkge1xuICAgIHZhciBwYXlsb2FkID0ge1xuICAgICAgYXJyYXlzdHJldGNoOiAwLjVcbiAgICB9O1xuICAgIHZhciByZXMgPSBwYXJzZUFycmF5KGNvbnRleHQucGFyc2VyLCBwYXlsb2FkLCBcInNjcmlwdFwiKTtcbiAgICByZXMuY29sU2VwYXJhdGlvblR5cGUgPSBcInNtYWxsXCI7XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGFycmF5X2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBhcnJheV9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUVudmlyb25tZW50KHtcbiAgdHlwZTogXCJhcnJheVwiLFxuICBuYW1lczogW1wic3ViYXJyYXlcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICAvLyBQYXJzaW5nIG9mIHtzdWJhcnJheX0gaXMgc2ltaWxhciB0byB7YXJyYXl9XG4gICAgdmFyIHN5bU5vZGUgPSBjaGVja1N5bWJvbE5vZGVUeXBlKGFyZ3NbMF0pO1xuICAgIHZhciBjb2xhbGlnbiA9IHN5bU5vZGUgPyBbYXJnc1swXV0gOiBhc3NlcnROb2RlVHlwZShhcmdzWzBdLCBcIm9yZGdyb3VwXCIpLmJvZHk7XG4gICAgdmFyIGNvbHMgPSBjb2xhbGlnbi5tYXAoZnVuY3Rpb24gKG5kZSkge1xuICAgICAgdmFyIG5vZGUgPSBhc3NlcnRTeW1ib2xOb2RlVHlwZShuZGUpO1xuICAgICAgdmFyIGNhID0gbm9kZS50ZXh0OyAvLyB7c3ViYXJyYXl9IG9ubHkgcmVjb2duaXplcyBcImxcIiAmIFwiY1wiXG5cbiAgICAgIGlmIChcImxjXCIuaW5kZXhPZihjYSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJhbGlnblwiLFxuICAgICAgICAgIGFsaWduOiBjYVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJVbmtub3duIGNvbHVtbiBhbGlnbm1lbnQ6IFwiICsgY2EsIG5kZSk7XG4gICAgfSk7XG5cbiAgICBpZiAoY29scy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJ7c3ViYXJyYXl9IGNhbiBjb250YWluIG9ubHkgb25lIGNvbHVtblwiKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzID0ge1xuICAgICAgY29sczogY29scyxcbiAgICAgIGhza2lwQmVmb3JlQW5kQWZ0ZXI6IGZhbHNlLFxuICAgICAgYXJyYXlzdHJldGNoOiAwLjVcbiAgICB9O1xuICAgIHJlcyA9IHBhcnNlQXJyYXkoY29udGV4dC5wYXJzZXIsIHJlcywgXCJzY3JpcHRcIik7XG5cbiAgICBpZiAocmVzLmJvZHkubGVuZ3RoID4gMCAmJiByZXMuYm9keVswXS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJ7c3ViYXJyYXl9IGNhbiBjb250YWluIG9ubHkgb25lIGNvbHVtblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9LFxuICBodG1sQnVpbGRlcjogYXJyYXlfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGFycmF5X21hdGhtbEJ1aWxkZXJcbn0pOyAvLyBBIGNhc2VzIGVudmlyb25tZW50IChpbiBhbXNtYXRoLnN0eSkgaXMgYWxtb3N0IGVxdWl2YWxlbnQgdG9cbi8vIFxcZGVmXFxhcnJheXN0cmV0Y2h7MS4yfSVcbi8vIFxcbGVmdFxce1xcYmVnaW57YXJyYXl9e0B7fWxAe1xccXVhZH1sQHt9fSDigKYgXFxlbmR7YXJyYXl9XFxyaWdodC5cbi8vIHtkY2FzZXN9IGlzIGEge2Nhc2VzfSBlbnZpcm9ubWVudCB3aGVyZSBjZWxscyBhcmUgc2V0IGluIFxcZGlzcGxheXN0eWxlLFxuLy8gYXMgZGVmaW5lZCBpbiBtYXRodG9vbHMuc3R5LlxuLy8ge3JjYXNlc30gaXMgYW5vdGhlciBtYXRodG9vbHMgZW52aXJvbm1lbnQuIEl0J3MgYnJhY2UgaXMgb24gdGhlIHJpZ2h0IHNpZGUuXG5cbmRlZmluZUVudmlyb25tZW50KHtcbiAgdHlwZTogXCJhcnJheVwiLFxuICBuYW1lczogW1wiY2FzZXNcIiwgXCJkY2FzZXNcIiwgXCJyY2FzZXNcIiwgXCJkcmNhc2VzXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDBcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihjb250ZXh0KSB7XG4gICAgdmFyIHBheWxvYWQgPSB7XG4gICAgICBhcnJheXN0cmV0Y2g6IDEuMixcbiAgICAgIGNvbHM6IFt7XG4gICAgICAgIHR5cGU6IFwiYWxpZ25cIixcbiAgICAgICAgYWxpZ246IFwibFwiLFxuICAgICAgICBwcmVnYXA6IDAsXG4gICAgICAgIC8vIFRPRE8oa2V2aW5iKSBnZXQgdGhlIGN1cnJlbnQgc3R5bGUuXG4gICAgICAgIC8vIEZvciBub3cgd2UgdXNlIHRoZSBtZXRyaWNzIGZvciBURVhUIHN0eWxlIHdoaWNoIGlzIHdoYXQgd2Ugd2VyZVxuICAgICAgICAvLyBkb2luZyBiZWZvcmUuICBCZWZvcmUgYXR0ZW1wdGluZyB0byBnZXQgdGhlIGN1cnJlbnQgc3R5bGUgd2VcbiAgICAgICAgLy8gc2hvdWxkIGxvb2sgYXQgVGVYJ3MgYmVoYXZpb3IgZXNwZWNpYWxseSBmb3IgXFxvdmVyIGFuZCBtYXRyaWNlcy5cbiAgICAgICAgcG9zdGdhcDogMS4wXG4gICAgICAgIC8qIDFlbSBxdWFkICovXG5cbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJhbGlnblwiLFxuICAgICAgICBhbGlnbjogXCJsXCIsXG4gICAgICAgIHByZWdhcDogMCxcbiAgICAgICAgcG9zdGdhcDogMFxuICAgICAgfV1cbiAgICB9O1xuICAgIHZhciByZXMgPSBwYXJzZUFycmF5KGNvbnRleHQucGFyc2VyLCBwYXlsb2FkLCBkQ2VsbFN0eWxlKGNvbnRleHQuZW52TmFtZSkpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImxlZnRyaWdodFwiLFxuICAgICAgbW9kZTogY29udGV4dC5tb2RlLFxuICAgICAgYm9keTogW3Jlc10sXG4gICAgICBsZWZ0OiBjb250ZXh0LmVudk5hbWUuaW5kZXhPZihcInJcIikgPiAtMSA/IFwiLlwiIDogXCJcXFxce1wiLFxuICAgICAgcmlnaHQ6IGNvbnRleHQuZW52TmFtZS5pbmRleE9mKFwiclwiKSA+IC0xID8gXCJcXFxcfVwiIDogXCIuXCIsXG4gICAgICByaWdodENvbG9yOiB1bmRlZmluZWRcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogYXJyYXlfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGFycmF5X21hdGhtbEJ1aWxkZXJcbn0pOyAvLyBJbiB0aGUgYWxpZ24gZW52aXJvbm1lbnQsIG9uZSB1c2VzIGFtcGVyc2FuZHMsICYsIHRvIHNwZWNpZnkgbnVtYmVyIG9mXG4vLyBjb2x1bW5zIGluIGVhY2ggcm93LCBhbmQgdG8gbG9jYXRlIHNwYWNpbmcgYmV0d2VlbiBlYWNoIGNvbHVtbi5cbi8vIGFsaWduIGdldHMgYXV0b21hdGljIG51bWJlcmluZy4gYWxpZ24qIGFuZCBhbGlnbmVkIGRvIG5vdC5cbi8vIFRoZSBhbGlnbmVkYXQgZW52aXJvbm1lbnQgY2FuIGJlIHVzZWQgaW4gbWF0aCBtb2RlLlxuLy8gTm90ZSB0aGF0IHdlIGFzc3VtZSBcXG5vbWFsbGluZXNraXBsaW1pdCB0byBiZSB6ZXJvLFxuLy8gc28gdGhhdCBcXHN0cnV0QCBpcyB0aGUgc2FtZSBhcyBcXHN0cnV0LlxuXG5kZWZpbmVFbnZpcm9ubWVudCh7XG4gIHR5cGU6IFwiYXJyYXlcIixcbiAgbmFtZXM6IFtcImFsaWduXCIsIFwiYWxpZ24qXCIsIFwiYWxpZ25lZFwiLCBcInNwbGl0XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDBcbiAgfSxcbiAgaGFuZGxlcjogYWxpZ25lZEhhbmRsZXIsXG4gIGh0bWxCdWlsZGVyOiBhcnJheV9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogYXJyYXlfbWF0aG1sQnVpbGRlclxufSk7IC8vIEEgZ2F0aGVyZWQgZW52aXJvbm1lbnQgaXMgbGlrZSBhbiBhcnJheSBlbnZpcm9ubWVudCB3aXRoIG9uZSBjZW50ZXJlZFxuLy8gY29sdW1uLCBidXQgd2hlcmUgcm93cyBhcmUgY29uc2lkZXJlZCBsaW5lcyBzbyBnZXQgXFxqb3QgbGluZSBzcGFjaW5nXG4vLyBhbmQgY29udGVudHMgYXJlIHNldCBpbiBcXGRpc3BsYXlzdHlsZS5cblxuZGVmaW5lRW52aXJvbm1lbnQoe1xuICB0eXBlOiBcImFycmF5XCIsXG4gIG5hbWVzOiBbXCJnYXRoZXJlZFwiLCBcImdhdGhlclwiLCBcImdhdGhlcipcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMFxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQpIHtcbiAgICBpZiAodXRpbHMuY29udGFpbnMoW1wiZ2F0aGVyXCIsIFwiZ2F0aGVyKlwiXSwgY29udGV4dC5lbnZOYW1lKSkge1xuICAgICAgdmFsaWRhdGVBbXNFbnZpcm9ubWVudENvbnRleHQoY29udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIGNvbHM6IFt7XG4gICAgICAgIHR5cGU6IFwiYWxpZ25cIixcbiAgICAgICAgYWxpZ246IFwiY1wiXG4gICAgICB9XSxcbiAgICAgIGFkZEpvdDogdHJ1ZSxcbiAgICAgIGNvbFNlcGFyYXRpb25UeXBlOiBcImdhdGhlclwiLFxuICAgICAgYXV0b1RhZzogZ2V0QXV0b1RhZyhjb250ZXh0LmVudk5hbWUpLFxuICAgICAgZW1wdHlTaW5nbGVSb3c6IHRydWUsXG4gICAgICBsZXFubzogY29udGV4dC5wYXJzZXIuc2V0dGluZ3MubGVxbm9cbiAgICB9O1xuICAgIHJldHVybiBwYXJzZUFycmF5KGNvbnRleHQucGFyc2VyLCByZXMsIFwiZGlzcGxheVwiKTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGFycmF5X2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBhcnJheV9tYXRobWxCdWlsZGVyXG59KTsgLy8gYWxpZ25hdCBlbnZpcm9ubWVudCBpcyBsaWtlIGFuIGFsaWduIGVudmlyb25tZW50LCBidXQgb25lIG11c3QgZXhwbGljaXRseVxuLy8gc3BlY2lmeSBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIGVhY2ggcm93LCBhbmQgY2FuIGFkanVzdCBzcGFjaW5nIGJldHdlZW5cbi8vIGVhY2ggY29sdW1ucy5cblxuZGVmaW5lRW52aXJvbm1lbnQoe1xuICB0eXBlOiBcImFycmF5XCIsXG4gIG5hbWVzOiBbXCJhbGlnbmF0XCIsIFwiYWxpZ25hdCpcIiwgXCJhbGlnbmVkYXRcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMVxuICB9LFxuICBoYW5kbGVyOiBhbGlnbmVkSGFuZGxlcixcbiAgaHRtbEJ1aWxkZXI6IGFycmF5X2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBhcnJheV9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUVudmlyb25tZW50KHtcbiAgdHlwZTogXCJhcnJheVwiLFxuICBuYW1lczogW1wiZXF1YXRpb25cIiwgXCJlcXVhdGlvbipcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMFxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQpIHtcbiAgICB2YWxpZGF0ZUFtc0Vudmlyb25tZW50Q29udGV4dChjb250ZXh0KTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgYXV0b1RhZzogZ2V0QXV0b1RhZyhjb250ZXh0LmVudk5hbWUpLFxuICAgICAgZW1wdHlTaW5nbGVSb3c6IHRydWUsXG4gICAgICBzaW5nbGVSb3c6IHRydWUsXG4gICAgICBtYXhOdW1Db2xzOiAxLFxuICAgICAgbGVxbm86IGNvbnRleHQucGFyc2VyLnNldHRpbmdzLmxlcW5vXG4gICAgfTtcbiAgICByZXR1cm4gcGFyc2VBcnJheShjb250ZXh0LnBhcnNlciwgcmVzLCBcImRpc3BsYXlcIik7XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBhcnJheV9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogYXJyYXlfbWF0aG1sQnVpbGRlclxufSk7XG5kZWZpbmVFbnZpcm9ubWVudCh7XG4gIHR5cGU6IFwiYXJyYXlcIixcbiAgbmFtZXM6IFtcIkNEXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDBcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihjb250ZXh0KSB7XG4gICAgdmFsaWRhdGVBbXNFbnZpcm9ubWVudENvbnRleHQoY29udGV4dCk7XG4gICAgcmV0dXJuIHBhcnNlQ0QoY29udGV4dC5wYXJzZXIpO1xuICB9LFxuICBodG1sQnVpbGRlcjogYXJyYXlfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGFycmF5X21hdGhtbEJ1aWxkZXJcbn0pO1xuZGVmaW5lTWFjcm8oXCJcXFxcbm9udW1iZXJcIiwgXCJcXFxcZ2RlZlxcXFxAZXFuc3d7MH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxub3RhZ1wiLCBcIlxcXFxub251bWJlclwiKTsgLy8gQ2F0Y2ggXFxobGluZSBvdXRzaWRlIGFycmF5IGVudmlyb25tZW50XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJ0ZXh0XCIsXG4gIC8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhpcyBpcy5cbiAgbmFtZXM6IFtcIlxcXFxobGluZVwiLCBcIlxcXFxoZGFzaGxpbmVcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlLFxuICAgIGFsbG93ZWRJbk1hdGg6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihjb250ZXh0LCBhcmdzKSB7XG4gICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKGNvbnRleHQuZnVuY05hbWUgKyBcIiB2YWxpZCBvbmx5IHdpdGhpbiBhcnJheSBlbnZpcm9ubWVudFwiKTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZW52aXJvbm1lbnRzLmpzXG5cbnZhciBlbnZpcm9ubWVudHMgPSBfZW52aXJvbm1lbnRzO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Vudmlyb25tZW50cyA9IChlbnZpcm9ubWVudHMpOyAvLyBBbGwgZW52aXJvbm1lbnQgZGVmaW5pdGlvbnMgc2hvdWxkIGJlIGltcG9ydGVkIGJlbG93XG5cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9lbnZpcm9ubWVudC5qc1xuXG5cblxuIC8vIEVudmlyb25tZW50IGRlbGltaXRlcnMuIEhUTUwvTWF0aE1MIHJlbmRlcmluZyBpcyBkZWZpbmVkIGluIHRoZSBjb3JyZXNwb25kaW5nXG4vLyBkZWZpbmVFbnZpcm9ubWVudCBkZWZpbml0aW9ucy5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImVudmlyb25tZW50XCIsXG4gIG5hbWVzOiBbXCJcXFxcYmVnaW5cIiwgXCJcXFxcZW5kXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInRleHRcIl1cbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWU7XG4gICAgdmFyIG5hbWVHcm91cCA9IGFyZ3NbMF07XG5cbiAgICBpZiAobmFtZUdyb3VwLnR5cGUgIT09IFwib3JkZ3JvdXBcIikge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lXCIsIG5hbWVHcm91cCk7XG4gICAgfVxuXG4gICAgdmFyIGVudk5hbWUgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lR3JvdXAuYm9keS5sZW5ndGg7ICsraSkge1xuICAgICAgZW52TmFtZSArPSBhc3NlcnROb2RlVHlwZShuYW1lR3JvdXAuYm9keVtpXSwgXCJ0ZXh0b3JkXCIpLnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGZ1bmNOYW1lID09PSBcIlxcXFxiZWdpblwiKSB7XG4gICAgICAvLyBiZWdpbi4uLmVuZCBpcyBzaW1pbGFyIHRvIGxlZnQuLi5yaWdodFxuICAgICAgaWYgKCFzcmNfZW52aXJvbm1lbnRzLmhhc093blByb3BlcnR5KGVudk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIk5vIHN1Y2ggZW52aXJvbm1lbnQ6IFwiICsgZW52TmFtZSwgbmFtZUdyb3VwKTtcbiAgICAgIH0gLy8gQnVpbGQgdGhlIGVudmlyb25tZW50IG9iamVjdC4gQXJndW1lbnRzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB3aWxsXG4gICAgICAvLyBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYmVnaW4gYW5kIGVuZCBtZXRob2RzIHVzaW5nIHByb3BlcnRpZXMuXG5cblxuICAgICAgdmFyIGVudiA9IHNyY19lbnZpcm9ubWVudHNbZW52TmFtZV07XG5cbiAgICAgIHZhciBfcGFyc2VyJHBhcnNlQXJndW1lbnQgPSBwYXJzZXIucGFyc2VBcmd1bWVudHMoXCJcXFxcYmVnaW57XCIgKyBlbnZOYW1lICsgXCJ9XCIsIGVudiksXG4gICAgICAgICAgX2FyZ3MgPSBfcGFyc2VyJHBhcnNlQXJndW1lbnQuYXJncyxcbiAgICAgICAgICBvcHRBcmdzID0gX3BhcnNlciRwYXJzZUFyZ3VtZW50Lm9wdEFyZ3M7XG5cbiAgICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgICAgZW52TmFtZTogZW52TmFtZSxcbiAgICAgICAgcGFyc2VyOiBwYXJzZXJcbiAgICAgIH07XG4gICAgICB2YXIgcmVzdWx0ID0gZW52LmhhbmRsZXIoY29udGV4dCwgX2FyZ3MsIG9wdEFyZ3MpO1xuICAgICAgcGFyc2VyLmV4cGVjdChcIlxcXFxlbmRcIiwgZmFsc2UpO1xuICAgICAgdmFyIGVuZE5hbWVUb2tlbiA9IHBhcnNlci5uZXh0VG9rZW47XG4gICAgICB2YXIgZW5kID0gYXNzZXJ0Tm9kZVR5cGUocGFyc2VyLnBhcnNlRnVuY3Rpb24oKSwgXCJlbnZpcm9ubWVudFwiKTtcblxuICAgICAgaWYgKGVuZC5uYW1lICE9PSBlbnZOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIk1pc21hdGNoOiBcXFxcYmVnaW57XCIgKyBlbnZOYW1lICsgXCJ9IG1hdGNoZWQgYnkgXFxcXGVuZHtcIiArIGVuZC5uYW1lICsgXCJ9XCIsIGVuZE5hbWVUb2tlbik7XG4gICAgICB9IC8vICRGbG93Rml4TWUsIFwiZW52aXJvbm1lbnRcIiBoYW5kbGVyIHJldHVybnMgYW4gZW52aXJvbm1lbnQgUGFyc2VOb2RlXG5cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlbnZpcm9ubWVudFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBuYW1lOiBlbnZOYW1lLFxuICAgICAgbmFtZUdyb3VwOiBuYW1lR3JvdXBcbiAgICB9O1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvZm9udC5qc1xuLy8gVE9ETyhrZXZpbmIpOiBpbXBsZW1lbnQgXFxcXHNsIGFuZCBcXFxcc2NcblxuXG5cblxuXG5cbnZhciBmb250X2h0bWxCdWlsZGVyID0gZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIGZvbnQgPSBncm91cC5mb250O1xuICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMud2l0aEZvbnQoZm9udCk7XG4gIHJldHVybiBidWlsZEdyb3VwKGdyb3VwLmJvZHksIG5ld09wdGlvbnMpO1xufTtcblxudmFyIGZvbnRfbWF0aG1sQnVpbGRlciA9IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIGZvbnQgPSBncm91cC5mb250O1xuICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMud2l0aEZvbnQoZm9udCk7XG4gIHJldHVybiBidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJvZHksIG5ld09wdGlvbnMpO1xufTtcblxudmFyIGZvbnRBbGlhc2VzID0ge1xuICBcIlxcXFxCYmJcIjogXCJcXFxcbWF0aGJiXCIsXG4gIFwiXFxcXGJvbGRcIjogXCJcXFxcbWF0aGJmXCIsXG4gIFwiXFxcXGZyYWtcIjogXCJcXFxcbWF0aGZyYWtcIixcbiAgXCJcXFxcYm1cIjogXCJcXFxcYm9sZHN5bWJvbFwiXG59O1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImZvbnRcIixcbiAgbmFtZXM6IFsvLyBzdHlsZXMsIGV4Y2VwdCBcXGJvbGRzeW1ib2wgZGVmaW5lZCBiZWxvd1xuICBcIlxcXFxtYXRocm1cIiwgXCJcXFxcbWF0aGl0XCIsIFwiXFxcXG1hdGhiZlwiLCBcIlxcXFxtYXRobm9ybWFsXCIsIC8vIGZhbWlsaWVzXG4gIFwiXFxcXG1hdGhiYlwiLCBcIlxcXFxtYXRoY2FsXCIsIFwiXFxcXG1hdGhmcmFrXCIsIFwiXFxcXG1hdGhzY3JcIiwgXCJcXFxcbWF0aHNmXCIsIFwiXFxcXG1hdGh0dFwiLCAvLyBhbGlhc2VzLCBleGNlcHQgXFxibSBkZWZpbmVkIGJlbG93XG4gIFwiXFxcXEJiYlwiLCBcIlxcXFxib2xkXCIsIFwiXFxcXGZyYWtcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhbGxvd2VkSW5Bcmd1bWVudDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgYm9keSA9IG5vcm1hbGl6ZUFyZ3VtZW50KGFyZ3NbMF0pO1xuICAgIHZhciBmdW5jID0gZnVuY05hbWU7XG5cbiAgICBpZiAoZnVuYyBpbiBmb250QWxpYXNlcykge1xuICAgICAgZnVuYyA9IGZvbnRBbGlhc2VzW2Z1bmNdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImZvbnRcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgZm9udDogZnVuYy5zbGljZSgxKSxcbiAgICAgIGJvZHk6IGJvZHlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZm9udF9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogZm9udF9tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJtY2xhc3NcIixcbiAgbmFtZXM6IFtcIlxcXFxib2xkc3ltYm9sXCIsIFwiXFxcXGJtXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDFcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMi5wYXJzZXI7XG4gICAgdmFyIGJvZHkgPSBhcmdzWzBdO1xuICAgIHZhciBpc0NoYXJhY3RlckJveCA9IHV0aWxzLmlzQ2hhcmFjdGVyQm94KGJvZHkpOyAvLyBhbXNic3kuc3R5J3MgXFxib2xkc3ltYm9sIHVzZXMgXFxiaW5yZWwgc3BhY2luZyB0byBpbmhlcml0IHRoZVxuICAgIC8vIGFyZ3VtZW50J3MgYmlufHJlbHxvcmQgc3RhdHVzXG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtY2xhc3NcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgbWNsYXNzOiBiaW5yZWxDbGFzcyhib2R5KSxcbiAgICAgIGJvZHk6IFt7XG4gICAgICAgIHR5cGU6IFwiZm9udFwiLFxuICAgICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgICAgZm9udDogXCJib2xkc3ltYm9sXCIsXG4gICAgICAgIGJvZHk6IGJvZHlcbiAgICAgIH1dLFxuICAgICAgaXNDaGFyYWN0ZXJCb3g6IGlzQ2hhcmFjdGVyQm94XG4gICAgfTtcbiAgfVxufSk7IC8vIE9sZCBmb250IGNoYW5naW5nIGZ1bmN0aW9uc1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiZm9udFwiLFxuICBuYW1lczogW1wiXFxcXHJtXCIsIFwiXFxcXHNmXCIsIFwiXFxcXHR0XCIsIFwiXFxcXGJmXCIsIFwiXFxcXGl0XCIsIFwiXFxcXGNhbFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAwLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMywgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMy5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZjMuZnVuY05hbWUsXG4gICAgICAgIGJyZWFrT25Ub2tlblRleHQgPSBfcmVmMy5icmVha09uVG9rZW5UZXh0O1xuICAgIHZhciBtb2RlID0gcGFyc2VyLm1vZGU7XG4gICAgdmFyIGJvZHkgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHRydWUsIGJyZWFrT25Ub2tlblRleHQpO1xuICAgIHZhciBzdHlsZSA9IFwibWF0aFwiICsgZnVuY05hbWUuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZm9udFwiLFxuICAgICAgbW9kZTogbW9kZSxcbiAgICAgIGZvbnQ6IHN0eWxlLFxuICAgICAgYm9keToge1xuICAgICAgICB0eXBlOiBcIm9yZGdyb3VwXCIsXG4gICAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgICBib2R5OiBib2R5XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZvbnRfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IGZvbnRfbWF0aG1sQnVpbGRlclxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL2dlbmZyYWMuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgYWRqdXN0U3R5bGUgPSBmdW5jdGlvbiBhZGp1c3RTdHlsZShzaXplLCBvcmlnaW5hbFN0eWxlKSB7XG4gIC8vIEZpZ3VyZSBvdXQgd2hhdCBzdHlsZSB0aGlzIGZyYWN0aW9uIHNob3VsZCBiZSBpbiBiYXNlZCBvbiB0aGVcbiAgLy8gZnVuY3Rpb24gdXNlZFxuICB2YXIgc3R5bGUgPSBvcmlnaW5hbFN0eWxlO1xuXG4gIGlmIChzaXplID09PSBcImRpc3BsYXlcIikge1xuICAgIC8vIEdldCBkaXNwbGF5IHN0eWxlIGFzIGEgZGVmYXVsdC5cbiAgICAvLyBJZiBpbmNvbWluZyBzdHlsZSBpcyBzdWIvc3VwLCB1c2Ugc3R5bGUudGV4dCgpIHRvIGdldCBjb3JyZWN0IHNpemUuXG4gICAgc3R5bGUgPSBzdHlsZS5pZCA+PSBzcmNfU3R5bGUuU0NSSVBULmlkID8gc3R5bGUudGV4dCgpIDogc3JjX1N0eWxlLkRJU1BMQVk7XG4gIH0gZWxzZSBpZiAoc2l6ZSA9PT0gXCJ0ZXh0XCIgJiYgc3R5bGUuc2l6ZSA9PT0gc3JjX1N0eWxlLkRJU1BMQVkuc2l6ZSkge1xuICAgIC8vIFdlJ3JlIGluIGEgXFx0ZnJhYyBidXQgaW5jb21pbmcgc3R5bGUgaXMgZGlzcGxheXN0eWxlLCBzbzpcbiAgICBzdHlsZSA9IHNyY19TdHlsZS5URVhUO1xuICB9IGVsc2UgaWYgKHNpemUgPT09IFwic2NyaXB0XCIpIHtcbiAgICBzdHlsZSA9IHNyY19TdHlsZS5TQ1JJUFQ7XG4gIH0gZWxzZSBpZiAoc2l6ZSA9PT0gXCJzY3JpcHRzY3JpcHRcIikge1xuICAgIHN0eWxlID0gc3JjX1N0eWxlLlNDUklQVFNDUklQVDtcbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBnZW5mcmFjX2h0bWxCdWlsZGVyID0gZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgLy8gRnJhY3Rpb25zIGFyZSBoYW5kbGVkIGluIHRoZSBUZVhib29rIG9uIHBhZ2VzIDQ0NC00NDUsIHJ1bGVzIDE1KGEtZSkuXG4gIHZhciBzdHlsZSA9IGFkanVzdFN0eWxlKGdyb3VwLnNpemUsIG9wdGlvbnMuc3R5bGUpO1xuICB2YXIgbnN0eWxlID0gc3R5bGUuZnJhY051bSgpO1xuICB2YXIgZHN0eWxlID0gc3R5bGUuZnJhY0RlbigpO1xuICB2YXIgbmV3T3B0aW9ucztcbiAgbmV3T3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nU3R5bGUobnN0eWxlKTtcbiAgdmFyIG51bWVybSA9IGJ1aWxkR3JvdXAoZ3JvdXAubnVtZXIsIG5ld09wdGlvbnMsIG9wdGlvbnMpO1xuXG4gIGlmIChncm91cC5jb250aW51ZWQpIHtcbiAgICAvLyBcXGNmcmFjIGluc2VydHMgYSBcXHN0cnV0IGludG8gdGhlIG51bWVyYXRvci5cbiAgICAvLyBHZXQgXFxzdHJ1dCBkaW1lbnNpb25zIGZyb20gVGVYYm9vayBwYWdlIDM1My5cbiAgICB2YXIgaFN0cnV0ID0gOC41IC8gb3B0aW9ucy5mb250TWV0cmljcygpLnB0UGVyRW07XG4gICAgdmFyIGRTdHJ1dCA9IDMuNSAvIG9wdGlvbnMuZm9udE1ldHJpY3MoKS5wdFBlckVtO1xuICAgIG51bWVybS5oZWlnaHQgPSBudW1lcm0uaGVpZ2h0IDwgaFN0cnV0ID8gaFN0cnV0IDogbnVtZXJtLmhlaWdodDtcbiAgICBudW1lcm0uZGVwdGggPSBudW1lcm0uZGVwdGggPCBkU3RydXQgPyBkU3RydXQgOiBudW1lcm0uZGVwdGg7XG4gIH1cblxuICBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShkc3R5bGUpO1xuICB2YXIgZGVub21tID0gYnVpbGRHcm91cChncm91cC5kZW5vbSwgbmV3T3B0aW9ucywgb3B0aW9ucyk7XG4gIHZhciBydWxlO1xuICB2YXIgcnVsZVdpZHRoO1xuICB2YXIgcnVsZVNwYWNpbmc7XG5cbiAgaWYgKGdyb3VwLmhhc0JhckxpbmUpIHtcbiAgICBpZiAoZ3JvdXAuYmFyU2l6ZSkge1xuICAgICAgcnVsZVdpZHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC5iYXJTaXplLCBvcHRpb25zKTtcbiAgICAgIHJ1bGUgPSBidWlsZENvbW1vbi5tYWtlTGluZVNwYW4oXCJmcmFjLWxpbmVcIiwgb3B0aW9ucywgcnVsZVdpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVsZSA9IGJ1aWxkQ29tbW9uLm1ha2VMaW5lU3BhbihcImZyYWMtbGluZVwiLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBydWxlV2lkdGggPSBydWxlLmhlaWdodDtcbiAgICBydWxlU3BhY2luZyA9IHJ1bGUuaGVpZ2h0O1xuICB9IGVsc2Uge1xuICAgIHJ1bGUgPSBudWxsO1xuICAgIHJ1bGVXaWR0aCA9IDA7XG4gICAgcnVsZVNwYWNpbmcgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuZGVmYXVsdFJ1bGVUaGlja25lc3M7XG4gIH0gLy8gUnVsZSAxNWJcblxuXG4gIHZhciBudW1TaGlmdDtcbiAgdmFyIGNsZWFyYW5jZTtcbiAgdmFyIGRlbm9tU2hpZnQ7XG5cbiAgaWYgKHN0eWxlLnNpemUgPT09IHNyY19TdHlsZS5ESVNQTEFZLnNpemUgfHwgZ3JvdXAuc2l6ZSA9PT0gXCJkaXNwbGF5XCIpIHtcbiAgICBudW1TaGlmdCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5udW0xO1xuXG4gICAgaWYgKHJ1bGVXaWR0aCA+IDApIHtcbiAgICAgIGNsZWFyYW5jZSA9IDMgKiBydWxlU3BhY2luZztcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJhbmNlID0gNyAqIHJ1bGVTcGFjaW5nO1xuICAgIH1cblxuICAgIGRlbm9tU2hpZnQgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuZGVub20xO1xuICB9IGVsc2Uge1xuICAgIGlmIChydWxlV2lkdGggPiAwKSB7XG4gICAgICBudW1TaGlmdCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5udW0yO1xuICAgICAgY2xlYXJhbmNlID0gcnVsZVNwYWNpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bVNoaWZ0ID0gb3B0aW9ucy5mb250TWV0cmljcygpLm51bTM7XG4gICAgICBjbGVhcmFuY2UgPSAzICogcnVsZVNwYWNpbmc7XG4gICAgfVxuXG4gICAgZGVub21TaGlmdCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5kZW5vbTI7XG4gIH1cblxuICB2YXIgZnJhYztcblxuICBpZiAoIXJ1bGUpIHtcbiAgICAvLyBSdWxlIDE1Y1xuICAgIHZhciBjYW5kaWRhdGVDbGVhcmFuY2UgPSBudW1TaGlmdCAtIG51bWVybS5kZXB0aCAtIChkZW5vbW0uaGVpZ2h0IC0gZGVub21TaGlmdCk7XG5cbiAgICBpZiAoY2FuZGlkYXRlQ2xlYXJhbmNlIDwgY2xlYXJhbmNlKSB7XG4gICAgICBudW1TaGlmdCArPSAwLjUgKiAoY2xlYXJhbmNlIC0gY2FuZGlkYXRlQ2xlYXJhbmNlKTtcbiAgICAgIGRlbm9tU2hpZnQgKz0gMC41ICogKGNsZWFyYW5jZSAtIGNhbmRpZGF0ZUNsZWFyYW5jZSk7XG4gICAgfVxuXG4gICAgZnJhYyA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGRlbm9tbSxcbiAgICAgICAgc2hpZnQ6IGRlbm9tU2hpZnRcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IG51bWVybSxcbiAgICAgICAgc2hpZnQ6IC1udW1TaGlmdFxuICAgICAgfV1cbiAgICB9LCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBSdWxlIDE1ZFxuICAgIHZhciBheGlzSGVpZ2h0ID0gb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQ7XG5cbiAgICBpZiAobnVtU2hpZnQgLSBudW1lcm0uZGVwdGggLSAoYXhpc0hlaWdodCArIDAuNSAqIHJ1bGVXaWR0aCkgPCBjbGVhcmFuY2UpIHtcbiAgICAgIG51bVNoaWZ0ICs9IGNsZWFyYW5jZSAtIChudW1TaGlmdCAtIG51bWVybS5kZXB0aCAtIChheGlzSGVpZ2h0ICsgMC41ICogcnVsZVdpZHRoKSk7XG4gICAgfVxuXG4gICAgaWYgKGF4aXNIZWlnaHQgLSAwLjUgKiBydWxlV2lkdGggLSAoZGVub21tLmhlaWdodCAtIGRlbm9tU2hpZnQpIDwgY2xlYXJhbmNlKSB7XG4gICAgICBkZW5vbVNoaWZ0ICs9IGNsZWFyYW5jZSAtIChheGlzSGVpZ2h0IC0gMC41ICogcnVsZVdpZHRoIC0gKGRlbm9tbS5oZWlnaHQgLSBkZW5vbVNoaWZ0KSk7XG4gICAgfVxuXG4gICAgdmFyIG1pZFNoaWZ0ID0gLShheGlzSGVpZ2h0IC0gMC41ICogcnVsZVdpZHRoKTtcbiAgICBmcmFjID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJpbmRpdmlkdWFsU2hpZnRcIixcbiAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogZGVub21tLFxuICAgICAgICBzaGlmdDogZGVub21TaGlmdFxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogcnVsZSxcbiAgICAgICAgc2hpZnQ6IG1pZFNoaWZ0XG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBudW1lcm0sXG4gICAgICAgIHNoaWZ0OiAtbnVtU2hpZnRcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0gLy8gU2luY2Ugd2UgbWFudWFsbHkgY2hhbmdlIHRoZSBzdHlsZSBzb21ldGltZXMgKHdpdGggXFxkZnJhYyBvciBcXHRmcmFjKSxcbiAgLy8gYWNjb3VudCBmb3IgdGhlIHBvc3NpYmxlIHNpemUgY2hhbmdlIGhlcmUuXG5cblxuICBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShzdHlsZSk7XG4gIGZyYWMuaGVpZ2h0ICo9IG5ld09wdGlvbnMuc2l6ZU11bHRpcGxpZXIgLyBvcHRpb25zLnNpemVNdWx0aXBsaWVyO1xuICBmcmFjLmRlcHRoICo9IG5ld09wdGlvbnMuc2l6ZU11bHRpcGxpZXIgLyBvcHRpb25zLnNpemVNdWx0aXBsaWVyOyAvLyBSdWxlIDE1ZVxuXG4gIHZhciBkZWxpbVNpemU7XG5cbiAgaWYgKHN0eWxlLnNpemUgPT09IHNyY19TdHlsZS5ESVNQTEFZLnNpemUpIHtcbiAgICBkZWxpbVNpemUgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuZGVsaW0xO1xuICB9IGVsc2UgaWYgKHN0eWxlLnNpemUgPT09IHNyY19TdHlsZS5TQ1JJUFRTQ1JJUFQuc2l6ZSkge1xuICAgIGRlbGltU2l6ZSA9IG9wdGlvbnMuaGF2aW5nU3R5bGUoc3JjX1N0eWxlLlNDUklQVCkuZm9udE1ldHJpY3MoKS5kZWxpbTI7XG4gIH0gZWxzZSB7XG4gICAgZGVsaW1TaXplID0gb3B0aW9ucy5mb250TWV0cmljcygpLmRlbGltMjtcbiAgfVxuXG4gIHZhciBsZWZ0RGVsaW07XG4gIHZhciByaWdodERlbGltO1xuXG4gIGlmIChncm91cC5sZWZ0RGVsaW0gPT0gbnVsbCkge1xuICAgIGxlZnREZWxpbSA9IG1ha2VOdWxsRGVsaW1pdGVyKG9wdGlvbnMsIFtcIm1vcGVuXCJdKTtcbiAgfSBlbHNlIHtcbiAgICBsZWZ0RGVsaW0gPSBkZWxpbWl0ZXIuY3VzdG9tU2l6ZWREZWxpbShncm91cC5sZWZ0RGVsaW0sIGRlbGltU2l6ZSwgdHJ1ZSwgb3B0aW9ucy5oYXZpbmdTdHlsZShzdHlsZSksIGdyb3VwLm1vZGUsIFtcIm1vcGVuXCJdKTtcbiAgfVxuXG4gIGlmIChncm91cC5jb250aW51ZWQpIHtcbiAgICByaWdodERlbGltID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW10pOyAvLyB6ZXJvIHdpZHRoIGZvciBcXGNmcmFjXG4gIH0gZWxzZSBpZiAoZ3JvdXAucmlnaHREZWxpbSA9PSBudWxsKSB7XG4gICAgcmlnaHREZWxpbSA9IG1ha2VOdWxsRGVsaW1pdGVyKG9wdGlvbnMsIFtcIm1jbG9zZVwiXSk7XG4gIH0gZWxzZSB7XG4gICAgcmlnaHREZWxpbSA9IGRlbGltaXRlci5jdXN0b21TaXplZERlbGltKGdyb3VwLnJpZ2h0RGVsaW0sIGRlbGltU2l6ZSwgdHJ1ZSwgb3B0aW9ucy5oYXZpbmdTdHlsZShzdHlsZSksIGdyb3VwLm1vZGUsIFtcIm1jbG9zZVwiXSk7XG4gIH1cblxuICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiXS5jb25jYXQobmV3T3B0aW9ucy5zaXppbmdDbGFzc2VzKG9wdGlvbnMpKSwgW2xlZnREZWxpbSwgYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibWZyYWNcIl0sIFtmcmFjXSksIHJpZ2h0RGVsaW1dLCBvcHRpb25zKTtcbn07XG5cbnZhciBnZW5mcmFjX21hdGhtbEJ1aWxkZXIgPSBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtZnJhY1wiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5udW1lciwgb3B0aW9ucyksIGJ1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuZGVub20sIG9wdGlvbnMpXSk7XG5cbiAgaWYgKCFncm91cC5oYXNCYXJMaW5lKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsaW5ldGhpY2tuZXNzXCIsIFwiMHB4XCIpO1xuICB9IGVsc2UgaWYgKGdyb3VwLmJhclNpemUpIHtcbiAgICB2YXIgcnVsZVdpZHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC5iYXJTaXplLCBvcHRpb25zKTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcImxpbmV0aGlja25lc3NcIiwgbWFrZUVtKHJ1bGVXaWR0aCkpO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gYWRqdXN0U3R5bGUoZ3JvdXAuc2l6ZSwgb3B0aW9ucy5zdHlsZSk7XG5cbiAgaWYgKHN0eWxlLnNpemUgIT09IG9wdGlvbnMuc3R5bGUuc2l6ZSkge1xuICAgIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1zdHlsZVwiLCBbbm9kZV0pO1xuICAgIHZhciBpc0Rpc3BsYXkgPSBzdHlsZS5zaXplID09PSBzcmNfU3R5bGUuRElTUExBWS5zaXplID8gXCJ0cnVlXCIgOiBcImZhbHNlXCI7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkaXNwbGF5c3R5bGVcIiwgaXNEaXNwbGF5KTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcInNjcmlwdGxldmVsXCIsIFwiMFwiKTtcbiAgfVxuXG4gIGlmIChncm91cC5sZWZ0RGVsaW0gIT0gbnVsbCB8fCBncm91cC5yaWdodERlbGltICE9IG51bGwpIHtcbiAgICB2YXIgd2l0aERlbGltcyA9IFtdO1xuXG4gICAgaWYgKGdyb3VwLmxlZnREZWxpbSAhPSBudWxsKSB7XG4gICAgICB2YXIgbGVmdE9wID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtb1wiLCBbbmV3IG1hdGhNTFRyZWUuVGV4dE5vZGUoZ3JvdXAubGVmdERlbGltLnJlcGxhY2UoXCJcXFxcXCIsIFwiXCIpKV0pO1xuICAgICAgbGVmdE9wLnNldEF0dHJpYnV0ZShcImZlbmNlXCIsIFwidHJ1ZVwiKTtcbiAgICAgIHdpdGhEZWxpbXMucHVzaChsZWZ0T3ApO1xuICAgIH1cblxuICAgIHdpdGhEZWxpbXMucHVzaChub2RlKTtcblxuICAgIGlmIChncm91cC5yaWdodERlbGltICE9IG51bGwpIHtcbiAgICAgIHZhciByaWdodE9wID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtb1wiLCBbbmV3IG1hdGhNTFRyZWUuVGV4dE5vZGUoZ3JvdXAucmlnaHREZWxpbS5yZXBsYWNlKFwiXFxcXFwiLCBcIlwiKSldKTtcbiAgICAgIHJpZ2h0T3Auc2V0QXR0cmlidXRlKFwiZmVuY2VcIiwgXCJ0cnVlXCIpO1xuICAgICAgd2l0aERlbGltcy5wdXNoKHJpZ2h0T3ApO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlUm93KHdpdGhEZWxpbXMpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiZ2VuZnJhY1wiLFxuICBuYW1lczogW1wiXFxcXGRmcmFjXCIsIFwiXFxcXGZyYWNcIiwgXCJcXFxcdGZyYWNcIiwgXCJcXFxcZGJpbm9tXCIsIFwiXFxcXGJpbm9tXCIsIFwiXFxcXHRiaW5vbVwiLCBcIlxcXFxcXFxcYXRvcGZyYWNcIiwgLy8gY2Fu4oCZdCBiZSBlbnRlcmVkIGRpcmVjdGx5XG4gIFwiXFxcXFxcXFxicmFjZWZyYWNcIiwgXCJcXFxcXFxcXGJyYWNrZnJhY1wiIC8vIGRpdHRvXG4gIF0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMixcbiAgICBhbGxvd2VkSW5Bcmd1bWVudDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgbnVtZXIgPSBhcmdzWzBdO1xuICAgIHZhciBkZW5vbSA9IGFyZ3NbMV07XG4gICAgdmFyIGhhc0JhckxpbmU7XG4gICAgdmFyIGxlZnREZWxpbSA9IG51bGw7XG4gICAgdmFyIHJpZ2h0RGVsaW0gPSBudWxsO1xuICAgIHZhciBzaXplID0gXCJhdXRvXCI7XG5cbiAgICBzd2l0Y2ggKGZ1bmNOYW1lKSB7XG4gICAgICBjYXNlIFwiXFxcXGRmcmFjXCI6XG4gICAgICBjYXNlIFwiXFxcXGZyYWNcIjpcbiAgICAgIGNhc2UgXCJcXFxcdGZyYWNcIjpcbiAgICAgICAgaGFzQmFyTGluZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiXFxcXFxcXFxhdG9wZnJhY1wiOlxuICAgICAgICBoYXNCYXJMaW5lID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiXFxcXGRiaW5vbVwiOlxuICAgICAgY2FzZSBcIlxcXFxiaW5vbVwiOlxuICAgICAgY2FzZSBcIlxcXFx0Ymlub21cIjpcbiAgICAgICAgaGFzQmFyTGluZSA9IGZhbHNlO1xuICAgICAgICBsZWZ0RGVsaW0gPSBcIihcIjtcbiAgICAgICAgcmlnaHREZWxpbSA9IFwiKVwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxcXFxcYnJhY2VmcmFjXCI6XG4gICAgICAgIGhhc0JhckxpbmUgPSBmYWxzZTtcbiAgICAgICAgbGVmdERlbGltID0gXCJcXFxce1wiO1xuICAgICAgICByaWdodERlbGltID0gXCJcXFxcfVwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxcXFxcYnJhY2tmcmFjXCI6XG4gICAgICAgIGhhc0JhckxpbmUgPSBmYWxzZTtcbiAgICAgICAgbGVmdERlbGltID0gXCJbXCI7XG4gICAgICAgIHJpZ2h0RGVsaW0gPSBcIl1cIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBnZW5mcmFjIGNvbW1hbmRcIik7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmdW5jTmFtZSkge1xuICAgICAgY2FzZSBcIlxcXFxkZnJhY1wiOlxuICAgICAgY2FzZSBcIlxcXFxkYmlub21cIjpcbiAgICAgICAgc2l6ZSA9IFwiZGlzcGxheVwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFx0ZnJhY1wiOlxuICAgICAgY2FzZSBcIlxcXFx0Ymlub21cIjpcbiAgICAgICAgc2l6ZSA9IFwidGV4dFwiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJnZW5mcmFjXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGNvbnRpbnVlZDogZmFsc2UsXG4gICAgICBudW1lcjogbnVtZXIsXG4gICAgICBkZW5vbTogZGVub20sXG4gICAgICBoYXNCYXJMaW5lOiBoYXNCYXJMaW5lLFxuICAgICAgbGVmdERlbGltOiBsZWZ0RGVsaW0sXG4gICAgICByaWdodERlbGltOiByaWdodERlbGltLFxuICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgIGJhclNpemU6IG51bGxcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZ2VuZnJhY19odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogZ2VuZnJhY19tYXRobWxCdWlsZGVyXG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJnZW5mcmFjXCIsXG4gIG5hbWVzOiBbXCJcXFxcY2ZyYWNcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMlxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYyLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYyLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmMi5mdW5jTmFtZTtcbiAgICB2YXIgbnVtZXIgPSBhcmdzWzBdO1xuICAgIHZhciBkZW5vbSA9IGFyZ3NbMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZ2VuZnJhY1wiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBjb250aW51ZWQ6IHRydWUsXG4gICAgICBudW1lcjogbnVtZXIsXG4gICAgICBkZW5vbTogZGVub20sXG4gICAgICBoYXNCYXJMaW5lOiB0cnVlLFxuICAgICAgbGVmdERlbGltOiBudWxsLFxuICAgICAgcmlnaHREZWxpbTogbnVsbCxcbiAgICAgIHNpemU6IFwiZGlzcGxheVwiLFxuICAgICAgYmFyU2l6ZTogbnVsbFxuICAgIH07XG4gIH1cbn0pOyAvLyBJbmZpeCBnZW5lcmFsaXplZCBmcmFjdGlvbnMgLS0gdGhlc2UgYXJlIG5vdCByZW5kZXJlZCBkaXJlY3RseSwgYnV0IHJlcGxhY2VkXG4vLyBpbW1lZGlhdGVseSBieSBvbmUgb2YgdGhlIHZhcmlhbnRzIGFib3ZlLlxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaW5maXhcIixcbiAgbmFtZXM6IFtcIlxcXFxvdmVyXCIsIFwiXFxcXGNob29zZVwiLCBcIlxcXFxhdG9wXCIsIFwiXFxcXGJyYWNlXCIsIFwiXFxcXGJyYWNrXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDAsXG4gICAgaW5maXg6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmMykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmMy5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZjMuZnVuY05hbWUsXG4gICAgICAgIHRva2VuID0gX3JlZjMudG9rZW47XG4gICAgdmFyIHJlcGxhY2VXaXRoO1xuXG4gICAgc3dpdGNoIChmdW5jTmFtZSkge1xuICAgICAgY2FzZSBcIlxcXFxvdmVyXCI6XG4gICAgICAgIHJlcGxhY2VXaXRoID0gXCJcXFxcZnJhY1wiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxjaG9vc2VcIjpcbiAgICAgICAgcmVwbGFjZVdpdGggPSBcIlxcXFxiaW5vbVwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxhdG9wXCI6XG4gICAgICAgIHJlcGxhY2VXaXRoID0gXCJcXFxcXFxcXGF0b3BmcmFjXCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiXFxcXGJyYWNlXCI6XG4gICAgICAgIHJlcGxhY2VXaXRoID0gXCJcXFxcXFxcXGJyYWNlZnJhY1wiO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxicmFja1wiOlxuICAgICAgICByZXBsYWNlV2l0aCA9IFwiXFxcXFxcXFxicmFja2ZyYWNcIjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBpbmZpeCBnZW5mcmFjIGNvbW1hbmRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaW5maXhcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgcmVwbGFjZVdpdGg6IHJlcGxhY2VXaXRoLFxuICAgICAgdG9rZW46IHRva2VuXG4gICAgfTtcbiAgfVxufSk7XG52YXIgc3R5bEFycmF5ID0gW1wiZGlzcGxheVwiLCBcInRleHRcIiwgXCJzY3JpcHRcIiwgXCJzY3JpcHRzY3JpcHRcIl07XG5cbnZhciBkZWxpbUZyb21WYWx1ZSA9IGZ1bmN0aW9uIGRlbGltRnJvbVZhbHVlKGRlbGltU3RyaW5nKSB7XG4gIHZhciBkZWxpbSA9IG51bGw7XG5cbiAgaWYgKGRlbGltU3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICBkZWxpbSA9IGRlbGltU3RyaW5nO1xuICAgIGRlbGltID0gZGVsaW0gPT09IFwiLlwiID8gbnVsbCA6IGRlbGltO1xuICB9XG5cbiAgcmV0dXJuIGRlbGltO1xufTtcblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImdlbmZyYWNcIixcbiAgbmFtZXM6IFtcIlxcXFxnZW5mcmFjXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDYsXG4gICAgYWxsb3dlZEluQXJndW1lbnQ6IHRydWUsXG4gICAgYXJnVHlwZXM6IFtcIm1hdGhcIiwgXCJtYXRoXCIsIFwic2l6ZVwiLCBcInRleHRcIiwgXCJtYXRoXCIsIFwibWF0aFwiXVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY0LCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY0LnBhcnNlcjtcbiAgICB2YXIgbnVtZXIgPSBhcmdzWzRdO1xuICAgIHZhciBkZW5vbSA9IGFyZ3NbNV07IC8vIExvb2sgaW50byB0aGUgcGFyc2Ugbm9kZXMgdG8gZ2V0IHRoZSBkZXNpcmVkIGRlbGltaXRlcnMuXG5cbiAgICB2YXIgbGVmdE5vZGUgPSBub3JtYWxpemVBcmd1bWVudChhcmdzWzBdKTtcbiAgICB2YXIgbGVmdERlbGltID0gbGVmdE5vZGUudHlwZSA9PT0gXCJhdG9tXCIgJiYgbGVmdE5vZGUuZmFtaWx5ID09PSBcIm9wZW5cIiA/IGRlbGltRnJvbVZhbHVlKGxlZnROb2RlLnRleHQpIDogbnVsbDtcbiAgICB2YXIgcmlnaHROb2RlID0gbm9ybWFsaXplQXJndW1lbnQoYXJnc1sxXSk7XG4gICAgdmFyIHJpZ2h0RGVsaW0gPSByaWdodE5vZGUudHlwZSA9PT0gXCJhdG9tXCIgJiYgcmlnaHROb2RlLmZhbWlseSA9PT0gXCJjbG9zZVwiID8gZGVsaW1Gcm9tVmFsdWUocmlnaHROb2RlLnRleHQpIDogbnVsbDtcbiAgICB2YXIgYmFyTm9kZSA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMl0sIFwic2l6ZVwiKTtcbiAgICB2YXIgaGFzQmFyTGluZTtcbiAgICB2YXIgYmFyU2l6ZSA9IG51bGw7XG5cbiAgICBpZiAoYmFyTm9kZS5pc0JsYW5rKSB7XG4gICAgICAvLyBcXGdlbmZyYWMgYWN0cyBkaWZmZXJlbnRseSB0aGFuIFxcYWJvdmUuXG4gICAgICAvLyBcXGdlbmZyYWMgdHJlYXRzIGFuIGVtcHR5IHNpemUgZ3JvdXAgYXMgYSBzaWduYWwgdG8gdXNlIGFcbiAgICAgIC8vIHN0YW5kYXJkIGJhciBzaXplLiBcXGFib3ZlIHdvdWxkIHNlZSBzaXplID0gMCBhbmQgb21pdCB0aGUgYmFyLlxuICAgICAgaGFzQmFyTGluZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhclNpemUgPSBiYXJOb2RlLnZhbHVlO1xuICAgICAgaGFzQmFyTGluZSA9IGJhclNpemUubnVtYmVyID4gMDtcbiAgICB9IC8vIEZpbmQgb3V0IGlmIHdlIHdhbnQgZGlzcGxheXN0eWxlLCB0ZXh0c3R5bGUsIGV0Yy5cblxuXG4gICAgdmFyIHNpemUgPSBcImF1dG9cIjtcbiAgICB2YXIgc3R5bCA9IGFyZ3NbM107XG5cbiAgICBpZiAoc3R5bC50eXBlID09PSBcIm9yZGdyb3VwXCIpIHtcbiAgICAgIGlmIChzdHlsLmJvZHkubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdGV4dE9yZCA9IGFzc2VydE5vZGVUeXBlKHN0eWwuYm9keVswXSwgXCJ0ZXh0b3JkXCIpO1xuICAgICAgICBzaXplID0gc3R5bEFycmF5W051bWJlcih0ZXh0T3JkLnRleHQpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bCA9IGFzc2VydE5vZGVUeXBlKHN0eWwsIFwidGV4dG9yZFwiKTtcbiAgICAgIHNpemUgPSBzdHlsQXJyYXlbTnVtYmVyKHN0eWwudGV4dCldO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImdlbmZyYWNcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgbnVtZXI6IG51bWVyLFxuICAgICAgZGVub206IGRlbm9tLFxuICAgICAgY29udGludWVkOiBmYWxzZSxcbiAgICAgIGhhc0JhckxpbmU6IGhhc0JhckxpbmUsXG4gICAgICBiYXJTaXplOiBiYXJTaXplLFxuICAgICAgbGVmdERlbGltOiBsZWZ0RGVsaW0sXG4gICAgICByaWdodERlbGltOiByaWdodERlbGltLFxuICAgICAgc2l6ZTogc2l6ZVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBnZW5mcmFjX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBnZW5mcmFjX21hdGhtbEJ1aWxkZXJcbn0pOyAvLyBcXGFib3ZlIGlzIGFuIGluZml4IGZyYWN0aW9uIHRoYXQgYWxzbyBkZWZpbmVzIGEgZnJhY3Rpb24gYmFyIHNpemUuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJpbmZpeFwiLFxuICBuYW1lczogW1wiXFxcXGFib3ZlXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInNpemVcIl0sXG4gICAgaW5maXg6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmNSwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmNS5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZjUuZnVuY05hbWUsXG4gICAgICAgIHRva2VuID0gX3JlZjUudG9rZW47XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaW5maXhcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgcmVwbGFjZVdpdGg6IFwiXFxcXFxcXFxhYm92ZWZyYWNcIixcbiAgICAgIHNpemU6IGFzc2VydE5vZGVUeXBlKGFyZ3NbMF0sIFwic2l6ZVwiKS52YWx1ZSxcbiAgICAgIHRva2VuOiB0b2tlblxuICAgIH07XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImdlbmZyYWNcIixcbiAgbmFtZXM6IFtcIlxcXFxcXFxcYWJvdmVmcmFjXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDMsXG4gICAgYXJnVHlwZXM6IFtcIm1hdGhcIiwgXCJzaXplXCIsIFwibWF0aFwiXVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY2LCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY2LnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmNi5mdW5jTmFtZTtcbiAgICB2YXIgbnVtZXIgPSBhcmdzWzBdO1xuICAgIHZhciBiYXJTaXplID0gYXNzZXJ0KGFzc2VydE5vZGVUeXBlKGFyZ3NbMV0sIFwiaW5maXhcIikuc2l6ZSk7XG4gICAgdmFyIGRlbm9tID0gYXJnc1syXTtcbiAgICB2YXIgaGFzQmFyTGluZSA9IGJhclNpemUubnVtYmVyID4gMDtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJnZW5mcmFjXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIG51bWVyOiBudW1lcixcbiAgICAgIGRlbm9tOiBkZW5vbSxcbiAgICAgIGNvbnRpbnVlZDogZmFsc2UsXG4gICAgICBoYXNCYXJMaW5lOiBoYXNCYXJMaW5lLFxuICAgICAgYmFyU2l6ZTogYmFyU2l6ZSxcbiAgICAgIGxlZnREZWxpbTogbnVsbCxcbiAgICAgIHJpZ2h0RGVsaW06IG51bGwsXG4gICAgICBzaXplOiBcImF1dG9cIlxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBnZW5mcmFjX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBnZW5mcmFjX21hdGhtbEJ1aWxkZXJcbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9ob3JpekJyYWNlLmpzXG5cblxuXG5cblxuXG5cblxuLy8gTk9URTogVW5saWtlIG1vc3QgYGh0bWxCdWlsZGVyYHMsIHRoaXMgb25lIGhhbmRsZXMgbm90IG9ubHkgXCJob3JpekJyYWNlXCIsIGJ1dFxuLy8gYWxzbyBcInN1cHN1YlwiIHNpbmNlIGFuIG92ZXIvdW5kZXJicmFjZSBjYW4gYWZmZWN0IHN1cGVyL3N1YnNjcmlwdGluZy5cbnZhciBob3JpekJyYWNlX2h0bWxCdWlsZGVyID0gZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JwLCBvcHRpb25zKSB7XG4gIHZhciBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7IC8vIFB1bGwgb3V0IHRoZSBgUGFyc2VOb2RlPFwiaG9yaXpCcmFjZVwiPmAgaWYgYGdycGAgaXMgYSBcInN1cHN1YlwiIG5vZGUuXG5cbiAgdmFyIHN1cFN1Ykdyb3VwO1xuICB2YXIgZ3JvdXA7XG5cbiAgaWYgKGdycC50eXBlID09PSBcInN1cHN1YlwiKSB7XG4gICAgLy8gUmVmOiBMYVRlWCBzb3VyY2UyZTogfX19fVxcbGltaXRzfVxuICAgIC8vIGkuZS4gTGFUZVggdHJlYXRzIHRoZSBicmFjZSBzaW1pbGFyIHRvIGFuIG9wIGFuZCBwYXNzZXMgaXRcbiAgICAvLyB3aXRoIFxcbGltaXRzLCBzbyB3ZSBuZWVkIHRvIGFzc2lnbiBzdXBzdWIgc3R5bGUuXG4gICAgc3VwU3ViR3JvdXAgPSBncnAuc3VwID8gYnVpbGRHcm91cChncnAuc3VwLCBvcHRpb25zLmhhdmluZ1N0eWxlKHN0eWxlLnN1cCgpKSwgb3B0aW9ucykgOiBidWlsZEdyb3VwKGdycC5zdWIsIG9wdGlvbnMuaGF2aW5nU3R5bGUoc3R5bGUuc3ViKCkpLCBvcHRpb25zKTtcbiAgICBncm91cCA9IGFzc2VydE5vZGVUeXBlKGdycC5iYXNlLCBcImhvcml6QnJhY2VcIik7XG4gIH0gZWxzZSB7XG4gICAgZ3JvdXAgPSBhc3NlcnROb2RlVHlwZShncnAsIFwiaG9yaXpCcmFjZVwiKTtcbiAgfSAvLyBCdWlsZCB0aGUgYmFzZSBncm91cFxuXG5cbiAgdmFyIGJvZHkgPSBidWlsZEdyb3VwKGdyb3VwLmJhc2UsIG9wdGlvbnMuaGF2aW5nQmFzZVN0eWxlKHNyY19TdHlsZS5ESVNQTEFZKSk7IC8vIENyZWF0ZSB0aGUgc3RyZXRjaHkgZWxlbWVudFxuXG4gIHZhciBicmFjZUJvZHkgPSBzdHJldGNoeS5zdmdTcGFuKGdyb3VwLCBvcHRpb25zKTsgLy8gR2VuZXJhdGUgdGhlIHZsaXN0LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBrZXJucyAgICAgICAg4pSP4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSTXG4gIC8vIFRoaXMgZmlyc3Qgdmxpc3QgY29udGFpbnMgdGhlIGNvbnRlbnQgYW5kIHRoZSBicmFjZTogICBlcXVhdGlvblxuXG4gIHZhciB2bGlzdDtcblxuICBpZiAoZ3JvdXAuaXNPdmVyKSB7XG4gICAgdmxpc3QgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImZpcnN0QmFzZWxpbmVcIixcbiAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogYm9keVxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgICAgc2l6ZTogMC4xXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBicmFjZUJvZHlcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7IC8vICRGbG93Rml4TWU6IFJlcGxhY2UgdGhpcyB3aXRoIHBhc3NpbmcgXCJzdmctYWxpZ25cIiBpbnRvIG1ha2VWTGlzdC5cblxuICAgIHZsaXN0LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLmNsYXNzZXMucHVzaChcInN2Zy1hbGlnblwiKTtcbiAgfSBlbHNlIHtcbiAgICB2bGlzdCA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiYm90dG9tXCIsXG4gICAgICBwb3NpdGlvbkRhdGE6IGJvZHkuZGVwdGggKyAwLjEgKyBicmFjZUJvZHkuaGVpZ2h0LFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBicmFjZUJvZHlcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IDAuMVxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogYm9keVxuICAgICAgfV1cbiAgICB9LCBvcHRpb25zKTsgLy8gJEZsb3dGaXhNZTogUmVwbGFjZSB0aGlzIHdpdGggcGFzc2luZyBcInN2Zy1hbGlnblwiIGludG8gbWFrZVZMaXN0LlxuXG4gICAgdmxpc3QuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2xhc3Nlcy5wdXNoKFwic3ZnLWFsaWduXCIpO1xuICB9XG5cbiAgaWYgKHN1cFN1Ykdyb3VwKSB7XG4gICAgLy8gVG8gd3JpdGUgdGhlIHN1cHN1Yiwgd3JhcCB0aGUgZmlyc3Qgdmxpc3QgaW4gYW5vdGhlciB2bGlzdDpcbiAgICAvLyBUaGV5IGNhbid0IGFsbCBnbyBpbiB0aGUgc2FtZSB2bGlzdCwgYmVjYXVzZSB0aGUgbm90ZSBtaWdodCBiZVxuICAgIC8vIHdpZGVyIHRoYW4gdGhlIGVxdWF0aW9uLiBXZSB3YW50IHRoZSBlcXVhdGlvbiB0byBjb250cm9sIHRoZVxuICAgIC8vIGJyYWNlIHdpZHRoLlxuICAgIC8vICAgICAgbm90ZSAgICAgICAgICBsb25nIG5vdGUgICAgICAgICAgIGxvbmcgbm90ZVxuICAgIC8vICAg4pSP4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSTICAgb3IgICAg4pSP4pSB4pSB4pSB4pSTICAgICBub3QgICAg4pSP4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSTXG4gICAgLy8gICAgZXF1YXRpb24gICAgICAgICAgIGVxbiAgICAgICAgICAgICAgICAgZXFuXG4gICAgdmFyIHZTcGFuID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiLCBncm91cC5pc092ZXIgPyBcIm1vdmVyXCIgOiBcIm11bmRlclwiXSwgW3ZsaXN0XSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoZ3JvdXAuaXNPdmVyKSB7XG4gICAgICB2bGlzdCA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICAgIHBvc2l0aW9uVHlwZTogXCJmaXJzdEJhc2VsaW5lXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IHZTcGFuXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgICAgICBzaXplOiAwLjJcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IHN1cFN1Ykdyb3VwXG4gICAgICAgIH1dXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmxpc3QgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgICBwb3NpdGlvblR5cGU6IFwiYm90dG9tXCIsXG4gICAgICAgIHBvc2l0aW9uRGF0YTogdlNwYW4uZGVwdGggKyAwLjIgKyBzdXBTdWJHcm91cC5oZWlnaHQgKyBzdXBTdWJHcm91cC5kZXB0aCxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogc3VwU3ViR3JvdXBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6IFwia2VyblwiLFxuICAgICAgICAgIHNpemU6IDAuMlxuICAgICAgICB9LCB7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogdlNwYW5cbiAgICAgICAgfV1cbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIGdyb3VwLmlzT3ZlciA/IFwibW92ZXJcIiA6IFwibXVuZGVyXCJdLCBbdmxpc3RdLCBvcHRpb25zKTtcbn07XG5cbnZhciBob3JpekJyYWNlX21hdGhtbEJ1aWxkZXIgPSBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gIHZhciBhY2NlbnROb2RlID0gc3RyZXRjaHkubWF0aE1Mbm9kZShncm91cC5sYWJlbCk7XG4gIHJldHVybiBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShncm91cC5pc092ZXIgPyBcIm1vdmVyXCIgOiBcIm11bmRlclwiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5iYXNlLCBvcHRpb25zKSwgYWNjZW50Tm9kZV0pO1xufTsgLy8gSG9yaXpvbnRhbCBzdHJldGNoeSBicmFjZXNcblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaG9yaXpCcmFjZVwiLFxuICBuYW1lczogW1wiXFxcXG92ZXJicmFjZVwiLCBcIlxcXFx1bmRlcmJyYWNlXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDFcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaG9yaXpCcmFjZVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsYWJlbDogZnVuY05hbWUsXG4gICAgICBpc092ZXI6IC9eXFxcXG92ZXIvLnRlc3QoZnVuY05hbWUpLFxuICAgICAgYmFzZTogYXJnc1swXVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBob3JpekJyYWNlX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBob3JpekJyYWNlX21hdGhtbEJ1aWxkZXJcbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9ocmVmLmpzXG5cblxuXG5cblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaHJlZlwiLFxuICBuYW1lczogW1wiXFxcXGhyZWZcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMixcbiAgICBhcmdUeXBlczogW1widXJsXCIsIFwib3JpZ2luYWxcIl0sXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgdmFyIGJvZHkgPSBhcmdzWzFdO1xuICAgIHZhciBocmVmID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJ1cmxcIikudXJsO1xuXG4gICAgaWYgKCFwYXJzZXIuc2V0dGluZ3MuaXNUcnVzdGVkKHtcbiAgICAgIGNvbW1hbmQ6IFwiXFxcXGhyZWZcIixcbiAgICAgIHVybDogaHJlZlxuICAgIH0pKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmZvcm1hdFVuc3VwcG9ydGVkQ21kKFwiXFxcXGhyZWZcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaHJlZlwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBocmVmOiBocmVmLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYm9keSlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucywgZmFsc2UpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlQW5jaG9yKGdyb3VwLmhyZWYsIFtdLCBlbGVtZW50cywgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbWF0aCA9IGJ1aWxkRXhwcmVzc2lvblJvdyhncm91cC5ib2R5LCBvcHRpb25zKTtcblxuICAgIGlmICghKG1hdGggaW5zdGFuY2VvZiBNYXRoTm9kZSkpIHtcbiAgICAgIG1hdGggPSBuZXcgTWF0aE5vZGUoXCJtcm93XCIsIFttYXRoXSk7XG4gICAgfVxuXG4gICAgbWF0aC5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGdyb3VwLmhyZWYpO1xuICAgIHJldHVybiBtYXRoO1xuICB9XG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJocmVmXCIsXG4gIG5hbWVzOiBbXCJcXFxcdXJsXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInVybFwiXSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjIsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjIucGFyc2VyO1xuICAgIHZhciBocmVmID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJ1cmxcIikudXJsO1xuXG4gICAgaWYgKCFwYXJzZXIuc2V0dGluZ3MuaXNUcnVzdGVkKHtcbiAgICAgIGNvbW1hbmQ6IFwiXFxcXHVybFwiLFxuICAgICAgdXJsOiBocmVmXG4gICAgfSkpIHtcbiAgICAgIHJldHVybiBwYXJzZXIuZm9ybWF0VW5zdXBwb3J0ZWRDbWQoXCJcXFxcdXJsXCIpO1xuICAgIH1cblxuICAgIHZhciBjaGFycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBocmVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IGhyZWZbaV07XG5cbiAgICAgIGlmIChjID09PSBcIn5cIikge1xuICAgICAgICBjID0gXCJcXFxcdGV4dGFzY2lpdGlsZGVcIjtcbiAgICAgIH1cblxuICAgICAgY2hhcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidGV4dG9yZFwiLFxuICAgICAgICBtb2RlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogY1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGJvZHkgPSB7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgZm9udDogXCJcXFxcdGV4dHR0XCIsXG4gICAgICBib2R5OiBjaGFyc1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaHJlZlwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBocmVmOiBocmVmLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYm9keSlcbiAgICB9O1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvaGJveC5qc1xuXG5cblxuXG4gLy8gXFxoYm94IGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTGFUZVggXFx2Y2VudGVyLlxuLy8gSW4gTGFUZVgsIFxcdmNlbnRlciBjYW4gYWN0IG9ubHkgb24gYSBib3gsIGFzIGluXG4vLyBcXHZjZW50ZXJ7XFxoYm94eyRcXGZyYWN7YStifXtcXGRmcmFje2N9e2R9fSR9fVxuLy8gVGhpcyBmdW5jdGlvbiBieSBpdHNlbGYgZG9lc24ndCBkbyBhbnl0aGluZyBidXQgcHJldmVudCBhIHNvZnQgbGluZSBicmVhay5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImhib3hcIixcbiAgbmFtZXM6IFtcIlxcXFxoYm94XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInRleHRcIl0sXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBwcmltaXRpdmU6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImhib3hcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYXJnc1swXSlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucywgZmFsc2UpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoZWxlbWVudHMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXJvd1wiLCBidWlsZE1hdGhNTF9idWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucykpO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvaHRtbC5qc1xuXG5cblxuXG5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImh0bWxcIixcbiAgbmFtZXM6IFtcIlxcXFxodG1sQ2xhc3NcIiwgXCJcXFxcaHRtbElkXCIsIFwiXFxcXGh0bWxTdHlsZVwiLCBcIlxcXFxodG1sRGF0YVwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAyLFxuICAgIGFyZ1R5cGVzOiBbXCJyYXdcIiwgXCJvcmlnaW5hbFwiXSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmLmZ1bmNOYW1lLFxuICAgICAgICB0b2tlbiA9IF9yZWYudG9rZW47XG4gICAgdmFyIHZhbHVlID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJyYXdcIikuc3RyaW5nO1xuICAgIHZhciBib2R5ID0gYXJnc1sxXTtcblxuICAgIGlmIChwYXJzZXIuc2V0dGluZ3Muc3RyaWN0KSB7XG4gICAgICBwYXJzZXIuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwiaHRtbEV4dGVuc2lvblwiLCBcIkhUTUwgZXh0ZW5zaW9uIGlzIGRpc2FibGVkIG9uIHN0cmljdCBtb2RlXCIpO1xuICAgIH1cblxuICAgIHZhciB0cnVzdENvbnRleHQ7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcblxuICAgIHN3aXRjaCAoZnVuY05hbWUpIHtcbiAgICAgIGNhc2UgXCJcXFxcaHRtbENsYXNzXCI6XG4gICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSB2YWx1ZTtcbiAgICAgICAgdHJ1c3RDb250ZXh0ID0ge1xuICAgICAgICAgIGNvbW1hbmQ6IFwiXFxcXGh0bWxDbGFzc1wiLFxuICAgICAgICAgIGNsYXNzOiB2YWx1ZVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlxcXFxodG1sSWRcIjpcbiAgICAgICAgYXR0cmlidXRlcy5pZCA9IHZhbHVlO1xuICAgICAgICB0cnVzdENvbnRleHQgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJcXFxcaHRtbElkXCIsXG4gICAgICAgICAgaWQ6IHZhbHVlXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiXFxcXGh0bWxTdHlsZVwiOlxuICAgICAgICBhdHRyaWJ1dGVzLnN0eWxlID0gdmFsdWU7XG4gICAgICAgIHRydXN0Q29udGV4dCA9IHtcbiAgICAgICAgICBjb21tYW5kOiBcIlxcXFxodG1sU3R5bGVcIixcbiAgICAgICAgICBzdHlsZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJcXFxcaHRtbERhdGFcIjpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBkYXRhID0gdmFsdWUuc3BsaXQoXCIsXCIpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsID0gZGF0YVtpXS5zcGxpdChcIj1cIik7XG5cbiAgICAgICAgICAgIGlmIChrZXlWYWwubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkVycm9yIHBhcnNpbmcga2V5LXZhbHVlIGZvciBcXFxcaHRtbERhdGFcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbXCJkYXRhLVwiICsga2V5VmFsWzBdLnRyaW0oKV0gPSBrZXlWYWxbMV0udHJpbSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRydXN0Q29udGV4dCA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwiXFxcXGh0bWxEYXRhXCIsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzXG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgaHRtbCBjb21tYW5kXCIpO1xuICAgIH1cblxuICAgIGlmICghcGFyc2VyLnNldHRpbmdzLmlzVHJ1c3RlZCh0cnVzdENvbnRleHQpKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmZvcm1hdFVuc3VwcG9ydGVkQ21kKGZ1bmNOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJodG1sXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICBib2R5OiBvcmRhcmd1bWVudChib2R5KVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBlbGVtZW50cyA9IGJ1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLCBmYWxzZSk7XG4gICAgdmFyIGNsYXNzZXMgPSBbXCJlbmNsb3NpbmdcIl07XG5cbiAgICBpZiAoZ3JvdXAuYXR0cmlidXRlcy5jbGFzcykge1xuICAgICAgY2xhc3Nlcy5wdXNoLmFwcGx5KGNsYXNzZXMsIGdyb3VwLmF0dHJpYnV0ZXMuY2xhc3MudHJpbSgpLnNwbGl0KC9cXHMrLykpO1xuICAgIH1cblxuICAgIHZhciBzcGFuID0gYnVpbGRDb21tb24ubWFrZVNwYW4oY2xhc3NlcywgZWxlbWVudHMsIG9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBncm91cC5hdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoYXR0ciAhPT0gXCJjbGFzc1wiICYmIGdyb3VwLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoYXR0ciwgZ3JvdXAuYXR0cmlidXRlc1thdHRyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW47XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYnVpbGRFeHByZXNzaW9uUm93KGdyb3VwLmJvZHksIG9wdGlvbnMpO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvaHRtbG1hdGhtbC5qc1xuXG5cblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwiaHRtbG1hdGhtbFwiLFxuICBuYW1lczogW1wiXFxcXGh0bWxAbWF0aG1sXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDIsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaHRtbG1hdGhtbFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBodG1sOiBvcmRhcmd1bWVudChhcmdzWzBdKSxcbiAgICAgIG1hdGhtbDogb3JkYXJndW1lbnQoYXJnc1sxXSlcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuaHRtbCwgb3B0aW9ucywgZmFsc2UpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoZWxlbWVudHMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGJ1aWxkRXhwcmVzc2lvblJvdyhncm91cC5tYXRobWwsIG9wdGlvbnMpO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvaW5jbHVkZWdyYXBoaWNzLmpzXG5cblxuXG5cblxuXG5cbnZhciBzaXplRGF0YSA9IGZ1bmN0aW9uIHNpemVEYXRhKHN0cikge1xuICBpZiAoL15bLStdPyAqKFxcZCsoXFwuXFxkKik/fFxcLlxcZCspJC8udGVzdChzdHIpKSB7XG4gICAgLy8gc3RyIGlzIGEgbnVtYmVyIHdpdGggbm8gdW5pdCBzcGVjaWZpZWQuXG4gICAgLy8gZGVmYXVsdCB1bml0IGlzIGJwLCBwZXIgZ3JhcGhpeCBwYWNrYWdlLlxuICAgIHJldHVybiB7XG4gICAgICBudW1iZXI6ICtzdHIsXG4gICAgICB1bml0OiBcImJwXCJcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBtYXRjaCA9IC8oWy0rXT8pICooXFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSAqKFthLXpdezJ9KS8uZXhlYyhzdHIpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBzaXplOiAnXCIgKyBzdHIgKyBcIicgaW4gXFxcXGluY2x1ZGVncmFwaGljc1wiKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIG51bWJlcjogKyhtYXRjaFsxXSArIG1hdGNoWzJdKSxcbiAgICAgIC8vIHNpZ24gKyBtYWduaXR1ZGUsIGNhc3QgdG8gbnVtYmVyXG4gICAgICB1bml0OiBtYXRjaFszXVxuICAgIH07XG5cbiAgICBpZiAoIXZhbGlkVW5pdChkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCB1bml0OiAnXCIgKyBkYXRhLnVuaXQgKyBcIicgaW4gXFxcXGluY2x1ZGVncmFwaGljcy5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn07XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJpbmNsdWRlZ3JhcGhpY3NcIixcbiAgbmFtZXM6IFtcIlxcXFxpbmNsdWRlZ3JhcGhpY3NcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBudW1PcHRpb25hbEFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInJhd1wiLCBcInVybFwiXSxcbiAgICBhbGxvd2VkSW5UZXh0OiBmYWxzZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MsIG9wdEFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgdmFyIHdpZHRoID0ge1xuICAgICAgbnVtYmVyOiAwLFxuICAgICAgdW5pdDogXCJlbVwiXG4gICAgfTtcbiAgICB2YXIgaGVpZ2h0ID0ge1xuICAgICAgbnVtYmVyOiAwLjksXG4gICAgICB1bml0OiBcImVtXCJcbiAgICB9OyAvLyBzb3J0YSBjaGFyYWN0ZXIgc2l6ZWQuXG5cbiAgICB2YXIgdG90YWxoZWlnaHQgPSB7XG4gICAgICBudW1iZXI6IDAsXG4gICAgICB1bml0OiBcImVtXCJcbiAgICB9O1xuICAgIHZhciBhbHQgPSBcIlwiO1xuXG4gICAgaWYgKG9wdEFyZ3NbMF0pIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVTdHIgPSBhc3NlcnROb2RlVHlwZShvcHRBcmdzWzBdLCBcInJhd1wiKS5zdHJpbmc7IC8vIFBhcnNlci5qcyBkb2VzIG5vdCBwYXJzZSBrZXkvdmFsdWUgcGFpcnMuIFdlIGdldCBhIHN0cmluZy5cblxuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVTdHIuc3BsaXQoXCIsXCIpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGtleVZhbCA9IGF0dHJpYnV0ZXNbaV0uc3BsaXQoXCI9XCIpO1xuXG4gICAgICAgIGlmIChrZXlWYWwubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgdmFyIHN0ciA9IGtleVZhbFsxXS50cmltKCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGtleVZhbFswXS50cmltKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhbHRcIjpcbiAgICAgICAgICAgICAgYWx0ID0gc3RyO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcIndpZHRoXCI6XG4gICAgICAgICAgICAgIHdpZHRoID0gc2l6ZURhdGEoc3RyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJoZWlnaHRcIjpcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gc2l6ZURhdGEoc3RyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJ0b3RhbGhlaWdodFwiOlxuICAgICAgICAgICAgICB0b3RhbGhlaWdodCA9IHNpemVEYXRhKHN0cik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJJbnZhbGlkIGtleTogJ1wiICsga2V5VmFsWzBdICsgXCInIGluIFxcXFxpbmNsdWRlZ3JhcGhpY3MuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzcmMgPSBhc3NlcnROb2RlVHlwZShhcmdzWzBdLCBcInVybFwiKS51cmw7XG5cbiAgICBpZiAoYWx0ID09PSBcIlwiKSB7XG4gICAgICAvLyBObyBhbHQgZ2l2ZW4uIFVzZSB0aGUgZmlsZSBuYW1lLiBTdHJpcCBhd2F5IHRoZSBwYXRoLlxuICAgICAgYWx0ID0gc3JjO1xuICAgICAgYWx0ID0gYWx0LnJlcGxhY2UoL14uKltcXFxcL10vLCAnJyk7XG4gICAgICBhbHQgPSBhbHQuc3Vic3RyaW5nKDAsIGFsdC5sYXN0SW5kZXhPZignLicpKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnNlci5zZXR0aW5ncy5pc1RydXN0ZWQoe1xuICAgICAgY29tbWFuZDogXCJcXFxcaW5jbHVkZWdyYXBoaWNzXCIsXG4gICAgICB1cmw6IHNyY1xuICAgIH0pKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLmZvcm1hdFVuc3VwcG9ydGVkQ21kKFwiXFxcXGluY2x1ZGVncmFwaGljc1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJpbmNsdWRlZ3JhcGhpY3NcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYWx0OiBhbHQsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHRvdGFsaGVpZ2h0OiB0b3RhbGhlaWdodCxcbiAgICAgIHNyYzogc3JjXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIGhlaWdodCA9IGNhbGN1bGF0ZVNpemUoZ3JvdXAuaGVpZ2h0LCBvcHRpb25zKTtcbiAgICB2YXIgZGVwdGggPSAwO1xuXG4gICAgaWYgKGdyb3VwLnRvdGFsaGVpZ2h0Lm51bWJlciA+IDApIHtcbiAgICAgIGRlcHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC50b3RhbGhlaWdodCwgb3B0aW9ucykgLSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoID0gMDtcblxuICAgIGlmIChncm91cC53aWR0aC5udW1iZXIgPiAwKSB7XG4gICAgICB3aWR0aCA9IGNhbGN1bGF0ZVNpemUoZ3JvdXAud2lkdGgsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHZhciBzdHlsZSA9IHtcbiAgICAgIGhlaWdodDogbWFrZUVtKGhlaWdodCArIGRlcHRoKVxuICAgIH07XG5cbiAgICBpZiAod2lkdGggPiAwKSB7XG4gICAgICBzdHlsZS53aWR0aCA9IG1ha2VFbSh3aWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKGRlcHRoID4gMCkge1xuICAgICAgc3R5bGUudmVydGljYWxBbGlnbiA9IG1ha2VFbSgtZGVwdGgpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gbmV3IEltZyhncm91cC5zcmMsIGdyb3VwLmFsdCwgc3R5bGUpO1xuICAgIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIG5vZGUuZGVwdGggPSBkZXB0aDtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtZ2x5cGhcIiwgW10pO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiYWx0XCIsIGdyb3VwLmFsdCk7XG4gICAgdmFyIGhlaWdodCA9IGNhbGN1bGF0ZVNpemUoZ3JvdXAuaGVpZ2h0LCBvcHRpb25zKTtcbiAgICB2YXIgZGVwdGggPSAwO1xuXG4gICAgaWYgKGdyb3VwLnRvdGFsaGVpZ2h0Lm51bWJlciA+IDApIHtcbiAgICAgIGRlcHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC50b3RhbGhlaWdodCwgb3B0aW9ucykgLSBoZWlnaHQ7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcInZhbGlnblwiLCBtYWtlRW0oLWRlcHRoKSk7XG4gICAgfVxuXG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgbWFrZUVtKGhlaWdodCArIGRlcHRoKSk7XG5cbiAgICBpZiAoZ3JvdXAud2lkdGgubnVtYmVyID4gMCkge1xuICAgICAgdmFyIHdpZHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC53aWR0aCwgb3B0aW9ucyk7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIG1ha2VFbSh3aWR0aCkpO1xuICAgIH1cblxuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3JjXCIsIGdyb3VwLnNyYyk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9rZXJuLmpzXG4vLyBIb3Jpem9udGFsIHNwYWNpbmcgY29tbWFuZHNcblxuXG5cblxuIC8vIFRPRE86IFxcaHNraXAgYW5kIFxcbXNraXAgc2hvdWxkIHN1cHBvcnQgcGx1cyBhbmQgbWludXMgaW4gbGVuZ3Roc1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwia2VyblwiLFxuICBuYW1lczogW1wiXFxcXGtlcm5cIiwgXCJcXFxcbWtlcm5cIiwgXCJcXFxcaHNraXBcIiwgXCJcXFxcbXNraXBcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhcmdUeXBlczogW1wic2l6ZVwiXSxcbiAgICBwcmltaXRpdmU6IHRydWUsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgc2l6ZSA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMF0sIFwic2l6ZVwiKTtcblxuICAgIGlmIChwYXJzZXIuc2V0dGluZ3Muc3RyaWN0KSB7XG4gICAgICB2YXIgbWF0aEZ1bmN0aW9uID0gZnVuY05hbWVbMV0gPT09ICdtJzsgLy8gXFxta2VybiwgXFxtc2tpcFxuXG4gICAgICB2YXIgbXVVbml0ID0gc2l6ZS52YWx1ZS51bml0ID09PSAnbXUnO1xuXG4gICAgICBpZiAobWF0aEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICghbXVVbml0KSB7XG4gICAgICAgICAgcGFyc2VyLnNldHRpbmdzLnJlcG9ydE5vbnN0cmljdChcIm1hdGhWc1RleHRVbml0c1wiLCBcIkxhVGVYJ3MgXCIgKyBmdW5jTmFtZSArIFwiIHN1cHBvcnRzIG9ubHkgbXUgdW5pdHMsIFwiICsgKFwibm90IFwiICsgc2l6ZS52YWx1ZS51bml0ICsgXCIgdW5pdHNcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlci5tb2RlICE9PSBcIm1hdGhcIikge1xuICAgICAgICAgIHBhcnNlci5zZXR0aW5ncy5yZXBvcnROb25zdHJpY3QoXCJtYXRoVnNUZXh0VW5pdHNcIiwgXCJMYVRlWCdzIFwiICsgZnVuY05hbWUgKyBcIiB3b3JrcyBvbmx5IGluIG1hdGggbW9kZVwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gIW1hdGhGdW5jdGlvblxuICAgICAgICBpZiAobXVVbml0KSB7XG4gICAgICAgICAgcGFyc2VyLnNldHRpbmdzLnJlcG9ydE5vbnN0cmljdChcIm1hdGhWc1RleHRVbml0c1wiLCBcIkxhVGVYJ3MgXCIgKyBmdW5jTmFtZSArIFwiIGRvZXNuJ3Qgc3VwcG9ydCBtdSB1bml0c1wiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgZGltZW5zaW9uOiBzaXplLnZhbHVlXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VHbHVlKGdyb3VwLmRpbWVuc2lvbiwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGltZW5zaW9uID0gY2FsY3VsYXRlU2l6ZShncm91cC5kaW1lbnNpb24sIG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgbWF0aE1MVHJlZS5TcGFjZU5vZGUoZGltZW5zaW9uKTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL2xhcC5qc1xuLy8gSG9yaXpvbnRhbCBvdmVybGFwIGZ1bmN0aW9uc1xuXG5cblxuXG5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcImxhcFwiLFxuICBuYW1lczogW1wiXFxcXG1hdGhsbGFwXCIsIFwiXFxcXG1hdGhybGFwXCIsIFwiXFxcXG1hdGhjbGFwXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXIsXG4gICAgICAgIGZ1bmNOYW1lID0gX3JlZi5mdW5jTmFtZTtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwibGFwXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGFsaWdubWVudDogZnVuY05hbWUuc2xpY2UoNSksXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gbWF0aGxsYXAsIG1hdGhybGFwLCBtYXRoY2xhcFxuICAgIHZhciBpbm5lcjtcblxuICAgIGlmIChncm91cC5hbGlnbm1lbnQgPT09IFwiY2xhcFwiKSB7XG4gICAgICAvLyByZWY6IGh0dHBzOi8vd3d3Lm1hdGgubHN1LmVkdS9+YXBlcmxpcy9wdWJsaWNhdGlvbnMvbWF0aGNsYXAvXG4gICAgICBpbm5lciA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtdLCBbYnVpbGRHcm91cChncm91cC5ib2R5LCBvcHRpb25zKV0pOyAvLyB3cmFwLCBzaW5jZSBDU1Mgd2lsbCBjZW50ZXIgYSAuY2xhcCA+IC5pbm5lciA+IHNwYW5cblxuICAgICAgaW5uZXIgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJpbm5lclwiXSwgW2lubmVyXSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiaW5uZXJcIl0sIFtidWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMpXSk7XG4gICAgfVxuXG4gICAgdmFyIGZpeCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImZpeFwiXSwgW10pO1xuICAgIHZhciBub2RlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW2dyb3VwLmFsaWdubWVudF0sIFtpbm5lciwgZml4XSwgb3B0aW9ucyk7IC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgY29ycmVjdGx5IHNldCBob3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGVcbiAgICAvLyB0d28gaXRlbXMgaW52b2x2ZWQgaW4gdGhlIGxhcC5cbiAgICAvLyBOZXh0LCB1c2UgYSBzdHJ1dCB0byBzZXQgdGhlIGhlaWdodCBvZiB0aGUgSFRNTCBib3VuZGluZyBib3guXG4gICAgLy8gT3RoZXJ3aXNlLCBhIHRhbGwgYXJndW1lbnQgbWF5IGJlIG1pc3BsYWNlZC5cbiAgICAvLyBUaGlzIGNvZGUgcmVzb2x2ZWQgaXNzdWUgIzExNTNcblxuICAgIHZhciBzdHJ1dCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcInN0cnV0XCJdKTtcbiAgICBzdHJ1dC5zdHlsZS5oZWlnaHQgPSBtYWtlRW0obm9kZS5oZWlnaHQgKyBub2RlLmRlcHRoKTtcblxuICAgIGlmIChub2RlLmRlcHRoKSB7XG4gICAgICBzdHJ1dC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gbWFrZUVtKC1ub2RlLmRlcHRoKTtcbiAgICB9XG5cbiAgICBub2RlLmNoaWxkcmVuLnVuc2hpZnQoc3RydXQpOyAvLyBOZXh0LCBwcmV2ZW50IHZlcnRpY2FsIG1pc3BsYWNlbWVudCB3aGVuIG5leHQgdG8gc29tZXRoaW5nIHRhbGwuXG4gICAgLy8gVGhpcyBjb2RlIHJlc29sdmVzIGlzc3VlICMxMjM0XG5cbiAgICBub2RlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1widGhpbmJveFwiXSwgW25vZGVdLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiLCBcInZib3hcIl0sIFtub2RlXSwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICAvLyBtYXRobGxhcCwgbWF0aHJsYXAsIG1hdGhjbGFwXG4gICAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1wYWRkZWRcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucyldKTtcblxuICAgIGlmIChncm91cC5hbGlnbm1lbnQgIT09IFwicmxhcFwiKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gZ3JvdXAuYWxpZ25tZW50ID09PSBcImxsYXBcIiA/IFwiLTFcIiA6IFwiLTAuNVwiO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsc3BhY2VcIiwgb2Zmc2V0ICsgXCJ3aWR0aFwiKTtcbiAgICB9XG5cbiAgICBub2RlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMHB4XCIpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvbWF0aC5qc1xuXG4gLy8gU3dpdGNoaW5nIGZyb20gdGV4dCBtb2RlIGJhY2sgdG8gbWF0aCBtb2RlXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJzdHlsaW5nXCIsXG4gIG5hbWVzOiBbXCJcXFxcKFwiLCBcIiRcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlLFxuICAgIGFsbG93ZWRJbk1hdGg6IGZhbHNlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWUsXG4gICAgICAgIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBvdXRlck1vZGUgPSBwYXJzZXIubW9kZTtcbiAgICBwYXJzZXIuc3dpdGNoTW9kZShcIm1hdGhcIik7XG4gICAgdmFyIGNsb3NlID0gZnVuY05hbWUgPT09IFwiXFxcXChcIiA/IFwiXFxcXClcIiA6IFwiJFwiO1xuICAgIHZhciBib2R5ID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihmYWxzZSwgY2xvc2UpO1xuICAgIHBhcnNlci5leHBlY3QoY2xvc2UpO1xuICAgIHBhcnNlci5zd2l0Y2hNb2RlKG91dGVyTW9kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwic3R5bGluZ1wiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBzdHlsZTogXCJ0ZXh0XCIsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfVxufSk7IC8vIENoZWNrIGZvciBleHRyYSBjbG9zaW5nIG1hdGggZGVsaW1pdGVyc1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwidGV4dFwiLFxuICAvLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoaXMgaXMuXG4gIG5hbWVzOiBbXCJcXFxcKVwiLCBcIlxcXFxdXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDAsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZSxcbiAgICBhbGxvd2VkSW5NYXRoOiBmYWxzZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGNvbnRleHQsIGFyZ3MpIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJNaXNtYXRjaGVkIFwiICsgY29udGV4dC5mdW5jTmFtZSk7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9tYXRoY2hvaWNlLmpzXG5cblxuXG5cblxuXG52YXIgY2hvb3NlTWF0aFN0eWxlID0gZnVuY3Rpb24gY2hvb3NlTWF0aFN0eWxlKGdyb3VwLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAob3B0aW9ucy5zdHlsZS5zaXplKSB7XG4gICAgY2FzZSBzcmNfU3R5bGUuRElTUExBWS5zaXplOlxuICAgICAgcmV0dXJuIGdyb3VwLmRpc3BsYXk7XG5cbiAgICBjYXNlIHNyY19TdHlsZS5URVhULnNpemU6XG4gICAgICByZXR1cm4gZ3JvdXAudGV4dDtcblxuICAgIGNhc2Ugc3JjX1N0eWxlLlNDUklQVC5zaXplOlxuICAgICAgcmV0dXJuIGdyb3VwLnNjcmlwdDtcblxuICAgIGNhc2Ugc3JjX1N0eWxlLlNDUklQVFNDUklQVC5zaXplOlxuICAgICAgcmV0dXJuIGdyb3VwLnNjcmlwdHNjcmlwdDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ3JvdXAudGV4dDtcbiAgfVxufTtcblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm1hdGhjaG9pY2VcIixcbiAgbmFtZXM6IFtcIlxcXFxtYXRoY2hvaWNlXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDQsXG4gICAgcHJpbWl0aXZlOiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtYXRoY2hvaWNlXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGRpc3BsYXk6IG9yZGFyZ3VtZW50KGFyZ3NbMF0pLFxuICAgICAgdGV4dDogb3JkYXJndW1lbnQoYXJnc1sxXSksXG4gICAgICBzY3JpcHQ6IG9yZGFyZ3VtZW50KGFyZ3NbMl0pLFxuICAgICAgc2NyaXB0c2NyaXB0OiBvcmRhcmd1bWVudChhcmdzWzNdKVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBib2R5ID0gY2hvb3NlTWF0aFN0eWxlKGdyb3VwLCBvcHRpb25zKTtcbiAgICB2YXIgZWxlbWVudHMgPSBidWlsZEV4cHJlc3Npb24oYm9keSwgb3B0aW9ucywgZmFsc2UpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoZWxlbWVudHMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIGJvZHkgPSBjaG9vc2VNYXRoU3R5bGUoZ3JvdXAsIG9wdGlvbnMpO1xuICAgIHJldHVybiBidWlsZEV4cHJlc3Npb25Sb3coYm9keSwgb3B0aW9ucyk7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy91dGlscy9hc3NlbWJsZVN1cFN1Yi5qc1xuXG5cblxuIC8vIEZvciBhbiBvcGVyYXRvciB3aXRoIGxpbWl0cywgYXNzZW1ibGUgdGhlIGJhc2UsIHN1cCwgYW5kIHN1YiBpbnRvIGEgc3Bhbi5cblxudmFyIGFzc2VtYmxlU3VwU3ViID0gZnVuY3Rpb24gYXNzZW1ibGVTdXBTdWIoYmFzZSwgc3VwR3JvdXAsIHN1Ykdyb3VwLCBvcHRpb25zLCBzdHlsZSwgc2xhbnQsIGJhc2VTaGlmdCkge1xuICBiYXNlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW10sIFtiYXNlXSk7XG4gIHZhciBzdWJJc1NpbmdsZUNoYXJhY3RlciA9IHN1Ykdyb3VwICYmIHV0aWxzLmlzQ2hhcmFjdGVyQm94KHN1Ykdyb3VwKTtcbiAgdmFyIHN1YjtcbiAgdmFyIHN1cDsgLy8gV2UgbWFudWFsbHkgaGF2ZSB0byBoYW5kbGUgdGhlIHN1cGVyc2NyaXB0cyBhbmQgc3Vic2NyaXB0cy4gVGhpcyxcbiAgLy8gYXNpZGUgZnJvbSB0aGUga2VybiBjYWxjdWxhdGlvbnMsIGlzIGNvcGllZCBmcm9tIHN1cHN1Yi5cblxuICBpZiAoc3VwR3JvdXApIHtcbiAgICB2YXIgZWxlbSA9IGJ1aWxkR3JvdXAoc3VwR3JvdXAsIG9wdGlvbnMuaGF2aW5nU3R5bGUoc3R5bGUuc3VwKCkpLCBvcHRpb25zKTtcbiAgICBzdXAgPSB7XG4gICAgICBlbGVtOiBlbGVtLFxuICAgICAga2VybjogTWF0aC5tYXgob3B0aW9ucy5mb250TWV0cmljcygpLmJpZ09wU3BhY2luZzEsIG9wdGlvbnMuZm9udE1ldHJpY3MoKS5iaWdPcFNwYWNpbmczIC0gZWxlbS5kZXB0aClcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN1Ykdyb3VwKSB7XG4gICAgdmFyIF9lbGVtID0gYnVpbGRHcm91cChzdWJHcm91cCwgb3B0aW9ucy5oYXZpbmdTdHlsZShzdHlsZS5zdWIoKSksIG9wdGlvbnMpO1xuXG4gICAgc3ViID0ge1xuICAgICAgZWxlbTogX2VsZW0sXG4gICAgICBrZXJuOiBNYXRoLm1heChvcHRpb25zLmZvbnRNZXRyaWNzKCkuYmlnT3BTcGFjaW5nMiwgb3B0aW9ucy5mb250TWV0cmljcygpLmJpZ09wU3BhY2luZzQgLSBfZWxlbS5oZWlnaHQpXG4gICAgfTtcbiAgfSAvLyBCdWlsZCB0aGUgZmluYWwgZ3JvdXAgYXMgYSB2bGlzdCBvZiB0aGUgcG9zc2libGUgc3Vic2NyaXB0LCBiYXNlLFxuICAvLyBhbmQgcG9zc2libGUgc3VwZXJzY3JpcHQuXG5cblxuICB2YXIgZmluYWxHcm91cDtcblxuICBpZiAoc3VwICYmIHN1Yikge1xuICAgIHZhciBib3R0b20gPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuYmlnT3BTcGFjaW5nNSArIHN1Yi5lbGVtLmhlaWdodCArIHN1Yi5lbGVtLmRlcHRoICsgc3ViLmtlcm4gKyBiYXNlLmRlcHRoICsgYmFzZVNoaWZ0O1xuICAgIGZpbmFsR3JvdXAgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImJvdHRvbVwiLFxuICAgICAgcG9zaXRpb25EYXRhOiBib3R0b20sXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5iaWdPcFNwYWNpbmc1XG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBzdWIuZWxlbSxcbiAgICAgICAgbWFyZ2luTGVmdDogbWFrZUVtKC1zbGFudClcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IHN1Yi5rZXJuXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBiYXNlXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwia2VyblwiLFxuICAgICAgICBzaXplOiBzdXAua2VyblxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogc3VwLmVsZW0sXG4gICAgICAgIG1hcmdpbkxlZnQ6IG1ha2VFbShzbGFudClcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5iaWdPcFNwYWNpbmc1XG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHN1Yikge1xuICAgIHZhciB0b3AgPSBiYXNlLmhlaWdodCAtIGJhc2VTaGlmdDsgLy8gU2hpZnQgdGhlIGxpbWl0cyBieSB0aGUgc2xhbnQgb2YgdGhlIHN5bWJvbC4gTm90ZVxuICAgIC8vIHRoYXQgd2UgYXJlIHN1cHBvc2VkIHRvIHNoaWZ0IHRoZSBsaW1pdHMgYnkgMS8yIG9mIHRoZSBzbGFudCxcbiAgICAvLyBidXQgc2luY2Ugd2UgYXJlIGNlbnRlcmluZyB0aGUgbGltaXRzIGFkZGluZyBhIGZ1bGwgc2xhbnQgb2ZcbiAgICAvLyBtYXJnaW4gd2lsbCBzaGlmdCBieSAxLzIgdGhhdC5cblxuICAgIGZpbmFsR3JvdXAgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcInRvcFwiLFxuICAgICAgcG9zaXRpb25EYXRhOiB0b3AsXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5iaWdPcFNwYWNpbmc1XG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBzdWIuZWxlbSxcbiAgICAgICAgbWFyZ2luTGVmdDogbWFrZUVtKC1zbGFudClcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IHN1Yi5rZXJuXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBiYXNlXG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKHN1cCkge1xuICAgIHZhciBfYm90dG9tID0gYmFzZS5kZXB0aCArIGJhc2VTaGlmdDtcblxuICAgIGZpbmFsR3JvdXAgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImJvdHRvbVwiLFxuICAgICAgcG9zaXRpb25EYXRhOiBfYm90dG9tLFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBiYXNlXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwia2VyblwiLFxuICAgICAgICBzaXplOiBzdXAua2VyblxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogc3VwLmVsZW0sXG4gICAgICAgIG1hcmdpbkxlZnQ6IG1ha2VFbShzbGFudClcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udE1ldHJpY3MoKS5iaWdPcFNwYWNpbmc1XG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgY2FzZSBwcm9iYWJseSBzaG91bGRuJ3Qgb2NjdXIgKHRoaXMgd291bGQgbWVhbiB0aGVcbiAgICAvLyBzdXBzdWIgd2FzIHNlbmRpbmcgdXMgYSBncm91cCB3aXRoIG5vIHN1cGVyc2NyaXB0IG9yXG4gICAgLy8gc3Vic2NyaXB0KSBidXQgYmUgc2FmZS5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIHZhciBwYXJ0cyA9IFtmaW5hbEdyb3VwXTtcblxuICBpZiAoc3ViICYmIHNsYW50ICE9PSAwICYmICFzdWJJc1NpbmdsZUNoYXJhY3Rlcikge1xuICAgIC8vIEEgbmVnYXRpdmUgbWFyZ2luLWxlZnQgd2FzIGFwcGxpZWQgdG8gdGhlIGxvd2VyIGxpbWl0LlxuICAgIC8vIEF2b2lkIGFuIG92ZXJsYXAgYnkgcGxhY2luZyBhIHNwYWNlciBvbiB0aGUgbGVmdCBvbiB0aGUgZ3JvdXAuXG4gICAgdmFyIHNwYWNlciA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1zcGFjZVwiXSwgW10sIG9wdGlvbnMpO1xuICAgIHNwYWNlci5zdHlsZS5tYXJnaW5SaWdodCA9IG1ha2VFbShzbGFudCk7XG4gICAgcGFydHMudW5zaGlmdChzcGFjZXIpO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcFwiLCBcIm9wLWxpbWl0c1wiXSwgcGFydHMsIG9wdGlvbnMpO1xufTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvb3AuanNcbi8vIExpbWl0cywgc3ltYm9sc1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIE1vc3Qgb3BlcmF0b3JzIGhhdmUgYSBsYXJnZSBzdWNjZXNzb3Igc3ltYm9sLCBidXQgdGhlc2UgZG9uJ3QuXG52YXIgbm9TdWNjZXNzb3IgPSBbXCJcXFxcc21hbGxpbnRcIl07IC8vIE5PVEU6IFVubGlrZSBtb3N0IGBodG1sQnVpbGRlcmBzLCB0aGlzIG9uZSBoYW5kbGVzIG5vdCBvbmx5IFwib3BcIiwgYnV0IGFsc29cbi8vIFwic3Vwc3ViXCIgc2luY2Ugc29tZSBvZiB0aGVtIChsaWtlIFxcaW50KSBjYW4gYWZmZWN0IHN1cGVyL3N1YnNjcmlwdGluZy5cblxudmFyIG9wX2h0bWxCdWlsZGVyID0gZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JwLCBvcHRpb25zKSB7XG4gIC8vIE9wZXJhdG9ycyBhcmUgaGFuZGxlZCBpbiB0aGUgVGVYYm9vayBwZy4gNDQzLTQ0NCwgcnVsZSAxMyhhKS5cbiAgdmFyIHN1cEdyb3VwO1xuICB2YXIgc3ViR3JvdXA7XG4gIHZhciBoYXNMaW1pdHMgPSBmYWxzZTtcbiAgdmFyIGdyb3VwO1xuXG4gIGlmIChncnAudHlwZSA9PT0gXCJzdXBzdWJcIikge1xuICAgIC8vIElmIHdlIGhhdmUgbGltaXRzLCBzdXBzdWIgd2lsbCBwYXNzIHVzIGl0cyBncm91cCB0byBoYW5kbGUuIFB1bGxcbiAgICAvLyBvdXQgdGhlIHN1cGVyc2NyaXB0IGFuZCBzdWJzY3JpcHQgYW5kIHNldCB0aGUgZ3JvdXAgdG8gdGhlIG9wIGluXG4gICAgLy8gaXRzIGJhc2UuXG4gICAgc3VwR3JvdXAgPSBncnAuc3VwO1xuICAgIHN1Ykdyb3VwID0gZ3JwLnN1YjtcbiAgICBncm91cCA9IGFzc2VydE5vZGVUeXBlKGdycC5iYXNlLCBcIm9wXCIpO1xuICAgIGhhc0xpbWl0cyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgZ3JvdXAgPSBhc3NlcnROb2RlVHlwZShncnAsIFwib3BcIik7XG4gIH1cblxuICB2YXIgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICB2YXIgbGFyZ2UgPSBmYWxzZTtcblxuICBpZiAoc3R5bGUuc2l6ZSA9PT0gc3JjX1N0eWxlLkRJU1BMQVkuc2l6ZSAmJiBncm91cC5zeW1ib2wgJiYgIXV0aWxzLmNvbnRhaW5zKG5vU3VjY2Vzc29yLCBncm91cC5uYW1lKSkge1xuICAgIC8vIE1vc3Qgc3ltYm9sIG9wZXJhdG9ycyBnZXQgbGFyZ2VyIGluIGRpc3BsYXlzdHlsZSAocnVsZSAxMylcbiAgICBsYXJnZSA9IHRydWU7XG4gIH1cblxuICB2YXIgYmFzZTtcblxuICBpZiAoZ3JvdXAuc3ltYm9sKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIHN5bWJvbCwgY3JlYXRlIHRoZSBzeW1ib2wuXG4gICAgdmFyIGZvbnROYW1lID0gbGFyZ2UgPyBcIlNpemUyLVJlZ3VsYXJcIiA6IFwiU2l6ZTEtUmVndWxhclwiO1xuICAgIHZhciBzdGFzaCA9IFwiXCI7XG5cbiAgICBpZiAoZ3JvdXAubmFtZSA9PT0gXCJcXFxcb2lpbnRcIiB8fCBncm91cC5uYW1lID09PSBcIlxcXFxvaWlpbnRcIikge1xuICAgICAgLy8gTm8gZm9udCBnbHlwaHMgeWV0LCBzbyB1c2UgYSBnbHlwaCB3L28gdGhlIG92YWwuXG4gICAgICAvLyBUT0RPOiBXaGVuIGZvbnQgZ2x5cGhzIGFyZSBhdmFpbGFibGUsIGRlbGV0ZSB0aGlzIGNvZGUuXG4gICAgICBzdGFzaCA9IGdyb3VwLm5hbWUuc2xpY2UoMSk7XG4gICAgICBncm91cC5uYW1lID0gc3Rhc2ggPT09IFwib2lpbnRcIiA/IFwiXFxcXGlpbnRcIiA6IFwiXFxcXGlpaW50XCI7XG4gICAgfVxuXG4gICAgYmFzZSA9IGJ1aWxkQ29tbW9uLm1ha2VTeW1ib2woZ3JvdXAubmFtZSwgZm9udE5hbWUsIFwibWF0aFwiLCBvcHRpb25zLCBbXCJtb3BcIiwgXCJvcC1zeW1ib2xcIiwgbGFyZ2UgPyBcImxhcmdlLW9wXCIgOiBcInNtYWxsLW9wXCJdKTtcblxuICAgIGlmIChzdGFzaC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZSdyZSBpbiBcXG9paW50IG9yIFxcb2lpaW50LiBPdmVybGF5IHRoZSBvdmFsLlxuICAgICAgLy8gVE9ETzogV2hlbiBmb250IGdseXBocyBhcmUgYXZhaWxhYmxlLCBkZWxldGUgdGhpcyBjb2RlLlxuICAgICAgdmFyIGl0YWxpYyA9IGJhc2UuaXRhbGljO1xuICAgICAgdmFyIG92YWwgPSBidWlsZENvbW1vbi5zdGF0aWNTdmcoc3Rhc2ggKyBcIlNpemVcIiArIChsYXJnZSA/IFwiMlwiIDogXCIxXCIpLCBvcHRpb25zKTtcbiAgICAgIGJhc2UgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IGJhc2UsXG4gICAgICAgICAgc2hpZnQ6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICAgIGVsZW06IG92YWwsXG4gICAgICAgICAgc2hpZnQ6IGxhcmdlID8gMC4wOCA6IDBcbiAgICAgICAgfV1cbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgZ3JvdXAubmFtZSA9IFwiXFxcXFwiICsgc3Rhc2g7XG4gICAgICBiYXNlLmNsYXNzZXMudW5zaGlmdChcIm1vcFwiKTsgLy8gJEZsb3dGaXhNZVxuXG4gICAgICBiYXNlLml0YWxpYyA9IGl0YWxpYztcbiAgICB9XG4gIH0gZWxzZSBpZiAoZ3JvdXAuYm9keSkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBsaXN0LCBjb21wb3NlIHRoYXQgbGlzdC5cbiAgICB2YXIgaW5uZXIgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucywgdHJ1ZSk7XG5cbiAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAxICYmIGlubmVyWzBdIGluc3RhbmNlb2YgU3ltYm9sTm9kZSkge1xuICAgICAgYmFzZSA9IGlubmVyWzBdO1xuICAgICAgYmFzZS5jbGFzc2VzWzBdID0gXCJtb3BcIjsgLy8gcmVwbGFjZSBvbGQgbWNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3BcIl0sIGlubmVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgdGV4dCBvcGVyYXRvci4gQnVpbGQgdGhlIHRleHQgZnJvbSB0aGVcbiAgICAvLyBvcGVyYXRvcidzIG5hbWUuXG4gICAgdmFyIG91dHB1dCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBncm91cC5uYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXRwdXQucHVzaChidWlsZENvbW1vbi5tYXRoc3ltKGdyb3VwLm5hbWVbaV0sIGdyb3VwLm1vZGUsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBiYXNlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9wXCJdLCBvdXRwdXQsIG9wdGlvbnMpO1xuICB9IC8vIElmIGNvbnRlbnQgb2Ygb3AgaXMgYSBzaW5nbGUgc3ltYm9sLCBzaGlmdCBpdCB2ZXJ0aWNhbGx5LlxuXG5cbiAgdmFyIGJhc2VTaGlmdCA9IDA7XG4gIHZhciBzbGFudCA9IDA7XG5cbiAgaWYgKChiYXNlIGluc3RhbmNlb2YgU3ltYm9sTm9kZSB8fCBncm91cC5uYW1lID09PSBcIlxcXFxvaWludFwiIHx8IGdyb3VwLm5hbWUgPT09IFwiXFxcXG9paWludFwiKSAmJiAhZ3JvdXAuc3VwcHJlc3NCYXNlU2hpZnQpIHtcbiAgICAvLyBXZSBzdXBwcmVzcyB0aGUgc2hpZnQgb2YgdGhlIGJhc2Ugb2YgXFxvdmVyc2V0IGFuZCBcXHVuZGVyc2V0LiBPdGhlcndpc2UsXG4gICAgLy8gc2hpZnQgdGhlIHN5bWJvbCBzbyBpdHMgY2VudGVyIGxpZXMgb24gdGhlIGF4aXMgKHJ1bGUgMTMpLiBJdFxuICAgIC8vIGFwcGVhcnMgdGhhdCBvdXIgZm9udHMgaGF2ZSB0aGUgY2VudGVycyBvZiB0aGUgc3ltYm9scyBhbHJlYWR5XG4gICAgLy8gYWxtb3N0IG9uIHRoZSBheGlzLCBzbyB0aGVzZSBudW1iZXJzIGFyZSB2ZXJ5IHNtYWxsLiBOb3RlIHdlXG4gICAgLy8gZG9uJ3QgYWN0dWFsbHkgYXBwbHkgdGhpcyBoZXJlLCBidXQgaW5zdGVhZCBpdCBpcyB1c2VkIGVpdGhlciBpblxuICAgIC8vIHRoZSB2bGlzdCBjcmVhdGlvbiBvciBzZXBhcmF0ZWx5IHdoZW4gdGhlcmUgYXJlIG5vIGxpbWl0cy5cbiAgICBiYXNlU2hpZnQgPSAoYmFzZS5oZWlnaHQgLSBiYXNlLmRlcHRoKSAvIDIgLSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuYXhpc0hlaWdodDsgLy8gVGhlIHNsYW50IG9mIHRoZSBzeW1ib2wgaXMganVzdCBpdHMgaXRhbGljIGNvcnJlY3Rpb24uXG4gICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgc2xhbnQgPSBiYXNlLml0YWxpYztcbiAgfVxuXG4gIGlmIChoYXNMaW1pdHMpIHtcbiAgICByZXR1cm4gYXNzZW1ibGVTdXBTdWIoYmFzZSwgc3VwR3JvdXAsIHN1Ykdyb3VwLCBvcHRpb25zLCBzdHlsZSwgc2xhbnQsIGJhc2VTaGlmdCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhc2VTaGlmdCkge1xuICAgICAgYmFzZS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAgIGJhc2Uuc3R5bGUudG9wID0gbWFrZUVtKGJhc2VTaGlmdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbn07XG5cbnZhciBvcF9tYXRobWxCdWlsZGVyID0gZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICB2YXIgbm9kZTtcblxuICBpZiAoZ3JvdXAuc3ltYm9sKSB7XG4gICAgLy8gVGhpcyBpcyBhIHN5bWJvbC4gSnVzdCBhZGQgdGhlIHN5bWJvbC5cbiAgICBub2RlID0gbmV3IE1hdGhOb2RlKFwibW9cIiwgW21ha2VUZXh0KGdyb3VwLm5hbWUsIGdyb3VwLm1vZGUpXSk7XG5cbiAgICBpZiAodXRpbHMuY29udGFpbnMobm9TdWNjZXNzb3IsIGdyb3VwLm5hbWUpKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxhcmdlb3BcIiwgXCJmYWxzZVwiKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZ3JvdXAuYm9keSkge1xuICAgIC8vIFRoaXMgaXMgYW4gb3BlcmF0b3Igd2l0aCBjaGlsZHJlbi4gQWRkIHRoZW0uXG4gICAgbm9kZSA9IG5ldyBNYXRoTm9kZShcIm1vXCIsIGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHRleHQgb3BlcmF0b3IuIEFkZCBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgZnJvbSB0aGVcbiAgICAvLyBvcGVyYXRvcidzIG5hbWUuXG4gICAgbm9kZSA9IG5ldyBNYXRoTm9kZShcIm1pXCIsIFtuZXcgVGV4dE5vZGUoZ3JvdXAubmFtZS5zbGljZSgxKSldKTsgLy8gQXBwZW5kIGFuIDxtbz4mQXBwbHlGdW5jdGlvbjs8L21vPi5cbiAgICAvLyByZWY6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9SRUMtTWF0aE1ML2NoYXAzXzIuaHRtbCNzZWMzLjIuNFxuXG4gICAgdmFyIG9wZXJhdG9yID0gbmV3IE1hdGhOb2RlKFwibW9cIiwgW21ha2VUZXh0KFwiXFx1MjA2MVwiLCBcInRleHRcIildKTtcblxuICAgIGlmIChncm91cC5wYXJlbnRJc1N1cFN1Yikge1xuICAgICAgbm9kZSA9IG5ldyBNYXRoTm9kZShcIm1yb3dcIiwgW25vZGUsIG9wZXJhdG9yXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUgPSBuZXdEb2N1bWVudEZyYWdtZW50KFtub2RlLCBvcGVyYXRvcl0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufTtcblxudmFyIHNpbmdsZUNoYXJCaWdPcHMgPSB7XG4gIFwiXFx1MjIwRlwiOiBcIlxcXFxwcm9kXCIsXG4gIFwiXFx1MjIxMFwiOiBcIlxcXFxjb3Byb2RcIixcbiAgXCJcXHUyMjExXCI6IFwiXFxcXHN1bVwiLFxuICBcIlxcdTIyQzBcIjogXCJcXFxcYmlnd2VkZ2VcIixcbiAgXCJcXHUyMkMxXCI6IFwiXFxcXGJpZ3ZlZVwiLFxuICBcIlxcdTIyQzJcIjogXCJcXFxcYmlnY2FwXCIsXG4gIFwiXFx1MjJDM1wiOiBcIlxcXFxiaWdjdXBcIixcbiAgXCJcXHUyQTAwXCI6IFwiXFxcXGJpZ29kb3RcIixcbiAgXCJcXHUyQTAxXCI6IFwiXFxcXGJpZ29wbHVzXCIsXG4gIFwiXFx1MkEwMlwiOiBcIlxcXFxiaWdvdGltZXNcIixcbiAgXCJcXHUyQTA0XCI6IFwiXFxcXGJpZ3VwbHVzXCIsXG4gIFwiXFx1MkEwNlwiOiBcIlxcXFxiaWdzcWN1cFwiXG59O1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm9wXCIsXG4gIG5hbWVzOiBbXCJcXFxcY29wcm9kXCIsIFwiXFxcXGJpZ3ZlZVwiLCBcIlxcXFxiaWd3ZWRnZVwiLCBcIlxcXFxiaWd1cGx1c1wiLCBcIlxcXFxiaWdjYXBcIiwgXCJcXFxcYmlnY3VwXCIsIFwiXFxcXGludG9wXCIsIFwiXFxcXHByb2RcIiwgXCJcXFxcc3VtXCIsIFwiXFxcXGJpZ290aW1lc1wiLCBcIlxcXFxiaWdvcGx1c1wiLCBcIlxcXFxiaWdvZG90XCIsIFwiXFxcXGJpZ3NxY3VwXCIsIFwiXFxcXHNtYWxsaW50XCIsIFwiXFx1MjIwRlwiLCBcIlxcdTIyMTBcIiwgXCJcXHUyMjExXCIsIFwiXFx1MjJDMFwiLCBcIlxcdTIyQzFcIiwgXCJcXHUyMkMyXCIsIFwiXFx1MjJDM1wiLCBcIlxcdTJBMDBcIiwgXCJcXHUyQTAxXCIsIFwiXFx1MkEwMlwiLCBcIlxcdTJBMDRcIiwgXCJcXHUyQTA2XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDBcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWU7XG4gICAgdmFyIGZOYW1lID0gZnVuY05hbWU7XG5cbiAgICBpZiAoZk5hbWUubGVuZ3RoID09PSAxKSB7XG4gICAgICBmTmFtZSA9IHNpbmdsZUNoYXJCaWdPcHNbZk5hbWVdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIm9wXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGxpbWl0czogdHJ1ZSxcbiAgICAgIHBhcmVudElzU3VwU3ViOiBmYWxzZSxcbiAgICAgIHN5bWJvbDogdHJ1ZSxcbiAgICAgIG5hbWU6IGZOYW1lXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IG9wX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBvcF9tYXRobWxCdWlsZGVyXG59KTsgLy8gTm90ZTogY2FsbGluZyBkZWZpbmVGdW5jdGlvbiB3aXRoIGEgdHlwZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGRlZmluZWQgb25seVxuLy8gd29ya3MgYmVjYXVzZSB0aGUgc2FtZSBodG1sQnVpbGRlciBhbmQgbWF0aG1sQnVpbGRlciBhcmUgYmVpbmcgdXNlZC5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm9wXCIsXG4gIG5hbWVzOiBbXCJcXFxcbWF0aG9wXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgcHJpbWl0aXZlOiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjIsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjIucGFyc2VyO1xuICAgIHZhciBib2R5ID0gYXJnc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJvcFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsaW1pdHM6IGZhbHNlLFxuICAgICAgcGFyZW50SXNTdXBTdWI6IGZhbHNlLFxuICAgICAgc3ltYm9sOiBmYWxzZSxcbiAgICAgIGJvZHk6IG9yZGFyZ3VtZW50KGJvZHkpXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IG9wX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBvcF9tYXRobWxCdWlsZGVyXG59KTsgLy8gVGhlcmUgYXJlIDIgZmxhZ3MgZm9yIG9wZXJhdG9yczsgd2hldGhlciB0aGV5IHByb2R1Y2UgbGltaXRzIGluXG4vLyBkaXNwbGF5c3R5bGUsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHN5bWJvbHMgYW5kIHNob3VsZCBncm93IGluXG4vLyBkaXNwbGF5c3R5bGUuIFRoZXNlIGZvdXIgZ3JvdXBzIGNvdmVyIHRoZSBmb3VyIHBvc3NpYmxlIGNob2ljZXMuXG5cbnZhciBzaW5nbGVDaGFySW50ZWdyYWxzID0ge1xuICBcIlxcdTIyMkJcIjogXCJcXFxcaW50XCIsXG4gIFwiXFx1MjIyQ1wiOiBcIlxcXFxpaW50XCIsXG4gIFwiXFx1MjIyRFwiOiBcIlxcXFxpaWludFwiLFxuICBcIlxcdTIyMkVcIjogXCJcXFxcb2ludFwiLFxuICBcIlxcdTIyMkZcIjogXCJcXFxcb2lpbnRcIixcbiAgXCJcXHUyMjMwXCI6IFwiXFxcXG9paWludFwiXG59OyAvLyBObyBsaW1pdHMsIG5vdCBzeW1ib2xzXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJvcFwiLFxuICBuYW1lczogW1wiXFxcXGFyY3NpblwiLCBcIlxcXFxhcmNjb3NcIiwgXCJcXFxcYXJjdGFuXCIsIFwiXFxcXGFyY3RnXCIsIFwiXFxcXGFyY2N0Z1wiLCBcIlxcXFxhcmdcIiwgXCJcXFxcY2hcIiwgXCJcXFxcY29zXCIsIFwiXFxcXGNvc2VjXCIsIFwiXFxcXGNvc2hcIiwgXCJcXFxcY290XCIsIFwiXFxcXGNvdGdcIiwgXCJcXFxcY290aFwiLCBcIlxcXFxjc2NcIiwgXCJcXFxcY3RnXCIsIFwiXFxcXGN0aFwiLCBcIlxcXFxkZWdcIiwgXCJcXFxcZGltXCIsIFwiXFxcXGV4cFwiLCBcIlxcXFxob21cIiwgXCJcXFxca2VyXCIsIFwiXFxcXGxnXCIsIFwiXFxcXGxuXCIsIFwiXFxcXGxvZ1wiLCBcIlxcXFxzZWNcIiwgXCJcXFxcc2luXCIsIFwiXFxcXHNpbmhcIiwgXCJcXFxcc2hcIiwgXCJcXFxcdGFuXCIsIFwiXFxcXHRhbmhcIiwgXCJcXFxcdGdcIiwgXCJcXFxcdGhcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMFxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYzLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmMy5mdW5jTmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJvcFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsaW1pdHM6IGZhbHNlLFxuICAgICAgcGFyZW50SXNTdXBTdWI6IGZhbHNlLFxuICAgICAgc3ltYm9sOiBmYWxzZSxcbiAgICAgIG5hbWU6IGZ1bmNOYW1lXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IG9wX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBvcF9tYXRobWxCdWlsZGVyXG59KTsgLy8gTGltaXRzLCBub3Qgc3ltYm9sc1xuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwib3BcIixcbiAgbmFtZXM6IFtcIlxcXFxkZXRcIiwgXCJcXFxcZ2NkXCIsIFwiXFxcXGluZlwiLCBcIlxcXFxsaW1cIiwgXCJcXFxcbWF4XCIsIFwiXFxcXG1pblwiLCBcIlxcXFxQclwiLCBcIlxcXFxzdXBcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMFxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY0KSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY0LnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmNC5mdW5jTmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJvcFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBsaW1pdHM6IHRydWUsXG4gICAgICBwYXJlbnRJc1N1cFN1YjogZmFsc2UsXG4gICAgICBzeW1ib2w6IGZhbHNlLFxuICAgICAgbmFtZTogZnVuY05hbWVcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogb3BfaHRtbEJ1aWxkZXIsXG4gIG1hdGhtbEJ1aWxkZXI6IG9wX21hdGhtbEJ1aWxkZXJcbn0pOyAvLyBObyBsaW1pdHMsIHN5bWJvbHNcblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm9wXCIsXG4gIG5hbWVzOiBbXCJcXFxcaW50XCIsIFwiXFxcXGlpbnRcIiwgXCJcXFxcaWlpbnRcIiwgXCJcXFxcb2ludFwiLCBcIlxcXFxvaWludFwiLCBcIlxcXFxvaWlpbnRcIiwgXCJcXHUyMjJCXCIsIFwiXFx1MjIyQ1wiLCBcIlxcdTIyMkRcIiwgXCJcXHUyMjJFXCIsIFwiXFx1MjIyRlwiLCBcIlxcdTIyMzBcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMFxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWY1KSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWY1LnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmNS5mdW5jTmFtZTtcbiAgICB2YXIgZk5hbWUgPSBmdW5jTmFtZTtcblxuICAgIGlmIChmTmFtZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGZOYW1lID0gc2luZ2xlQ2hhckludGVncmFsc1tmTmFtZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwib3BcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgbGltaXRzOiBmYWxzZSxcbiAgICAgIHBhcmVudElzU3VwU3ViOiBmYWxzZSxcbiAgICAgIHN5bWJvbDogdHJ1ZSxcbiAgICAgIG5hbWU6IGZOYW1lXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IG9wX2h0bWxCdWlsZGVyLFxuICBtYXRobWxCdWlsZGVyOiBvcF9tYXRobWxCdWlsZGVyXG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvb3BlcmF0b3JuYW1lLmpzXG5cblxuXG5cblxuXG5cblxuXG4vLyBOT1RFOiBVbmxpa2UgbW9zdCBgaHRtbEJ1aWxkZXJgcywgdGhpcyBvbmUgaGFuZGxlcyBub3Qgb25seVxuLy8gXCJvcGVyYXRvcm5hbWVcIiwgYnV0IGFsc28gIFwic3Vwc3ViXCIgc2luY2UgXFxvcGVyYXRvcm5hbWUqIGNhblxuLy8gYWZmZWN0IHN1cGVyL3N1YnNjcmlwdGluZy5cbnZhciBvcGVyYXRvcm5hbWVfaHRtbEJ1aWxkZXIgPSBmdW5jdGlvbiBodG1sQnVpbGRlcihncnAsIG9wdGlvbnMpIHtcbiAgLy8gT3BlcmF0b3JzIGFyZSBoYW5kbGVkIGluIHRoZSBUZVhib29rIHBnLiA0NDMtNDQ0LCBydWxlIDEzKGEpLlxuICB2YXIgc3VwR3JvdXA7XG4gIHZhciBzdWJHcm91cDtcbiAgdmFyIGhhc0xpbWl0cyA9IGZhbHNlO1xuICB2YXIgZ3JvdXA7XG5cbiAgaWYgKGdycC50eXBlID09PSBcInN1cHN1YlwiKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBsaW1pdHMsIHN1cHN1YiB3aWxsIHBhc3MgdXMgaXRzIGdyb3VwIHRvIGhhbmRsZS4gUHVsbFxuICAgIC8vIG91dCB0aGUgc3VwZXJzY3JpcHQgYW5kIHN1YnNjcmlwdCBhbmQgc2V0IHRoZSBncm91cCB0byB0aGUgb3AgaW5cbiAgICAvLyBpdHMgYmFzZS5cbiAgICBzdXBHcm91cCA9IGdycC5zdXA7XG4gICAgc3ViR3JvdXAgPSBncnAuc3ViO1xuICAgIGdyb3VwID0gYXNzZXJ0Tm9kZVR5cGUoZ3JwLmJhc2UsIFwib3BlcmF0b3JuYW1lXCIpO1xuICAgIGhhc0xpbWl0cyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgZ3JvdXAgPSBhc3NlcnROb2RlVHlwZShncnAsIFwib3BlcmF0b3JuYW1lXCIpO1xuICB9XG5cbiAgdmFyIGJhc2U7XG5cbiAgaWYgKGdyb3VwLmJvZHkubGVuZ3RoID4gMCkge1xuICAgIHZhciBib2R5ID0gZ3JvdXAuYm9keS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lOiBDaGVjayBpZiB0aGUgbm9kZSBoYXMgYSBzdHJpbmcgYHRleHRgIHByb3BlcnR5LlxuICAgICAgdmFyIGNoaWxkVGV4dCA9IGNoaWxkLnRleHQ7XG5cbiAgICAgIGlmICh0eXBlb2YgY2hpbGRUZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0b3JkXCIsXG4gICAgICAgICAgbW9kZTogY2hpbGQubW9kZSxcbiAgICAgICAgICB0ZXh0OiBjaGlsZFRleHRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTsgLy8gQ29uc29saWRhdGUgZnVuY3Rpb24gbmFtZXMgaW50byBzeW1ib2wgY2hhcmFjdGVycy5cblxuICAgIHZhciBleHByZXNzaW9uID0gYnVpbGRFeHByZXNzaW9uKGJvZHksIG9wdGlvbnMud2l0aEZvbnQoXCJtYXRocm1cIiksIHRydWUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBleHByZXNzaW9uW2ldO1xuXG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTeW1ib2xOb2RlKSB7XG4gICAgICAgIC8vIFBlciBhbXNvcG4gcGFja2FnZSxcbiAgICAgICAgLy8gY2hhbmdlIG1pbnVzIHRvIGh5cGhlbiBhbmQgXFxhc3QgdG8gYXN0ZXJpc2tcbiAgICAgICAgY2hpbGQudGV4dCA9IGNoaWxkLnRleHQucmVwbGFjZSgvXFx1MjIxMi8sIFwiLVwiKS5yZXBsYWNlKC9cXHUyMjE3LywgXCIqXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJhc2UgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3BcIl0sIGV4cHJlc3Npb24sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3BcIl0sIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmIChoYXNMaW1pdHMpIHtcbiAgICByZXR1cm4gYXNzZW1ibGVTdXBTdWIoYmFzZSwgc3VwR3JvdXAsIHN1Ykdyb3VwLCBvcHRpb25zLCBvcHRpb25zLnN0eWxlLCAwLCAwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxufTtcblxudmFyIG9wZXJhdG9ybmFtZV9tYXRobWxCdWlsZGVyID0gZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAvLyBUaGUgc3RlcHMgdGFrZW4gaGVyZSBhcmUgc2ltaWxhciB0byB0aGUgaHRtbCB2ZXJzaW9uLlxuICB2YXIgZXhwcmVzc2lvbiA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLndpdGhGb250KFwibWF0aHJtXCIpKTsgLy8gSXMgZXhwcmVzc2lvbiBhIHN0cmluZyBvciBoYXMgaXQgc29tZXRoaW5nIGxpa2UgYSBmcmFjdGlvbj9cblxuICB2YXIgaXNBbGxTdHJpbmcgPSB0cnVlOyAvLyBkZWZhdWx0XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBleHByZXNzaW9uW2ldO1xuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBtYXRoTUxUcmVlLlNwYWNlTm9kZSkgey8vIERvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBtYXRoTUxUcmVlLk1hdGhOb2RlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlIFwibWlcIjpcbiAgICAgICAgY2FzZSBcIm1uXCI6XG4gICAgICAgIGNhc2UgXCJtc1wiOlxuICAgICAgICBjYXNlIFwibXNwYWNlXCI6XG4gICAgICAgIGNhc2UgXCJtdGV4dFwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBEbyBub3RoaW5nIHlldC5cblxuICAgICAgICBjYXNlIFwibW9cIjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuWzBdO1xuXG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgY2hpbGQgaW5zdGFuY2VvZiBtYXRoTUxUcmVlLlRleHROb2RlKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnRleHQgPSBjaGlsZC50ZXh0LnJlcGxhY2UoL1xcdTIyMTIvLCBcIi1cIikucmVwbGFjZSgvXFx1MjIxNy8sIFwiKlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlzQWxsU3RyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlzQWxsU3RyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzQWxsU3RyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQWxsU3RyaW5nKSB7XG4gICAgLy8gV3JpdGUgYSBzaW5nbGUgVGV4dE5vZGUgaW5zdGVhZCBvZiBtdWx0aXBsZSBuZXN0ZWQgdGFncy5cbiAgICB2YXIgd29yZCA9IGV4cHJlc3Npb24ubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50b1RleHQoKTtcbiAgICB9KS5qb2luKFwiXCIpO1xuICAgIGV4cHJlc3Npb24gPSBbbmV3IG1hdGhNTFRyZWUuVGV4dE5vZGUod29yZCldO1xuICB9XG5cbiAgdmFyIGlkZW50aWZpZXIgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1pXCIsIGV4cHJlc3Npb24pO1xuICBpZGVudGlmaWVyLnNldEF0dHJpYnV0ZShcIm1hdGh2YXJpYW50XCIsIFwibm9ybWFsXCIpOyAvLyBcXHUyMDYxIGlzIHRoZSBzYW1lIGFzICZBcHBseUZ1bmN0aW9uO1xuICAvLyByZWY6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vY2hhcnNldHMvcmVmX2h0bWxfZW50aXRpZXNfYS5hc3BcblxuICB2YXIgb3BlcmF0b3IgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFttYWtlVGV4dChcIlxcdTIwNjFcIiwgXCJ0ZXh0XCIpXSk7XG5cbiAgaWYgKGdyb3VwLnBhcmVudElzU3VwU3ViKSB7XG4gICAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXJvd1wiLCBbaWRlbnRpZmllciwgb3BlcmF0b3JdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWF0aE1MVHJlZS5uZXdEb2N1bWVudEZyYWdtZW50KFtpZGVudGlmaWVyLCBvcGVyYXRvcl0pO1xuICB9XG59OyAvLyBcXG9wZXJhdG9ybmFtZVxuLy8gYW1zb3BuLmR0eDogXFxtYXRob3B7IzFcXGtlcm5cXHpAXFxvcGVyYXRvckBmb250IzN9XFxuZXdtY29kZXNAXG5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcIm9wZXJhdG9ybmFtZVwiLFxuICBuYW1lczogW1wiXFxcXG9wZXJhdG9ybmFtZUBcIiwgXCJcXFxcb3BlcmF0b3JuYW1ld2l0aGxpbWl0c1wiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcixcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmLmZ1bmNOYW1lO1xuICAgIHZhciBib2R5ID0gYXJnc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJvcGVyYXRvcm5hbWVcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYm9keSksXG4gICAgICBhbHdheXNIYW5kbGVTdXBTdWI6IGZ1bmNOYW1lID09PSBcIlxcXFxvcGVyYXRvcm5hbWV3aXRobGltaXRzXCIsXG4gICAgICBsaW1pdHM6IGZhbHNlLFxuICAgICAgcGFyZW50SXNTdXBTdWI6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IG9wZXJhdG9ybmFtZV9odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogb3BlcmF0b3JuYW1lX21hdGhtbEJ1aWxkZXJcbn0pO1xuZGVmaW5lTWFjcm8oXCJcXFxcb3BlcmF0b3JuYW1lXCIsIFwiXFxcXEBpZnN0YXJcXFxcb3BlcmF0b3JuYW1ld2l0aGxpbWl0c1xcXFxvcGVyYXRvcm5hbWVAXCIpO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9vcmRncm91cC5qc1xuXG5cblxuXG5kZWZpbmVGdW5jdGlvbkJ1aWxkZXJzKHtcbiAgdHlwZTogXCJvcmRncm91cFwiLFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoZ3JvdXAuc2VtaXNpbXBsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VGcmFnbWVudChidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucywgZmFsc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiXSwgYnVpbGRFeHByZXNzaW9uKGdyb3VwLmJvZHksIG9wdGlvbnMsIHRydWUpLCBvcHRpb25zKTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHJldHVybiBidWlsZEV4cHJlc3Npb25Sb3coZ3JvdXAuYm9keSwgb3B0aW9ucywgdHJ1ZSk7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9vdmVybGluZS5qc1xuXG5cblxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJvdmVybGluZVwiLFxuICBuYW1lczogW1wiXFxcXG92ZXJsaW5lXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDFcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBib2R5ID0gYXJnc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJvdmVybGluZVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gT3ZlcmxpbmVzIGFyZSBoYW5kbGVkIGluIHRoZSBUZVhib29rIHBnIDQ0MywgUnVsZSA5LlxuICAgIC8vIEJ1aWxkIHRoZSBpbm5lciBncm91cCBpbiB0aGUgY3JhbXBlZCBzdHlsZS5cbiAgICB2YXIgaW5uZXJHcm91cCA9IGJ1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucy5oYXZpbmdDcmFtcGVkU3R5bGUoKSk7IC8vIENyZWF0ZSB0aGUgbGluZSBhYm92ZSB0aGUgYm9keVxuXG4gICAgdmFyIGxpbmUgPSBidWlsZENvbW1vbi5tYWtlTGluZVNwYW4oXCJvdmVybGluZS1saW5lXCIsIG9wdGlvbnMpOyAvLyBHZW5lcmF0ZSB0aGUgdmxpc3QsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGtlcm5zXG5cbiAgICB2YXIgZGVmYXVsdFJ1bGVUaGlja25lc3MgPSBvcHRpb25zLmZvbnRNZXRyaWNzKCkuZGVmYXVsdFJ1bGVUaGlja25lc3M7XG4gICAgdmFyIHZsaXN0ID0gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJmaXJzdEJhc2VsaW5lXCIsXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGlubmVyR3JvdXBcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IDMgKiBkZWZhdWx0UnVsZVRoaWNrbmVzc1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogbGluZVxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgICAgc2l6ZTogZGVmYXVsdFJ1bGVUaGlja25lc3NcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIiwgXCJvdmVybGluZVwiXSwgW3ZsaXN0XSwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3BlcmF0b3IgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFtuZXcgbWF0aE1MVHJlZS5UZXh0Tm9kZShcIlxcdTIwM0VcIildKTtcbiAgICBvcGVyYXRvci5zZXRBdHRyaWJ1dGUoXCJzdHJldGNoeVwiLCBcInRydWVcIik7XG4gICAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vdmVyXCIsIFtidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMpLCBvcGVyYXRvcl0pO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiYWNjZW50XCIsIFwidHJ1ZVwiKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3BoYW50b20uanNcblxuXG5cblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwicGhhbnRvbVwiLFxuICBuYW1lczogW1wiXFxcXHBoYW50b21cIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwicGhhbnRvbVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBvcmRhcmd1bWVudChib2R5KVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBlbGVtZW50cyA9IGJ1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBvcHRpb25zLndpdGhQaGFudG9tKCksIGZhbHNlKTsgLy8gXFxwaGFudG9tIGlzbid0IHN1cHBvc2VkIHRvIGFmZmVjdCB0aGUgZWxlbWVudHMgaXQgY29udGFpbnMuXG4gICAgLy8gU2VlIFwiY29sb3JcIiBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VGcmFnbWVudChlbGVtZW50cyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgaW5uZXIgPSBidWlsZE1hdGhNTF9idWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBoYW50b21cIiwgaW5uZXIpO1xuICB9XG59KTtcbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJocGhhbnRvbVwiLFxuICBuYW1lczogW1wiXFxcXGhwaGFudG9tXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYyLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYyLnBhcnNlcjtcbiAgICB2YXIgYm9keSA9IGFyZ3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaHBoYW50b21cIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYm9keTogYm9keVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBub2RlID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW10sIFtidWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMud2l0aFBoYW50b20oKSldKTtcbiAgICBub2RlLmhlaWdodCA9IDA7XG4gICAgbm9kZS5kZXB0aCA9IDA7XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUuY2hpbGRyZW5baV0uaGVpZ2h0ID0gMDtcbiAgICAgICAgbm9kZS5jaGlsZHJlbltpXS5kZXB0aCA9IDA7XG4gICAgICB9XG4gICAgfSAvLyBTZWUgc21hc2ggZm9yIGNvbW1lbnQgcmU6IHVzZSBvZiBtYWtlVkxpc3RcblxuXG4gICAgbm9kZSA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwiZmlyc3RCYXNlbGluZVwiLFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBub2RlXG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpOyAvLyBGb3Igc3BhY2luZywgVGVYIHRyZWF0cyBcXHNtYXNoIGFzIGEgbWF0aCBncm91cCAoc2FtZSBzcGFjaW5nIGFzIG9yZCkuXG5cbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wibW9yZFwiXSwgW25vZGVdLCBvcHRpb25zKTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihvcmRhcmd1bWVudChncm91cC5ib2R5KSwgb3B0aW9ucyk7XG4gICAgdmFyIHBoYW50b20gPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1waGFudG9tXCIsIGlubmVyKTtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBhZGRlZFwiLCBbcGhhbnRvbV0pO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiMHB4XCIpO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGVwdGhcIiwgXCIwcHhcIik7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcInZwaGFudG9tXCIsXG4gIG5hbWVzOiBbXCJcXFxcdnBoYW50b21cIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZjMsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZjMucGFyc2VyO1xuICAgIHZhciBib2R5ID0gYXJnc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ2cGhhbnRvbVwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIGlubmVyID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiaW5uZXJcIl0sIFtidWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMud2l0aFBoYW50b20oKSldKTtcbiAgICB2YXIgZml4ID0gYnVpbGRDb21tb24ubWFrZVNwYW4oW1wiZml4XCJdLCBbXSk7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIiwgXCJybGFwXCJdLCBbaW5uZXIsIGZpeF0sIG9wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIGlubmVyID0gYnVpbGRNYXRoTUxfYnVpbGRFeHByZXNzaW9uKG9yZGFyZ3VtZW50KGdyb3VwLmJvZHkpLCBvcHRpb25zKTtcbiAgICB2YXIgcGhhbnRvbSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBoYW50b21cIiwgaW5uZXIpO1xuICAgIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtcGFkZGVkXCIsIFtwaGFudG9tXSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjBweFwiKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3JhaXNlYm94LmpzXG5cblxuXG5cblxuXG4gLy8gQm94IG1hbmlwdWxhdGlvblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwicmFpc2Vib3hcIixcbiAgbmFtZXM6IFtcIlxcXFxyYWlzZWJveFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAyLFxuICAgIGFyZ1R5cGVzOiBbXCJzaXplXCIsIFwiaGJveFwiXSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICB2YXIgYW1vdW50ID0gYXNzZXJ0Tm9kZVR5cGUoYXJnc1swXSwgXCJzaXplXCIpLnZhbHVlO1xuICAgIHZhciBib2R5ID0gYXJnc1sxXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJyYWlzZWJveFwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBkeTogYW1vdW50LFxuICAgICAgYm9keTogYm9keVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBib2R5ID0gYnVpbGRHcm91cChncm91cC5ib2R5LCBvcHRpb25zKTtcbiAgICB2YXIgZHkgPSBjYWxjdWxhdGVTaXplKGdyb3VwLmR5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZVZMaXN0KHtcbiAgICAgIHBvc2l0aW9uVHlwZTogXCJzaGlmdFwiLFxuICAgICAgcG9zaXRpb25EYXRhOiAtZHksXG4gICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IGJvZHlcbiAgICAgIH1dXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBhZGRlZFwiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5ib2R5LCBvcHRpb25zKV0pO1xuICAgIHZhciBkeSA9IGdyb3VwLmR5Lm51bWJlciArIGdyb3VwLmR5LnVuaXQ7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJ2b2Zmc2V0XCIsIGR5KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3JlbGF4LmpzXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJpbnRlcm5hbFwiLFxuICBuYW1lczogW1wiXFxcXHJlbGF4XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDAsXG4gICAgYWxsb3dlZEluVGV4dDogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaW50ZXJuYWxcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlXG4gICAgfTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3J1bGUuanNcblxuXG5cblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwicnVsZVwiLFxuICBuYW1lczogW1wiXFxcXHJ1bGVcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMixcbiAgICBudW1PcHRpb25hbEFyZ3M6IDEsXG4gICAgYXJnVHlwZXM6IFtcInNpemVcIiwgXCJzaXplXCIsIFwic2l6ZVwiXVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MsIG9wdEFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgdmFyIHNoaWZ0ID0gb3B0QXJnc1swXTtcbiAgICB2YXIgd2lkdGggPSBhc3NlcnROb2RlVHlwZShhcmdzWzBdLCBcInNpemVcIik7XG4gICAgdmFyIGhlaWdodCA9IGFzc2VydE5vZGVUeXBlKGFyZ3NbMV0sIFwic2l6ZVwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJydWxlXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIHNoaWZ0OiBzaGlmdCAmJiBhc3NlcnROb2RlVHlwZShzaGlmdCwgXCJzaXplXCIpLnZhbHVlLFxuICAgICAgd2lkdGg6IHdpZHRoLnZhbHVlLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQudmFsdWVcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICAvLyBNYWtlIGFuIGVtcHR5IHNwYW4gZm9yIHRoZSBydWxlXG4gICAgdmFyIHJ1bGUgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIFwicnVsZVwiXSwgW10sIG9wdGlvbnMpOyAvLyBDYWxjdWxhdGUgdGhlIHNoaWZ0LCB3aWR0aCwgYW5kIGhlaWdodCBvZiB0aGUgcnVsZSwgYW5kIGFjY291bnQgZm9yIHVuaXRzXG5cbiAgICB2YXIgd2lkdGggPSBjYWxjdWxhdGVTaXplKGdyb3VwLndpZHRoLCBvcHRpb25zKTtcbiAgICB2YXIgaGVpZ2h0ID0gY2FsY3VsYXRlU2l6ZShncm91cC5oZWlnaHQsIG9wdGlvbnMpO1xuICAgIHZhciBzaGlmdCA9IGdyb3VwLnNoaWZ0ID8gY2FsY3VsYXRlU2l6ZShncm91cC5zaGlmdCwgb3B0aW9ucykgOiAwOyAvLyBTdHlsZSB0aGUgcnVsZSB0byB0aGUgcmlnaHQgc2l6ZVxuXG4gICAgcnVsZS5zdHlsZS5ib3JkZXJSaWdodFdpZHRoID0gbWFrZUVtKHdpZHRoKTtcbiAgICBydWxlLnN0eWxlLmJvcmRlclRvcFdpZHRoID0gbWFrZUVtKGhlaWdodCk7XG4gICAgcnVsZS5zdHlsZS5ib3R0b20gPSBtYWtlRW0oc2hpZnQpOyAvLyBSZWNvcmQgdGhlIGhlaWdodCBhbmQgd2lkdGhcblxuICAgIHJ1bGUud2lkdGggPSB3aWR0aDtcbiAgICBydWxlLmhlaWdodCA9IGhlaWdodCArIHNoaWZ0O1xuICAgIHJ1bGUuZGVwdGggPSAtc2hpZnQ7IC8vIEZvbnQgc2l6ZSBpcyB0aGUgbnVtYmVyIGxhcmdlIGVub3VnaCB0aGF0IHRoZSBicm93c2VyIHdpbGxcbiAgICAvLyByZXNlcnZlIGF0IGxlYXN0IGBhYnNIZWlnaHRgIHNwYWNlIGFib3ZlIHRoZSBiYXNlbGluZS5cbiAgICAvLyBUaGUgMS4xMjUgZmFjdG9yIHdhcyBlbXBpcmljYWxseSBkZXRlcm1pbmVkXG5cbiAgICBydWxlLm1heEZvbnRTaXplID0gaGVpZ2h0ICogMS4xMjUgKiBvcHRpb25zLnNpemVNdWx0aXBsaWVyO1xuICAgIHJldHVybiBydWxlO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHdpZHRoID0gY2FsY3VsYXRlU2l6ZShncm91cC53aWR0aCwgb3B0aW9ucyk7XG4gICAgdmFyIGhlaWdodCA9IGNhbGN1bGF0ZVNpemUoZ3JvdXAuaGVpZ2h0LCBvcHRpb25zKTtcbiAgICB2YXIgc2hpZnQgPSBncm91cC5zaGlmdCA/IGNhbGN1bGF0ZVNpemUoZ3JvdXAuc2hpZnQsIG9wdGlvbnMpIDogMDtcbiAgICB2YXIgY29sb3IgPSBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuZ2V0Q29sb3IoKSB8fCBcImJsYWNrXCI7XG4gICAgdmFyIHJ1bGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1zcGFjZVwiKTtcbiAgICBydWxlLnNldEF0dHJpYnV0ZShcIm1hdGhiYWNrZ3JvdW5kXCIsIGNvbG9yKTtcbiAgICBydWxlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIG1ha2VFbSh3aWR0aCkpO1xuICAgIHJ1bGUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIG1ha2VFbShoZWlnaHQpKTtcbiAgICB2YXIgd3JhcHBlciA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBhZGRlZFwiLCBbcnVsZV0pO1xuXG4gICAgaWYgKHNoaWZ0ID49IDApIHtcbiAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIG1ha2VFbShzaGlmdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cmFwcGVyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBtYWtlRW0oc2hpZnQpKTtcbiAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlKFwiZGVwdGhcIiwgbWFrZUVtKC1zaGlmdCkpO1xuICAgIH1cblxuICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlKFwidm9mZnNldFwiLCBtYWtlRW0oc2hpZnQpKTtcbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3NpemluZy5qc1xuXG5cblxuXG5cblxuZnVuY3Rpb24gc2l6aW5nR3JvdXAodmFsdWUsIG9wdGlvbnMsIGJhc2VPcHRpb25zKSB7XG4gIHZhciBpbm5lciA9IGJ1aWxkRXhwcmVzc2lvbih2YWx1ZSwgb3B0aW9ucywgZmFsc2UpO1xuICB2YXIgbXVsdGlwbGllciA9IG9wdGlvbnMuc2l6ZU11bHRpcGxpZXIgLyBiYXNlT3B0aW9ucy5zaXplTXVsdGlwbGllcjsgLy8gQWRkIHNpemUtcmVzZXR0aW5nIGNsYXNzZXMgdG8gdGhlIGlubmVyIGxpc3QgYW5kIHNldCBtYXhGb250U2l6ZVxuICAvLyBtYW51YWxseS4gSGFuZGxlIG5lc3RlZCBzaXplIGNoYW5nZXMuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbm5lci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwb3MgPSBpbm5lcltpXS5jbGFzc2VzLmluZGV4T2YoXCJzaXppbmdcIik7XG5cbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoaW5uZXJbaV0uY2xhc3Nlcywgb3B0aW9ucy5zaXppbmdDbGFzc2VzKGJhc2VPcHRpb25zKSk7XG4gICAgfSBlbHNlIGlmIChpbm5lcltpXS5jbGFzc2VzW3BvcyArIDFdID09PSBcInJlc2V0LXNpemVcIiArIG9wdGlvbnMuc2l6ZSkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5lc3RlZCBzaXplIGNoYW5nZTogZS5nLiwgaW5uZXJbaV0gaXMgdGhlIFwiYlwiIGluXG4gICAgICAvLyBgXFxIdWdlIGEgXFxzbWFsbCBiYC4gT3ZlcnJpZGUgdGhlIG9sZCBzaXplICh0aGUgYHJlc2V0LWAgY2xhc3MpXG4gICAgICAvLyBidXQgbm90IHRoZSBuZXcgc2l6ZS5cbiAgICAgIGlubmVyW2ldLmNsYXNzZXNbcG9zICsgMV0gPSBcInJlc2V0LXNpemVcIiArIGJhc2VPcHRpb25zLnNpemU7XG4gICAgfVxuXG4gICAgaW5uZXJbaV0uaGVpZ2h0ICo9IG11bHRpcGxpZXI7XG4gICAgaW5uZXJbaV0uZGVwdGggKj0gbXVsdGlwbGllcjtcbiAgfVxuXG4gIHJldHVybiBidWlsZENvbW1vbi5tYWtlRnJhZ21lbnQoaW5uZXIpO1xufVxudmFyIHNpemVGdW5jcyA9IFtcIlxcXFx0aW55XCIsIFwiXFxcXHNpeHB0c2l6ZVwiLCBcIlxcXFxzY3JpcHRzaXplXCIsIFwiXFxcXGZvb3Rub3Rlc2l6ZVwiLCBcIlxcXFxzbWFsbFwiLCBcIlxcXFxub3JtYWxzaXplXCIsIFwiXFxcXGxhcmdlXCIsIFwiXFxcXExhcmdlXCIsIFwiXFxcXExBUkdFXCIsIFwiXFxcXGh1Z2VcIiwgXCJcXFxcSHVnZVwiXTtcbnZhciBzaXppbmdfaHRtbEJ1aWxkZXIgPSBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAvLyBIYW5kbGUgc2l6aW5nIG9wZXJhdG9ycyBsaWtlIFxcSHVnZS4gUmVhbCBUZVggZG9lc24ndCBhY3R1YWxseSBhbGxvd1xuICAvLyB0aGVzZSBmdW5jdGlvbnMgaW5zaWRlIG9mIG1hdGggZXhwcmVzc2lvbnMsIHNvIHdlIGRvIHNvbWUgc3BlY2lhbFxuICAvLyBoYW5kbGluZy5cbiAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ1NpemUoZ3JvdXAuc2l6ZSk7XG4gIHJldHVybiBzaXppbmdHcm91cChncm91cC5ib2R5LCBuZXdPcHRpb25zLCBvcHRpb25zKTtcbn07XG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwic2l6aW5nXCIsXG4gIG5hbWVzOiBzaXplRnVuY3MsXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBicmVha09uVG9rZW5UZXh0ID0gX3JlZi5icmVha09uVG9rZW5UZXh0LFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWUsXG4gICAgICAgIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBib2R5ID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihmYWxzZSwgYnJlYWtPblRva2VuVGV4dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwic2l6aW5nXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBzaXplIHRvIHVzZSBiYXNlZCBvbiB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgYWJvdmVcbiAgICAgIHNpemU6IHNpemVGdW5jcy5pbmRleE9mKGZ1bmNOYW1lKSArIDEsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IHNpemluZ19odG1sQnVpbGRlcixcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTaXplKGdyb3VwLnNpemUpO1xuICAgIHZhciBpbm5lciA9IGJ1aWxkTWF0aE1MX2J1aWxkRXhwcmVzc2lvbihncm91cC5ib2R5LCBuZXdPcHRpb25zKTtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXN0eWxlXCIsIGlubmVyKTsgLy8gVE9ETyhlbWlseSk6IFRoaXMgZG9lc24ndCBwcm9kdWNlIHRoZSBjb3JyZWN0IHNpemUgZm9yIG5lc3RlZCBzaXplXG4gICAgLy8gY2hhbmdlcywgYmVjYXVzZSB3ZSBkb24ndCBrZWVwIHN0YXRlIG9mIHdoYXQgc3R5bGUgd2UncmUgY3VycmVudGx5XG4gICAgLy8gaW4sIHNvIHdlIGNhbid0IHJlc2V0IHRoZSBzaXplIHRvIG5vcm1hbCBiZWZvcmUgY2hhbmdpbmcgaXQuICBOb3dcbiAgICAvLyB0aGF0IHdlJ3JlIHBhc3NpbmcgYW4gb3B0aW9ucyBwYXJhbWV0ZXIgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZml4XG4gICAgLy8gdGhpcy5cblxuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibWF0aHNpemVcIiwgbWFrZUVtKG5ld09wdGlvbnMuc2l6ZU11bHRpcGxpZXIpKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3NtYXNoLmpzXG4vLyBzbWFzaCwgd2l0aCBvcHRpb25hbCBbdGJdLCBhcyBpbiBBTVNcblxuXG5cblxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJzbWFzaFwiLFxuICBuYW1lczogW1wiXFxcXHNtYXNoXCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgbnVtT3B0aW9uYWxBcmdzOiAxLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzLCBvcHRBcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyO1xuICAgIHZhciBzbWFzaEhlaWdodCA9IGZhbHNlO1xuICAgIHZhciBzbWFzaERlcHRoID0gZmFsc2U7XG4gICAgdmFyIHRiQXJnID0gb3B0QXJnc1swXSAmJiBhc3NlcnROb2RlVHlwZShvcHRBcmdzWzBdLCBcIm9yZGdyb3VwXCIpO1xuXG4gICAgaWYgKHRiQXJnKSB7XG4gICAgICAvLyBPcHRpb25hbCBbdGJdIGFyZ3VtZW50IGlzIGVuZ2FnZWQuXG4gICAgICAvLyByZWY6IGFtc21hdGg6IFxccmVuZXdjb21tYW5ke1xcc21hc2h9WzFdW3RiXXslXG4gICAgICAvLyAgICAgICAgICAgICAgIGRlZlxcbWJAdHtcXGh0fVxcZGVmXFxtYkBie1xcZHB9XFxkZWZcXG1iQHRie1xcaHRcXHpAXFx6QFxcZHB9JVxuICAgICAgdmFyIGxldHRlciA9IFwiXCI7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGJBcmcuYm9keS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgbm9kZSA9IHRiQXJnLmJvZHlbaV07IC8vICRGbG93Rml4TWU6IE5vdCBldmVyeSBub2RlIHR5cGUgaGFzIGEgYHRleHRgIHByb3BlcnR5LlxuXG4gICAgICAgIGxldHRlciA9IG5vZGUudGV4dDtcblxuICAgICAgICBpZiAobGV0dGVyID09PSBcInRcIikge1xuICAgICAgICAgIHNtYXNoSGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsZXR0ZXIgPT09IFwiYlwiKSB7XG4gICAgICAgICAgc21hc2hEZXB0aCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc21hc2hIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgICBzbWFzaERlcHRoID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc21hc2hIZWlnaHQgPSB0cnVlO1xuICAgICAgc21hc2hEZXB0aCA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGJvZHkgPSBhcmdzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInNtYXNoXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGJvZHk6IGJvZHksXG4gICAgICBzbWFzaEhlaWdodDogc21hc2hIZWlnaHQsXG4gICAgICBzbWFzaERlcHRoOiBzbWFzaERlcHRoXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIG5vZGUgPSBidWlsZENvbW1vbi5tYWtlU3BhbihbXSwgW2J1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucyldKTtcblxuICAgIGlmICghZ3JvdXAuc21hc2hIZWlnaHQgJiYgIWdyb3VwLnNtYXNoRGVwdGgpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmIChncm91cC5zbWFzaEhlaWdodCkge1xuICAgICAgbm9kZS5oZWlnaHQgPSAwOyAvLyBJbiBvcmRlciB0byBpbmZsdWVuY2UgbWFrZVZMaXN0LCB3ZSBoYXZlIHRvIHJlc2V0IHRoZSBjaGlsZHJlbi5cblxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbm9kZS5jaGlsZHJlbltpXS5oZWlnaHQgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwLnNtYXNoRGVwdGgpIHtcbiAgICAgIG5vZGUuZGVwdGggPSAwO1xuXG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICBub2RlLmNoaWxkcmVuW19pXS5kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIHJlc2V0IHRoZSBUZVgtbGlrZSBoZWlnaHQgYW5kIGRlcHRoIHZhbHVlcy5cbiAgICAvLyBCdXQgdGhlIHNwYW4gc3RpbGwgaGFzIGFuIEhUTUwgbGluZSBoZWlnaHQuXG4gICAgLy8gbWFrZVZMaXN0IGFwcGxpZXMgXCJkaXNwbGF5OiB0YWJsZS1jZWxsXCIsIHdoaWNoIHByZXZlbnRzIHRoZSBicm93c2VyXG4gICAgLy8gZnJvbSBhY3Rpbmcgb24gdGhhdCBsaW5lIGhlaWdodC4gU28gd2UnbGwgY2FsbCBtYWtlVkxpc3Qgbm93LlxuXG5cbiAgICB2YXIgc21hc2hlZE5vZGUgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImZpcnN0QmFzZWxpbmVcIixcbiAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogbm9kZVxuICAgICAgfV1cbiAgICB9LCBvcHRpb25zKTsgLy8gRm9yIHNwYWNpbmcsIFRlWCB0cmVhdHMgXFxocGhhbnRvbSBhcyBhIG1hdGggZ3JvdXAgKHNhbWUgc3BhY2luZyBhcyBvcmQpLlxuXG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIl0sIFtzbWFzaGVkTm9kZV0sIG9wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1wYWRkZWRcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucyldKTtcblxuICAgIGlmIChncm91cC5zbWFzaEhlaWdodCkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCIwcHhcIik7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwLnNtYXNoRGVwdGgpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGVwdGhcIiwgXCIwcHhcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9zcXJ0LmpzXG5cblxuXG5cblxuXG5cblxuZGVmaW5lRnVuY3Rpb24oe1xuICB0eXBlOiBcInNxcnRcIixcbiAgbmFtZXM6IFtcIlxcXFxzcXJ0XCJdLFxuICBwcm9wczoge1xuICAgIG51bUFyZ3M6IDEsXG4gICAgbnVtT3B0aW9uYWxBcmdzOiAxXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncywgb3B0QXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICB2YXIgaW5kZXggPSBvcHRBcmdzWzBdO1xuICAgIHZhciBib2R5ID0gYXJnc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzcXJ0XCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIGJvZHk6IGJvZHksXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICB9LFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICAvLyBTcXVhcmUgcm9vdHMgYXJlIGhhbmRsZWQgaW4gdGhlIFRlWGJvb2sgcGcuIDQ0MywgUnVsZSAxMS5cbiAgICAvLyBGaXJzdCwgd2UgZG8gdGhlIHNhbWUgc3RlcHMgYXMgaW4gb3ZlcmxpbmUgdG8gYnVpbGQgdGhlIGlubmVyIGdyb3VwXG4gICAgLy8gYW5kIGxpbmVcbiAgICB2YXIgaW5uZXIgPSBidWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMuaGF2aW5nQ3JhbXBlZFN0eWxlKCkpO1xuXG4gICAgaWYgKGlubmVyLmhlaWdodCA9PT0gMCkge1xuICAgICAgLy8gUmVuZGVyIGEgc21hbGwgc3VyZC5cbiAgICAgIGlubmVyLmhlaWdodCA9IG9wdGlvbnMuZm9udE1ldHJpY3MoKS54SGVpZ2h0O1xuICAgIH0gLy8gU29tZSBncm91cHMgY2FuIHJldHVybiBkb2N1bWVudCBmcmFnbWVudHMuICBIYW5kbGUgdGhvc2UgYnkgd3JhcHBpbmdcbiAgICAvLyB0aGVtIGluIGEgc3Bhbi5cblxuXG4gICAgaW5uZXIgPSBidWlsZENvbW1vbi53cmFwRnJhZ21lbnQoaW5uZXIsIG9wdGlvbnMpOyAvLyBDYWxjdWxhdGUgdGhlIG1pbmltdW0gc2l6ZSBmb3IgdGhlIFxcc3VyZCBkZWxpbWl0ZXJcblxuICAgIHZhciBtZXRyaWNzID0gb3B0aW9ucy5mb250TWV0cmljcygpO1xuICAgIHZhciB0aGV0YSA9IG1ldHJpY3MuZGVmYXVsdFJ1bGVUaGlja25lc3M7XG4gICAgdmFyIHBoaSA9IHRoZXRhO1xuXG4gICAgaWYgKG9wdGlvbnMuc3R5bGUuaWQgPCBzcmNfU3R5bGUuVEVYVC5pZCkge1xuICAgICAgcGhpID0gb3B0aW9ucy5mb250TWV0cmljcygpLnhIZWlnaHQ7XG4gICAgfSAvLyBDYWxjdWxhdGUgdGhlIGNsZWFyYW5jZSBiZXR3ZWVuIHRoZSBib2R5IGFuZCBsaW5lXG5cblxuICAgIHZhciBsaW5lQ2xlYXJhbmNlID0gdGhldGEgKyBwaGkgLyA0O1xuICAgIHZhciBtaW5EZWxpbWl0ZXJIZWlnaHQgPSBpbm5lci5oZWlnaHQgKyBpbm5lci5kZXB0aCArIGxpbmVDbGVhcmFuY2UgKyB0aGV0YTsgLy8gQ3JlYXRlIGEgc3FydCBTVkcgb2YgdGhlIHJlcXVpcmVkIG1pbmltdW0gc2l6ZVxuXG4gICAgdmFyIF9kZWxpbWl0ZXIkc3FydEltYWdlID0gZGVsaW1pdGVyLnNxcnRJbWFnZShtaW5EZWxpbWl0ZXJIZWlnaHQsIG9wdGlvbnMpLFxuICAgICAgICBpbWcgPSBfZGVsaW1pdGVyJHNxcnRJbWFnZS5zcGFuLFxuICAgICAgICBydWxlV2lkdGggPSBfZGVsaW1pdGVyJHNxcnRJbWFnZS5ydWxlV2lkdGgsXG4gICAgICAgIGFkdmFuY2VXaWR0aCA9IF9kZWxpbWl0ZXIkc3FydEltYWdlLmFkdmFuY2VXaWR0aDtcblxuICAgIHZhciBkZWxpbURlcHRoID0gaW1nLmhlaWdodCAtIHJ1bGVXaWR0aDsgLy8gQWRqdXN0IHRoZSBjbGVhcmFuY2UgYmFzZWQgb24gdGhlIGRlbGltaXRlciBzaXplXG5cbiAgICBpZiAoZGVsaW1EZXB0aCA+IGlubmVyLmhlaWdodCArIGlubmVyLmRlcHRoICsgbGluZUNsZWFyYW5jZSkge1xuICAgICAgbGluZUNsZWFyYW5jZSA9IChsaW5lQ2xlYXJhbmNlICsgZGVsaW1EZXB0aCAtIGlubmVyLmhlaWdodCAtIGlubmVyLmRlcHRoKSAvIDI7XG4gICAgfSAvLyBTaGlmdCB0aGUgc3FydCBpbWFnZVxuXG5cbiAgICB2YXIgaW1nU2hpZnQgPSBpbWcuaGVpZ2h0IC0gaW5uZXIuaGVpZ2h0IC0gbGluZUNsZWFyYW5jZSAtIHJ1bGVXaWR0aDtcbiAgICBpbm5lci5zdHlsZS5wYWRkaW5nTGVmdCA9IG1ha2VFbShhZHZhbmNlV2lkdGgpOyAvLyBPdmVybGF5IHRoZSBpbWFnZSBhbmQgdGhlIGFyZ3VtZW50LlxuXG4gICAgdmFyIGJvZHkgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcImZpcnN0QmFzZWxpbmVcIixcbiAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogaW5uZXIsXG4gICAgICAgIHdyYXBwZXJDbGFzc2VzOiBbXCJzdmctYWxpZ25cIl1cbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IC0oaW5uZXIuaGVpZ2h0ICsgaW1nU2hpZnQpXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBpbWdcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJrZXJuXCIsXG4gICAgICAgIHNpemU6IHJ1bGVXaWR0aFxuICAgICAgfV1cbiAgICB9LCBvcHRpb25zKTtcblxuICAgIGlmICghZ3JvdXAuaW5kZXgpIHtcbiAgICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIFwic3FydFwiXSwgW2JvZHldLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIHRoZSBvcHRpb25hbCByb290IGluZGV4XG4gICAgICAvLyBUaGUgaW5kZXggaXMgYWx3YXlzIGluIHNjcmlwdHNjcmlwdCBzdHlsZVxuICAgICAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ1N0eWxlKHNyY19TdHlsZS5TQ1JJUFRTQ1JJUFQpO1xuICAgICAgdmFyIHJvb3RtID0gYnVpbGRHcm91cChncm91cC5pbmRleCwgbmV3T3B0aW9ucywgb3B0aW9ucyk7IC8vIFRoZSBhbW91bnQgdGhlIGluZGV4IGlzIHNoaWZ0ZWQgYnkuIFRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgVGVYXG4gICAgICAvLyBzb3VyY2UsIGluIHRoZSBkZWZpbml0aW9uIG9mIGBcXHJAQHRgLlxuXG4gICAgICB2YXIgdG9TaGlmdCA9IDAuNiAqIChib2R5LmhlaWdodCAtIGJvZHkuZGVwdGgpOyAvLyBCdWlsZCBhIFZMaXN0IHdpdGggdGhlIHN1cGVyc2NyaXB0IHNoaWZ0ZWQgdXAgY29ycmVjdGx5XG5cbiAgICAgIHZhciByb290Vkxpc3QgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgICBwb3NpdGlvblR5cGU6IFwic2hpZnRcIixcbiAgICAgICAgcG9zaXRpb25EYXRhOiAtdG9TaGlmdCxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogcm9vdG1cbiAgICAgICAgfV1cbiAgICAgIH0sIG9wdGlvbnMpOyAvLyBBZGQgYSBjbGFzcyBzdXJyb3VuZGluZyBpdCBzbyB3ZSBjYW4gYWRkIG9uIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgLy8ga2VybmluZ1xuXG4gICAgICB2YXIgcm9vdFZMaXN0V3JhcCA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcInJvb3RcIl0sIFtyb290Vkxpc3RdKTtcbiAgICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIFwic3FydFwiXSwgW3Jvb3RWTGlzdFdyYXAsIGJvZHldLCBvcHRpb25zKTtcbiAgICB9XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgYm9keSA9IGdyb3VwLmJvZHksXG4gICAgICAgIGluZGV4ID0gZ3JvdXAuaW5kZXg7XG4gICAgcmV0dXJuIGluZGV4ID8gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtcm9vdFwiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChib2R5LCBvcHRpb25zKSwgYnVpbGRNYXRoTUxfYnVpbGRHcm91cChpbmRleCwgb3B0aW9ucyldKSA6IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXNxcnRcIiwgW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoYm9keSwgb3B0aW9ucyldKTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3N0eWxpbmcuanNcblxuXG5cblxuXG52YXIgc3R5bGluZ19zdHlsZU1hcCA9IHtcbiAgXCJkaXNwbGF5XCI6IHNyY19TdHlsZS5ESVNQTEFZLFxuICBcInRleHRcIjogc3JjX1N0eWxlLlRFWFQsXG4gIFwic2NyaXB0XCI6IHNyY19TdHlsZS5TQ1JJUFQsXG4gIFwic2NyaXB0c2NyaXB0XCI6IHNyY19TdHlsZS5TQ1JJUFRTQ1JJUFRcbn07XG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwic3R5bGluZ1wiLFxuICBuYW1lczogW1wiXFxcXGRpc3BsYXlzdHlsZVwiLCBcIlxcXFx0ZXh0c3R5bGVcIiwgXCJcXFxcc2NyaXB0c3R5bGVcIiwgXCJcXFxcc2NyaXB0c2NyaXB0c3R5bGVcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlLFxuICAgIHByaW1pdGl2ZTogdHJ1ZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgYnJlYWtPblRva2VuVGV4dCA9IF9yZWYuYnJlYWtPblRva2VuVGV4dCxcbiAgICAgICAgZnVuY05hbWUgPSBfcmVmLmZ1bmNOYW1lLFxuICAgICAgICBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICAvLyBwYXJzZSBvdXQgdGhlIGltcGxpY2l0IGJvZHlcbiAgICB2YXIgYm9keSA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24odHJ1ZSwgYnJlYWtPblRva2VuVGV4dCk7IC8vIFRPRE86IFJlZmFjdG9yIHRvIGF2b2lkIGR1cGxpY2F0aW5nIHN0eWxlTWFwIGluIG11bHRpcGxlIHBsYWNlcyAoZS5nLlxuICAgIC8vIGhlcmUgYW5kIGluIGJ1aWxkSFRNTCBhbmQgZGUtZHVwZSB0aGUgZW51bWVyYXRpb24gb2YgYWxsIHRoZSBzdHlsZXMpLlxuICAgIC8vICRGbG93Rml4TWU6IFRoZSBuYW1lcyBhYm92ZSBleGFjdGx5IG1hdGNoIHRoZSBzdHlsZXMuXG5cbiAgICB2YXIgc3R5bGUgPSBmdW5jTmFtZS5zbGljZSgxLCBmdW5jTmFtZS5sZW5ndGggLSA1KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzdHlsaW5nXCIsXG4gICAgICBtb2RlOiBwYXJzZXIubW9kZSxcbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBzdHlsZSB0byB1c2UgYnkgcHVsbGluZyBvdXQgdGhlIHN0eWxlIGZyb21cbiAgICAgIC8vIHRoZSBmdW5jdGlvbiBuYW1lXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBib2R5OiBib2R5XG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gU3R5bGUgY2hhbmdlcyBhcmUgaGFuZGxlZCBpbiB0aGUgVGVYYm9vayBvbiBwZy4gNDQyLCBSdWxlIDMuXG4gICAgdmFyIG5ld1N0eWxlID0gc3R5bGluZ19zdHlsZU1hcFtncm91cC5zdHlsZV07XG4gICAgdmFyIG5ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ1N0eWxlKG5ld1N0eWxlKS53aXRoRm9udCgnJyk7XG4gICAgcmV0dXJuIHNpemluZ0dyb3VwKGdyb3VwLmJvZHksIG5ld09wdGlvbnMsIG9wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gRmlndXJlIG91dCB3aGF0IHN0eWxlIHdlJ3JlIGNoYW5naW5nIHRvLlxuICAgIHZhciBuZXdTdHlsZSA9IHN0eWxpbmdfc3R5bGVNYXBbZ3JvdXAuc3R5bGVdO1xuICAgIHZhciBuZXdPcHRpb25zID0gb3B0aW9ucy5oYXZpbmdTdHlsZShuZXdTdHlsZSk7XG4gICAgdmFyIGlubmVyID0gYnVpbGRNYXRoTUxfYnVpbGRFeHByZXNzaW9uKGdyb3VwLmJvZHksIG5ld09wdGlvbnMpO1xuICAgIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtc3R5bGVcIiwgaW5uZXIpO1xuICAgIHZhciBzdHlsZUF0dHJpYnV0ZXMgPSB7XG4gICAgICBcImRpc3BsYXlcIjogW1wiMFwiLCBcInRydWVcIl0sXG4gICAgICBcInRleHRcIjogW1wiMFwiLCBcImZhbHNlXCJdLFxuICAgICAgXCJzY3JpcHRcIjogW1wiMVwiLCBcImZhbHNlXCJdLFxuICAgICAgXCJzY3JpcHRzY3JpcHRcIjogW1wiMlwiLCBcImZhbHNlXCJdXG4gICAgfTtcbiAgICB2YXIgYXR0ciA9IHN0eWxlQXR0cmlidXRlc1tncm91cC5zdHlsZV07XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzY3JpcHRsZXZlbFwiLCBhdHRyWzBdKTtcbiAgICBub2RlLnNldEF0dHJpYnV0ZShcImRpc3BsYXlzdHlsZVwiLCBhdHRyWzFdKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3N1cHN1Yi5qc1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogU29tZXRpbWVzLCBncm91cHMgcGVyZm9ybSBzcGVjaWFsIHJ1bGVzIHdoZW4gdGhleSBoYXZlIHN1cGVyc2NyaXB0cyBvclxuICogc3Vic2NyaXB0cyBhdHRhY2hlZCB0byB0aGVtLiBUaGlzIGZ1bmN0aW9uIGxldHMgdGhlIGBzdXBzdWJgIGdyb3VwIGtub3cgdGhhdFxuICogU29tZXRpbWVzLCBncm91cHMgcGVyZm9ybSBzcGVjaWFsIHJ1bGVzIHdoZW4gdGhleSBoYXZlIHN1cGVyc2NyaXB0cyBvclxuICogaXRzIGlubmVyIGVsZW1lbnQgc2hvdWxkIGhhbmRsZSB0aGUgc3VwZXJzY3JpcHRzIGFuZCBzdWJzY3JpcHRzIGluc3RlYWQgb2ZcbiAqIGhhbmRsaW5nIHRoZW0gaXRzZWxmLlxuICovXG52YXIgaHRtbEJ1aWxkZXJEZWxlZ2F0ZSA9IGZ1bmN0aW9uIGh0bWxCdWlsZGVyRGVsZWdhdGUoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgdmFyIGJhc2UgPSBncm91cC5iYXNlO1xuXG4gIGlmICghYmFzZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKGJhc2UudHlwZSA9PT0gXCJvcFwiKSB7XG4gICAgLy8gT3BlcmF0b3JzIGhhbmRsZSBzdXBzdWJzIGRpZmZlcmVudGx5IHdoZW4gdGhleSBoYXZlIGxpbWl0c1xuICAgIC8vIChlLmcuIGBcXGRpc3BsYXlzdHlsZVxcc3VtXzJeM2ApXG4gICAgdmFyIGRlbGVnYXRlID0gYmFzZS5saW1pdHMgJiYgKG9wdGlvbnMuc3R5bGUuc2l6ZSA9PT0gc3JjX1N0eWxlLkRJU1BMQVkuc2l6ZSB8fCBiYXNlLmFsd2F5c0hhbmRsZVN1cFN1Yik7XG4gICAgcmV0dXJuIGRlbGVnYXRlID8gb3BfaHRtbEJ1aWxkZXIgOiBudWxsO1xuICB9IGVsc2UgaWYgKGJhc2UudHlwZSA9PT0gXCJvcGVyYXRvcm5hbWVcIikge1xuICAgIHZhciBfZGVsZWdhdGUgPSBiYXNlLmFsd2F5c0hhbmRsZVN1cFN1YiAmJiAob3B0aW9ucy5zdHlsZS5zaXplID09PSBzcmNfU3R5bGUuRElTUExBWS5zaXplIHx8IGJhc2UubGltaXRzKTtcblxuICAgIHJldHVybiBfZGVsZWdhdGUgPyBvcGVyYXRvcm5hbWVfaHRtbEJ1aWxkZXIgOiBudWxsO1xuICB9IGVsc2UgaWYgKGJhc2UudHlwZSA9PT0gXCJhY2NlbnRcIikge1xuICAgIHJldHVybiB1dGlscy5pc0NoYXJhY3RlckJveChiYXNlLmJhc2UpID8gaHRtbEJ1aWxkZXIgOiBudWxsO1xuICB9IGVsc2UgaWYgKGJhc2UudHlwZSA9PT0gXCJob3JpekJyYWNlXCIpIHtcbiAgICB2YXIgaXNTdXAgPSAhZ3JvdXAuc3ViO1xuICAgIHJldHVybiBpc1N1cCA9PT0gYmFzZS5pc092ZXIgPyBob3JpekJyYWNlX2h0bWxCdWlsZGVyIDogbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTsgLy8gU3VwZXIgc2NyaXB0cyBhbmQgc3Vic2NyaXB0cywgd2hvc2UgcHJlY2lzZSBwbGFjZW1lbnQgY2FuIGRlcGVuZCBvbiBvdGhlclxuLy8gZnVuY3Rpb25zIHRoYXQgcHJlY2VkZSB0aGVtLlxuXG5cbmRlZmluZUZ1bmN0aW9uQnVpbGRlcnMoe1xuICB0eXBlOiBcInN1cHN1YlwiLFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICAvLyBTdXBlcnNjcmlwdCBhbmQgc3Vic2NyaXB0cyBhcmUgaGFuZGxlZCBpbiB0aGUgVGVYYm9vayBvbiBwYWdlXG4gICAgLy8gNDQ1LTQ0NiwgcnVsZXMgMTgoYS1mKS5cbiAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIGRlZmVyIHRvIHRoZSBpbm5lciBncm91cCBpZiBpdCBzaG91bGQgaGFuZGxlXG4gICAgLy8gc3VwZXJzY3JpcHRzIGFuZCBzdWJzY3JpcHRzIGl0c2VsZi5cbiAgICB2YXIgYnVpbGRlckRlbGVnYXRlID0gaHRtbEJ1aWxkZXJEZWxlZ2F0ZShncm91cCwgb3B0aW9ucyk7XG5cbiAgICBpZiAoYnVpbGRlckRlbGVnYXRlKSB7XG4gICAgICByZXR1cm4gYnVpbGRlckRlbGVnYXRlKGdyb3VwLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVCYXNlID0gZ3JvdXAuYmFzZSxcbiAgICAgICAgdmFsdWVTdXAgPSBncm91cC5zdXAsXG4gICAgICAgIHZhbHVlU3ViID0gZ3JvdXAuc3ViO1xuICAgIHZhciBiYXNlID0gYnVpbGRHcm91cCh2YWx1ZUJhc2UsIG9wdGlvbnMpO1xuICAgIHZhciBzdXBtO1xuICAgIHZhciBzdWJtO1xuICAgIHZhciBtZXRyaWNzID0gb3B0aW9ucy5mb250TWV0cmljcygpOyAvLyBSdWxlIDE4YVxuXG4gICAgdmFyIHN1cFNoaWZ0ID0gMDtcbiAgICB2YXIgc3ViU2hpZnQgPSAwO1xuICAgIHZhciBpc0NoYXJhY3RlckJveCA9IHZhbHVlQmFzZSAmJiB1dGlscy5pc0NoYXJhY3RlckJveCh2YWx1ZUJhc2UpO1xuXG4gICAgaWYgKHZhbHVlU3VwKSB7XG4gICAgICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nU3R5bGUob3B0aW9ucy5zdHlsZS5zdXAoKSk7XG4gICAgICBzdXBtID0gYnVpbGRHcm91cCh2YWx1ZVN1cCwgbmV3T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgIGlmICghaXNDaGFyYWN0ZXJCb3gpIHtcbiAgICAgICAgc3VwU2hpZnQgPSBiYXNlLmhlaWdodCAtIG5ld09wdGlvbnMuZm9udE1ldHJpY3MoKS5zdXBEcm9wICogbmV3T3B0aW9ucy5zaXplTXVsdGlwbGllciAvIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlU3ViKSB7XG4gICAgICB2YXIgX25ld09wdGlvbnMgPSBvcHRpb25zLmhhdmluZ1N0eWxlKG9wdGlvbnMuc3R5bGUuc3ViKCkpO1xuXG4gICAgICBzdWJtID0gYnVpbGRHcm91cCh2YWx1ZVN1YiwgX25ld09wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIWlzQ2hhcmFjdGVyQm94KSB7XG4gICAgICAgIHN1YlNoaWZ0ID0gYmFzZS5kZXB0aCArIF9uZXdPcHRpb25zLmZvbnRNZXRyaWNzKCkuc3ViRHJvcCAqIF9uZXdPcHRpb25zLnNpemVNdWx0aXBsaWVyIC8gb3B0aW9ucy5zaXplTXVsdGlwbGllcjtcbiAgICAgIH1cbiAgICB9IC8vIFJ1bGUgMThjXG5cblxuICAgIHZhciBtaW5TdXBTaGlmdDtcblxuICAgIGlmIChvcHRpb25zLnN0eWxlID09PSBzcmNfU3R5bGUuRElTUExBWSkge1xuICAgICAgbWluU3VwU2hpZnQgPSBtZXRyaWNzLnN1cDE7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnN0eWxlLmNyYW1wZWQpIHtcbiAgICAgIG1pblN1cFNoaWZ0ID0gbWV0cmljcy5zdXAzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW5TdXBTaGlmdCA9IG1ldHJpY3Muc3VwMjtcbiAgICB9IC8vIHNjcmlwdHNwYWNlIGlzIGEgZm9udC1zaXplLWluZGVwZW5kZW50IHNpemUsIHNvIHNjYWxlIGl0XG4gICAgLy8gYXBwcm9wcmlhdGVseSBmb3IgdXNlIGFzIHRoZSBtYXJnaW5SaWdodC5cblxuXG4gICAgdmFyIG11bHRpcGxpZXIgPSBvcHRpb25zLnNpemVNdWx0aXBsaWVyO1xuICAgIHZhciBtYXJnaW5SaWdodCA9IG1ha2VFbSgwLjUgLyBtZXRyaWNzLnB0UGVyRW0gLyBtdWx0aXBsaWVyKTtcbiAgICB2YXIgbWFyZ2luTGVmdCA9IG51bGw7XG5cbiAgICBpZiAoc3VibSkge1xuICAgICAgLy8gU3Vic2NyaXB0cyBzaG91bGRuJ3QgYmUgc2hpZnRlZCBieSB0aGUgYmFzZSdzIGl0YWxpYyBjb3JyZWN0aW9uLlxuICAgICAgLy8gQWNjb3VudCBmb3IgdGhhdCBieSBzaGlmdGluZyB0aGUgc3Vic2NyaXB0IGJhY2sgdGhlIGFwcHJvcHJpYXRlXG4gICAgICAvLyBhbW91bnQuIE5vdGUgd2Ugb25seSBkbyB0aGlzIHdoZW4gdGhlIGJhc2UgaXMgYSBzaW5nbGUgc3ltYm9sLlxuICAgICAgdmFyIGlzT2lpbnQgPSBncm91cC5iYXNlICYmIGdyb3VwLmJhc2UudHlwZSA9PT0gXCJvcFwiICYmIGdyb3VwLmJhc2UubmFtZSAmJiAoZ3JvdXAuYmFzZS5uYW1lID09PSBcIlxcXFxvaWludFwiIHx8IGdyb3VwLmJhc2UubmFtZSA9PT0gXCJcXFxcb2lpaW50XCIpO1xuXG4gICAgICBpZiAoYmFzZSBpbnN0YW5jZW9mIFN5bWJvbE5vZGUgfHwgaXNPaWludCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIG1hcmdpbkxlZnQgPSBtYWtlRW0oLWJhc2UuaXRhbGljKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3Vwc3ViO1xuXG4gICAgaWYgKHN1cG0gJiYgc3VibSkge1xuICAgICAgc3VwU2hpZnQgPSBNYXRoLm1heChzdXBTaGlmdCwgbWluU3VwU2hpZnQsIHN1cG0uZGVwdGggKyAwLjI1ICogbWV0cmljcy54SGVpZ2h0KTtcbiAgICAgIHN1YlNoaWZ0ID0gTWF0aC5tYXgoc3ViU2hpZnQsIG1ldHJpY3Muc3ViMik7XG4gICAgICB2YXIgcnVsZVdpZHRoID0gbWV0cmljcy5kZWZhdWx0UnVsZVRoaWNrbmVzczsgLy8gUnVsZSAxOGVcblxuICAgICAgdmFyIG1heFdpZHRoID0gNCAqIHJ1bGVXaWR0aDtcblxuICAgICAgaWYgKHN1cFNoaWZ0IC0gc3VwbS5kZXB0aCAtIChzdWJtLmhlaWdodCAtIHN1YlNoaWZ0KSA8IG1heFdpZHRoKSB7XG4gICAgICAgIHN1YlNoaWZ0ID0gbWF4V2lkdGggLSAoc3VwU2hpZnQgLSBzdXBtLmRlcHRoKSArIHN1Ym0uaGVpZ2h0O1xuICAgICAgICB2YXIgcHNpID0gMC44ICogbWV0cmljcy54SGVpZ2h0IC0gKHN1cFNoaWZ0IC0gc3VwbS5kZXB0aCk7XG5cbiAgICAgICAgaWYgKHBzaSA+IDApIHtcbiAgICAgICAgICBzdXBTaGlmdCArPSBwc2k7XG4gICAgICAgICAgc3ViU2hpZnQgLT0gcHNpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2bGlzdEVsZW0gPSBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogc3VibSxcbiAgICAgICAgc2hpZnQ6IHN1YlNoaWZ0LFxuICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luUmlnaHQsXG4gICAgICAgIG1hcmdpbkxlZnQ6IG1hcmdpbkxlZnRcbiAgICAgIH0sIHtcbiAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgIGVsZW06IHN1cG0sXG4gICAgICAgIHNoaWZ0OiAtc3VwU2hpZnQsXG4gICAgICAgIG1hcmdpblJpZ2h0OiBtYXJnaW5SaWdodFxuICAgICAgfV07XG4gICAgICBzdXBzdWIgPSBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgICBwb3NpdGlvblR5cGU6IFwiaW5kaXZpZHVhbFNoaWZ0XCIsXG4gICAgICAgIGNoaWxkcmVuOiB2bGlzdEVsZW1cbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoc3VibSkge1xuICAgICAgLy8gUnVsZSAxOGJcbiAgICAgIHN1YlNoaWZ0ID0gTWF0aC5tYXgoc3ViU2hpZnQsIG1ldHJpY3Muc3ViMSwgc3VibS5oZWlnaHQgLSAwLjggKiBtZXRyaWNzLnhIZWlnaHQpO1xuICAgICAgdmFyIF92bGlzdEVsZW0gPSBbe1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogc3VibSxcbiAgICAgICAgbWFyZ2luTGVmdDogbWFyZ2luTGVmdCxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IG1hcmdpblJpZ2h0XG4gICAgICB9XTtcbiAgICAgIHN1cHN1YiA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICAgIHBvc2l0aW9uVHlwZTogXCJzaGlmdFwiLFxuICAgICAgICBwb3NpdGlvbkRhdGE6IHN1YlNoaWZ0LFxuICAgICAgICBjaGlsZHJlbjogX3ZsaXN0RWxlbVxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChzdXBtKSB7XG4gICAgICAvLyBSdWxlIDE4YywgZFxuICAgICAgc3VwU2hpZnQgPSBNYXRoLm1heChzdXBTaGlmdCwgbWluU3VwU2hpZnQsIHN1cG0uZGVwdGggKyAwLjI1ICogbWV0cmljcy54SGVpZ2h0KTtcbiAgICAgIHN1cHN1YiA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICAgIHBvc2l0aW9uVHlwZTogXCJzaGlmdFwiLFxuICAgICAgICBwb3NpdGlvbkRhdGE6IC1zdXBTaGlmdCxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdHlwZTogXCJlbGVtXCIsXG4gICAgICAgICAgZWxlbTogc3VwbSxcbiAgICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luUmlnaHRcbiAgICAgICAgfV1cbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdXBzdWIgbXVzdCBoYXZlIGVpdGhlciBzdXAgb3Igc3ViLlwiKTtcbiAgICB9IC8vIFdyYXAgdGhlIHN1cHN1YiB2bGlzdCBpbiBhIHNwYW4ubXN1cHN1YiB0byByZXNldCB0ZXh0LWFsaWduLlxuXG5cbiAgICB2YXIgbWNsYXNzID0gZ2V0VHlwZU9mRG9tVHJlZShiYXNlLCBcInJpZ2h0XCIpIHx8IFwibW9yZFwiO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbbWNsYXNzXSwgW2Jhc2UsIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1zdXBzdWJcIl0sIFtzdXBzdWJdKV0sIG9wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gSXMgdGhlIGlubmVyIGdyb3VwIGEgcmVsZXZhbnQgaG9yaXpvbmFsIGJyYWNlP1xuICAgIHZhciBpc0JyYWNlID0gZmFsc2U7XG4gICAgdmFyIGlzT3ZlcjtcbiAgICB2YXIgaXNTdXA7XG5cbiAgICBpZiAoZ3JvdXAuYmFzZSAmJiBncm91cC5iYXNlLnR5cGUgPT09IFwiaG9yaXpCcmFjZVwiKSB7XG4gICAgICBpc1N1cCA9ICEhZ3JvdXAuc3VwO1xuXG4gICAgICBpZiAoaXNTdXAgPT09IGdyb3VwLmJhc2UuaXNPdmVyKSB7XG4gICAgICAgIGlzQnJhY2UgPSB0cnVlO1xuICAgICAgICBpc092ZXIgPSBncm91cC5iYXNlLmlzT3ZlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ3JvdXAuYmFzZSAmJiAoZ3JvdXAuYmFzZS50eXBlID09PSBcIm9wXCIgfHwgZ3JvdXAuYmFzZS50eXBlID09PSBcIm9wZXJhdG9ybmFtZVwiKSkge1xuICAgICAgZ3JvdXAuYmFzZS5wYXJlbnRJc1N1cFN1YiA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gW2J1aWxkTWF0aE1MX2J1aWxkR3JvdXAoZ3JvdXAuYmFzZSwgb3B0aW9ucyldO1xuXG4gICAgaWYgKGdyb3VwLnN1Yikge1xuICAgICAgY2hpbGRyZW4ucHVzaChidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLnN1Yiwgb3B0aW9ucykpO1xuICAgIH1cblxuICAgIGlmIChncm91cC5zdXApIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5zdXAsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZVR5cGU7XG5cbiAgICBpZiAoaXNCcmFjZSkge1xuICAgICAgbm9kZVR5cGUgPSBpc092ZXIgPyBcIm1vdmVyXCIgOiBcIm11bmRlclwiO1xuICAgIH0gZWxzZSBpZiAoIWdyb3VwLnN1Yikge1xuICAgICAgdmFyIGJhc2UgPSBncm91cC5iYXNlO1xuXG4gICAgICBpZiAoYmFzZSAmJiBiYXNlLnR5cGUgPT09IFwib3BcIiAmJiBiYXNlLmxpbWl0cyAmJiAob3B0aW9ucy5zdHlsZSA9PT0gc3JjX1N0eWxlLkRJU1BMQVkgfHwgYmFzZS5hbHdheXNIYW5kbGVTdXBTdWIpKSB7XG4gICAgICAgIG5vZGVUeXBlID0gXCJtb3ZlclwiO1xuICAgICAgfSBlbHNlIGlmIChiYXNlICYmIGJhc2UudHlwZSA9PT0gXCJvcGVyYXRvcm5hbWVcIiAmJiBiYXNlLmFsd2F5c0hhbmRsZVN1cFN1YiAmJiAoYmFzZS5saW1pdHMgfHwgb3B0aW9ucy5zdHlsZSA9PT0gc3JjX1N0eWxlLkRJU1BMQVkpKSB7XG4gICAgICAgIG5vZGVUeXBlID0gXCJtb3ZlclwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZVR5cGUgPSBcIm1zdXBcIjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFncm91cC5zdXApIHtcbiAgICAgIHZhciBfYmFzZSA9IGdyb3VwLmJhc2U7XG5cbiAgICAgIGlmIChfYmFzZSAmJiBfYmFzZS50eXBlID09PSBcIm9wXCIgJiYgX2Jhc2UubGltaXRzICYmIChvcHRpb25zLnN0eWxlID09PSBzcmNfU3R5bGUuRElTUExBWSB8fCBfYmFzZS5hbHdheXNIYW5kbGVTdXBTdWIpKSB7XG4gICAgICAgIG5vZGVUeXBlID0gXCJtdW5kZXJcIjtcbiAgICAgIH0gZWxzZSBpZiAoX2Jhc2UgJiYgX2Jhc2UudHlwZSA9PT0gXCJvcGVyYXRvcm5hbWVcIiAmJiBfYmFzZS5hbHdheXNIYW5kbGVTdXBTdWIgJiYgKF9iYXNlLmxpbWl0cyB8fCBvcHRpb25zLnN0eWxlID09PSBzcmNfU3R5bGUuRElTUExBWSkpIHtcbiAgICAgICAgbm9kZVR5cGUgPSBcIm11bmRlclwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZVR5cGUgPSBcIm1zdWJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9iYXNlMiA9IGdyb3VwLmJhc2U7XG5cbiAgICAgIGlmIChfYmFzZTIgJiYgX2Jhc2UyLnR5cGUgPT09IFwib3BcIiAmJiBfYmFzZTIubGltaXRzICYmIG9wdGlvbnMuc3R5bGUgPT09IHNyY19TdHlsZS5ESVNQTEFZKSB7XG4gICAgICAgIG5vZGVUeXBlID0gXCJtdW5kZXJvdmVyXCI7XG4gICAgICB9IGVsc2UgaWYgKF9iYXNlMiAmJiBfYmFzZTIudHlwZSA9PT0gXCJvcGVyYXRvcm5hbWVcIiAmJiBfYmFzZTIuYWx3YXlzSGFuZGxlU3VwU3ViICYmIChvcHRpb25zLnN0eWxlID09PSBzcmNfU3R5bGUuRElTUExBWSB8fCBfYmFzZTIubGltaXRzKSkge1xuICAgICAgICBub2RlVHlwZSA9IFwibXVuZGVyb3ZlclwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZVR5cGUgPSBcIm1zdWJzdXBcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUobm9kZVR5cGUsIGNoaWxkcmVuKTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3N5bWJvbHNPcC5qc1xuXG5cblxuIC8vIE9wZXJhdG9yIFBhcnNlTm9kZXMgY3JlYXRlZCBpbiBQYXJzZXIuanMgZnJvbSBzeW1ib2wgR3JvdXBzIGluIHNyYy9zeW1ib2xzLmpzLlxuXG5kZWZpbmVGdW5jdGlvbkJ1aWxkZXJzKHtcbiAgdHlwZTogXCJhdG9tXCIsXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYXRoc3ltKGdyb3VwLnRleHQsIGdyb3VwLm1vZGUsIG9wdGlvbnMsIFtcIm1cIiArIGdyb3VwLmZhbWlseV0pO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgbWF0aE1MVHJlZS5NYXRoTm9kZShcIm1vXCIsIFttYWtlVGV4dChncm91cC50ZXh0LCBncm91cC5tb2RlKV0pO1xuXG4gICAgaWYgKGdyb3VwLmZhbWlseSA9PT0gXCJiaW5cIikge1xuICAgICAgdmFyIHZhcmlhbnQgPSBnZXRWYXJpYW50KGdyb3VwLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHZhcmlhbnQgPT09IFwiYm9sZC1pdGFsaWNcIikge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcIm1hdGh2YXJpYW50XCIsIHZhcmlhbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3JvdXAuZmFtaWx5ID09PSBcInB1bmN0XCIpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic2VwYXJhdG9yXCIsIFwidHJ1ZVwiKTtcbiAgICB9IGVsc2UgaWYgKGdyb3VwLmZhbWlseSA9PT0gXCJvcGVuXCIgfHwgZ3JvdXAuZmFtaWx5ID09PSBcImNsb3NlXCIpIHtcbiAgICAgIC8vIERlbGltcyBidWlsdCBoZXJlIHNob3VsZCBub3Qgc3RyZXRjaCB2ZXJ0aWNhbGx5LlxuICAgICAgLy8gU2VlIGRlbGltc2l6aW5nLmpzIGZvciBzdHJldGNoeSBkZWxpbXMuXG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cmV0Y2h5XCIsIFwiZmFsc2VcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Z1bmN0aW9ucy9zeW1ib2xzT3JkLmpzXG5cblxuXG5cbi8vIFwibWF0aG9yZFwiIGFuZCBcInRleHRvcmRcIiBQYXJzZU5vZGVzIGNyZWF0ZWQgaW4gUGFyc2VyLmpzIGZyb20gc3ltYm9sIEdyb3VwcyBpblxuLy8gc3JjL3N5bWJvbHMuanMuXG52YXIgZGVmYXVsdFZhcmlhbnQgPSB7XG4gIFwibWlcIjogXCJpdGFsaWNcIixcbiAgXCJtblwiOiBcIm5vcm1hbFwiLFxuICBcIm10ZXh0XCI6IFwibm9ybWFsXCJcbn07XG5kZWZpbmVGdW5jdGlvbkJ1aWxkZXJzKHtcbiAgdHlwZTogXCJtYXRob3JkXCIsXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlT3JkKGdyb3VwLCBvcHRpb25zLCBcIm1hdGhvcmRcIik7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibWlcIiwgW21ha2VUZXh0KGdyb3VwLnRleHQsIGdyb3VwLm1vZGUsIG9wdGlvbnMpXSk7XG4gICAgdmFyIHZhcmlhbnQgPSBnZXRWYXJpYW50KGdyb3VwLCBvcHRpb25zKSB8fCBcIml0YWxpY1wiO1xuXG4gICAgaWYgKHZhcmlhbnQgIT09IGRlZmF1bHRWYXJpYW50W25vZGUudHlwZV0pIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibWF0aHZhcmlhbnRcIiwgdmFyaWFudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuZGVmaW5lRnVuY3Rpb25CdWlsZGVycyh7XG4gIHR5cGU6IFwidGV4dG9yZFwiLFxuICBodG1sQnVpbGRlcjogZnVuY3Rpb24gaHRtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYnVpbGRDb21tb24ubWFrZU9yZChncm91cCwgb3B0aW9ucywgXCJ0ZXh0b3JkXCIpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHRleHQgPSBtYWtlVGV4dChncm91cC50ZXh0LCBncm91cC5tb2RlLCBvcHRpb25zKTtcbiAgICB2YXIgdmFyaWFudCA9IGdldFZhcmlhbnQoZ3JvdXAsIG9wdGlvbnMpIHx8IFwibm9ybWFsXCI7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBpZiAoZ3JvdXAubW9kZSA9PT0gJ3RleHQnKSB7XG4gICAgICBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGV4dFwiLCBbdGV4dF0pO1xuICAgIH0gZWxzZSBpZiAoL1swLTldLy50ZXN0KGdyb3VwLnRleHQpKSB7XG4gICAgICBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtblwiLCBbdGV4dF0pO1xuICAgIH0gZWxzZSBpZiAoZ3JvdXAudGV4dCA9PT0gXCJcXFxccHJpbWVcIikge1xuICAgICAgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibW9cIiwgW3RleHRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibWlcIiwgW3RleHRdKTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWFudCAhPT0gZGVmYXVsdFZhcmlhbnRbbm9kZS50eXBlXSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXRodmFyaWFudFwiLCB2YXJpYW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3N5bWJvbHNTcGFjaW5nLmpzXG5cblxuXG4gLy8gQSBtYXAgb2YgQ1NTLWJhc2VkIHNwYWNpbmcgZnVuY3Rpb25zIHRvIHRoZWlyIENTUyBjbGFzcy5cblxudmFyIGNzc1NwYWNlID0ge1xuICBcIlxcXFxub2JyZWFrXCI6IFwibm9icmVha1wiLFxuICBcIlxcXFxhbGxvd2JyZWFrXCI6IFwiYWxsb3dicmVha1wiXG59OyAvLyBBIGxvb2t1cCB0YWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIHNwYWNpbmcgZnVuY3Rpb24vc3ltYm9sIHNob3VsZCBiZVxuLy8gdHJlYXRlZCBsaWtlIGEgcmVndWxhciBzcGFjZSBjaGFyYWN0ZXIuICBJZiBhIHN5bWJvbCBvciBjb21tYW5kIGlzIGEga2V5XG4vLyBpbiB0aGlzIHRhYmxlLCB0aGVuIGl0IHNob3VsZCBiZSBhIHJlZ3VsYXIgc3BhY2UgY2hhcmFjdGVyLiAgRnVydGhlcm1vcmUsXG4vLyB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBtYXkgaGF2ZSBhIGBjbGFzc05hbWVgIHNwZWNpZnlpbmcgYW4gZXh0cmEgQ1NTIGNsYXNzXG4vLyB0byBhZGQgdG8gdGhlIGNyZWF0ZWQgYHNwYW5gLlxuXG52YXIgcmVndWxhclNwYWNlID0ge1xuICBcIiBcIjoge30sXG4gIFwiXFxcXCBcIjoge30sXG4gIFwiflwiOiB7XG4gICAgY2xhc3NOYW1lOiBcIm5vYnJlYWtcIlxuICB9LFxuICBcIlxcXFxzcGFjZVwiOiB7fSxcbiAgXCJcXFxcbm9icmVha3NwYWNlXCI6IHtcbiAgICBjbGFzc05hbWU6IFwibm9icmVha1wiXG4gIH1cbn07IC8vIFBhcnNlTm9kZTxcInNwYWNpbmdcIj4gY3JlYXRlZCBpbiBQYXJzZXIuanMgZnJvbSB0aGUgXCJzcGFjaW5nXCIgc3ltYm9sIEdyb3VwcyBpblxuLy8gc3JjL3N5bWJvbHMuanMuXG5cbmRlZmluZUZ1bmN0aW9uQnVpbGRlcnMoe1xuICB0eXBlOiBcInNwYWNpbmdcIixcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgaWYgKHJlZ3VsYXJTcGFjZS5oYXNPd25Qcm9wZXJ0eShncm91cC50ZXh0KSkge1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IHJlZ3VsYXJTcGFjZVtncm91cC50ZXh0XS5jbGFzc05hbWUgfHwgXCJcIjsgLy8gU3BhY2VzIGFyZSBnZW5lcmF0ZWQgYnkgYWRkaW5nIGFuIGFjdHVhbCBzcGFjZS4gRWFjaCBvZiB0aGVzZVxuICAgICAgLy8gdGhpbmdzIGhhcyBhbiBlbnRyeSBpbiB0aGUgc3ltYm9scyB0YWJsZSwgc28gdGhlc2Ugd2lsbCBiZSB0dXJuZWRcbiAgICAgIC8vIGludG8gYXBwcm9wcmlhdGUgb3V0cHV0cy5cblxuICAgICAgaWYgKGdyb3VwLm1vZGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHZhciBvcmQgPSBidWlsZENvbW1vbi5tYWtlT3JkKGdyb3VwLCBvcHRpb25zLCBcInRleHRvcmRcIik7XG4gICAgICAgIG9yZC5jbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIG9yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtc3BhY2VcIiwgY2xhc3NOYW1lXSwgW2J1aWxkQ29tbW9uLm1hdGhzeW0oZ3JvdXAudGV4dCwgZ3JvdXAubW9kZSwgb3B0aW9ucyldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNzc1NwYWNlLmhhc093blByb3BlcnR5KGdyb3VwLnRleHQpKSB7XG4gICAgICAvLyBTcGFjZXMgYmFzZWQgb24ganVzdCBhIENTUyBjbGFzcy5cbiAgICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtc3BhY2VcIiwgY3NzU3BhY2VbZ3JvdXAudGV4dF1dLCBbXSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVua25vd24gdHlwZSBvZiBzcGFjZSBcXFwiXCIgKyBncm91cC50ZXh0ICsgXCJcXFwiXCIpO1xuICAgIH1cbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBub2RlO1xuXG4gICAgaWYgKHJlZ3VsYXJTcGFjZS5oYXNPd25Qcm9wZXJ0eShncm91cC50ZXh0KSkge1xuICAgICAgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXRleHRcIiwgW25ldyBtYXRoTUxUcmVlLlRleHROb2RlKFwiXFx4QTBcIildKTtcbiAgICB9IGVsc2UgaWYgKGNzc1NwYWNlLmhhc093blByb3BlcnR5KGdyb3VwLnRleHQpKSB7XG4gICAgICAvLyBDU1MtYmFzZWQgTWF0aE1MIHNwYWNlcyAoXFxub2JyZWFrLCBcXGFsbG93YnJlYWspIGFyZSBpZ25vcmVkXG4gICAgICByZXR1cm4gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtc3BhY2VcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVua25vd24gdHlwZSBvZiBzcGFjZSBcXFwiXCIgKyBncm91cC50ZXh0ICsgXCJcXFwiXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvdGFnLmpzXG5cblxuXG5cbnZhciBwYWQgPSBmdW5jdGlvbiBwYWQoKSB7XG4gIHZhciBwYWROb2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGRcIiwgW10pO1xuICBwYWROb2RlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiNTAlXCIpO1xuICByZXR1cm4gcGFkTm9kZTtcbn07XG5cbmRlZmluZUZ1bmN0aW9uQnVpbGRlcnMoe1xuICB0eXBlOiBcInRhZ1wiLFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHRhYmxlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGFibGVcIiwgW25ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXRyXCIsIFtwYWQoKSwgbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGRcIiwgW2J1aWxkRXhwcmVzc2lvblJvdyhncm91cC5ib2R5LCBvcHRpb25zKV0pLCBwYWQoKSwgbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGRcIiwgW2J1aWxkRXhwcmVzc2lvblJvdyhncm91cC50YWcsIG9wdGlvbnMpXSldKV0pO1xuICAgIHRhYmxlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICByZXR1cm4gdGFibGU7IC8vIFRPRE86IExlZnQtYWxpZ25lZCB0YWdzLlxuICAgIC8vIEN1cnJlbnRseSwgdGhlIGdyb3VwIGFuZCBvcHRpb25zIHBhc3NlZCBoZXJlIGRvIG5vdCBjb250YWluXG4gICAgLy8gZW5vdWdoIGluZm8gdG8gc2V0IHRhZyBhbGlnbm1lbnQuIGBsZXFub2AgaXMgaW4gU2V0dGluZ3MgYnV0IGl0IGlzXG4gICAgLy8gbm90IHBhc3NlZCB0byBPcHRpb25zLiBPbiB0aGUgSFRNTCBzaWRlLCBsZXFubyBpc1xuICAgIC8vIHNldCBieSBhIENTUyBjbGFzcyBhcHBsaWVkIGluIGJ1aWxkVHJlZS5qcy4gVGhhdCB3b3VsZCBoYXZlIHdvcmtlZFxuICAgIC8vIGluIE1hdGhNTCBpZiBicm93c2VycyBzdXBwb3J0ZWQgPG1sYWJlbGVkdHI+LiBTaW5jZSB0aGV5IGRvbid0LCB3ZVxuICAgIC8vIG5lZWQgdG8gcmV3cml0ZSB0aGUgd2F5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvdGV4dC5qc1xuXG5cblxuIC8vIE5vbi1tYXRoeSB0ZXh0LCBwb3NzaWJseSBpbiBhIGZvbnRcblxudmFyIHRleHRGb250RmFtaWxpZXMgPSB7XG4gIFwiXFxcXHRleHRcIjogdW5kZWZpbmVkLFxuICBcIlxcXFx0ZXh0cm1cIjogXCJ0ZXh0cm1cIixcbiAgXCJcXFxcdGV4dHNmXCI6IFwidGV4dHNmXCIsXG4gIFwiXFxcXHRleHR0dFwiOiBcInRleHR0dFwiLFxuICBcIlxcXFx0ZXh0bm9ybWFsXCI6IFwidGV4dHJtXCJcbn07XG52YXIgdGV4dEZvbnRXZWlnaHRzID0ge1xuICBcIlxcXFx0ZXh0YmZcIjogXCJ0ZXh0YmZcIixcbiAgXCJcXFxcdGV4dG1kXCI6IFwidGV4dG1kXCJcbn07XG52YXIgdGV4dEZvbnRTaGFwZXMgPSB7XG4gIFwiXFxcXHRleHRpdFwiOiBcInRleHRpdFwiLFxuICBcIlxcXFx0ZXh0dXBcIjogXCJ0ZXh0dXBcIlxufTtcblxudmFyIG9wdGlvbnNXaXRoRm9udCA9IGZ1bmN0aW9uIG9wdGlvbnNXaXRoRm9udChncm91cCwgb3B0aW9ucykge1xuICB2YXIgZm9udCA9IGdyb3VwLmZvbnQ7IC8vIENoZWNrcyBpZiB0aGUgYXJndW1lbnQgaXMgYSBmb250IGZhbWlseSBvciBhIGZvbnQgc3R5bGUuXG5cbiAgaWYgKCFmb250KSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAodGV4dEZvbnRGYW1pbGllc1tmb250XSkge1xuICAgIHJldHVybiBvcHRpb25zLndpdGhUZXh0Rm9udEZhbWlseSh0ZXh0Rm9udEZhbWlsaWVzW2ZvbnRdKTtcbiAgfSBlbHNlIGlmICh0ZXh0Rm9udFdlaWdodHNbZm9udF0pIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aXRoVGV4dEZvbnRXZWlnaHQodGV4dEZvbnRXZWlnaHRzW2ZvbnRdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb3B0aW9ucy53aXRoVGV4dEZvbnRTaGFwZSh0ZXh0Rm9udFNoYXBlc1tmb250XSk7XG4gIH1cbn07XG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJ0ZXh0XCIsXG4gIG5hbWVzOiBbLy8gRm9udCBmYW1pbGllc1xuICBcIlxcXFx0ZXh0XCIsIFwiXFxcXHRleHRybVwiLCBcIlxcXFx0ZXh0c2ZcIiwgXCJcXFxcdGV4dHR0XCIsIFwiXFxcXHRleHRub3JtYWxcIiwgLy8gRm9udCB3ZWlnaHRzXG4gIFwiXFxcXHRleHRiZlwiLCBcIlxcXFx0ZXh0bWRcIiwgLy8gRm9udCBTaGFwZXNcbiAgXCJcXFxcdGV4dGl0XCIsIFwiXFxcXHRleHR1cFwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIGFyZ1R5cGVzOiBbXCJ0ZXh0XCJdLFxuICAgIGFsbG93ZWRJbkFyZ3VtZW50OiB0cnVlLFxuICAgIGFsbG93ZWRJblRleHQ6IHRydWVcbiAgfSxcbiAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihfcmVmLCBhcmdzKSB7XG4gICAgdmFyIHBhcnNlciA9IF9yZWYucGFyc2VyLFxuICAgICAgICBmdW5jTmFtZSA9IF9yZWYuZnVuY05hbWU7XG4gICAgdmFyIGJvZHkgPSBhcmdzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYm9keTogb3JkYXJndW1lbnQoYm9keSksXG4gICAgICBmb250OiBmdW5jTmFtZVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBuZXdPcHRpb25zID0gb3B0aW9uc1dpdGhGb250KGdyb3VwLCBvcHRpb25zKTtcbiAgICB2YXIgaW5uZXIgPSBidWlsZEV4cHJlc3Npb24oZ3JvdXAuYm9keSwgbmV3T3B0aW9ucywgdHJ1ZSk7XG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIiwgXCJ0ZXh0XCJdLCBpbm5lciwgbmV3T3B0aW9ucyk7XG4gIH0sXG4gIG1hdGhtbEJ1aWxkZXI6IGZ1bmN0aW9uIG1hdGhtbEJ1aWxkZXIoZ3JvdXAsIG9wdGlvbnMpIHtcbiAgICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnNXaXRoRm9udChncm91cCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGJ1aWxkRXhwcmVzc2lvblJvdyhncm91cC5ib2R5LCBuZXdPcHRpb25zKTtcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zL3VuZGVybGluZS5qc1xuXG5cblxuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJ1bmRlcmxpbmVcIixcbiAgbmFtZXM6IFtcIlxcXFx1bmRlcmxpbmVcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMSxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoX3JlZiwgYXJncykge1xuICAgIHZhciBwYXJzZXIgPSBfcmVmLnBhcnNlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1bmRlcmxpbmVcIixcbiAgICAgIG1vZGU6IHBhcnNlci5tb2RlLFxuICAgICAgYm9keTogYXJnc1swXVxuICAgIH07XG4gIH0sXG4gIGh0bWxCdWlsZGVyOiBmdW5jdGlvbiBodG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIC8vIFVuZGVybGluZXMgYXJlIGhhbmRsZWQgaW4gdGhlIFRlWGJvb2sgcGcgNDQzLCBSdWxlIDEwLlxuICAgIC8vIEJ1aWxkIHRoZSBpbm5lciBncm91cC5cbiAgICB2YXIgaW5uZXJHcm91cCA9IGJ1aWxkR3JvdXAoZ3JvdXAuYm9keSwgb3B0aW9ucyk7IC8vIENyZWF0ZSB0aGUgbGluZSB0byBnbyBiZWxvdyB0aGUgYm9keVxuXG4gICAgdmFyIGxpbmUgPSBidWlsZENvbW1vbi5tYWtlTGluZVNwYW4oXCJ1bmRlcmxpbmUtbGluZVwiLCBvcHRpb25zKTsgLy8gR2VuZXJhdGUgdGhlIHZsaXN0LCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBrZXJuc1xuXG4gICAgdmFyIGRlZmF1bHRSdWxlVGhpY2tuZXNzID0gb3B0aW9ucy5mb250TWV0cmljcygpLmRlZmF1bHRSdWxlVGhpY2tuZXNzO1xuICAgIHZhciB2bGlzdCA9IGJ1aWxkQ29tbW9uLm1ha2VWTGlzdCh7XG4gICAgICBwb3NpdGlvblR5cGU6IFwidG9wXCIsXG4gICAgICBwb3NpdGlvbkRhdGE6IGlubmVyR3JvdXAuaGVpZ2h0LFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwia2VyblwiLFxuICAgICAgICBzaXplOiBkZWZhdWx0UnVsZVRoaWNrbmVzc1xuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImVsZW1cIixcbiAgICAgICAgZWxlbTogbGluZVxuICAgICAgfSwge1xuICAgICAgICB0eXBlOiBcImtlcm5cIixcbiAgICAgICAgc2l6ZTogMyAqIGRlZmF1bHRSdWxlVGhpY2tuZXNzXG4gICAgICB9LCB7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBpbm5lckdyb3VwXG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlU3BhbihbXCJtb3JkXCIsIFwidW5kZXJsaW5lXCJdLCBbdmxpc3RdLCBvcHRpb25zKTtcbiAgfSxcbiAgbWF0aG1sQnVpbGRlcjogZnVuY3Rpb24gbWF0aG1sQnVpbGRlcihncm91cCwgb3B0aW9ucykge1xuICAgIHZhciBvcGVyYXRvciA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibW9cIiwgW25ldyBtYXRoTUxUcmVlLlRleHROb2RlKFwiXFx1MjAzRVwiKV0pO1xuICAgIG9wZXJhdG9yLnNldEF0dHJpYnV0ZShcInN0cmV0Y2h5XCIsIFwidHJ1ZVwiKTtcbiAgICB2YXIgbm9kZSA9IG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXVuZGVyXCIsIFtidWlsZE1hdGhNTF9idWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMpLCBvcGVyYXRvcl0pO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiYWNjZW50dW5kZXJcIiwgXCJ0cnVlXCIpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvdmNlbnRlci5qc1xuXG5cblxuXG4gLy8gXFx2Y2VudGVyOiAgVmVydGljYWxseSBjZW50ZXIgdGhlIGFyZ3VtZW50IGdyb3VwIG9uIHRoZSBtYXRoIGF4aXMuXG5cbmRlZmluZUZ1bmN0aW9uKHtcbiAgdHlwZTogXCJ2Y2VudGVyXCIsXG4gIG5hbWVzOiBbXCJcXFxcdmNlbnRlclwiXSxcbiAgcHJvcHM6IHtcbiAgICBudW1BcmdzOiAxLFxuICAgIGFyZ1R5cGVzOiBbXCJvcmlnaW5hbFwiXSxcbiAgICAvLyBJbiBMYVRlWCwgXFx2Y2VudGVyIGNhbiBhY3Qgb25seSBvbiBhIGJveC5cbiAgICBhbGxvd2VkSW5UZXh0OiBmYWxzZVxuICB9LFxuICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKF9yZWYsIGFyZ3MpIHtcbiAgICB2YXIgcGFyc2VyID0gX3JlZi5wYXJzZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwidmNlbnRlclwiLFxuICAgICAgbW9kZTogcGFyc2VyLm1vZGUsXG4gICAgICBib2R5OiBhcmdzWzBdXG4gICAgfTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIGJvZHkgPSBidWlsZEdyb3VwKGdyb3VwLmJvZHksIG9wdGlvbnMpO1xuICAgIHZhciBheGlzSGVpZ2h0ID0gb3B0aW9ucy5mb250TWV0cmljcygpLmF4aXNIZWlnaHQ7XG4gICAgdmFyIGR5ID0gMC41ICogKGJvZHkuaGVpZ2h0IC0gYXhpc0hlaWdodCAtIChib2R5LmRlcHRoICsgYXhpc0hlaWdodCkpO1xuICAgIHJldHVybiBidWlsZENvbW1vbi5tYWtlVkxpc3Qoe1xuICAgICAgcG9zaXRpb25UeXBlOiBcInNoaWZ0XCIsXG4gICAgICBwb3NpdGlvbkRhdGE6IGR5LFxuICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgIHR5cGU6IFwiZWxlbVwiLFxuICAgICAgICBlbGVtOiBib2R5XG4gICAgICB9XVxuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGRvIHRoaXMgaW4gTWF0aE1MLlxuICAgIC8vIFdyaXRlIGEgY2xhc3MgYXMgYSBicmVhZGNydW1iIGluIGNhc2Ugc29tZSBwb3N0LXByb2Nlc3NvciB3YW50c1xuICAgIC8vIHRvIHBlcmZvcm0gYSB2Y2VudGVyIGFkanVzdG1lbnQuXG4gICAgcmV0dXJuIG5ldyBtYXRoTUxUcmVlLk1hdGhOb2RlKFwibXBhZGRlZFwiLCBbYnVpbGRNYXRoTUxfYnVpbGRHcm91cChncm91cC5ib2R5LCBvcHRpb25zKV0sIFtcInZjZW50ZXJcIl0pO1xuICB9XG59KTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mdW5jdGlvbnMvdmVyYi5qc1xuXG5cblxuXG5kZWZpbmVGdW5jdGlvbih7XG4gIHR5cGU6IFwidmVyYlwiLFxuICBuYW1lczogW1wiXFxcXHZlcmJcIl0sXG4gIHByb3BzOiB7XG4gICAgbnVtQXJnczogMCxcbiAgICBhbGxvd2VkSW5UZXh0OiB0cnVlXG4gIH0sXG4gIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoY29udGV4dCwgYXJncywgb3B0QXJncykge1xuICAgIC8vIFxcdmVyYiBhbmQgXFx2ZXJiKiBhcmUgZGVhbHQgd2l0aCBkaXJlY3RseSBpbiBQYXJzZXIuanMuXG4gICAgLy8gSWYgd2UgZW5kIHVwIGhlcmUsIGl0J3MgYmVjYXVzZSBvZiBhIGZhaWx1cmUgdG8gbWF0Y2ggdGhlIHR3byBkZWxpbWl0ZXJzXG4gICAgLy8gaW4gdGhlIHJlZ2V4IGluIExleGVyLmpzLiAgTGFUZVggcmFpc2VzIHRoZSBmb2xsb3dpbmcgZXJyb3Igd2hlbiBcXHZlcmIgaXNcbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBsaW5lIChvciBmaWxlKS5cbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJcXFxcdmVyYiBlbmRlZCBieSBlbmQgb2YgbGluZSBpbnN0ZWFkIG9mIG1hdGNoaW5nIGRlbGltaXRlclwiKTtcbiAgfSxcbiAgaHRtbEJ1aWxkZXI6IGZ1bmN0aW9uIGh0bWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHRleHQgPSBtYWtlVmVyYihncm91cCk7XG4gICAgdmFyIGJvZHkgPSBbXTsgLy8gXFx2ZXJiIGVudGVycyB0ZXh0IG1vZGUgYW5kIHRoZXJlZm9yZSBpcyBzaXplZCBsaWtlIFxcdGV4dHN0eWxlXG5cbiAgICB2YXIgbmV3T3B0aW9ucyA9IG9wdGlvbnMuaGF2aW5nU3R5bGUob3B0aW9ucy5zdHlsZS50ZXh0KCkpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHRleHRbaV07XG5cbiAgICAgIGlmIChjID09PSAnficpIHtcbiAgICAgICAgYyA9ICdcXFxcdGV4dGFzY2lpdGlsZGUnO1xuICAgICAgfVxuXG4gICAgICBib2R5LnB1c2goYnVpbGRDb21tb24ubWFrZVN5bWJvbChjLCBcIlR5cGV3cml0ZXItUmVndWxhclwiLCBncm91cC5tb2RlLCBuZXdPcHRpb25zLCBbXCJtb3JkXCIsIFwidGV4dHR0XCJdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcIm1vcmRcIiwgXCJ0ZXh0XCJdLmNvbmNhdChuZXdPcHRpb25zLnNpemluZ0NsYXNzZXMob3B0aW9ucykpLCBidWlsZENvbW1vbi50cnlDb21iaW5lQ2hhcnMoYm9keSksIG5ld09wdGlvbnMpO1xuICB9LFxuICBtYXRobWxCdWlsZGVyOiBmdW5jdGlvbiBtYXRobWxCdWlsZGVyKGdyb3VwLCBvcHRpb25zKSB7XG4gICAgdmFyIHRleHQgPSBuZXcgbWF0aE1MVHJlZS5UZXh0Tm9kZShtYWtlVmVyYihncm91cCkpO1xuICAgIHZhciBub2RlID0gbmV3IG1hdGhNTFRyZWUuTWF0aE5vZGUoXCJtdGV4dFwiLCBbdGV4dF0pO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibWF0aHZhcmlhbnRcIiwgXCJtb25vc3BhY2VcIik7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn0pO1xuLyoqXG4gKiBDb252ZXJ0cyB2ZXJiIGdyb3VwIGludG8gYm9keSBzdHJpbmcuXG4gKlxuICogXFx2ZXJiKiByZXBsYWNlcyBlYWNoIHNwYWNlIHdpdGggYW4gb3BlbiBib3ggXFx1MjQyM1xuICogXFx2ZXJiIHJlcGxhY2VzIGVhY2ggc3BhY2Ugd2l0aCBhIG5vLWJyZWFrIHNwYWNlIFxceEEwXG4gKi9cblxudmFyIG1ha2VWZXJiID0gZnVuY3Rpb24gbWFrZVZlcmIoZ3JvdXApIHtcbiAgcmV0dXJuIGdyb3VwLmJvZHkucmVwbGFjZSgvIC9nLCBncm91cC5zdGFyID8gXCJcXHUyNDIzXCIgOiAnXFx4QTAnKTtcbn07XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZnVuY3Rpb25zLmpzXG4vKiogSW5jbHVkZSB0aGlzIHRvIGVuc3VyZSB0aGF0IGFsbCBmdW5jdGlvbnMgYXJlIGRlZmluZWQuICovXG5cbnZhciBmdW5jdGlvbnMgPSBfZnVuY3Rpb25zO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc3JjX2Z1bmN0aW9ucyA9IChmdW5jdGlvbnMpOyAvLyBUT0RPKGtldmluYik6IGhhdmUgZnVuY3Rpb25zIHJldHVybiBhbiBvYmplY3QgYW5kIGNhbGwgZGVmaW5lRnVuY3Rpb24gd2l0aFxuLy8gdGhhdCBvYmplY3QgaW4gdGhpcyBmaWxlIGluc3RlYWQgb2YgcmVseWluZyBvbiBzaWRlLWVmZmVjdHMuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL0xleGVyLmpzXG4vKipcbiAqIFRoZSBMZXhlciBjbGFzcyBoYW5kbGVzIHRva2VuaXppbmcgdGhlIGlucHV0IGluIHZhcmlvdXMgd2F5cy4gU2luY2Ugb3VyXG4gKiBwYXJzZXIgZXhwZWN0cyB1cyB0byBiZSBhYmxlIHRvIGJhY2t0cmFjaywgdGhlIGxleGVyIGFsbG93cyBsZXhpbmcgZnJvbSBhbnlcbiAqIGdpdmVuIHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIEl0cyBtYWluIGV4cG9zZWQgZnVuY3Rpb24gaXMgdGhlIGBsZXhgIGZ1bmN0aW9uLCB3aGljaCB0YWtlcyBhIHBvc2l0aW9uIHRvXG4gKiBsZXggZnJvbSBhbmQgYSB0eXBlIG9mIHRva2VuIHRvIGxleC4gSXQgZGVmZXJzIHRvIHRoZSBhcHByb3ByaWF0ZSBgX2lubmVyTGV4YFxuICogZnVuY3Rpb24uXG4gKlxuICogVGhlIHZhcmlvdXMgYF9pbm5lckxleGAgZnVuY3Rpb25zIHBlcmZvcm0gdGhlIGFjdHVhbCBsZXhpbmcgb2YgZGlmZmVyZW50XG4gKiBraW5kcy5cbiAqL1xuXG5cblxuXG4vKiBUaGUgZm9sbG93aW5nIHRva2VuUmVnZXhcbiAqIC0gbWF0Y2hlcyB0eXBpY2FsIHdoaXRlc3BhY2UgKGJ1dCBub3QgTkJTUCBldGMuKSB1c2luZyBpdHMgZmlyc3QgZ3JvdXBcbiAqIC0gZG9lcyBub3QgbWF0Y2ggYW55IGNvbnRyb2wgY2hhcmFjdGVyIFxceDAwLVxceDFmIGV4Y2VwdCB3aGl0ZXNwYWNlXG4gKiAtIGRvZXMgbm90IG1hdGNoIGEgYmFyZSBiYWNrc2xhc2hcbiAqIC0gbWF0Y2hlcyBhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCB0aG9zZSBqdXN0IG1lbnRpb25lZFxuICogLSBkb2VzIG5vdCBtYXRjaCB0aGUgQk1QIHByaXZhdGUgdXNlIGFyZWEgXFx1RTAwMC1cXHVGOEZGXG4gKiAtIGRvZXMgbm90IG1hdGNoIGJhcmUgc3Vycm9nYXRlIGNvZGUgdW5pdHNcbiAqIC0gbWF0Y2hlcyBhbnkgQk1QIGNoYXJhY3RlciBleGNlcHQgZm9yIHRob3NlIGp1c3QgZGVzY3JpYmVkXG4gKiAtIG1hdGNoZXMgYW55IHZhbGlkIFVuaWNvZGUgc3Vycm9nYXRlIHBhaXJcbiAqIC0gbWF0Y2hlcyBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcbiAqIC0gbWF0Y2hlcyBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBsZXR0ZXJzIHRoZW4gd2hpdGVzcGFjZVxuICogLSBtYXRjaGVzIGEgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGFueSBCTVAgY2hhcmFjdGVyXG4gKiBDYXB0dXJpbmcgZ3JvdXBzOlxuICogICBbMV0gcmVndWxhciB3aGl0ZXNwYWNlXG4gKiAgIFsyXSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgd2hpdGVzcGFjZVxuICogICBbM10gYW55dGhpbmcgZWxzZSwgd2hpY2ggbWF5IGluY2x1ZGU6XG4gKiAgICAgWzRdIGxlZnQgY2hhcmFjdGVyIG9mIFxcdmVyYipcbiAqICAgICBbNV0gbGVmdCBjaGFyYWN0ZXIgb2YgXFx2ZXJiXG4gKiAgICAgWzZdIGJhY2tzbGFzaCBmb2xsb3dlZCBieSB3b3JkLCBleGNsdWRpbmcgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAqIEp1c3QgYmVjYXVzZSB0aGUgTGV4ZXIgbWF0Y2hlcyBzb21ldGhpbmcgZG9lc24ndCBtZWFuIGl0J3MgdmFsaWQgaW5wdXQ6XG4gKiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBmdW5jdGlvbiBvciBzeW1ib2wgZGVmaW5pdGlvbiwgdGhlIFBhcnNlciB3aWxsXG4gKiBzdGlsbCByZWplY3QgdGhlIGlucHV0LlxuICovXG52YXIgc3BhY2VSZWdleFN0cmluZyA9IFwiWyBcXHJcXG5cXHRdXCI7XG52YXIgY29udHJvbFdvcmRSZWdleFN0cmluZyA9IFwiXFxcXFxcXFxbYS16QS1aQF0rXCI7XG52YXIgY29udHJvbFN5bWJvbFJlZ2V4U3RyaW5nID0gXCJcXFxcXFxcXFteXFx1RDgwMC1cXHVERkZGXVwiO1xudmFyIGNvbnRyb2xXb3JkV2hpdGVzcGFjZVJlZ2V4U3RyaW5nID0gXCIoXCIgKyBjb250cm9sV29yZFJlZ2V4U3RyaW5nICsgXCIpXCIgKyBzcGFjZVJlZ2V4U3RyaW5nICsgXCIqXCI7XG52YXIgY29udHJvbFNwYWNlUmVnZXhTdHJpbmcgPSBcIlxcXFxcXFxcKFxcbnxbIFxcclxcdF0rXFxuPylbIFxcclxcdF0qXCI7XG52YXIgY29tYmluaW5nRGlhY3JpdGljYWxNYXJrU3RyaW5nID0gXCJbXFx1MDMwMC1cXHUwMzZGXVwiO1xudmFyIGNvbWJpbmluZ0RpYWNyaXRpY2FsTWFya3NFbmRSZWdleCA9IG5ldyBSZWdFeHAoY29tYmluaW5nRGlhY3JpdGljYWxNYXJrU3RyaW5nICsgXCIrJFwiKTtcbnZhciB0b2tlblJlZ2V4U3RyaW5nID0gXCIoXCIgKyBzcGFjZVJlZ2V4U3RyaW5nICsgXCIrKXxcIiArICggLy8gd2hpdGVzcGFjZVxuY29udHJvbFNwYWNlUmVnZXhTdHJpbmcgKyBcInxcIikgKyAvLyBcXHdoaXRlc3BhY2VcblwiKFshLVxcXFxbXFxcXF0tXFx1MjAyN1xcdTIwMkEtXFx1RDdGRlxcdUY5MDAtXFx1RkZGRl1cIiArICggLy8gc2luZ2xlIGNvZGVwb2ludFxuY29tYmluaW5nRGlhY3JpdGljYWxNYXJrU3RyaW5nICsgXCIqXCIpICsgLy8gLi4ucGx1cyBhY2NlbnRzXG5cInxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdXCIgKyAoIC8vIHN1cnJvZ2F0ZSBwYWlyXG5jb21iaW5pbmdEaWFjcml0aWNhbE1hcmtTdHJpbmcgKyBcIipcIikgKyAvLyAuLi5wbHVzIGFjY2VudHNcblwifFxcXFxcXFxcdmVyYlxcXFwqKFteXSkuKj9cXFxcNFwiICsgLy8gXFx2ZXJiKlxuXCJ8XFxcXFxcXFx2ZXJiKFteKmEtekEtWl0pLio/XFxcXDVcIiArICggLy8gXFx2ZXJiIHVuc3RhcnJlZFxuXCJ8XCIgKyBjb250cm9sV29yZFdoaXRlc3BhY2VSZWdleFN0cmluZykgKyAoIC8vIFxcbWFjcm9OYW1lICsgc3BhY2VzXG5cInxcIiArIGNvbnRyb2xTeW1ib2xSZWdleFN0cmluZyArIFwiKVwiKTsgLy8gXFxcXCwgXFwnLCBldGMuXG5cbi8qKiBNYWluIExleGVyIGNsYXNzICovXG5cbnZhciBMZXhlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIENhdGVnb3J5IGNvZGVzLiBUaGUgbGV4ZXIgb25seSBzdXBwb3J0cyBjb21tZW50IGNoYXJhY3RlcnMgKDE0KSBmb3Igbm93LlxuICAvLyBNYWNyb0V4cGFuZGVyIGFkZGl0aW9uYWxseSBkaXN0aW5ndWlzaGVzIGFjdGl2ZSAoMTMpLlxuICBmdW5jdGlvbiBMZXhlcihpbnB1dCwgc2V0dGluZ3MpIHtcbiAgICB0aGlzLmlucHV0ID0gdm9pZCAwO1xuICAgIHRoaXMuc2V0dGluZ3MgPSB2b2lkIDA7XG4gICAgdGhpcy50b2tlblJlZ2V4ID0gdm9pZCAwO1xuICAgIHRoaXMuY2F0Y29kZXMgPSB2b2lkIDA7XG4gICAgLy8gU2VwYXJhdGUgYWNjZW50cyBmcm9tIGNoYXJhY3RlcnNcbiAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMudG9rZW5SZWdleCA9IG5ldyBSZWdFeHAodG9rZW5SZWdleFN0cmluZywgJ2cnKTtcbiAgICB0aGlzLmNhdGNvZGVzID0ge1xuICAgICAgXCIlXCI6IDE0LFxuICAgICAgLy8gY29tbWVudCBjaGFyYWN0ZXJcbiAgICAgIFwiflwiOiAxMyAvLyBhY3RpdmUgY2hhcmFjdGVyXG5cbiAgICB9O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IExleGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uc2V0Q2F0Y29kZSA9IGZ1bmN0aW9uIHNldENhdGNvZGUoY2hhciwgY29kZSkge1xuICAgIHRoaXMuY2F0Y29kZXNbY2hhcl0gPSBjb2RlO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGxleGVzIGEgc2luZ2xlIHRva2VuLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5sZXggPSBmdW5jdGlvbiBsZXgoKSB7XG4gICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcbiAgICB2YXIgcG9zID0gdGhpcy50b2tlblJlZ2V4Lmxhc3RJbmRleDtcblxuICAgIGlmIChwb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBUb2tlbihcIkVPRlwiLCBuZXcgU291cmNlTG9jYXRpb24odGhpcywgcG9zLCBwb3MpKTtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2ggPSB0aGlzLnRva2VuUmVnZXguZXhlYyhpbnB1dCk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwgfHwgbWF0Y2guaW5kZXggIT09IHBvcykge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICdcIiArIGlucHV0W3Bvc10gKyBcIidcIiwgbmV3IFRva2VuKGlucHV0W3Bvc10sIG5ldyBTb3VyY2VMb2NhdGlvbih0aGlzLCBwb3MsIHBvcyArIDEpKSk7XG4gICAgfVxuXG4gICAgdmFyIHRleHQgPSBtYXRjaFs2XSB8fCBtYXRjaFszXSB8fCAobWF0Y2hbMl0gPyBcIlxcXFwgXCIgOiBcIiBcIik7XG5cbiAgICBpZiAodGhpcy5jYXRjb2Rlc1t0ZXh0XSA9PT0gMTQpIHtcbiAgICAgIC8vIGNvbW1lbnQgY2hhcmFjdGVyXG4gICAgICB2YXIgbmxJbmRleCA9IGlucHV0LmluZGV4T2YoJ1xcbicsIHRoaXMudG9rZW5SZWdleC5sYXN0SW5kZXgpO1xuXG4gICAgICBpZiAobmxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy50b2tlblJlZ2V4Lmxhc3RJbmRleCA9IGlucHV0Lmxlbmd0aDsgLy8gRU9GXG5cbiAgICAgICAgdGhpcy5zZXR0aW5ncy5yZXBvcnROb25zdHJpY3QoXCJjb21tZW50QXRFbmRcIiwgXCIlIGNvbW1lbnQgaGFzIG5vIHRlcm1pbmF0aW5nIG5ld2xpbmU7IExhVGVYIHdvdWxkIFwiICsgXCJmYWlsIGJlY2F1c2Ugb2YgY29tbWVudGluZyB0aGUgZW5kIG9mIG1hdGggbW9kZSAoZS5nLiAkKVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9rZW5SZWdleC5sYXN0SW5kZXggPSBubEluZGV4ICsgMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMubGV4KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUb2tlbih0ZXh0LCBuZXcgU291cmNlTG9jYXRpb24odGhpcywgcG9zLCB0aGlzLnRva2VuUmVnZXgubGFzdEluZGV4KSk7XG4gIH07XG5cbiAgcmV0dXJuIExleGVyO1xufSgpO1xuXG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9OYW1lc3BhY2UuanNcbi8qKlxuICogQSBgTmFtZXNwYWNlYCByZWZlcnMgdG8gYSBzcGFjZSBvZiBuYW1lYWJsZSB0aGluZ3MgbGlrZSBtYWNyb3Mgb3IgbGVuZ3RocyxcbiAqIHdoaWNoIGNhbiBiZSBgc2V0YCBlaXRoZXIgZ2xvYmFsbHkgb3IgbG9jYWwgdG8gYSBuZXN0ZWQgZ3JvdXAsIHVzaW5nIGFuXG4gKiB1bmRvIHN0YWNrIHNpbWlsYXIgdG8gaG93IFRlWCBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25hbGl0eS5cbiAqIFBlcmZvcm1hbmNlLXdpc2UsIGBnZXRgIGFuZCBsb2NhbCBgc2V0YCB0YWtlIGNvbnN0YW50IHRpbWUsIHdoaWxlIGdsb2JhbFxuICogYHNldGAgdGFrZXMgdGltZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGRlcHRoIG9mIGdyb3VwIG5lc3RpbmcuXG4gKi9cblxuXG52YXIgTmFtZXNwYWNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEJvdGggYXJndW1lbnRzIGFyZSBvcHRpb25hbC4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBvYmplY3Qgb2ZcbiAgICogYnVpbHQtaW4gbWFwcGluZ3Mgd2hpY2ggbmV2ZXIgY2hhbmdlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAgICogb2YgaW5pdGlhbCAoZ2xvYmFsLWxldmVsKSBtYXBwaW5ncywgd2hpY2ggd2lsbCBjb25zdGFudGx5IGNoYW5nZVxuICAgKiBhY2NvcmRpbmcgdG8gYW55IGdsb2JhbC90b3AtbGV2ZWwgYHNldGBzIGRvbmUuXG4gICAqL1xuICBmdW5jdGlvbiBOYW1lc3BhY2UoYnVpbHRpbnMsIGdsb2JhbE1hY3Jvcykge1xuICAgIGlmIChidWlsdGlucyA9PT0gdm9pZCAwKSB7XG4gICAgICBidWlsdGlucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChnbG9iYWxNYWNyb3MgPT09IHZvaWQgMCkge1xuICAgICAgZ2xvYmFsTWFjcm9zID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50ID0gdm9pZCAwO1xuICAgIHRoaXMuYnVpbHRpbnMgPSB2b2lkIDA7XG4gICAgdGhpcy51bmRlZlN0YWNrID0gdm9pZCAwO1xuICAgIHRoaXMuY3VycmVudCA9IGdsb2JhbE1hY3JvcztcbiAgICB0aGlzLmJ1aWx0aW5zID0gYnVpbHRpbnM7XG4gICAgdGhpcy51bmRlZlN0YWNrID0gW107XG4gIH1cbiAgLyoqXG4gICAqIFN0YXJ0IGEgbmV3IG5lc3RlZCBncm91cCwgYWZmZWN0aW5nIGZ1dHVyZSBsb2NhbCBgc2V0YHMuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IE5hbWVzcGFjZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmJlZ2luR3JvdXAgPSBmdW5jdGlvbiBiZWdpbkdyb3VwKCkge1xuICAgIHRoaXMudW5kZWZTdGFjay5wdXNoKHt9KTtcbiAgfVxuICAvKipcbiAgICogRW5kIGN1cnJlbnQgbmVzdGVkIGdyb3VwLCByZXN0b3JpbmcgdmFsdWVzIGJlZm9yZSB0aGUgZ3JvdXAgYmVnYW4uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmVuZEdyb3VwID0gZnVuY3Rpb24gZW5kR3JvdXAoKSB7XG4gICAgaWYgKHRoaXMudW5kZWZTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVuYmFsYW5jZWQgbmFtZXNwYWNlIGRlc3RydWN0aW9uOiBhdHRlbXB0IFwiICsgXCJ0byBwb3AgZ2xvYmFsIG5hbWVzcGFjZTsgcGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnXCIpO1xuICAgIH1cblxuICAgIHZhciB1bmRlZnMgPSB0aGlzLnVuZGVmU3RhY2sucG9wKCk7XG5cbiAgICBmb3IgKHZhciB1bmRlZiBpbiB1bmRlZnMpIHtcbiAgICAgIGlmICh1bmRlZnMuaGFzT3duUHJvcGVydHkodW5kZWYpKSB7XG4gICAgICAgIGlmICh1bmRlZnNbdW5kZWZdID09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50W3VuZGVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRbdW5kZWZdID0gdW5kZWZzW3VuZGVmXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRW5kcyBhbGwgY3VycmVudGx5IG5lc3RlZCBncm91cHMgKGlmIGFueSksIHJlc3RvcmluZyB2YWx1ZXMgYmVmb3JlIHRoZVxuICAgKiBncm91cHMgYmVnYW4uICBVc2VmdWwgaW4gY2FzZSBvZiBhbiBlcnJvciBpbiB0aGUgbWlkZGxlIG9mIHBhcnNpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmVuZEdyb3VwcyA9IGZ1bmN0aW9uIGVuZEdyb3VwcygpIHtcbiAgICB3aGlsZSAodGhpcy51bmRlZlN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW5kR3JvdXAoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIERldGVjdCB3aGV0aGVyIGBuYW1lYCBoYXMgYSBkZWZpbml0aW9uLiAgRXF1aXZhbGVudCB0b1xuICAgKiBgZ2V0KG5hbWUpICE9IG51bGxgLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYXMgPSBmdW5jdGlvbiBoYXMobmFtZSkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnQuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgdGhpcy5idWlsdGlucy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlcmUgaXMgbm8gdmFsdWUuXG4gICAqXG4gICAqIE5vdGU6IERvIG5vdCB1c2UgYGlmIChuYW1lc3BhY2UuZ2V0KC4uLikpYCB0byBkZXRlY3Qgd2hldGhlciBhIG1hY3JvXG4gICAqIGlzIGRlZmluZWQsIGFzIHRoZSBkZWZpbml0aW9uIG1heSBiZSB0aGUgZW1wdHkgc3RyaW5nIHdoaWNoIGV2YWx1YXRlc1xuICAgKiB0byBgZmFsc2VgIGluIEphdmFTY3JpcHQuICBVc2UgYGlmIChuYW1lc3BhY2UuZ2V0KC4uLikgIT0gbnVsbClgIG9yXG4gICAqIGBpZiAobmFtZXNwYWNlLmhhcyguLi4pKWAuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbHRpbnNbbmFtZV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBuYW1lLCBhbmQgb3B0aW9uYWxseSBzZXQgaXQgZ2xvYmFsbHkgdG9vLlxuICAgKiBMb2NhbCBzZXQoKSBzZXRzIHRoZSBjdXJyZW50IHZhbHVlIGFuZCAod2hlbiBhcHByb3ByaWF0ZSkgYWRkcyBhbiB1bmRvXG4gICAqIG9wZXJhdGlvbiB0byB0aGUgdW5kbyBzdGFjay4gIEdsb2JhbCBzZXQoKSBtYXkgY2hhbmdlIHRoZSB1bmRvXG4gICAqIG9wZXJhdGlvbiBhdCBldmVyeSBsZXZlbCwgc28gdGFrZXMgdGltZSBsaW5lYXIgaW4gdGhlaXIgbnVtYmVyLlxuICAgKiBBIHZhbHVlIG9mIHVuZGVmaW5lZCBtZWFucyB0byBkZWxldGUgZXhpc3RpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSwgZ2xvYmFsKSB7XG4gICAgaWYgKGdsb2JhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBnbG9iYWwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAvLyBHbG9iYWwgc2V0IGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyBpbiBhbGwgZ3JvdXBzLiAgU2ltdWxhdGUgdGhpc1xuICAgICAgLy8gYnkgZGVzdHJveWluZyBhbnkgdW5kb3MgY3VycmVudGx5IHNjaGVkdWxlZCBmb3IgdGhpcyBuYW1lLFxuICAgICAgLy8gYW5kIGFkZGluZyBhbiB1bmRvIHdpdGggdGhlICpuZXcqIHZhbHVlIChpbiBjYXNlIGl0IGxhdGVyIGdldHNcbiAgICAgIC8vIGxvY2FsbHkgcmVzZXQgd2l0aGluIHRoaXMgZW52aXJvbm1lbnQpLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnVuZGVmU3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudW5kZWZTdGFja1tpXVtuYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudW5kZWZTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5kZWZTdGFja1t0aGlzLnVuZGVmU3RhY2subGVuZ3RoIC0gMV1bbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kbyB0aGlzIHNldCBhdCBlbmQgb2YgdGhpcyBncm91cCAocG9zc2libHkgdG8gYHVuZGVmaW5lZGApLFxuICAgICAgLy8gdW5sZXNzIGFuIHVuZG8gaXMgYWxyZWFkeSBpbiBwbGFjZSwgaW4gd2hpY2ggY2FzZSB0aGF0IG9sZGVyXG4gICAgICAvLyB2YWx1ZSBpcyB0aGUgY29ycmVjdCBvbmUuXG4gICAgICB2YXIgdG9wID0gdGhpcy51bmRlZlN0YWNrW3RoaXMudW5kZWZTdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKHRvcCAmJiAhdG9wLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHRvcFtuYW1lXSA9IHRoaXMuY3VycmVudFtuYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBOYW1lc3BhY2U7XG59KCk7XG5cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL21hY3Jvcy5qc1xuLyoqXG4gKiBQcmVkZWZpbmVkIG1hY3JvcyBmb3IgS2FUZVguXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBzb21lIGNvbW1hbmRzIGluIHRlcm1zIG9mIG90aGVycy5cbiAqL1xuLy8gRXhwb3J0IGdsb2JhbCBtYWNyb3Mgb2JqZWN0IGZyb20gZGVmaW5lTWFjcm9cblxudmFyIG1hY3JvcyA9IF9tYWNyb3M7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBzcmNfbWFjcm9zID0gKG1hY3Jvcyk7XG5cblxuXG5cblxuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIG1hY3JvIHRvb2xzXG5cbmRlZmluZU1hY3JvKFwiXFxcXG5vZXhwYW5kXCIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIC8vIFRoZSBleHBhbnNpb24gaXMgdGhlIHRva2VuIGl0c2VsZjsgYnV0IHRoYXQgdG9rZW4gaXMgaW50ZXJwcmV0ZWRcbiAgLy8gYXMgaWYgaXRzIG1lYW5pbmcgd2VyZSDigJhcXHJlbGF44oCZIGlmIGl0IGlzIGEgY29udHJvbCBzZXF1ZW5jZSB0aGF0XG4gIC8vIHdvdWxkIG9yZGluYXJpbHkgYmUgZXhwYW5kZWQgYnkgVGVY4oCZcyBleHBhbnNpb24gcnVsZXMuXG4gIHZhciB0ID0gY29udGV4dC5wb3BUb2tlbigpO1xuXG4gIGlmIChjb250ZXh0LmlzRXhwYW5kYWJsZSh0LnRleHQpKSB7XG4gICAgdC5ub2V4cGFuZCA9IHRydWU7XG4gICAgdC50cmVhdEFzUmVsYXggPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b2tlbnM6IFt0XSxcbiAgICBudW1BcmdzOiAwXG4gIH07XG59KTtcbmRlZmluZU1hY3JvKFwiXFxcXGV4cGFuZGFmdGVyXCIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIC8vIFRlWCBmaXJzdCByZWFkcyB0aGUgdG9rZW4gdGhhdCBjb21lcyBpbW1lZGlhdGVseSBhZnRlciBcXGV4cGFuZGFmdGVyLFxuICAvLyB3aXRob3V0IGV4cGFuZGluZyBpdDsgbGV04oCZcyBjYWxsIHRoaXMgdG9rZW4gdC4gVGhlbiBUZVggcmVhZHMgdGhlXG4gIC8vIHRva2VuIHRoYXQgY29tZXMgYWZ0ZXIgdCAoYW5kIHBvc3NpYmx5IG1vcmUgdG9rZW5zLCBpZiB0aGF0IHRva2VuXG4gIC8vIGhhcyBhbiBhcmd1bWVudCksIHJlcGxhY2luZyBpdCBieSBpdHMgZXhwYW5zaW9uLiBGaW5hbGx5IFRlWCBwdXRzXG4gIC8vIHQgYmFjayBpbiBmcm9udCBvZiB0aGF0IGV4cGFuc2lvbi5cbiAgdmFyIHQgPSBjb250ZXh0LnBvcFRva2VuKCk7XG4gIGNvbnRleHQuZXhwYW5kT25jZSh0cnVlKTsgLy8gZXhwYW5kIG9ubHkgYW4gZXhwYW5kYWJsZSB0b2tlblxuXG4gIHJldHVybiB7XG4gICAgdG9rZW5zOiBbdF0sXG4gICAgbnVtQXJnczogMFxuICB9O1xufSk7IC8vIExhVGVYJ3MgXFxAZmlyc3RvZnR3b3sjMX17IzJ9IGV4cGFuZHMgdG8gIzEsIHNraXBwaW5nICMyXG4vLyBUZVggc291cmNlOiBcXGxvbmdcXGRlZlxcQGZpcnN0b2Z0d28jMSMyeyMxfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxAZmlyc3RvZnR3b1wiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgYXJncyA9IGNvbnRleHQuY29uc3VtZUFyZ3MoMik7XG4gIHJldHVybiB7XG4gICAgdG9rZW5zOiBhcmdzWzBdLFxuICAgIG51bUFyZ3M6IDBcbiAgfTtcbn0pOyAvLyBMYVRlWCdzIFxcQHNlY29uZG9mdHdveyMxfXsjMn0gZXhwYW5kcyB0byAjMiwgc2tpcHBpbmcgIzFcbi8vIFRlWCBzb3VyY2U6IFxcbG9uZ1xcZGVmXFxAc2Vjb25kb2Z0d28jMSMyeyMyfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxAc2Vjb25kb2Z0d29cIiwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgdmFyIGFyZ3MgPSBjb250ZXh0LmNvbnN1bWVBcmdzKDIpO1xuICByZXR1cm4ge1xuICAgIHRva2VuczogYXJnc1sxXSxcbiAgICBudW1BcmdzOiAwXG4gIH07XG59KTsgLy8gTGFUZVgncyBcXEBpZm5leHRjaGFyeyMxfXsjMn17IzN9IGxvb2tzIGFoZWFkIHRvIHRoZSBuZXh0ICh1bmV4cGFuZGVkKVxuLy8gc3ltYm9sIHRoYXQgaXNuJ3QgYSBzcGFjZSwgY29uc3VtaW5nIGFueSBzcGFjZXMgYnV0IG5vdCBjb25zdW1pbmcgdGhlXG4vLyBmaXJzdCBub25zcGFjZSBjaGFyYWN0ZXIuICBJZiB0aGF0IG5vbnNwYWNlIGNoYXJhY3RlciBtYXRjaGVzICMxLCB0aGVuXG4vLyB0aGUgbWFjcm8gZXhwYW5kcyB0byAjMjsgb3RoZXJ3aXNlLCBpdCBleHBhbmRzIHRvICMzLlxuXG5kZWZpbmVNYWNybyhcIlxcXFxAaWZuZXh0Y2hhclwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgYXJncyA9IGNvbnRleHQuY29uc3VtZUFyZ3MoMyk7IC8vIHN5bWJvbCwgaWYsIGVsc2VcblxuICBjb250ZXh0LmNvbnN1bWVTcGFjZXMoKTtcbiAgdmFyIG5leHRUb2tlbiA9IGNvbnRleHQuZnV0dXJlKCk7XG5cbiAgaWYgKGFyZ3NbMF0ubGVuZ3RoID09PSAxICYmIGFyZ3NbMF1bMF0udGV4dCA9PT0gbmV4dFRva2VuLnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBhcmdzWzFdLFxuICAgICAgbnVtQXJnczogMFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogYXJnc1syXSxcbiAgICAgIG51bUFyZ3M6IDBcbiAgICB9O1xuICB9XG59KTsgLy8gTGFUZVgncyBcXEBpZnN0YXJ7IzF9eyMyfSBsb29rcyBhaGVhZCB0byB0aGUgbmV4dCAodW5leHBhbmRlZCkgc3ltYm9sLlxuLy8gSWYgaXQgaXMgYCpgLCB0aGVuIGl0IGNvbnN1bWVzIHRoZSBzeW1ib2wsIGFuZCB0aGUgbWFjcm8gZXhwYW5kcyB0byAjMTtcbi8vIG90aGVyd2lzZSwgdGhlIG1hY3JvIGV4cGFuZHMgdG8gIzIgKHdpdGhvdXQgY29uc3VtaW5nIHRoZSBzeW1ib2wpLlxuLy8gVGVYIHNvdXJjZTogXFxkZWZcXEBpZnN0YXIjMXtcXEBpZm5leHRjaGFyICp7XFxAZmlyc3RvZnR3b3sjMX19fVxuXG5kZWZpbmVNYWNybyhcIlxcXFxAaWZzdGFyXCIsIFwiXFxcXEBpZm5leHRjaGFyICp7XFxcXEBmaXJzdG9mdHdveyMxfX1cIik7IC8vIExhVGVYJ3MgXFxUZXh0T3JNYXRoeyMxfXsjMn0gZXhwYW5kcyB0byAjMSBpbiB0ZXh0IG1vZGUsICMyIGluIG1hdGggbW9kZVxuXG5kZWZpbmVNYWNybyhcIlxcXFxUZXh0T3JNYXRoXCIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciBhcmdzID0gY29udGV4dC5jb25zdW1lQXJncygyKTtcblxuICBpZiAoY29udGV4dC5tb2RlID09PSAndGV4dCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBhcmdzWzBdLFxuICAgICAgbnVtQXJnczogMFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogYXJnc1sxXSxcbiAgICAgIG51bUFyZ3M6IDBcbiAgICB9O1xuICB9XG59KTsgLy8gTG9va3VwIHRhYmxlIGZvciBwYXJzaW5nIG51bWJlcnMgaW4gYmFzZSA4IHRocm91Z2ggMTZcblxudmFyIGRpZ2l0VG9OdW1iZXIgPSB7XG4gIFwiMFwiOiAwLFxuICBcIjFcIjogMSxcbiAgXCIyXCI6IDIsXG4gIFwiM1wiOiAzLFxuICBcIjRcIjogNCxcbiAgXCI1XCI6IDUsXG4gIFwiNlwiOiA2LFxuICBcIjdcIjogNyxcbiAgXCI4XCI6IDgsXG4gIFwiOVwiOiA5LFxuICBcImFcIjogMTAsXG4gIFwiQVwiOiAxMCxcbiAgXCJiXCI6IDExLFxuICBcIkJcIjogMTEsXG4gIFwiY1wiOiAxMixcbiAgXCJDXCI6IDEyLFxuICBcImRcIjogMTMsXG4gIFwiRFwiOiAxMyxcbiAgXCJlXCI6IDE0LFxuICBcIkVcIjogMTQsXG4gIFwiZlwiOiAxNSxcbiAgXCJGXCI6IDE1XG59OyAvLyBUZVggXFxjaGFyIG1ha2VzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKGNhdGNvZGUgMTIpIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4vLyAoc2VlIFRoZSBUZVhCb29rLCBwLiA0Mylcbi8vICAgXFxjaGFyMTIzICAtLSBkZWNpbWFsXG4vLyAgIFxcY2hhcicxMjMgLS0gb2N0YWxcbi8vICAgXFxjaGFyXCIxMjMgLS0gaGV4XG4vLyAgIFxcY2hhcmB4ICAgLS0gY2hhcmFjdGVyIHRoYXQgY2FuIGJlIHdyaXR0ZW4gKGkuZS4gaXNuJ3QgYWN0aXZlKVxuLy8gICBcXGNoYXJgXFx4ICAtLSBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgd3JpdHRlbiAoZS5nLiAlKVxuLy8gVGhlc2UgYWxsIHJlZmVyIHRvIGNoYXJhY3RlcnMgZnJvbSB0aGUgZm9udCwgc28gd2UgdHVybiB0aGVtIGludG8gc3BlY2lhbFxuLy8gY2FsbHMgdG8gYSBmdW5jdGlvbiBcXEBjaGFyIGRlYWx0IHdpdGggaW4gdGhlIFBhcnNlci5cblxuZGVmaW5lTWFjcm8oXCJcXFxcY2hhclwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgdG9rZW4gPSBjb250ZXh0LnBvcFRva2VuKCk7XG4gIHZhciBiYXNlO1xuICB2YXIgbnVtYmVyID0gJyc7XG5cbiAgaWYgKHRva2VuLnRleHQgPT09IFwiJ1wiKSB7XG4gICAgYmFzZSA9IDg7XG4gICAgdG9rZW4gPSBjb250ZXh0LnBvcFRva2VuKCk7XG4gIH0gZWxzZSBpZiAodG9rZW4udGV4dCA9PT0gJ1wiJykge1xuICAgIGJhc2UgPSAxNjtcbiAgICB0b2tlbiA9IGNvbnRleHQucG9wVG9rZW4oKTtcbiAgfSBlbHNlIGlmICh0b2tlbi50ZXh0ID09PSBcImBcIikge1xuICAgIHRva2VuID0gY29udGV4dC5wb3BUb2tlbigpO1xuXG4gICAgaWYgKHRva2VuLnRleHRbMF0gPT09IFwiXFxcXFwiKSB7XG4gICAgICBudW1iZXIgPSB0b2tlbi50ZXh0LmNoYXJDb2RlQXQoMSk7XG4gICAgfSBlbHNlIGlmICh0b2tlbi50ZXh0ID09PSBcIkVPRlwiKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJcXFxcY2hhcmAgbWlzc2luZyBhcmd1bWVudFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyID0gdG9rZW4udGV4dC5jaGFyQ29kZUF0KDApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBiYXNlID0gMTA7XG4gIH1cblxuICBpZiAoYmFzZSkge1xuICAgIC8vIFBhcnNlIGEgbnVtYmVyIGluIHRoZSBnaXZlbiBiYXNlLCBzdGFydGluZyB3aXRoIGZpcnN0IGB0b2tlbmAuXG4gICAgbnVtYmVyID0gZGlnaXRUb051bWJlclt0b2tlbi50ZXh0XTtcblxuICAgIGlmIChudW1iZXIgPT0gbnVsbCB8fCBudW1iZXIgPj0gYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBiYXNlLVwiICsgYmFzZSArIFwiIGRpZ2l0IFwiICsgdG9rZW4udGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIGRpZ2l0O1xuXG4gICAgd2hpbGUgKChkaWdpdCA9IGRpZ2l0VG9OdW1iZXJbY29udGV4dC5mdXR1cmUoKS50ZXh0XSkgIT0gbnVsbCAmJiBkaWdpdCA8IGJhc2UpIHtcbiAgICAgIG51bWJlciAqPSBiYXNlO1xuICAgICAgbnVtYmVyICs9IGRpZ2l0O1xuICAgICAgY29udGV4dC5wb3BUb2tlbigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlxcXFxAY2hhcntcIiArIG51bWJlciArIFwifVwiO1xufSk7IC8vIFxcbmV3Y29tbWFuZHtcXG1hY3JvfVthcmdzXXtkZWZpbml0aW9ufVxuLy8gXFxyZW5ld2NvbW1hbmR7XFxtYWNyb31bYXJnc117ZGVmaW5pdGlvbn1cbi8vIFRPRE86IE9wdGlvbmFsIGFyZ3VtZW50czogXFxuZXdjb21tYW5ke1xcbWFjcm99W2FyZ3NdW2RlZmF1bHRde2RlZmluaXRpb259XG5cbnZhciBuZXdjb21tYW5kID0gZnVuY3Rpb24gbmV3Y29tbWFuZChjb250ZXh0LCBleGlzdHNPSywgbm9uZXhpc3RzT0spIHtcbiAgdmFyIGFyZyA9IGNvbnRleHQuY29uc3VtZUFyZygpLnRva2VucztcblxuICBpZiAoYXJnLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFxuZXdjb21tYW5kJ3MgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIG1hY3JvIG5hbWVcIik7XG4gIH1cblxuICB2YXIgbmFtZSA9IGFyZ1swXS50ZXh0O1xuICB2YXIgZXhpc3RzID0gY29udGV4dC5pc0RlZmluZWQobmFtZSk7XG5cbiAgaWYgKGV4aXN0cyAmJiAhZXhpc3RzT0spIHtcbiAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJcXFxcbmV3Y29tbWFuZHtcIiArIG5hbWUgKyBcIn0gYXR0ZW1wdGluZyB0byByZWRlZmluZSBcIiArIChuYW1lICsgXCI7IHVzZSBcXFxccmVuZXdjb21tYW5kXCIpKTtcbiAgfVxuXG4gIGlmICghZXhpc3RzICYmICFub25leGlzdHNPSykge1xuICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFxyZW5ld2NvbW1hbmR7XCIgKyBuYW1lICsgXCJ9IHdoZW4gY29tbWFuZCBcIiArIG5hbWUgKyBcIiBcIiArIFwiZG9lcyBub3QgeWV0IGV4aXN0OyB1c2UgXFxcXG5ld2NvbW1hbmRcIik7XG4gIH1cblxuICB2YXIgbnVtQXJncyA9IDA7XG4gIGFyZyA9IGNvbnRleHQuY29uc3VtZUFyZygpLnRva2VucztcblxuICBpZiAoYXJnLmxlbmd0aCA9PT0gMSAmJiBhcmdbMF0udGV4dCA9PT0gXCJbXCIpIHtcbiAgICB2YXIgYXJnVGV4dCA9ICcnO1xuICAgIHZhciB0b2tlbiA9IGNvbnRleHQuZXhwYW5kTmV4dFRva2VuKCk7XG5cbiAgICB3aGlsZSAodG9rZW4udGV4dCAhPT0gXCJdXCIgJiYgdG9rZW4udGV4dCAhPT0gXCJFT0ZcIikge1xuICAgICAgLy8gVE9ETzogU2hvdWxkIHByb3Blcmx5IGV4cGFuZCBhcmcsIGUuZy4sIGlnbm9yZSB7fXNcbiAgICAgIGFyZ1RleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgIHRva2VuID0gY29udGV4dC5leHBhbmROZXh0VG9rZW4oKTtcbiAgICB9XG5cbiAgICBpZiAoIWFyZ1RleHQubWF0Y2goL15cXHMqWzAtOV0rXFxzKiQvKSkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzOiBcIiArIGFyZ1RleHQpO1xuICAgIH1cblxuICAgIG51bUFyZ3MgPSBwYXJzZUludChhcmdUZXh0KTtcbiAgICBhcmcgPSBjb250ZXh0LmNvbnN1bWVBcmcoKS50b2tlbnM7XG4gIH0gLy8gRmluYWwgYXJnIGlzIHRoZSBleHBhbnNpb24gb2YgdGhlIG1hY3JvXG5cblxuICBjb250ZXh0Lm1hY3Jvcy5zZXQobmFtZSwge1xuICAgIHRva2VuczogYXJnLFxuICAgIG51bUFyZ3M6IG51bUFyZ3NcbiAgfSk7XG4gIHJldHVybiAnJztcbn07XG5cbmRlZmluZU1hY3JvKFwiXFxcXG5ld2NvbW1hbmRcIiwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ld2NvbW1hbmQoY29udGV4dCwgZmFsc2UsIHRydWUpO1xufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxyZW5ld2NvbW1hbmRcIiwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ld2NvbW1hbmQoY29udGV4dCwgdHJ1ZSwgZmFsc2UpO1xufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxwcm92aWRlY29tbWFuZFwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICByZXR1cm4gbmV3Y29tbWFuZChjb250ZXh0LCB0cnVlLCB0cnVlKTtcbn0pOyAvLyB0ZXJtaW5hbCAoY29uc29sZSkgdG9vbHNcblxuZGVmaW5lTWFjcm8oXCJcXFxcbWVzc2FnZVwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgYXJnID0gY29udGV4dC5jb25zdW1lQXJncygxKVswXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICBjb25zb2xlLmxvZyhhcmcucmV2ZXJzZSgpLm1hcChmdW5jdGlvbiAodG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4udGV4dDtcbiAgfSkuam9pbihcIlwiKSk7XG4gIHJldHVybiAnJztcbn0pO1xuZGVmaW5lTWFjcm8oXCJcXFxcZXJybWVzc2FnZVwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgYXJnID0gY29udGV4dC5jb25zdW1lQXJncygxKVswXTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICBjb25zb2xlLmVycm9yKGFyZy5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlbi50ZXh0O1xuICB9KS5qb2luKFwiXCIpKTtcbiAgcmV0dXJuICcnO1xufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxzaG93XCIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciB0b2sgPSBjb250ZXh0LnBvcFRva2VuKCk7XG4gIHZhciBuYW1lID0gdG9rLnRleHQ7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cbiAgY29uc29sZS5sb2codG9rLCBjb250ZXh0Lm1hY3Jvcy5nZXQobmFtZSksIHNyY19mdW5jdGlvbnNbbmFtZV0sIHNyY19zeW1ib2xzLm1hdGhbbmFtZV0sIHNyY19zeW1ib2xzLnRleHRbbmFtZV0pO1xuICByZXR1cm4gJyc7XG59KTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gR3JvdXBpbmdcbi8vIFxcbGV0XFxiZ3JvdXA9eyBcXGxldFxcZWdyb3VwPX1cblxuZGVmaW5lTWFjcm8oXCJcXFxcYmdyb3VwXCIsIFwie1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGVncm91cFwiLCBcIn1cIik7IC8vIFN5bWJvbHMgZnJvbSBsYXRleC5sdHg6XG4vLyBcXGRlZn57XFxub2JyZWFrc3BhY2V7fX1cbi8vIFxcZGVmXFxscXtgfVxuLy8gXFxkZWZcXHJxeyd9XG4vLyBcXGRlZiBcXGFhIHtcXHIgYX1cbi8vIFxcZGVmIFxcQUEge1xcciBBfVxuXG5kZWZpbmVNYWNybyhcIn5cIiwgXCJcXFxcbm9icmVha3NwYWNlXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbHFcIiwgXCJgXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccnFcIiwgXCInXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcYWFcIiwgXCJcXFxcciBhXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcQUFcIiwgXCJcXFxcciBBXCIpOyAvLyBDb3B5cmlnaHQgKEMpIGFuZCByZWdpc3RlcmVkIChSKSBzeW1ib2xzLiBVc2UgcmF3IHN5bWJvbCBpbiBNYXRoTUwuXG4vLyBcXERlY2xhcmVUZXh0Q29tbWFuZERlZmF1bHR7XFx0ZXh0Y29weXJpZ2h0fXtcXHRleHRjaXJjbGVke2N9fVxuLy8gXFxEZWNsYXJlVGV4dENvbW1hbmREZWZhdWx0e1xcdGV4dHJlZ2lzdGVyZWR9e1xcdGV4dGNpcmNsZWR7JVxuLy8gICAgICBcXGNoZWNrQG1hdGhmb250c1xcZm9udHNpemVcXHNmQHNpemVcXHpAXFxtYXRoQGZvbnRzZmFsc2VcXHNlbGVjdGZvbnQgUn19XG4vLyBcXERlY2xhcmVSb2J1c3RDb21tYW5ke1xcY29weXJpZ2h0fXslXG4vLyAgICBcXGlmbW1vZGV7XFxuZnNzQHRleHR7XFx0ZXh0Y29weXJpZ2h0fX1cXGVsc2VcXHRleHRjb3B5cmlnaHRcXGZpfVxuXG5kZWZpbmVNYWNybyhcIlxcXFx0ZXh0Y29weXJpZ2h0XCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFx0ZXh0Y2lyY2xlZHtjfX17XFxcXGNoYXJgwql9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcY29weXJpZ2h0XCIsIFwiXFxcXFRleHRPck1hdGh7XFxcXHRleHRjb3B5cmlnaHR9e1xcXFx0ZXh0e1xcXFx0ZXh0Y29weXJpZ2h0fX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx0ZXh0cmVnaXN0ZXJlZFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcdGV4dGNpcmNsZWR7XFxcXHNjcmlwdHNpemUgUn19e1xcXFxjaGFyYMKufVwiKTsgLy8gQ2hhcmFjdGVycyBvbWl0dGVkIGZyb20gVW5pY29kZSByYW5nZSAxRDQwMOKAkzFEN0ZGXG5cbmRlZmluZU1hY3JvKFwiXFx1MjEyQ1wiLCBcIlxcXFxtYXRoc2Nye0J9XCIpOyAvLyBzY3JpcHRcblxuZGVmaW5lTWFjcm8oXCJcXHUyMTMwXCIsIFwiXFxcXG1hdGhzY3J7RX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIxMzFcIiwgXCJcXFxcbWF0aHNjcntGfVwiKTtcbmRlZmluZU1hY3JvKFwiXFx1MjEwQlwiLCBcIlxcXFxtYXRoc2Nye0h9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMTEwXCIsIFwiXFxcXG1hdGhzY3J7SX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIxMTJcIiwgXCJcXFxcbWF0aHNjcntMfVwiKTtcbmRlZmluZU1hY3JvKFwiXFx1MjEzM1wiLCBcIlxcXFxtYXRoc2Nye019XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMTFCXCIsIFwiXFxcXG1hdGhzY3J7Un1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIxMkRcIiwgXCJcXFxcbWF0aGZyYWt7Q31cIik7IC8vIEZyYWt0dXJcblxuZGVmaW5lTWFjcm8oXCJcXHUyMTBDXCIsIFwiXFxcXG1hdGhmcmFre0h9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMTI4XCIsIFwiXFxcXG1hdGhmcmFre1p9XCIpOyAvLyBEZWZpbmUgXFxCYmJrIHdpdGggYSBtYWNybyB0aGF0IHdvcmtzIGluIGJvdGggSFRNTCBhbmQgTWF0aE1MLlxuXG5kZWZpbmVNYWNybyhcIlxcXFxCYmJrXCIsIFwiXFxcXEJiYntrfVwiKTsgLy8gVW5pY29kZSBtaWRkbGUgZG90XG4vLyBUaGUgS2FUZVggZm9udHMgZG8gbm90IGNvbnRhaW4gVSswMEI3LiBJbnN0ZWFkLCBcXGNkb3RwIGRpc3BsYXlzXG4vLyB0aGUgZG90IGF0IFUrMjJDNSBhbmQgZ2l2ZXMgaXQgcHVuY3Qgc3BhY2luZy5cblxuZGVmaW5lTWFjcm8oXCJcXHhCN1wiLCBcIlxcXFxjZG90cFwiKTsgLy8gXFxsbGFwIGFuZCBcXHJsYXAgcmVuZGVyIHRoZWlyIGNvbnRlbnRzIGluIHRleHQgbW9kZVxuXG5kZWZpbmVNYWNybyhcIlxcXFxsbGFwXCIsIFwiXFxcXG1hdGhsbGFwe1xcXFx0ZXh0cm17IzF9fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJsYXBcIiwgXCJcXFxcbWF0aHJsYXB7XFxcXHRleHRybXsjMX19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcY2xhcFwiLCBcIlxcXFxtYXRoY2xhcHtcXFxcdGV4dHJteyMxfX1cIik7IC8vIFxcbWF0aHN0cnV0IGZyb20gdGhlIFRlWGJvb2ssIHAgMzYwXG5cbmRlZmluZU1hY3JvKFwiXFxcXG1hdGhzdHJ1dFwiLCBcIlxcXFx2cGhhbnRvbXsofVwiKTsgLy8gXFx1bmRlcmJhciBmcm9tIFRlWGJvb2sgcCAzNTNcblxuZGVmaW5lTWFjcm8oXCJcXFxcdW5kZXJiYXJcIiwgXCJcXFxcdW5kZXJsaW5le1xcXFx0ZXh0eyMxfX1cIik7IC8vIFxcbm90IGlzIGRlZmluZWQgYnkgYmFzZS9mb250bWF0aC5sdHggdmlhXG4vLyBcXERlY2xhcmVNYXRoU3ltYm9se1xcbm90fXtcXG1hdGhyZWx9e3N5bWJvbHN9e1wiMzZ9XG4vLyBJdCdzIHRodXMgdHJlYXRlZCBsaWtlIGEgXFxtYXRocmVsLCBidXQgZGVmaW5lZCBieSBhIHN5bWJvbCB0aGF0IGhhcyB6ZXJvXG4vLyB3aWR0aCBidXQgZXh0ZW5kcyB0byB0aGUgcmlnaHQuICBXZSB1c2UgXFxybGFwIHRvIGdldCB0aGF0IHNwYWNpbmcuXG4vLyBGb3IgTWF0aE1MIHdlIHdyaXRlIFUrMDMzOCBoZXJlLiBidWlsZE1hdGhNTC5qcyB3aWxsIHRoZW4gZG8gdGhlIG92ZXJsYXkuXG5cbmRlZmluZU1hY3JvKFwiXFxcXG5vdFwiLCAnXFxcXGh0bWxAbWF0aG1se1xcXFxtYXRocmVse1xcXFxtYXRocmxhcFxcXFxAbm90fX17XFxcXGNoYXJcIjMzOH0nKTsgLy8gTmVnYXRlZCBzeW1ib2xzIGZyb20gYmFzZS9mb250bWF0aC5sdHg6XG4vLyBcXGRlZlxcbmVxe1xcbm90PX0gXFxsZXRcXG5lPVxcbmVxXG4vLyBcXERlY2xhcmVSb2J1c3RDb21tYW5kXG4vLyAgIFxcbm90aW57XFxtYXRocmVse1xcbUB0aFxcbWF0aHBhbGV0dGVcXGNAbmNlbFxcaW59fVxuLy8gXFxkZWZcXGNAbmNlbCMxIzJ7XFxtQHRoXFxvb2FsaWdueyRcXGhmaWwjMVxcbWtlcm4xbXUvXFxoZmlsJFxcY3JjciQjMSMyJH19XG5cbmRlZmluZU1hY3JvKFwiXFxcXG5lcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcbWF0aHJlbHtcXFxcbm90PX19e1xcXFxtYXRocmVse1xcXFxjaGFyYOKJoH19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbmVcIiwgXCJcXFxcbmVxXCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMjYwXCIsIFwiXFxcXG5lcVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG5vdGluXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxtYXRocmVse3tcXFxcaW59XFxcXG1hdGhsbGFwey9cXFxcbXNraXAxbXV9fX1cIiArIFwie1xcXFxtYXRocmVse1xcXFxjaGFyYOKIiX19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMjA5XCIsIFwiXFxcXG5vdGluXCIpOyAvLyBVbmljb2RlIHN0YWNrZWQgcmVsYXRpb25zXG5cbmRlZmluZU1hY3JvKFwiXFx1MjI1OFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7PVxcXFxrZXJuey0xZW19XFxcXHJhaXNlYm94ezAuNGVtfXskXFxcXHNjcmlwdHNpemVcXFxcZnJvd24kfX1cIiArIFwifXtcXFxcbWF0aHJlbHtcXFxcY2hhcmBcXHUyMjU4fX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIyNTlcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXHN0YWNrcmVse1xcXFx0aW55XFxcXHdlZGdlfXs9fX17XFxcXG1hdGhyZWx7XFxcXGNoYXJgXFx1MjI1OH19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMjVBXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxzdGFja3JlbHtcXFxcdGlueVxcXFx2ZWV9ez19fXtcXFxcbWF0aHJlbHtcXFxcY2hhcmBcXHUyMjVBfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIyNUJcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXHN0YWNrcmVse1xcXFxzY3JpcHRzaXplXFxcXHN0YXJ9ez19fVwiICsgXCJ7XFxcXG1hdGhyZWx7XFxcXGNoYXJgXFx1MjI1Qn19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMjVEXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxzdGFja3JlbHtcXFxcdGlueVxcXFxtYXRocm17ZGVmfX17PX19XCIgKyBcIntcXFxcbWF0aHJlbHtcXFxcY2hhcmBcXHUyMjVEfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIyNUVcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXHN0YWNrcmVse1xcXFx0aW55XFxcXG1hdGhybXttfX17PX19XCIgKyBcIntcXFxcbWF0aHJlbHtcXFxcY2hhcmBcXHUyMjVFfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIyNUZcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXHN0YWNrcmVse1xcXFx0aW55P317PX19e1xcXFxtYXRocmVse1xcXFxjaGFyYFxcdTIyNUZ9fVwiKTsgLy8gTWlzYyBVbmljb2RlXG5cbmRlZmluZU1hY3JvKFwiXFx1MjdDMlwiLCBcIlxcXFxwZXJwXCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMDNDXCIsIFwiXFxcXG1hdGhjbG9zZXshXFxcXG1rZXJuLTAuOG11IX1cIik7XG5kZWZpbmVNYWNybyhcIlxcdTIyMENcIiwgXCJcXFxcbm90bmlcIik7XG5kZWZpbmVNYWNybyhcIlxcdTIzMUNcIiwgXCJcXFxcdWxjb3JuZXJcIik7XG5kZWZpbmVNYWNybyhcIlxcdTIzMURcIiwgXCJcXFxcdXJjb3JuZXJcIik7XG5kZWZpbmVNYWNybyhcIlxcdTIzMUVcIiwgXCJcXFxcbGxjb3JuZXJcIik7XG5kZWZpbmVNYWNybyhcIlxcdTIzMUZcIiwgXCJcXFxcbHJjb3JuZXJcIik7XG5kZWZpbmVNYWNybyhcIlxceEE5XCIsIFwiXFxcXGNvcHlyaWdodFwiKTtcbmRlZmluZU1hY3JvKFwiXFx4QUVcIiwgXCJcXFxcdGV4dHJlZ2lzdGVyZWRcIik7XG5kZWZpbmVNYWNybyhcIlxcdUZFMEZcIiwgXCJcXFxcdGV4dHJlZ2lzdGVyZWRcIik7IC8vIFRoZSBLYVRlWCBmb250cyBoYXZlIGNvcm5lcnMgYXQgY29kZXBvaW50cyB0aGF0IGRvbid0IG1hdGNoIFVuaWNvZGUuXG4vLyBGb3IgTWF0aE1MIHB1cnBvc2VzLCB1c2UgdGhlIFVuaWNvZGUgY29kZSBwb2ludC5cblxuZGVmaW5lTWFjcm8oXCJcXFxcdWxjb3JuZXJcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXEB1bGNvcm5lcn17XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIyMzFjfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx1cmNvcm5lclwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQHVyY29ybmVyfXtcXFxcbWF0aG9we1xcXFxjaGFyXFxcIjIzMWR9fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGxsY29ybmVyXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxAbGxjb3JuZXJ9e1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjMxZX19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbHJjb3JuZXJcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXEBscmNvcm5lcn17XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIyMzFmfX1cIik7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIExhVGVYXzLOtVxuLy8gXFx2ZG90c3tcXHZib3h7XFxiYXNlbGluZXNraXA0XFxwQCAgXFxsaW5lc2tpcGxpbWl0XFx6QFxuLy8gXFxrZXJuNlxccEBcXGhib3h7Ln1cXGhib3h7Ln1cXGhib3h7Ln19fVxuLy8gV2UnbGwgY2FsbCBcXHZhcnZkb3RzLCB3aGljaCBnZXRzIGEgZ2x5cGggZnJvbSBzeW1ib2xzLmpzLlxuLy8gVGhlIHplcm8td2lkdGggcnVsZSBnZXRzIHVzIGFuIGVxdWl2YWxlbnQgdG8gdGhlIHZlcnRpY2FsIDZwdCBrZXJuLlxuXG5kZWZpbmVNYWNybyhcIlxcXFx2ZG90c1wiLCBcIlxcXFxtYXRob3Jke1xcXFx2YXJ2ZG90c1xcXFxydWxlezBwdH17MTVwdH19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXHUyMkVFXCIsIFwiXFxcXHZkb3RzXCIpOyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBhbXNtYXRoLnN0eVxuLy8gaHR0cDovL21pcnJvcnMuY29uY2VydHBhc3MuY29tL3RleC1hcmNoaXZlL21hY3Jvcy9sYXRleC9yZXF1aXJlZC9hbXNtYXRoL2Ftc21hdGgucGRmXG4vLyBJdGFsaWMgR3JlZWsgY2FwaXRhbCBsZXR0ZXJzLiAgQU1TIGRlZmluZXMgdGhlc2Ugd2l0aCBcXERlY2xhcmVNYXRoU3ltYm9sLFxuLy8gYnV0IHRoZXkgYXJlIGVxdWl2YWxlbnQgdG8gXFxtYXRoaXR7XFxMZXR0ZXJ9LlxuXG5kZWZpbmVNYWNybyhcIlxcXFx2YXJHYW1tYVwiLCBcIlxcXFxtYXRoaXR7XFxcXEdhbW1hfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHZhckRlbHRhXCIsIFwiXFxcXG1hdGhpdHtcXFxcRGVsdGF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyVGhldGFcIiwgXCJcXFxcbWF0aGl0e1xcXFxUaGV0YX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJMYW1iZGFcIiwgXCJcXFxcbWF0aGl0e1xcXFxMYW1iZGF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyWGlcIiwgXCJcXFxcbWF0aGl0e1xcXFxYaX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJQaVwiLCBcIlxcXFxtYXRoaXR7XFxcXFBpfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHZhclNpZ21hXCIsIFwiXFxcXG1hdGhpdHtcXFxcU2lnbWF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyVXBzaWxvblwiLCBcIlxcXFxtYXRoaXR7XFxcXFVwc2lsb259XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyUGhpXCIsIFwiXFxcXG1hdGhpdHtcXFxcUGhpfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHZhclBzaVwiLCBcIlxcXFxtYXRoaXR7XFxcXFBzaX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJPbWVnYVwiLCBcIlxcXFxtYXRoaXR7XFxcXE9tZWdhfVwiKTsgLy9cXG5ld2NvbW1hbmR7XFxzdWJzdGFja31bMV17XFxzdWJhcnJheXtjfSMxXFxlbmRzdWJhcnJheX1cblxuZGVmaW5lTWFjcm8oXCJcXFxcc3Vic3RhY2tcIiwgXCJcXFxcYmVnaW57c3ViYXJyYXl9e2N9IzFcXFxcZW5ke3N1YmFycmF5fVwiKTsgLy8gXFxyZW5ld2NvbW1hbmR7XFxjb2xvbn17XFxub2JyZWFrXFxtc2tpcDJtdVxcbWF0aHB1bmN0e31cXG5vbnNjcmlwdFxuLy8gXFxta2Vybi1cXHRoaW5tdXNraXB7On1cXG1za2lwNm11cGx1czFtdVxccmVsYXh9XG5cbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uXCIsIFwiXFxcXG5vYnJlYWtcXFxcbXNraXAybXVcXFxcbWF0aHB1bmN0e31cIiArIFwiXFxcXG1hdGhjaG9pY2V7XFxcXG1rZXJuLTNtdX17XFxcXG1rZXJuLTNtdX17fXt9ezp9XFxcXG1za2lwNm11XFxcXHJlbGF4XCIpOyAvLyBcXG5ld2NvbW1hbmR7XFxib3hlZH1bMV17XFxmYm94e1xcbUB0aCRcXGRpc3BsYXlzdHlsZSMxJH19XG5cbmRlZmluZU1hY3JvKFwiXFxcXGJveGVkXCIsIFwiXFxcXGZib3h7JFxcXFxkaXNwbGF5c3R5bGV7IzF9JH1cIik7IC8vIFxcZGVmXFxpZmZ7XFxET1RTQlxcO1xcTG9uZ2xlZnRyaWdodGFycm93XFw7fVxuLy8gXFxkZWZcXGltcGxpZXN7XFxET1RTQlxcO1xcTG9uZ3JpZ2h0YXJyb3dcXDt9XG4vLyBcXGRlZlxcaW1wbGllZGJ5e1xcRE9UU0JcXDtcXExvbmdsZWZ0YXJyb3dcXDt9XG5cbmRlZmluZU1hY3JvKFwiXFxcXGlmZlwiLCBcIlxcXFxET1RTQlxcXFw7XFxcXExvbmdsZWZ0cmlnaHRhcnJvd1xcXFw7XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcaW1wbGllc1wiLCBcIlxcXFxET1RTQlxcXFw7XFxcXExvbmdyaWdodGFycm93XFxcXDtcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxpbXBsaWVkYnlcIiwgXCJcXFxcRE9UU0JcXFxcO1xcXFxMb25nbGVmdGFycm93XFxcXDtcIik7IC8vIEFNU01hdGgncyBhdXRvbWF0aWMgXFxkb3RzLCBiYXNlZCBvbiBcXG1kb3RzQEAgbWFjcm8uXG5cbnZhciBkb3RzQnlUb2tlbiA9IHtcbiAgJywnOiAnXFxcXGRvdHNjJyxcbiAgJ1xcXFxub3QnOiAnXFxcXGRvdHNiJyxcbiAgLy8gXFxrZXliaW5AIGNoZWNrcyBmb3IgdGhlIGZvbGxvd2luZzpcbiAgJysnOiAnXFxcXGRvdHNiJyxcbiAgJz0nOiAnXFxcXGRvdHNiJyxcbiAgJzwnOiAnXFxcXGRvdHNiJyxcbiAgJz4nOiAnXFxcXGRvdHNiJyxcbiAgJy0nOiAnXFxcXGRvdHNiJyxcbiAgJyonOiAnXFxcXGRvdHNiJyxcbiAgJzonOiAnXFxcXGRvdHNiJyxcbiAgLy8gU3ltYm9scyB3aG9zZSBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoIFxcRE9UU0I6XG4gICdcXFxcRE9UU0InOiAnXFxcXGRvdHNiJyxcbiAgJ1xcXFxjb3Byb2QnOiAnXFxcXGRvdHNiJyxcbiAgJ1xcXFxiaWd2ZWUnOiAnXFxcXGRvdHNiJyxcbiAgJ1xcXFxiaWd3ZWRnZSc6ICdcXFxcZG90c2InLFxuICAnXFxcXGJpZ3VwbHVzJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcYmlnY2FwJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcYmlnY3VwJzogJ1xcXFxkb3RzYicsXG4gICdcXFxccHJvZCc6ICdcXFxcZG90c2InLFxuICAnXFxcXHN1bSc6ICdcXFxcZG90c2InLFxuICAnXFxcXGJpZ290aW1lcyc6ICdcXFxcZG90c2InLFxuICAnXFxcXGJpZ29wbHVzJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcYmlnb2RvdCc6ICdcXFxcZG90c2InLFxuICAnXFxcXGJpZ3NxY3VwJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcQW5kJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcbG9uZ3JpZ2h0YXJyb3cnOiAnXFxcXGRvdHNiJyxcbiAgJ1xcXFxMb25ncmlnaHRhcnJvdyc6ICdcXFxcZG90c2InLFxuICAnXFxcXGxvbmdsZWZ0YXJyb3cnOiAnXFxcXGRvdHNiJyxcbiAgJ1xcXFxMb25nbGVmdGFycm93JzogJ1xcXFxkb3RzYicsXG4gICdcXFxcbG9uZ2xlZnRyaWdodGFycm93JzogJ1xcXFxkb3RzYicsXG4gICdcXFxcTG9uZ2xlZnRyaWdodGFycm93JzogJ1xcXFxkb3RzYicsXG4gICdcXFxcbWFwc3RvJzogJ1xcXFxkb3RzYicsXG4gICdcXFxcbG9uZ21hcHN0byc6ICdcXFxcZG90c2InLFxuICAnXFxcXGhvb2tyaWdodGFycm93JzogJ1xcXFxkb3RzYicsXG4gICdcXFxcZG90ZXEnOiAnXFxcXGRvdHNiJyxcbiAgLy8gU3ltYm9scyB3aG9zZSBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoIFxcbWF0aGJpbjpcbiAgJ1xcXFxtYXRoYmluJzogJ1xcXFxkb3RzYicsXG4gIC8vIFN5bWJvbHMgd2hvc2UgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCBcXG1hdGhyZWw6XG4gICdcXFxcbWF0aHJlbCc6ICdcXFxcZG90c2InLFxuICAnXFxcXHJlbGJhcic6ICdcXFxcZG90c2InLFxuICAnXFxcXFJlbGJhcic6ICdcXFxcZG90c2InLFxuICAnXFxcXHhyaWdodGFycm93JzogJ1xcXFxkb3RzYicsXG4gICdcXFxceGxlZnRhcnJvdyc6ICdcXFxcZG90c2InLFxuICAvLyBTeW1ib2xzIHdob3NlIGRlZmluaXRpb24gc3RhcnRzIHdpdGggXFxET1RTSTpcbiAgJ1xcXFxET1RTSSc6ICdcXFxcZG90c2knLFxuICAnXFxcXGludCc6ICdcXFxcZG90c2knLFxuICAnXFxcXG9pbnQnOiAnXFxcXGRvdHNpJyxcbiAgJ1xcXFxpaW50JzogJ1xcXFxkb3RzaScsXG4gICdcXFxcaWlpbnQnOiAnXFxcXGRvdHNpJyxcbiAgJ1xcXFxpaWlpbnQnOiAnXFxcXGRvdHNpJyxcbiAgJ1xcXFxpZG90c2ludCc6ICdcXFxcZG90c2knLFxuICAvLyBTeW1ib2xzIHdob3NlIGRlZmluaXRpb24gc3RhcnRzIHdpdGggXFxET1RTWDpcbiAgJ1xcXFxET1RTWCc6ICdcXFxcZG90c3gnXG59O1xuZGVmaW5lTWFjcm8oXCJcXFxcZG90c1wiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAvLyBUT0RPOiBJZiB1c2VkIGluIHRleHQgbW9kZSwgc2hvdWxkIGV4cGFuZCB0byBcXHRleHRlbGxpcHNpcy5cbiAgLy8gSG93ZXZlciwgaW4gS2FUZVgsIFxcdGV4dGVsbGlwc2lzIGFuZCBcXGxkb3RzIGJlaGF2ZSB0aGUgc2FtZVxuICAvLyAoaW4gdGV4dCBtb2RlKSwgYW5kIGl0J3MgdW5saWtlbHkgd2UnZCBzZWUgYW55IG9mIHRoZSBtYXRoIGNvbW1hbmRzXG4gIC8vIHRoYXQgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiBcXGRvdHMgd2hlbiBpbiB0ZXh0IG1vZGUuICBTbyBmaW5lIGZvciBub3dcbiAgLy8gKHVudGlsIHdlIHN1cHBvcnQgXFxpZm1tb2RlIC4uLiBcXGVsc2UgLi4uIFxcZmkpLlxuICB2YXIgdGhlZG90cyA9ICdcXFxcZG90c28nO1xuICB2YXIgbmV4dCA9IGNvbnRleHQuZXhwYW5kQWZ0ZXJGdXR1cmUoKS50ZXh0O1xuXG4gIGlmIChuZXh0IGluIGRvdHNCeVRva2VuKSB7XG4gICAgdGhlZG90cyA9IGRvdHNCeVRva2VuW25leHRdO1xuICB9IGVsc2UgaWYgKG5leHQuc2xpY2UoMCwgNCkgPT09ICdcXFxcbm90Jykge1xuICAgIHRoZWRvdHMgPSAnXFxcXGRvdHNiJztcbiAgfSBlbHNlIGlmIChuZXh0IGluIHNyY19zeW1ib2xzLm1hdGgpIHtcbiAgICBpZiAodXRpbHMuY29udGFpbnMoWydiaW4nLCAncmVsJ10sIHNyY19zeW1ib2xzLm1hdGhbbmV4dF0uZ3JvdXApKSB7XG4gICAgICB0aGVkb3RzID0gJ1xcXFxkb3RzYic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoZWRvdHM7XG59KTtcbnZhciBzcGFjZUFmdGVyRG90cyA9IHtcbiAgLy8gXFxyaWdodGRlbGltQCBjaGVja3MgZm9yIHRoZSBmb2xsb3dpbmc6XG4gICcpJzogdHJ1ZSxcbiAgJ10nOiB0cnVlLFxuICAnXFxcXHJicmFjayc6IHRydWUsXG4gICdcXFxcfSc6IHRydWUsXG4gICdcXFxccmJyYWNlJzogdHJ1ZSxcbiAgJ1xcXFxyYW5nbGUnOiB0cnVlLFxuICAnXFxcXHJjZWlsJzogdHJ1ZSxcbiAgJ1xcXFxyZmxvb3InOiB0cnVlLFxuICAnXFxcXHJncm91cCc6IHRydWUsXG4gICdcXFxccm1vdXN0YWNoZSc6IHRydWUsXG4gICdcXFxccmlnaHQnOiB0cnVlLFxuICAnXFxcXGJpZ3InOiB0cnVlLFxuICAnXFxcXGJpZ2dyJzogdHJ1ZSxcbiAgJ1xcXFxCaWdyJzogdHJ1ZSxcbiAgJ1xcXFxCaWdncic6IHRydWUsXG4gIC8vIFxcZXh0cmFAIGFsc28gdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmc6XG4gICckJzogdHJ1ZSxcbiAgLy8gXFxleHRyYXBAIGNoZWNrcyBmb3IgdGhlIGZvbGxvd2luZzpcbiAgJzsnOiB0cnVlLFxuICAnLic6IHRydWUsXG4gICcsJzogdHJ1ZVxufTtcbmRlZmluZU1hY3JvKFwiXFxcXGRvdHNvXCIsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIHZhciBuZXh0ID0gY29udGV4dC5mdXR1cmUoKS50ZXh0O1xuXG4gIGlmIChuZXh0IGluIHNwYWNlQWZ0ZXJEb3RzKSB7XG4gICAgcmV0dXJuIFwiXFxcXGxkb3RzXFxcXCxcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJcXFxcbGRvdHNcIjtcbiAgfVxufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxkb3RzY1wiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgbmV4dCA9IGNvbnRleHQuZnV0dXJlKCkudGV4dDsgLy8gXFxkb3RzYyB1c2VzIFxcZXh0cmFAIGJ1dCBub3QgXFxleHRyYXBALCBpbnN0ZWFkIHNwZWNpYWxseSBjaGVja2luZyBmb3JcbiAgLy8gJzsnIGFuZCAnLicsIGJ1dCBkb2Vzbid0IGNoZWNrIGZvciAnLCcuXG5cbiAgaWYgKG5leHQgaW4gc3BhY2VBZnRlckRvdHMgJiYgbmV4dCAhPT0gJywnKSB7XG4gICAgcmV0dXJuIFwiXFxcXGxkb3RzXFxcXCxcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJcXFxcbGRvdHNcIjtcbiAgfVxufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxjZG90c1wiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgbmV4dCA9IGNvbnRleHQuZnV0dXJlKCkudGV4dDtcblxuICBpZiAobmV4dCBpbiBzcGFjZUFmdGVyRG90cykge1xuICAgIHJldHVybiBcIlxcXFxAY2RvdHNcXFxcLFwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlxcXFxAY2RvdHNcIjtcbiAgfVxufSk7XG5kZWZpbmVNYWNybyhcIlxcXFxkb3RzYlwiLCBcIlxcXFxjZG90c1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGRvdHNtXCIsIFwiXFxcXGNkb3RzXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZG90c2lcIiwgXCJcXFxcIVxcXFxjZG90c1wiKTsgLy8gYW1zbWF0aCBkb2Vzbid0IGFjdHVhbGx5IGRlZmluZSBcXGRvdHN4LCBidXQgXFxkb3RzIGZvbGxvd2VkIGJ5IGEgbWFjcm9cbi8vIHN0YXJ0aW5nIHdpdGggXFxET1RTWCBpbXBsaWVzIFxcZG90c28sIGFuZCB0aGVuIFxcZXh0cmFAIGRldGVjdHMgdGhpcyBjYXNlXG4vLyBhbmQgZm9yY2VzIHRoZSBhZGRlZCBgXFwsYC5cblxuZGVmaW5lTWFjcm8oXCJcXFxcZG90c3hcIiwgXCJcXFxcbGRvdHNcXFxcLFwiKTsgLy8gXFxsZXRcXERPVFNJXFxyZWxheFxuLy8gXFxsZXRcXERPVFNCXFxyZWxheFxuLy8gXFxsZXRcXERPVFNYXFxyZWxheFxuXG5kZWZpbmVNYWNybyhcIlxcXFxET1RTSVwiLCBcIlxcXFxyZWxheFwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXERPVFNCXCIsIFwiXFxcXHJlbGF4XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcRE9UU1hcIiwgXCJcXFxccmVsYXhcIik7IC8vIFNwYWNpbmcsIGJhc2VkIG9uIGFtc21hdGguc3R5J3Mgb3ZlcnJpZGUgb2YgTGFUZVggZGVmYXVsdHNcbi8vIFxcRGVjbGFyZVJvYnVzdENvbW1hbmR7XFx0bXNwYWNlfVszXXslXG4vLyAgIFxcaWZtbW9kZVxcbXNraXAjMSMyXFxlbHNlXFxrZXJuIzEjM1xcZmlcXHJlbGF4fVxuXG5kZWZpbmVNYWNybyhcIlxcXFx0bXNwYWNlXCIsIFwiXFxcXFRleHRPck1hdGh7XFxcXGtlcm4jMSMzfXtcXFxcbXNraXAjMSMyfVxcXFxyZWxheFwiKTsgLy8gXFxyZW5ld2NvbW1hbmR7XFwsfXtcXHRtc3BhY2UrXFx0aGlubXVza2lwey4xNjY3ZW19fVxuLy8gVE9ETzogbWF0aCBtb2RlIHNob3VsZCB1c2UgXFx0aGlubXVza2lwXG5cbmRlZmluZU1hY3JvKFwiXFxcXCxcIiwgXCJcXFxcdG1zcGFjZSt7M211fXsuMTY2N2VtfVwiKTsgLy8gXFxsZXRcXHRoaW5zcGFjZVxcLFxuXG5kZWZpbmVNYWNybyhcIlxcXFx0aGluc3BhY2VcIiwgXCJcXFxcLFwiKTsgLy8gXFxkZWZcXD57XFxtc2tpcFxcbWVkbXVza2lwfVxuLy8gXFxyZW5ld2NvbW1hbmR7XFw6fXtcXHRtc3BhY2UrXFxtZWRtdXNraXB7LjIyMjJlbX19XG4vLyBUT0RPOiBcXD4gYW5kIG1hdGggbW9kZSBvZiBcXDogc2hvdWxkIHVzZSBcXG1lZG11c2tpcCA9IDRtdSBwbHVzIDJtdSBtaW51cyA0bXVcblxuZGVmaW5lTWFjcm8oXCJcXFxcPlwiLCBcIlxcXFxtc2tpcHs0bXV9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcOlwiLCBcIlxcXFx0bXNwYWNlK3s0bXV9ey4yMjIyZW19XCIpOyAvLyBcXGxldFxcbWVkc3BhY2VcXDpcblxuZGVmaW5lTWFjcm8oXCJcXFxcbWVkc3BhY2VcIiwgXCJcXFxcOlwiKTsgLy8gXFxyZW5ld2NvbW1hbmR7XFw7fXtcXHRtc3BhY2UrXFx0aGlja211c2tpcHsuMjc3N2VtfX1cbi8vIFRPRE86IG1hdGggbW9kZSBzaG91bGQgdXNlIFxcdGhpY2ttdXNraXAgPSA1bXUgcGx1cyA1bXVcblxuZGVmaW5lTWFjcm8oXCJcXFxcO1wiLCBcIlxcXFx0bXNwYWNlK3s1bXV9ey4yNzc3ZW19XCIpOyAvLyBcXGxldFxcdGhpY2tzcGFjZVxcO1xuXG5kZWZpbmVNYWNybyhcIlxcXFx0aGlja3NwYWNlXCIsIFwiXFxcXDtcIik7IC8vIFxccmVuZXdjb21tYW5ke1xcIX17XFx0bXNwYWNlLVxcdGhpbm11c2tpcHsuMTY2N2VtfX1cbi8vIFRPRE86IG1hdGggbW9kZSBzaG91bGQgdXNlIFxcdGhpbm11c2tpcFxuXG5kZWZpbmVNYWNybyhcIlxcXFwhXCIsIFwiXFxcXHRtc3BhY2UtezNtdX17LjE2NjdlbX1cIik7IC8vIFxcbGV0XFxuZWd0aGluc3BhY2VcXCFcblxuZGVmaW5lTWFjcm8oXCJcXFxcbmVndGhpbnNwYWNlXCIsIFwiXFxcXCFcIik7IC8vIFxcbmV3Y29tbWFuZHtcXG5lZ21lZHNwYWNlfXtcXHRtc3BhY2UtXFxtZWRtdXNraXB7LjIyMjJlbX19XG4vLyBUT0RPOiBtYXRoIG1vZGUgc2hvdWxkIHVzZSBcXG1lZG11c2tpcFxuXG5kZWZpbmVNYWNybyhcIlxcXFxuZWdtZWRzcGFjZVwiLCBcIlxcXFx0bXNwYWNlLXs0bXV9ey4yMjIyZW19XCIpOyAvLyBcXG5ld2NvbW1hbmR7XFxuZWd0aGlja3NwYWNlfXtcXHRtc3BhY2UtXFx0aGlja211c2tpcHsuMjc3N2VtfX1cbi8vIFRPRE86IG1hdGggbW9kZSBzaG91bGQgdXNlIFxcdGhpY2ttdXNraXBcblxuZGVmaW5lTWFjcm8oXCJcXFxcbmVndGhpY2tzcGFjZVwiLCBcIlxcXFx0bXNwYWNlLXs1bXV9ey4yNzdlbX1cIik7IC8vIFxcZGVmXFxlbnNwYWNle1xca2Vybi41ZW0gfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxlbnNwYWNlXCIsIFwiXFxcXGtlcm4uNWVtIFwiKTsgLy8gXFxkZWZcXGVuc2tpcHtcXGhza2lwLjVlbVxccmVsYXh9XG5cbmRlZmluZU1hY3JvKFwiXFxcXGVuc2tpcFwiLCBcIlxcXFxoc2tpcC41ZW1cXFxccmVsYXhcIik7IC8vIFxcZGVmXFxxdWFke1xcaHNraXAxZW1cXHJlbGF4fVxuXG5kZWZpbmVNYWNybyhcIlxcXFxxdWFkXCIsIFwiXFxcXGhza2lwMWVtXFxcXHJlbGF4XCIpOyAvLyBcXGRlZlxccXF1YWR7XFxoc2tpcDJlbVxccmVsYXh9XG5cbmRlZmluZU1hY3JvKFwiXFxcXHFxdWFkXCIsIFwiXFxcXGhza2lwMmVtXFxcXHJlbGF4XCIpOyAvLyBcXHRhZ0BpbkBkaXNwbGF5IGZvcm0gb2YgXFx0YWdcblxuZGVmaW5lTWFjcm8oXCJcXFxcdGFnXCIsIFwiXFxcXEBpZnN0YXJcXFxcdGFnQGxpdGVyYWxcXFxcdGFnQHBhcmVuXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdGFnQHBhcmVuXCIsIFwiXFxcXHRhZ0BsaXRlcmFseyh7IzF9KX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx0YWdAbGl0ZXJhbFwiLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICBpZiAoY29udGV4dC5tYWNyb3MuZ2V0KFwiXFxcXGRmQHRhZ1wiKSkge1xuICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIk11bHRpcGxlIFxcXFx0YWdcIik7XG4gIH1cblxuICByZXR1cm4gXCJcXFxcZ2RlZlxcXFxkZkB0YWd7XFxcXHRleHR7IzF9fVwiO1xufSk7IC8vIFxccmVuZXdjb21tYW5ke1xcYm1vZH17XFxub25zY3JpcHRcXG1za2lwLVxcbWVkbXVza2lwXFxta2VybjVtdVxcbWF0aGJpblxuLy8gICB7XFxvcGVyYXRvckBmb250IG1vZH1cXHBlbmFsdHk5MDBcbi8vICAgXFxta2VybjVtdVxcbm9uc2NyaXB0XFxtc2tpcC1cXG1lZG11c2tpcH1cbi8vIFxcbmV3Y29tbWFuZHtcXHBvZH1bMV17XFxhbGxvd2JyZWFrXG4vLyAgIFxcaWZAZGlzcGxheVxcbWtlcm4xOG11XFxlbHNlXFxta2VybjhtdVxcZmkoIzEpfVxuLy8gXFxyZW5ld2NvbW1hbmR7XFxwbW9kfVsxXXtcXHBvZHt7XFxvcGVyYXRvckBmb250IG1vZH1cXG1rZXJuNm11IzF9fVxuLy8gXFxuZXdjb21tYW5ke1xcbW9kfVsxXXtcXGFsbG93YnJlYWtcXGlmQGRpc3BsYXlcXG1rZXJuMThtdVxuLy8gICBcXGVsc2VcXG1rZXJuMTJtdVxcZml7XFxvcGVyYXRvckBmb250IG1vZH1cXCxcXCwjMX1cbi8vIFRPRE86IG1hdGggbW9kZSBzaG91bGQgdXNlIFxcbWVkbXVza2lwID0gNG11IHBsdXMgMm11IG1pbnVzIDRtdVxuXG5kZWZpbmVNYWNybyhcIlxcXFxibW9kXCIsIFwiXFxcXG1hdGhjaG9pY2V7XFxcXG1za2lwMW11fXtcXFxcbXNraXAxbXV9e1xcXFxtc2tpcDVtdX17XFxcXG1za2lwNW11fVwiICsgXCJcXFxcbWF0aGJpbntcXFxccm0gbW9kfVwiICsgXCJcXFxcbWF0aGNob2ljZXtcXFxcbXNraXAxbXV9e1xcXFxtc2tpcDFtdX17XFxcXG1za2lwNW11fXtcXFxcbXNraXA1bXV9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccG9kXCIsIFwiXFxcXGFsbG93YnJlYWtcIiArIFwiXFxcXG1hdGhjaG9pY2V7XFxcXG1rZXJuMThtdX17XFxcXG1rZXJuOG11fXtcXFxcbWtlcm44bXV9e1xcXFxta2VybjhtdX0oIzEpXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccG1vZFwiLCBcIlxcXFxwb2R7e1xcXFxybSBtb2R9XFxcXG1rZXJuNm11IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbW9kXCIsIFwiXFxcXGFsbG93YnJlYWtcIiArIFwiXFxcXG1hdGhjaG9pY2V7XFxcXG1rZXJuMThtdX17XFxcXG1rZXJuMTJtdX17XFxcXG1rZXJuMTJtdX17XFxcXG1rZXJuMTJtdX1cIiArIFwie1xcXFxybSBtb2R9XFxcXCxcXFxcLCMxXCIpOyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMYVRlWCBzb3VyY2UyZVxuLy8gXFxleHBhbmRhZnRlclxcbGV0XFxleHBhbmRhZnRlclxcQG5vcm1hbGNyXG4vLyAgICAgXFxjc25hbWVcXGV4cGFuZGFmdGVyXFxAZ29iYmxlXFxzdHJpbmdcXFxcIFxcZW5kY3NuYW1lXG4vLyBcXERlY2xhcmVSb2J1c3RDb21tYW5kXFxuZXdsaW5le1xcQG5vcm1hbGNyXFxyZWxheH1cblxuZGVmaW5lTWFjcm8oXCJcXFxcbmV3bGluZVwiLCBcIlxcXFxcXFxcXFxcXHJlbGF4XCIpOyAvLyBcXGRlZlxcVGVYe1RcXGtlcm4tLjE2NjdlbVxcbG93ZXIuNWV4XFxoYm94e0V9XFxrZXJuLS4xMjVlbVhcXEB9XG4vLyBUT0RPOiBEb2Vzbid0IG5vcm1hbGx5IHdvcmsgaW4gbWF0aCBtb2RlIGJlY2F1c2UgXFxAIGZhaWxzLiAgS2FUZVggZG9lc24ndFxuLy8gc3VwcG9ydCBcXEAgeWV0LCBzbyB0aGF0J3Mgb21pdHRlZCwgYW5kIHdlIGFkZCBcXHRleHQgc28gdGhhdCB0aGUgcmVzdWx0XG4vLyBkb2Vzbid0IGxvb2sgZnVubnkgaW4gbWF0aCBtb2RlLlxuXG5kZWZpbmVNYWNybyhcIlxcXFxUZVhcIiwgXCJcXFxcdGV4dHJte1xcXFxodG1sQG1hdGhtbHtcIiArIFwiVFxcXFxrZXJuLS4xNjY3ZW1cXFxccmFpc2Vib3h7LS41ZXh9e0V9XFxcXGtlcm4tLjEyNWVtWFwiICsgXCJ9e1RlWH19XCIpOyAvLyBcXERlY2xhcmVSb2J1c3RDb21tYW5ke1xcTGFUZVh9e0xcXGtlcm4tLjM2ZW0lXG4vLyAgICAgICAgIHtcXHNib3hcXHpAIFQlXG4vLyAgICAgICAgICBcXHZib3ggdG9cXGh0XFx6QHtcXGhib3h7XFxjaGVja0BtYXRoZm9udHNcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcZm9udHNpemVcXHNmQHNpemVcXHpAXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXG1hdGhAZm9udHNmYWxzZVxcc2VsZWN0Zm9udFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQX0lXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBcXHZzc30lXG4vLyAgICAgICAgIH0lXG4vLyAgICAgICAgIFxca2Vybi0uMTVlbSVcbi8vICAgICAgICAgXFxUZVh9XG4vLyBUaGlzIGNvZGUgYWxpZ25zIHRoZSB0b3Agb2YgdGhlIEEgd2l0aCB0aGUgVCAoZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgVGVYJ3Ncbi8vIGJveGVzLCB0aG91Z2ggdmlzdWFsbHkgdGhlIEEgYXBwZWFycyB0byBleHRlbmQgYWJvdmUgc2xpZ2h0bHkpLlxuLy8gV2UgY29tcHV0ZSB0aGUgY29ycmVzcG9uZGluZyBcXHJhaXNlYm94IHdoZW4gQSBpcyByZW5kZXJlZCBpbiBcXG5vcm1hbHNpemVcbi8vIFxcc2NyaXB0c3R5bGUsIHdoaWNoIGhhcyBhIHNjYWxlIGZhY3RvciBvZiAwLjcgKHNlZSBPcHRpb25zLmpzKS5cblxudmFyIGxhdGV4UmFpc2VBID0gbWFrZUVtKGZvbnRNZXRyaWNzRGF0YVtcIk1haW4tUmVndWxhclwiXVtcIlRcIi5jaGFyQ29kZUF0KDApXVsxXSAtIDAuNyAqIGZvbnRNZXRyaWNzRGF0YVtcIk1haW4tUmVndWxhclwiXVtcIkFcIi5jaGFyQ29kZUF0KDApXVsxXSk7XG5kZWZpbmVNYWNybyhcIlxcXFxMYVRlWFwiLCBcIlxcXFx0ZXh0cm17XFxcXGh0bWxAbWF0aG1se1wiICsgKFwiTFxcXFxrZXJuLS4zNmVtXFxcXHJhaXNlYm94e1wiICsgbGF0ZXhSYWlzZUEgKyBcIn17XFxcXHNjcmlwdHN0eWxlIEF9XCIpICsgXCJcXFxca2Vybi0uMTVlbVxcXFxUZVh9e0xhVGVYfX1cIik7IC8vIE5ldyBLYVRlWCBsb2dvIGJhc2VkIG9uIHR3ZWFraW5nIExhVGVYIGxvZ29cblxuZGVmaW5lTWFjcm8oXCJcXFxcS2FUZVhcIiwgXCJcXFxcdGV4dHJte1xcXFxodG1sQG1hdGhtbHtcIiArIChcIktcXFxca2Vybi0uMTdlbVxcXFxyYWlzZWJveHtcIiArIGxhdGV4UmFpc2VBICsgXCJ9e1xcXFxzY3JpcHRzdHlsZSBBfVwiKSArIFwiXFxcXGtlcm4tLjE1ZW1cXFxcVGVYfXtLYVRlWH19XCIpOyAvLyBcXERlY2xhcmVSb2J1c3RDb21tYW5kXFxoc3BhY2V7XFxAaWZzdGFyXFxAaHNwYWNlclxcQGhzcGFjZX1cbi8vIFxcZGVmXFxAaHNwYWNlIzF7XFxoc2tpcCAgIzFcXHJlbGF4fVxuLy8gXFxkZWZcXEBoc3BhY2VyIzF7XFx2cnVsZSBcXEB3aWR0aFxcekBcXG5vYnJlYWtcbi8vICAgICAgICAgICAgICAgICBcXGhza2lwICMxXFxoc2tpcCBcXHpAc2tpcH1cblxuZGVmaW5lTWFjcm8oXCJcXFxcaHNwYWNlXCIsIFwiXFxcXEBpZnN0YXJcXFxcQGhzcGFjZXJcXFxcQGhzcGFjZVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXEBoc3BhY2VcIiwgXCJcXFxcaHNraXAgIzFcXFxccmVsYXhcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxAaHNwYWNlclwiLCBcIlxcXFxydWxlezBwdH17MHB0fVxcXFxoc2tpcCAjMVxcXFxyZWxheFwiKTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gbWF0aHRvb2xzLnN0eVxuLy9cXHByb3ZpZGVjb21tYW5kXFxvcmRpbmFyeWNvbG9uezp9XG5cbmRlZmluZU1hY3JvKFwiXFxcXG9yZGluYXJ5Y29sb25cIiwgXCI6XCIpOyAvL1xcZGVmXFx2Y2VudGNvbG9ue1xcbWF0aHJlbHtcXG1hdGhvcFxcb3JkaW5hcnljb2xvbn19XG4vL1RPRE8oZWRlbWFpbmUpOiBOb3QgeWV0IGNlbnRlcmVkLiBGaXggdmlhIFxccmFpc2Vib3ggb3IgIzcyNlxuXG5kZWZpbmVNYWNybyhcIlxcXFx2Y2VudGNvbG9uXCIsIFwiXFxcXG1hdGhyZWx7XFxcXG1hdGhvcFxcXFxvcmRpbmFyeWNvbG9ufVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXGRibGNvbG9ue1xcdmNlbnRjb2xvblxcbWF0aHJlbHtcXG1rZXJuLS45bXV9XFx2Y2VudGNvbG9ufVxuXG5kZWZpbmVNYWNybyhcIlxcXFxkYmxjb2xvblwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXHZjZW50Y29sb25cXFxcbWF0aHJlbHtcXFxcbWtlcm4tLjltdX1cXFxcdmNlbnRjb2xvbn19XCIgKyBcIntcXFxcbWF0aG9we1xcXFxjaGFyXFxcIjIyMzd9fVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXGNvbG9uZXFxe1xcdmNlbnRjb2xvblxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fT19XG5cbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uZXFxXCIsIFwiXFxcXGh0bWxAbWF0aG1se1wiICsgXCJcXFxcbWF0aHJlbHtcXFxcdmNlbnRjb2xvblxcXFxtYXRocmVse1xcXFxta2Vybi0xLjJtdX09fX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjI1NH19XCIpOyAvLyDiiZRcbi8vIFxccHJvdmlkZWNvbW1hbmQqXFxDb2xvbmVxcXtcXGRibGNvbG9uXFxtYXRocmVse1xcbWtlcm4tMS4ybXV9PX1cblxuZGVmaW5lTWFjcm8oXCJcXFxcQ29sb25lcXFcIiwgXCJcXFxcaHRtbEBtYXRobWx7XCIgKyBcIlxcXFxtYXRocmVse1xcXFxkYmxjb2xvblxcXFxtYXRocmVse1xcXFxta2Vybi0xLjJtdX09fX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjIzN1xcXFxjaGFyXFxcIjNkfX1cIik7IC8vIFxccHJvdmlkZWNvbW1hbmQqXFxjb2xvbmVxe1xcdmNlbnRjb2xvblxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcbWF0aHJlbHstfX1cblxuZGVmaW5lTWFjcm8oXCJcXFxcY29sb25lcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXHZjZW50Y29sb25cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXG1hdGhyZWx7LX19fVwiICsgXCJ7XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIzYVxcXFxjaGFyXFxcIjIyMTJ9fVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXENvbG9uZXF7XFxkYmxjb2xvblxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcbWF0aHJlbHstfX1cblxuZGVmaW5lTWFjcm8oXCJcXFxcQ29sb25lcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXGRibGNvbG9uXFxcXG1hdGhyZWx7XFxcXG1rZXJuLTEuMm11fVxcXFxtYXRocmVsey19fX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjIzN1xcXFxjaGFyXFxcIjIyMTJ9fVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXGVxcWNvbG9uez1cXG1hdGhyZWx7XFxta2Vybi0xLjJtdX1cXHZjZW50Y29sb259XG5cbmRlZmluZU1hY3JvKFwiXFxcXGVxcWNvbG9uXCIsIFwiXFxcXGh0bWxAbWF0aG1se1wiICsgXCJcXFxcbWF0aHJlbHs9XFxcXG1hdGhyZWx7XFxcXG1rZXJuLTEuMm11fVxcXFx2Y2VudGNvbG9ufX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjI1NX19XCIpOyAvLyDiiZVcbi8vIFxccHJvdmlkZWNvbW1hbmQqXFxFcXFjb2xvbns9XFxtYXRocmVse1xcbWtlcm4tMS4ybXV9XFxkYmxjb2xvbn1cblxuZGVmaW5lTWFjcm8oXCJcXFxcRXFxY29sb25cIiwgXCJcXFxcaHRtbEBtYXRobWx7XCIgKyBcIlxcXFxtYXRocmVsez1cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXGRibGNvbG9ufX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiM2RcXFxcY2hhclxcXCIyMjM3fX1cIik7IC8vIFxccHJvdmlkZWNvbW1hbmQqXFxlcWNvbG9ue1xcbWF0aHJlbHstfVxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcdmNlbnRjb2xvbn1cblxuZGVmaW5lTWFjcm8oXCJcXFxcZXFjb2xvblwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXG1hdGhyZWx7LX1cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXHZjZW50Y29sb259fVwiICsgXCJ7XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIyMjM5fX1cIik7IC8vIFxccHJvdmlkZWNvbW1hbmQqXFxFcWNvbG9ue1xcbWF0aHJlbHstfVxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcZGJsY29sb259XG5cbmRlZmluZU1hY3JvKFwiXFxcXEVxY29sb25cIiwgXCJcXFxcaHRtbEBtYXRobWx7XCIgKyBcIlxcXFxtYXRocmVse1xcXFxtYXRocmVsey19XFxcXG1hdGhyZWx7XFxcXG1rZXJuLTEuMm11fVxcXFxkYmxjb2xvbn19XCIgKyBcIntcXFxcbWF0aG9we1xcXFxjaGFyXFxcIjIyMTJcXFxcY2hhclxcXCIyMjM3fX1cIik7IC8vIFxccHJvdmlkZWNvbW1hbmQqXFxjb2xvbmFwcHJveHtcXHZjZW50Y29sb25cXG1hdGhyZWx7XFxta2Vybi0xLjJtdX1cXGFwcHJveH1cblxuZGVmaW5lTWFjcm8oXCJcXFxcY29sb25hcHByb3hcIiwgXCJcXFxcaHRtbEBtYXRobWx7XCIgKyBcIlxcXFxtYXRocmVse1xcXFx2Y2VudGNvbG9uXFxcXG1hdGhyZWx7XFxcXG1rZXJuLTEuMm11fVxcXFxhcHByb3h9fVwiICsgXCJ7XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIzYVxcXFxjaGFyXFxcIjIyNDh9fVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXENvbG9uYXBwcm94e1xcZGJsY29sb25cXG1hdGhyZWx7XFxta2Vybi0xLjJtdX1cXGFwcHJveH1cblxuZGVmaW5lTWFjcm8oXCJcXFxcQ29sb25hcHByb3hcIiwgXCJcXFxcaHRtbEBtYXRobWx7XCIgKyBcIlxcXFxtYXRocmVse1xcXFxkYmxjb2xvblxcXFxtYXRocmVse1xcXFxta2Vybi0xLjJtdX1cXFxcYXBwcm94fX1cIiArIFwie1xcXFxtYXRob3B7XFxcXGNoYXJcXFwiMjIzN1xcXFxjaGFyXFxcIjIyNDh9fVwiKTsgLy8gXFxwcm92aWRlY29tbWFuZCpcXGNvbG9uc2lte1xcdmNlbnRjb2xvblxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcc2ltfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxjb2xvbnNpbVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXHZjZW50Y29sb25cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXHNpbX19XCIgKyBcIntcXFxcbWF0aG9we1xcXFxjaGFyXFxcIjNhXFxcXGNoYXJcXFwiMjIzY319XCIpOyAvLyBcXHByb3ZpZGVjb21tYW5kKlxcQ29sb25zaW17XFxkYmxjb2xvblxcbWF0aHJlbHtcXG1rZXJuLTEuMm11fVxcc2ltfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxDb2xvbnNpbVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhyZWx7XFxcXGRibGNvbG9uXFxcXG1hdGhyZWx7XFxcXG1rZXJuLTEuMm11fVxcXFxzaW19fVwiICsgXCJ7XFxcXG1hdGhvcHtcXFxcY2hhclxcXCIyMjM3XFxcXGNoYXJcXFwiMjIzY319XCIpOyAvLyBTb21lIFVuaWNvZGUgY2hhcmFjdGVycyBhcmUgaW1wbGVtZW50ZWQgd2l0aCBtYWNyb3MgdG8gbWF0aHRvb2xzIGZ1bmN0aW9ucy5cblxuZGVmaW5lTWFjcm8oXCJcXHUyMjM3XCIsIFwiXFxcXGRibGNvbG9uXCIpOyAvLyA6OlxuXG5kZWZpbmVNYWNybyhcIlxcdTIyMzlcIiwgXCJcXFxcZXFjb2xvblwiKTsgLy8gLTpcblxuZGVmaW5lTWFjcm8oXCJcXHUyMjU0XCIsIFwiXFxcXGNvbG9uZXFxXCIpOyAvLyA6PVxuXG5kZWZpbmVNYWNybyhcIlxcdTIyNTVcIiwgXCJcXFxcZXFxY29sb25cIik7IC8vID06XG5cbmRlZmluZU1hY3JvKFwiXFx1MkE3NFwiLCBcIlxcXFxDb2xvbmVxcVwiKTsgLy8gOjo9XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBjb2xvbmVxdWFscy5zdHlcbi8vIEFsdGVybmF0ZSBuYW1lcyBmb3IgbWF0aHRvb2xzJ3MgbWFjcm9zOlxuXG5kZWZpbmVNYWNybyhcIlxcXFxyYXRpb1wiLCBcIlxcXFx2Y2VudGNvbG9uXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcY29sb25jb2xvblwiLCBcIlxcXFxkYmxjb2xvblwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uZXF1YWxzXCIsIFwiXFxcXGNvbG9uZXFxXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcY29sb25jb2xvbmVxdWFsc1wiLCBcIlxcXFxDb2xvbmVxcVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGVxdWFsc2NvbG9uXCIsIFwiXFxcXGVxcWNvbG9uXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZXF1YWxzY29sb25jb2xvblwiLCBcIlxcXFxFcXFjb2xvblwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9ubWludXNcIiwgXCJcXFxcY29sb25lcVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uY29sb25taW51c1wiLCBcIlxcXFxDb2xvbmVxXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbWludXNjb2xvblwiLCBcIlxcXFxlcWNvbG9uXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbWludXNjb2xvbmNvbG9uXCIsIFwiXFxcXEVxY29sb25cIik7IC8vIFxcY29sb25hcHByb3ggbmFtZSBpcyBzYW1lIGluIG1hdGh0b29scyBhbmQgY29sb25lcXVhbHMuXG5cbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uY29sb25hcHByb3hcIiwgXCJcXFxcQ29sb25hcHByb3hcIik7IC8vIFxcY29sb25zaW0gbmFtZSBpcyBzYW1lIGluIG1hdGh0b29scyBhbmQgY29sb25lcXVhbHMuXG5cbmRlZmluZU1hY3JvKFwiXFxcXGNvbG9uY29sb25zaW1cIiwgXCJcXFxcQ29sb25zaW1cIik7IC8vIEFkZGl0aW9uYWwgbWFjcm9zLCBpbXBsZW1lbnRlZCBieSBhbmFsb2d5IHdpdGggbWF0aHRvb2xzIGRlZmluaXRpb25zOlxuXG5kZWZpbmVNYWNybyhcIlxcXFxzaW1jb2xvblwiLCBcIlxcXFxtYXRocmVse1xcXFxzaW1cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXHZjZW50Y29sb259XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcc2ltY29sb25jb2xvblwiLCBcIlxcXFxtYXRocmVse1xcXFxzaW1cXFxcbWF0aHJlbHtcXFxcbWtlcm4tMS4ybXV9XFxcXGRibGNvbG9ufVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGFwcHJveGNvbG9uXCIsIFwiXFxcXG1hdGhyZWx7XFxcXGFwcHJveFxcXFxtYXRocmVse1xcXFxta2Vybi0xLjJtdX1cXFxcdmNlbnRjb2xvbn1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxhcHByb3hjb2xvbmNvbG9uXCIsIFwiXFxcXG1hdGhyZWx7XFxcXGFwcHJveFxcXFxtYXRocmVse1xcXFxta2Vybi0xLjJtdX1cXFxcZGJsY29sb259XCIpOyAvLyBQcmVzZW50IGluIG5ld3R4bWF0aCwgcHhmb250cyBhbmQgdHhmb250c1xuXG5kZWZpbmVNYWNybyhcIlxcXFxub3RuaVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcbm90XFxcXG5pfXtcXFxcbWF0aHJlbHtcXFxcY2hhcmBcXHUyMjBDfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxsaW1zdXBcIiwgXCJcXFxcRE9UU0JcXFxcb3BlcmF0b3JuYW1lKntsaW1cXFxcLHN1cH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxsaW1pbmZcIiwgXCJcXFxcRE9UU0JcXFxcb3BlcmF0b3JuYW1lKntsaW1cXFxcLGluZn1cIik7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEZyb20gYW1zb3BuLnN0eVxuXG5kZWZpbmVNYWNybyhcIlxcXFxpbmpsaW1cIiwgXCJcXFxcRE9UU0JcXFxcb3BlcmF0b3JuYW1lKntpbmpcXFxcLGxpbX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxwcm9qbGltXCIsIFwiXFxcXERPVFNCXFxcXG9wZXJhdG9ybmFtZSp7cHJvalxcXFwsbGltfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHZhcmxpbXN1cFwiLCBcIlxcXFxET1RTQlxcXFxvcGVyYXRvcm5hbWUqe1xcXFxvdmVybGluZXtsaW19fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHZhcmxpbWluZlwiLCBcIlxcXFxET1RTQlxcXFxvcGVyYXRvcm5hbWUqe1xcXFx1bmRlcmxpbmV7bGltfX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJpbmpsaW1cIiwgXCJcXFxcRE9UU0JcXFxcb3BlcmF0b3JuYW1lKntcXFxcdW5kZXJyaWdodGFycm93e2xpbX19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFycHJvamxpbVwiLCBcIlxcXFxET1RTQlxcXFxvcGVyYXRvcm5hbWUqe1xcXFx1bmRlcmxlZnRhcnJvd3tsaW19fVwiKTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gTWF0aE1MIGFsdGVybmF0ZXMgZm9yIEthVGVYIGdseXBocyBpbiB0aGUgVW5pY29kZSBwcml2YXRlIGFyZWFcblxuZGVmaW5lTWFjcm8oXCJcXFxcZ3ZlcnRuZXFxXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxAZ3ZlcnRuZXFxfXtcXHUyMjY5fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGx2ZXJ0bmVxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQGx2ZXJ0bmVxcX17XFx1MjI2OH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxuZ2VxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5nZXFxfXtcXHUyMjcxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG5nZXFzbGFudFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5nZXFzbGFudH17XFx1MjI3MX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxubGVxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5sZXFxfXtcXHUyMjcwfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG5sZXFzbGFudFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5sZXFzbGFudH17XFx1MjI3MH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxuc2hvcnRtaWRcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXEBuc2hvcnRtaWR9e+KIpH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxuc2hvcnRwYXJhbGxlbFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5zaG9ydHBhcmFsbGVsfXviiKZ9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbnN1YnNldGVxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5zdWJzZXRlcXF9e1xcdTIyODh9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbnN1cHNldGVxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQG5zdXBzZXRlcXF9e1xcdTIyODl9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyc3Vic2V0bmVxXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxAdmFyc3Vic2V0bmVxfXviiop9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdmFyc3Vic2V0bmVxcVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcXFxcQHZhcnN1YnNldG5lcXF9e+Kri31cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJzdXBzZXRuZXFcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXEB2YXJzdXBzZXRuZXF9e+KKi31cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx2YXJzdXBzZXRuZXFxXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxAdmFyc3Vwc2V0bmVxcX174quMfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGltYXRoXCIsIFwiXFxcXGh0bWxAbWF0aG1se1xcXFxAaW1hdGh9e1xcdTAxMzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcam1hdGhcIiwgXCJcXFxcaHRtbEBtYXRobWx7XFxcXEBqbWF0aH17XFx1MDIzN31cIik7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHN0bWFyeXJkIGFuZCBzZW1hbnRpY1xuLy8gVGhlIHN0bWFyeXJkIGFuZCBzZW1hbnRpYyBwYWNrYWdlcyByZW5kZXIgdGhlIG5leHQgZm91ciBpdGVtcyBieSBjYWxsaW5nIGFcbi8vIGdseXBoLiBUaG9zZSBnbHlwaHMgZG8gbm90IGV4aXN0IGluIHRoZSBLYVRlWCBmb250cy4gSGVuY2UgdGhlIG1hY3Jvcy5cblxuZGVmaW5lTWFjcm8oXCJcXFxcbGxicmFja2V0XCIsIFwiXFxcXGh0bWxAbWF0aG1se1wiICsgXCJcXFxcbWF0aG9wZW57W1xcXFxta2Vybi0zLjJtdVt9fVwiICsgXCJ7XFxcXG1hdGhvcGVue1xcXFxjaGFyYFxcdTI3RTZ9fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJyYnJhY2tldFwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhjbG9zZXtdXFxcXG1rZXJuLTMuMm11XX19XCIgKyBcIntcXFxcbWF0aGNsb3Nle1xcXFxjaGFyYFxcdTI3RTd9fVwiKTtcbmRlZmluZU1hY3JvKFwiXFx1MjdFNlwiLCBcIlxcXFxsbGJyYWNrZXRcIik7IC8vIGJsYWNrYm9hcmQgYm9sZCBbXG5cbmRlZmluZU1hY3JvKFwiXFx1MjdFN1wiLCBcIlxcXFxycmJyYWNrZXRcIik7IC8vIGJsYWNrYm9hcmQgYm9sZCBdXG5cbmRlZmluZU1hY3JvKFwiXFxcXGxCcmFjZVwiLCBcIlxcXFxodG1sQG1hdGhtbHtcIiArIFwiXFxcXG1hdGhvcGVue1xcXFx7XFxcXG1rZXJuLTMuMm11W319XCIgKyBcIntcXFxcbWF0aG9wZW57XFxcXGNoYXJgXFx1Mjk4M319XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcckJyYWNlXCIsIFwiXFxcXGh0bWxAbWF0aG1se1wiICsgXCJcXFxcbWF0aGNsb3Nle11cXFxcbWtlcm4tMy4ybXVcXFxcfX19XCIgKyBcIntcXFxcbWF0aGNsb3Nle1xcXFxjaGFyYFxcdTI5ODR9fVwiKTtcbmRlZmluZU1hY3JvKFwiXFx1Mjk4M1wiLCBcIlxcXFxsQnJhY2VcIik7IC8vIGJsYWNrYm9hcmQgYm9sZCB7XG5cbmRlZmluZU1hY3JvKFwiXFx1Mjk4NFwiLCBcIlxcXFxyQnJhY2VcIik7IC8vIGJsYWNrYm9hcmQgYm9sZCB9XG4vLyBUT0RPOiBDcmVhdGUgdmFyaWFibGUgc2l6ZWQgdmVyc2lvbnMgb2YgdGhlIGxhc3QgdHdvIGl0ZW1zLiBJIGJlbGlldmUgdGhhdFxuLy8gd2lsbCByZXF1aXJlIG5ldyBmb250IGdseXBocy5cbi8vIFRoZSBzdG1hcnlyZCBmdW5jdGlvbiBgXFxtaW51c29gIHByb3ZpZGVzIGEgXCJQbGltc29sbFwiIHN5bWJvbCB0aGF0XG4vLyBzdXBlcmltcG9zZXMgdGhlIGNoYXJhY3RlcnMgXFxjaXJjIGFuZCBcXG1hdGhtaW51cy4gVXNlZCBpbiBjaGVtaXN0cnkuXG5cbmRlZmluZU1hY3JvKFwiXFxcXG1pbnVzb1wiLCBcIlxcXFxtYXRoYmlue1xcXFxodG1sQG1hdGhtbHtcIiArIFwie1xcXFxtYXRocmxhcHtcXFxcbWF0aGNob2ljZXtcXFxca2VybnswLjE0NWVtfX17XFxcXGtlcm57MC4xNDVlbX19XCIgKyBcIntcXFxca2VybnswLjEwMTVlbX19e1xcXFxrZXJuezAuMDcyNWVtfX1cXFxcY2lyY317LX19fVwiICsgXCJ7XFxcXGNoYXJg4qa1fX1cIik7XG5kZWZpbmVNYWNybyhcIuKmtVwiLCBcIlxcXFxtaW51c29cIik7IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIHRleHZjLnN0eVxuLy8gVGhlIHRleHZjIHBhY2thZ2UgY29udGFpbnMgbWFjcm9zIGF2YWlsYWJsZSBpbiBtZWRpYXdpa2kgcGFnZXMuXG4vLyBXZSBvbWl0IHRoZSBmdW5jdGlvbnMgZGVwcmVjYXRlZCBhdFxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGVscDpEaXNwbGF5aW5nX2FfZm9ybXVsYSNEZXByZWNhdGVkX3N5bnRheFxuLy8gV2UgYWxzbyBvbWl0IHRleHZjJ3MgXFxPLCB3aGljaCBjb25mbGljdHMgd2l0aCBcXHRleHR7XFxPfVxuXG5kZWZpbmVNYWNybyhcIlxcXFxkYXJyXCIsIFwiXFxcXGRvd25hcnJvd1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGRBcnJcIiwgXCJcXFxcRG93bmFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcRGFyclwiLCBcIlxcXFxEb3duYXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxsYW5nXCIsIFwiXFxcXGxhbmdsZVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJhbmdcIiwgXCJcXFxccmFuZ2xlXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdWFyclwiLCBcIlxcXFx1cGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdUFyclwiLCBcIlxcXFxVcGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcVWFyclwiLCBcIlxcXFxVcGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcTlwiLCBcIlxcXFxtYXRoYmJ7Tn1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxSXCIsIFwiXFxcXG1hdGhiYntSfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXFpcIiwgXCJcXFxcbWF0aGJie1p9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcYWxlZlwiLCBcIlxcXFxhbGVwaFwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGFsZWZzeW1cIiwgXCJcXFxcYWxlcGhcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxBbHBoYVwiLCBcIlxcXFxtYXRocm17QX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxCZXRhXCIsIFwiXFxcXG1hdGhybXtCfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGJ1bGxcIiwgXCJcXFxcYnVsbGV0XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcQ2hpXCIsIFwiXFxcXG1hdGhybXtYfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGNsdWJzXCIsIFwiXFxcXGNsdWJzdWl0XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcY251bXNcIiwgXCJcXFxcbWF0aGJie0N9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcQ29tcGxleFwiLCBcIlxcXFxtYXRoYmJ7Q31cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxEYWdnZXJcIiwgXCJcXFxcZGRhZ2dlclwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGRpYW1vbmRzXCIsIFwiXFxcXGRpYW1vbmRzdWl0XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZW1wdHlcIiwgXCJcXFxcZW1wdHlzZXRcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxFcHNpbG9uXCIsIFwiXFxcXG1hdGhybXtFfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXEV0YVwiLCBcIlxcXFxtYXRocm17SH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxleGlzdFwiLCBcIlxcXFxleGlzdHNcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxoYXJyXCIsIFwiXFxcXGxlZnRyaWdodGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcaEFyclwiLCBcIlxcXFxMZWZ0cmlnaHRhcnJvd1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXEhhcnJcIiwgXCJcXFxcTGVmdHJpZ2h0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxoZWFydHNcIiwgXCJcXFxcaGVhcnRzdWl0XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcaW1hZ2VcIiwgXCJcXFxcSW1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxpbmZpblwiLCBcIlxcXFxpbmZ0eVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXElvdGFcIiwgXCJcXFxcbWF0aHJte0l9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcaXNpblwiLCBcIlxcXFxpblwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXEthcHBhXCIsIFwiXFxcXG1hdGhybXtLfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGxhcnJcIiwgXCJcXFxcbGVmdGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbEFyclwiLCBcIlxcXFxMZWZ0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxMYXJyXCIsIFwiXFxcXExlZnRhcnJvd1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGxyYXJyXCIsIFwiXFxcXGxlZnRyaWdodGFycm93XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbHJBcnJcIiwgXCJcXFxcTGVmdHJpZ2h0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxMcmFyclwiLCBcIlxcXFxMZWZ0cmlnaHRhcnJvd1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXE11XCIsIFwiXFxcXG1hdGhybXtNfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG5hdG51bXNcIiwgXCJcXFxcbWF0aGJie059XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcTnVcIiwgXCJcXFxcbWF0aHJte059XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcT21pY3JvblwiLCBcIlxcXFxtYXRocm17T31cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxwbHVzbW5cIiwgXCJcXFxccG1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxyYXJyXCIsIFwiXFxcXHJpZ2h0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxyQXJyXCIsIFwiXFxcXFJpZ2h0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxSYXJyXCIsIFwiXFxcXFJpZ2h0YXJyb3dcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxyZWFsXCIsIFwiXFxcXFJlXCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccmVhbHNcIiwgXCJcXFxcbWF0aGJie1J9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcUmVhbHNcIiwgXCJcXFxcbWF0aGJie1J9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcUmhvXCIsIFwiXFxcXG1hdGhybXtQfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHNkb3RcIiwgXCJcXFxcY2RvdFwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHNlY3RcIiwgXCJcXFxcU1wiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHNwYWRlc1wiLCBcIlxcXFxzcGFkZXN1aXRcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxzdWJcIiwgXCJcXFxcc3Vic2V0XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcc3ViZVwiLCBcIlxcXFxzdWJzZXRlcVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHN1cGVcIiwgXCJcXFxcc3Vwc2V0ZXFcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxUYXVcIiwgXCJcXFxcbWF0aHJte1R9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdGhldGFzeW1cIiwgXCJcXFxcdmFydGhldGFcIik7IC8vIFRPRE86IGRlZmluZU1hY3JvKFwiXFxcXHZhcmNvcHBhXCIsIFwiXFxcXFxcbWJveHtcXFxcY29wcGF9XCIpO1xuXG5kZWZpbmVNYWNybyhcIlxcXFx3ZWllcnBcIiwgXCJcXFxcd3BcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxaZXRhXCIsIFwiXFxcXG1hdGhybXtafVwiKTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gc3RhdG1hdGguc3R5XG4vLyBodHRwczovL2N0YW4ubWF0aC5pbGxpbm9pcy5lZHUvbWFjcm9zL2xhdGV4L2NvbnRyaWIvc3RhdG1hdGgvc3RhdG1hdGgucGRmXG5cbmRlZmluZU1hY3JvKFwiXFxcXGFyZ21pblwiLCBcIlxcXFxET1RTQlxcXFxvcGVyYXRvcm5hbWUqe2FyZ1xcXFwsbWlufVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGFyZ21heFwiLCBcIlxcXFxET1RTQlxcXFxvcGVyYXRvcm5hbWUqe2FyZ1xcXFwsbWF4fVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHBsaW1cIiwgXCJcXFxcRE9UU0JcXFxcbWF0aG9we1xcXFxvcGVyYXRvcm5hbWV7cGxpbX19XFxcXGxpbWl0c1wiKTsgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gYnJha2V0LnN0eVxuLy8gaHR0cDovL2N0YW4ubWF0aC53YXNoaW5ndG9uLmVkdS90ZXgtYXJjaGl2ZS9tYWNyb3MvbGF0ZXgvY29udHJpYi9icmFrZXQvYnJha2V0LnBkZlxuXG5kZWZpbmVNYWNybyhcIlxcXFxicmFcIiwgXCJcXFxcbWF0aGlubmVye1xcXFxsYW5nbGV7IzF9fH1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxrZXRcIiwgXCJcXFxcbWF0aGlubmVye3x7IzF9XFxcXHJhbmdsZX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxicmFrZXRcIiwgXCJcXFxcbWF0aGlubmVye1xcXFxsYW5nbGV7IzF9XFxcXHJhbmdsZX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxCcmFcIiwgXCJcXFxcbGVmdFxcXFxsYW5nbGUjMVxcXFxyaWdodHxcIik7XG5kZWZpbmVNYWNybyhcIlxcXFxLZXRcIiwgXCJcXFxcbGVmdHwjMVxcXFxyaWdodFxcXFxyYW5nbGVcIik7XG5cbnZhciBicmFrZXRIZWxwZXIgPSBmdW5jdGlvbiBicmFrZXRIZWxwZXIob25lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBsZWZ0ID0gY29udGV4dC5jb25zdW1lQXJnKCkudG9rZW5zO1xuICAgIHZhciBtaWRkbGUgPSBjb250ZXh0LmNvbnN1bWVBcmcoKS50b2tlbnM7XG4gICAgdmFyIG1pZGRsZURvdWJsZSA9IGNvbnRleHQuY29uc3VtZUFyZygpLnRva2VucztcbiAgICB2YXIgcmlnaHQgPSBjb250ZXh0LmNvbnN1bWVBcmcoKS50b2tlbnM7XG4gICAgdmFyIG9sZE1pZGRsZSA9IGNvbnRleHQubWFjcm9zLmdldChcInxcIik7XG4gICAgdmFyIG9sZE1pZGRsZURvdWJsZSA9IGNvbnRleHQubWFjcm9zLmdldChcIlxcXFx8XCIpO1xuICAgIGNvbnRleHQubWFjcm9zLmJlZ2luR3JvdXAoKTtcblxuICAgIHZhciBtaWRNYWNybyA9IGZ1bmN0aW9uIG1pZE1hY3JvKGRvdWJsZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGlmIChvbmUpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vZGlmeSB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgfCBvciBcXHxcbiAgICAgICAgICBjb250ZXh0Lm1hY3Jvcy5zZXQoXCJ8XCIsIG9sZE1pZGRsZSk7XG5cbiAgICAgICAgICBpZiAobWlkZGxlRG91YmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGV4dC5tYWNyb3Muc2V0KFwiXFxcXHxcIiwgb2xkTWlkZGxlRG91YmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZG91YmxlZCA9IGRvdWJsZTtcblxuICAgICAgICBpZiAoIWRvdWJsZSAmJiBtaWRkbGVEb3VibGUubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gTWltaWMgXFxAaWZuZXh0Y2hhclxuICAgICAgICAgIHZhciBuZXh0VG9rZW4gPSBjb250ZXh0LmZ1dHVyZSgpO1xuXG4gICAgICAgICAgaWYgKG5leHRUb2tlbi50ZXh0ID09PSBcInxcIikge1xuICAgICAgICAgICAgY29udGV4dC5wb3BUb2tlbigpO1xuICAgICAgICAgICAgZG91YmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbnM6IGRvdWJsZWQgPyBtaWRkbGVEb3VibGUgOiBtaWRkbGUsXG4gICAgICAgICAgbnVtQXJnczogMFxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29udGV4dC5tYWNyb3Muc2V0KFwifFwiLCBtaWRNYWNybyhmYWxzZSkpO1xuXG4gICAgaWYgKG1pZGRsZURvdWJsZS5sZW5ndGgpIHtcbiAgICAgIGNvbnRleHQubWFjcm9zLnNldChcIlxcXFx8XCIsIG1pZE1hY3JvKHRydWUpKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnID0gY29udGV4dC5jb25zdW1lQXJnKCkudG9rZW5zO1xuICAgIHZhciBleHBhbmRlZCA9IGNvbnRleHQuZXhwYW5kVG9rZW5zKFtdLmNvbmNhdChyaWdodCwgYXJnLCBsZWZ0KSk7XG4gICAgY29udGV4dC5tYWNyb3MuZW5kR3JvdXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW5zOiBleHBhbmRlZC5yZXZlcnNlKCksXG4gICAgICBudW1BcmdzOiAwXG4gICAgfTtcbiAgfTtcbn07XG5cbmRlZmluZU1hY3JvKFwiXFxcXGJyYUBrZXRcIiwgYnJha2V0SGVscGVyKGZhbHNlKSk7XG5kZWZpbmVNYWNybyhcIlxcXFxicmFAc2V0XCIsIGJyYWtldEhlbHBlcih0cnVlKSk7XG5kZWZpbmVNYWNybyhcIlxcXFxCcmFrZXRcIiwgXCJcXFxcYnJhQGtldHtcXFxcbGVmdFxcXFxsYW5nbGV9XCIgKyBcIntcXFxcLFxcXFxtaWRkbGVcXFxcdmVydFxcXFwsfXtcXFxcLFxcXFxtaWRkbGVcXFxcdmVydFxcXFwsfXtcXFxccmlnaHRcXFxccmFuZ2xlfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXFNldFwiLCBcIlxcXFxicmFAc2V0e1xcXFxsZWZ0XFxcXHtcXFxcOn1cIiArIFwie1xcXFw7XFxcXG1pZGRsZVxcXFx2ZXJ0XFxcXDt9e1xcXFw7XFxcXG1pZGRsZVxcXFxWZXJ0XFxcXDt9e1xcXFw6XFxcXHJpZ2h0XFxcXH19XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcc2V0XCIsIFwiXFxcXGJyYUBzZXR7XFxcXHtcXFxcLH17XFxcXG1pZH17fXtcXFxcLFxcXFx9fVwiKTsgLy8gaGFzIG5vIHN1cHBvcnQgZm9yIHNwZWNpYWwgfHwgb3IgXFx8XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBhY3R1YXJpYWxhbmdsZS5kdHhcblxuZGVmaW5lTWFjcm8oXCJcXFxcYW5nbG5cIiwgXCJ7XFxcXGFuZ2wgbn1cIik7IC8vIEN1c3RvbSBLaGFuIEFjYWRlbXkgY29sb3JzLCBzaG91bGQgYmUgbW92ZWQgdG8gYW4gb3B0aW9uYWwgcGFja2FnZVxuXG5kZWZpbmVNYWNybyhcIlxcXFxibHVlXCIsIFwiXFxcXHRleHRjb2xvcnsjIzY0OTVlZH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcb3JhbmdlXCIsIFwiXFxcXHRleHRjb2xvcnsjI2ZmYTUwMH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccGlua1wiLCBcIlxcXFx0ZXh0Y29sb3J7IyNmZjAwYWZ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJlZFwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNkZjAwMzB9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdyZWVuXCIsIFwiXFxcXHRleHRjb2xvcnsjIzI4YWU3Yn17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZ3JheVwiLCBcIlxcXFx0ZXh0Y29sb3J7Z3JheX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccHVycGxlXCIsIFwiXFxcXHRleHRjb2xvcnsjIzlkMzhiZH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcYmx1ZUFcIiwgXCJcXFxcdGV4dGNvbG9yeyMjY2NmYWZmfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxibHVlQlwiLCBcIlxcXFx0ZXh0Y29sb3J7IyM4MGY2ZmZ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGJsdWVDXCIsIFwiXFxcXHRleHRjb2xvcnsjIzYzZDllYX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcYmx1ZURcIiwgXCJcXFxcdGV4dGNvbG9yeyMjMTFhY2NkfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxibHVlRVwiLCBcIlxcXFx0ZXh0Y29sb3J7IyMwYzdmOTl9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHRlYWxBXCIsIFwiXFxcXHRleHRjb2xvcnsjIzk0ZmZmNX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdGVhbEJcIiwgXCJcXFxcdGV4dGNvbG9yeyMjMjZlZGQ1fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFx0ZWFsQ1wiLCBcIlxcXFx0ZXh0Y29sb3J7IyMwMWQxYzF9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHRlYWxEXCIsIFwiXFxcXHRleHRjb2xvcnsjIzAxYTk5NX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcdGVhbEVcIiwgXCJcXFxcdGV4dGNvbG9yeyMjMjA4MTcwfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmVlbkFcIiwgXCJcXFxcdGV4dGNvbG9yeyMjYjZmZmIwfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmVlbkJcIiwgXCJcXFxcdGV4dGNvbG9yeyMjOGFmMjgxfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmVlbkNcIiwgXCJcXFxcdGV4dGNvbG9yeyMjNzRjZjcwfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmVlbkRcIiwgXCJcXFxcdGV4dGNvbG9yeyMjMWZhYjU0fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmVlbkVcIiwgXCJcXFxcdGV4dGNvbG9yeyMjMGQ5MjNmfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxnb2xkQVwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNmZmQwYTl9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdvbGRCXCIsIFwiXFxcXHRleHRjb2xvcnsjI2ZmYmI3MX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZ29sZENcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZmY5YzM5fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxnb2xkRFwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNlMDdkMTB9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdvbGRFXCIsIFwiXFxcXHRleHRjb2xvcnsjI2E3NWEwNX17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccmVkQVwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNmY2E5YTl9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJlZEJcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZmY4NDgyfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxyZWRDXCIsIFwiXFxcXHRleHRjb2xvcnsjI2Y5Njg1ZH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccmVkRFwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNlODRkMzl9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHJlZEVcIiwgXCJcXFxcdGV4dGNvbG9yeyMjYmMyNjEyfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxtYXJvb25BXCIsIFwiXFxcXHRleHRjb2xvcnsjI2ZmYmRlMH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbWFyb29uQlwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNmZjkyYzZ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG1hcm9vbkNcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZWQ1ZmE2fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxtYXJvb25EXCIsIFwiXFxcXHRleHRjb2xvcnsjI2NhMzM3Y317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbWFyb29uRVwiLCBcIlxcXFx0ZXh0Y29sb3J7IyM5ZTAzNGV9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHB1cnBsZUFcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZGRkN2ZmfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxwdXJwbGVCXCIsIFwiXFxcXHRleHRjb2xvcnsjI2M2YjlmY317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxccHVycGxlQ1wiLCBcIlxcXFx0ZXh0Y29sb3J7IyNhYTg3ZmZ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXHB1cnBsZURcIiwgXCJcXFxcdGV4dGNvbG9yeyMjNzg1NGFifXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxwdXJwbGVFXCIsIFwiXFxcXHRleHRjb2xvcnsjIzU0M2I3OH17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcbWludEFcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZjVmOWU4fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxtaW50QlwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNlZGYyZGZ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXG1pbnRDXCIsIFwiXFxcXHRleHRjb2xvcnsjI2UwZTVjY317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZ3JheUFcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZjZmN2Y3fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmF5QlwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNmMGYxZjJ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdyYXlDXCIsIFwiXFxcXHRleHRjb2xvcnsjI2UzZTVlNn17IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZ3JheURcIiwgXCJcXFxcdGV4dGNvbG9yeyMjZDZkOGRhfXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmF5RVwiLCBcIlxcXFx0ZXh0Y29sb3J7IyNiYWJlYzJ9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdyYXlGXCIsIFwiXFxcXHRleHRjb2xvcnsjIzg4OGQ5M317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxcZ3JheUdcIiwgXCJcXFxcdGV4dGNvbG9yeyMjNjI2NTY5fXsjMX1cIik7XG5kZWZpbmVNYWNybyhcIlxcXFxncmF5SFwiLCBcIlxcXFx0ZXh0Y29sb3J7IyMzYjNlNDB9eyMxfVwiKTtcbmRlZmluZU1hY3JvKFwiXFxcXGdyYXlJXCIsIFwiXFxcXHRleHRjb2xvcnsjIzIxMjQyY317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxca2FCbHVlXCIsIFwiXFxcXHRleHRjb2xvcnsjIzMxNDQ1M317IzF9XCIpO1xuZGVmaW5lTWFjcm8oXCJcXFxca2FHcmVlblwiLCBcIlxcXFx0ZXh0Y29sb3J7IyM3MUIzMDd9eyMxfVwiKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9NYWNyb0V4cGFuZGVyLmpzXG4vKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUg4oCcZ3VsbGV04oCdIHdoZXJlIG1hY3JvcyBhcmUgZXhwYW5kZWRcbiAqIHVudGlsIG9ubHkgbm9uLW1hY3JvIHRva2VucyByZW1haW4uXG4gKi9cblxuXG5cblxuXG5cblxuLy8gTGlzdCBvZiBjb21tYW5kcyB0aGF0IGFjdCBsaWtlIG1hY3JvcyBidXQgYXJlbid0IGRlZmluZWQgYXMgYSBtYWNybyxcbi8vIGZ1bmN0aW9uLCBvciBzeW1ib2wuICBVc2VkIGluIGBpc0RlZmluZWRgLlxudmFyIGltcGxpY2l0Q29tbWFuZHMgPSB7XG4gIFwiXlwiOiB0cnVlLFxuICAvLyBQYXJzZXIuanNcbiAgXCJfXCI6IHRydWUsXG4gIC8vIFBhcnNlci5qc1xuICBcIlxcXFxsaW1pdHNcIjogdHJ1ZSxcbiAgLy8gUGFyc2VyLmpzXG4gIFwiXFxcXG5vbGltaXRzXCI6IHRydWUgLy8gUGFyc2VyLmpzXG5cbn07XG5cbnZhciBNYWNyb0V4cGFuZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFjcm9FeHBhbmRlcihpbnB1dCwgc2V0dGluZ3MsIG1vZGUpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gdm9pZCAwO1xuICAgIHRoaXMuZXhwYW5zaW9uQ291bnQgPSB2b2lkIDA7XG4gICAgdGhpcy5sZXhlciA9IHZvaWQgMDtcbiAgICB0aGlzLm1hY3JvcyA9IHZvaWQgMDtcbiAgICB0aGlzLnN0YWNrID0gdm9pZCAwO1xuICAgIHRoaXMubW9kZSA9IHZvaWQgMDtcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5leHBhbnNpb25Db3VudCA9IDA7XG4gICAgdGhpcy5mZWVkKGlucHV0KTsgLy8gTWFrZSBuZXcgZ2xvYmFsIG5hbWVzcGFjZVxuXG4gICAgdGhpcy5tYWNyb3MgPSBuZXcgTmFtZXNwYWNlKHNyY19tYWNyb3MsIHNldHRpbmdzLm1hY3Jvcyk7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnN0YWNrID0gW107IC8vIGNvbnRhaW5zIHRva2VucyBpbiBSRVZFUlNFIG9yZGVyXG4gIH1cbiAgLyoqXG4gICAqIEZlZWQgYSBuZXcgaW5wdXQgc3RyaW5nIHRvIHRoZSBzYW1lIE1hY3JvRXhwYW5kZXJcbiAgICogKHdpdGggZXhpc3RpbmcgbWFjcm9zIGV0Yy4pLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBNYWNyb0V4cGFuZGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZmVlZCA9IGZ1bmN0aW9uIGZlZWQoaW5wdXQpIHtcbiAgICB0aGlzLmxleGVyID0gbmV3IExleGVyKGlucHV0LCB0aGlzLnNldHRpbmdzKTtcbiAgfVxuICAvKipcbiAgICogU3dpdGNoZXMgYmV0d2VlbiBcInRleHRcIiBhbmQgXCJtYXRoXCIgbW9kZXMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnN3aXRjaE1vZGUgPSBmdW5jdGlvbiBzd2l0Y2hNb2RlKG5ld01vZGUpIHtcbiAgICB0aGlzLm1vZGUgPSBuZXdNb2RlO1xuICB9XG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyBncm91cCBuZXN0aW5nIHdpdGhpbiBhbGwgbmFtZXNwYWNlcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYmVnaW5Hcm91cCA9IGZ1bmN0aW9uIGJlZ2luR3JvdXAoKSB7XG4gICAgdGhpcy5tYWNyb3MuYmVnaW5Hcm91cCgpO1xuICB9XG4gIC8qKlxuICAgKiBFbmQgY3VycmVudCBncm91cCBuZXN0aW5nIHdpdGhpbiBhbGwgbmFtZXNwYWNlcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZW5kR3JvdXAgPSBmdW5jdGlvbiBlbmRHcm91cCgpIHtcbiAgICB0aGlzLm1hY3Jvcy5lbmRHcm91cCgpO1xuICB9XG4gIC8qKlxuICAgKiBFbmRzIGFsbCBjdXJyZW50bHkgbmVzdGVkIGdyb3VwcyAoaWYgYW55KSwgcmVzdG9yaW5nIHZhbHVlcyBiZWZvcmUgdGhlXG4gICAqIGdyb3VwcyBiZWdhbi4gIFVzZWZ1bCBpbiBjYXNlIG9mIGFuIGVycm9yIGluIHRoZSBtaWRkbGUgb2YgcGFyc2luZy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZW5kR3JvdXBzID0gZnVuY3Rpb24gZW5kR3JvdXBzKCkge1xuICAgIHRoaXMubWFjcm9zLmVuZEdyb3VwcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0b3Btb3N0IHRva2VuIG9uIHRoZSBzdGFjaywgd2l0aG91dCBleHBhbmRpbmcgaXQuXG4gICAqIFNpbWlsYXIgaW4gYmVoYXZpb3IgdG8gVGVYJ3MgYFxcZnV0dXJlbGV0YC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZnV0dXJlID0gZnVuY3Rpb24gZnV0dXJlKCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wdXNoVG9rZW4odGhpcy5sZXhlci5sZXgoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIG5leHQgdW5leHBhbmRlZCB0b2tlbi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucG9wVG9rZW4gPSBmdW5jdGlvbiBwb3BUb2tlbigpIHtcbiAgICB0aGlzLmZ1dHVyZSgpOyAvLyBlbnN1cmUgbm9uLWVtcHR5IHN0YWNrXG5cbiAgICByZXR1cm4gdGhpcy5zdGFjay5wb3AoKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgZ2l2ZW4gdG9rZW4gdG8gdGhlIHRva2VuIHN0YWNrLiAgSW4gcGFydGljdWxhciwgdGhpcyBnZXQgYmUgdXNlZFxuICAgKiB0byBwdXQgYmFjayBhIHRva2VuIHJldHVybmVkIGZyb20gb25lIG9mIHRoZSBvdGhlciBtZXRob2RzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wdXNoVG9rZW4gPSBmdW5jdGlvbiBwdXNoVG9rZW4odG9rZW4pIHtcbiAgICB0aGlzLnN0YWNrLnB1c2godG9rZW4pO1xuICB9XG4gIC8qKlxuICAgKiBBcHBlbmQgYW4gYXJyYXkgb2YgdG9rZW5zIHRvIHRoZSB0b2tlbiBzdGFjay5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucHVzaFRva2VucyA9IGZ1bmN0aW9uIHB1c2hUb2tlbnModG9rZW5zKSB7XG4gICAgdmFyIF90aGlzJHN0YWNrO1xuXG4gICAgKF90aGlzJHN0YWNrID0gdGhpcy5zdGFjaykucHVzaC5hcHBseShfdGhpcyRzdGFjaywgdG9rZW5zKTtcbiAgfVxuICAvKipcbiAgICogRmluZCBhbiBtYWNybyBhcmd1bWVudCB3aXRob3V0IGV4cGFuZGluZyB0b2tlbnMgYW5kIGFwcGVuZCB0aGUgYXJyYXkgb2ZcbiAgICogdG9rZW5zIHRvIHRoZSB0b2tlbiBzdGFjay4gVXNlcyBUb2tlbiBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIHJlc3VsdC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2NhbkFyZ3VtZW50ID0gZnVuY3Rpb24gc2NhbkFyZ3VtZW50KGlzT3B0aW9uYWwpIHtcbiAgICB2YXIgc3RhcnQ7XG4gICAgdmFyIGVuZDtcbiAgICB2YXIgdG9rZW5zO1xuXG4gICAgaWYgKGlzT3B0aW9uYWwpIHtcbiAgICAgIHRoaXMuY29uc3VtZVNwYWNlcygpOyAvLyBcXEBpZm5leHRjaGFyIGdvYmJsZXMgYW55IHNwYWNlIGZvbGxvd2luZyBpdFxuXG4gICAgICBpZiAodGhpcy5mdXR1cmUoKS50ZXh0ICE9PSBcIltcIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc3RhcnQgPSB0aGlzLnBvcFRva2VuKCk7IC8vIGRvbid0IGluY2x1ZGUgWyBpbiB0b2tlbnNcblxuICAgICAgdmFyIF90aGlzJGNvbnN1bWVBcmcgPSB0aGlzLmNvbnN1bWVBcmcoW1wiXVwiXSk7XG5cbiAgICAgIHRva2VucyA9IF90aGlzJGNvbnN1bWVBcmcudG9rZW5zO1xuICAgICAgZW5kID0gX3RoaXMkY29uc3VtZUFyZy5lbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfdGhpcyRjb25zdW1lQXJnMiA9IHRoaXMuY29uc3VtZUFyZygpO1xuXG4gICAgICB0b2tlbnMgPSBfdGhpcyRjb25zdW1lQXJnMi50b2tlbnM7XG4gICAgICBzdGFydCA9IF90aGlzJGNvbnN1bWVBcmcyLnN0YXJ0O1xuICAgICAgZW5kID0gX3RoaXMkY29uc3VtZUFyZzIuZW5kO1xuICAgIH0gLy8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhbiBhcmd1bWVudFxuXG5cbiAgICB0aGlzLnB1c2hUb2tlbihuZXcgVG9rZW4oXCJFT0ZcIiwgZW5kLmxvYykpO1xuICAgIHRoaXMucHVzaFRva2Vucyh0b2tlbnMpO1xuICAgIHJldHVybiBzdGFydC5yYW5nZShlbmQsIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBDb25zdW1lIGFsbCBmb2xsb3dpbmcgc3BhY2UgdG9rZW5zLCB3aXRob3V0IGV4cGFuc2lvbi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY29uc3VtZVNwYWNlcyA9IGZ1bmN0aW9uIGNvbnN1bWVTcGFjZXMoKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIHRva2VuID0gdGhpcy5mdXR1cmUoKTtcblxuICAgICAgaWYgKHRva2VuLnRleHQgPT09IFwiIFwiKSB7XG4gICAgICAgIHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbnN1bWUgYW4gYXJndW1lbnQgZnJvbSB0aGUgdG9rZW4gc3RyZWFtLCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgYXJyYXlcbiAgICogb2YgdG9rZW5zIGFuZCBzdGFydC9lbmQgdG9rZW4uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmNvbnN1bWVBcmcgPSBmdW5jdGlvbiBjb25zdW1lQXJnKGRlbGltcykge1xuICAgIC8vIFRoZSBhcmd1bWVudCBmb3IgYSBkZWxpbWl0ZWQgcGFyYW1ldGVyIGlzIHRoZSBzaG9ydGVzdCAocG9zc2libHlcbiAgICAvLyBlbXB0eSkgc2VxdWVuY2Ugb2YgdG9rZW5zIHdpdGggcHJvcGVybHkgbmVzdGVkIHsuLi59IGdyb3VwcyB0aGF0IGlzXG4gICAgLy8gZm9sbG93ZWQgLi4uIGJ5IHRoaXMgcGFydGljdWxhciBsaXN0IG9mIG5vbi1wYXJhbWV0ZXIgdG9rZW5zLlxuICAgIC8vIFRoZSBhcmd1bWVudCBmb3IgYW4gdW5kZWxpbWl0ZWQgcGFyYW1ldGVyIGlzIHRoZSBuZXh0IG5vbmJsYW5rXG4gICAgLy8gdG9rZW4sIHVubGVzcyB0aGF0IHRva2VuIGlzIOKAmHvigJksIHdoZW4gdGhlIGFyZ3VtZW50IHdpbGwgYmUgdGhlXG4gICAgLy8gZW50aXJlIHsuLi59IGdyb3VwIHRoYXQgZm9sbG93cy5cbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIGlzRGVsaW1pdGVkID0gZGVsaW1zICYmIGRlbGltcy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKCFpc0RlbGltaXRlZCkge1xuICAgICAgLy8gSWdub3JlIHNwYWNlcyBiZXR3ZWVuIGFyZ3VtZW50cy4gIEFzIHRoZSBUZVhib29rIHNheXM6XG4gICAgICAvLyBcIkFmdGVyIHlvdSBoYXZlIHNhaWQg4oCYXFxkZWZcXHJvdyMxIzJ7Li4ufeKAmSwgeW91IGFyZSBhbGxvd2VkIHRvXG4gICAgICAvLyAgcHV0IHNwYWNlcyBiZXR3ZWVuIHRoZSBhcmd1bWVudHMgKGUuZy4sIOKAmFxccm93IHggbuKAmSksIGJlY2F1c2VcbiAgICAgIC8vICBUZVggZG9lc27igJl0IHVzZSBzaW5nbGUgc3BhY2VzIGFzIHVuZGVsaW1pdGVkIGFyZ3VtZW50cy5cIlxuICAgICAgdGhpcy5jb25zdW1lU3BhY2VzKCk7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5mdXR1cmUoKTtcbiAgICB2YXIgdG9rO1xuICAgIHZhciBkZXB0aCA9IDA7XG4gICAgdmFyIG1hdGNoID0gMDtcblxuICAgIGRvIHtcbiAgICAgIHRvayA9IHRoaXMucG9wVG9rZW4oKTtcbiAgICAgIHRva2Vucy5wdXNoKHRvayk7XG5cbiAgICAgIGlmICh0b2sudGV4dCA9PT0gXCJ7XCIpIHtcbiAgICAgICAgKytkZXB0aDtcbiAgICAgIH0gZWxzZSBpZiAodG9rLnRleHQgPT09IFwifVwiKSB7XG4gICAgICAgIC0tZGVwdGg7XG5cbiAgICAgICAgaWYgKGRlcHRoID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkV4dHJhIH1cIiwgdG9rKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0b2sudGV4dCA9PT0gXCJFT0ZcIikge1xuICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBpbiBhIG1hY3JvIGFyZ3VtZW50XCIgKyBcIiwgZXhwZWN0ZWQgJ1wiICsgKGRlbGltcyAmJiBpc0RlbGltaXRlZCA/IGRlbGltc1ttYXRjaF0gOiBcIn1cIikgKyBcIidcIiwgdG9rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbGltcyAmJiBpc0RlbGltaXRlZCkge1xuICAgICAgICBpZiAoKGRlcHRoID09PSAwIHx8IGRlcHRoID09PSAxICYmIGRlbGltc1ttYXRjaF0gPT09IFwie1wiKSAmJiB0b2sudGV4dCA9PT0gZGVsaW1zW21hdGNoXSkge1xuICAgICAgICAgICsrbWF0Y2g7XG5cbiAgICAgICAgICBpZiAobWF0Y2ggPT09IGRlbGltcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgZGVsaW1zIGluIHRva2Vuc1xuICAgICAgICAgICAgdG9rZW5zLnNwbGljZSgtbWF0Y2gsIG1hdGNoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRjaCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlIChkZXB0aCAhPT0gMCB8fCBpc0RlbGltaXRlZCk7IC8vIElmIHRoZSBhcmd1bWVudCBmb3VuZCAuLi4gaGFzIHRoZSBmb3JtIOKAmHs8bmVzdGVkIHRva2Vucz594oCZLFxuICAgIC8vIC4uLiB0aGUgb3V0ZXJtb3N0IGJyYWNlcyBlbmNsb3NpbmcgdGhlIGFyZ3VtZW50IGFyZSByZW1vdmVkXG5cblxuICAgIGlmIChzdGFydC50ZXh0ID09PSBcIntcIiAmJiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnRleHQgPT09IFwifVwiKSB7XG4gICAgICB0b2tlbnMucG9wKCk7XG4gICAgICB0b2tlbnMuc2hpZnQoKTtcbiAgICB9XG5cbiAgICB0b2tlbnMucmV2ZXJzZSgpOyAvLyB0byBmaXQgaW4gd2l0aCBzdGFjayBvcmRlclxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgZW5kOiB0b2tcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDb25zdW1lIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIChkZWxpbWl0ZWQpIGFyZ3VtZW50cyBmcm9tIHRoZSB0b2tlblxuICAgKiBzdHJlYW0gYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY29uc3VtZUFyZ3MgPSBmdW5jdGlvbiBjb25zdW1lQXJncyhudW1BcmdzLCBkZWxpbWl0ZXJzKSB7XG4gICAgaWYgKGRlbGltaXRlcnMpIHtcbiAgICAgIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCAhPT0gbnVtQXJncyArIDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiVGhlIGxlbmd0aCBvZiBkZWxpbWl0ZXJzIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiBhcmdzIVwiKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlbGltcyA9IGRlbGltaXRlcnNbMF07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b2sgPSB0aGlzLnBvcFRva2VuKCk7XG5cbiAgICAgICAgaWYgKGRlbGltc1tpXSAhPT0gdG9rLnRleHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJVc2Ugb2YgdGhlIG1hY3JvIGRvZXNuJ3QgbWF0Y2ggaXRzIGRlZmluaXRpb25cIiwgdG9rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtQXJnczsgX2krKykge1xuICAgICAgYXJncy5wdXNoKHRoaXMuY29uc3VtZUFyZyhkZWxpbWl0ZXJzICYmIGRlbGltaXRlcnNbX2kgKyAxXSkudG9rZW5zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfVxuICAvKipcbiAgICogRXhwYW5kIHRoZSBuZXh0IHRva2VuIG9ubHkgb25jZSBpZiBwb3NzaWJsZS5cbiAgICpcbiAgICogSWYgdGhlIHRva2VuIGlzIGV4cGFuZGVkLCB0aGUgcmVzdWx0aW5nIHRva2VucyB3aWxsIGJlIHB1c2hlZCBvbnRvXG4gICAqIHRoZSBzdGFjayBpbiByZXZlcnNlIG9yZGVyIGFuZCB3aWxsIGJlIHJldHVybmVkIGFzIGFuIGFycmF5LFxuICAgKiBhbHNvIGluIHJldmVyc2Ugb3JkZXIuXG4gICAqXG4gICAqIElmIG5vdCwgdGhlIG5leHQgdG9rZW4gd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0IHJlbW92aW5nIGl0XG4gICAqIGZyb20gdGhlIHN0YWNrLiAgVGhpcyBjYXNlIGNhbiBiZSBkZXRlY3RlZCBieSBhIGBUb2tlbmAgcmV0dXJuIHZhbHVlXG4gICAqIGluc3RlYWQgb2YgYW4gYEFycmF5YCByZXR1cm4gdmFsdWUuXG4gICAqXG4gICAqIEluIGVpdGhlciBjYXNlLCB0aGUgbmV4dCB0b2tlbiB3aWxsIGJlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLFxuICAgKiBvciB0aGUgc3RhY2sgd2lsbCBiZSBlbXB0eS5cbiAgICpcbiAgICogVXNlZCB0byBpbXBsZW1lbnQgYGV4cGFuZEFmdGVyRnV0dXJlYCBhbmQgYGV4cGFuZE5leHRUb2tlbmAuXG4gICAqXG4gICAqIElmIGV4cGFuZGFibGVPbmx5LCBvbmx5IGV4cGFuZGFibGUgdG9rZW5zIGFyZSBleHBhbmRlZCBhbmRcbiAgICogYW4gdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UgcmVzdWx0cyBpbiBhbiBlcnJvci5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZXhwYW5kT25jZSA9IGZ1bmN0aW9uIGV4cGFuZE9uY2UoZXhwYW5kYWJsZU9ubHkpIHtcbiAgICB2YXIgdG9wVG9rZW4gPSB0aGlzLnBvcFRva2VuKCk7XG4gICAgdmFyIG5hbWUgPSB0b3BUb2tlbi50ZXh0O1xuICAgIHZhciBleHBhbnNpb24gPSAhdG9wVG9rZW4ubm9leHBhbmQgPyB0aGlzLl9nZXRFeHBhbnNpb24obmFtZSkgOiBudWxsO1xuXG4gICAgaWYgKGV4cGFuc2lvbiA9PSBudWxsIHx8IGV4cGFuZGFibGVPbmx5ICYmIGV4cGFuc2lvbi51bmV4cGFuZGFibGUpIHtcbiAgICAgIGlmIChleHBhbmRhYmxlT25seSAmJiBleHBhbnNpb24gPT0gbnVsbCAmJiBuYW1lWzBdID09PSBcIlxcXFxcIiAmJiAhdGhpcy5pc0RlZmluZWQobmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiVW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2U6IFwiICsgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVzaFRva2VuKHRvcFRva2VuKTtcbiAgICAgIHJldHVybiB0b3BUb2tlbjtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGFuc2lvbkNvdW50Kys7XG5cbiAgICBpZiAodGhpcy5leHBhbnNpb25Db3VudCA+IHRoaXMuc2V0dGluZ3MubWF4RXhwYW5kKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJUb28gbWFueSBleHBhbnNpb25zOiBpbmZpbml0ZSBsb29wIG9yIFwiICsgXCJuZWVkIHRvIGluY3JlYXNlIG1heEV4cGFuZCBzZXR0aW5nXCIpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSBleHBhbnNpb24udG9rZW5zO1xuICAgIHZhciBhcmdzID0gdGhpcy5jb25zdW1lQXJncyhleHBhbnNpb24ubnVtQXJncywgZXhwYW5zaW9uLmRlbGltaXRlcnMpO1xuXG4gICAgaWYgKGV4cGFuc2lvbi5udW1BcmdzKSB7XG4gICAgICAvLyBwYXN0ZSBhcmd1bWVudHMgaW4gcGxhY2Ugb2YgdGhlIHBsYWNlaG9sZGVyc1xuICAgICAgdG9rZW5zID0gdG9rZW5zLnNsaWNlKCk7IC8vIG1ha2UgYSBzaGFsbG93IGNvcHlcblxuICAgICAgZm9yICh2YXIgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgdG9rID0gdG9rZW5zW2ldO1xuXG4gICAgICAgIGlmICh0b2sudGV4dCA9PT0gXCIjXCIpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW5jb21wbGV0ZSBwbGFjZWhvbGRlciBhdCBlbmQgb2YgbWFjcm8gYm9keVwiLCB0b2spO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRvayA9IHRva2Vuc1stLWldOyAvLyBuZXh0IHRva2VuIG9uIHN0YWNrXG5cbiAgICAgICAgICBpZiAodG9rLnRleHQgPT09IFwiI1wiKSB7XG4gICAgICAgICAgICAvLyAjIyDihpIgI1xuICAgICAgICAgICAgdG9rZW5zLnNwbGljZShpICsgMSwgMSk7IC8vIGRyb3AgZmlyc3QgI1xuICAgICAgICAgIH0gZWxzZSBpZiAoL15bMS05XSQvLnRlc3QodG9rLnRleHQpKSB7XG4gICAgICAgICAgICB2YXIgX3Rva2VucztcblxuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgaW5kaWNhdGVkIGFyZ3VtZW50XG4gICAgICAgICAgICAoX3Rva2VucyA9IHRva2Vucykuc3BsaWNlLmFwcGx5KF90b2tlbnMsIFtpLCAyXS5jb25jYXQoYXJnc1srdG9rLnRleHQgLSAxXSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJOb3QgYSB2YWxpZCBhcmd1bWVudCBudW1iZXJcIiwgdG9rKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIENvbmNhdGVuYXRlIGV4cGFuc2lvbiBvbnRvIHRvcCBvZiBzdGFjay5cblxuXG4gICAgdGhpcy5wdXNoVG9rZW5zKHRva2Vucyk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuICAvKipcbiAgICogRXhwYW5kIHRoZSBuZXh0IHRva2VuIG9ubHkgb25jZSAoaWYgcG9zc2libGUpLCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmdcbiAgICogdG9wIHRva2VuIG9uIHRoZSBzdGFjayAod2l0aG91dCByZW1vdmluZyBhbnl0aGluZyBmcm9tIHRoZSBzdGFjaykuXG4gICAqIFNpbWlsYXIgaW4gYmVoYXZpb3IgdG8gVGVYJ3MgYFxcZXhwYW5kYWZ0ZXJcXGZ1dHVyZWxldGAuXG4gICAqIEVxdWl2YWxlbnQgdG8gZXhwYW5kT25jZSgpIGZvbGxvd2VkIGJ5IGZ1dHVyZSgpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5leHBhbmRBZnRlckZ1dHVyZSA9IGZ1bmN0aW9uIGV4cGFuZEFmdGVyRnV0dXJlKCkge1xuICAgIHRoaXMuZXhwYW5kT25jZSgpO1xuICAgIHJldHVybiB0aGlzLmZ1dHVyZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBleHBhbmQgZmlyc3QgdG9rZW4sIHRoZW4gcmV0dXJuIGZpcnN0IG5vbi1leHBhbmRhYmxlIHRva2VuLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5leHBhbmROZXh0VG9rZW4gPSBmdW5jdGlvbiBleHBhbmROZXh0VG9rZW4oKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIGV4cGFuZGVkID0gdGhpcy5leHBhbmRPbmNlKCk7IC8vIGV4cGFuZE9uY2UgcmV0dXJucyBUb2tlbiBpZiBhbmQgb25seSBpZiBpdCdzIGZ1bGx5IGV4cGFuZGVkLlxuXG4gICAgICBpZiAoZXhwYW5kZWQgaW5zdGFuY2VvZiBUb2tlbikge1xuICAgICAgICAvLyB0aGUgdG9rZW4gYWZ0ZXIgXFxub2V4cGFuZCBpcyBpbnRlcnByZXRlZCBhcyBpZiBpdHMgbWVhbmluZ1xuICAgICAgICAvLyB3ZXJlIOKAmFxccmVsYXjigJlcbiAgICAgICAgaWYgKGV4cGFuZGVkLnRyZWF0QXNSZWxheCkge1xuICAgICAgICAgIGV4cGFuZGVkLnRleHQgPSBcIlxcXFxyZWxheFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7IC8vID09PSBleHBhbmRlZFxuICAgICAgfVxuICAgIH0gLy8gRmxvdyB1bmFibGUgdG8gZmlndXJlIG91dCB0aGF0IHRoaXMgcGF0aHdheSBpcyBpbXBvc3NpYmxlLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80ODA4XG5cblxuICAgIHRocm93IG5ldyBFcnJvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVucmVhY2hhYmxlXG4gIH1cbiAgLyoqXG4gICAqIEZ1bGx5IGV4cGFuZCB0aGUgZ2l2ZW4gbWFjcm8gbmFtZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgbGlzdCBvZlxuICAgKiB0b2tlbnMsIG9yIHJldHVybiBgdW5kZWZpbmVkYCBpZiBubyBzdWNoIG1hY3JvIGlzIGRlZmluZWQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmV4cGFuZE1hY3JvID0gZnVuY3Rpb24gZXhwYW5kTWFjcm8obmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hY3Jvcy5oYXMobmFtZSkgPyB0aGlzLmV4cGFuZFRva2VucyhbbmV3IFRva2VuKG5hbWUpXSkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEZ1bGx5IGV4cGFuZCB0aGUgZ2l2ZW4gdG9rZW4gc3RyZWFtIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBsaXN0IG9mXG4gICAqIHRva2Vucy4gIE5vdGUgdGhhdCB0aGUgaW5wdXQgdG9rZW5zIGFyZSBpbiByZXZlcnNlIG9yZGVyLCBidXQgdGhlXG4gICAqIG91dHB1dCB0b2tlbnMgYXJlIGluIGZvcndhcmQgb3JkZXIuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmV4cGFuZFRva2VucyA9IGZ1bmN0aW9uIGV4cGFuZFRva2Vucyh0b2tlbnMpIHtcbiAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgdmFyIG9sZFN0YWNrTGVuZ3RoID0gdGhpcy5zdGFjay5sZW5ndGg7XG4gICAgdGhpcy5wdXNoVG9rZW5zKHRva2Vucyk7XG5cbiAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiBvbGRTdGFja0xlbmd0aCkge1xuICAgICAgdmFyIGV4cGFuZGVkID0gdGhpcy5leHBhbmRPbmNlKHRydWUpOyAvLyBleHBhbmQgb25seSBleHBhbmRhYmxlIHRva2Vuc1xuICAgICAgLy8gZXhwYW5kT25jZSByZXR1cm5zIFRva2VuIGlmIGFuZCBvbmx5IGlmIGl0J3MgZnVsbHkgZXhwYW5kZWQuXG5cbiAgICAgIGlmIChleHBhbmRlZCBpbnN0YW5jZW9mIFRva2VuKSB7XG4gICAgICAgIGlmIChleHBhbmRlZC50cmVhdEFzUmVsYXgpIHtcbiAgICAgICAgICAvLyB0aGUgZXhwYW5zaW9uIG9mIFxcbm9leHBhbmQgaXMgdGhlIHRva2VuIGl0c2VsZlxuICAgICAgICAgIGV4cGFuZGVkLm5vZXhwYW5kID0gZmFsc2U7XG4gICAgICAgICAgZXhwYW5kZWQudHJlYXRBc1JlbGF4ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQucHVzaCh0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIC8qKlxuICAgKiBGdWxseSBleHBhbmQgdGhlIGdpdmVuIG1hY3JvIG5hbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLFxuICAgKiBvciByZXR1cm4gYHVuZGVmaW5lZGAgaWYgbm8gc3VjaCBtYWNybyBpcyBkZWZpbmVkLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5leHBhbmRNYWNyb0FzVGV4dCA9IGZ1bmN0aW9uIGV4cGFuZE1hY3JvQXNUZXh0KG5hbWUpIHtcbiAgICB2YXIgdG9rZW5zID0gdGhpcy5leHBhbmRNYWNybyhuYW1lKTtcblxuICAgIGlmICh0b2tlbnMpIHtcbiAgICAgIHJldHVybiB0b2tlbnMubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4udGV4dDtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleHBhbmRlZCBtYWNybyBhcyBhIHJldmVyc2VkIGFycmF5IG9mIHRva2VucyBhbmQgYSBtYWNyb1xuICAgKiBhcmd1bWVudCBjb3VudC4gIE9yIHJldHVybnMgYG51bGxgIGlmIG5vIHN1Y2ggbWFjcm8uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9nZXRFeHBhbnNpb24gPSBmdW5jdGlvbiBfZ2V0RXhwYW5zaW9uKG5hbWUpIHtcbiAgICB2YXIgZGVmaW5pdGlvbiA9IHRoaXMubWFjcm9zLmdldChuYW1lKTtcblxuICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIG1haW5seSBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGhlcmVcbiAgICAgIHJldHVybiBkZWZpbml0aW9uO1xuICAgIH0gLy8gSWYgYSBzaW5nbGUgY2hhcmFjdGVyIGhhcyBhbiBhc3NvY2lhdGVkIGNhdGNvZGUgb3RoZXIgdGhhbiAxM1xuICAgIC8vIChhY3RpdmUgY2hhcmFjdGVyKSwgdGhlbiBkb24ndCBleHBhbmQgaXQuXG5cblxuICAgIGlmIChuYW1lLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNhdGNvZGUgPSB0aGlzLmxleGVyLmNhdGNvZGVzW25hbWVdO1xuXG4gICAgICBpZiAoY2F0Y29kZSAhPSBudWxsICYmIGNhdGNvZGUgIT09IDEzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZXhwYW5zaW9uID0gdHlwZW9mIGRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIiA/IGRlZmluaXRpb24odGhpcykgOiBkZWZpbml0aW9uO1xuXG4gICAgaWYgKHR5cGVvZiBleHBhbnNpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhciBudW1BcmdzID0gMDtcblxuICAgICAgaWYgKGV4cGFuc2lvbi5pbmRleE9mKFwiI1wiKSAhPT0gLTEpIHtcbiAgICAgICAgdmFyIHN0cmlwcGVkID0gZXhwYW5zaW9uLnJlcGxhY2UoLyMjL2csIFwiXCIpO1xuXG4gICAgICAgIHdoaWxlIChzdHJpcHBlZC5pbmRleE9mKFwiI1wiICsgKG51bUFyZ3MgKyAxKSkgIT09IC0xKSB7XG4gICAgICAgICAgKytudW1BcmdzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBib2R5TGV4ZXIgPSBuZXcgTGV4ZXIoZXhwYW5zaW9uLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgIHZhciB0b2tlbnMgPSBbXTtcbiAgICAgIHZhciB0b2sgPSBib2R5TGV4ZXIubGV4KCk7XG5cbiAgICAgIHdoaWxlICh0b2sudGV4dCAhPT0gXCJFT0ZcIikge1xuICAgICAgICB0b2tlbnMucHVzaCh0b2spO1xuICAgICAgICB0b2sgPSBib2R5TGV4ZXIubGV4KCk7XG4gICAgICB9XG5cbiAgICAgIHRva2Vucy5yZXZlcnNlKCk7IC8vIHRvIGZpdCBpbiB3aXRoIHN0YWNrIHVzaW5nIHB1c2ggYW5kIHBvcFxuXG4gICAgICB2YXIgZXhwYW5kZWQgPSB7XG4gICAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgICBudW1BcmdzOiBudW1BcmdzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGV4cGFuZGVkO1xuICAgIH1cblxuICAgIHJldHVybiBleHBhbnNpb247XG4gIH1cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIGEgY29tbWFuZCBpcyBjdXJyZW50bHkgXCJkZWZpbmVkXCIgKGhhcyBzb21lXG4gICAqIGZ1bmN0aW9uYWxpdHkpLCBtZWFuaW5nIHRoYXQgaXQncyBhIG1hY3JvIChpbiB0aGUgY3VycmVudCBncm91cCksXG4gICAqIGEgZnVuY3Rpb24sIGEgc3ltYm9sLCBvciBvbmUgb2YgdGhlIHNwZWNpYWwgY29tbWFuZHMgbGlzdGVkIGluXG4gICAqIGBpbXBsaWNpdENvbW1hbmRzYC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaXNEZWZpbmVkID0gZnVuY3Rpb24gaXNEZWZpbmVkKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5tYWNyb3MuaGFzKG5hbWUpIHx8IHNyY19mdW5jdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgc3JjX3N5bWJvbHMubWF0aC5oYXNPd25Qcm9wZXJ0eShuYW1lKSB8fCBzcmNfc3ltYm9scy50ZXh0Lmhhc093blByb3BlcnR5KG5hbWUpIHx8IGltcGxpY2l0Q29tbWFuZHMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIGEgY29tbWFuZCBpcyBleHBhbmRhYmxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pc0V4cGFuZGFibGUgPSBmdW5jdGlvbiBpc0V4cGFuZGFibGUobmFtZSkge1xuICAgIHZhciBtYWNybyA9IHRoaXMubWFjcm9zLmdldChuYW1lKTtcbiAgICByZXR1cm4gbWFjcm8gIT0gbnVsbCA/IHR5cGVvZiBtYWNybyA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgbWFjcm8gPT09IFwiZnVuY3Rpb25cIiB8fCAhbWFjcm8udW5leHBhbmRhYmxlIDogc3JjX2Z1bmN0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiAhc3JjX2Z1bmN0aW9uc1tuYW1lXS5wcmltaXRpdmU7XG4gIH07XG5cbiAgcmV0dXJuIE1hY3JvRXhwYW5kZXI7XG59KCk7XG5cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3VuaWNvZGVTdXBPclN1Yi5qc1xuLy8gSGVscGVycyBmb3IgUGFyc2VyLmpzIGhhbmRsaW5nIG9mIFVuaWNvZGUgKHN1YnxzdXBlcilzY3JpcHQgY2hhcmFjdGVycy5cbnZhciB1bmljb2RlU3ViUmVnRXggPSAvXlvigorigovigozigo3igo7igoDigoHigoLigoPigoTigoXigobigofigojigonigpDigpHigpXhtaLisbzigpbigpfigpjigpnigpLigprhtaPigpvigpzhtaThtaXigpPhtabhtafhtajhtanhtapdLztcbnZhciB1U3Vic0FuZFN1cHMgPSBPYmplY3QuZnJlZXplKHtcbiAgJ+KCiic6ICcrJyxcbiAgJ+KCiyc6ICctJyxcbiAgJ+KCjCc6ICc9JyxcbiAgJ+KCjSc6ICcoJyxcbiAgJ+KCjic6ICcpJyxcbiAgJ+KCgCc6ICcwJyxcbiAgJ+KCgSc6ICcxJyxcbiAgJ+KCgic6ICcyJyxcbiAgJ+KCgyc6ICczJyxcbiAgJ+KChCc6ICc0JyxcbiAgJ+KChSc6ICc1JyxcbiAgJ+KChic6ICc2JyxcbiAgJ+KChyc6ICc3JyxcbiAgJ+KCiCc6ICc4JyxcbiAgJ+KCiSc6ICc5JyxcbiAgXCJcXHUyMDkwXCI6ICdhJyxcbiAgXCJcXHUyMDkxXCI6ICdlJyxcbiAgXCJcXHUyMDk1XCI6ICdoJyxcbiAgXCJcXHUxRDYyXCI6ICdpJyxcbiAgXCJcXHUyQzdDXCI6ICdqJyxcbiAgXCJcXHUyMDk2XCI6ICdrJyxcbiAgXCJcXHUyMDk3XCI6ICdsJyxcbiAgXCJcXHUyMDk4XCI6ICdtJyxcbiAgXCJcXHUyMDk5XCI6ICduJyxcbiAgXCJcXHUyMDkyXCI6ICdvJyxcbiAgXCJcXHUyMDlBXCI6ICdwJyxcbiAgXCJcXHUxRDYzXCI6ICdyJyxcbiAgXCJcXHUyMDlCXCI6ICdzJyxcbiAgXCJcXHUyMDlDXCI6ICd0JyxcbiAgXCJcXHUxRDY0XCI6ICd1JyxcbiAgXCJcXHUxRDY1XCI6ICd2JyxcbiAgXCJcXHUyMDkzXCI6ICd4JyxcbiAgXCJcXHUxRDY2XCI6ICfOsicsXG4gIFwiXFx1MUQ2N1wiOiAnzrMnLFxuICBcIlxcdTFENjhcIjogJ8+BJyxcbiAgXCJcXHUxRDY5XCI6IFwiXFx1MDNENVwiLFxuICBcIlxcdTFENkFcIjogJ8+HJyxcbiAgJ+KBuic6ICcrJyxcbiAgJ+KBuyc6ICctJyxcbiAgJ+KBvCc6ICc9JyxcbiAgJ+KBvSc6ICcoJyxcbiAgJ+KBvic6ICcpJyxcbiAgJ+KBsCc6ICcwJyxcbiAgJ8K5JzogJzEnLFxuICAnwrInOiAnMicsXG4gICfCsyc6ICczJyxcbiAgJ+KBtCc6ICc0JyxcbiAgJ+KBtSc6ICc1JyxcbiAgJ+KBtic6ICc2JyxcbiAgJ+KBtyc6ICc3JyxcbiAgJ+KBuCc6ICc4JyxcbiAgJ+KBuSc6ICc5JyxcbiAgXCJcXHUxRDJDXCI6ICdBJyxcbiAgXCJcXHUxRDJFXCI6ICdCJyxcbiAgXCJcXHUxRDMwXCI6ICdEJyxcbiAgXCJcXHUxRDMxXCI6ICdFJyxcbiAgXCJcXHUxRDMzXCI6ICdHJyxcbiAgXCJcXHUxRDM0XCI6ICdIJyxcbiAgXCJcXHUxRDM1XCI6ICdJJyxcbiAgXCJcXHUxRDM2XCI6ICdKJyxcbiAgXCJcXHUxRDM3XCI6ICdLJyxcbiAgXCJcXHUxRDM4XCI6ICdMJyxcbiAgXCJcXHUxRDM5XCI6ICdNJyxcbiAgXCJcXHUxRDNBXCI6ICdOJyxcbiAgXCJcXHUxRDNDXCI6ICdPJyxcbiAgXCJcXHUxRDNFXCI6ICdQJyxcbiAgXCJcXHUxRDNGXCI6ICdSJyxcbiAgXCJcXHUxRDQwXCI6ICdUJyxcbiAgXCJcXHUxRDQxXCI6ICdVJyxcbiAgXCJcXHUyQzdEXCI6ICdWJyxcbiAgXCJcXHUxRDQyXCI6ICdXJyxcbiAgXCJcXHUxRDQzXCI6ICdhJyxcbiAgXCJcXHUxRDQ3XCI6ICdiJyxcbiAgXCJcXHUxRDlDXCI6ICdjJyxcbiAgXCJcXHUxRDQ4XCI6ICdkJyxcbiAgXCJcXHUxRDQ5XCI6ICdlJyxcbiAgXCJcXHUxREEwXCI6ICdmJyxcbiAgXCJcXHUxRDREXCI6ICdnJyxcbiAgXCJcXHUwMkIwXCI6ICdoJyxcbiAgXCJcXHUyMDcxXCI6ICdpJyxcbiAgXCJcXHUwMkIyXCI6ICdqJyxcbiAgXCJcXHUxRDRGXCI6ICdrJyxcbiAgXCJcXHUwMkUxXCI6ICdsJyxcbiAgXCJcXHUxRDUwXCI6ICdtJyxcbiAgXCJcXHUyMDdGXCI6ICduJyxcbiAgXCJcXHUxRDUyXCI6ICdvJyxcbiAgXCJcXHUxRDU2XCI6ICdwJyxcbiAgXCJcXHUwMkIzXCI6ICdyJyxcbiAgXCJcXHUwMkUyXCI6ICdzJyxcbiAgXCJcXHUxRDU3XCI6ICd0JyxcbiAgXCJcXHUxRDU4XCI6ICd1JyxcbiAgXCJcXHUxRDVCXCI6ICd2JyxcbiAgXCJcXHUwMkI3XCI6ICd3JyxcbiAgXCJcXHUwMkUzXCI6ICd4JyxcbiAgXCJcXHUwMkI4XCI6ICd5JyxcbiAgXCJcXHUxREJCXCI6ICd6JyxcbiAgXCJcXHUxRDVEXCI6ICfOsicsXG4gIFwiXFx1MUQ1RVwiOiAnzrMnLFxuICBcIlxcdTFENUZcIjogJ860JyxcbiAgXCJcXHUxRDYwXCI6IFwiXFx1MDNENVwiLFxuICBcIlxcdTFENjFcIjogJ8+HJyxcbiAgXCJcXHUxREJGXCI6ICfOuCdcbn0pO1xuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL1BhcnNlci5qc1xuLyogZXNsaW50IG5vLWNvbnN0YW50LWNvbmRpdGlvbjowICovXG5cblxuXG5cblxuXG5cblxuXG5cbiAvLyBQcmUtZXZhbHVhdGUgYm90aCBtb2R1bGVzIGFzIHVuaWNvZGVTeW1ib2xzIHJlcXVpcmUgU3RyaW5nLm5vcm1hbGl6ZSgpXG5cbnZhciB1bmljb2RlQWNjZW50cyA9IHtcbiAgXCLMgVwiOiB7XG4gICAgXCJ0ZXh0XCI6IFwiXFxcXCdcIixcbiAgICBcIm1hdGhcIjogXCJcXFxcYWN1dGVcIlxuICB9LFxuICBcIsyAXCI6IHtcbiAgICBcInRleHRcIjogXCJcXFxcYFwiLFxuICAgIFwibWF0aFwiOiBcIlxcXFxncmF2ZVwiXG4gIH0sXG4gIFwizIhcIjoge1xuICAgIFwidGV4dFwiOiBcIlxcXFxcXFwiXCIsXG4gICAgXCJtYXRoXCI6IFwiXFxcXGRkb3RcIlxuICB9LFxuICBcIsyDXCI6IHtcbiAgICBcInRleHRcIjogXCJcXFxcflwiLFxuICAgIFwibWF0aFwiOiBcIlxcXFx0aWxkZVwiXG4gIH0sXG4gIFwizIRcIjoge1xuICAgIFwidGV4dFwiOiBcIlxcXFw9XCIsXG4gICAgXCJtYXRoXCI6IFwiXFxcXGJhclwiXG4gIH0sXG4gIFwizIZcIjoge1xuICAgIFwidGV4dFwiOiBcIlxcXFx1XCIsXG4gICAgXCJtYXRoXCI6IFwiXFxcXGJyZXZlXCJcbiAgfSxcbiAgXCLMjFwiOiB7XG4gICAgXCJ0ZXh0XCI6IFwiXFxcXHZcIixcbiAgICBcIm1hdGhcIjogXCJcXFxcY2hlY2tcIlxuICB9LFxuICBcIsyCXCI6IHtcbiAgICBcInRleHRcIjogXCJcXFxcXlwiLFxuICAgIFwibWF0aFwiOiBcIlxcXFxoYXRcIlxuICB9LFxuICBcIsyHXCI6IHtcbiAgICBcInRleHRcIjogXCJcXFxcLlwiLFxuICAgIFwibWF0aFwiOiBcIlxcXFxkb3RcIlxuICB9LFxuICBcIsyKXCI6IHtcbiAgICBcInRleHRcIjogXCJcXFxcclwiLFxuICAgIFwibWF0aFwiOiBcIlxcXFxtYXRocmluZ1wiXG4gIH0sXG4gIFwizItcIjoge1xuICAgIFwidGV4dFwiOiBcIlxcXFxIXCJcbiAgfSxcbiAgXCLMp1wiOiB7XG4gICAgXCJ0ZXh0XCI6IFwiXFxcXGNcIlxuICB9XG59O1xudmFyIHVuaWNvZGVTeW1ib2xzID0ge1xuICBcIsOhXCI6IFwiYcyBXCIsXG4gIFwiw6BcIjogXCJhzIBcIixcbiAgXCLDpFwiOiBcImHMiFwiLFxuICBcIsefXCI6IFwiYcyIzIRcIixcbiAgXCLDo1wiOiBcImHMg1wiLFxuICBcIsSBXCI6IFwiYcyEXCIsXG4gIFwixINcIjogXCJhzIZcIixcbiAgXCLhuq9cIjogXCJhzIbMgVwiLFxuICBcIuG6sVwiOiBcImHMhsyAXCIsXG4gIFwi4bq1XCI6IFwiYcyGzINcIixcbiAgXCLHjlwiOiBcImHMjFwiLFxuICBcIsOiXCI6IFwiYcyCXCIsXG4gIFwi4bqlXCI6IFwiYcyCzIFcIixcbiAgXCLhuqdcIjogXCJhzILMgFwiLFxuICBcIuG6q1wiOiBcImHMgsyDXCIsXG4gIFwiyKdcIjogXCJhzIdcIixcbiAgXCLHoVwiOiBcImHMh8yEXCIsXG4gIFwiw6VcIjogXCJhzIpcIixcbiAgXCLHu1wiOiBcImHMisyBXCIsXG4gIFwi4biDXCI6IFwiYsyHXCIsXG4gIFwixIdcIjogXCJjzIFcIixcbiAgXCLhuIlcIjogXCJjzKfMgVwiLFxuICBcIsSNXCI6IFwiY8yMXCIsXG4gIFwixIlcIjogXCJjzIJcIixcbiAgXCLEi1wiOiBcImPMh1wiLFxuICBcIsOnXCI6IFwiY8ynXCIsXG4gIFwixI9cIjogXCJkzIxcIixcbiAgXCLhuItcIjogXCJkzIdcIixcbiAgXCLhuJFcIjogXCJkzKdcIixcbiAgXCLDqVwiOiBcImXMgVwiLFxuICBcIsOoXCI6IFwiZcyAXCIsXG4gIFwiw6tcIjogXCJlzIhcIixcbiAgXCLhur1cIjogXCJlzINcIixcbiAgXCLEk1wiOiBcImXMhFwiLFxuICBcIuG4l1wiOiBcImXMhMyBXCIsXG4gIFwi4biVXCI6IFwiZcyEzIBcIixcbiAgXCLElVwiOiBcImXMhlwiLFxuICBcIuG4nVwiOiBcImXMp8yGXCIsXG4gIFwixJtcIjogXCJlzIxcIixcbiAgXCLDqlwiOiBcImXMglwiLFxuICBcIuG6v1wiOiBcImXMgsyBXCIsXG4gIFwi4buBXCI6IFwiZcyCzIBcIixcbiAgXCLhu4VcIjogXCJlzILMg1wiLFxuICBcIsSXXCI6IFwiZcyHXCIsXG4gIFwiyKlcIjogXCJlzKdcIixcbiAgXCLhuJ9cIjogXCJmzIdcIixcbiAgXCLHtVwiOiBcImfMgVwiLFxuICBcIuG4oVwiOiBcImfMhFwiLFxuICBcIsSfXCI6IFwiZ8yGXCIsXG4gIFwix6dcIjogXCJnzIxcIixcbiAgXCLEnVwiOiBcImfMglwiLFxuICBcIsShXCI6IFwiZ8yHXCIsXG4gIFwixKNcIjogXCJnzKdcIixcbiAgXCLhuKdcIjogXCJozIhcIixcbiAgXCLIn1wiOiBcImjMjFwiLFxuICBcIsSlXCI6IFwiaMyCXCIsXG4gIFwi4bijXCI6IFwiaMyHXCIsXG4gIFwi4bipXCI6IFwiaMynXCIsXG4gIFwiw61cIjogXCJpzIFcIixcbiAgXCLDrFwiOiBcImnMgFwiLFxuICBcIsOvXCI6IFwiacyIXCIsXG4gIFwi4bivXCI6IFwiacyIzIFcIixcbiAgXCLEqVwiOiBcImnMg1wiLFxuICBcIsSrXCI6IFwiacyEXCIsXG4gIFwixK1cIjogXCJpzIZcIixcbiAgXCLHkFwiOiBcImnMjFwiLFxuICBcIsOuXCI6IFwiacyCXCIsXG4gIFwix7BcIjogXCJqzIxcIixcbiAgXCLEtVwiOiBcImrMglwiLFxuICBcIuG4sVwiOiBcImvMgVwiLFxuICBcIsepXCI6IFwia8yMXCIsXG4gIFwixLdcIjogXCJrzKdcIixcbiAgXCLEulwiOiBcImzMgVwiLFxuICBcIsS+XCI6IFwibMyMXCIsXG4gIFwixLxcIjogXCJszKdcIixcbiAgXCLhuL9cIjogXCJtzIFcIixcbiAgXCLhuYFcIjogXCJtzIdcIixcbiAgXCLFhFwiOiBcIm7MgVwiLFxuICBcIse5XCI6IFwibsyAXCIsXG4gIFwiw7FcIjogXCJuzINcIixcbiAgXCLFiFwiOiBcIm7MjFwiLFxuICBcIuG5hVwiOiBcIm7Mh1wiLFxuICBcIsWGXCI6IFwibsynXCIsXG4gIFwiw7NcIjogXCJvzIFcIixcbiAgXCLDslwiOiBcIm/MgFwiLFxuICBcIsO2XCI6IFwib8yIXCIsXG4gIFwiyKtcIjogXCJvzIjMhFwiLFxuICBcIsO1XCI6IFwib8yDXCIsXG4gIFwi4bmNXCI6IFwib8yDzIFcIixcbiAgXCLhuY9cIjogXCJvzIPMiFwiLFxuICBcIsitXCI6IFwib8yDzIRcIixcbiAgXCLFjVwiOiBcIm/MhFwiLFxuICBcIuG5k1wiOiBcIm/MhMyBXCIsXG4gIFwi4bmRXCI6IFwib8yEzIBcIixcbiAgXCLFj1wiOiBcIm/MhlwiLFxuICBcIseSXCI6IFwib8yMXCIsXG4gIFwiw7RcIjogXCJvzIJcIixcbiAgXCLhu5FcIjogXCJvzILMgVwiLFxuICBcIuG7k1wiOiBcIm/MgsyAXCIsXG4gIFwi4buXXCI6IFwib8yCzINcIixcbiAgXCLIr1wiOiBcIm/Mh1wiLFxuICBcIsixXCI6IFwib8yHzIRcIixcbiAgXCLFkVwiOiBcIm/Mi1wiLFxuICBcIuG5lVwiOiBcInDMgVwiLFxuICBcIuG5l1wiOiBcInDMh1wiLFxuICBcIsWVXCI6IFwicsyBXCIsXG4gIFwixZlcIjogXCJyzIxcIixcbiAgXCLhuZlcIjogXCJyzIdcIixcbiAgXCLFl1wiOiBcInLMp1wiLFxuICBcIsWbXCI6IFwic8yBXCIsXG4gIFwi4bmlXCI6IFwic8yBzIdcIixcbiAgXCLFoVwiOiBcInPMjFwiLFxuICBcIuG5p1wiOiBcInPMjMyHXCIsXG4gIFwixZ1cIjogXCJzzIJcIixcbiAgXCLhuaFcIjogXCJzzIdcIixcbiAgXCLFn1wiOiBcInPMp1wiLFxuICBcIuG6l1wiOiBcInTMiFwiLFxuICBcIsWlXCI6IFwidMyMXCIsXG4gIFwi4bmrXCI6IFwidMyHXCIsXG4gIFwixaNcIjogXCJ0zKdcIixcbiAgXCLDulwiOiBcInXMgVwiLFxuICBcIsO5XCI6IFwidcyAXCIsXG4gIFwiw7xcIjogXCJ1zIhcIixcbiAgXCLHmFwiOiBcInXMiMyBXCIsXG4gIFwix5xcIjogXCJ1zIjMgFwiLFxuICBcIseWXCI6IFwidcyIzIRcIixcbiAgXCLHmlwiOiBcInXMiMyMXCIsXG4gIFwixalcIjogXCJ1zINcIixcbiAgXCLhublcIjogXCJ1zIPMgVwiLFxuICBcIsWrXCI6IFwidcyEXCIsXG4gIFwi4bm7XCI6IFwidcyEzIhcIixcbiAgXCLFrVwiOiBcInXMhlwiLFxuICBcIseUXCI6IFwidcyMXCIsXG4gIFwiw7tcIjogXCJ1zIJcIixcbiAgXCLFr1wiOiBcInXMilwiLFxuICBcIsWxXCI6IFwidcyLXCIsXG4gIFwi4bm9XCI6IFwidsyDXCIsXG4gIFwi4bqDXCI6IFwid8yBXCIsXG4gIFwi4bqBXCI6IFwid8yAXCIsXG4gIFwi4bqFXCI6IFwid8yIXCIsXG4gIFwixbVcIjogXCJ3zIJcIixcbiAgXCLhuodcIjogXCJ3zIdcIixcbiAgXCLhuphcIjogXCJ3zIpcIixcbiAgXCLhuo1cIjogXCJ4zIhcIixcbiAgXCLhuotcIjogXCJ4zIdcIixcbiAgXCLDvVwiOiBcInnMgVwiLFxuICBcIuG7s1wiOiBcInnMgFwiLFxuICBcIsO/XCI6IFwiecyIXCIsXG4gIFwi4bu5XCI6IFwiecyDXCIsXG4gIFwiyLNcIjogXCJ5zIRcIixcbiAgXCLFt1wiOiBcInnMglwiLFxuICBcIuG6j1wiOiBcInnMh1wiLFxuICBcIuG6mVwiOiBcInnMilwiLFxuICBcIsW6XCI6IFwiesyBXCIsXG4gIFwixb5cIjogXCJ6zIxcIixcbiAgXCLhupFcIjogXCJ6zIJcIixcbiAgXCLFvFwiOiBcInrMh1wiLFxuICBcIsOBXCI6IFwiQcyBXCIsXG4gIFwiw4BcIjogXCJBzIBcIixcbiAgXCLDhFwiOiBcIkHMiFwiLFxuICBcIseeXCI6IFwiQcyIzIRcIixcbiAgXCLDg1wiOiBcIkHMg1wiLFxuICBcIsSAXCI6IFwiQcyEXCIsXG4gIFwixIJcIjogXCJBzIZcIixcbiAgXCLhuq5cIjogXCJBzIbMgVwiLFxuICBcIuG6sFwiOiBcIkHMhsyAXCIsXG4gIFwi4bq0XCI6IFwiQcyGzINcIixcbiAgXCLHjVwiOiBcIkHMjFwiLFxuICBcIsOCXCI6IFwiQcyCXCIsXG4gIFwi4bqkXCI6IFwiQcyCzIFcIixcbiAgXCLhuqZcIjogXCJBzILMgFwiLFxuICBcIuG6qlwiOiBcIkHMgsyDXCIsXG4gIFwiyKZcIjogXCJBzIdcIixcbiAgXCLHoFwiOiBcIkHMh8yEXCIsXG4gIFwiw4VcIjogXCJBzIpcIixcbiAgXCLHulwiOiBcIkHMisyBXCIsXG4gIFwi4biCXCI6IFwiQsyHXCIsXG4gIFwixIZcIjogXCJDzIFcIixcbiAgXCLhuIhcIjogXCJDzKfMgVwiLFxuICBcIsSMXCI6IFwiQ8yMXCIsXG4gIFwixIhcIjogXCJDzIJcIixcbiAgXCLEilwiOiBcIkPMh1wiLFxuICBcIsOHXCI6IFwiQ8ynXCIsXG4gIFwixI5cIjogXCJEzIxcIixcbiAgXCLhuIpcIjogXCJEzIdcIixcbiAgXCLhuJBcIjogXCJEzKdcIixcbiAgXCLDiVwiOiBcIkXMgVwiLFxuICBcIsOIXCI6IFwiRcyAXCIsXG4gIFwiw4tcIjogXCJFzIhcIixcbiAgXCLhurxcIjogXCJFzINcIixcbiAgXCLEklwiOiBcIkXMhFwiLFxuICBcIuG4llwiOiBcIkXMhMyBXCIsXG4gIFwi4biUXCI6IFwiRcyEzIBcIixcbiAgXCLElFwiOiBcIkXMhlwiLFxuICBcIuG4nFwiOiBcIkXMp8yGXCIsXG4gIFwixJpcIjogXCJFzIxcIixcbiAgXCLDilwiOiBcIkXMglwiLFxuICBcIuG6vlwiOiBcIkXMgsyBXCIsXG4gIFwi4buAXCI6IFwiRcyCzIBcIixcbiAgXCLhu4RcIjogXCJFzILMg1wiLFxuICBcIsSWXCI6IFwiRcyHXCIsXG4gIFwiyKhcIjogXCJFzKdcIixcbiAgXCLhuJ5cIjogXCJGzIdcIixcbiAgXCLHtFwiOiBcIkfMgVwiLFxuICBcIuG4oFwiOiBcIkfMhFwiLFxuICBcIsSeXCI6IFwiR8yGXCIsXG4gIFwix6ZcIjogXCJHzIxcIixcbiAgXCLEnFwiOiBcIkfMglwiLFxuICBcIsSgXCI6IFwiR8yHXCIsXG4gIFwixKJcIjogXCJHzKdcIixcbiAgXCLhuKZcIjogXCJIzIhcIixcbiAgXCLInlwiOiBcIkjMjFwiLFxuICBcIsSkXCI6IFwiSMyCXCIsXG4gIFwi4biiXCI6IFwiSMyHXCIsXG4gIFwi4bioXCI6IFwiSMynXCIsXG4gIFwiw41cIjogXCJJzIFcIixcbiAgXCLDjFwiOiBcIknMgFwiLFxuICBcIsOPXCI6IFwiScyIXCIsXG4gIFwi4biuXCI6IFwiScyIzIFcIixcbiAgXCLEqFwiOiBcIknMg1wiLFxuICBcIsSqXCI6IFwiScyEXCIsXG4gIFwixKxcIjogXCJJzIZcIixcbiAgXCLHj1wiOiBcIknMjFwiLFxuICBcIsOOXCI6IFwiScyCXCIsXG4gIFwixLBcIjogXCJJzIdcIixcbiAgXCLEtFwiOiBcIkrMglwiLFxuICBcIuG4sFwiOiBcIkvMgVwiLFxuICBcIseoXCI6IFwiS8yMXCIsXG4gIFwixLZcIjogXCJLzKdcIixcbiAgXCLEuVwiOiBcIkzMgVwiLFxuICBcIsS9XCI6IFwiTMyMXCIsXG4gIFwixLtcIjogXCJMzKdcIixcbiAgXCLhuL5cIjogXCJNzIFcIixcbiAgXCLhuYBcIjogXCJNzIdcIixcbiAgXCLFg1wiOiBcIk7MgVwiLFxuICBcIse4XCI6IFwiTsyAXCIsXG4gIFwiw5FcIjogXCJOzINcIixcbiAgXCLFh1wiOiBcIk7MjFwiLFxuICBcIuG5hFwiOiBcIk7Mh1wiLFxuICBcIsWFXCI6IFwiTsynXCIsXG4gIFwiw5NcIjogXCJPzIFcIixcbiAgXCLDklwiOiBcIk/MgFwiLFxuICBcIsOWXCI6IFwiT8yIXCIsXG4gIFwiyKpcIjogXCJPzIjMhFwiLFxuICBcIsOVXCI6IFwiT8yDXCIsXG4gIFwi4bmMXCI6IFwiT8yDzIFcIixcbiAgXCLhuY5cIjogXCJPzIPMiFwiLFxuICBcIsisXCI6IFwiT8yDzIRcIixcbiAgXCLFjFwiOiBcIk/MhFwiLFxuICBcIuG5klwiOiBcIk/MhMyBXCIsXG4gIFwi4bmQXCI6IFwiT8yEzIBcIixcbiAgXCLFjlwiOiBcIk/MhlwiLFxuICBcIseRXCI6IFwiT8yMXCIsXG4gIFwiw5RcIjogXCJPzIJcIixcbiAgXCLhu5BcIjogXCJPzILMgVwiLFxuICBcIuG7klwiOiBcIk/MgsyAXCIsXG4gIFwi4buWXCI6IFwiT8yCzINcIixcbiAgXCLIrlwiOiBcIk/Mh1wiLFxuICBcIsiwXCI6IFwiT8yHzIRcIixcbiAgXCLFkFwiOiBcIk/Mi1wiLFxuICBcIuG5lFwiOiBcIlDMgVwiLFxuICBcIuG5llwiOiBcIlDMh1wiLFxuICBcIsWUXCI6IFwiUsyBXCIsXG4gIFwixZhcIjogXCJSzIxcIixcbiAgXCLhuZhcIjogXCJSzIdcIixcbiAgXCLFllwiOiBcIlLMp1wiLFxuICBcIsWaXCI6IFwiU8yBXCIsXG4gIFwi4bmkXCI6IFwiU8yBzIdcIixcbiAgXCLFoFwiOiBcIlPMjFwiLFxuICBcIuG5plwiOiBcIlPMjMyHXCIsXG4gIFwixZxcIjogXCJTzIJcIixcbiAgXCLhuaBcIjogXCJTzIdcIixcbiAgXCLFnlwiOiBcIlPMp1wiLFxuICBcIsWkXCI6IFwiVMyMXCIsXG4gIFwi4bmqXCI6IFwiVMyHXCIsXG4gIFwixaJcIjogXCJUzKdcIixcbiAgXCLDmlwiOiBcIlXMgVwiLFxuICBcIsOZXCI6IFwiVcyAXCIsXG4gIFwiw5xcIjogXCJVzIhcIixcbiAgXCLHl1wiOiBcIlXMiMyBXCIsXG4gIFwix5tcIjogXCJVzIjMgFwiLFxuICBcIseVXCI6IFwiVcyIzIRcIixcbiAgXCLHmVwiOiBcIlXMiMyMXCIsXG4gIFwixahcIjogXCJVzINcIixcbiAgXCLhubhcIjogXCJVzIPMgVwiLFxuICBcIsWqXCI6IFwiVcyEXCIsXG4gIFwi4bm6XCI6IFwiVcyEzIhcIixcbiAgXCLFrFwiOiBcIlXMhlwiLFxuICBcIseTXCI6IFwiVcyMXCIsXG4gIFwiw5tcIjogXCJVzIJcIixcbiAgXCLFrlwiOiBcIlXMilwiLFxuICBcIsWwXCI6IFwiVcyLXCIsXG4gIFwi4bm8XCI6IFwiVsyDXCIsXG4gIFwi4bqCXCI6IFwiV8yBXCIsXG4gIFwi4bqAXCI6IFwiV8yAXCIsXG4gIFwi4bqEXCI6IFwiV8yIXCIsXG4gIFwixbRcIjogXCJXzIJcIixcbiAgXCLhuoZcIjogXCJXzIdcIixcbiAgXCLhuoxcIjogXCJYzIhcIixcbiAgXCLhuopcIjogXCJYzIdcIixcbiAgXCLDnVwiOiBcIlnMgVwiLFxuICBcIuG7slwiOiBcIlnMgFwiLFxuICBcIsW4XCI6IFwiWcyIXCIsXG4gIFwi4bu4XCI6IFwiWcyDXCIsXG4gIFwiyLJcIjogXCJZzIRcIixcbiAgXCLFtlwiOiBcIlnMglwiLFxuICBcIuG6jlwiOiBcIlnMh1wiLFxuICBcIsW5XCI6IFwiWsyBXCIsXG4gIFwixb1cIjogXCJazIxcIixcbiAgXCLhupBcIjogXCJazIJcIixcbiAgXCLFu1wiOiBcIlrMh1wiLFxuICBcIs6sXCI6IFwizrHMgVwiLFxuICBcIuG9sFwiOiBcIs6xzIBcIixcbiAgXCLhvrFcIjogXCLOscyEXCIsXG4gIFwi4b6wXCI6IFwizrHMhlwiLFxuICBcIs6tXCI6IFwizrXMgVwiLFxuICBcIuG9slwiOiBcIs61zIBcIixcbiAgXCLOrlwiOiBcIs63zIFcIixcbiAgXCLhvbRcIjogXCLOt8yAXCIsXG4gIFwizq9cIjogXCLOucyBXCIsXG4gIFwi4b22XCI6IFwizrnMgFwiLFxuICBcIs+KXCI6IFwizrnMiFwiLFxuICBcIs6QXCI6IFwizrnMiMyBXCIsXG4gIFwi4b+SXCI6IFwizrnMiMyAXCIsXG4gIFwi4b+RXCI6IFwizrnMhFwiLFxuICBcIuG/kFwiOiBcIs65zIZcIixcbiAgXCLPjFwiOiBcIs6/zIFcIixcbiAgXCLhvbhcIjogXCLOv8yAXCIsXG4gIFwiz41cIjogXCLPhcyBXCIsXG4gIFwi4b26XCI6IFwiz4XMgFwiLFxuICBcIs+LXCI6IFwiz4XMiFwiLFxuICBcIs6wXCI6IFwiz4XMiMyBXCIsXG4gIFwi4b+iXCI6IFwiz4XMiMyAXCIsXG4gIFwi4b+hXCI6IFwiz4XMhFwiLFxuICBcIuG/oFwiOiBcIs+FzIZcIixcbiAgXCLPjlwiOiBcIs+JzIFcIixcbiAgXCLhvbxcIjogXCLPicyAXCIsXG4gIFwizo5cIjogXCLOpcyBXCIsXG4gIFwi4b+qXCI6IFwizqXMgFwiLFxuICBcIs6rXCI6IFwizqXMiFwiLFxuICBcIuG/qVwiOiBcIs6lzIRcIixcbiAgXCLhv6hcIjogXCLOpcyGXCIsXG4gIFwizo9cIjogXCLOqcyBXCIsXG4gIFwi4b+6XCI6IFwizqnMgFwiXG59O1xuXG4vKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGFyc2VyIHVzZWQgdG8gcGFyc2Ugb3V0IGEgVGVYIGV4cHJlc3Npb24gZnJvbSB0aGVcbiAqIGlucHV0LiBTaW5jZSBUZVggaXNuJ3QgY29udGV4dC1mcmVlLCBzdGFuZGFyZCBwYXJzZXJzIGRvbid0IHdvcmsgcGFydGljdWxhcmx5XG4gKiB3ZWxsLlxuICpcbiAqIFRoZSBzdHJhdGVneSBvZiB0aGlzIHBhcnNlciBpcyBhcyBzdWNoOlxuICpcbiAqIFRoZSBtYWluIGZ1bmN0aW9ucyAodGhlIGAucGFyc2UuLi5gIG9uZXMpIHRha2UgYSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudFxuICogcGFyc2Ugc3RyaW5nIHRvIHBhcnNlIHRva2VucyBmcm9tLiBUaGUgbGV4ZXIgKGZvdW5kIGluIExleGVyLmpzLCBzdG9yZWQgYXRcbiAqIHRoaXMuZ3VsbGV0LmxleGVyKSBhbHNvIHN1cHBvcnRzIHB1bGxpbmcgb3V0IHRva2VucyBhdCBhcmJpdHJhcnkgcGxhY2VzLiBXaGVuXG4gKiBpbmRpdmlkdWFsIHRva2VucyBhcmUgbmVlZGVkIGF0IGEgcG9zaXRpb24sIHRoZSBsZXhlciBpcyBjYWxsZWQgdG8gcHVsbCBvdXQgYVxuICogdG9rZW4sIHdoaWNoIGlzIHRoZW4gdXNlZC5cbiAqXG4gKiBUaGUgcGFyc2VyIGhhcyBhIHByb3BlcnR5IGNhbGxlZCBcIm1vZGVcIiBpbmRpY2F0aW5nIHRoZSBtb2RlIHRoYXRcbiAqIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IGluLiBDdXJyZW50bHkgaXQgaGFzIHRvIGJlIG9uZSBvZiBcIm1hdGhcIiBvclxuICogXCJ0ZXh0XCIsIHdoaWNoIGRlbm90ZXMgd2hldGhlciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIG1hdGgteVxuICogb25lIG9yIGEgdGV4dC15IG9uZSAoZS5nLiBpbnNpZGUgXFx0ZXh0KS4gQ3VycmVudGx5LCB0aGlzIHNlcnZlcyB0b1xuICogbGltaXQgdGhlIGZ1bmN0aW9ucyB3aGljaCBjYW4gYmUgdXNlZCBpbiB0ZXh0IG1vZGUuXG4gKlxuICogVGhlIG1haW4gZnVuY3Rpb25zIHRoZW4gcmV0dXJuIGFuIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgdXNlZnVsIGRhdGEgdGhhdFxuICogd2FzIHBhcnNlZCBhdCBpdHMgZ2l2ZW4gcG9pbnQsIGFuZCBhIG5ldyBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZWRcbiAqIGRhdGEuIFRoZSBtYWluIGZ1bmN0aW9ucyBjYW4gY2FsbCBlYWNoIG90aGVyIGFuZCBjb250aW51ZSB0aGUgcGFyc2luZyBieVxuICogdXNpbmcgdGhlIHJldHVybmVkIHBvc2l0aW9uIGFzIGEgbmV3IHN0YXJ0aW5nIHBvaW50LlxuICpcbiAqIFRoZXJlIGFyZSBhbHNvIGV4dHJhIGAuaGFuZGxlLi4uYCBmdW5jdGlvbnMsIHdoaWNoIHB1bGwgb3V0IHNvbWUgcmV1c2VkXG4gKiBmdW5jdGlvbmFsaXR5IGludG8gc2VsZi1jb250YWluZWQgZnVuY3Rpb25zLlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgcmV0dXJuIFBhcnNlTm9kZXMuXG4gKi9cbnZhciBQYXJzZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQYXJzZXIoaW5wdXQsIHNldHRpbmdzKSB7XG4gICAgdGhpcy5tb2RlID0gdm9pZCAwO1xuICAgIHRoaXMuZ3VsbGV0ID0gdm9pZCAwO1xuICAgIHRoaXMuc2V0dGluZ3MgPSB2b2lkIDA7XG4gICAgdGhpcy5sZWZ0cmlnaHREZXB0aCA9IHZvaWQgMDtcbiAgICB0aGlzLm5leHRUb2tlbiA9IHZvaWQgMDtcbiAgICAvLyBTdGFydCBpbiBtYXRoIG1vZGVcbiAgICB0aGlzLm1vZGUgPSBcIm1hdGhcIjsgLy8gQ3JlYXRlIGEgbmV3IG1hY3JvIGV4cGFuZGVyIChndWxsZXQpIGFuZCAoaW5kaXJlY3RseSB2aWEgdGhhdCkgYWxzbyBhXG4gICAgLy8gbmV3IGxleGVyIChtb3V0aCkgZm9yIHRoaXMgcGFyc2VyIChzdG9tYWNoLCBpbiB0aGUgbGFuZ3VhZ2Ugb2YgVGVYKVxuXG4gICAgdGhpcy5ndWxsZXQgPSBuZXcgTWFjcm9FeHBhbmRlcihpbnB1dCwgc2V0dGluZ3MsIHRoaXMubW9kZSk7IC8vIFN0b3JlIHRoZSBzZXR0aW5ncyBmb3IgdXNlIGluIHBhcnNpbmdcblxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsgLy8gQ291bnQgbGVmdHJpZ2h0IGRlcHRoIChmb3IgXFxtaWRkbGUgZXJyb3JzKVxuXG4gICAgdGhpcy5sZWZ0cmlnaHREZXB0aCA9IDA7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrcyBhIHJlc3VsdCB0byBtYWtlIHN1cmUgaXQgaGFzIHRoZSByaWdodCB0eXBlLCBhbmQgdGhyb3dzIGFuXG4gICAqIGFwcHJvcHJpYXRlIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gUGFyc2VyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZXhwZWN0ID0gZnVuY3Rpb24gZXhwZWN0KHRleHQsIGNvbnN1bWUpIHtcbiAgICBpZiAoY29uc3VtZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdW1lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mZXRjaCgpLnRleHQgIT09IHRleHQpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkV4cGVjdGVkICdcIiArIHRleHQgKyBcIicsIGdvdCAnXCIgKyB0aGlzLmZldGNoKCkudGV4dCArIFwiJ1wiLCB0aGlzLmZldGNoKCkpO1xuICAgIH1cblxuICAgIGlmIChjb25zdW1lKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIERpc2NhcmRzIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbiwgY29uc2lkZXJpbmcgaXQgY29uc3VtZWQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmNvbnN1bWUgPSBmdW5jdGlvbiBjb25zdW1lKCkge1xuICAgIHRoaXMubmV4dFRva2VuID0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IGxvb2thaGVhZCB0b2tlbiwgb3IgaWYgdGhlcmUgaXNuJ3Qgb25lIChhdCB0aGVcbiAgICogYmVnaW5uaW5nLCBvciBpZiB0aGUgcHJldmlvdXMgbG9va2FoZWFkIHRva2VuIHdhcyBjb25zdW1lKClkKSxcbiAgICogZmV0Y2ggdGhlIG5leHQgdG9rZW4gYXMgdGhlIG5ldyBsb29rYWhlYWQgdG9rZW4gYW5kIHJldHVybiBpdC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZmV0Y2ggPSBmdW5jdGlvbiBmZXRjaCgpIHtcbiAgICBpZiAodGhpcy5uZXh0VG9rZW4gPT0gbnVsbCkge1xuICAgICAgdGhpcy5uZXh0VG9rZW4gPSB0aGlzLmd1bGxldC5leHBhbmROZXh0VG9rZW4oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW47XG4gIH1cbiAgLyoqXG4gICAqIFN3aXRjaGVzIGJldHdlZW4gXCJ0ZXh0XCIgYW5kIFwibWF0aFwiIG1vZGVzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zd2l0Y2hNb2RlID0gZnVuY3Rpb24gc3dpdGNoTW9kZShuZXdNb2RlKSB7XG4gICAgdGhpcy5tb2RlID0gbmV3TW9kZTtcbiAgICB0aGlzLmd1bGxldC5zd2l0Y2hNb2RlKG5ld01vZGUpO1xuICB9XG4gIC8qKlxuICAgKiBNYWluIHBhcnNpbmcgZnVuY3Rpb24sIHdoaWNoIHBhcnNlcyBhbiBlbnRpcmUgaW5wdXQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmdsb2JhbEdyb3VwKSB7XG4gICAgICAvLyBDcmVhdGUgYSBncm91cCBuYW1lc3BhY2UgZm9yIHRoZSBtYXRoIGV4cHJlc3Npb24uXG4gICAgICAvLyAoTGFUZVggY3JlYXRlcyBhIG5ldyBncm91cCBmb3IgZXZlcnkgJC4uLiQsICQkLi4uJCQsIFxcWy4uLlxcXS4pXG4gICAgICB0aGlzLmd1bGxldC5iZWdpbkdyb3VwKCk7XG4gICAgfSAvLyBVc2Ugb2xkIFxcY29sb3IgYmVoYXZpb3IgKHNhbWUgYXMgTGFUZVgncyBcXHRleHRjb2xvcikgaWYgcmVxdWVzdGVkLlxuICAgIC8vIFdlIGRvIHRoaXMgd2l0aGluIHRoZSBncm91cCBmb3IgdGhlIG1hdGggZXhwcmVzc2lvbiwgc28gaXQgZG9lc24ndFxuICAgIC8vIHBvbGx1dGUgc2V0dGluZ3MubWFjcm9zLlxuXG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5jb2xvcklzVGV4dENvbG9yKSB7XG4gICAgICB0aGlzLmd1bGxldC5tYWNyb3Muc2V0KFwiXFxcXGNvbG9yXCIsIFwiXFxcXHRleHRjb2xvclwiKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBpbnB1dFxuICAgICAgdmFyIHBhcnNlID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oZmFsc2UpOyAvLyBJZiB3ZSBzdWNjZWVkZWQsIG1ha2Ugc3VyZSB0aGVyZSdzIGFuIEVPRiBhdCB0aGUgZW5kXG5cbiAgICAgIHRoaXMuZXhwZWN0KFwiRU9GXCIpOyAvLyBFbmQgdGhlIGdyb3VwIG5hbWVzcGFjZSBmb3IgdGhlIGV4cHJlc3Npb25cblxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmdsb2JhbEdyb3VwKSB7XG4gICAgICAgIHRoaXMuZ3VsbGV0LmVuZEdyb3VwKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZTsgLy8gQ2xvc2UgYW55IGxlZnRvdmVyIGdyb3VwcyBpbiBjYXNlIG9mIGEgcGFyc2UgZXJyb3IuXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZ3VsbGV0LmVuZEdyb3VwcygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRnVsbHkgcGFyc2UgYSBzZXBhcmF0ZSBzZXF1ZW5jZSBvZiB0b2tlbnMgYXMgYSBzZXBhcmF0ZSBqb2IuXG4gICAqIFRva2VucyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHJldmVyc2Ugb3JkZXIsIGFzIGluIGEgTWFjcm9EZWZpbml0aW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zdWJwYXJzZSA9IGZ1bmN0aW9uIHN1YnBhcnNlKHRva2Vucykge1xuICAgIC8vIFNhdmUgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgY3VycmVudCBqb2IuXG4gICAgdmFyIG9sZFRva2VuID0gdGhpcy5uZXh0VG9rZW47XG4gICAgdGhpcy5jb25zdW1lKCk7IC8vIFJ1biB0aGUgbmV3IGpvYiwgdGVybWluYXRpbmcgaXQgd2l0aCBhbiBleGNlc3MgJ30nXG5cbiAgICB0aGlzLmd1bGxldC5wdXNoVG9rZW4obmV3IFRva2VuKFwifVwiKSk7XG4gICAgdGhpcy5ndWxsZXQucHVzaFRva2Vucyh0b2tlbnMpO1xuICAgIHZhciBwYXJzZSA9IHRoaXMucGFyc2VFeHByZXNzaW9uKGZhbHNlKTtcbiAgICB0aGlzLmV4cGVjdChcIn1cIik7IC8vIFJlc3RvcmUgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgY3VycmVudCBqb2IuXG5cbiAgICB0aGlzLm5leHRUb2tlbiA9IG9sZFRva2VuO1xuICAgIHJldHVybiBwYXJzZTtcbiAgfTtcblxuICAvKipcbiAgICogUGFyc2VzIGFuIFwiZXhwcmVzc2lvblwiLCB3aGljaCBpcyBhIGxpc3Qgb2YgYXRvbXMuXG4gICAqXG4gICAqIGBicmVha09uSW5maXhgOiBTaG91bGQgdGhlIHBhcnNpbmcgc3RvcCB3aGVuIHdlIGhpdCBpbmZpeCBub2Rlcz8gVGhpc1xuICAgKiAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIGZ1bmN0aW9ucyBoYXZlIGhpZ2hlciBwcmVjZW5kZW5jZSBoYW4gaW5maXhcbiAgICogICAgICAgICAgICAgICAgIG5vZGVzIGluIGltcGxpY2l0IHBhcnNlcy5cbiAgICpcbiAgICogYGJyZWFrT25Ub2tlblRleHRgOiBUaGUgdGV4dCBvZiB0aGUgdG9rZW4gdGhhdCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgZW5kXG4gICAqICAgICAgICAgICAgICAgICAgICAgd2l0aCwgb3IgYG51bGxgIGlmIHNvbWV0aGluZyBlbHNlIHNob3VsZCBlbmQgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5cbiAgICovXG4gIF9wcm90by5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oYnJlYWtPbkluZml4LCBicmVha09uVG9rZW5UZXh0KSB7XG4gICAgdmFyIGJvZHkgPSBbXTsgLy8gS2VlcCBhZGRpbmcgYXRvbXMgdG8gdGhlIGJvZHkgdW50aWwgd2UgY2FuJ3QgcGFyc2UgYW55IG1vcmUgYXRvbXMgKGVpdGhlclxuICAgIC8vIHdlIHJlYWNoZWQgdGhlIGVuZCwgYSB9LCBvciBhIFxccmlnaHQpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gSWdub3JlIHNwYWNlcyBpbiBtYXRoIG1vZGVcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwibWF0aFwiKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZVNwYWNlcygpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGV4ID0gdGhpcy5mZXRjaCgpO1xuXG4gICAgICBpZiAoUGFyc2VyLmVuZE9mRXhwcmVzc2lvbi5pbmRleE9mKGxleC50ZXh0KSAhPT0gLTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmVha09uVG9rZW5UZXh0ICYmIGxleC50ZXh0ID09PSBicmVha09uVG9rZW5UZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJlYWtPbkluZml4ICYmIHNyY19mdW5jdGlvbnNbbGV4LnRleHRdICYmIHNyY19mdW5jdGlvbnNbbGV4LnRleHRdLmluZml4KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXRvbSA9IHRoaXMucGFyc2VBdG9tKGJyZWFrT25Ub2tlblRleHQpO1xuXG4gICAgICBpZiAoIWF0b20pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGF0b20udHlwZSA9PT0gXCJpbnRlcm5hbFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBib2R5LnB1c2goYXRvbSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuZm9ybUxpZ2F0dXJlcyhib2R5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVJbmZpeE5vZGVzKGJvZHkpO1xuICB9XG4gIC8qKlxuICAgKiBSZXdyaXRlcyBpbmZpeCBvcGVyYXRvcnMgc3VjaCBhcyBcXG92ZXIgd2l0aCBjb3JyZXNwb25kaW5nIGNvbW1hbmRzIHN1Y2hcbiAgICogYXMgXFxmcmFjLlxuICAgKlxuICAgKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgaW5maXggb3BlcmF0b3IgcGVyIGdyb3VwLiAgSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lXG4gICAqIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgYW1iaWd1b3VzLiAgVGhpcyBjYW4gYmUgcmVzb2x2ZWQgYnkgYWRkaW5nIHt9LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5oYW5kbGVJbmZpeE5vZGVzID0gZnVuY3Rpb24gaGFuZGxlSW5maXhOb2Rlcyhib2R5KSB7XG4gICAgdmFyIG92ZXJJbmRleCA9IC0xO1xuICAgIHZhciBmdW5jTmFtZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGJvZHlbaV0udHlwZSA9PT0gXCJpbmZpeFwiKSB7XG4gICAgICAgIGlmIChvdmVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwib25seSBvbmUgaW5maXggb3BlcmF0b3IgcGVyIGdyb3VwXCIsIGJvZHlbaV0udG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgb3ZlckluZGV4ID0gaTtcbiAgICAgICAgZnVuY05hbWUgPSBib2R5W2ldLnJlcGxhY2VXaXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvdmVySW5kZXggIT09IC0xICYmIGZ1bmNOYW1lKSB7XG4gICAgICB2YXIgbnVtZXJOb2RlO1xuICAgICAgdmFyIGRlbm9tTm9kZTtcbiAgICAgIHZhciBudW1lckJvZHkgPSBib2R5LnNsaWNlKDAsIG92ZXJJbmRleCk7XG4gICAgICB2YXIgZGVub21Cb2R5ID0gYm9keS5zbGljZShvdmVySW5kZXggKyAxKTtcblxuICAgICAgaWYgKG51bWVyQm9keS5sZW5ndGggPT09IDEgJiYgbnVtZXJCb2R5WzBdLnR5cGUgPT09IFwib3JkZ3JvdXBcIikge1xuICAgICAgICBudW1lck5vZGUgPSBudW1lckJvZHlbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1lck5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJvcmRncm91cFwiLFxuICAgICAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgICAgICBib2R5OiBudW1lckJvZHlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbm9tQm9keS5sZW5ndGggPT09IDEgJiYgZGVub21Cb2R5WzBdLnR5cGUgPT09IFwib3JkZ3JvdXBcIikge1xuICAgICAgICBkZW5vbU5vZGUgPSBkZW5vbUJvZHlbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZW5vbU5vZGUgPSB7XG4gICAgICAgICAgdHlwZTogXCJvcmRncm91cFwiLFxuICAgICAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgICAgICBib2R5OiBkZW5vbUJvZHlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vZGU7XG5cbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gXCJcXFxcXFxcXGFib3ZlZnJhY1wiKSB7XG4gICAgICAgIG5vZGUgPSB0aGlzLmNhbGxGdW5jdGlvbihmdW5jTmFtZSwgW251bWVyTm9kZSwgYm9keVtvdmVySW5kZXhdLCBkZW5vbU5vZGVdLCBbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0gdGhpcy5jYWxsRnVuY3Rpb24oZnVuY05hbWUsIFtudW1lck5vZGUsIGRlbm9tTm9kZV0sIFtdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtub2RlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBIYW5kbGUgYSBzdWJzY3JpcHQgb3Igc3VwZXJzY3JpcHQgd2l0aCBuaWNlIGVycm9ycy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaGFuZGxlU3VwU3Vic2NyaXB0ID0gZnVuY3Rpb24gaGFuZGxlU3VwU3Vic2NyaXB0KG5hbWUgLy8gRm9yIGVycm9yIHJlcG9ydGluZy5cbiAgKSB7XG4gICAgdmFyIHN5bWJvbFRva2VuID0gdGhpcy5mZXRjaCgpO1xuICAgIHZhciBzeW1ib2wgPSBzeW1ib2xUb2tlbi50ZXh0O1xuICAgIHRoaXMuY29uc3VtZSgpO1xuICAgIHRoaXMuY29uc3VtZVNwYWNlcygpOyAvLyBpZ25vcmUgc3BhY2VzIGJlZm9yZSBzdXAvc3Vic2NyaXB0IGFyZ3VtZW50XG5cbiAgICB2YXIgZ3JvdXAgPSB0aGlzLnBhcnNlR3JvdXAobmFtZSk7XG5cbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJFeHBlY3RlZCBncm91cCBhZnRlciAnXCIgKyBzeW1ib2wgKyBcIidcIiwgc3ltYm9sVG9rZW4pO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cDtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHRleHR1YWwgaW5wdXQgb2YgYW4gdW5zdXBwb3J0ZWQgY29tbWFuZCBpbnRvIGEgdGV4dCBub2RlXG4gICAqIGNvbnRhaW5lZCB3aXRoaW4gYSBjb2xvciBub2RlIHdob3NlIGNvbG9yIGlzIGRldGVybWluZWQgYnkgZXJyb3JDb2xvclxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5mb3JtYXRVbnN1cHBvcnRlZENtZCA9IGZ1bmN0aW9uIGZvcm1hdFVuc3VwcG9ydGVkQ21kKHRleHQpIHtcbiAgICB2YXIgdGV4dG9yZEFycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRleHRvcmRBcnJheS5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0b3JkXCIsXG4gICAgICAgIG1vZGU6IFwidGV4dFwiLFxuICAgICAgICB0ZXh0OiB0ZXh0W2ldXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgdGV4dE5vZGUgPSB7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgIGJvZHk6IHRleHRvcmRBcnJheVxuICAgIH07XG4gICAgdmFyIGNvbG9yTm9kZSA9IHtcbiAgICAgIHR5cGU6IFwiY29sb3JcIixcbiAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgIGNvbG9yOiB0aGlzLnNldHRpbmdzLmVycm9yQ29sb3IsXG4gICAgICBib2R5OiBbdGV4dE5vZGVdXG4gICAgfTtcbiAgICByZXR1cm4gY29sb3JOb2RlO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBncm91cCB3aXRoIG9wdGlvbmFsIHN1cGVyL3N1YnNjcmlwdHMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnBhcnNlQXRvbSA9IGZ1bmN0aW9uIHBhcnNlQXRvbShicmVha09uVG9rZW5UZXh0KSB7XG4gICAgLy8gVGhlIGJvZHkgb2YgYW4gYXRvbSBpcyBhbiBpbXBsaWNpdCBncm91cCwgc28gdGhhdCB0aGluZ3MgbGlrZVxuICAgIC8vIFxcbGVmdCh4XFxyaWdodCleMiB3b3JrIGNvcnJlY3RseS5cbiAgICB2YXIgYmFzZSA9IHRoaXMucGFyc2VHcm91cChcImF0b21cIiwgYnJlYWtPblRva2VuVGV4dCk7IC8vIEluIHRleHQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSBzdXBlcnNjcmlwdHMgb3Igc3Vic2NyaXB0c1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH0gLy8gTm90ZSB0aGF0IGJhc2UgbWF5IGJlIGVtcHR5IChpLmUuIG51bGwpIGF0IHRoaXMgcG9pbnQuXG5cblxuICAgIHZhciBzdXBlcnNjcmlwdDtcbiAgICB2YXIgc3Vic2NyaXB0O1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIEd1YXJhbnRlZWQgaW4gbWF0aCBtb2RlLCBzbyBlYXQgYW55IHNwYWNlcyBmaXJzdC5cbiAgICAgIHRoaXMuY29uc3VtZVNwYWNlcygpOyAvLyBMZXggdGhlIGZpcnN0IHRva2VuXG5cbiAgICAgIHZhciBsZXggPSB0aGlzLmZldGNoKCk7XG5cbiAgICAgIGlmIChsZXgudGV4dCA9PT0gXCJcXFxcbGltaXRzXCIgfHwgbGV4LnRleHQgPT09IFwiXFxcXG5vbGltaXRzXCIpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbGltaXQgY29udHJvbFxuICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnR5cGUgPT09IFwib3BcIikge1xuICAgICAgICAgIHZhciBsaW1pdHMgPSBsZXgudGV4dCA9PT0gXCJcXFxcbGltaXRzXCI7XG4gICAgICAgICAgYmFzZS5saW1pdHMgPSBsaW1pdHM7XG4gICAgICAgICAgYmFzZS5hbHdheXNIYW5kbGVTdXBTdWIgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGJhc2UgJiYgYmFzZS50eXBlID09PSBcIm9wZXJhdG9ybmFtZVwiKSB7XG4gICAgICAgICAgaWYgKGJhc2UuYWx3YXlzSGFuZGxlU3VwU3ViKSB7XG4gICAgICAgICAgICBiYXNlLmxpbWl0cyA9IGxleC50ZXh0ID09PSBcIlxcXFxsaW1pdHNcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiTGltaXQgY29udHJvbHMgbXVzdCBmb2xsb3cgYSBtYXRoIG9wZXJhdG9yXCIsIGxleCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgIH0gZWxzZSBpZiAobGV4LnRleHQgPT09IFwiXlwiKSB7XG4gICAgICAgIC8vIFdlIGdvdCBhIHN1cGVyc2NyaXB0IHN0YXJ0XG4gICAgICAgIGlmIChzdXBlcnNjcmlwdCkge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkRvdWJsZSBzdXBlcnNjcmlwdFwiLCBsZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXJzY3JpcHQgPSB0aGlzLmhhbmRsZVN1cFN1YnNjcmlwdChcInN1cGVyc2NyaXB0XCIpO1xuICAgICAgfSBlbHNlIGlmIChsZXgudGV4dCA9PT0gXCJfXCIpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgc3Vic2NyaXB0IHN0YXJ0XG4gICAgICAgIGlmIChzdWJzY3JpcHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJEb3VibGUgc3Vic2NyaXB0XCIsIGxleCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpcHQgPSB0aGlzLmhhbmRsZVN1cFN1YnNjcmlwdChcInN1YnNjcmlwdFwiKTtcbiAgICAgIH0gZWxzZSBpZiAobGV4LnRleHQgPT09IFwiJ1wiKSB7XG4gICAgICAgIC8vIFdlIGdvdCBhIHByaW1lXG4gICAgICAgIGlmIChzdXBlcnNjcmlwdCkge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkRvdWJsZSBzdXBlcnNjcmlwdFwiLCBsZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByaW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwidGV4dG9yZFwiLFxuICAgICAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgICAgICB0ZXh0OiBcIlxcXFxwcmltZVwiXG4gICAgICAgIH07IC8vIE1hbnkgcHJpbWVzIGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyLCBzbyB3ZSBoYW5kbGUgdGhpcyBoZXJlXG5cbiAgICAgICAgdmFyIHByaW1lcyA9IFtwcmltZV07XG4gICAgICAgIHRoaXMuY29uc3VtZSgpOyAvLyBLZWVwIGxleGluZyB0b2tlbnMgdW50aWwgd2UgZ2V0IHNvbWV0aGluZyB0aGF0J3Mgbm90IGEgcHJpbWVcblxuICAgICAgICB3aGlsZSAodGhpcy5mZXRjaCgpLnRleHQgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgLy8gRm9yIGVhY2ggb25lLCBhZGQgYW5vdGhlciBwcmltZSB0byB0aGUgbGlzdFxuICAgICAgICAgIHByaW1lcy5wdXNoKHByaW1lKTtcbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgfSAvLyBJZiB0aGVyZSdzIGEgc3VwZXJzY3JpcHQgZm9sbG93aW5nIHRoZSBwcmltZXMsIGNvbWJpbmUgdGhhdFxuICAgICAgICAvLyBzdXBlcnNjcmlwdCBpbiB3aXRoIHRoZSBwcmltZXMuXG5cblxuICAgICAgICBpZiAodGhpcy5mZXRjaCgpLnRleHQgPT09IFwiXlwiKSB7XG4gICAgICAgICAgcHJpbWVzLnB1c2godGhpcy5oYW5kbGVTdXBTdWJzY3JpcHQoXCJzdXBlcnNjcmlwdFwiKSk7XG4gICAgICAgIH0gLy8gUHV0IGV2ZXJ5dGhpbmcgaW50byBhbiBvcmRncm91cCBhcyB0aGUgc3VwZXJzY3JpcHRcblxuXG4gICAgICAgIHN1cGVyc2NyaXB0ID0ge1xuICAgICAgICAgIHR5cGU6IFwib3JkZ3JvdXBcIixcbiAgICAgICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICAgICAgYm9keTogcHJpbWVzXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHVTdWJzQW5kU3Vwc1tsZXgudGV4dF0pIHtcbiAgICAgICAgLy8gQSBVbmljb2RlIHN1YnNjcmlwdCBvciBzdXBlcnNjcmlwdCBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIFdlIHRyZWF0IHRoZXNlIHNpbWlsYXJseSB0byB0aGUgdW5pY29kZS1tYXRoIHBhY2thZ2UuXG4gICAgICAgIC8vIFNvIHdlIHJlbmRlciBhIHN0cmluZyBvZiBVbmljb2RlIChzdWJ8c3VwZXIpc2NyaXB0cyB0aGVcbiAgICAgICAgLy8gc2FtZSBhcyBhIChzdWJ8c3VwZXIpc2NyaXB0IG9mIHJlZ3VsYXIgY2hhcmFjdGVycy5cbiAgICAgICAgdmFyIHN0ciA9IHVTdWJzQW5kU3Vwc1tsZXgudGV4dF07XG4gICAgICAgIHZhciBpc1N1YiA9IHVuaWNvZGVTdWJSZWdFeC50ZXN0KGxleC50ZXh0KTtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7IC8vIENvbnRpbnVlIGZldGNoaW5nIHRva2VucyB0byBmaWxsIG91dCB0aGUgc3RyaW5nLlxuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5mZXRjaCgpLnRleHQ7XG5cbiAgICAgICAgICBpZiAoIXVTdWJzQW5kU3Vwc1t0b2tlbl0pIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1bmljb2RlU3ViUmVnRXgudGVzdCh0b2tlbikgIT09IGlzU3ViKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgICBzdHIgKz0gdVN1YnNBbmRTdXBzW3Rva2VuXTtcbiAgICAgICAgfSAvLyBOb3cgY3JlYXRlIGEgKHN1YnxzdXBlcilzY3JpcHQuXG5cblxuICAgICAgICB2YXIgYm9keSA9IG5ldyBQYXJzZXIoc3RyLCB0aGlzLnNldHRpbmdzKS5wYXJzZSgpO1xuXG4gICAgICAgIGlmIChpc1N1Yikge1xuICAgICAgICAgIHN1YnNjcmlwdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwib3JkZ3JvdXBcIixcbiAgICAgICAgICAgIG1vZGU6IFwibWF0aFwiLFxuICAgICAgICAgICAgYm9keTogYm9keVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VwZXJzY3JpcHQgPSB7XG4gICAgICAgICAgICB0eXBlOiBcIm9yZGdyb3VwXCIsXG4gICAgICAgICAgICBtb2RlOiBcIm1hdGhcIixcbiAgICAgICAgICAgIGJvZHk6IGJvZHlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCB3YXNuJ3QgXiwgXywgb3IgJywgc3RvcCBwYXJzaW5nIHN1cGVyL3N1YnNjcmlwdHNcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBCYXNlIG11c3QgYmUgc2V0IGlmIHN1cGVyc2NyaXB0IG9yIHN1YnNjcmlwdCBhcmUgc2V0IHBlciBsb2dpYyBhYm92ZSxcbiAgICAvLyBidXQgbmVlZCB0byBjaGVjayBoZXJlIGZvciB0eXBlIGNoZWNrIHRvIHBhc3MuXG5cblxuICAgIGlmIChzdXBlcnNjcmlwdCB8fCBzdWJzY3JpcHQpIHtcbiAgICAgIC8vIElmIHdlIGdvdCBlaXRoZXIgYSBzdXBlcnNjcmlwdCBvciBzdWJzY3JpcHQsIGNyZWF0ZSBhIHN1cHN1YlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJzdXBzdWJcIixcbiAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgICBiYXNlOiBiYXNlLFxuICAgICAgICBzdXA6IHN1cGVyc2NyaXB0LFxuICAgICAgICBzdWI6IHN1YnNjcmlwdFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gZW50aXJlIGZ1bmN0aW9uLCBpbmNsdWRpbmcgaXRzIGJhc2UgYW5kIGFsbCBvZiBpdHMgYXJndW1lbnRzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZUZ1bmN0aW9uID0gZnVuY3Rpb24gcGFyc2VGdW5jdGlvbihicmVha09uVG9rZW5UZXh0LCBuYW1lIC8vIEZvciBkZXRlcm1pbmluZyBpdHMgY29udGV4dFxuICApIHtcbiAgICB2YXIgdG9rZW4gPSB0aGlzLmZldGNoKCk7XG4gICAgdmFyIGZ1bmMgPSB0b2tlbi50ZXh0O1xuICAgIHZhciBmdW5jRGF0YSA9IHNyY19mdW5jdGlvbnNbZnVuY107XG5cbiAgICBpZiAoIWZ1bmNEYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnN1bWUoKTsgLy8gY29uc3VtZSBjb21tYW5kIHRva2VuXG5cbiAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcImF0b21cIiAmJiAhZnVuY0RhdGEuYWxsb3dlZEluQXJndW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkdvdCBmdW5jdGlvbiAnXCIgKyBmdW5jICsgXCInIHdpdGggbm8gYXJndW1lbnRzXCIgKyAobmFtZSA/IFwiIGFzIFwiICsgbmFtZSA6IFwiXCIpLCB0b2tlbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09IFwidGV4dFwiICYmICFmdW5jRGF0YS5hbGxvd2VkSW5UZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJDYW4ndCB1c2UgZnVuY3Rpb24gJ1wiICsgZnVuYyArIFwiJyBpbiB0ZXh0IG1vZGVcIiwgdG9rZW4pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSBcIm1hdGhcIiAmJiBmdW5jRGF0YS5hbGxvd2VkSW5NYXRoID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiQ2FuJ3QgdXNlIGZ1bmN0aW9uICdcIiArIGZ1bmMgKyBcIicgaW4gbWF0aCBtb2RlXCIsIHRva2VuKTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMkcGFyc2VBcmd1bWVudHMgPSB0aGlzLnBhcnNlQXJndW1lbnRzKGZ1bmMsIGZ1bmNEYXRhKSxcbiAgICAgICAgYXJncyA9IF90aGlzJHBhcnNlQXJndW1lbnRzLmFyZ3MsXG4gICAgICAgIG9wdEFyZ3MgPSBfdGhpcyRwYXJzZUFyZ3VtZW50cy5vcHRBcmdzO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FsbEZ1bmN0aW9uKGZ1bmMsIGFyZ3MsIG9wdEFyZ3MsIHRva2VuLCBicmVha09uVG9rZW5UZXh0KTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIGhhbmRsZXIgd2l0aCBhIHN1aXRhYmxlIGNvbnRleHQgYW5kIGFyZ3VtZW50cy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY2FsbEZ1bmN0aW9uID0gZnVuY3Rpb24gY2FsbEZ1bmN0aW9uKG5hbWUsIGFyZ3MsIG9wdEFyZ3MsIHRva2VuLCBicmVha09uVG9rZW5UZXh0KSB7XG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICBmdW5jTmFtZTogbmFtZSxcbiAgICAgIHBhcnNlcjogdGhpcyxcbiAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgIGJyZWFrT25Ub2tlblRleHQ6IGJyZWFrT25Ub2tlblRleHRcbiAgICB9O1xuICAgIHZhciBmdW5jID0gc3JjX2Z1bmN0aW9uc1tuYW1lXTtcblxuICAgIGlmIChmdW5jICYmIGZ1bmMuaGFuZGxlcikge1xuICAgICAgcmV0dXJuIGZ1bmMuaGFuZGxlcihjb250ZXh0LCBhcmdzLCBvcHRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiTm8gZnVuY3Rpb24gaGFuZGxlciBmb3IgXCIgKyBuYW1lKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gb3IgZW52aXJvbm1lbnRcbiAgICovXG4gIDtcblxuICBfcHJvdG8ucGFyc2VBcmd1bWVudHMgPSBmdW5jdGlvbiBwYXJzZUFyZ3VtZW50cyhmdW5jLCAvLyBTaG91bGQgbG9vayBsaWtlIFwiXFxuYW1lXCIgb3IgXCJcXGJlZ2lue25hbWV9XCIuXG4gIGZ1bmNEYXRhKSB7XG4gICAgdmFyIHRvdGFsQXJncyA9IGZ1bmNEYXRhLm51bUFyZ3MgKyBmdW5jRGF0YS5udW1PcHRpb25hbEFyZ3M7XG5cbiAgICBpZiAodG90YWxBcmdzID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgb3B0QXJnczogW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgb3B0QXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEFyZ3M7IGkrKykge1xuICAgICAgdmFyIGFyZ1R5cGUgPSBmdW5jRGF0YS5hcmdUeXBlcyAmJiBmdW5jRGF0YS5hcmdUeXBlc1tpXTtcbiAgICAgIHZhciBpc09wdGlvbmFsID0gaSA8IGZ1bmNEYXRhLm51bU9wdGlvbmFsQXJncztcblxuICAgICAgaWYgKGZ1bmNEYXRhLnByaW1pdGl2ZSAmJiBhcmdUeXBlID09IG51bGwgfHwgLy8gXFxzcXJ0IGV4cGFuZHMgaW50byBwcmltaXRpdmUgaWYgb3B0aW9uYWwgYXJndW1lbnQgZG9lc24ndCBleGlzdFxuICAgICAgZnVuY0RhdGEudHlwZSA9PT0gXCJzcXJ0XCIgJiYgaSA9PT0gMSAmJiBvcHRBcmdzWzBdID09IG51bGwpIHtcbiAgICAgICAgYXJnVHlwZSA9IFwicHJpbWl0aXZlXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlR3JvdXBPZlR5cGUoXCJhcmd1bWVudCB0byAnXCIgKyBmdW5jICsgXCInXCIsIGFyZ1R5cGUsIGlzT3B0aW9uYWwpO1xuXG4gICAgICBpZiAoaXNPcHRpb25hbCkge1xuICAgICAgICBvcHRBcmdzLnB1c2goYXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYXJnICE9IG51bGwpIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaG91bGQgYmUgdW5yZWFjaGFibGVcbiAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiTnVsbCBhcmd1bWVudCwgcGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiBhcmdzLFxuICAgICAgb3B0QXJnczogb3B0QXJnc1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBhIGdyb3VwIHdoZW4gdGhlIG1vZGUgaXMgY2hhbmdpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnBhcnNlR3JvdXBPZlR5cGUgPSBmdW5jdGlvbiBwYXJzZUdyb3VwT2ZUeXBlKG5hbWUsIHR5cGUsIG9wdGlvbmFsKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb2xvckdyb3VwKG9wdGlvbmFsKTtcblxuICAgICAgY2FzZSBcInNpemVcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VTaXplR3JvdXAob3B0aW9uYWwpO1xuXG4gICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVXJsR3JvdXAob3B0aW9uYWwpO1xuXG4gICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcmd1bWVudEdyb3VwKG9wdGlvbmFsLCB0eXBlKTtcblxuICAgICAgY2FzZSBcImhib3hcIjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIGhib3ggYXJndW1lbnQgdHlwZSB3cmFwcyB0aGUgYXJndW1lbnQgaW4gdGhlIGVxdWl2YWxlbnQgb2ZcbiAgICAgICAgICAvLyBcXGhib3gsIHdoaWNoIGlzIGxpa2UgXFx0ZXh0IGJ1dCBzd2l0Y2hpbmcgdG8gXFx0ZXh0c3R5bGUgc2l6ZS5cbiAgICAgICAgICB2YXIgZ3JvdXAgPSB0aGlzLnBhcnNlQXJndW1lbnRHcm91cChvcHRpb25hbCwgXCJ0ZXh0XCIpO1xuICAgICAgICAgIHJldHVybiBncm91cCAhPSBudWxsID8ge1xuICAgICAgICAgICAgdHlwZTogXCJzdHlsaW5nXCIsXG4gICAgICAgICAgICBtb2RlOiBncm91cC5tb2RlLFxuICAgICAgICAgICAgYm9keTogW2dyb3VwXSxcbiAgICAgICAgICAgIHN0eWxlOiBcInRleHRcIiAvLyBzaW11bGF0ZSBcXHRleHRzdHlsZVxuXG4gICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBcInJhd1wiOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5wYXJzZVN0cmluZ0dyb3VwKFwicmF3XCIsIG9wdGlvbmFsKTtcbiAgICAgICAgICByZXR1cm4gdG9rZW4gIT0gbnVsbCA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwicmF3XCIsXG4gICAgICAgICAgICBtb2RlOiBcInRleHRcIixcbiAgICAgICAgICAgIHN0cmluZzogdG9rZW4udGV4dFxuICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJwcmltaXRpdmVcIjpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiQSBwcmltaXRpdmUgYXJndW1lbnQgY2Fubm90IGJlIG9wdGlvbmFsXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfZ3JvdXAgPSB0aGlzLnBhcnNlR3JvdXAobmFtZSk7XG5cbiAgICAgICAgICBpZiAoX2dyb3VwID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkV4cGVjdGVkIGdyb3VwIGFzIFwiICsgbmFtZSwgdGhpcy5mZXRjaCgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2dyb3VwO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgXCJvcmlnaW5hbFwiOlxuICAgICAgY2FzZSBudWxsOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJndW1lbnRHcm91cChvcHRpb25hbCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlVua25vd24gZ3JvdXAgdHlwZSBhcyBcIiArIG5hbWUsIHRoaXMuZmV0Y2goKSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEaXNjYXJkIGFueSBzcGFjZSB0b2tlbnMsIGZldGNoaW5nIHRoZSBuZXh0IG5vbi1zcGFjZSB0b2tlbi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY29uc3VtZVNwYWNlcyA9IGZ1bmN0aW9uIGNvbnN1bWVTcGFjZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuZmV0Y2goKS50ZXh0ID09PSBcIiBcIikge1xuICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBncm91cCwgZXNzZW50aWFsbHkgcmV0dXJuaW5nIHRoZSBzdHJpbmcgZm9ybWVkIGJ5IHRoZVxuICAgKiBicmFjZS1lbmNsb3NlZCB0b2tlbnMgcGx1cyBzb21lIHBvc2l0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZVN0cmluZ0dyb3VwID0gZnVuY3Rpb24gcGFyc2VTdHJpbmdHcm91cChtb2RlTmFtZSwgLy8gVXNlZCB0byBkZXNjcmliZSB0aGUgbW9kZSBpbiBlcnJvciBtZXNzYWdlcy5cbiAgb3B0aW9uYWwpIHtcbiAgICB2YXIgYXJnVG9rZW4gPSB0aGlzLmd1bGxldC5zY2FuQXJndW1lbnQob3B0aW9uYWwpO1xuXG4gICAgaWYgKGFyZ1Rva2VuID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIHZhciBuZXh0VG9rZW47XG5cbiAgICB3aGlsZSAoKG5leHRUb2tlbiA9IHRoaXMuZmV0Y2goKSkudGV4dCAhPT0gXCJFT0ZcIikge1xuICAgICAgc3RyICs9IG5leHRUb2tlbi50ZXh0O1xuICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25zdW1lKCk7IC8vIGNvbnN1bWUgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnRcblxuICAgIGFyZ1Rva2VuLnRleHQgPSBzdHI7XG4gICAgcmV0dXJuIGFyZ1Rva2VuO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgYSByZWdleC1kZWxpbWl0ZWQgZ3JvdXA6IHRoZSBsYXJnZXN0IHNlcXVlbmNlIG9mIHRva2Vuc1xuICAgKiB3aG9zZSBjb25jYXRlbmF0ZWQgc3RyaW5ncyBtYXRjaCBgcmVnZXhgLiBSZXR1cm5zIHRoZSBzdHJpbmdcbiAgICogZm9ybWVkIGJ5IHRoZSB0b2tlbnMgcGx1cyBzb21lIHBvc2l0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZVJlZ2V4R3JvdXAgPSBmdW5jdGlvbiBwYXJzZVJlZ2V4R3JvdXAocmVnZXgsIG1vZGVOYW1lIC8vIFVzZWQgdG8gZGVzY3JpYmUgdGhlIG1vZGUgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICkge1xuICAgIHZhciBmaXJzdFRva2VuID0gdGhpcy5mZXRjaCgpO1xuICAgIHZhciBsYXN0VG9rZW4gPSBmaXJzdFRva2VuO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIHZhciBuZXh0VG9rZW47XG5cbiAgICB3aGlsZSAoKG5leHRUb2tlbiA9IHRoaXMuZmV0Y2goKSkudGV4dCAhPT0gXCJFT0ZcIiAmJiByZWdleC50ZXN0KHN0ciArIG5leHRUb2tlbi50ZXh0KSkge1xuICAgICAgbGFzdFRva2VuID0gbmV4dFRva2VuO1xuICAgICAgc3RyICs9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0ciA9PT0gXCJcIikge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBcIiArIG1vZGVOYW1lICsgXCI6ICdcIiArIGZpcnN0VG9rZW4udGV4dCArIFwiJ1wiLCBmaXJzdFRva2VuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlyc3RUb2tlbi5yYW5nZShsYXN0VG9rZW4sIHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBhIGNvbG9yIGRlc2NyaXB0aW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZUNvbG9yR3JvdXAgPSBmdW5jdGlvbiBwYXJzZUNvbG9yR3JvdXAob3B0aW9uYWwpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5wYXJzZVN0cmluZ0dyb3VwKFwiY29sb3JcIiwgb3B0aW9uYWwpO1xuXG4gICAgaWYgKHJlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2ggPSAvXigjW2EtZjAtOV17M318Iz9bYS1mMC05XXs2fXxbYS16XSspJC9pLmV4ZWMocmVzLnRleHQpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCBjb2xvcjogJ1wiICsgcmVzLnRleHQgKyBcIidcIiwgcmVzKTtcbiAgICB9XG5cbiAgICB2YXIgY29sb3IgPSBtYXRjaFswXTtcblxuICAgIGlmICgvXlswLTlhLWZdezZ9JC9pLnRlc3QoY29sb3IpKSB7XG4gICAgICAvLyBXZSBhbGxvdyBhIDYtZGlnaXQgSFRNTCBjb2xvciBzcGVjIHdpdGhvdXQgYSBsZWFkaW5nIFwiI1wiLlxuICAgICAgLy8gVGhpcyBmb2xsb3dzIHRoZSB4Y29sb3IgcGFja2FnZSdzIEhUTUwgY29sb3IgbW9kZWwuXG4gICAgICAvLyBQcmVkZWZpbmVkIGNvbG9yIG5hbWVzIGFyZSBhbGwgbWlzc2VkIGJ5IHRoaXMgUmVnRXggcGF0dGVybi5cbiAgICAgIGNvbG9yID0gXCIjXCIgKyBjb2xvcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb2xvci10b2tlblwiLFxuICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgY29sb3I6IGNvbG9yXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogUGFyc2VzIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLCBjb25zaXN0aW5nIG9mIG1hZ25pdHVkZSBhbmQgdW5pdC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucGFyc2VTaXplR3JvdXAgPSBmdW5jdGlvbiBwYXJzZVNpemVHcm91cChvcHRpb25hbCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGlzQmxhbmsgPSBmYWxzZTsgLy8gZG9uJ3QgZXhwYW5kIGJlZm9yZSBwYXJzZVN0cmluZ0dyb3VwXG5cbiAgICB0aGlzLmd1bGxldC5jb25zdW1lU3BhY2VzKCk7XG5cbiAgICBpZiAoIW9wdGlvbmFsICYmIHRoaXMuZ3VsbGV0LmZ1dHVyZSgpLnRleHQgIT09IFwie1wiKSB7XG4gICAgICByZXMgPSB0aGlzLnBhcnNlUmVnZXhHcm91cCgvXlstK10/ICooPzokfFxcZCt8XFxkK1xcLlxcZCp8XFwuXFxkKikgKlthLXpdezAsMn0gKiQvLCBcInNpemVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHRoaXMucGFyc2VTdHJpbmdHcm91cChcInNpemVcIiwgb3B0aW9uYWwpO1xuICAgIH1cblxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbmFsICYmIHJlcy50ZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gQmVjYXVzZSB3ZSd2ZSB0ZXN0ZWQgZm9yIHdoYXQgaXMgIW9wdGlvbmFsLCB0aGlzIGJsb2NrIHdvbid0XG4gICAgICAvLyBhZmZlY3QgXFxrZXJuLCBcXGhzcGFjZSwgZXRjLiBJdCB3aWxsIGNhcHR1cmUgdGhlIG1hbmRhdG9yeSBhcmd1bWVudHNcbiAgICAgIC8vIHRvIFxcZ2VuZnJhYyBhbmQgXFxhYm92ZS5cbiAgICAgIHJlcy50ZXh0ID0gXCIwcHRcIjsgLy8gRW5hYmxlIFxcYWJvdmV7fVxuXG4gICAgICBpc0JsYW5rID0gdHJ1ZTsgLy8gVGhpcyBpcyBoZXJlIHNwZWNpZmljYWxseSBmb3IgXFxnZW5mcmFjXG4gICAgfVxuXG4gICAgdmFyIG1hdGNoID0gLyhbLStdPykgKihcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspICooW2Etel17Mn0pLy5leGVjKHJlcy50ZXh0KTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkludmFsaWQgc2l6ZTogJ1wiICsgcmVzLnRleHQgKyBcIidcIiwgcmVzKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIG51bWJlcjogKyhtYXRjaFsxXSArIG1hdGNoWzJdKSxcbiAgICAgIC8vIHNpZ24gKyBtYWduaXR1ZGUsIGNhc3QgdG8gbnVtYmVyXG4gICAgICB1bml0OiBtYXRjaFszXVxuICAgIH07XG5cbiAgICBpZiAoIXZhbGlkVW5pdChkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiSW52YWxpZCB1bml0OiAnXCIgKyBkYXRhLnVuaXQgKyBcIidcIiwgcmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzaXplXCIsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICB2YWx1ZTogZGF0YSxcbiAgICAgIGlzQmxhbms6IGlzQmxhbmtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gVVJMLCBjaGVja2luZyBlc2NhcGVkIGxldHRlcnMgYW5kIGFsbG93ZWQgcHJvdG9jb2xzLFxuICAgKiBhbmQgc2V0dGluZyB0aGUgY2F0Y29kZSBvZiAlIGFzIGFuIGFjdGl2ZSBjaGFyYWN0ZXIgKGFzIGluIFxcaHlwZXJyZWYpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZVVybEdyb3VwID0gZnVuY3Rpb24gcGFyc2VVcmxHcm91cChvcHRpb25hbCkge1xuICAgIHRoaXMuZ3VsbGV0LmxleGVyLnNldENhdGNvZGUoXCIlXCIsIDEzKTsgLy8gYWN0aXZlIGNoYXJhY3RlclxuXG4gICAgdGhpcy5ndWxsZXQubGV4ZXIuc2V0Q2F0Y29kZShcIn5cIiwgMTIpOyAvLyBvdGhlciBjaGFyYWN0ZXJcblxuICAgIHZhciByZXMgPSB0aGlzLnBhcnNlU3RyaW5nR3JvdXAoXCJ1cmxcIiwgb3B0aW9uYWwpO1xuICAgIHRoaXMuZ3VsbGV0LmxleGVyLnNldENhdGNvZGUoXCIlXCIsIDE0KTsgLy8gY29tbWVudCBjaGFyYWN0ZXJcblxuICAgIHRoaXMuZ3VsbGV0LmxleGVyLnNldENhdGNvZGUoXCJ+XCIsIDEzKTsgLy8gYWN0aXZlIGNoYXJhY3RlclxuXG4gICAgaWYgKHJlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IC8vIGh5cGVycmVmIHBhY2thZ2UgYWxsb3dzIGJhY2tzbGFzaGVzIGFsb25lIGluIGhyZWYsIGJ1dCBkb2Vzbid0XG4gICAgLy8gZ2VuZXJhdGUgdmFsaWQgbGlua3MgaW4gc3VjaCBjYXNlczsgd2UgaW50ZXJwcmV0IHRoaXMgYXNcbiAgICAvLyBcInVuZGVmaW5lZFwiIGJlaGF2aW91ciwgYW5kIGtlZXAgdGhlbSBhcy1pcy4gU29tZSBicm93c2VyIHdpbGxcbiAgICAvLyByZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzLlxuXG5cbiAgICB2YXIgdXJsID0gcmVzLnRleHQucmVwbGFjZSgvXFxcXChbIyQlJn5fXnt9XSkvZywgJyQxJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwidXJsXCIsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICB1cmw6IHVybFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBhcmd1bWVudCB3aXRoIHRoZSBtb2RlIHNwZWNpZmllZC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucGFyc2VBcmd1bWVudEdyb3VwID0gZnVuY3Rpb24gcGFyc2VBcmd1bWVudEdyb3VwKG9wdGlvbmFsLCBtb2RlKSB7XG4gICAgdmFyIGFyZ1Rva2VuID0gdGhpcy5ndWxsZXQuc2NhbkFyZ3VtZW50KG9wdGlvbmFsKTtcblxuICAgIGlmIChhcmdUb2tlbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3V0ZXJNb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgaWYgKG1vZGUpIHtcbiAgICAgIC8vIFN3aXRjaCB0byBzcGVjaWZpZWQgbW9kZVxuICAgICAgdGhpcy5zd2l0Y2hNb2RlKG1vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuZ3VsbGV0LmJlZ2luR3JvdXAoKTtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VFeHByZXNzaW9uKGZhbHNlLCBcIkVPRlwiKTsgLy8gVE9ETzogZmluZCBhbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZGVub3RlIHRoZSBlbmRcblxuICAgIHRoaXMuZXhwZWN0KFwiRU9GXCIpOyAvLyBleHBlY3QgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnRcblxuICAgIHRoaXMuZ3VsbGV0LmVuZEdyb3VwKCk7XG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgIHR5cGU6IFwib3JkZ3JvdXBcIixcbiAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgIGxvYzogYXJnVG9rZW4ubG9jLFxuICAgICAgYm9keTogZXhwcmVzc2lvblxuICAgIH07XG5cbiAgICBpZiAobW9kZSkge1xuICAgICAgLy8gU3dpdGNoIG1vZGUgYmFja1xuICAgICAgdGhpcy5zd2l0Y2hNb2RlKG91dGVyTW9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUGFyc2VzIGFuIG9yZGluYXJ5IGdyb3VwLCB3aGljaCBpcyBlaXRoZXIgYSBzaW5nbGUgbnVjbGV1cyAobGlrZSBcInhcIilcbiAgICogb3IgYW4gZXhwcmVzc2lvbiBpbiBicmFjZXMgKGxpa2UgXCJ7eCt5fVwiKSBvciBhbiBpbXBsaWNpdCBncm91cCwgYSBncm91cFxuICAgKiB0aGF0IHN0YXJ0cyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIGVuZHMgcmlnaHQgYmVmb3JlIGEgaGlnaGVyIGV4cGxpY2l0XG4gICAqIGdyb3VwIGVuZHMsIG9yIGF0IEVPRi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucGFyc2VHcm91cCA9IGZ1bmN0aW9uIHBhcnNlR3JvdXAobmFtZSwgLy8gRm9yIGVycm9yIHJlcG9ydGluZy5cbiAgYnJlYWtPblRva2VuVGV4dCkge1xuICAgIHZhciBmaXJzdFRva2VuID0gdGhpcy5mZXRjaCgpO1xuICAgIHZhciB0ZXh0ID0gZmlyc3RUb2tlbi50ZXh0O1xuICAgIHZhciByZXN1bHQ7IC8vIFRyeSB0byBwYXJzZSBhbiBvcGVuIGJyYWNlIG9yIFxcYmVnaW5ncm91cFxuXG4gICAgaWYgKHRleHQgPT09IFwie1wiIHx8IHRleHQgPT09IFwiXFxcXGJlZ2luZ3JvdXBcIikge1xuICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICB2YXIgZ3JvdXBFbmQgPSB0ZXh0ID09PSBcIntcIiA/IFwifVwiIDogXCJcXFxcZW5kZ3JvdXBcIjtcbiAgICAgIHRoaXMuZ3VsbGV0LmJlZ2luR3JvdXAoKTsgLy8gSWYgd2UgZ2V0IGEgYnJhY2UsIHBhcnNlIGFuIGV4cHJlc3Npb25cblxuICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlRXhwcmVzc2lvbihmYWxzZSwgZ3JvdXBFbmQpO1xuICAgICAgdmFyIGxhc3RUb2tlbiA9IHRoaXMuZmV0Y2goKTtcbiAgICAgIHRoaXMuZXhwZWN0KGdyb3VwRW5kKTsgLy8gQ2hlY2sgdGhhdCB3ZSBnb3QgYSBtYXRjaGluZyBjbG9zaW5nIGJyYWNlXG5cbiAgICAgIHRoaXMuZ3VsbGV0LmVuZEdyb3VwKCk7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHR5cGU6IFwib3JkZ3JvdXBcIixcbiAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgICBsb2M6IFNvdXJjZUxvY2F0aW9uLnJhbmdlKGZpcnN0VG9rZW4sIGxhc3RUb2tlbiksXG4gICAgICAgIGJvZHk6IGV4cHJlc3Npb24sXG4gICAgICAgIC8vIEEgZ3JvdXAgZm9ybWVkIGJ5IFxcYmVnaW5ncm91cC4uLlxcZW5kZ3JvdXAgaXMgYSBzZW1pLXNpbXBsZSBncm91cFxuICAgICAgICAvLyB3aGljaCBkb2Vzbid0IGFmZmVjdCBzcGFjaW5nIGluIG1hdGggbW9kZSwgaS5lLiwgaXMgdHJhbnNwYXJlbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vdGV4LnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xOTMwL3doZW4tc2hvdWxkLW9uZS1cbiAgICAgICAgLy8gdXNlLWJlZ2luZ3JvdXAtaW5zdGVhZC1vZi1iZ3JvdXBcbiAgICAgICAgc2VtaXNpbXBsZTogdGV4dCA9PT0gXCJcXFxcYmVnaW5ncm91cFwiIHx8IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUgZXhpc3RzIGEgZnVuY3Rpb24gd2l0aCB0aGlzIG5hbWUsIHBhcnNlIHRoZSBmdW5jdGlvbi5cbiAgICAgIC8vIE90aGVyd2lzZSwganVzdCByZXR1cm4gYSBudWNsZXVzXG4gICAgICByZXN1bHQgPSB0aGlzLnBhcnNlRnVuY3Rpb24oYnJlYWtPblRva2VuVGV4dCwgbmFtZSkgfHwgdGhpcy5wYXJzZVN5bWJvbCgpO1xuXG4gICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgdGV4dFswXSA9PT0gXCJcXFxcXCIgJiYgIWltcGxpY2l0Q29tbWFuZHMuaGFzT3duUHJvcGVydHkodGV4dCkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MudGhyb3dPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IHNyY19QYXJzZUVycm9yKFwiVW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2U6IFwiICsgdGV4dCwgZmlyc3RUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSB0aGlzLmZvcm1hdFVuc3VwcG9ydGVkQ21kKHRleHQpO1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBGb3JtIGxpZ2F0dXJlLWxpa2UgY29tYmluYXRpb25zIG9mIGNoYXJhY3RlcnMgZm9yIHRleHQgbW9kZS5cbiAgICogVGhpcyBpbmNsdWRlcyBpbnB1dHMgbGlrZSBcIi0tXCIsIFwiLS0tXCIsIFwiYGBcIiBhbmQgXCInJ1wiLlxuICAgKiBUaGUgcmVzdWx0IHdpbGwgc2ltcGx5IHJlcGxhY2UgbXVsdGlwbGUgdGV4dG9yZCBub2RlcyB3aXRoIGEgc2luZ2xlXG4gICAqIGNoYXJhY3RlciBpbiBlYWNoIHZhbHVlIGJ5IGEgc2luZ2xlIHRleHRvcmQgbm9kZSBoYXZpbmcgbXVsdGlwbGVcbiAgICogY2hhcmFjdGVycyBpbiBpdHMgdmFsdWUuICBUaGUgcmVwcmVzZW50YXRpb24gaXMgc3RpbGwgQVNDSUkgc291cmNlLlxuICAgKiBUaGUgZ3JvdXAgd2lsbCBiZSBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZm9ybUxpZ2F0dXJlcyA9IGZ1bmN0aW9uIGZvcm1MaWdhdHVyZXMoZ3JvdXApIHtcbiAgICB2YXIgbiA9IGdyb3VwLmxlbmd0aCAtIDE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIGEgPSBncm91cFtpXTsgLy8gJEZsb3dGaXhNZTogTm90IGV2ZXJ5IG5vZGUgdHlwZSBoYXMgYSBgdGV4dGAgcHJvcGVydHkuXG5cbiAgICAgIHZhciB2ID0gYS50ZXh0O1xuXG4gICAgICBpZiAodiA9PT0gXCItXCIgJiYgZ3JvdXBbaSArIDFdLnRleHQgPT09IFwiLVwiKSB7XG4gICAgICAgIGlmIChpICsgMSA8IG4gJiYgZ3JvdXBbaSArIDJdLnRleHQgPT09IFwiLVwiKSB7XG4gICAgICAgICAgZ3JvdXAuc3BsaWNlKGksIDMsIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dG9yZFwiLFxuICAgICAgICAgICAgbW9kZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICBsb2M6IFNvdXJjZUxvY2F0aW9uLnJhbmdlKGEsIGdyb3VwW2kgKyAyXSksXG4gICAgICAgICAgICB0ZXh0OiBcIi0tLVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbiAtPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyb3VwLnNwbGljZShpLCAyLCB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRvcmRcIixcbiAgICAgICAgICAgIG1vZGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgbG9jOiBTb3VyY2VMb2NhdGlvbi5yYW5nZShhLCBncm91cFtpICsgMV0pLFxuICAgICAgICAgICAgdGV4dDogXCItLVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbiAtPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgodiA9PT0gXCInXCIgfHwgdiA9PT0gXCJgXCIpICYmIGdyb3VwW2kgKyAxXS50ZXh0ID09PSB2KSB7XG4gICAgICAgIGdyb3VwLnNwbGljZShpLCAyLCB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0b3JkXCIsXG4gICAgICAgICAgbW9kZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbG9jOiBTb3VyY2VMb2NhdGlvbi5yYW5nZShhLCBncm91cFtpICsgMV0pLFxuICAgICAgICAgIHRleHQ6IHYgKyB2XG4gICAgICAgIH0pO1xuICAgICAgICBuIC09IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBQYXJzZSBhIHNpbmdsZSBzeW1ib2wgb3V0IG9mIHRoZSBzdHJpbmcuIEhlcmUsIHdlIGhhbmRsZSBzaW5nbGUgY2hhcmFjdGVyXG4gICAqIHN5bWJvbHMgYW5kIHNwZWNpYWwgZnVuY3Rpb25zIGxpa2UgXFx2ZXJiLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5wYXJzZVN5bWJvbCA9IGZ1bmN0aW9uIHBhcnNlU3ltYm9sKCkge1xuICAgIHZhciBudWNsZXVzID0gdGhpcy5mZXRjaCgpO1xuICAgIHZhciB0ZXh0ID0gbnVjbGV1cy50ZXh0O1xuXG4gICAgaWYgKC9eXFxcXHZlcmJbXmEtekEtWl0vLnRlc3QodGV4dCkpIHtcbiAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgdmFyIGFyZyA9IHRleHQuc2xpY2UoNSk7XG4gICAgICB2YXIgc3RhciA9IGFyZy5jaGFyQXQoMCkgPT09IFwiKlwiO1xuXG4gICAgICBpZiAoc3Rhcikge1xuICAgICAgICBhcmcgPSBhcmcuc2xpY2UoMSk7XG4gICAgICB9IC8vIExleGVyJ3MgdG9rZW5SZWdleCBpcyBjb25zdHJ1Y3RlZCB0byBhbHdheXMgaGF2ZSBtYXRjaGluZ1xuICAgICAgLy8gZmlyc3QvbGFzdCBjaGFyYWN0ZXJzLlxuXG5cbiAgICAgIGlmIChhcmcubGVuZ3RoIDwgMiB8fCBhcmcuY2hhckF0KDApICE9PSBhcmcuc2xpY2UoLTEpKSB7XG4gICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFx2ZXJiIGFzc2VydGlvbiBmYWlsZWQgLS1cXG4gICAgICAgICAgICAgICAgICAgIHBsZWFzZSByZXBvcnQgd2hhdCBpbnB1dCBjYXVzZWQgdGhpcyBidWdcIik7XG4gICAgICB9XG5cbiAgICAgIGFyZyA9IGFyZy5zbGljZSgxLCAtMSk7IC8vIHJlbW92ZSBmaXJzdCBhbmQgbGFzdCBjaGFyXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwidmVyYlwiLFxuICAgICAgICBtb2RlOiBcInRleHRcIixcbiAgICAgICAgYm9keTogYXJnLFxuICAgICAgICBzdGFyOiBzdGFyXG4gICAgICB9O1xuICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGhhdmUgYSBzeW1ib2wsIHBvc3NpYmx5IHdpdGggYWNjZW50cy5cbiAgICAvLyBGaXJzdCBleHBhbmQgYW55IGFjY2VudGVkIGJhc2Ugc3ltYm9sIGFjY29yZGluZyB0byB1bmljb2RlU3ltYm9scy5cblxuXG4gICAgaWYgKHVuaWNvZGVTeW1ib2xzLmhhc093blByb3BlcnR5KHRleHRbMF0pICYmICFzcmNfc3ltYm9sc1t0aGlzLm1vZGVdW3RleHRbMF1dKSB7XG4gICAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG5vdCBzdHJpY3QgKFhlVGVYLWNvbXBhdGlibGUpIGluIG1hdGggbW9kZS5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnN0cmljdCAmJiB0aGlzLm1vZGUgPT09IFwibWF0aFwiKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwidW5pY29kZVRleHRJbk1hdGhNb2RlXCIsIFwiQWNjZW50ZWQgVW5pY29kZSB0ZXh0IGNoYXJhY3RlciBcXFwiXCIgKyB0ZXh0WzBdICsgXCJcXFwiIHVzZWQgaW4gXCIgKyBcIm1hdGggbW9kZVwiLCBudWNsZXVzKTtcbiAgICAgIH1cblxuICAgICAgdGV4dCA9IHVuaWNvZGVTeW1ib2xzW3RleHRbMF1dICsgdGV4dC5zbGljZSgxKTtcbiAgICB9IC8vIFN0cmlwIG9mZiBhbnkgY29tYmluaW5nIGNoYXJhY3RlcnNcblxuXG4gICAgdmFyIG1hdGNoID0gY29tYmluaW5nRGlhY3JpdGljYWxNYXJrc0VuZFJlZ2V4LmV4ZWModGV4dCk7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCk7XG5cbiAgICAgIGlmICh0ZXh0ID09PSAnaScpIHtcbiAgICAgICAgdGV4dCA9IFwiXFx1MDEzMVwiOyAvLyBkb3RsZXNzIGksIGluIG1hdGggYW5kIHRleHQgbW9kZVxuICAgICAgfSBlbHNlIGlmICh0ZXh0ID09PSAnaicpIHtcbiAgICAgICAgdGV4dCA9IFwiXFx1MDIzN1wiOyAvLyBkb3RsZXNzIGosIGluIG1hdGggYW5kIHRleHQgbW9kZVxuICAgICAgfVxuICAgIH0gLy8gUmVjb2duaXplIGJhc2Ugc3ltYm9sXG5cblxuICAgIHZhciBzeW1ib2w7XG5cbiAgICBpZiAoc3JjX3N5bWJvbHNbdGhpcy5tb2RlXVt0ZXh0XSkge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc3RyaWN0ICYmIHRoaXMubW9kZSA9PT0gJ21hdGgnICYmIGV4dHJhTGF0aW4uaW5kZXhPZih0ZXh0KSA+PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwidW5pY29kZVRleHRJbk1hdGhNb2RlXCIsIFwiTGF0aW4tMS9Vbmljb2RlIHRleHQgY2hhcmFjdGVyIFxcXCJcIiArIHRleHRbMF0gKyBcIlxcXCIgdXNlZCBpbiBcIiArIFwibWF0aCBtb2RlXCIsIG51Y2xldXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZ3JvdXAgPSBzcmNfc3ltYm9sc1t0aGlzLm1vZGVdW3RleHRdLmdyb3VwO1xuICAgICAgdmFyIGxvYyA9IFNvdXJjZUxvY2F0aW9uLnJhbmdlKG51Y2xldXMpO1xuICAgICAgdmFyIHM7XG5cbiAgICAgIGlmIChBVE9NUy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICB2YXIgZmFtaWx5ID0gZ3JvdXA7XG4gICAgICAgIHMgPSB7XG4gICAgICAgICAgdHlwZTogXCJhdG9tXCIsXG4gICAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgICAgIGZhbWlseTogZmFtaWx5LFxuICAgICAgICAgIGxvYzogbG9jLFxuICAgICAgICAgIHRleHQ6IHRleHRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgcyA9IHtcbiAgICAgICAgICB0eXBlOiBncm91cCxcbiAgICAgICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICAgICAgbG9jOiBsb2MsXG4gICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICB9O1xuICAgICAgfSAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgc3ltYm9sID0gcztcbiAgICB9IGVsc2UgaWYgKHRleHQuY2hhckNvZGVBdCgwKSA+PSAweDgwKSB7XG4gICAgICAvLyBubyBzeW1ib2wgZm9yIGUuZy4gXlxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc3RyaWN0KSB7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQ29kZXBvaW50KHRleHQuY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLnJlcG9ydE5vbnN0cmljdChcInVua25vd25TeW1ib2xcIiwgXCJVbnJlY29nbml6ZWQgVW5pY29kZSBjaGFyYWN0ZXIgXFxcIlwiICsgdGV4dFswXSArIFwiXFxcIlwiICsgKFwiIChcIiArIHRleHQuY2hhckNvZGVBdCgwKSArIFwiKVwiKSwgbnVjbGV1cyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSBcIm1hdGhcIikge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MucmVwb3J0Tm9uc3RyaWN0KFwidW5pY29kZVRleHRJbk1hdGhNb2RlXCIsIFwiVW5pY29kZSB0ZXh0IGNoYXJhY3RlciBcXFwiXCIgKyB0ZXh0WzBdICsgXCJcXFwiIHVzZWQgaW4gbWF0aCBtb2RlXCIsIG51Y2xldXMpO1xuICAgICAgICB9XG4gICAgICB9IC8vIEFsbCBub25tYXRoZW1hdGljYWwgVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSByZW5kZXJlZCBhcyBpZiB0aGV5XG4gICAgICAvLyBhcmUgaW4gdGV4dCBtb2RlICh3cmFwcGVkIGluIFxcdGV4dCkgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpdFxuICAgICAgLy8gdGFrZXMgdG8gcmVuZGVyIHRoZW0gaW4gTGFUZVguICBTZXR0aW5nIGBtb2RlOiB0aGlzLm1vZGVgIGlzXG4gICAgICAvLyBhbm90aGVyIG5hdHVyYWwgY2hvaWNlICh0aGUgdXNlciByZXF1ZXN0ZWQgbWF0aCBtb2RlKSwgYnV0XG4gICAgICAvLyB0aGlzIG1ha2VzIGl0IG1vcmUgZGlmZmljdWx0IGZvciBnZXRDaGFyYWN0ZXJNZXRyaWNzKCkgdG9cbiAgICAgIC8vIGRpc3Rpbmd1aXNoIFVuaWNvZGUgY2hhcmFjdGVycyB3aXRob3V0IG1ldHJpY3MgYW5kIHRob3NlIGZvclxuICAgICAgLy8gd2hpY2ggd2Ugd2FudCB0byBzaW11bGF0ZSB0aGUgbGV0dGVyIE0uXG5cblxuICAgICAgc3ltYm9sID0ge1xuICAgICAgICB0eXBlOiBcInRleHRvcmRcIixcbiAgICAgICAgbW9kZTogXCJ0ZXh0XCIsXG4gICAgICAgIGxvYzogU291cmNlTG9jYXRpb24ucmFuZ2UobnVjbGV1cyksXG4gICAgICAgIHRleHQ6IHRleHRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBFT0YsIF4sIF8sIHssIH0sIGV0Yy5cbiAgICB9XG5cbiAgICB0aGlzLmNvbnN1bWUoKTsgLy8gVHJhbnNmb3JtIGNvbWJpbmluZyBjaGFyYWN0ZXJzIGludG8gYWNjZW50c1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhY2NlbnQgPSBtYXRjaFswXVtpXTtcblxuICAgICAgICBpZiAoIXVuaWNvZGVBY2NlbnRzW2FjY2VudF0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJVbmtub3duIGFjY2VudCAnIFwiICsgYWNjZW50ICsgXCInXCIsIG51Y2xldXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbW1hbmQgPSB1bmljb2RlQWNjZW50c1thY2NlbnRdW3RoaXMubW9kZV0gfHwgdW5pY29kZUFjY2VudHNbYWNjZW50XS50ZXh0O1xuXG4gICAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIkFjY2VudCBcIiArIGFjY2VudCArIFwiIHVuc3VwcG9ydGVkIGluIFwiICsgdGhpcy5tb2RlICsgXCIgbW9kZVwiLCBudWNsZXVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN5bWJvbCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFjY2VudFwiLFxuICAgICAgICAgIG1vZGU6IHRoaXMubW9kZSxcbiAgICAgICAgICBsb2M6IFNvdXJjZUxvY2F0aW9uLnJhbmdlKG51Y2xldXMpLFxuICAgICAgICAgIGxhYmVsOiBjb21tYW5kLFxuICAgICAgICAgIGlzU3RyZXRjaHk6IGZhbHNlLFxuICAgICAgICAgIGlzU2hpZnR5OiB0cnVlLFxuICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICBiYXNlOiBzeW1ib2xcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVcblxuXG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfTtcblxuICByZXR1cm4gUGFyc2VyO1xufSgpO1xuXG5QYXJzZXIuZW5kT2ZFeHByZXNzaW9uID0gW1wifVwiLCBcIlxcXFxlbmRncm91cFwiLCBcIlxcXFxlbmRcIiwgXCJcXFxccmlnaHRcIiwgXCImXCJdO1xuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcGFyc2VUcmVlLmpzXG4vKipcbiAqIFByb3ZpZGVzIGEgc2luZ2xlIGZ1bmN0aW9uIGZvciBwYXJzaW5nIGFuIGV4cHJlc3Npb24gdXNpbmcgYSBQYXJzZXJcbiAqIFRPRE8oZW1pbHkpOiBSZW1vdmUgdGhpc1xuICovXG5cblxuXG5cbi8qKlxuICogUGFyc2VzIGFuIGV4cHJlc3Npb24gdXNpbmcgYSBQYXJzZXIsIHRoZW4gcmV0dXJucyB0aGUgcGFyc2VkIHJlc3VsdC5cbiAqL1xudmFyIHBhcnNlVHJlZSA9IGZ1bmN0aW9uIHBhcnNlVHJlZSh0b1BhcnNlLCBzZXR0aW5ncykge1xuICBpZiAoISh0eXBlb2YgdG9QYXJzZSA9PT0gJ3N0cmluZycgfHwgdG9QYXJzZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdLYVRlWCBjYW4gb25seSBwYXJzZSBzdHJpbmcgdHlwZWQgZXhwcmVzc2lvbicpO1xuICB9XG5cbiAgdmFyIHBhcnNlciA9IG5ldyBQYXJzZXIodG9QYXJzZSwgc2V0dGluZ3MpOyAvLyBCbGFuayBvdXQgYW55IFxcZGZAdGFnIHRvIGF2b2lkIHNwdXJpb3VzIFwiRHVwbGljYXRlIFxcdGFnXCIgZXJyb3JzXG5cbiAgZGVsZXRlIHBhcnNlci5ndWxsZXQubWFjcm9zLmN1cnJlbnRbXCJcXFxcZGZAdGFnXCJdO1xuICB2YXIgdHJlZSA9IHBhcnNlci5wYXJzZSgpOyAvLyBQcmV2ZW50IGEgY29sb3IgZGVmaW5pdGlvbiBmcm9tIHBlcnNpc3RpbmcgYmV0d2VlbiBjYWxscyB0byBrYXRleC5yZW5kZXIoKS5cblxuICBkZWxldGUgcGFyc2VyLmd1bGxldC5tYWNyb3MuY3VycmVudFtcIlxcXFxjdXJyZW50QGNvbG9yXCJdO1xuICBkZWxldGUgcGFyc2VyLmd1bGxldC5tYWNyb3MuY3VycmVudFtcIlxcXFxjb2xvclwiXTsgLy8gSWYgdGhlIGlucHV0IHVzZWQgXFx0YWcsIGl0IHdpbGwgc2V0IHRoZSBcXGRmQHRhZyBtYWNybyB0byB0aGUgdGFnLlxuICAvLyBJbiB0aGlzIGNhc2UsIHdlIHNlcGFyYXRlbHkgcGFyc2UgdGhlIHRhZyBhbmQgd3JhcCB0aGUgdHJlZS5cblxuICBpZiAocGFyc2VyLmd1bGxldC5tYWNyb3MuZ2V0KFwiXFxcXGRmQHRhZ1wiKSkge1xuICAgIGlmICghc2V0dGluZ3MuZGlzcGxheU1vZGUpIHtcbiAgICAgIHRocm93IG5ldyBzcmNfUGFyc2VFcnJvcihcIlxcXFx0YWcgd29ya3Mgb25seSBpbiBkaXNwbGF5IGVxdWF0aW9uc1wiKTtcbiAgICB9XG5cbiAgICB0cmVlID0gW3tcbiAgICAgIHR5cGU6IFwidGFnXCIsXG4gICAgICBtb2RlOiBcInRleHRcIixcbiAgICAgIGJvZHk6IHRyZWUsXG4gICAgICB0YWc6IHBhcnNlci5zdWJwYXJzZShbbmV3IFRva2VuKFwiXFxcXGRmQHRhZ1wiKV0pXG4gICAgfV07XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19wYXJzZVRyZWUgPSAocGFyc2VUcmVlKTtcbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL2thdGV4LmpzXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgS2FUZVguIEhlcmUsIHdlIGV4cG9zZSBmdW5jdGlvbnMgZm9yXG4gKiByZW5kZXJpbmcgZXhwcmVzc2lvbnMgZWl0aGVyIHRvIERPTSBub2RlcyBvciB0byBtYXJrdXAgc3RyaW5ncy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSB0aGUgUGFyc2VFcnJvciBjbGFzcyB0byBjaGVjayBpZiBlcnJvcnMgdGhyb3duIGZyb20gS2FUZVggYXJlXG4gKiBlcnJvcnMgaW4gdGhlIGV4cHJlc3Npb24sIG9yIGVycm9ycyBpbiBqYXZhc2NyaXB0IGhhbmRsaW5nLlxuICovXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogUGFyc2UgYW5kIGJ1aWxkIGFuIGV4cHJlc3Npb24sIGFuZCBwbGFjZSB0aGF0IGV4cHJlc3Npb24gaW4gdGhlIERPTSBub2RlXG4gKiBnaXZlbi5cbiAqL1xudmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihleHByZXNzaW9uLCBiYXNlTm9kZSwgb3B0aW9ucykge1xuICBiYXNlTm9kZS50ZXh0Q29udGVudCA9IFwiXCI7XG4gIHZhciBub2RlID0gcmVuZGVyVG9Eb21UcmVlKGV4cHJlc3Npb24sIG9wdGlvbnMpLnRvTm9kZSgpO1xuICBiYXNlTm9kZS5hcHBlbmRDaGlsZChub2RlKTtcbn07IC8vIEthVGVYJ3Mgc3R5bGVzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gcXVpcmtzIG1vZGUuIFByaW50IG91dCBhbiBlcnJvciwgYW5kXG4vLyBkaXNhYmxlIHJlbmRlcmluZy5cblxuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGlmIChkb2N1bWVudC5jb21wYXRNb2RlICE9PSBcIkNTUzFDb21wYXRcIikge1xuICAgIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUud2FybihcIldhcm5pbmc6IEthVGVYIGRvZXNuJ3Qgd29yayBpbiBxdWlya3MgbW9kZS4gTWFrZSBzdXJlIHlvdXIgXCIgKyBcIndlYnNpdGUgaGFzIGEgc3VpdGFibGUgZG9jdHlwZS5cIik7XG5cbiAgICByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB0aHJvdyBuZXcgc3JjX1BhcnNlRXJyb3IoXCJLYVRlWCBkb2Vzbid0IHdvcmsgaW4gcXVpcmtzIG1vZGUuXCIpO1xuICAgIH07XG4gIH1cbn1cbi8qKlxuICogUGFyc2UgYW5kIGJ1aWxkIGFuIGV4cHJlc3Npb24sIGFuZCByZXR1cm4gdGhlIG1hcmt1cCBmb3IgdGhhdC5cbiAqL1xuXG5cbnZhciByZW5kZXJUb1N0cmluZyA9IGZ1bmN0aW9uIHJlbmRlclRvU3RyaW5nKGV4cHJlc3Npb24sIG9wdGlvbnMpIHtcbiAgdmFyIG1hcmt1cCA9IHJlbmRlclRvRG9tVHJlZShleHByZXNzaW9uLCBvcHRpb25zKS50b01hcmt1cCgpO1xuICByZXR1cm4gbWFya3VwO1xufTtcbi8qKlxuICogUGFyc2UgYW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJuIHRoZSBwYXJzZSB0cmVlLlxuICovXG5cblxudmFyIGdlbmVyYXRlUGFyc2VUcmVlID0gZnVuY3Rpb24gZ2VuZXJhdGVQYXJzZVRyZWUoZXhwcmVzc2lvbiwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBuZXcgU2V0dGluZ3Mob3B0aW9ucyk7XG4gIHJldHVybiBzcmNfcGFyc2VUcmVlKGV4cHJlc3Npb24sIHNldHRpbmdzKTtcbn07XG4vKipcbiAqIElmIHRoZSBnaXZlbiBlcnJvciBpcyBhIEthVGVYIFBhcnNlRXJyb3IgYW5kIG9wdGlvbnMudGhyb3dPbkVycm9yIGlzIGZhbHNlLFxuICogcmVuZGVycyB0aGUgaW52YWxpZCBMYVRlWCBhcyBhIHNwYW4gd2l0aCBob3ZlciB0aXRsZSBnaXZpbmcgdGhlIEthVGVYXG4gKiBlcnJvciBtZXNzYWdlLiAgT3RoZXJ3aXNlLCBzaW1wbHkgdGhyb3dzIHRoZSBlcnJvci5cbiAqL1xuXG5cbnZhciByZW5kZXJFcnJvciA9IGZ1bmN0aW9uIHJlbmRlckVycm9yKGVycm9yLCBleHByZXNzaW9uLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnRocm93T25FcnJvciB8fCAhKGVycm9yIGluc3RhbmNlb2Ygc3JjX1BhcnNlRXJyb3IpKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICB2YXIgbm9kZSA9IGJ1aWxkQ29tbW9uLm1ha2VTcGFuKFtcImthdGV4LWVycm9yXCJdLCBbbmV3IFN5bWJvbE5vZGUoZXhwcmVzc2lvbildKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBlcnJvci50b1N0cmluZygpKTtcbiAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImNvbG9yOlwiICsgb3B0aW9ucy5lcnJvckNvbG9yKTtcbiAgcmV0dXJuIG5vZGU7XG59O1xuLyoqXG4gKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgdGhlIGthdGV4IGJ1aWxkIHRyZWUuIFRoaXMgaXMgdXNlZCBmb3IgYWR2YW5jZWRcbiAqIHVzZSBjYXNlcyAobGlrZSByZW5kZXJpbmcgdG8gY3VzdG9tIG91dHB1dCkuXG4gKi9cblxuXG52YXIgcmVuZGVyVG9Eb21UcmVlID0gZnVuY3Rpb24gcmVuZGVyVG9Eb21UcmVlKGV4cHJlc3Npb24sIG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzKG9wdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHRyZWUgPSBzcmNfcGFyc2VUcmVlKGV4cHJlc3Npb24sIHNldHRpbmdzKTtcbiAgICByZXR1cm4gYnVpbGRUcmVlKHRyZWUsIGV4cHJlc3Npb24sIHNldHRpbmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcmVuZGVyRXJyb3IoZXJyb3IsIGV4cHJlc3Npb24sIHNldHRpbmdzKTtcbiAgfVxufTtcbi8qKlxuICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBrYXRleCBidWlsZCB0cmVlLCB3aXRoIGp1c3QgSFRNTCAobm8gTWF0aE1MKS5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIChsaWtlIHJlbmRlcmluZyB0byBjdXN0b20gb3V0cHV0KS5cbiAqL1xuXG5cbnZhciByZW5kZXJUb0hUTUxUcmVlID0gZnVuY3Rpb24gcmVuZGVyVG9IVE1MVHJlZShleHByZXNzaW9uLCBvcHRpb25zKSB7XG4gIHZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5ncyhvcHRpb25zKTtcblxuICB0cnkge1xuICAgIHZhciB0cmVlID0gc3JjX3BhcnNlVHJlZShleHByZXNzaW9uLCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIGJ1aWxkSFRNTFRyZWUodHJlZSwgZXhwcmVzc2lvbiwgc2V0dGluZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiByZW5kZXJFcnJvcihlcnJvciwgZXhwcmVzc2lvbiwgc2V0dGluZ3MpO1xuICB9XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBrYXRleCA9ICh7XG4gIC8qKlxuICAgKiBDdXJyZW50IEthVGVYIHZlcnNpb25cbiAgICovXG4gIHZlcnNpb246IFwiMC4xNi40XCIsXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGdpdmVuIExhVGVYIGludG8gYW4gSFRNTCtNYXRoTUwgY29tYmluYXRpb24sIGFuZCBhZGRzXG4gICAqIGl0IGFzIGEgY2hpbGQgdG8gdGhlIHNwZWNpZmllZCBET00gbm9kZS5cbiAgICovXG4gIHJlbmRlcjogcmVuZGVyLFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBnaXZlbiBMYVRlWCBpbnRvIGFuIEhUTUwrTWF0aE1MIGNvbWJpbmF0aW9uIHN0cmluZyxcbiAgICogZm9yIHNlbmRpbmcgdG8gdGhlIGNsaWVudC5cbiAgICovXG4gIHJlbmRlclRvU3RyaW5nOiByZW5kZXJUb1N0cmluZyxcblxuICAvKipcbiAgICogS2FUZVggZXJyb3IsIHVzdWFsbHkgZHVyaW5nIHBhcnNpbmcuXG4gICAqL1xuICBQYXJzZUVycm9yOiBzcmNfUGFyc2VFcnJvcixcblxuICAvKipcbiAgICogVGhlIHNoZW1hIG9mIFNldHRpbmdzXG4gICAqL1xuICBTRVRUSU5HU19TQ0hFTUE6IFNFVFRJTkdTX1NDSEVNQSxcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBnaXZlbiBMYVRlWCBpbnRvIEthVGVYJ3MgaW50ZXJuYWwgcGFyc2UgdHJlZSBzdHJ1Y3R1cmUsXG4gICAqIHdpdGhvdXQgcmVuZGVyaW5nIHRvIEhUTUwgb3IgTWF0aE1MLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHJlY29tbWVuZGVkIGZvciBwdWJsaWMgdXNlLlxuICAgKiBUaGUgaW50ZXJuYWwgdHJlZSByZXByZXNlbnRhdGlvbiBpcyB1bnN0YWJsZSBhbmQgaXMgdmVyeSBsaWtlbHlcbiAgICogdG8gY2hhbmdlLiBVc2UgYXQgeW91ciBvd24gcmlzay5cbiAgICovXG4gIF9fcGFyc2U6IGdlbmVyYXRlUGFyc2VUcmVlLFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBnaXZlbiBMYVRlWCBpbnRvIGFuIEhUTUwrTWF0aE1MIGludGVybmFsIERPTSB0cmVlXG4gICAqIHJlcHJlc2VudGF0aW9uLCB3aXRob3V0IGZsYXR0ZW5pbmcgdGhhdCByZXByZXNlbnRhdGlvbiB0byBhIHN0cmluZy5cbiAgICpcbiAgICogTk9URTogVGhpcyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSByZWNvbW1lbmRlZCBmb3IgcHVibGljIHVzZS5cbiAgICogVGhlIGludGVybmFsIHRyZWUgcmVwcmVzZW50YXRpb24gaXMgdW5zdGFibGUgYW5kIGlzIHZlcnkgbGlrZWx5XG4gICAqIHRvIGNoYW5nZS4gVXNlIGF0IHlvdXIgb3duIHJpc2suXG4gICAqL1xuICBfX3JlbmRlclRvRG9tVHJlZTogcmVuZGVyVG9Eb21UcmVlLFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBnaXZlbiBMYVRlWCBpbnRvIGFuIEhUTUwgaW50ZXJuYWwgRE9NIHRyZWUgcmVwcmVzZW50YXRpb24sXG4gICAqIHdpdGhvdXQgTWF0aE1MIGFuZCB3aXRob3V0IGZsYXR0ZW5pbmcgdGhhdCByZXByZXNlbnRhdGlvbiB0byBhIHN0cmluZy5cbiAgICpcbiAgICogTk9URTogVGhpcyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSByZWNvbW1lbmRlZCBmb3IgcHVibGljIHVzZS5cbiAgICogVGhlIGludGVybmFsIHRyZWUgcmVwcmVzZW50YXRpb24gaXMgdW5zdGFibGUgYW5kIGlzIHZlcnkgbGlrZWx5XG4gICAqIHRvIGNoYW5nZS4gVXNlIGF0IHlvdXIgb3duIHJpc2suXG4gICAqL1xuICBfX3JlbmRlclRvSFRNTFRyZWU6IHJlbmRlclRvSFRNTFRyZWUsXG5cbiAgLyoqXG4gICAqIGV4dGVuZHMgaW50ZXJuYWwgZm9udCBtZXRyaWNzIG9iamVjdCB3aXRoIGEgbmV3IG9iamVjdFxuICAgKiBlYWNoIGtleSBpbiB0aGUgbmV3IG9iamVjdCByZXByZXNlbnRzIGEgZm9udCBuYW1lXG4gICovXG4gIF9fc2V0Rm9udE1ldHJpY3M6IHNldEZvbnRNZXRyaWNzLFxuXG4gIC8qKlxuICAgKiBhZGRzIGEgbmV3IHN5bWJvbCB0byBidWlsdGluIHN5bWJvbHMgdGFibGVcbiAgICovXG4gIF9fZGVmaW5lU3ltYm9sOiBkZWZpbmVTeW1ib2wsXG5cbiAgLyoqXG4gICAqIGFkZHMgYSBuZXcgbWFjcm8gdG8gYnVpbHRpbiBtYWNybyBsaXN0XG4gICAqL1xuICBfX2RlZmluZU1hY3JvOiBkZWZpbmVNYWNybyxcblxuICAvKipcbiAgICogRXhwb3NlIHRoZSBkb20gdHJlZSBub2RlIHR5cGVzLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciB0eXBlIGNoZWNraW5nIG5vZGVzLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHJlY29tbWVuZGVkIGZvciBwdWJsaWMgdXNlLlxuICAgKiBUaGUgaW50ZXJuYWwgdHJlZSByZXByZXNlbnRhdGlvbiBpcyB1bnN0YWJsZSBhbmQgaXMgdmVyeSBsaWtlbHlcbiAgICogdG8gY2hhbmdlLiBVc2UgYXQgeW91ciBvd24gcmlzay5cbiAgICovXG4gIF9fZG9tVHJlZToge1xuICAgIFNwYW46IFNwYW4sXG4gICAgQW5jaG9yOiBBbmNob3IsXG4gICAgU3ltYm9sTm9kZTogU3ltYm9sTm9kZSxcbiAgICBTdmdOb2RlOiBTdmdOb2RlLFxuICAgIFBhdGhOb2RlOiBQYXRoTm9kZSxcbiAgICBMaW5lTm9kZTogTGluZU5vZGVcbiAgfVxufSk7XG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9rYXRleC53ZWJwYWNrLmpzXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYnBhY2sgZW50cnkgcG9pbnQgZm9yIEthVGVYLiBBcyBFQ01BU2NyaXB0LCBmbG93WzFdIGFuZCBqZXN0WzJdXG4gKiBkb2Vzbid0IHN1cHBvcnQgQ1NTIG1vZHVsZXMgbmF0aXZlbHksIGEgc2VwYXJhdGUgZW50cnkgcG9pbnQgaXMgdXNlZCBhbmRcbiAqIGl0IGlzIG5vdCBmbG93dHlwZWQuXG4gKlxuICogWzFdIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2xhbWJkYWhhbmRzL2QxOWUwZGE5NjI4NWI3NDlmMGVmXG4gKiBbMl0gaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vamVzdC9kb2NzL2VuL3dlYnBhY2suaHRtbFxuICovXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIga2F0ZXhfd2VicGFjayA9IChrYXRleCk7XG5fX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl07XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/katex/dist/katex.js\n");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./libs/quill/katex.js");
/******/
/******/ return __webpack_exports__;
/******/ })()
;
});